{"version":3,"mappings":";ssBACA,MAAMA,GAAY,GAClB,QAASC,EAAI,EAAGA,EAAI,IAAK,EAAEA,EACvBD,GAAU,MAAMC,EAAI,KAAO,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,EAE7C,SAASC,GAAgBC,EAAKC,EAAS,EAAG,CAC7C,OAAQJ,GAAUG,EAAIC,EAAS,CAAC,CAAC,EAC7BJ,GAAUG,EAAIC,EAAS,CAAC,CAAC,EACzBJ,GAAUG,EAAIC,EAAS,CAAC,CAAC,EACzBJ,GAAUG,EAAIC,EAAS,CAAC,CAAC,EACzB,IACAJ,GAAUG,EAAIC,EAAS,CAAC,CAAC,EACzBJ,GAAUG,EAAIC,EAAS,CAAC,CAAC,EACzB,IACAJ,GAAUG,EAAIC,EAAS,CAAC,CAAC,EACzBJ,GAAUG,EAAIC,EAAS,CAAC,CAAC,EACzB,IACAJ,GAAUG,EAAIC,EAAS,CAAC,CAAC,EACzBJ,GAAUG,EAAIC,EAAS,CAAC,CAAC,EACzB,IACAJ,GAAUG,EAAIC,EAAS,EAAE,CAAC,EAC1BJ,GAAUG,EAAIC,EAAS,EAAE,CAAC,EAC1BJ,GAAUG,EAAIC,EAAS,EAAE,CAAC,EAC1BJ,GAAUG,EAAIC,EAAS,EAAE,CAAC,EAC1BJ,GAAUG,EAAIC,EAAS,EAAE,CAAC,EAC1BJ,GAAUG,EAAIC,EAAS,EAAE,CAAC,GAAG,YAAW,CAChD,CC1BA,IAAIC,GACJ,MAAMC,GAAQ,IAAI,WAAW,EAAE,EAChB,SAASC,IAAM,CAC1B,GAAI,CAACF,GAAiB,CAClB,GAAI,OAAO,OAAW,KAAe,CAAC,OAAO,gBACzC,MAAM,IAAI,MAAM,0GAA0G,EAE9HA,GAAkB,OAAO,gBAAgB,KAAK,MAAM,CACvD,CACD,OAAOA,GAAgBC,EAAK,CAChC,CCVA,MAAME,GAAa,OAAO,OAAW,KAAe,OAAO,YAAc,OAAO,WAAW,KAAK,MAAM,EACvFC,GAAA,CAAE,WAAAD,EAAY,ECE7B,SAASE,GAAGC,EAASC,EAAKR,EAAQ,CAC9B,GAAIK,GAAO,YAAc,CAACG,GAAO,CAACD,EAC9B,OAAOF,GAAO,aAElBE,EAAUA,GAAW,GACrB,MAAME,EAAOF,EAAQ,SAAWA,EAAQ,KAAOJ,MAG/C,GAFAM,EAAK,CAAC,EAAKA,EAAK,CAAC,EAAI,GAAQ,GAC7BA,EAAK,CAAC,EAAKA,EAAK,CAAC,EAAI,GAAQ,IACzBD,EAAK,CACLR,EAASA,GAAU,EACnB,QAASH,EAAI,EAAGA,EAAI,GAAI,EAAEA,EACtBW,EAAIR,EAASH,CAAC,EAAIY,EAAKZ,CAAC,EAE5B,OAAOW,CACV,CACD,OAAOV,GAAgBW,CAAI,CAC/B,CCjBO,MAAMC,WAAoB,KAAM,CACnC,YAAYC,EAAO,CACf,IAAIC,EACJ,MAAMD,EAAM,OAAO,EACnB,KAAK,KAAOA,EAAM,KAClB,KAAK,QAAUA,EAAM,QACrB,KAAK,MAAQA,EAAM,MACnB,KAAK,MAAQA,EAAM,MACnB,KAAK,WAAaA,EAAM,WACxB,KAAK,IAAMC,EAAKD,EAAM,MAAQ,MAAQC,IAAO,OAASA,EAAK,KAAK,WAAU,EAC1E,KAAK,KAAOD,EAAM,KACd,MAAM,mBACN,MAAM,kBAAkB,KAAMD,EAAW,CAEhD,CACD,UAAW,CACP,OAAO,KAAK,KAAO,KAAO,KAAK,SAAW,KAAK,MAAQ,OAAS,KAAK,MAAQ,IAAM,KAAO,KAAK,GAAK,GACvG,CAID,QAAS,CACL,OAAO,KAAK,OAAO,CAAE,QAAS,CAAG,EACpC,CACD,OAAOG,EAAS,CACZ,MAAO,CACH,GAAI,KAAK,GACT,KAAM,KAAK,KACX,QAAS,KAAK,QACd,MAAO,KAAK,MACZ,MAAO,KAAK,MACZ,KAAM,KAAK,IACvB,CACK,CACD,OAAO,OAAOC,EAAM,CAChB,IAAIF,EAAIG,EAAIC,EACZ,OAAO,IAAIN,GAAY,CACnB,GAAII,EAAK,MAAM,IAAI,EAAE,OACrB,KAAMA,EAAK,MAAM,MAAM,EAAE,OACzB,QAASA,EAAK,MAAM,SAAS,EAAE,OAC/B,OAAQF,EAAKE,EAAK,cAAc,OAAO,KAAO,MAAQF,IAAO,OAAS,OAASA,EAAG,OAClF,OAAQG,EAAKD,EAAK,cAAc,OAAO,KAAO,MAAQC,IAAO,OAAS,OAASA,EAAG,OAClF,MAAOC,EAAKF,EAAK,cAAc,MAAM,KAAO,MAAQE,IAAO,OAAS,OAASA,EAAG,KAC5F,CAAS,CACJ,CACD,QAAQC,EAAM,CACV,OAAO,KAAK,OAASA,CACxB,CACD,QAAQA,EAAM,CACV,GAAI,KAAK,QAAQA,CAAI,EACjB,OAAO,IAEd,CACD,uBAAuBC,EAAQ,CAC3B,MAAO,CAAC,CAAC,KAAK,OAAS,KAAK,MAAM,WAAWA,CAAM,CACtD,CACD,gBAAgBC,EAAQ,CACpB,UAAWC,KAASD,EAChB,GAAI,KAAK,eAAeC,CAAK,EACzB,MAAO,GAGf,MAAO,EACV,CACD,eAAeA,EAAO,CAClB,OAAK,KAAK,MAGH,KAAK,MAAM,WAAWA,CAAK,EAFvB,EAGd,CACD,YAAa,CACT,OAAOC,GAAQ,EAAG,IAAM,IAAI,KAAM,EAAC,QAAO,CAC7C,CACD,aAAaD,EAAO,CAChB,KAAK,MAAQ,KAAK,MAAQA,EAAQ,IAAM,KAAK,MAAQA,CACxD,CAED,UAAW,CACP,IAAIR,EACJ,OAAQA,EAAK,KAAK,SAAW,MAAQA,IAAO,OAASA,EAAK,KAAK,OAClE,CACL,CACO,SAASU,GAAcC,EAAG,CAC7B,OAAO,OAAOA,EAAE,IAAM,UAAY,OAAOA,EAAE,MAAQ,UAAY,OAAOA,EAAE,SAAW,UAAYA,EAAE,QAAUA,EAAE,iBAAmBA,EAAE,cACtI,CCrFO,SAASC,GAAeD,EAAG,CAC9B,OAAOA,EAAE,QAAU,MAAM,QAAQA,EAAE,MAAM,GAAKA,EAAE,OAAO,OAAS,GAAKD,GAAcC,EAAE,OAAO,CAAC,CAAC,CAClG,CAEO,MAAME,WAAqB,KAAM,CACpC,eAAeC,EAAQ,CACnB,MAAMA,EAAO,IAAKH,GAAMA,EAAE,OAAO,EAAE,KAAK;AAAA,CAAI,CAAC,EAC7C,KAAK,OAASG,CACjB,CACD,SAASf,EAAO,CACZ,GAAIW,GAAcX,CAAK,EACnB,KAAK,OAAO,KAAKA,CAAK,EACtB,KAAK,SAAW;AAAA,EAAOA,EAAM,SAAQ,UAEhCa,GAAeb,CAAK,EACzB,KAAK,OAAO,KAAK,GAAGA,EAAM,MAAM,EAChC,KAAK,SAAW;AAAA,EAAOA,EAAM,SAAQ,MAGrC,OAAM,IAAI,MAAM,sBAAsB,CAE7C,CACD,aAAaA,EAAO,CAChB,GAAIW,GAAcX,CAAK,EACnB,KAAK,OAAO,QAAQA,CAAK,EACzB,KAAK,SAAW;AAAA,EAAOA,EAAM,SAAQ,UAEhCa,GAAeb,CAAK,EACzB,KAAK,OAAO,QAAQ,GAAGA,EAAM,MAAM,EACnC,KAAK,SAAW;AAAA,EAAOA,EAAM,SAAQ,MAGrC,OAAM,IAAI,MAAM,sBAAsB,CAE7C,CACD,IAAI,YAAa,CACb,IAAIC,EACJ,OAAQA,EAAK,KAAK,OAAO,KAAMW,GAAMA,EAAE,aAAe,MAAS,KAAO,MAAQX,IAAO,OAAS,OAASA,EAAG,UAC7G,CACD,cAAce,EAAO,CACjB,KAAK,OAAO,OAAOA,EAAO,CAAC,CAC9B,CACD,aAAaP,EAAO,CAChB,KAAK,OAAO,QAASG,GAAM,CACvBA,EAAE,aAAaH,CAAK,CAChC,CAAS,CACJ,CAID,aAAaH,EAAM,CACf,OAAO,KAAK,QAAQA,CAAI,CAC3B,CACD,QAAQA,EAAM,CACV,OAAO,KAAK,OAAO,UAAWM,GAAMA,EAAE,QAAQN,CAAI,CAAC,IAAM,EAC5D,CACD,QAAQA,EAAM,CACV,OAAO,KAAK,OAAO,KAAMM,GAAMA,EAAE,QAAQN,CAAI,CAAC,CACjD,CAID,4BAA4BC,EAAQ,CAChC,OAAO,KAAK,uBAAuBA,CAAM,CAC5C,CACD,uBAAuBA,EAAQ,CAC3B,OAAO,KAAK,OAAO,UAAWK,GAAMA,EAAE,uBAAuBL,CAAM,CAAC,IAAM,EAC7E,CAID,QAAS,CACL,OAAO,KAAK,OAAO,CAAE,QAAS,CAAG,EACpC,CACD,OAAOL,EAAS,CACZ,MAAO,CACH,OAAQ,KAAK,OAAO,IAAKU,GAAMA,EAAE,OAAOV,CAAO,CAAC,CAC5D,CACK,CACD,OAAO,OAAOC,EAAM,CAChB,OAAO,IAAIW,GAAa,GAAGX,EAAK,MAAM,QAAQ,EAAE,MAAMJ,EAAW,CAAC,CACrE,CACD,iBAAkB,CACd,GAAI,KAAK,OAAO,OAAS,EACrB,MAAI,KAAK,OAAO,QAAU,EAChB,KAAK,OAAO,CAAC,EAEjB,IAEb,CACD,IAAI,OAAQ,CACR,OAAO,KAAK,UACf,CAED,UAAW,CACP,OAAO,KAAK,OACP,OAAQ,GAAM,CAAC,CAAC,EAAE,SAAQ,CAAE,EAC5B,IAAK,GAAM,EAAE,SAAQ,CAAE,EACvB,KAAK;AAAA,CAAI,CACjB,CACL,2gCC/DakB,GAAN,MAAMA,EAAW,CA6GpB,aAAc,CA1GwB,oBAiBtC,mBAAgB,IAAM,CACd,OAAO,UAAU,SACjB,OAAO,UAAU,QAAQ,CAAC,IAAK,IAAK,GAAG,CAAC,CAC5C,EAGJ,iBAAc,IAAM,CACZ,OAAO,UAAU,SACjB,OAAO,UAAU,QAAQ,CAAC,IAAK,IAAK,GAAG,CAAC,CAC5C,EAGJ,eAAY,IAAM,CACV,OAAO,UAAU,SACV,iBAAU,QAAQ,EAAE,CAC/B,EAGJ,mBAAgB,IAAM,CACd,OAAO,UAAU,SACV,iBAAU,QAAQ,GAAG,CAChC,EAMJ,sBAAoBC,GAA6B,GAIjD,kBAA2D,SAAY,GA2D9D,kBAAe,MAAOf,EAAyBgB,IAAqB,CACrE,MAAMC,GAAU,MAAMC,GAAA,wBAAAC,CAAA,eAAO,6BAAY,OAAAC,KAAA,+CAAG,QAAQ,OACpDH,EAAOjB,aAAgB,IAAMA,EAAK,KAAOA,EAAMgB,CAAQ,EAE/D,CAvGA,IAAI,UAAoB,CACpB,OAAO,KAAK,WAAa,KAC7B,CAEA,WAAW,CAAE,QAAAK,EAAS,MAAAC,GAA6C,CAC/D,KAAK,cAAgBD,EACrB,KAAK,YAAcC,CACvB,CA0CA,OAAqE,CAC7D,QAAK,WAAa,MACX,YAGP,QAAK,WAAa,UACX,gBAGL,MAAAC,EAAY,UAAU,WAAa,UAAU,OAE/C,iBAAW,KAAKA,CAAS,EAClB,UAGP,2FAA2F,KAAKA,CAAS,EAElG,QAIP,mBAAmB,KAAKA,CAAS,GAAK,CAAE,OAAe,UAKvD,UAAU,UAAU,SAAS,KAAK,GAAK,eAAgB,SAChD,MAGP,UAAU,SAAS,cAAc,QAAQ,KAAK,GAAK,EAC5C,QAGP,UAAU,SAAS,cAAc,QAAQ,KAAK,GAAK,EAC5C,UAGP,UAAU,SAAS,cAAc,QAAQ,QAAQ,GAAK,EAC/C,MAGP,UAAU,SAAS,cAAc,QAAQ,SAAS,GAAK,EAChD,UAGJ,SACX,CAQJ,EAlHWT,GAAA,OAAS,IAAIA,GADjB,IAAMU,GAANV,GCtCA,SAASW,GAAYC,EAAQ,CAChC,OAAI,OAAOA,GAAW,UAAYA,IAAW,KAClC,GAEJ,CAAC,CAACA,EAAO,KACpB,CAIO,SAASC,GAAYC,EAAK,CAC7B,GAAIH,GAAYG,CAAG,EACf,OAAQA,EAAK,QAEjB,GAAI,MAAM,QAAQA,CAAG,EACjB,OAAQA,EAAK,IAAK,GACPD,GAAY,CAAC,CACvB,EAEL,GAAIC,aAAe,IAAK,CAEpB,MAAMC,EAAa,IAAI,IACvB,SAAW,CAACC,EAAKC,CAAK,IAAKH,EAAK,CAC5B,MAAMI,EAAIL,GAAYG,CAAG,EACzBD,EAAW,IAAIG,EAAGL,GAAYI,CAAK,CAAC,CACvC,CACD,OAAOF,CACV,CACD,OAAID,aAAe,KACR,IAAI,KAAKA,CAAG,EAEnB,OAAOA,GAAQ,UAAYA,IAAQ,KAC5B,OAAO,OAAO,OAAO,OAAOA,EAAI,YAAY,SAAS,EAAGA,CAAG,EAG/DA,CACX,CCnCO,SAASK,GAAMC,EAAK,CACvB,OAAOA,EAAI,KAAO,MACtB,CACO,SAASC,GAAMD,EAAK,CACvB,OAAID,GAAMC,CAAG,EACFA,EAAI,GAERA,CACX,CACO,SAASE,GAAcF,EAAK,CAC/B,OAAID,GAAMC,CAAG,EACFA,EAAI,GAERA,CACX,CCTA,SAASG,GAAOH,EAAK,CACjB,OAAOA,EAAI,OAAS,MACxB,CACA,SAASI,GAAMJ,EAAK,CAChB,OAAOA,EAAI,MAAQ,MACvB,CACA,SAASK,GAASL,EAAK,CACnB,OAAOA,EAAI,SAAW,MAC1B,CACA,SAASM,GAAQN,EAAK,CAClB,OAAOA,EAAI,QAAU,MACzB,CAIO,MAAMO,EAAe,CACxB,YAAYC,EAAS,CACjB,KAAK,kBAAoB,GACzB,KAAK,QAAUA,GAAmD,EACrE,CACD,OAAQ,CAEJ,MAAMC,EAAS,IAAIF,GACnB,OAAAE,EAAO,MAAM,IAAI,EACVA,CACV,CACD,MAAMC,EAAO,CAGT,UAAWC,KAAUD,EAAM,QACvB,KAAK,QAAQ,KAAKjB,GAAYkB,CAAM,CAAC,CAE5C,CACD,MAAMC,EAAO,CACT,GAAI,MAAM,QAAQA,CAAK,EAEnB,OAAOA,EAAM,QAGjB,MAAMH,EAAS,KAAK,QACpB,UAAWE,KAAUC,EAAM,QAEvB,GAAIT,GAAOQ,CAAM,EACbF,EAAO,QAAQE,EAAO,KAAMA,EAAO,OAAO,UAErCP,GAAMO,CAAM,EACjBF,EAAO,OAAOE,EAAO,IAAKA,EAAO,OAAO,UAEnCN,GAASM,CAAM,EACpBF,EAAO,UAAUE,EAAO,MAAM,UAEzBL,GAAQK,CAAM,EACnBF,EAAO,SAASE,EAAO,KAAK,MAG5B,OAAM,IAAI,MAAM,mBAAqB,KAAK,UAAUA,CAAM,CAAC,EAGnE,OAAOF,CACV,CACD,OAAOZ,EAAOgB,EAAO,CACjB,KAAK,QAAQ,KAAK,CAAE,QAASA,EAAO,IAAKhB,CAAK,CAAE,CACnD,CACD,QAAQiB,EAAMD,EAAO,CACjB,KAAK,QAAQ,KAAK,CAAE,QAASA,EAAO,KAAMC,CAAI,CAAE,CACnD,CACD,WAAWA,EAAM,CACb,UAAWH,KAAU,KAAK,QACtB,GAAI,CAAAR,GAAOQ,CAAM,EAGZ,GAAIP,GAAMO,CAAM,GACjB,GAAIV,GAAMU,EAAO,GAAG,GAAKG,EACrB,MAAO,WAGNT,GAASM,CAAM,GACpB,GAAIA,EAAO,QAAUG,EACjB,MAAO,WAGNR,GAAQK,CAAM,GACnB,GAAIV,GAAMU,EAAO,KAAK,GAAKG,EACvB,MAAO,OAIX,OAAM,IAAI,MAAM,mBAAqB,KAAK,UAAUH,CAAM,CAAC,EAGnE,MAAO,EACV,CACD,OAAOG,EAAM,CACT,MAAMC,EAAY,KAAK,YACjB7B,EAAI,IAAI6B,EACRC,EAAoB,GAC1B,UAAWL,KAAU,KAAK,QACtB,GAAIR,GAAOQ,CAAM,EACbK,EAAkB,KAAKL,CAAM,UAExBP,GAAMO,CAAM,EACbV,GAAMU,EAAO,GAAG,GAAKG,EACrB5B,EAAE,QAAQ,KAAKyB,CAAM,EAGrBK,EAAkB,KAAKL,CAAM,UAG5BN,GAASM,CAAM,EAChBA,EAAO,QAAUG,EACjB5B,EAAE,QAAQ,KAAKyB,CAAM,EAGrBK,EAAkB,KAAKL,CAAM,UAG5BL,GAAQK,CAAM,EACfV,GAAMU,EAAO,KAAK,GAAKG,EACvB5B,EAAE,QAAQ,KAAKyB,CAAM,EAGrBK,EAAkB,KAAKL,CAAM,MAIjC,OAAM,IAAI,MAAM,mBAAqB,KAAK,UAAUA,CAAM,CAAC,EAGnE,YAAK,QAAUK,EACR9B,CACV,CACD,SAASW,EAAO,CACZ,MAAMoB,EAAKhB,GAAMJ,CAAK,EAChBqB,EAAW,KAAK,QAAQ,UAAU3C,GAAK6B,GAAM7B,CAAC,GAAK0B,GAAM1B,EAAE,GAAG,GAAK0C,CAAE,EAC3E,GAAIC,IAAa,GAAI,CACjB,MAAMR,EAAQ,KAAK,QAAQQ,CAAQ,EAC/BC,GAAYT,EAAM,GAAG,EACrB,KAAK,QAAQ,OAAOQ,EAAU,EAAG,CAC7B,IAAKR,EAAM,IAAI,MAAMb,CAAK,EAC1B,QAASa,EAAM,OACnC,CAAiB,EAGD,KAAK,QAAQ,OAAOQ,EAAU,EAAG,CAC7B,IAAKrB,EACL,QAASa,EAAM,OACnC,CAAiB,EAEL,MACH,CACD,MAAMU,EAAa,KAAK,QAAQ,UAAU7C,GAAK+B,GAAQ/B,CAAC,GAAK0B,GAAM1B,EAAE,KAAK,GAAK0C,CAAE,EACjF,GAAIG,IAAe,GAAI,CACnB,MAAMV,EAAQ,KAAK,QAAQU,CAAU,EACjCD,GAAYT,EAAM,KAAK,EACvB,KAAK,QAAQ,OAAOU,EAAY,EAAG,CAC/B,MAAOV,EAAM,MAAM,MAAMb,CAAK,CAClD,CAAiB,EAGD,KAAK,QAAQ,OAAOuB,EAAY,EAAG,CAC/B,MAAOvB,CAC3B,CAAiB,EAEL,MACH,CACD,KAAK,QAAQ,KAAK,CAAE,MAAOA,CAAO,EACrC,CACD,UAAUoB,EAAI,CAEV,MAAMC,EAAW,KAAK,QAAQ,UAAU3C,GAAK6B,GAAM7B,CAAC,GAAK0B,GAAM1B,EAAE,GAAG,GAAK0C,CAAE,EAC3E,GAAIC,IAAa,GAAI,CAEjB,KAAK,QAAQ,OAAOA,EAAU,CAAC,EAC/B,MACH,KACI,CACD,MAAME,EAAa,KAAK,QAAQ,UAAU7C,GAAK+B,GAAQ/B,CAAC,GAAK0B,GAAM1B,EAAE,KAAK,GAAK0C,CAAE,EAC7EG,IAAe,IACf,KAAK,QAAQ,OAAOA,EAAY,CAAC,CAExC,CACD,KAAK,QAAQ,KAAK,CAAE,OAAQH,CAAI,EACnC,CAED,QAAQI,EAAO,CACX,MAAMC,EAAWD,EAAM,MAAM,CAAC,EAC9B,UAAWV,KAAU,KAAK,QAEtB,GAAIR,GAAOQ,CAAM,EAAG,CAEhB,MAAMhC,EAAQ2C,EAAS,UAAU/C,GAAK0B,GAAM1B,CAAC,GAAKoC,EAAO,IAAI,EAC7D,GAAIhC,GAAS,GAAI,CACb,MAAMkB,EAAQyB,EAAS3C,CAAK,EAC5B2C,EAAS,OAAO3C,EAAO,CAAC,EAIxB,IAAI4C,EAAa,GACbZ,EAAO,UAAY,OACnBY,EAAaD,EAAS,UAAU/C,GAAK0B,GAAM1B,CAAC,GAAKoC,EAAO,OAAO,EAC3DY,GAAc,KACdA,EAAaD,EAAS,OAAS,IAGvCA,EAAS,OAAOC,EAAa,EAAG,EAAG1B,CAAK,CAC3C,MAGG,QAAQ,KAAK,kCAAoCc,EAAO,IAAI,CAEnE,SACQP,GAAMO,CAAM,EAAG,CAGpB,IAAIY,EAAa,GACbZ,EAAO,UAAY,OACnBY,EAAaD,EAAS,UAAU/C,GAAK0B,GAAM1B,CAAC,GAAKoC,EAAO,OAAO,EAC3DY,GAAc,KACdA,EAAaD,EAAS,OAAS,IAGnCX,EAAO,UAAY,SACnBY,EAAaD,EAAS,OAAS,GAEnCA,EAAS,OAAOC,EAAa,EAAG,EAAGZ,EAAO,GAAG,CAChD,SACQN,GAASM,CAAM,EAAG,CAEvB,MAAMhC,EAAQ2C,EAAS,UAAU/C,GAAK0B,GAAM1B,CAAC,GAAKoC,EAAO,MAAM,EAC3DhC,GAAS,GACT2C,EAAS,OAAO3C,EAAO,CAAC,EAGxB,QAAQ,KAAK,kCAAoCgC,EAAO,MAAM,CAErE,SACQL,GAAQK,CAAM,EAAG,CAEtB,MAAMhC,EAAQ2C,EAAS,UAAU/C,GAAK0B,GAAM1B,CAAC,GAAK0B,GAAMU,EAAO,KAAK,CAAC,EACrE,GAAIhC,GAAS,GAAI,CAEb,MAAMkB,EAAQyB,EAAS3C,CAAK,EACxBwC,GAAYtB,CAAK,EACjByB,EAAS,OAAO3C,EAAO,EAAGkB,EAAM,MAAMc,EAAO,KAAK,CAAC,EAGnDW,EAAS,OAAO3C,EAAO,EAAGgC,EAAO,KAAK,CAE7C,CACJ,KAEG,OAAM,IAAI,MAAM,mBAAqB,KAAK,UAAUA,CAAM,CAAC,EAGnE,OAAOW,CACV,CACD,OAAOzD,EAAS,CACZ,MAAO,CACH,SAAU,GACV,QAAS,KAAK,QAAQ,IAAK8C,GAAW,CAClC,GAAIR,GAAOQ,CAAM,EAEb,MAAO,CACH,QAASA,EAAO,QAChB,KAAMa,GAAab,EAAO,KAAM9C,CAAO,CAC/D,EAEqB,GAAIuC,GAAMO,CAAM,EAEjB,MAAO,CACH,QAASA,EAAO,QAChB,IAAKa,GAAab,EAAO,IAAK9C,CAAO,CAC7D,EAEqB,GAAIwC,GAASM,CAAM,EACpB,MAAO,CACH,OAAQA,EAAO,MACvC,EAEqB,GAAIL,GAAQK,CAAM,EAEnB,MAAO,CACH,MAAOa,GAAab,EAAO,MAAO9C,CAAO,CACjE,CAEA,CAAa,CACb,CACK,CACD,SAAU,CACN,OAAO,KAAK,QAAQ,OAAO8C,GAAUP,GAAMO,CAAM,CAAC,CACrD,CACD,YAAa,CACT,OAAO,KAAK,QAAQ,OAAOA,GAAUL,GAAQK,CAAM,CAAC,EAAE,IAAKc,GAAMA,EAAE,KAAK,CAC3E,CACD,YAAa,CACT,OAAO,KAAK,QAAQ,OAAOd,GAAUN,GAASM,CAAM,CAAC,EAAE,IAAKc,GAAMA,EAAE,MAAM,CAC7E,CACD,UAAW,CACP,OAAO,KAAK,QAAQ,OAAOd,GAAUR,GAAOQ,CAAM,CAAC,CACtD,CACL,CACO,MAAMe,EAA0B,CACnC,YAAYC,EAAYC,EAAcC,EAAW,CAC7C,KAAK,WAAaF,EAClB,KAAK,aAAeC,EACpB,KAAK,UAAYC,CACpB,CACD,OAAO/D,EAAM,CACT,IAAIF,EACJ,MAAMkE,EAAMhE,EAAK,cAAc,KAAK,EACpC,GAAIgE,IAAQ,OAER,MAAO,CACH,IAAKA,EAAI,OAAO,KAAK,UAAU,EAC/B,SAAUlE,EAAKE,EAAK,eAAe,SAAS,KAAO,MAAQF,IAAO,OAAS,OAASA,EAAG,SAAS,KAAK,SAAS,CAC9H,EAEQ,MAAMmE,EAAOjE,EAAK,cAAc,MAAM,EACtC,GAAIiE,IAAS,OACT,MAAO,CACH,KAAMA,EAAK,OAAO,KAAK,SAAS,EAChC,QAASjE,EAAK,MAAM,SAAS,EAAE,SAAS,KAAK,SAAS,CACtE,EAEQ,MAAMkE,EAAIlE,EAAK,cAAc,QAAQ,EACrC,GAAIkE,IAAM,OACN,MAAO,CACH,OAAQA,EAAE,OAAO,KAAK,SAAS,CAC/C,EAEQ,MAAMpB,EAAQ9C,EAAK,cAAc,OAAO,EACxC,GAAI8C,IAAU,OACV,MAAO,CACH,MAAOA,EAAM,OAAO,KAAK,YAAY,CACrD,EAEQ,MAAM,IAAIlD,GAAY,CAClB,KAAM,gBACN,QAAS,sCACT,MAAOI,EAAK,YACxB,CAAS,CACJ,CACL,CACO,MAAMmE,EAAsB,CAC/B,YAAYN,EAAYC,EAAcC,EAAW,CAC7C,KAAK,WAAaF,EAClB,KAAK,aAAeC,EACpB,KAAK,UAAYC,CACpB,CACD,OAAO/D,EAAM,CACT,GAAI,MAAM,QAAQA,EAAK,KAAK,EACxB,eAAQ,KAAK,uJAAuJ,EAI7J,IAAIyC,GAAezC,EAAK,MAAM,IAAI4D,GAA0B,KAAK,WAAY,KAAK,aAAc,KAAK,SAAS,CAAC,CAAC,EAE3H,MAAMlB,EAAU1C,EAAK,MAAM,SAAS,EAAE,MAAM,IAAI4D,GAA0B,KAAK,WAAY,KAAK,aAAc,KAAK,SAAS,CAAC,EAC7H,OAAO,IAAInB,GAAeC,CAAO,CACpC,CACD,eAAeX,EAAO,CAClB,OAAOA,aAAiBU,IAAkBV,EAAM,QAAQ,SAAW,CACtE,CACD,iBAAkB,CACd,OAAO,IAAIU,EACd,CACL,CC3WO,MAAM2B,EAAkB,CAC3B,YAAYJ,EAAKlB,EAAO,CACpB,KAAK,WAAakB,EAClB,KAAK,aAAelB,CACvB,CACD,OAAO9C,EAAM,CACT,IAAIF,EACJ,MAAM0C,EAAUxC,EAAK,cAAc,UAAU,EAC7C,OAAKF,EAAK0C,GAAY,KAA6B,OAASA,EAAQ,WAAa,MAAQ1C,IAAO,QAASA,EAC9F,KAAK,aAAa,OAAOE,CAAI,EAEjC,KAAK,WAAW,OAAOA,CAAI,CACrC,CACL,CACO,SAASqE,GAAaC,EAAQd,EAAU/D,EAAS,CACpD,GAAI6E,IAAWd,EAEX,OAEJ,MAAMe,EAAWD,EAAO,QAQxBA,EAAO,OAAO,EAAGA,EAAO,MAAM,EAC9B,UAAWE,KAAWhB,EAClB,GAAIiB,GAAcD,CAAO,EAAG,CACxB,MAAME,EAAUH,EAAS,KAAKxF,GAAKqD,GAAcrD,CAAC,IAAMqD,GAAcoC,CAAO,CAAC,EAC1EE,GAAWD,GAAcC,CAAO,GAChCA,EAAQ,QAAQF,CAAO,EACvBF,EAAO,KAAKI,CAAO,GAGnBJ,EAAO,KAAKE,CAAO,CAE1B,MAEGF,EAAO,KAAKE,CAAO,EAG3B,GAAI/E,GAAY,MAAsCA,EAAQ,YAE1D,UAAWiF,KAAWH,EACJD,EAAO,KAAKvF,GAAKqD,GAAcrD,CAAC,IAAMqD,GAAcsC,CAAO,CAAC,GAEtEJ,EAAO,KAAKI,CAAO,CAInC,CACO,SAASC,MAAqBC,EAAQ,CAEzC,UAAW7C,KAAS6C,EAChB,GAAI7C,IAAU,OACV,OAAOA,CAInB,CACO,MAAM8C,EAAM,CACf,kBAAmB,CACf,MAAMvE,EAAQ,IAAIuE,GAOlB,GANAvE,EAAM,SAAW,GACjBA,EAAM,SAAW,KAAK,SACtBA,EAAM,QAAU,KAAK,QACrBA,EAAM,QAAU,KAAK,QACrBA,EAAM,SAAW,KAAK,SACtBA,EAAM,MAAQ,KAAK,MACf,KAAK,QAAS,CACd,MAAMwE,EAAM,KAAK,QACjBxE,EAAM,QAAWyE,GAAa,CAC1B,GAAIA,IAAa,OAEb,OAAOD,EAAIC,CAAQ,CAMvC,CACS,CACD,GAAI,KAAK,UAAW,CAChB,MAAMC,EAAM,KAAK,UACjB1E,EAAM,UAAa2E,GAAa,CAC5B,GAAIA,IAAa,OAEb,OAAOD,EAAIC,CAAQ,CAMvC,CACS,CACG,KAAK,eACL3E,EAAM,QAAU,KAAK,cAErB,KAAK,iBACLA,EAAM,UAAY,KAAK,gBAE3BA,EAAM,aAAe,KAAK,aAC1BA,EAAM,eAAiB,KAAK,eAC5BA,EAAM,kBAAoB,KAAK,kBAC/BA,EAAM,aAAe,OACrB,MAAM4E,EAAW,KAAK,QAEtB,GAAIA,EAAS,UAAW,CACpB5E,EAAM,QAAU,KAAK,aACrBA,EAAM,UAAY,KAAK,eACvB,MAAMwD,EAAeoB,EAAS,YAC9B5E,EAAM,QAAU,IAAI8D,GAAkBc,EAAUpB,CAAY,CAC/D,CACD,OAAIoB,EAAS,oBAET5E,EAAM,aAAe,IACV4E,EAAS,qBAGpB,KAAK,oBACL5E,EAAM,aAAe,KAAK,mBAEvBA,CACV,CACL,CAmBO,SAASmE,GAAc7C,EAAK,CAC/B,OAAOA,aAAeuD,IAAgB,OAAOvD,GAAQ,UAAYA,IAAQ,MAAQA,EAAI,cACzF,CACO,MAAMuD,EAAY,CAErB,OAAO,WAAY,CACf,IAAIrF,EACJ,GAAI,KAAK,gBACL,OAAO,KAAK,gBAGhB,MAAMsF,UAAqBD,EAAY,CACtC,CACDC,EAAa,OAAS,GAGtBA,EAAa,gBAAkBA,EAC/B,KAAK,gBAAkBA,EAEvB,UAAW9E,KAAWR,EAAK,KAAK,UAAY,MAAQA,IAAO,OAASA,EAAK,GACrEsF,EAAa,OAAO,KAAK9E,EAAM,iBAAkB,GAErD,OAAA8E,EAAa,QAAU,GAChBA,CACV,CACD,aAAc,CACV,KAAK,eAAiB,GACjB,KAAK,OAAO,SACb,KAAK,OAAO,OAAS,IAEzB,UAAW9E,KAAS,KAAK,OAAO,aACxBA,EAAM,eACN,KAAKA,EAAM,QAAQ,EAAIA,EAAM,aAAY,EAGpD,CACD,SAAU,CACN,OAAO,KAAK,OAAO,OACtB,CACD,OAAQ,CACJ,MAAO,CAAC,KAAK,OAAO,OACvB,CACD,OAAO,MAAMoB,EAAQ,CACjB,OAAO,KAAK,UAAS,EAAG,OAAOA,CAAM,CACxC,CACD,WAAWoB,EAAO,CACd,GAAIA,EAAM,OAAO,QAAS,CACtB,KAAK,IAAI,KAAK,MAAMA,CAAK,CAAC,EAC1B,MACH,CACD,KAAK,IAAIA,CAAK,CACjB,CAID,OAAQ,CACJ,MAAMuC,EAAW,IAAI,KAAK,OAC1B,UAAW/E,KAAS,KAAK,OAAO,aAAc,CAC1C,MAAMgF,EAAOhF,EAAM,SACnB+E,EAASC,CAAI,EAAI3D,GAAY,KAAK2D,CAAI,CAAC,CAC1C,CACD,OAAOD,CACV,CACD,MAAMvC,EAAO,CACT,MAAMuC,EAAW,IAAI,KAAK,OAC1B,UAAW/E,KAAS,KAAK,OAAO,aAAc,CAC1C,MAAMgF,EAAOhF,EAAM,SACnB+E,EAASC,CAAI,EAAIC,GAAY,KAAKD,CAAI,EAAGxC,EAAMwC,CAAI,CAAC,CACvD,CACD,OAAOD,CACV,CACD,OAAO,YAAa,CAChB,SAASG,EAAQC,EAAGC,EAAG,CACnB,OAAID,EAAE,QAAUC,EAAE,QACP,GAEPD,EAAE,QAAUC,EAAE,QACP,EAEJ,CACV,CACD,KAAK,OAAO,KAAKF,CAAO,CAC3B,CACD,WAAW,cAAe,CAKtB,GAHI,CAAC,OAAO,eAAe,KAAK,KAAM,qBAAqB,GAAK,KAAK,sBACjE,KAAK,oBAAsB,MAE3B,KAAK,qBAAuB,KAAK,oBAAoB,mBAAqB,KAAK,OAAO,OACtF,OAAO,KAAK,oBAAoB,OAEpC,MAAMG,EAAe,GACrB,QAAS,EAAI,KAAK,OAAO,OAAS,EAAG,GAAK,EAAG,IAAK,CAC9C,MAAMrF,EAAQ,KAAK,OAAO,CAAC,EACtBqF,EAAarF,EAAM,QAAQ,IAC5BqF,EAAarF,EAAM,QAAQ,EAAIA,EAEtC,CACD,MAAMD,EAAS,OAAO,OAAOsF,CAAY,EAEzC,OAAAtF,EAAO,KAAK,CAACoF,EAAGC,IAAME,GAA0BH,EAAE,SAAUC,EAAE,QAAQ,CAAC,EACvE,KAAK,oBAAsB,CAAE,OAAArF,EAAQ,iBAAkB,KAAK,OAAO,QAC5DA,CACV,CACD,OAAO,iBAAiBgB,EAAS,CAQ7B,GANI,CAAC,OAAO,eAAe,KAAK,KAAM,yBAAyB,GAAK,KAAK,0BACrE,KAAK,wBAA0B,IAAI,KAElC,KAAK,0BACN,KAAK,wBAA0B,IAAI,KAEnC,KAAK,wBAAwB,IAAIA,CAAO,EACxC,OAAO,KAAK,wBAAwB,IAAIA,CAAO,EAEnD,MAAMsE,EAAe,GACrB,QAAS5G,EAAI,KAAK,OAAO,OAAS,EAAGA,GAAK,EAAGA,IAAK,CAC9C,MAAMuB,EAAQ,KAAK,OAAOvB,CAAC,EACvBuB,EAAM,SAAWe,GAAW,CAACsE,EAAarF,EAAM,QAAQ,IACxDqF,EAAarF,EAAM,QAAQ,EAAIA,EAEtC,CACD,MAAMD,EAAS,OAAO,OAAOsF,CAAY,EAEzC,OAAAtF,EAAO,KAAK,CAACoF,EAAGC,IAAME,GAA0BH,EAAE,SAAUC,EAAE,QAAQ,CAAC,EACvE,KAAK,wBAAwB,IAAIrE,EAAShB,CAAM,EACzCA,CACV,CACD,OAAO,kBAAkBwF,EAAU,CAC/B,UAAWvF,KAAS,KAAK,OACrB,GAAIA,EAAM,WAAauF,EACnB,MAAO,GAGf,MAAO,EACV,CAID,OAAO,OAAOnE,EAAQ,CAClB,MAAMoE,EAAQ,IAAI,KAClB,UAAWhE,KAAOJ,EAEVA,EAAO,eAAeI,CAAG,GAAKJ,EAAOI,CAAG,IAAM,QAAa,OAAOJ,EAAOI,CAAG,GAAM,YAE9E,KAAK,kBAAkBA,CAAG,IAC1BgE,EAAMhE,CAAG,EAAIJ,EAAOI,CAAG,GAInC,UAAWxB,KAAS,KAAK,aAAc,CACnC,GAAKA,EAAM,SAgBHwF,EAAMxF,EAAM,QAAQ,IAAM,SAE1BwF,EAAMxF,EAAM,QAAQ,EAAI,gBAjBxBwF,EAAMxF,EAAM,QAAQ,IAAM,SACrB,KAAK,UACFA,EAAM,SACNwF,EAAMxF,EAAM,QAAQ,EAAI,KAEnBA,EAAM,QAAQ,kBACnBwF,EAAMxF,EAAM,QAAQ,EAAIA,EAAM,QAAQ,oBAG1CwF,EAAMxF,EAAM,QAAQ,IAAM,QAC1B,MAAM,IAAI,MAAM,8BAAgCA,EAAM,SAAW,kBAAoB,KAAK,IAAI,EAU1G,GAAI,CAACA,EAAM,UACHwF,EAAMxF,EAAM,QAAQ,IAAM,KAC1B,MAAM,IAAI,MAAM,8BAAgCA,EAAM,SAAW,kBAAoB,KAAK,IAAI,CAGzG,CACD,OAAOwF,CACV,CAID,IAAIpE,EAAQ,CACR,UAAWI,KAAOJ,EACVA,EAAO,eAAeI,CAAG,GAAK,OAAOJ,EAAOI,CAAG,GAAM,YACjD,KAAK,OAAO,kBAAkBA,CAAG,IACjC,KAAKA,CAAG,EAAIJ,EAAOI,CAAG,EAIrC,CAKD,QAAQJ,EAAQ,CACZ,GAAIA,IAAW,MAIf,UAAWI,KAAOJ,EACd,GAAIA,EAAO,eAAeI,CAAG,GAAK,OAAOJ,EAAOI,CAAG,GAAM,YACjD,KAAK,OAAO,kBAAkBA,CAAG,EAAG,CACpC,GAAIJ,EAAOI,CAAG,IAAM,OAEhB,SAEA2C,GAAc,KAAK3C,CAAG,CAAC,GAAKJ,EAAOI,CAAG,IAAM,MAAQ,OAAOJ,EAAOI,CAAG,GAAM,SAC3E,KAAKA,CAAG,EAAE,QAAQJ,EAAOI,CAAG,CAAC,EAExB,MAAM,QAAQ,KAAKA,CAAG,CAAC,GAAK,MAAM,QAAQJ,EAAOI,CAAG,CAAC,EAC1DuC,GAAa,KAAKvC,CAAG,EAAGJ,EAAOI,CAAG,CAAC,EAGnC,KAAKA,CAAG,EAAIJ,EAAOI,CAAG,CAE7B,EAGZ,CACD,IAAI,QAAS,CACT,OAAO,KAAK,WACf,CACD,OAAO/B,EAAS,CACRkC,GAAM,IAAI,GAAM,KAAK,OAAO,QAuChC,MAAMP,EAAS,GACTqE,EAAS,KAAK,OAAO,UAAUhG,EAAQ,QAAS,IAAI,EAC1D,UAAWO,KAAS,KAAK,OAAO,iBAAiBP,EAAQ,OAAO,EAAG,CAC/D,GAAIgG,EAAOzF,EAAM,QAAQ,IAAM,OAAW,CACtC,GAAI,CAACA,EAAM,SACP,MAAM,IAAI,MAAM,sBAAwBA,EAAM,SAAW,+BAA+B,EAE5F,QACH,CACG,KAAK,OAAO,UAER0F,GAAiBD,EAAOzF,EAAM,QAAQ,CAAC,GAAKyF,EAAOzF,EAAM,QAAQ,EAAE,QAAQ,SAAW,GAGtF2F,GAAWF,EAAOzF,EAAM,QAAQ,CAAC,GAAKyF,EAAOzF,EAAM,QAAQ,EAAE,OAAS,IAI1E6E,GAAY,mBAAqB,CAAC,KAAK,OAAO,UAC1C7E,EAAM,UAAY,CAACA,EAAM,UAAYyF,EAAOzF,EAAM,QAAQ,IAAM,MAIhE,CAACA,EAAM,UAAYA,EAAM,QAAQ,gBAAkBA,EAAM,QAAQ,eAAeyF,EAAOzF,EAAM,QAAQ,CAAC,KAK1GA,EAAM,SAAWA,EAAM,QAAQ,OAC/BoB,EAAOpB,EAAM,KAAK,EAAIA,EAAM,QAAQ,OAAOyF,EAAOzF,EAAM,QAAQ,EAAGP,CAAO,EAG1E2B,EAAOpB,EAAM,KAAK,EAAIoD,GAAaqC,EAAOzF,EAAM,QAAQ,EAAGP,CAAO,EAEzE,CAED,OAAI,KAAK,OAAO,UACZ2B,EAAO,SAAc,KAAK,OAAO,SAE9BA,CACV,CACD,OAAO,OAAO1B,EAAM,CAChB,IAAIF,EAAIG,EAAIC,EAAIgG,EAChB,MAAMC,EAAQnG,EAAK,cAAc,MAAM,EACvC,GAAImG,EAAO,CACP,MAAMC,EAAU,KAAK,aAAa,KAAKC,GAAKA,EAAE,WAAa,IAAI,EAC/D,GAAI,CAACD,EACD,MAAM,IAAIxG,GAAY,CAClB,KAAM,eACN,QAAS,8BAAgC,KAAK,KAC9C,MAAOI,EAAK,kBAAkB,MAAM,CACxD,CAAiB,EAEL,MAAMsG,EAAiBH,EAAM,OAAOC,EAAQ,OAAO,EAC7CG,GAAmBzG,EAAKE,EAAK,QAAQ,cAAgB,MAAQF,IAAO,OAAS,OAASA,EAAG,IAAI,IAAI,EACvG,GAAI,CAACyG,EACD,MAAM,IAAI3G,GAAY,CAClB,KAAM,oBACN,QAAS,oIAAsI0G,EAC/I,MAAOtG,EAAK,kBAAkB,MAAM,CACxD,CAAiB,EAEL,MAAMwG,EAAYD,EAAgB,IAAID,CAAc,EACpD,GAAI,CAACE,EACD,MAAM,IAAI5G,GAAY,CAClB,KAAM,oBACN,QAAS,+BAAiC0G,EAC1C,MAAOtG,EAAK,kBAAkB,MAAM,CACxD,CAAiB,EAEL,OAAOwG,CACV,CACD,MAAMV,EAAQ,IAAI,KACZW,EAAoB,GAE1B,QAAS1H,EAAI,KAAK,OAAO,OAAS,EAAGA,GAAK,EAAGA,IAAK,CAC9C,MAAMuB,EAAQ,KAAK,OAAOvB,CAAC,EAC3B,GAAIuB,EAAM,SAAWN,EAAK,QAAQ,SAAW,CAACyG,EAAkBnG,EAAM,QAAQ,EAAG,CAC7E,MAAMoG,EAAY1G,EAAK,eAAeM,EAAM,KAAK,EAC7C,CAACoG,GAAa,CAACpG,EAAM,UAAYA,EAAM,SAEvCwF,EAAMxF,EAAM,QAAQ,EAAI,KAEnB,CAACoG,GAAa,CAACpG,EAAM,UAAYA,EAAM,WAAa,OAASwF,EAAMxF,EAAM,QAAQ,IAAM,QAAaA,EAAM,QAAQ,iBAEnHA,EAAM,QAAQ,kBACdwF,EAAMxF,EAAM,QAAQ,EAAIqE,GAAkBmB,EAAMxF,EAAM,QAAQ,EAAGA,EAAM,QAAQ,gBAAiB,IAM/FA,EAAM,SACPA,EAAM,SAENwF,EAAMxF,EAAM,QAAQ,EAAIqE,GAAkB+B,GAAc,KAA+B,OAASA,EAAU,SAASpG,EAAM,OAAO,EAAGwF,EAAMxF,EAAM,QAAQ,CAAC,EAIxJwF,EAAMxF,EAAM,QAAQ,GAAK4F,GAAMhG,GAAMD,EAAKD,EAAK,cAAcM,EAAM,KAAK,KAAO,MAAQL,IAAO,OAAS,OAASA,EAAG,OAAOK,EAAM,OAAO,KAAO,MAAQJ,IAAO,OAASA,EAAK4F,EAAMxF,EAAM,QAAQ,KAAO,MAAQ4F,IAAO,OAASA,EAAK,OAgCnO5F,EAAM,SACNwF,EAAMxF,EAAM,QAAQ,EAAIN,EAAK,MAAMM,EAAM,KAAK,EAAE,SAASA,EAAM,OAAO,EAGtEwF,EAAMxF,EAAM,QAAQ,EAAIN,EAAK,MAAMM,EAAM,KAAK,EAAE,OAAOA,EAAM,OAAO,EAG5EmG,EAAkBnG,EAAM,QAAQ,EAAI,EACvC,CACJ,CAID,GADA,KAAK,QAAQN,EAAK,QAAQ,QAAS8F,CAAK,EACpC,CAAC,KAAK,QAAS,CACX9F,EAAK,QAAQ,aAAe,SAC5BA,EAAK,QAAQ,WAAa,IAAI,KAElC,IAAIuG,EAAkBvG,EAAK,QAAQ,WAAW,IAAI,IAAI,EACjDuG,IACDA,EAAkB,IAAI,IACtBvG,EAAK,QAAQ,WAAW,IAAI,KAAMuG,CAAe,GAEjDA,GAAmBtE,GAAM6D,CAAK,GAC9BS,EAAgB,IAAIpE,GAAM2D,CAAK,EAAGA,CAAK,CAE9C,CACD,OAAOA,CACV,CAMD,OAAO,QAAQa,EAAMjF,EAAQ,CACzB,UAAWpB,KAAS,KAAK,OACjBA,EAAM,QAAUqG,GACZrG,EAAM,UACNoB,EAAOpB,EAAM,QAAQ,EAAIA,EAAM,QAAQ,KAAKoB,EAAQA,EAAOpB,EAAM,QAAQ,CAAC,EAIzF,CAID,OAAO,UAAUsG,EAAIlF,EAAQ,CACzB,IAAImF,EAAU,GACd,MAAMC,EAAQ,GACd,QAAS/H,EAAI,KAAK,OAAO,OAAS,EAAGA,GAAK,EAAGA,IAAK,CAC9C,MAAMuB,EAAQ,KAAK,OAAOvB,CAAC,EACvBuB,EAAM,QAAUsG,GACZtG,EAAM,YACDuG,IACDA,EAAU,GACV,OAAO,OAAOC,EAAOpF,CAAM,GAE/BoF,EAAMxG,EAAM,QAAQ,EAAIA,EAAM,UAAU,KAAKoB,EAAQoF,EAAMxG,EAAM,QAAQ,CAAC,EAGrF,CACD,OAAKuG,EAGEC,EAFIpF,CAGd,CACL,CACAyD,GAAY,QAAU,GACtBA,GAAY,kBAAoB,GCpmBzB,SAAS9B,GAAY3B,EAAQ,CAChC,OAAKA,EAGE,CAAC,CAACA,EAAO,MAFL,EAGf,CACO,SAASqF,GAAqBjE,EAAOgD,EAAO/F,EAAS,CACxD,MAAMiH,EAAUlB,EAAM,MAAMhD,CAAK,EACjC,OAAO,KAAK,UAAUkE,EAAQ,OAAOjH,CAAO,CAAC,GAAK,KAAK,UAAU+F,EAAM,OAAO/F,CAAO,CAAC,CAC1F,CACO,MAAMkH,WAAiB,GAAI,CAC9B,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,SAAW,GAChB,KAAK,YAAc,EACtB,CACD,QAAQrF,EAAK,CACT,GAAIqE,GAAWrE,CAAG,EAAG,CAEjB,MAAMsF,EAAQ,IAAID,GAASrF,CAAG,EAC9B,SAAW,CAACE,EAAKC,CAAK,IAAK,KAAK,QAAO,EAAI,CACvC,GAAIA,IAAU,KAAM,CAChBmF,EAAM,IAAIpF,EAAK,IAAI,EACnB,QACH,CACD,GAAIC,IAAU,OACV,SAEJ,MAAMoF,EAAWvF,EAAI,IAAIE,CAAG,EAC5B,GAAIqF,IAAa,KAAM,CAEnB,GAAI3E,GAAQT,CAAK,EACb,SAEJmF,EAAM,IAAIpF,EAAKC,CAAK,EACpB,QACH,CACD,GAAIoF,IAAa,OAAW,CACxBD,EAAM,IAAIpF,EAAKC,CAAK,EACpB,QACH,CACDmF,EAAM,IAAIpF,EAAKyD,GAAY4B,EAAUpF,CAAK,CAAC,CAC9C,CACD,OAAOmF,CACV,CACD,MAAMA,EAAQ,IAAI,IAAItF,CAAG,EACzB,SAAW,CAACE,EAAKC,CAAK,IAAK,KAAK,QAAO,EAAI,CACvC,GAAIA,IAAU,KAAM,CAChBmF,EAAM,OAAOpF,CAAG,EAChB,QACH,CACD,GAAIC,IAAU,OACV,SAEJ,MAAMoF,EAAWvF,EAAI,IAAIE,CAAG,EACtBkF,EAAUzB,GAAY4B,EAAUpF,CAAK,EACvCoF,IAAa,QAAaH,IAAY,QAI1CE,EAAM,IAAIpF,EAAKkF,CAAO,CACzB,CACD,OAAOE,CACV,CACD,OAAQ,CAEJ,MAAMA,EAAQ,IAAID,GAClB,SAAW,CAACnF,EAAKC,CAAK,IAAK,KAAK,QAAO,EACnCmF,EAAM,IAAIpF,EAAKH,GAAYI,CAAK,CAAC,EAErC,OAAOmF,CACV,CACL,CACO,SAASjB,GAAWrE,EAAK,CAC5B,OAAQA,aAAeqF,EAC3B,CACO,SAASjB,GAAiBpE,EAAK,CAClC,OAAQA,aAAea,EAC3B,CACO,SAASD,GAAQZ,EAAK,CACzB,OAAI6C,GAAc7C,CAAG,EAEVA,EAAI,UAEX,GAAAqE,GAAWrE,CAAG,GAGdoE,GAAiBpE,CAAG,EAI5B,CAgCO,SAAS2D,GAAY3D,EAAKkB,EAAO,CACpC,GAAIA,IAAU,OAGV,OAAOlB,EAEX,GAAIyB,GAAYzB,CAAG,EACf,OAAIkB,GAAS,KACF,KAGH2B,GAAc3B,CAAK,GAAKA,EAAM,MAAK,EAE5BA,EAGAlB,EAAI,MAAMkB,CAAK,EAK9B,GAAIlB,aAAe,KAAOqE,GAAWnD,CAAK,EACtC,OAAOA,EAAM,QAAQlB,CAAG,EAEvB,GAAI,MAAM,QAAQA,CAAG,EAEtB,OAAIoE,GAAiBlD,CAAK,EACfA,EAAM,QAAQlB,CAAG,EAOjBkB,EAIX,GAA0BlB,GAAQ,MAASoE,GAAiBlD,CAAK,EAAG,CAEhE,GAAIA,EAAM,QAAQ,SAAW,EACzB,OAAOlB,EAEX,MAAMoF,EAAUlE,EAAM,QAAQ,CAAE,GAChC,OAAIkE,EAAQ,SAAW,EAEZpF,EAEJoF,CACV,SAC8BpF,GAAQ,MAASqE,GAAWnD,CAAK,EAAG,CAE/D,GAAIA,EAAM,OAAS,EACf,OAAOlB,EAEX,MAAMoF,EAAUlE,EAAM,QAAQ,IAAI,GAAK,EACvC,OAAIkE,EAAQ,OAAS,EAEVpF,EAEJoF,CACV,KAEG,QAAOlE,CAIvB,CChMO,SAASsE,GAAa1F,EAAQ,CACjC,OAAI,OAAOA,GAAW,UAAYA,IAAW,KAClC,GAEJ,OAAOA,EAAO,QAAW,UACpC,CAIO,SAASgC,GAAa9B,EAAK7B,EAAS,CACvC,GAAIqH,GAAaxF,CAAG,EAChB,OAAOA,EAAI,OAAO7B,CAAO,EAE7B,GAAI,OAAO6B,GAAQ,SAAU,CACzB,MAAME,EAAM,OAAO,OAAOF,CAAG,EAC7B,GAAIE,EACA,MAAO,CACH,QAASA,CACzB,CAEK,CACD,GAAI,MAAM,QAAQF,CAAG,EACjB,OAAOA,EAAI,IAAKnB,GACLiD,GAAajD,EAAGV,CAAO,CACjC,EAEL,GAAIkG,GAAWrE,CAAG,EAAG,CAEjB,MAAMC,EAAa,GACnB,SAAW,CAACC,EAAKC,CAAK,IAAKH,EAAK,CAC5B,MAAMI,EAAI0B,GAAa5B,EAAK/B,CAAO,EACnC8B,EAAWG,CAAC,EAAI0B,GAAa3B,EAAOhC,CAAO,CAC9C,CACD,MAAO,CAEH,SAAU,GACV,QAAS8B,CACrB,CACK,CACD,GAAID,aAAe,IAAK,CAEpB,MAAMyF,EAAQ,GACd,SAAW,CAACvF,EAAKC,CAAK,IAAKH,EAAK,CAC5B,MAAMI,EAAI0B,GAAa5B,EAAK/B,CAAO,EACnC,GAAI,OAAOiC,GAAM,UAAY,OAAOA,GAAM,SACtC,MAAM,IAAI,MAAM,4CAA4CA,CAAC,EAAE,EAEnEqF,EAAM,KAAK,CAAE,IAAKrF,EAAE,SAAQ,EAAI,MAAO0B,GAAa3B,EAAOhC,CAAO,CAAG,EACxE,CAED,MAAM8B,EAAa,GACnBwF,EAAM,KAAK,CAAC5B,EAAGC,IAAME,GAA0BH,EAAE,IAAKC,EAAE,GAAG,CAAC,EAC5D,SAAW,CAAE,IAAA5D,EAAK,MAAAC,CAAK,IAAMsF,EACzBxF,EAAWC,CAAG,EAAIC,EAEtB,OAAIH,EAAI,SACG,CACH,SAAU,GACV,QAASC,CACzB,EAEeA,CACV,CACD,GAAID,GAAQ,KACR,OAAOA,EAEX,GAAI,OAAOA,GAAQ,SAAU,CAEzB,MAAM0F,EAAO,OAAO,KAAK1F,CAAG,EAAE,KAAKgE,EAAyB,EACtD/D,EAAa,GACnB,UAAWC,KAAOwF,EACdzF,EAAWC,CAAG,EAAI4B,GAAa9B,EAAIE,CAAG,EAAG/B,CAAO,EAEpD,OAAO8B,CACV,CAED,OAAOD,CACX,CACO,SAASgE,GAA0BH,EAAGC,EAAG,CAG5C,OAAID,IAAMC,EACC,EAEPD,IAAM,KACC,GAEPC,IAAM,KACC,EAEPD,IAAM,OACC,GAEPC,IAAM,OACC,EAEPD,IAAM,cACC,GAEPC,IAAM,cACC,EAEJD,EAAE,cAAcC,CAAC,CAC5B,CCvGA,MAAM6B,EAAsB,CACxB,OAAOvH,EAAM,CAIT,GAHI,OAAOA,EAAK,OAAU,UAGtB,OAAOA,EAAK,OAAU,UAAY,CAAC,OAAO,MAAMA,EAAK,KAAK,GAAK,OAAO,SAASA,EAAK,KAAK,EACzF,OAAOA,EAAK,MAEhB,MAAM,IAAIJ,GAAY,CAClB,KAAM,gBACN,QAAS,kCAAkCI,EAAK,YAAY,GAC5D,MAAOA,EAAK,YACxB,CAAS,CACJ,CACL,CAEA,MAAewH,GAAA,IAAID,GCdZ,MAAME,EAAa,CACtB,YAAYC,EAAS,CACjB,KAAK,QAAUA,CAClB,CACD,OAAO1H,EAAM,CACT,GAAI,MAAM,QAAQA,EAAK,KAAK,EACxB,OAAOA,EAAK,MACP,IAAI,CAAC2H,EAAG9G,IACFb,EAAK,MAAM,CACd,KAAM2H,EACN,QAAS3H,EAAK,QACd,MAAOA,EAAK,kBAAkBa,CAAK,CACtC,GAAE,OAAO,KAAK,OAAO,CACzB,EAEL,MAAM,IAAIjB,GAAY,CAClB,KAAM,gBACN,QAAS,wBAAwBI,EAAK,YAAY,GAClD,MAAOA,EAAK,YACxB,CAAS,CACJ,CACD,WAAY,CACR,MAAM4H,EAAiB,KAAK,QAC5B,GAAIA,EAAe,UAAW,CAC1B,MAAM9D,EAAe8D,EAAe,YAEpC,IAAIC,EACJ,GAAID,EAAe,gBAEfC,EAAcD,EAAe,0BAGzB9D,EAAa,UAAU,cAEvB+D,EAAcN,OAEb,CACD,MAAMjH,EAAQsH,EAAe,OAAO,KAAKtH,GAASA,EAAM,UAAY,IAAI,EACpEA,IACAuH,EAAcvH,EAAM,QAE3B,CAEL,OAAIuH,EACO,IAAI1D,GAAsByD,EAAgB9D,EAAc+D,CAAW,EAMnE,IAEd,CAID,OAAO,IAAI1D,GAAsByD,EAAgBA,EAAgBA,CAAc,CAClF,CAID,mBAAoB,CAChB,MAAMA,EAAiB,KAAK,QAC5B,GAAIA,EAAe,UAAW,CAC1B,MAAM9D,EAAe8D,EAAe,YAEpC,IAAIC,EACJ,GAAID,EAAe,gBAEfC,EAAcD,EAAe,0BAGzB9D,EAAa,UAAU,cAEvB+D,EAAcN,OAEb,CACD,MAAMjH,EAAQsH,EAAe,OAAO,KAAKtH,GAASA,EAAM,UAAY,IAAI,EACpEA,IACAuH,EAAcvH,EAAM,QAE3B,CAEL,OAAIuH,EACO,IAAIpF,GAMX,MAEP,CACD,OAAO,IAAIA,EACd,CACD,eAAeV,EAAO,CAClB,OAAO,MAAM,QAAQA,CAAK,GAAKA,EAAM,SAAW,CACnD,CACD,iBAAkB,CACd,MAAO,EACV,CACL,CCvGA,MAAM+F,EAAe,CACjB,OAAO9H,EAAM,CACT,GAAIA,EAAK,QAAU,IAAQA,EAAK,QAAU,GACtC,OAAOA,EAAK,MAEhB,GAAIA,EAAK,QAAU,OACf,MAAO,GAEX,GAAIA,EAAK,QAAU,QACf,MAAO,GAEX,GAAIA,EAAK,QAAU,EACf,MAAO,GAEX,GAAIA,EAAK,QAAU,EACf,MAAO,GAEX,MAAM,IAAIJ,GAAY,CAClB,KAAM,gBACN,QAAS,yBAAyBI,EAAK,YAAY,GACnD,MAAOA,EAAK,YACxB,CAAS,CACJ,CACL,CAEA,MAAe+H,GAAA,IAAID,GCzBZ,MAAME,EAAY,CACrB,YAAY,EAAG,CACX,KAAK,KAAO,CACf,CACD,OAAOhI,EAAM,CACT,IAAIiI,EACJ,GAAI,CAEA,GADAA,EAAMjI,EAAK,OACP,OAAO,OAAO,KAAK,IAAI,EAAE,SAASiI,CAAG,EACrC,OAAOA,CAEd,MACS,CACN,GAAI,CAEA,GADAA,EAAMjI,EAAK,OACP,OAAO,OAAO,KAAK,IAAI,EAAE,SAASiI,CAAG,EACrC,OAAOA,CAEd,MACU,CACP,MAAM,IAAIrI,GAAY,CAClB,KAAM,gBACN,QAAS,yCAA2C,OAAO,OAAO,KAAK,IAAI,EAAE,KAAK,IAAI,EACtF,MAAOI,EAAK,YAChC,CAAiB,CACJ,CACJ,CACD,MAAM,IAAIJ,GAAY,CAClB,KAAM,gBACN,QAAS,sBAAwBqI,EAAM,aAAe,OAAO,OAAO,KAAK,IAAI,EAAE,KAAK,IAAI,EACxF,MAAOjI,EAAK,YACxB,CAAS,CACJ,CACL,CCjCA,MAAMkI,EAAe,CACjB,OAAOlI,EAAM,CACT,GAAI,OAAOA,EAAK,OAAU,UAAY,OAAO,cAAcA,EAAK,KAAK,EACjE,OAAOA,EAAK,MAEhB,GAAI,OAAOA,EAAK,OAAU,SAAU,CAChC,MAAMmI,EAAS,OAAO,SAASnI,EAAK,KAAK,EACzC,GAAI,CAAC,MAAMmI,CAAM,EACb,OAAOA,CAEd,CACD,MAAM,IAAIvI,GAAY,CAClB,KAAM,gBACN,QAAS,0BAA0BI,EAAK,YAAY,GACpD,MAAOA,EAAK,YACxB,CAAS,CACJ,CACL,CAEA,MAAeoI,GAAA,IAAIF,GCpBZ,MAAMG,EAAgB,CACzB,YAAYX,EAAS,CACjB,KAAK,QAAUA,CAClB,CACD,OAAO1H,EAAM,CACT,OAAIA,EAAK,QAAU,KACR,KAEJA,EAAK,OAAO,KAAK,OAAO,CAClC,CACD,eAAe+B,EAAO,CAClB,OAAOA,IAAU,IACpB,CACD,iBAAkB,CACd,OAAO,IACV,CACL,CCfA,MAAMuG,EAAc,CAChB,OAAOtI,EAAM,CACT,GAAI,OAAOA,EAAK,OAAU,UAAY,CAAC,OAAO,MAAMA,EAAK,KAAK,GAAK,OAAO,SAASA,EAAK,KAAK,EACzF,OAAOA,EAAK,MAEhB,MAAM,IAAIJ,GAAY,CAClB,KAAM,gBACN,QAAS,wBAAwBI,EAAK,YAAY,GAClD,MAAOA,EAAK,YACxB,CAAS,CACJ,CACL,CAEA,MAAeuI,GAAA,IAAID,GCbnB,MAAME,EAAc,CAChB,OAAOxI,EAAM,CACT,GAAI,OAAOA,EAAK,OAAU,SACtB,OAAOA,EAAK,MAEhB,MAAM,IAAIJ,GAAY,CAClB,KAAM,gBACN,QAAS,wBAAwBI,EAAK,YAAY,GAClD,MAAOA,EAAK,YACxB,CAAS,CACJ,CACD,eAAe+B,EAAO,CAClB,OAAOA,IAAU,EACpB,CACD,iBAAkB,CACd,MAAO,EACV,CACL,CAEA,MAAe0G,EAAA,IAAID,GCXZ,MAAME,EAAW,CACpB,YAAY1I,EAAMD,EAAS4I,EAAe,GAAI,CAC1C,KAAK,KAAO3I,EACZ,KAAK,aAAe2I,EACpB,KAAK,QAAU5I,CAClB,CACD,kBAAkBO,EAAO,CACrB,OAAI,KAAK,cAAgB,GACdA,EAAQ,GAEZ,KAAK,aAAe,IAAMA,CACpC,CACD,IAAI,OAAQ,CACR,OAAO,KAAK,IACf,CACD,IAAI,QAAS,CACT,OAAO,KAAK,OAAOkI,CAAa,CACnC,CACD,IAAI,QAAS,CACT,OAAO,KAAK,OAAOF,EAAa,CACnC,CACD,IAAI,SAAU,CACV,OAAO,KAAK,OAAOJ,EAAc,CACpC,CACD,IAAI,SAAU,CACV,OAAO,KAAK,OAAOJ,EAAc,CACpC,CACD,OAAO/F,EAAO,CACV,GAAI,KAAK,OAASA,EACd,MAAM,IAAInC,GAAY,CAClB,KAAM,gBACN,QAAS,YAAcmC,EACvB,MAAO,KAAK,YAC5B,CAAa,EAEL,OAAOA,CACV,CAKD,MAAM6G,EAAQ,CACV,GAAI,MAAM,QAAQ,KAAK,KAAK,EAAG,CAC3B,GAAI,CAAC,OAAO,cAAcA,CAAM,EAC5B,MAAM,IAAIhJ,GAAY,CAClB,KAAM,gBACN,QAAS,gBACT,MAAO,KAAK,YAChC,CAAiB,EAEL,GAAI,KAAK,KAAKgJ,CAAM,IAAM,OACtB,MAAM,IAAIhJ,GAAY,CAClB,KAAM,gBACN,QAAS,qBAAqB,KAAK,kBAAkBgJ,CAAM,CAAC,GAC5D,MAAO,KAAK,kBAAkBA,CAAM,CACxD,CAAiB,EAEL,OAAO,IAAIF,GAAW,KAAK,KAAKE,CAAM,EAAG,KAAK,QAAS,KAAK,kBAAkBA,CAAM,CAAC,CACxF,CACD,MAAM,IAAIhJ,GAAY,CAClB,KAAM,gBACN,QAAS,oBAAoB,KAAK,aAAe,OAAS,KAAK,aAAe,EAAE,GAChF,MAAO,KAAK,YACxB,CAAS,CACJ,CAID,cAAcU,EAAO,CACjB,GAAI,KAAK,MAAQ,KAAK,KAAKA,CAAK,IAAM,QAAa,KAAK,KAAKA,CAAK,IAAM,KACpE,OAAO,IAAIoI,GAAW,KAAK,KAAKpI,CAAK,EAAG,KAAK,QAAS,KAAK,kBAAkBA,CAAK,CAAC,CAE1F,CAID,eAAeA,EAAO,CAClB,GAAI,KAAK,MAAQ,KAAK,KAAKA,CAAK,IAAM,OAClC,OAAO,IAAIoI,GAAW,KAAK,KAAKpI,CAAK,EAAG,KAAK,QAAS,KAAK,kBAAkBA,CAAK,CAAC,CAE1F,CAID,MAAMA,EAAO,CACT,GAAI,KAAK,MAAQ,KAAK,KAAKA,CAAK,IAAM,OAClC,OAAO,IAAIoI,GAAW,KAAK,KAAKpI,CAAK,EAAG,KAAK,QAAS,KAAK,kBAAkBA,CAAK,CAAC,EAEvF,MAAM,IAAIV,GAAY,CAClB,KAAM,gBACN,QAAS,SAASU,CAAK,eAAe,KAAK,aAAe,OAAS,KAAK,aAAe,EAAE,GACzF,MAAO,KAAK,YACxB,CAAS,CACJ,CACD,MAAMoH,EAAS,CACX,OAAO,IAAID,GAAaC,CAAO,EAAE,OAAO,IAAI,CAC/C,CACD,OAAOA,EAAS,CACZ,OAAOA,EAAQ,OAAO,IAAI,CAC7B,CACD,SAASA,EAAS,CACd,OAAO,IAAIW,GAAgBX,CAAO,EAAE,OAAO,IAAI,CAClD,CACD,KAAK,EAAG,CACJ,OAAO,IAAIM,GAAY,CAAC,EAAE,OAAO,IAAI,CACxC,CACD,MAAMa,EAAK,CACP,OAAO,IAAIH,GAAWG,EAAI,KAAMA,EAAI,QAASA,EAAI,KAAK,CACzD,CACL,CCtHA,MAAMC,EAAW,CACb,OAAO9I,EAAM,CACT,OAAOA,EAAK,KACf,CACL,CACA,MAAe+I,GAAA,IAAID,GCDZ,MAAME,EAAW,CACpB,YAAYC,EAAYC,EAAc,CAClC,KAAK,WAAaD,EAClB,KAAK,aAAeC,CACvB,CACD,WAAY,CACR,MAAMtB,EAAiB,KAAK,aAC5B,GAAIA,EAAe,UAAW,CAC1B,MAAM9D,EAAe8D,EAAe,YACpC,OAAO,IAAIuB,GAAgB,KAAK,WAAY,IAAId,GAAgB,IAAIjE,GAAkB,KAAK,aAAcN,CAAY,CAAC,CAAC,CAC1H,CACD,OAAO,IAAIqF,GAAgB,KAAK,WAAY,IAAId,GAAgB,KAAK,YAAY,CAAC,CACrF,CACD,mBAAoB,CAChB,OAAO,IAAIpB,EACd,CACD,OAAOjH,EAAM,CACT,GAAI,OAAOA,EAAK,OAAU,UAAYA,EAAK,QAAU,KAAM,CACvD,MAAMoJ,EAAM,IAAI,IAChB,UAAWtH,KAAO9B,EAAK,MAAO,CAC1B,MAAMqJ,EAAarJ,EAAK,MAAM,CAC1B,KAAM8B,EACN,QAAS9B,EAAK,QACd,MAAOA,EAAK,kBAAkB8B,CAAG,CACpC,GAAE,OAAO,KAAK,UAAU,EACnBwH,EAAetJ,EAAK,MAAM8B,CAAG,EAAE,OAAO,KAAK,YAAY,EAC7DsH,EAAI,IAAIC,EAAYC,CAAY,CACnC,CACD,OAAOF,CACV,CACD,MAAM,IAAIxJ,GAAY,CAClB,KAAM,gBACN,QAAS,yBAAyBI,EAAK,YAAY,GACnD,MAAOA,EAAK,YACxB,CAAS,CACJ,CACD,eAAe+B,EAAO,CAClB,OAAOA,aAAiB,KAAOA,EAAM,OAAS,CACjD,CACD,iBAAkB,CACd,OAAO,IAAI,GACd,CACL,CACO,MAAMoH,EAAgB,CACzB,YAAYF,EAAYC,EAAc,CAClC,KAAK,WAAaD,EAClB,KAAK,aAAeC,CACvB,CACD,OAAOK,EAAW,CACd,MAAMvJ,EAAOuJ,EAAU,MAAM,SAAS,EACtC,GAAI,OAAOvJ,EAAK,OAAU,UAAYA,EAAK,QAAU,KAAM,CACvD,MAAMoJ,EAAM,IAAInC,GAChB,UAAWnF,KAAO9B,EAAK,MAAO,CAC1B,MAAMqJ,EAAarJ,EAAK,MAAM,CAC1B,KAAM8B,EACN,QAAS9B,EAAK,QACd,MAAOA,EAAK,kBAAkB8B,CAAG,CACpC,GAAE,OAAO,KAAK,UAAU,EACnBwH,EAAetJ,EAAK,MAAM8B,CAAG,EAAE,OAAO,KAAK,YAAY,EAC7DsH,EAAI,IAAIC,EAAYC,CAAY,CACnC,CACD,OAAOF,CACV,CACD,MAAM,IAAIxJ,GAAY,CAClB,KAAM,gBACN,QAAS,yBAAyBI,EAAK,YAAY,GACnD,MAAOA,EAAK,YACxB,CAAS,CACJ,CACD,eAAe+B,EAAO,CAClB,OAAOA,aAAiBkF,IAAYlF,EAAM,OAAS,CACtD,CACD,iBAAkB,CACd,OAAO,IAAIkF,EACd,CACL,CC9EA,MAAMuC,EAAmB,CACrB,OAAOxJ,EAAM,CACT,MAAMiI,EAAMjI,EAAK,OAEjB,GAAI,CADU,uIACH,KAAKiI,CAAG,EACf,MAAM,IAAIrI,GAAY,CAClB,KAAM,gBACN,QAAS,oCACT,MAAO,+CACP,MAAOI,EAAK,YAC5B,CAAa,EAEL,OAAOiI,CACV,CACL,CAEO,MAAMwB,GAAe,IAAID,GChBzB,MAAME,EAAc,CACvB,YAAYT,EAAYC,EAAc,CAClC,KAAK,WAAaD,EAClB,KAAK,aAAeC,CACvB,CACD,OAAOlJ,EAAM,CACT,GAAI,OAAOA,EAAK,OAAU,UAAYA,EAAK,QAAU,KAAM,CACvD,MAAMoJ,EAAM,GACZ,UAAWtH,KAAO9B,EAAK,MAAO,CAC1B,MAAMqJ,EAAarJ,EAAK,MAAM,CAC1B,KAAM8B,EACN,QAAS9B,EAAK,QACd,MAAOA,EAAK,kBAAkB8B,CAAG,CACpC,GAAE,OAAO,KAAK,UAAU,EACnBwH,EAAetJ,EAAK,MAAM8B,CAAG,EAAE,OAAO,KAAK,YAAY,EAC7DsH,EAAIC,CAAU,EAAIC,CACrB,CACD,OAAOF,CACV,CACD,MAAM,IAAIxJ,GAAY,CAClB,KAAM,gBACN,QAAS,yBAAyBI,EAAK,YAAY,GACnD,MAAOA,EAAK,YACxB,CAAS,CACJ,CACL,CCzBO,MAAM2J,EAAc,CACvB,YAAYjC,EAASjH,EAAG,CACpB,KAAK,QAAUiH,EACf,KAAK,OAASjH,EACd,MAAMuB,EAAI,OAAO,OAAOvB,CAAC,EACzB,GAAI,CAACuB,EACD,MAAM,IAAI,MAAM,0GAA0G,EAE9H,KAAK,IAAMA,CACd,CACD,OAAOhC,EAAM,CACT,MAAMM,EAAQN,EAAK,cAAc,SAAS,EAC1C,GAAI,CAACM,EACD,OAAO,KAAK,QAAQ,OAAON,CAAI,EAEnC,MAAM4J,EAAItJ,EAAM,OAChB,GAAIsJ,IAAM,KAAK,IACX,OAAO,KAAK,OAEhB,MAAM,IAAIhK,GAAY,CAClB,KAAM,gBACN,QAAS,yBAAyBgK,CAAC,gBAAgB,KAAK,GAAG,IAC3D,MAAO5J,EAAK,YACxB,CAAS,CACJ,CACL,CCzBO,SAASM,EAAMuJ,EAAU,CAC5B,MAAO,CAACC,EAAkChI,IAAQ,CAC9C,IAAIhC,EAAIG,EAAIC,EAAIgG,EAAI6D,EAAIC,EACnBF,EAAO,YAAY,OAKhBA,EAAO,YAAY,OAAO,YAAcA,EAAO,YAAY,OAAO,aAAeA,EAAO,cAExFA,EAAO,YAAY,OAASA,EAAO,YAAY,OAAO,MAAM,CAAC,EAC7DA,EAAO,YAAY,OAAO,WAAaA,EAAO,YAC9CA,EAAO,YAAY,gBAAkB,SARzCA,EAAO,YAAY,OAAS,GAC5BA,EAAO,YAAY,OAAO,WAAaA,EAAO,aAUlD,MAAMxJ,EAAQ,IAAIuE,GAClBvE,EAAM,UAAYR,EAAK+J,EAAS,YAAc,MAAQ/J,IAAO,OAASA,EAAK,GAC3EQ,EAAM,UAAYL,EAAK4J,EAAS,YAAc,MAAQ5J,IAAO,OAASA,EAAK,GAC3EK,EAAM,QAAUuJ,EAAS,QACzBvJ,EAAM,SAAWJ,EAAK2J,EAAS,WAAa,MAAQ3J,IAAO,OAASA,EAAK,EACzEI,EAAM,OAAS4F,EAAK2D,EAAS,SAAW,MAAQ3D,IAAO,OAASA,EAAKpE,EACrExB,EAAM,QAAUuJ,EAAS,QACzBvJ,EAAM,UAAYuJ,EAAS,UAC3BvJ,EAAM,aAAeuJ,EAAS,aAC9BvJ,EAAM,eAAiBuJ,EAAS,eAChCvJ,EAAM,aAAeuJ,EAAS,aAC9BvJ,EAAM,kBAAoBuJ,EAAS,kBACnCvJ,EAAM,SAAWwB,EACjBgI,EAAO,YAAY,OAAO,KAAKxJ,CAAK,EACpCwJ,EAAO,YAAY,cAAgB,KAAK,KAAKC,EAAKD,EAAO,YAAY,iBAAmB,MAAQC,IAAO,OAASA,EAAK,GAAIC,EAAKH,EAAS,WAAa,MAAQG,IAAO,OAASA,EAAK,CAAC,EAClLF,EAAO,YAAY,YAC3B,CACA,CCjCO,IAAIG,IACV,SAAUA,EAAc,CAIrBA,EAAa,QAAa,UAI1BA,EAAa,SAAc,UAC/B,GAAGA,KAAiBA,GAAe,GAAG,ECL/B,MAAMC,EAAW,CACpB,YAAYlK,EAAM,CACd,KAAK,KAAOA,CACf,CACD,OAAOD,EAAS,CACZ,MAAO,CACH,KAAM2D,GAAa,KAAK,KAAM3D,CAAO,EACrC,QAASA,EAAQ,OAC7B,CACK,CACL,CACO,MAAMoK,EAAkB,CAC3B,YAAYzC,EAAS,CACjB,KAAK,QAAUA,CAClB,CACD,OAAO1H,EAAM,CAET,MAAMD,EAAUC,EAAK,MAAM,MAAM,EACjC,OAAAD,EAAQ,QAAQ,QAAUC,EAAK,MAAM,SAAS,EAAE,QACzC,IAAIkK,GAAWnK,EAAQ,OAAO,KAAK,OAAO,CAAC,CACrD,CACL,CC1BA,MAAMqK,EAAY,CACd,OAAOpK,EAAM,CACT,OAAO,IAAI,KAAKA,EAAK,OAAO,CAC/B,CACL,CACA,KAAK,UAAU,OAAS,SAAUD,EAAS,CACvC,OAAO,KAAK,SAChB,EAEA,MAAesK,GAAA,IAAID,GCRZ,MAAME,EAAW,CACpB,YAAY7K,EAAS,CACjB,IAAIK,EAAIG,EACR,KAAK,iBAAmB,CAAC,QAAQ,EACjC,KAAK,WAAa,GAClB,KAAK,kBAAoBH,EAAKL,GAAY,KAA6B,OAASA,EAAQ,oBAAsB,MAAQK,IAAO,OAASA,EAAK,KAAK,iBAChJ,KAAK,YAAcG,EAAKR,GAAY,KAA6B,OAASA,EAAQ,cAAgB,MAAQQ,IAAO,OAASA,EAAK,KAAK,UACvI,CACD,OAAOD,EAAM,CACT,MAAMiI,EAAMjI,EAAK,OACjB,GAAI,CACA,MAAMmI,EAAS,IAAI,IAAIF,CAAG,EAC1B,GAAI,CAAC,KAAK,iBAAiB,SAASE,EAAO,QAAQ,EAC/C,MAAM,IAAIvI,GAAY,CAClB,KAAM,gBACN,QAAS,2BAA2BI,EAAK,YAAY,kBAAkB,KAAK,iBAAiB,KAAK,IAAI,CAAC,GACvG,MAAOA,EAAK,YAChC,CAAiB,EAEL,GAAI,CAAC,KAAK,YAAcmI,EAAO,OAAS,GACpC,MAAM,IAAIvI,GAAY,CAClB,KAAM,gBACN,QAAS,+CAA+CI,EAAK,YAAY,GACzE,MAAOA,EAAK,YAChC,CAAiB,EAEL,GAAImI,EAAO,UAAYA,EAAO,SAC1B,MAAM,IAAIvI,GAAY,CAClB,KAAM,gBACN,QAAS,qDAAqDI,EAAK,YAAY,GAC/E,MAAOA,EAAK,YAChC,CAAiB,EAEL,OAAOmI,CACV,OACM1H,EAAG,CACN,KAAI,CAACD,GAAcC,CAAC,GAAK,CAACC,GAAeD,CAAC,EAChC,IAAIb,GAAY,CAClB,KAAM,gBACN,QAAS,2BAA2BI,EAAK,YAAY,GACrD,MAAOA,EAAK,YAChC,CAAiB,EAECS,CACT,CACJ,CACL,CACA,IAAI,UAAU,OAAS,SAAUV,EAAS,CACtC,OAAO,KAAK,IAChB,EC5CY,MAACwK,GAAU,IAMvB,WAAW,YAAc,CACrB,SAAU,GACV,QAASA,GACT,cAAe,CACX,IAAIzK,EACJ,OAAQA,EAAK,KAAK,WAAa,MAAQA,IAAO,OAASA,EAAK,MAC/D,CACL,EChBU,IAAC0K,IACV,SAAUA,EAAiB,CAExBA,EAAgB,KAAU,OAE1BA,EAAgB,KAAU,OAE1BA,EAAgB,MAAW,QAE3BA,EAAgB,KAAU,MAC9B,GAAGA,KAAoBA,GAAkB,CAAE,EAAC,EACrC,SAASC,GAAyBC,EAAO,CAC5C,OAAQA,EAAK,CACT,KAAKF,GAAgB,KAAM,MAAO,GAClC,KAAKA,GAAgB,KAAM,MAAO,GAClC,KAAKA,GAAgB,MAAO,MAAO,GACnC,KAAKA,GAAgB,KAAM,MAAO,GAClC,QAAS,CACL,MAAMG,EAAID,EACV,MAAM,IAAI,MAAM,4BAA8BC,CAAC,CAClD,CACJ,CACL,CACO,SAASC,OAA0BC,EAAQ,CAC9C,IAAIC,EAAMN,GAAgB,KAC1B,UAAWE,KAASG,EACZJ,GAAyBC,CAAK,EAAID,GAAyBK,CAAG,IAC9DA,EAAMJ,GAGd,OAAOI,CACX,CAUO,SAASC,IAAuBL,EAAO,CAC1C,OAAQA,EAAK,CACT,KAAKF,GAAgB,KAAM,MAAO,oBAClC,KAAKA,GAAgB,KAAM,MAAO,QAClC,KAAKA,GAAgB,MAAO,MAAO,WACnC,KAAKA,GAAgB,KAAM,MAAO,oBAClC,QAAS,CACL,MAAMG,EAAID,EACV,MAAM,IAAI,MAAM,4BAA8BC,CAAC,CAClD,CACJ,CACL,CCnDU,IAACK,IACV,SAAUA,EAAa,CAKpBA,EAAY,gBAAqB,kBAEjCA,EAAY,2BAAgC,6BAC5CA,EAAY,2BAAgC,6BAC5CA,EAAY,4BAAiC,8BAC7CA,EAAY,yBAA8B,2BAC1CA,EAAY,WAAgB,aAE5BA,EAAY,sCAA2C,wCAIvDA,EAAY,wBAA6B,0BACzCA,EAAY,yBAA8B,2BAI1CA,EAAY,gBAAqB,kBAEjCA,EAAY,mBAAwB,oBACxC,GAAGA,KAAgBA,GAAc,CAAE,EAAC,EAC7B,MAAMC,EAAkB,CAC3B,OAAO,QAAQC,EAAO,CAClB,OAAQA,EAAK,CACT,KAAKF,GAAY,gBAAiB,MAAO,8BACzC,KAAKA,GAAY,4BAA6B,MAAO,oCACrD,KAAKA,GAAY,2BAA4B,MAAO,2BACpD,KAAKA,GAAY,2BAA4B,MAAO,iBACpD,KAAKA,GAAY,yBAA0B,MAAO,gBAClD,KAAKA,GAAY,mBAAoB,MAAO,kBAC5C,KAAKA,GAAY,WAAY,MAAO,uBACpC,KAAKA,GAAY,sCAAuC,MAAO,2BAE/D,KAAKA,GAAY,wBAAyB,MAAO,wBACjD,KAAKA,GAAY,yBAA0B,MAAO,wBAClD,KAAKA,GAAY,gBAAiB,MAAO,sBAC5C,CACJ,CACD,OAAO,yCAA0C,CAC7C,OAAO,OAAO,OAAOA,EAAW,EAAE,OAAOE,GAASD,GAAkB,uBAAuBC,CAAK,IAAM,IAAI,CAC7G,CACD,OAAO,aAAaA,EAAO,CACvB,OAAQA,EAAK,CACT,KAAKF,GAAY,gBAAiB,MAAO,WACzC,KAAKA,GAAY,4BAA6B,MAAO,cACrD,KAAKA,GAAY,2BAA4B,MAAO,mBACpD,KAAKA,GAAY,2BAA4B,MAAO,QACpD,KAAKA,GAAY,yBAA0B,MAAO,QAClD,KAAKA,GAAY,mBAAoB,MAAO,UAC5C,KAAKA,GAAY,WAAY,MAAO,eACpC,KAAKA,GAAY,sCAAuC,MAAO,gBAE/D,KAAKA,GAAY,wBAAyB,MAAO,mBACjD,KAAKA,GAAY,yBAA0B,MAAO,mBAClD,KAAKA,GAAY,gBAAiB,MAAO,sBAC5C,CACJ,CACD,OAAO,eAAeE,EAAO,CACzB,OAAQA,EAAK,CACT,KAAKF,GAAY,gBAAiB,MAAO,8BACzC,KAAKA,GAAY,4BAA6B,MAAO,wBACrD,KAAKA,GAAY,2BAA4B,MAAO,mBACpD,KAAKA,GAAY,2BAA4B,MAAO,iBACpD,KAAKA,GAAY,yBAA0B,MAAO,gBAClD,KAAKA,GAAY,mBAAoB,MAAO,sBAC5C,KAAKA,GAAY,WAAY,MAAO,uBACpC,KAAKA,GAAY,sCAAuC,MAAO,2BAE/D,KAAKA,GAAY,wBAAyB,MAAO,gCACjD,KAAKA,GAAY,yBAA0B,MAAO,gCAClD,KAAKA,GAAY,gBAAiB,MAAO,qDAC5C,CACJ,CACD,OAAO,mBAAmBE,EAAO,CAC7B,OAAQA,EAAK,CACT,KAAKF,GAAY,4BAA6B,MAAO,gJACrD,KAAKA,GAAY,2BAA4B,MAAO,oGAEpD,KAAKA,GAAY,wBAAyB,MAAO,6HACjD,KAAKA,GAAY,yBAA0B,MAAO,yFAClD,KAAKA,GAAY,WAAY,MAAO,2DACpC,KAAKA,GAAY,gBAAiB,MAAO,sDAC5C,CACD,OAAO,IACV,CAMD,OAAO,uBAAuBE,EAAO,CACjC,OAAQA,EAAK,CACT,KAAKF,GAAY,mBAAoB,OAAOR,GAAgB,MAC5D,KAAKQ,GAAY,sCAAuC,OAAO,IAClE,CACD,OAAOR,GAAgB,IAC1B,CAID,OAAO,gBAAgBU,EAAO,CAC1B,OAAQA,EAAK,CAET,KAAKF,GAAY,2BAA4B,MAAO,CAACA,GAAY,2BAA2B,EAE5F,KAAKA,GAAY,wBAAyB,MAAO,CAACA,GAAY,4BAA6BA,GAAY,wBAAwB,EAC/H,KAAKA,GAAY,yBAA0B,MAAO,CAACA,GAAY,2BAA2B,EAE1F,KAAKA,GAAY,WAAY,MAAO,CAACA,GAAY,qCAAqC,CACzF,CACD,MAAO,EACV,CACL,CCpEO,SAASG,EAAWC,EAAYtB,EAAQhI,EAAKuJ,EAAM,CACxD,IAAIC,EAAI,UAAU,OAAQC,EAAID,EAAI,EAAIxB,EAASuB,IAAS,KAAOA,EAAO,OAAO,yBAAyBvB,EAAQhI,CAAG,EAAIuJ,EAAMnH,EAC3H,GAAI,OAAO,SAAY,UAAY,OAAO,QAAQ,UAAa,WAAYqH,EAAI,QAAQ,SAASH,EAAYtB,EAAQhI,EAAKuJ,CAAI,MACxH,SAAStM,EAAIqM,EAAW,OAAS,EAAGrM,GAAK,EAAGA,KAASmF,EAAIkH,EAAWrM,CAAC,KAAGwM,GAAKD,EAAI,EAAIpH,EAAEqH,CAAC,EAAID,EAAI,EAAIpH,EAAE4F,EAAQhI,EAAKyJ,CAAC,EAAIrH,EAAE4F,EAAQhI,CAAG,IAAMyJ,GAChJ,OAAOD,EAAI,GAAKC,GAAK,OAAO,eAAezB,EAAQhI,EAAKyJ,CAAC,EAAGA,CAC9D,soBC3DO,MAAMC,EAAO,CAChB,OAAO,SAASC,EAAK,CACX,MAAAC,EAAS,4CAA4C,KAAKD,CAAG,EACnE,GAAI,CAACC,EACG,OAAAC,GAAU,cAAgB,eAClB,cAAM,sBAAsBF,CAAG,EAAE,EAEtC,CACH,EAAG,EACH,EAAG,EACH,EAAG,GAGX,IAAIF,EAAI,SAASG,EAAO,CAAC,EAAG,EAAE,EAC1BE,EAAI,SAASF,EAAO,CAAC,EAAG,EAAE,EAC1BhG,EAAI,SAASgG,EAAO,CAAC,EAAG,EAAE,EACzBH,GAAA,IACAK,GAAA,IACAlG,GAAA,IACL,MAAMoF,EAAM,KAAK,IAAIS,EAAGK,EAAGlG,CAAC,EAAGmG,EAAM,KAAK,IAAIN,EAAGK,EAAGlG,CAAC,EACrD,IAAIoG,EAAGlC,EAAGe,GAAKG,EAAMe,GAAO,EAC5B,GAAIf,IAAQe,EACRC,EAAIlC,EAAI,MAEP,CACD,MAAM1F,EAAI4G,EAAMe,EAEhB,OADAjC,EAAIe,EAAI,GAAMzG,GAAK,EAAI4G,EAAMe,GAAO3H,GAAK4G,EAAMe,GACvCf,EAAK,CACT,KAAKS,EACDO,GAAKF,EAAIlG,GAAKxB,GAAK0H,EAAIlG,EAAI,EAAI,GAC/B,MACJ,KAAKkG,EACIE,GAAApG,EAAI6F,GAAKrH,EAAI,EAClB,MACJ,KAAKwB,EACIoG,GAAAP,EAAIK,GAAK1H,EAAI,EAClB,KACR,CACK4H,GAAA,CACT,CACO,OACH,EAAGA,EAAI,IACP,EAAGlC,EAAI,IACP,EAAGe,EAAI,IAEf,CAOA,OAAO,SAASmB,EAAGlC,EAAGe,EAAG,CAEhBf,GAAA,IACAe,GAAA,IACC,MAAAW,GAAK,EAAI,KAAK,IAAI,EAAIX,EAAI,CAAC,GAAKf,EAAGmC,EAAIT,GAAK,EAAI,KAAK,IAAKQ,EAAI,GAAM,EAAI,CAAC,GAAIE,EAAIrB,EAAIW,EAAI,EAC/F,IAAIC,EAAI,EAAGK,EAAI,EAAGlG,EAAI,EAClB,UAAKoG,GAAKA,EAAI,IACVP,EAAAD,EACAM,EAAAG,EACArG,EAAA,GAEC,IAAMoG,GAAKA,EAAI,KAChBP,EAAAQ,EACAH,EAAAN,EACA5F,EAAA,GAEC,KAAOoG,GAAKA,EAAI,KACjBP,EAAA,EACAK,EAAAN,EACA5F,EAAAqG,GAEC,KAAOD,GAAKA,EAAI,KACjBP,EAAA,EACAK,EAAAG,EACArG,EAAA4F,GAEC,KAAOQ,GAAKA,EAAI,KACjBP,EAAAQ,EACAH,EAAA,EACAlG,EAAA4F,GAEC,KAAOQ,GAAKA,EAAI,MACjBP,EAAAD,EACAM,EAAA,EACAlG,EAAAqG,GAERR,EAAI,KAAK,OAAOA,EAAIS,GAAK,GAAG,EAC5BJ,EAAI,KAAK,OAAOA,EAAII,GAAK,GAAG,EAC5BtG,EAAI,KAAK,OAAOA,EAAIsG,GAAK,GAAG,EACrB,CACH,EAAAT,EAAG,EAAAK,EAAG,EAAAlG,CAAA,CAEd,CACA,OAAO,SAASuG,EAAO,CACnB,GAAI,CAAE,EAAAH,EAAG,EAAAlC,EAAG,EAAAe,CAAA,EAAMsB,EACbtB,GAAA,IACL,MAAMlF,EAAImE,EAAI,KAAK,IAAIe,EAAG,EAAIA,CAAC,EAAI,IAC7BtE,EAAKjF,GAAM,CACP,MAAAY,GAAKZ,EAAI0K,EAAI,IAAM,GACnBG,EAAQtB,EAAIlF,EAAI,KAAK,IAAI,KAAK,IAAIzD,EAAI,EAAG,EAAIA,EAAG,CAAC,EAAG,EAAE,EACrD,YAAK,MAAM,IAAMiK,CAAK,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,GAExD,UAAI5F,EAAE,CAAC,CAAC,GAAGA,EAAE,CAAC,CAAC,GAAGA,EAAE,CAAC,CAAC,EACjC,CACA,OAAO,SAASoF,EAAK,CAIb,GAHAA,EAAI,WAAW,GAAG,IACZA,IAAI,UAAU,CAAC,GAErBA,EAAI,SAAW,EACT,UAAI,MAAM,wCAAwC,EAEtD,MAAAS,EAAUT,EAAI,MAAM,SAAS,EACnC,GAAI,CAACS,GAAWA,EAAQ,SAAW,EACzB,UAAI,MAAM,mBAAmB,EAEhC,OACH,EAAG,SAASA,EAAQ,CAAC,EAAG,EAAE,EAC1B,EAAG,SAASA,EAAQ,CAAC,EAAG,EAAE,EAC1B,EAAG,SAASA,EAAQ,CAAC,EAAG,EAAE,EAElC,CACA,OAAO,iBAAiBC,EAAYC,EAAY,CACtC,MAAAC,EAAK,KAAK,qBAAqBD,CAAU,EACzCE,EAAK,KAAK,qBAAqBH,CAAU,EAEvC,YAAK,IAAIE,EAAIC,CAAE,EAAI,MAAS,KAAK,IAAID,EAAIC,CAAE,EAAI,IAC3D,CACA,OAAO,qBAAqBhB,EAAG,CAC3B,MAAMW,EAAQ,CACV,EAAGX,EAAE,EAAI,IACT,EAAGA,EAAE,EAAI,IACT,EAAGA,EAAE,EAAI,KAGPiB,EAAIN,EAAM,GAAK,OACfA,EAAM,EAAI,MACV,KAAK,KAAKA,EAAM,EAAI,MAAS,MAAO,GAAG,EACvCO,EAAIP,EAAM,GAAK,OACfA,EAAM,EAAI,MACV,KAAK,KAAKA,EAAM,EAAI,MAAS,MAAO,GAAG,EACvCQ,EAAIR,EAAM,GAAK,OACfA,EAAM,EAAI,MACV,KAAK,KAAKA,EAAM,EAAI,MAAS,MAAO,GAAG,EAEtC,MADG,OAASM,EAAI,MAASC,EAAI,MAASC,CAEjD,CACA,OAAO,cAAcR,EAAO,CACpB,cAAOA,GAAU,SACV,KAAK,SAASA,CAAK,EAE1B,MAAOA,EACAA,EAEJ,KAAK,SAASA,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAC,CAClD,CACA,OAAO,iBAAiBA,EAAO,CACvB,IACM,MAAAS,EAAM,KAAK,cAAcT,CAAK,EAC9BU,EAAgB,KAAK,gBAAgBD,EAAK,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,CAAG,GAC9DE,EAAgB,KAAK,gBAAgBF,EAAK,CAAE,EAAG,IAAK,EAAG,IAAK,EAAG,GAAK,GACnE,OAAAC,EAAgBC,EAAgB,OAAS,aAE7CnM,EAAG,CACN,eAAQ,MAAMA,CAAC,EACR,MACX,CACJ,CAUA,OAAO,UAAUyB,EAAK,CAClB,OAAQA,EAAM,MAAU,GAC5B,CACA,OAAO,eAAe2K,EAAW,CAG7B,OAAIA,EAAY,KACLA,EAEJ,KAAK,IAAI,KAAUA,CAAS,GAAK,MAAUA,CACtD,CACA,OAAO,aAAaZ,EAAO,CACvB,MAAMa,EAAI,SAAY,KAAK,UAAUb,EAAM,CAAC,EACtC,SAAY,KAAK,UAAUA,EAAM,CAAC,EAClC,QAAW,KAAK,UAAUA,EAAM,CAAC,EAChC,YAAK,eAAea,CAAC,CAChC,CACA,OAAO,YAAYV,EAAYD,EAAY,CAGjC,MAAAY,EAAsB,KAAK,aAAaX,CAAU,EAClDY,EAAsB,KAAK,aAAab,CAAU,EACxD,OAAI,KAAK,IAAIY,EAAsBC,CAAmB,EAAI,KAC/C,EAEPD,EAAsBC,GACdD,GAAuB,IAAOC,GAAuB,KAAQ,KAErED,EAAsBC,GACdD,GAAuB,IAAOC,GAAuB,KAAQ,KAElE,CACX,CACA,OAAO,cAAcC,EAAU,CAG3B,MAAMC,EAAc,iBACdC,EAAc,KACdC,EAAc,KAAK,IAAIH,CAAQ,EACrC,OAAIG,EAAc,KACP,EAEPA,GAAe,QACRH,EAAWA,EAAWC,EAAcC,EAE3CF,EAAW,QACJA,EAAWE,EAElBF,EAAW,SACJA,EAAWE,EAEf,CACX,CACA,OAAO,gBAAgBf,EAAYD,EAAY,CAC3C,MAAMc,EAAW,KAAK,YAAYb,EAAYD,CAAU,EAClDkB,EAAiB,KAAK,cAAcJ,CAAQ,EAC3C,YAAK,IAAII,EAAiB,GAAG,CACxC,CACJ,CCvOA,MAAMC,WAAmB,KAAM,CAAE,CAK1B,MAAMC,WAA6BD,EAAW,CACnD,YAAYE,EAAQ,CAClB,MAAM,qBAAqBA,EAAO,UAAW,GAAE,CAChD,CACH,CAKO,MAAMC,WAA6BH,EAAW,CACnD,YAAYE,EAAQ,CAClB,MAAM,qBAAqBA,EAAO,UAAW,GAAE,CAChD,CACH,CAKO,MAAME,WAA6BJ,EAAW,CACnD,YAAYE,EAAQ,CAClB,MAAM,qBAAqBA,EAAO,UAAW,GAAE,CAChD,CACH,CAKO,MAAMG,WAAsCL,EAAW,CAAE,CAKzD,MAAMM,WAAyBN,EAAW,CAC/C,YAAYO,EAAM,CAChB,MAAM,gBAAgBA,CAAI,EAAE,CAC7B,CACH,CAKO,MAAMC,WAA6BR,EAAW,CAAE,CAKhD,MAAMS,WAA4BT,EAAW,CAClD,aAAc,CACZ,MAAM,2BAA2B,CAClC,CACH,CCxDA,MAAMlM,GAAI,UACRwI,GAAI,QACJe,GAAI,OAEOqD,GAAa,CACxB,KAAM5M,GACN,MAAOA,GACP,IAAKA,EACP,EAEa6M,GAAW,CACtB,KAAM7M,GACN,MAAOwI,GACP,IAAKxI,EACP,EAEa8M,GAAwB,CACnC,KAAM9M,GACN,MAAOwI,GACP,IAAKxI,GACL,QAASwI,EACX,EAEauE,GAAY,CACvB,KAAM/M,GACN,MAAOuJ,GACP,IAAKvJ,EACP,EAEagN,GAAY,CACvB,KAAMhN,GACN,MAAOuJ,GACP,IAAKvJ,GACL,QAASuJ,EACX,EAEa0D,GAAc,CACzB,KAAMjN,GACN,OAAQA,EACV,EAEakN,GAAoB,CAC/B,KAAMlN,GACN,OAAQA,GACR,OAAQA,EACV,EAEamN,GAAyB,CACpC,KAAMnN,GACN,OAAQA,GACR,OAAQA,GACR,aAAcwI,EAChB,EAEa4E,GAAwB,CACnC,KAAMpN,GACN,OAAQA,GACR,OAAQA,GACR,aAAcuJ,EAChB,EAEa8D,GAAiB,CAC5B,KAAMrN,GACN,OAAQA,GACR,UAAW,KACb,EAEasN,GAAuB,CAClC,KAAMtN,GACN,OAAQA,GACR,OAAQA,GACR,UAAW,KACb,EAEauN,GAA4B,CACvC,KAAMvN,GACN,OAAQA,GACR,OAAQA,GACR,UAAW,MACX,aAAcwI,EAChB,EAEagF,GAA2B,CACtC,KAAMxN,GACN,OAAQA,GACR,OAAQA,GACR,UAAW,MACX,aAAcuJ,EAChB,EAEakE,GAAiB,CAC5B,KAAMzN,GACN,MAAOA,GACP,IAAKA,GACL,KAAMA,GACN,OAAQA,EACV,EAEa0N,GAA8B,CACzC,KAAM1N,GACN,MAAOA,GACP,IAAKA,GACL,KAAMA,GACN,OAAQA,GACR,OAAQA,EACV,EAEa2N,GAAe,CAC1B,KAAM3N,GACN,MAAOwI,GACP,IAAKxI,GACL,KAAMA,GACN,OAAQA,EACV,EAEa4N,GAA4B,CACvC,KAAM5N,GACN,MAAOwI,GACP,IAAKxI,GACL,KAAMA,GACN,OAAQA,GACR,OAAQA,EACV,EAEa6N,GAA4B,CACvC,KAAM7N,GACN,MAAOwI,GACP,IAAKxI,GACL,QAASwI,GACT,KAAMxI,GACN,OAAQA,EACV,EAEa8N,GAAgB,CAC3B,KAAM9N,GACN,MAAOuJ,GACP,IAAKvJ,GACL,KAAMA,GACN,OAAQA,GACR,aAAcwI,EAChB,EAEauF,GAA6B,CACxC,KAAM/N,GACN,MAAOuJ,GACP,IAAKvJ,GACL,KAAMA,GACN,OAAQA,GACR,OAAQA,GACR,aAAcwI,EAChB,EAEawF,GAAgB,CAC3B,KAAMhO,GACN,MAAOuJ,GACP,IAAKvJ,GACL,QAASuJ,GACT,KAAMvJ,GACN,OAAQA,GACR,aAAcuJ,EAChB,EAEa0E,GAA6B,CACxC,KAAMjO,GACN,MAAOuJ,GACP,IAAKvJ,GACL,QAASuJ,GACT,KAAMvJ,GACN,OAAQA,GACR,OAAQA,GACR,aAAcuJ,EAChB,EC1Ke,MAAM2E,EAAK,CAMxB,IAAI,MAAO,CACT,MAAM,IAAIvB,EACX,CAOD,IAAI,MAAO,CACT,MAAM,IAAIA,EACX,CAED,IAAI,UAAW,CACb,OAAO,KAAK,IACb,CAOD,IAAI,aAAc,CAChB,MAAM,IAAIA,EACX,CAWD,WAAWwB,EAAIC,EAAM,CACnB,MAAM,IAAIzB,EACX,CAUD,aAAawB,EAAIE,EAAQ,CACvB,MAAM,IAAI1B,EACX,CAQD,OAAOwB,EAAI,CACT,MAAM,IAAIxB,EACX,CAQD,OAAO2B,EAAW,CAChB,MAAM,IAAI3B,EACX,CAOD,IAAI,SAAU,CACZ,MAAM,IAAIA,EACX,CACH,CCvFA,IAAI4B,GAAY,KAMD,MAAMC,WAAmBN,EAAK,CAK3C,WAAW,UAAW,CACpB,OAAIK,KAAc,OAChBA,GAAY,IAAIC,IAEXD,EACR,CAGD,IAAI,MAAO,CACT,MAAO,QACR,CAGD,IAAI,MAAO,CACT,OAAO,IAAI,KAAK,eAAgB,EAAC,gBAAe,EAAG,QACpD,CAGD,IAAI,aAAc,CAChB,MAAO,EACR,CAGD,WAAWJ,EAAI,CAAE,OAAAE,EAAQ,OAAAI,CAAM,EAAI,CACjC,OAAOC,GAAcP,EAAIE,EAAQI,CAAM,CACxC,CAGD,aAAaN,EAAIE,EAAQ,CACvB,OAAOM,GAAa,KAAK,OAAOR,CAAE,EAAGE,CAAM,CAC5C,CAGD,OAAOF,EAAI,CACT,MAAO,CAAC,IAAI,KAAKA,CAAE,EAAE,kBAAiB,CACvC,CAGD,OAAOG,EAAW,CAChB,OAAOA,EAAU,OAAS,QAC3B,CAGD,IAAI,SAAU,CACZ,MAAO,EACR,CACH,CCzDA,IAAIM,GAAW,GACf,SAASC,GAAQC,EAAM,CACrB,OAAKF,GAASE,CAAI,IAChBF,GAASE,CAAI,EAAI,IAAI,KAAK,eAAe,QAAS,CAChD,OAAQ,GACR,SAAUA,EACV,KAAM,UACN,MAAO,UACP,IAAK,UACL,KAAM,UACN,OAAQ,UACR,OAAQ,UACR,IAAK,OACX,CAAK,GAEIF,GAASE,CAAI,CACtB,CAEA,MAAMC,GAAY,CAChB,KAAM,EACN,MAAO,EACP,IAAK,EACL,IAAK,EACL,KAAM,EACN,OAAQ,EACR,OAAQ,CACV,EAEA,SAASC,GAAYC,EAAKC,EAAM,CAC9B,MAAMC,EAAYF,EAAI,OAAOC,CAAI,EAAE,QAAQ,UAAW,EAAE,EACtDnI,EAAS,kDAAkD,KAAKoI,CAAS,EACzE,EAAGC,EAAQC,EAAMC,EAAOC,EAASC,EAAOC,EAASC,CAAO,EAAI3I,EAC9D,MAAO,CAACuI,EAAOF,EAAQC,EAAME,EAASC,EAAOC,EAASC,CAAO,CAC/D,CAEA,SAASC,GAAYV,EAAKC,EAAM,CAC9B,MAAMC,EAAYF,EAAI,cAAcC,CAAI,EAClCU,EAAS,GACf,QAASjS,EAAI,EAAGA,EAAIwR,EAAU,OAAQxR,IAAK,CACzC,KAAM,CAAE,KAAAkS,EAAM,MAAAlP,CAAO,EAAGwO,EAAUxR,CAAC,EAC7BmS,EAAMf,GAAUc,CAAI,EAEtBA,IAAS,MACXD,EAAOE,CAAG,EAAInP,EACJoP,GAAYD,CAAG,IACzBF,EAAOE,CAAG,EAAI,SAASnP,EAAO,EAAE,EAEnC,CACD,OAAOiP,CACT,CAEA,IAAII,GAAgB,GAKL,MAAMC,WAAiB/B,EAAK,CAKzC,OAAO,OAAOgC,EAAM,CAClB,OAAKF,GAAcE,CAAI,IACrBF,GAAcE,CAAI,EAAI,IAAID,GAASC,CAAI,GAElCF,GAAcE,CAAI,CAC1B,CAMD,OAAO,YAAa,CAClBF,GAAgB,GAChBpB,GAAW,EACZ,CAUD,OAAO,iBAAiBpG,EAAG,CACzB,OAAO,KAAK,YAAYA,CAAC,CAC1B,CAUD,OAAO,YAAYsG,EAAM,CACvB,GAAI,CAACA,EACH,MAAO,GAET,GAAI,CACF,WAAI,KAAK,eAAe,QAAS,CAAE,SAAUA,CAAM,GAAE,SAC9C,EACR,MAAW,CACV,MAAO,EACR,CACF,CAED,YAAYoB,EAAM,CAChB,QAEA,KAAK,SAAWA,EAEhB,KAAK,MAAQD,GAAS,YAAYC,CAAI,CACvC,CAGD,IAAI,MAAO,CACT,MAAO,MACR,CAGD,IAAI,MAAO,CACT,OAAO,KAAK,QACb,CAGD,IAAI,aAAc,CAChB,MAAO,EACR,CAGD,WAAW/B,EAAI,CAAE,OAAAE,EAAQ,OAAAI,CAAM,EAAI,CACjC,OAAOC,GAAcP,EAAIE,EAAQI,EAAQ,KAAK,IAAI,CACnD,CAGD,aAAaN,EAAIE,EAAQ,CACvB,OAAOM,GAAa,KAAK,OAAOR,CAAE,EAAGE,CAAM,CAC5C,CAGD,OAAOF,EAAI,CACT,MAAMe,EAAO,IAAI,KAAKf,CAAE,EAExB,GAAI,MAAMe,CAAI,EAAG,MAAO,KAExB,MAAMD,EAAMJ,GAAQ,KAAK,IAAI,EAC7B,GAAI,CAACsB,EAAMC,EAAOC,EAAKC,EAAQC,EAAMC,EAAQC,CAAM,EAAIxB,EAAI,cACvDU,GAAYV,EAAKC,CAAI,EACrBF,GAAYC,EAAKC,CAAI,EAErBoB,IAAW,OACbH,EAAO,CAAC,KAAK,IAAIA,CAAI,EAAI,GAM3B,MAAMO,EAAQC,GAAa,CACzB,KAAAR,EACA,MAAAC,EACA,IAAAC,EACA,KANmBE,IAAS,GAAK,EAAIA,EAOrC,OAAAC,EACA,OAAAC,EACA,YAAa,CACnB,CAAK,EAED,IAAIG,EAAO,CAAC1B,EACZ,MAAM2B,EAAOD,EAAO,IACpB,OAAAA,GAAQC,GAAQ,EAAIA,EAAO,IAAOA,GAC1BH,EAAQE,IAAS,GAAK,IAC/B,CAGD,OAAOtC,EAAW,CAChB,OAAOA,EAAU,OAAS,QAAUA,EAAU,OAAS,KAAK,IAC7D,CAGD,IAAI,SAAU,CACZ,OAAO,KAAK,KACb,CACH,CCpLA,IAAIwC,GAAc,GAClB,SAASC,GAAYC,EAAW5C,EAAO,GAAI,CACzC,MAAM1N,EAAM,KAAK,UAAU,CAACsQ,EAAW5C,CAAI,CAAC,EAC5C,IAAIa,EAAM6B,GAAYpQ,CAAG,EACzB,OAAKuO,IACHA,EAAM,IAAI,KAAK,WAAW+B,EAAW5C,CAAI,EACzC0C,GAAYpQ,CAAG,EAAIuO,GAEdA,CACT,CAEA,IAAIgC,GAAc,GAClB,SAASC,GAAaF,EAAW5C,EAAO,GAAI,CAC1C,MAAM1N,EAAM,KAAK,UAAU,CAACsQ,EAAW5C,CAAI,CAAC,EAC5C,IAAIa,EAAMgC,GAAYvQ,CAAG,EACzB,OAAKuO,IACHA,EAAM,IAAI,KAAK,eAAe+B,EAAW5C,CAAI,EAC7C6C,GAAYvQ,CAAG,EAAIuO,GAEdA,CACT,CAEA,IAAIkC,GAAe,GACnB,SAASC,GAAaJ,EAAW5C,EAAO,GAAI,CAC1C,MAAM1N,EAAM,KAAK,UAAU,CAACsQ,EAAW5C,CAAI,CAAC,EAC5C,IAAIiD,EAAMF,GAAazQ,CAAG,EAC1B,OAAK2Q,IACHA,EAAM,IAAI,KAAK,aAAaL,EAAW5C,CAAI,EAC3C+C,GAAazQ,CAAG,EAAI2Q,GAEfA,CACT,CAEA,IAAIC,GAAe,GACnB,SAASC,GAAaP,EAAW5C,EAAO,GAAI,CAC1C,KAAM,CAAE,KAAAoD,EAAM,GAAGC,CAAY,EAAKrD,EAC5B1N,EAAM,KAAK,UAAU,CAACsQ,EAAWS,CAAY,CAAC,EACpD,IAAIJ,EAAMC,GAAa5Q,CAAG,EAC1B,OAAK2Q,IACHA,EAAM,IAAI,KAAK,mBAAmBL,EAAW5C,CAAI,EACjDkD,GAAa5Q,CAAG,EAAI2Q,GAEfA,CACT,CAEA,IAAIK,GAAiB,KACrB,SAASC,IAAe,CACtB,OAAID,KAGFA,GAAiB,IAAI,KAAK,eAAgB,EAAC,gBAAe,EAAG,OACtDA,GAEX,CAEA,IAAIE,GAAgB,GACpB,SAASC,GAAkBb,EAAW,CACpC,IAAIpS,EAAOgT,GAAcZ,CAAS,EAClC,GAAI,CAACpS,EAAM,CACT,MAAM6P,EAAS,IAAI,KAAK,OAAOuC,CAAS,EAExCpS,EAAO,gBAAiB6P,EAASA,EAAO,YAAa,EAAGA,EAAO,SAC/DmD,GAAcZ,CAAS,EAAIpS,CAC5B,CACD,OAAOA,CACT,CAEA,SAASkT,GAAkBC,EAAW,CAYpC,MAAMC,EAASD,EAAU,QAAQ,KAAK,EAClCC,IAAW,KACbD,EAAYA,EAAU,UAAU,EAAGC,CAAM,GAG3C,MAAMC,EAASF,EAAU,QAAQ,KAAK,EACtC,GAAIE,IAAW,GACb,MAAO,CAACF,CAAS,EACZ,CACL,IAAI1T,EACA6T,EACJ,GAAI,CACF7T,EAAU6S,GAAaa,CAAS,EAAE,gBAAe,EACjDG,EAAcH,CACf,MAAW,CACV,MAAMI,EAAUJ,EAAU,UAAU,EAAGE,CAAM,EAC7C5T,EAAU6S,GAAaiB,CAAO,EAAE,gBAAe,EAC/CD,EAAcC,CACf,CAED,KAAM,CAAE,gBAAAC,EAAiB,SAAAC,CAAU,EAAGhU,EACtC,MAAO,CAAC6T,EAAaE,EAAiBC,CAAQ,CAC/C,CACH,CAEA,SAASC,GAAiBP,EAAWK,EAAiBG,EAAgB,CACpE,OAAIA,GAAkBH,KACfL,EAAU,SAAS,KAAK,IAC3BA,GAAa,MAGXQ,IACFR,GAAa,OAAOQ,CAAc,IAGhCH,IACFL,GAAa,OAAOK,CAAe,KAE9BL,CAIX,CAEA,SAASS,GAAUvN,EAAG,CACpB,MAAMwN,EAAK,GACX,QAAS9U,EAAI,EAAGA,GAAK,GAAIA,IAAK,CAC5B,MAAM+U,EAAKC,GAAS,IAAI,KAAMhV,EAAG,CAAC,EAClC8U,EAAG,KAAKxN,EAAEyN,CAAE,CAAC,CACd,CACD,OAAOD,CACT,CAEA,SAASG,GAAY3N,EAAG,CACtB,MAAMwN,EAAK,GACX,QAAS9U,EAAI,EAAGA,GAAK,EAAGA,IAAK,CAC3B,MAAM+U,EAAKC,GAAS,IAAI,KAAM,GAAI,GAAKhV,CAAC,EACxC8U,EAAG,KAAKxN,EAAEyN,CAAE,CAAC,CACd,CACD,OAAOD,CACT,CAEA,SAASI,GAAUC,EAAKC,EAAQC,EAAWC,EAAQ,CACjD,MAAMC,EAAOJ,EAAI,cAEjB,OAAII,IAAS,QACJ,KACEA,IAAS,KACXF,EAAUD,CAAM,EAEhBE,EAAOF,CAAM,CAExB,CAEA,SAASI,GAAoBL,EAAK,CAChC,OAAIA,EAAI,iBAAmBA,EAAI,kBAAoB,OAC1C,GAGLA,EAAI,kBAAoB,QACxB,CAACA,EAAI,QACLA,EAAI,OAAO,WAAW,IAAI,GAC1B,IAAI,KAAK,eAAeA,EAAI,IAAI,EAAE,gBAAe,EAAG,kBAAoB,MAG9E,CAMA,MAAMM,EAAoB,CACxB,YAAYC,EAAMC,EAAalF,EAAM,CACnC,KAAK,MAAQA,EAAK,OAAS,EAC3B,KAAK,MAAQA,EAAK,OAAS,GAE3B,KAAM,CAAE,MAAAmF,EAAO,MAAAC,EAAO,GAAGC,CAAS,EAAKrF,EAEvC,GAAI,CAACkF,GAAe,OAAO,KAAKG,CAAS,EAAE,OAAS,EAAG,CACrD,MAAMC,EAAW,CAAE,YAAa,GAAO,GAAGtF,CAAI,EAC1CA,EAAK,MAAQ,IAAGsF,EAAS,qBAAuBtF,EAAK,OACzD,KAAK,IAAMgD,GAAaiC,EAAMK,CAAQ,CACvC,CACF,CAED,OAAO/V,EAAG,CACR,GAAI,KAAK,IAAK,CACZ,MAAMgW,EAAQ,KAAK,MAAQ,KAAK,MAAMhW,CAAC,EAAIA,EAC3C,OAAO,KAAK,IAAI,OAAOgW,CAAK,CAClC,KAAW,CAEL,MAAMA,EAAQ,KAAK,MAAQ,KAAK,MAAMhW,CAAC,EAAIiW,GAAQjW,EAAG,CAAC,EACvD,OAAOkW,GAASF,EAAO,KAAK,KAAK,CAClC,CACF,CACH,CAMA,MAAMG,EAAkB,CACtB,YAAYpB,EAAIW,EAAMjF,EAAM,CAC1B,KAAK,KAAOA,EACZ,KAAK,aAAe,OAEpB,IAAI2F,EACJ,GAAI,KAAK,KAAK,SAEZ,KAAK,GAAKrB,UACDA,EAAG,KAAK,OAAS,QAAS,CAOnC,MAAMsB,EAAY,IAAMtB,EAAG,OAAS,IAC9BuB,EAAUD,GAAa,EAAI,WAAWA,CAAS,GAAK,UAAUA,CAAS,GACzEtB,EAAG,SAAW,GAAKzC,GAAS,OAAOgE,CAAO,EAAE,OAC9CF,EAAIE,EACJ,KAAK,GAAKvB,IAIVqB,EAAI,MACJ,KAAK,GAAKrB,EAAG,SAAW,EAAIA,EAAKA,EAAG,QAAQ,KAAK,EAAE,KAAK,CAAE,QAASA,EAAG,MAAM,CAAE,EAC9E,KAAK,aAAeA,EAAG,KAE1B,MAAUA,EAAG,KAAK,OAAS,SAC1B,KAAK,GAAKA,EACDA,EAAG,KAAK,OAAS,QAC1B,KAAK,GAAKA,EACVqB,EAAIrB,EAAG,KAAK,OAIZqB,EAAI,MACJ,KAAK,GAAKrB,EAAG,QAAQ,KAAK,EAAE,KAAK,CAAE,QAASA,EAAG,MAAQ,GACvD,KAAK,aAAeA,EAAG,MAGzB,MAAMgB,EAAW,CAAE,GAAG,KAAK,IAAI,EAC/BA,EAAS,SAAWA,EAAS,UAAYK,EACzC,KAAK,IAAM7C,GAAamC,EAAMK,CAAQ,CACvC,CAED,QAAS,CACP,OAAI,KAAK,aAGA,KAAK,cAAe,EACxB,IAAI,CAAC,CAAE,MAAA/S,CAAO,IAAKA,CAAK,EACxB,KAAK,EAAE,EAEL,KAAK,IAAI,OAAO,KAAK,GAAG,SAAQ,CAAE,CAC1C,CAED,eAAgB,CACd,MAAMuT,EAAQ,KAAK,IAAI,cAAc,KAAK,GAAG,SAAQ,CAAE,EACvD,OAAI,KAAK,aACAA,EAAM,IAAKC,GAAS,CACzB,GAAIA,EAAK,OAAS,eAAgB,CAChC,MAAMC,EAAa,KAAK,aAAa,WAAW,KAAK,GAAG,GAAI,CAC1D,OAAQ,KAAK,GAAG,OAChB,OAAQ,KAAK,KAAK,YAC9B,CAAW,EACD,MAAO,CACL,GAAGD,EACH,MAAOC,CACnB,CACA,KACU,QAAOD,CAEjB,CAAO,EAEID,CACR,CAED,iBAAkB,CAChB,OAAO,KAAK,IAAI,iBACjB,CACH,CAKA,MAAMG,EAAiB,CACrB,YAAYhB,EAAMiB,EAAWlG,EAAM,CACjC,KAAK,KAAO,CAAE,MAAO,OAAQ,GAAGA,CAAI,EAChC,CAACkG,GAAaC,OAChB,KAAK,IAAMhD,GAAa8B,EAAMjF,CAAI,EAErC,CAED,OAAOoG,EAAO/H,EAAM,CAClB,OAAI,KAAK,IACA,KAAK,IAAI,OAAO+H,EAAO/H,CAAI,EAE3BgI,GAA2BhI,EAAM+H,EAAO,KAAK,KAAK,QAAS,KAAK,KAAK,QAAU,MAAM,CAE/F,CAED,cAAcA,EAAO/H,EAAM,CACzB,OAAI,KAAK,IACA,KAAK,IAAI,cAAc+H,EAAO/H,CAAI,EAElC,EAEV,CACH,CAEA,MAAMiI,GAAuB,CAC3B,SAAU,EACV,YAAa,EACb,QAAS,CAAC,EAAG,CAAC,CAChB,EAMe,MAAMC,EAAO,CAC1B,OAAO,SAASvG,EAAM,CACpB,OAAOuG,GAAO,OACZvG,EAAK,OACLA,EAAK,gBACLA,EAAK,eACLA,EAAK,aACLA,EAAK,WACX,CACG,CAED,OAAO,OAAOK,EAAQ2D,EAAiBG,EAAgBqC,EAAcC,EAAc,GAAO,CACxF,MAAMC,EAAkBrG,GAAUsG,GAAS,cAErCC,EAAUF,IAAoBD,EAAc,QAAUlD,GAAc,GACpEsD,EAAmB7C,GAAmB2C,GAAS,uBAC/CG,EAAkB3C,GAAkBwC,GAAS,sBAC7CI,EAAgBC,GAAqBR,CAAY,GAAKG,GAAS,oBACrE,OAAO,IAAIJ,GAAOK,EAASC,EAAkBC,EAAiBC,EAAeL,CAAe,CAC7F,CAED,OAAO,YAAa,CAClBpD,GAAiB,KACjBT,GAAc,GACdE,GAAe,GACfG,GAAe,EAChB,CAED,OAAO,WAAW,CAAE,OAAA7C,EAAQ,gBAAA2D,EAAiB,eAAAG,EAAgB,aAAAqC,CAAc,EAAG,GAAI,CAChF,OAAOD,GAAO,OAAOlG,EAAQ2D,EAAiBG,EAAgBqC,CAAY,CAC3E,CAED,YAAYnG,EAAQ4G,EAAW9C,EAAgBqC,EAAcE,EAAiB,CAC5E,KAAM,CAACQ,EAAcC,EAAuBC,CAAoB,EAAI1D,GAAkBrD,CAAM,EAE5F,KAAK,OAAS6G,EACd,KAAK,gBAAkBD,GAAaE,GAAyB,KAC7D,KAAK,eAAiBhD,GAAkBiD,GAAwB,KAChE,KAAK,aAAeZ,EACpB,KAAK,KAAOtC,GAAiB,KAAK,OAAQ,KAAK,gBAAiB,KAAK,cAAc,EAEnF,KAAK,cAAgB,CAAE,OAAQ,GAAI,WAAY,IAC/C,KAAK,YAAc,CAAE,OAAQ,GAAI,WAAY,IAC7C,KAAK,cAAgB,KACrB,KAAK,SAAW,GAEhB,KAAK,gBAAkBwC,EACvB,KAAK,kBAAoB,IAC1B,CAED,IAAI,aAAc,CAChB,OAAI,KAAK,mBAAqB,OAC5B,KAAK,kBAAoB3B,GAAoB,IAAI,GAG5C,KAAK,iBACb,CAED,aAAc,CACZ,MAAMsC,EAAe,KAAK,YACpBC,GACH,KAAK,kBAAoB,MAAQ,KAAK,kBAAoB,UAC1D,KAAK,iBAAmB,MAAQ,KAAK,iBAAmB,WAC3D,OAAOD,GAAgBC,EAAiB,KAAO,MAChD,CAED,MAAMC,EAAM,CACV,MAAI,CAACA,GAAQ,OAAO,oBAAoBA,CAAI,EAAE,SAAW,EAChD,KAEAhB,GAAO,OACZgB,EAAK,QAAU,KAAK,gBACpBA,EAAK,iBAAmB,KAAK,gBAC7BA,EAAK,gBAAkB,KAAK,eAC5BP,GAAqBO,EAAK,YAAY,GAAK,KAAK,aAChDA,EAAK,aAAe,EAC5B,CAEG,CAED,cAAcA,EAAO,GAAI,CACvB,OAAO,KAAK,MAAM,CAAE,GAAGA,EAAM,YAAa,EAAI,CAAE,CACjD,CAED,kBAAkBA,EAAO,GAAI,CAC3B,OAAO,KAAK,MAAM,CAAE,GAAGA,EAAM,YAAa,EAAK,CAAE,CAClD,CAED,OAAO5C,EAAQ1E,EAAS,GAAO,CAC7B,OAAOwE,GAAU,KAAME,EAAQ6C,GAAgB,IAAM,CACnD,MAAMvC,EAAOhF,EAAS,CAAE,MAAO0E,EAAQ,IAAK,SAAW,EAAG,CAAE,MAAOA,CAAQ,EACzE8C,EAAYxH,EAAS,SAAW,aAClC,OAAK,KAAK,YAAYwH,CAAS,EAAE9C,CAAM,IACrC,KAAK,YAAY8C,CAAS,EAAE9C,CAAM,EAAIP,GAAWE,GAAO,KAAK,QAAQA,EAAIW,EAAM,OAAO,CAAC,GAElF,KAAK,YAAYwC,CAAS,EAAE9C,CAAM,CAC/C,CAAK,CACF,CAED,SAASA,EAAQ1E,EAAS,GAAO,CAC/B,OAAOwE,GAAU,KAAME,EAAQ+C,GAAkB,IAAM,CACrD,MAAMzC,EAAOhF,EACP,CAAE,QAAS0E,EAAQ,KAAM,UAAW,MAAO,OAAQ,IAAK,SAAW,EACnE,CAAE,QAASA,CAAQ,EACvB8C,EAAYxH,EAAS,SAAW,aAClC,OAAK,KAAK,cAAcwH,CAAS,EAAE9C,CAAM,IACvC,KAAK,cAAc8C,CAAS,EAAE9C,CAAM,EAAIH,GAAaF,GACnD,KAAK,QAAQA,EAAIW,EAAM,SAAS,CAC1C,GAEa,KAAK,cAAcwC,CAAS,EAAE9C,CAAM,CACjD,CAAK,CACF,CAED,WAAY,CACV,OAAOF,GACL,KACA,OACA,IAAMkD,GACN,IAAM,CAGJ,GAAI,CAAC,KAAK,cAAe,CACvB,MAAM1C,EAAO,CAAE,KAAM,UAAW,UAAW,KAAK,EAChD,KAAK,cAAgB,CAACV,GAAS,IAAI,KAAM,GAAI,GAAI,CAAC,EAAGA,GAAS,IAAI,KAAM,GAAI,GAAI,EAAE,CAAC,EAAE,IAClFD,GAAO,KAAK,QAAQA,EAAIW,EAAM,WAAW,CACtD,CACS,CAED,OAAO,KAAK,aACb,CACP,CACG,CAED,KAAKN,EAAQ,CACX,OAAOF,GAAU,KAAME,EAAQiD,GAAc,IAAM,CACjD,MAAM3C,EAAO,CAAE,IAAKN,GAIpB,OAAK,KAAK,SAASA,CAAM,IACvB,KAAK,SAASA,CAAM,EAAI,CAACJ,GAAS,IAAI,IAAK,EAAG,CAAC,EAAGA,GAAS,IAAI,KAAM,EAAG,CAAC,CAAC,EAAE,IAAKD,GAC/E,KAAK,QAAQA,EAAIW,EAAM,KAAK,CACtC,GAGa,KAAK,SAASN,CAAM,CACjC,CAAK,CACF,CAED,QAAQL,EAAIgB,EAAUxU,EAAO,CAC3B,MAAM+W,EAAK,KAAK,YAAYvD,EAAIgB,CAAQ,EACtCwC,EAAUD,EAAG,cAAe,EAC5BE,EAAWD,EAAQ,KAAMtL,GAAMA,EAAE,KAAK,gBAAkB1L,CAAK,EAC/D,OAAOiX,EAAWA,EAAS,MAAQ,IACpC,CAED,gBAAgB/H,EAAO,GAAI,CAGzB,OAAO,IAAIgF,GAAoB,KAAK,KAAMhF,EAAK,aAAe,KAAK,YAAaA,CAAI,CACrF,CAED,YAAYsE,EAAIgB,EAAW,GAAI,CAC7B,OAAO,IAAII,GAAkBpB,EAAI,KAAK,KAAMgB,CAAQ,CACrD,CAED,aAAatF,EAAO,GAAI,CACtB,OAAO,IAAIiG,GAAiB,KAAK,KAAM,KAAK,UAAS,EAAIjG,CAAI,CAC9D,CAED,cAAcA,EAAO,GAAI,CACvB,OAAO2C,GAAY,KAAK,KAAM3C,CAAI,CACnC,CAED,WAAY,CACV,OACE,KAAK,SAAW,MAChB,KAAK,OAAO,YAAW,IAAO,SAC9B,IAAI,KAAK,eAAe,KAAK,IAAI,EAAE,kBAAkB,OAAO,WAAW,OAAO,CAEjF,CAED,iBAAkB,CAChB,OAAI,KAAK,aACA,KAAK,aACFgI,KAGHvE,GAAkB,KAAK,MAAM,EAF7B6C,EAIV,CAED,gBAAiB,CACf,OAAO,KAAK,gBAAiB,EAAC,QAC/B,CAED,uBAAwB,CACtB,OAAO,KAAK,gBAAiB,EAAC,WAC/B,CAED,gBAAiB,CACf,OAAO,KAAK,gBAAiB,EAAC,OAC/B,CAED,OAAOlT,EAAO,CACZ,OACE,KAAK,SAAWA,EAAM,QACtB,KAAK,kBAAoBA,EAAM,iBAC/B,KAAK,iBAAmBA,EAAM,cAEjC,CACH,CC1hBA,IAAI+M,GAAY,KAMD,MAAM8H,WAAwBnI,EAAK,CAKhD,WAAW,aAAc,CACvB,OAAIK,KAAc,OAChBA,GAAY,IAAI8H,GAAgB,CAAC,GAE5B9H,EACR,CAOD,OAAO,SAASzQ,EAAQ,CACtB,OAAOA,IAAW,EAAIuY,GAAgB,YAAc,IAAIA,GAAgBvY,CAAM,CAC/E,CAUD,OAAO,eAAe0K,EAAG,CACvB,GAAIA,EAAG,CACL,MAAM2B,EAAI3B,EAAE,MAAM,uCAAuC,EACzD,GAAI2B,EACF,OAAO,IAAIkM,GAAgBC,GAAanM,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,CAAC,CAEtD,CACD,OAAO,IACR,CAED,YAAYrM,EAAQ,CAClB,QAEA,KAAK,MAAQA,CACd,CAGD,IAAI,MAAO,CACT,MAAO,OACR,CAGD,IAAI,MAAO,CACT,OAAO,KAAK,QAAU,EAAI,MAAQ,MAAM6Q,GAAa,KAAK,MAAO,QAAQ,CAAC,EAC3E,CAED,IAAI,UAAW,CACb,OAAI,KAAK,QAAU,EACV,UAEA,UAAUA,GAAa,CAAC,KAAK,MAAO,QAAQ,CAAC,EAEvD,CAGD,YAAa,CACX,OAAO,KAAK,IACb,CAGD,aAAaR,EAAIE,EAAQ,CACvB,OAAOM,GAAa,KAAK,MAAON,CAAM,CACvC,CAGD,IAAI,aAAc,CAChB,MAAO,EACR,CAGD,QAAS,CACP,OAAO,KAAK,KACb,CAGD,OAAOC,EAAW,CAChB,OAAOA,EAAU,OAAS,SAAWA,EAAU,QAAU,KAAK,KAC/D,CAGD,IAAI,SAAU,CACZ,MAAO,EACR,CACH,CC/Fe,MAAMiI,WAAoBrI,EAAK,CAC5C,YAAYsI,EAAU,CACpB,QAEA,KAAK,SAAWA,CACjB,CAGD,IAAI,MAAO,CACT,MAAO,SACR,CAGD,IAAI,MAAO,CACT,OAAO,KAAK,QACb,CAGD,IAAI,aAAc,CAChB,MAAO,EACR,CAGD,YAAa,CACX,OAAO,IACR,CAGD,cAAe,CACb,MAAO,EACR,CAGD,QAAS,CACP,MAAO,IACR,CAGD,QAAS,CACP,MAAO,EACR,CAGD,IAAI,SAAU,CACZ,MAAO,EACR,CACH,CCxCO,SAASC,GAAcC,EAAOC,EAAa,CAEhD,GAAI5G,GAAY2G,CAAK,GAAKA,IAAU,KAClC,OAAOC,EACF,GAAID,aAAiBxI,GAC1B,OAAOwI,EACF,GAAIE,GAASF,CAAK,EAAG,CAC1B,MAAMG,EAAUH,EAAM,cACtB,OAAIG,IAAY,UAAkBF,EACzBE,IAAY,SAAWA,IAAY,SAAiBrI,GAAW,SAC/DqI,IAAY,OAASA,IAAY,MAAcR,GAAgB,YAC5DA,GAAgB,eAAeQ,CAAO,GAAK5G,GAAS,OAAOyG,CAAK,CAChF,KAAS,QAAII,GAASJ,CAAK,EAChBL,GAAgB,SAASK,CAAK,EAC5B,OAAOA,GAAU,UAAY,WAAYA,GAAS,OAAOA,EAAM,QAAW,WAG5EA,EAEA,IAAIH,GAAYG,CAAK,CAEhC,CC1BA,IAAIK,GAAM,IAAM,KAAK,IAAK,EACxBJ,GAAc,SACdK,GAAgB,KAChBC,GAAyB,KACzBC,GAAwB,KACxBC,GAAqB,GACrBC,GACAC,GAAsB,KAKT,MAAMtC,EAAS,CAK5B,WAAW,KAAM,CACf,OAAOgC,EACR,CASD,WAAW,IAAI/W,EAAG,CAChB+W,GAAM/W,CACP,CAOD,WAAW,YAAY8O,EAAM,CAC3B6H,GAAc7H,CACf,CAOD,WAAW,aAAc,CACvB,OAAO2H,GAAcE,GAAanI,GAAW,QAAQ,CACtD,CAMD,WAAW,eAAgB,CACzB,OAAOwI,EACR,CAMD,WAAW,cAAcvI,EAAQ,CAC/BuI,GAAgBvI,CACjB,CAMD,WAAW,wBAAyB,CAClC,OAAOwI,EACR,CAMD,WAAW,uBAAuB7E,EAAiB,CACjD6E,GAAyB7E,CAC1B,CAMD,WAAW,uBAAwB,CACjC,OAAO8E,EACR,CAMD,WAAW,sBAAsB3E,EAAgB,CAC/C2E,GAAwB3E,CACzB,CAYD,WAAW,qBAAsB,CAC/B,OAAO8E,EACR,CASD,WAAW,oBAAoBzC,EAAc,CAC3CyC,GAAsBjC,GAAqBR,CAAY,CACxD,CAMD,WAAW,oBAAqB,CAC9B,OAAOuC,EACR,CAUD,WAAW,mBAAmBG,EAAY,CACxCH,GAAqBG,EAAa,GACnC,CAMD,WAAW,gBAAiB,CAC1B,OAAOF,EACR,CAMD,WAAW,eAAeG,EAAG,CAC3BH,GAAiBG,CAClB,CAMD,OAAO,aAAc,CACnB5C,GAAO,WAAU,EACjB1E,GAAS,WAAU,CACpB,CACH,CC9Ke,MAAMuH,EAAQ,CAC3B,YAAYpL,EAAQqL,EAAa,CAC/B,KAAK,OAASrL,EACd,KAAK,YAAcqL,CACpB,CAED,WAAY,CACV,OAAI,KAAK,YACA,GAAG,KAAK,MAAM,KAAK,KAAK,WAAW,GAEnC,KAAK,MAEf,CACH,CCAA,MAAMC,GAAgB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAC1EC,GAAa,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAErE,SAASC,GAAenL,EAAM9L,EAAO,CACnC,OAAO,IAAI6W,GACT,oBACA,iBAAiB7W,CAAK,aAAa,OAAOA,CAAK,UAAU8L,CAAI,oBACjE,CACA,CAEO,SAASoL,GAAU1H,EAAMC,EAAOC,EAAK,CAC1C,MAAMvN,EAAI,IAAI,KAAK,KAAK,IAAIqN,EAAMC,EAAQ,EAAGC,CAAG,CAAC,EAE7CF,EAAO,KAAOA,GAAQ,GACxBrN,EAAE,eAAeA,EAAE,eAAgB,EAAG,IAAI,EAG5C,MAAMgV,EAAKhV,EAAE,YAEb,OAAOgV,IAAO,EAAI,EAAIA,CACxB,CAEA,SAASC,GAAe5H,EAAMC,EAAOC,EAAK,CACxC,OAAOA,GAAO2H,GAAW7H,CAAI,EAAIwH,GAAaD,IAAetH,EAAQ,CAAC,CACxE,CAEA,SAAS6H,GAAiB9H,EAAM+H,EAAS,CACvC,MAAMC,EAAQH,GAAW7H,CAAI,EAAIwH,GAAaD,GAC5CU,EAASD,EAAM,UAAWxa,GAAMA,EAAIua,CAAO,EAC3C7H,EAAM6H,EAAUC,EAAMC,CAAM,EAC9B,MAAO,CAAE,MAAOA,EAAS,EAAG,IAAA/H,CAAG,CACjC,CAEO,SAASgI,GAAkBC,EAAYC,EAAa,CACzD,OAASD,EAAaC,EAAc,GAAK,EAAK,CAChD,CAMO,SAASC,GAAgBC,EAASC,EAAqB,EAAGH,EAAc,EAAG,CAChF,KAAM,CAAE,KAAApI,EAAM,MAAAC,EAAO,IAAAC,CAAK,EAAGoI,EAC3BP,EAAUH,GAAe5H,EAAMC,EAAOC,CAAG,EACzCsI,EAAUN,GAAkBR,GAAU1H,EAAMC,EAAOC,CAAG,EAAGkI,CAAW,EAEtE,IAAIK,EAAa,KAAK,OAAOV,EAAUS,EAAU,GAAKD,GAAsB,CAAC,EAC3EG,EAEF,OAAID,EAAa,GACfC,EAAW1I,EAAO,EAClByI,EAAaE,GAAgBD,EAAUH,EAAoBH,CAAW,GAC7DK,EAAaE,GAAgB3I,EAAMuI,EAAoBH,CAAW,GAC3EM,EAAW1I,EAAO,EAClByI,EAAa,GAEbC,EAAW1I,EAGN,CAAE,SAAA0I,EAAU,WAAAD,EAAY,QAAAD,EAAS,GAAGI,GAAWN,CAAO,EAC/D,CAEO,SAASO,GAAgBC,EAAUP,EAAqB,EAAGH,EAAc,EAAG,CACjF,KAAM,CAAE,SAAAM,EAAU,WAAAD,EAAY,QAAAD,CAAS,EAAGM,EACxCC,EAAgBb,GAAkBR,GAAUgB,EAAU,EAAGH,CAAkB,EAAGH,CAAW,EACzFY,EAAaC,GAAWP,CAAQ,EAElC,IAAIX,EAAUU,EAAa,EAAID,EAAUO,EAAgB,EAAIR,EAC3DvI,EAEE+H,EAAU,GACZ/H,EAAO0I,EAAW,EAClBX,GAAWkB,GAAWjJ,CAAI,GACjB+H,EAAUiB,GACnBhJ,EAAO0I,EAAW,EAClBX,GAAWkB,GAAWP,CAAQ,GAE9B1I,EAAO0I,EAGT,KAAM,CAAE,MAAAzI,EAAO,IAAAC,CAAG,EAAK4H,GAAiB9H,EAAM+H,CAAO,EACrD,MAAO,CAAE,KAAA/H,EAAM,MAAAC,EAAO,IAAAC,EAAK,GAAG0I,GAAWE,CAAQ,EACnD,CAEO,SAASI,GAAmBC,EAAU,CAC3C,KAAM,CAAE,KAAAnJ,EAAM,MAAAC,EAAO,IAAAC,CAAG,EAAKiJ,EACvBpB,EAAUH,GAAe5H,EAAMC,EAAOC,CAAG,EAC/C,MAAO,CAAE,KAAAF,EAAM,QAAA+H,EAAS,GAAGa,GAAWO,CAAQ,CAAC,CACjD,CAEO,SAASC,GAAmBC,EAAa,CAC9C,KAAM,CAAE,KAAArJ,EAAM,QAAA+H,CAAS,EAAGsB,EACpB,CAAE,MAAApJ,EAAO,IAAAC,CAAG,EAAK4H,GAAiB9H,EAAM+H,CAAO,EACrD,MAAO,CAAE,KAAA/H,EAAM,MAAAC,EAAO,IAAAC,EAAK,GAAG0I,GAAWS,CAAW,EACtD,CAQO,SAASC,GAAoBjZ,EAAKsS,EAAK,CAK5C,GAHE,CAAC/C,GAAYvP,EAAI,YAAY,GAC7B,CAACuP,GAAYvP,EAAI,eAAe,GAChC,CAACuP,GAAYvP,EAAI,aAAa,EACT,CAIrB,GAFE,CAACuP,GAAYvP,EAAI,OAAO,GAAK,CAACuP,GAAYvP,EAAI,UAAU,GAAK,CAACuP,GAAYvP,EAAI,QAAQ,EAGtF,MAAM,IAAI+L,GACR,gEACR,EAEI,OAAKwD,GAAYvP,EAAI,YAAY,IAAGA,EAAI,QAAUA,EAAI,cACjDuP,GAAYvP,EAAI,eAAe,IAAGA,EAAI,WAAaA,EAAI,iBACvDuP,GAAYvP,EAAI,aAAa,IAAGA,EAAI,SAAWA,EAAI,eACxD,OAAOA,EAAI,aACX,OAAOA,EAAI,gBACX,OAAOA,EAAI,cACJ,CACL,mBAAoBsS,EAAI,sBAAuB,EAC/C,YAAaA,EAAI,eAAgB,CACvC,CACA,KACI,OAAO,CAAE,mBAAoB,EAAG,YAAa,CAAC,CAElD,CAEO,SAAS4G,GAAmBlZ,EAAKkY,EAAqB,EAAGH,EAAc,EAAG,CAC/E,MAAMoB,EAAYC,GAAUpZ,EAAI,QAAQ,EACtCqZ,EAAYC,GACVtZ,EAAI,WACJ,EACAsY,GAAgBtY,EAAI,SAAUkY,EAAoBH,CAAW,CAC9D,EACDwB,EAAeD,GAAetZ,EAAI,QAAS,EAAG,CAAC,EAEjD,OAAKmZ,EAEOE,EAEAE,EAEE,GADLnC,GAAe,UAAWpX,EAAI,OAAO,EAFrCoX,GAAe,OAAQpX,EAAI,UAAU,EAFrCoX,GAAe,WAAYpX,EAAI,QAAQ,CAMlD,CAEO,SAASwZ,GAAsBxZ,EAAK,CACzC,MAAMmZ,EAAYC,GAAUpZ,EAAI,IAAI,EAClCyZ,EAAeH,GAAetZ,EAAI,QAAS,EAAG4Y,GAAW5Y,EAAI,IAAI,CAAC,EAEpE,OAAKmZ,EAEOM,EAEE,GADLrC,GAAe,UAAWpX,EAAI,OAAO,EAFrCoX,GAAe,OAAQpX,EAAI,IAAI,CAI1C,CAEO,SAAS0Z,GAAwB1Z,EAAK,CAC3C,MAAMmZ,EAAYC,GAAUpZ,EAAI,IAAI,EAClC2Z,EAAaL,GAAetZ,EAAI,MAAO,EAAG,EAAE,EAC5C4Z,EAAWN,GAAetZ,EAAI,IAAK,EAAG6Z,GAAY7Z,EAAI,KAAMA,EAAI,KAAK,CAAC,EAExE,OAAKmZ,EAEOQ,EAEAC,EAEE,GADLxC,GAAe,MAAOpX,EAAI,GAAG,EAF7BoX,GAAe,QAASpX,EAAI,KAAK,EAFjCoX,GAAe,OAAQpX,EAAI,IAAI,CAM1C,CAEO,SAAS8Z,GAAmB9Z,EAAK,CACtC,KAAM,CAAE,KAAA+P,EAAM,OAAAC,EAAQ,OAAAC,EAAQ,YAAA8J,CAAW,EAAK/Z,EACxCga,EACFV,GAAevJ,EAAM,EAAG,EAAE,GACzBA,IAAS,IAAMC,IAAW,GAAKC,IAAW,GAAK8J,IAAgB,EAClEE,EAAcX,GAAetJ,EAAQ,EAAG,EAAE,EAC1CkK,EAAcZ,GAAerJ,EAAQ,EAAG,EAAE,EAC1CkK,EAAmBb,GAAeS,EAAa,EAAG,GAAG,EAEvD,OAAKC,EAEOC,EAEAC,EAEAC,EAEE,GADL/C,GAAe,cAAe2C,CAAW,EAFzC3C,GAAe,SAAUnH,CAAM,EAF/BmH,GAAe,SAAUpH,CAAM,EAF/BoH,GAAe,OAAQrH,CAAI,CAQtC,CC7LO,SAASR,GAAY6K,EAAG,CAC7B,OAAO,OAAOA,EAAM,GACtB,CAEO,SAAS9D,GAAS8D,EAAG,CAC1B,OAAO,OAAOA,GAAM,QACtB,CAEO,SAAShB,GAAUgB,EAAG,CAC3B,OAAO,OAAOA,GAAM,UAAYA,EAAI,IAAM,CAC5C,CAEO,SAAShE,GAASgE,EAAG,CAC1B,OAAO,OAAOA,GAAM,QACtB,CAEO,SAASC,GAAOD,EAAG,CACxB,OAAO,OAAO,UAAU,SAAS,KAAKA,CAAC,IAAM,eAC/C,CAIO,SAASrG,IAAc,CAC5B,GAAI,CACF,OAAO,OAAO,KAAS,KAAe,CAAC,CAAC,KAAK,kBAC9C,MAAW,CACV,MAAO,EACR,CACH,CAEO,SAAS6B,IAAoB,CAClC,GAAI,CACF,OACE,OAAO,KAAS,KAChB,CAAC,CAAC,KAAK,SACN,aAAc,KAAK,OAAO,WAAa,gBAAiB,KAAK,OAAO,UAExE,MAAW,CACV,MAAO,EACR,CACH,CAIO,SAAS0E,GAAWC,EAAO,CAChC,OAAO,MAAM,QAAQA,CAAK,EAAIA,EAAQ,CAACA,CAAK,CAC9C,CAEO,SAASC,GAAOnd,EAAKod,EAAI7W,EAAS,CACvC,GAAIvG,EAAI,SAAW,EAGnB,OAAOA,EAAI,OAAO,CAACqd,EAAMC,IAAS,CAChC,MAAMC,EAAO,CAACH,EAAGE,CAAI,EAAGA,CAAI,EAC5B,OAAKD,GAEM9W,EAAQ8W,EAAK,CAAC,EAAGE,EAAK,CAAC,CAAC,IAAMF,EAAK,CAAC,EACtCA,EAFAE,CAMb,EAAK,IAAI,EAAE,CAAC,CACZ,CAEO,SAASC,GAAK7a,EAAK0F,EAAM,CAC9B,OAAOA,EAAK,OAAO,CAAC7B,EAAGzD,KACrByD,EAAEzD,CAAC,EAAIJ,EAAII,CAAC,EACLyD,GACN,CAAE,EACP,CAEO,SAASiX,GAAe9a,EAAK0D,EAAM,CACxC,OAAO,OAAO,UAAU,eAAe,KAAK1D,EAAK0D,CAAI,CACvD,CAEO,SAASkR,GAAqB3M,EAAU,CAC7C,GAAIA,GAAY,KACd,OAAO,KACF,GAAI,OAAOA,GAAa,SAC7B,MAAM,IAAIiE,GAAqB,iCAAiC,EAEhE,GACE,CAACoN,GAAerR,EAAS,SAAU,EAAG,CAAC,GACvC,CAACqR,GAAerR,EAAS,YAAa,EAAG,CAAC,GAC1C,CAAC,MAAM,QAAQA,EAAS,OAAO,GAC/BA,EAAS,QAAQ,KAAMlC,GAAM,CAACuT,GAAevT,EAAG,EAAG,CAAC,CAAC,EAErD,MAAM,IAAImG,GAAqB,uBAAuB,EAExD,MAAO,CACL,SAAUjE,EAAS,SACnB,YAAaA,EAAS,YACtB,QAAS,MAAM,KAAKA,EAAS,OAAO,CAC1C,CAEA,CAIO,SAASqR,GAAeiB,EAAOQ,EAAQC,EAAK,CACjD,OAAO5B,GAAUmB,CAAK,GAAKA,GAASQ,GAAUR,GAASS,CACzD,CAGO,SAASC,GAAS9Q,EAAG3K,EAAG,CAC7B,OAAO2K,EAAI3K,EAAI,KAAK,MAAM2K,EAAI3K,CAAC,CACjC,CAEO,SAAS6T,GAAS6C,EAAO1W,EAAI,EAAG,CACrC,MAAM0b,EAAQhF,EAAQ,EACtB,IAAIiF,EACJ,OAAID,EACFC,EAAS,KAAO,GAAK,CAACjF,GAAO,SAAS1W,EAAG,GAAG,EAE5C2b,GAAU,GAAKjF,GAAO,SAAS1W,EAAG,GAAG,EAEhC2b,CACT,CAEO,SAASC,GAAaC,EAAQ,CACnC,GAAI,EAAA9L,GAAY8L,CAAM,GAAKA,IAAW,MAAQA,IAAW,IAGvD,OAAO,SAASA,EAAQ,EAAE,CAE9B,CAEO,SAASC,GAAcD,EAAQ,CACpC,GAAI,EAAA9L,GAAY8L,CAAM,GAAKA,IAAW,MAAQA,IAAW,IAGvD,OAAO,WAAWA,CAAM,CAE5B,CAEO,SAASE,GAAYC,EAAU,CAEpC,GAAI,EAAAjM,GAAYiM,CAAQ,GAAKA,IAAa,MAAQA,IAAa,IAExD,CACL,MAAM/W,EAAI,WAAW,KAAO+W,CAAQ,EAAI,IACxC,OAAO,KAAK,MAAM/W,CAAC,CACpB,CACH,CAEO,SAAS2O,GAAQpM,EAAQyU,EAAQC,EAAa,GAAO,CAC1D,MAAMC,EAAS,IAAMF,EAErB,OADYC,EAAa,KAAK,MAAQ,KAAK,OAC5B1U,EAAS2U,CAAM,EAAIA,CACpC,CAIO,SAASnE,GAAW7H,EAAM,CAC/B,OAAOA,EAAO,IAAM,IAAMA,EAAO,MAAQ,GAAKA,EAAO,MAAQ,EAC/D,CAEO,SAASiJ,GAAWjJ,EAAM,CAC/B,OAAO6H,GAAW7H,CAAI,EAAI,IAAM,GAClC,CAEO,SAASkK,GAAYlK,EAAMC,EAAO,CACvC,MAAMgM,EAAWX,GAASrL,EAAQ,EAAG,EAAE,EAAI,EACzCiM,EAAUlM,GAAQC,EAAQgM,GAAY,GAExC,OAAIA,IAAa,EACRpE,GAAWqE,CAAO,EAAI,GAAK,GAE3B,CAAC,GAAI,KAAM,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAE,EAAED,EAAW,CAAC,CAE1E,CAGO,SAASzL,GAAanQ,EAAK,CAChC,IAAIsC,EAAI,KAAK,IACXtC,EAAI,KACJA,EAAI,MAAQ,EACZA,EAAI,IACJA,EAAI,KACJA,EAAI,OACJA,EAAI,OACJA,EAAI,WACR,EAGE,OAAIA,EAAI,KAAO,KAAOA,EAAI,MAAQ,IAChCsC,EAAI,IAAI,KAAKA,CAAC,EAIdA,EAAE,eAAetC,EAAI,KAAMA,EAAI,MAAQ,EAAGA,EAAI,GAAG,GAE5C,CAACsC,CACV,CAGA,SAASwZ,GAAgBnM,EAAMuI,EAAoBH,EAAa,CAE9D,MAAO,CADOF,GAAkBR,GAAU1H,EAAM,EAAGuI,CAAkB,EAAGH,CAAW,EACnEG,EAAqB,CACvC,CAEO,SAASI,GAAgBD,EAAUH,EAAqB,EAAGH,EAAc,EAAG,CACjF,MAAMgE,EAAaD,GAAgBzD,EAAUH,EAAoBH,CAAW,EACtEiE,EAAiBF,GAAgBzD,EAAW,EAAGH,EAAoBH,CAAW,EACpF,OAAQa,GAAWP,CAAQ,EAAI0D,EAAaC,GAAkB,CAChE,CAEO,SAASC,GAAetM,EAAM,CACnC,OAAIA,EAAO,GACFA,EACKA,EAAO4E,GAAS,mBAAqB,KAAO5E,EAAO,IAAOA,CAC1E,CAIO,SAASzB,GAAcP,EAAIuO,EAAcjO,EAAQkO,EAAW,KAAM,CACvE,MAAMzN,EAAO,IAAI,KAAKf,CAAE,EACtBuF,EAAW,CACT,UAAW,MACX,KAAM,UACN,MAAO,UACP,IAAK,UACL,KAAM,UACN,OAAQ,SACd,EAEMiJ,IACFjJ,EAAS,SAAWiJ,GAGtB,MAAMC,EAAW,CAAE,aAAcF,EAAc,GAAGhJ,CAAQ,EAEpD3M,EAAS,IAAI,KAAK,eAAe0H,EAAQmO,CAAQ,EACpD,cAAc1N,CAAI,EAClB,KAAMtE,GAAMA,EAAE,KAAK,YAAW,IAAO,cAAc,EACtD,OAAO7D,EAASA,EAAO,MAAQ,IACjC,CAGO,SAASuP,GAAauG,EAAYC,EAAc,CACrD,IAAIC,EAAU,SAASF,EAAY,EAAE,EAGjC,OAAO,MAAME,CAAO,IACtBA,EAAU,GAGZ,MAAMC,EAAS,SAASF,EAAc,EAAE,GAAK,EAC3CG,EAAeF,EAAU,GAAK,OAAO,GAAGA,EAAS,EAAE,EAAI,CAACC,EAASA,EACnE,OAAOD,EAAU,GAAKE,CACxB,CAIO,SAASC,GAASvc,EAAO,CAC9B,MAAMwc,EAAe,OAAOxc,CAAK,EACjC,GAAI,OAAOA,GAAU,WAAaA,IAAU,IAAM,OAAO,MAAMwc,CAAY,EACzE,MAAM,IAAIzQ,GAAqB,sBAAsB/L,CAAK,EAAE,EAC9D,OAAOwc,CACT,CAEO,SAASC,GAAgB5c,EAAK6c,EAAY,CAC/C,MAAMC,EAAa,GACnB,UAAWC,KAAK/c,EACd,GAAI8a,GAAe9a,EAAK+c,CAAC,EAAG,CAC1B,MAAMhX,EAAI/F,EAAI+c,CAAC,EACf,GAAuBhX,GAAM,KAAM,SACnC+W,EAAWD,EAAWE,CAAC,CAAC,EAAIL,GAAS3W,CAAC,CACvC,CAEH,OAAO+W,CACT,CAEO,SAAS3O,GAAa7Q,EAAQuQ,EAAQ,CAC3C,MAAMmP,EAAQ,KAAK,MAAM,KAAK,IAAI1f,EAAS,EAAE,CAAC,EAC5C2f,EAAU,KAAK,MAAM,KAAK,IAAI3f,EAAS,EAAE,CAAC,EAC1C4f,EAAO5f,GAAU,EAAI,IAAM,IAE7B,OAAQuQ,EAAM,CACZ,IAAK,QACH,MAAO,GAAGqP,CAAI,GAAG7J,GAAS2J,EAAO,CAAC,CAAC,IAAI3J,GAAS4J,EAAS,CAAC,CAAC,GAC7D,IAAK,SACH,MAAO,GAAGC,CAAI,GAAGF,CAAK,GAAGC,EAAU,EAAI,IAAIA,CAAO,GAAK,EAAE,GAC3D,IAAK,SACH,MAAO,GAAGC,CAAI,GAAG7J,GAAS2J,EAAO,CAAC,CAAC,GAAG3J,GAAS4J,EAAS,CAAC,CAAC,GAC5D,QACE,MAAM,IAAI,WAAW,gBAAgBpP,CAAM,sCAAsC,CACpF,CACH,CAEO,SAAS0K,GAAWvY,EAAK,CAC9B,OAAO6a,GAAK7a,EAAK,CAAC,OAAQ,SAAU,SAAU,aAAa,CAAC,CAC9D,CCzSO,MAAMmd,GAAa,CACxB,UACA,WACA,QACA,QACA,MACA,OACA,OACA,SACA,YACA,UACA,WACA,UACF,EAEaC,GAAc,CACzB,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACF,EAEaC,GAAe,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAEhF,SAASC,GAAO/K,EAAQ,CAC7B,OAAQA,EAAM,CACZ,IAAK,SACH,MAAO,CAAC,GAAG8K,EAAY,EACzB,IAAK,QACH,MAAO,CAAC,GAAGD,EAAW,EACxB,IAAK,OACH,MAAO,CAAC,GAAGD,EAAU,EACvB,IAAK,UACH,MAAO,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAM,KAAM,IAAI,EACvE,IAAK,UACH,MAAO,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAI,EAChF,QACE,OAAO,IACV,CACH,CAEO,MAAMI,GAAe,CAC1B,SACA,UACA,YACA,WACA,SACA,WACA,QACF,EAEaC,GAAgB,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,EAEhEC,GAAiB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAEzD,SAASC,GAASnL,EAAQ,CAC/B,OAAQA,EAAM,CACZ,IAAK,SACH,MAAO,CAAC,GAAGkL,EAAc,EAC3B,IAAK,QACH,MAAO,CAAC,GAAGD,EAAa,EAC1B,IAAK,OACH,MAAO,CAAC,GAAGD,EAAY,EACzB,IAAK,UACH,MAAO,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EAC3C,QACE,OAAO,IACV,CACH,CAEO,MAAMI,GAAY,CAAC,KAAM,IAAI,EAEvBC,GAAW,CAAC,gBAAiB,aAAa,EAE1CC,GAAY,CAAC,KAAM,IAAI,EAEvBC,GAAa,CAAC,IAAK,GAAG,EAE5B,SAASC,GAAKxL,EAAQ,CAC3B,OAAQA,EAAM,CACZ,IAAK,SACH,MAAO,CAAC,GAAGuL,EAAU,EACvB,IAAK,QACH,MAAO,CAAC,GAAGD,EAAS,EACtB,IAAK,OACH,MAAO,CAAC,GAAGD,EAAQ,EACrB,QACE,OAAO,IACV,CACH,CAEO,SAASI,GAAoB9L,EAAI,CACtC,OAAOyL,GAAUzL,EAAG,KAAO,GAAK,EAAI,CAAC,CACvC,CAEO,SAAS+L,GAAmB/L,EAAIK,EAAQ,CAC7C,OAAOmL,GAASnL,CAAM,EAAEL,EAAG,QAAU,CAAC,CACxC,CAEO,SAASgM,GAAiBhM,EAAIK,EAAQ,CAC3C,OAAO+K,GAAO/K,CAAM,EAAEL,EAAG,MAAQ,CAAC,CACpC,CAEO,SAASiM,GAAejM,EAAIK,EAAQ,CACzC,OAAOwL,GAAKxL,CAAM,EAAEL,EAAG,KAAO,EAAI,EAAI,CAAC,CACzC,CAEO,SAASkM,GAAmBnS,EAAM+H,EAAOqK,EAAU,SAAUC,EAAS,GAAO,CAClF,MAAMC,EAAQ,CACZ,MAAO,CAAC,OAAQ,KAAK,EACrB,SAAU,CAAC,UAAW,MAAM,EAC5B,OAAQ,CAAC,QAAS,KAAK,EACvB,MAAO,CAAC,OAAQ,KAAK,EACrB,KAAM,CAAC,MAAO,MAAO,MAAM,EAC3B,MAAO,CAAC,OAAQ,KAAK,EACrB,QAAS,CAAC,SAAU,MAAM,EAC1B,QAAS,CAAC,SAAU,MAAM,CAC9B,EAEQC,EAAW,CAAC,QAAS,UAAW,SAAS,EAAE,QAAQvS,CAAI,IAAM,GAEnE,GAAIoS,IAAY,QAAUG,EAAU,CAClC,MAAMC,EAAQxS,IAAS,OACvB,OAAQ+H,EAAK,CACX,IAAK,GACH,OAAOyK,EAAQ,WAAa,QAAQF,EAAMtS,CAAI,EAAE,CAAC,CAAC,GACpD,IAAK,GACH,OAAOwS,EAAQ,YAAc,QAAQF,EAAMtS,CAAI,EAAE,CAAC,CAAC,GACrD,IAAK,GACH,OAAOwS,EAAQ,QAAU,QAAQF,EAAMtS,CAAI,EAAE,CAAC,CAAC,EAElD,CACF,CAED,MAAMyS,EAAW,OAAO,GAAG1K,EAAO,EAAE,GAAKA,EAAQ,EAC/C2K,EAAW,KAAK,IAAI3K,CAAK,EACzB4K,EAAWD,IAAa,EACxBE,EAAWN,EAAMtS,CAAI,EACrB6S,EAAUR,EACNM,EACEC,EAAS,CAAC,EACVA,EAAS,CAAC,GAAKA,EAAS,CAAC,EAC3BD,EACAL,EAAMtS,CAAI,EAAE,CAAC,EACbA,EACN,OAAOyS,EAAW,GAAGC,CAAQ,IAAIG,CAAO,OAAS,MAAMH,CAAQ,IAAIG,CAAO,EAC5E,CCjKA,SAASC,GAAgBC,EAAQC,EAAe,CAC9C,IAAIjX,EAAI,GACR,UAAWkX,KAASF,EACdE,EAAM,QACRlX,GAAKkX,EAAM,IAEXlX,GAAKiX,EAAcC,EAAM,GAAG,EAGhC,OAAOlX,CACT,CAEA,MAAMmX,GAAyB,CAC7B,EAAGC,GACH,GAAIC,GACJ,IAAKC,GACL,KAAMC,GACN,EAAGC,GACH,GAAIC,GACJ,IAAKC,GACL,KAAMC,GACN,EAAGC,GACH,GAAIC,GACJ,IAAKC,GACL,KAAMC,GACN,EAAGC,GACH,GAAIC,GACJ,IAAKC,GACL,KAAMC,GACN,EAAGC,GACH,GAAIC,GACJ,IAAKC,GACL,KAAMC,EACR,EAMe,IAAAC,GAAA,MAAMC,EAAU,CAC7B,OAAO,OAAOxS,EAAQL,EAAO,GAAI,CAC/B,OAAO,IAAI6S,GAAUxS,EAAQL,CAAI,CAClC,CAED,OAAO,YAAY8S,EAAK,CAItB,IAAIC,EAAU,KACZC,EAAc,GACdC,EAAY,GACd,MAAM7B,EAAS,GACf,QAAS7hB,EAAI,EAAGA,EAAIujB,EAAI,OAAQvjB,IAAK,CACnC,MAAMuM,EAAIgX,EAAI,OAAOvjB,CAAC,EAClBuM,IAAM,KACJkX,EAAY,OAAS,GACvB5B,EAAO,KAAK,CAAE,QAAS6B,GAAa,QAAQ,KAAKD,CAAW,EAAG,IAAKA,CAAa,GAEnFD,EAAU,KACVC,EAAc,GACdC,EAAY,CAACA,GACJA,GAEAnX,IAAMiX,EADfC,GAAelX,GAIXkX,EAAY,OAAS,GACvB5B,EAAO,KAAK,CAAE,QAAS,QAAQ,KAAK4B,CAAW,EAAG,IAAKA,CAAW,CAAE,EAEtEA,EAAclX,EACdiX,EAAUjX,EAEb,CAED,OAAIkX,EAAY,OAAS,GACvB5B,EAAO,KAAK,CAAE,QAAS6B,GAAa,QAAQ,KAAKD,CAAW,EAAG,IAAKA,CAAa,GAG5E5B,CACR,CAED,OAAO,uBAAuBE,EAAO,CACnC,OAAOC,GAAuBD,CAAK,CACpC,CAED,YAAYjR,EAAQ6S,EAAY,CAC9B,KAAK,KAAOA,EACZ,KAAK,IAAM7S,EACX,KAAK,UAAY,IAClB,CAED,wBAAwBiE,EAAItE,EAAM,CAChC,OAAI,KAAK,YAAc,OACrB,KAAK,UAAY,KAAK,IAAI,kBAAiB,GAElC,KAAK,UAAU,YAAYsE,EAAI,CAAE,GAAG,KAAK,KAAM,GAAGtE,CAAM,GACzD,QACX,CAED,YAAYsE,EAAItE,EAAO,GAAI,CACzB,OAAO,KAAK,IAAI,YAAYsE,EAAI,CAAE,GAAG,KAAK,KAAM,GAAGtE,CAAI,CAAE,CAC1D,CAED,eAAesE,EAAItE,EAAM,CACvB,OAAO,KAAK,YAAYsE,EAAItE,CAAI,EAAE,OAAM,CACzC,CAED,oBAAoBsE,EAAItE,EAAM,CAC5B,OAAO,KAAK,YAAYsE,EAAItE,CAAI,EAAE,cAAa,CAChD,CAED,eAAemT,EAAUnT,EAAM,CAE7B,OADW,KAAK,YAAYmT,EAAS,MAAOnT,CAAI,EACtC,IAAI,YAAYmT,EAAS,MAAM,SAAQ,EAAIA,EAAS,IAAI,SAAU,EAC7E,CAED,gBAAgB7O,EAAItE,EAAM,CACxB,OAAO,KAAK,YAAYsE,EAAItE,CAAI,EAAE,gBAAe,CAClD,CAED,IAAIpO,EAAGuC,EAAI,EAAG,CAEZ,GAAI,KAAK,KAAK,YACZ,OAAOsR,GAAS7T,EAAGuC,CAAC,EAGtB,MAAM6L,EAAO,CAAE,GAAG,KAAK,IAAI,EAE3B,OAAI7L,EAAI,IACN6L,EAAK,MAAQ7L,GAGR,KAAK,IAAI,gBAAgB6L,CAAI,EAAE,OAAOpO,CAAC,CAC/C,CAED,yBAAyB0S,EAAIwO,EAAK,CAChC,MAAMM,EAAe,KAAK,IAAI,YAAa,IAAK,KAC9CC,EAAuB,KAAK,IAAI,gBAAkB,KAAK,IAAI,iBAAmB,UAC9E5F,EAAS,CAACzN,EAAMsT,IAAY,KAAK,IAAI,QAAQhP,EAAItE,EAAMsT,CAAO,EAC9D/S,EAAgBP,GACVsE,EAAG,eAAiBA,EAAG,SAAW,GAAKtE,EAAK,OACvC,IAGFsE,EAAG,QAAUA,EAAG,KAAK,aAAaA,EAAG,GAAItE,EAAK,MAAM,EAAI,GAEjEuT,EAAW,IACTH,EACII,GAA4BlP,CAAE,EAC9BmJ,EAAO,CAAE,KAAM,UAAW,UAAW,KAAO,EAAE,WAAW,EAC/DzL,EAAQ,CAAC2C,EAAQ8O,IACfL,EACIM,GAAyBpP,EAAIK,CAAM,EACnC8I,EAAOgG,EAAa,CAAE,MAAO9O,CAAQ,EAAG,CAAE,MAAOA,EAAQ,IAAK,SAAS,EAAI,OAAO,EACxF4F,EAAU,CAAC5F,EAAQ8O,IACjBL,EACIO,GAA2BrP,EAAIK,CAAM,EACrC8I,EACEgG,EAAa,CAAE,QAAS9O,CAAM,EAAK,CAAE,QAASA,EAAQ,MAAO,OAAQ,IAAK,SAAW,EACrF,SACD,EACPiP,EAActC,GAAU,CACtB,MAAM4B,EAAaL,GAAU,uBAAuBvB,CAAK,EACzD,OAAI4B,EACK,KAAK,wBAAwB5O,EAAI4O,CAAU,EAE3C5B,CAEV,EACDuC,EAAOlP,GACLyO,EAAeU,GAAuBxP,EAAIK,CAAM,EAAI8I,EAAO,CAAE,IAAK9I,CAAQ,EAAE,KAAK,EACnF0M,EAAiBC,GAAU,CAEzB,OAAQA,EAAK,CAEX,IAAK,IACH,OAAO,KAAK,IAAIhN,EAAG,WAAW,EAChC,IAAK,IAEL,IAAK,MACH,OAAO,KAAK,IAAIA,EAAG,YAAa,CAAC,EAEnC,IAAK,IACH,OAAO,KAAK,IAAIA,EAAG,MAAM,EAC3B,IAAK,KACH,OAAO,KAAK,IAAIA,EAAG,OAAQ,CAAC,EAE9B,IAAK,KACH,OAAO,KAAK,IAAI,KAAK,MAAMA,EAAG,YAAc,EAAE,EAAG,CAAC,EACpD,IAAK,MACH,OAAO,KAAK,IAAI,KAAK,MAAMA,EAAG,YAAc,GAAG,CAAC,EAElD,IAAK,IACH,OAAO,KAAK,IAAIA,EAAG,MAAM,EAC3B,IAAK,KACH,OAAO,KAAK,IAAIA,EAAG,OAAQ,CAAC,EAE9B,IAAK,IACH,OAAO,KAAK,IAAIA,EAAG,KAAO,KAAO,EAAI,GAAKA,EAAG,KAAO,EAAE,EACxD,IAAK,KACH,OAAO,KAAK,IAAIA,EAAG,KAAO,KAAO,EAAI,GAAKA,EAAG,KAAO,GAAI,CAAC,EAC3D,IAAK,IACH,OAAO,KAAK,IAAIA,EAAG,IAAI,EACzB,IAAK,KACH,OAAO,KAAK,IAAIA,EAAG,KAAM,CAAC,EAE5B,IAAK,IAEH,OAAO/D,EAAa,CAAE,OAAQ,SAAU,OAAQ,KAAK,KAAK,MAAM,CAAE,EACpE,IAAK,KAEH,OAAOA,EAAa,CAAE,OAAQ,QAAS,OAAQ,KAAK,KAAK,MAAM,CAAE,EACnE,IAAK,MAEH,OAAOA,EAAa,CAAE,OAAQ,SAAU,OAAQ,KAAK,KAAK,MAAM,CAAE,EACpE,IAAK,OAEH,OAAO+D,EAAG,KAAK,WAAWA,EAAG,GAAI,CAAE,OAAQ,QAAS,OAAQ,KAAK,IAAI,MAAQ,GAC/E,IAAK,QAEH,OAAOA,EAAG,KAAK,WAAWA,EAAG,GAAI,CAAE,OAAQ,OAAQ,OAAQ,KAAK,IAAI,MAAQ,GAE9E,IAAK,IAEH,OAAOA,EAAG,SAEZ,IAAK,IACH,OAAOiP,EAAQ,EAEjB,IAAK,IACH,OAAOF,EAAuB5F,EAAO,CAAE,IAAK,SAAW,EAAE,KAAK,EAAI,KAAK,IAAInJ,EAAG,GAAG,EACnF,IAAK,KACH,OAAO+O,EAAuB5F,EAAO,CAAE,IAAK,SAAS,EAAI,KAAK,EAAI,KAAK,IAAInJ,EAAG,IAAK,CAAC,EAEtF,IAAK,IAEH,OAAO,KAAK,IAAIA,EAAG,OAAO,EAC5B,IAAK,MAEH,OAAOiG,EAAQ,QAAS,EAAI,EAC9B,IAAK,OAEH,OAAOA,EAAQ,OAAQ,EAAI,EAC7B,IAAK,QAEH,OAAOA,EAAQ,SAAU,EAAI,EAE/B,IAAK,IAEH,OAAO,KAAK,IAAIjG,EAAG,OAAO,EAC5B,IAAK,MAEH,OAAOiG,EAAQ,QAAS,EAAK,EAC/B,IAAK,OAEH,OAAOA,EAAQ,OAAQ,EAAK,EAC9B,IAAK,QAEH,OAAOA,EAAQ,SAAU,EAAK,EAEhC,IAAK,IAEH,OAAO8I,EACH5F,EAAO,CAAE,MAAO,UAAW,IAAK,SAAW,EAAE,OAAO,EACpD,KAAK,IAAInJ,EAAG,KAAK,EACvB,IAAK,KAEH,OAAO+O,EACH5F,EAAO,CAAE,MAAO,UAAW,IAAK,SAAW,EAAE,OAAO,EACpD,KAAK,IAAInJ,EAAG,MAAO,CAAC,EAC1B,IAAK,MAEH,OAAOtC,EAAM,QAAS,EAAI,EAC5B,IAAK,OAEH,OAAOA,EAAM,OAAQ,EAAI,EAC3B,IAAK,QAEH,OAAOA,EAAM,SAAU,EAAI,EAE7B,IAAK,IAEH,OAAOqR,EACH5F,EAAO,CAAE,MAAO,SAAS,EAAI,OAAO,EACpC,KAAK,IAAInJ,EAAG,KAAK,EACvB,IAAK,KAEH,OAAO+O,EACH5F,EAAO,CAAE,MAAO,SAAS,EAAI,OAAO,EACpC,KAAK,IAAInJ,EAAG,MAAO,CAAC,EAC1B,IAAK,MAEH,OAAOtC,EAAM,QAAS,EAAK,EAC7B,IAAK,OAEH,OAAOA,EAAM,OAAQ,EAAK,EAC5B,IAAK,QAEH,OAAOA,EAAM,SAAU,EAAK,EAE9B,IAAK,IAEH,OAAOqR,EAAuB5F,EAAO,CAAE,KAAM,SAAW,EAAE,MAAM,EAAI,KAAK,IAAInJ,EAAG,IAAI,EACtF,IAAK,KAEH,OAAO+O,EACH5F,EAAO,CAAE,KAAM,SAAS,EAAI,MAAM,EAClC,KAAK,IAAInJ,EAAG,KAAK,WAAW,MAAM,EAAE,EAAG,CAAC,EAC9C,IAAK,OAEH,OAAO+O,EACH5F,EAAO,CAAE,KAAM,SAAS,EAAI,MAAM,EAClC,KAAK,IAAInJ,EAAG,KAAM,CAAC,EACzB,IAAK,SAEH,OAAO+O,EACH5F,EAAO,CAAE,KAAM,SAAS,EAAI,MAAM,EAClC,KAAK,IAAInJ,EAAG,KAAM,CAAC,EAEzB,IAAK,IAEH,OAAOuP,EAAI,OAAO,EACpB,IAAK,KAEH,OAAOA,EAAI,MAAM,EACnB,IAAK,QACH,OAAOA,EAAI,QAAQ,EACrB,IAAK,KACH,OAAO,KAAK,IAAIvP,EAAG,SAAS,WAAW,MAAM,EAAE,EAAG,CAAC,EACrD,IAAK,OACH,OAAO,KAAK,IAAIA,EAAG,SAAU,CAAC,EAChC,IAAK,IACH,OAAO,KAAK,IAAIA,EAAG,UAAU,EAC/B,IAAK,KACH,OAAO,KAAK,IAAIA,EAAG,WAAY,CAAC,EAClC,IAAK,IACH,OAAO,KAAK,IAAIA,EAAG,eAAe,EACpC,IAAK,KACH,OAAO,KAAK,IAAIA,EAAG,gBAAiB,CAAC,EACvC,IAAK,KACH,OAAO,KAAK,IAAIA,EAAG,cAAc,WAAW,MAAM,EAAE,EAAG,CAAC,EAC1D,IAAK,OACH,OAAO,KAAK,IAAIA,EAAG,cAAe,CAAC,EACrC,IAAK,IACH,OAAO,KAAK,IAAIA,EAAG,OAAO,EAC5B,IAAK,MACH,OAAO,KAAK,IAAIA,EAAG,QAAS,CAAC,EAC/B,IAAK,IAEH,OAAO,KAAK,IAAIA,EAAG,OAAO,EAC5B,IAAK,KAEH,OAAO,KAAK,IAAIA,EAAG,QAAS,CAAC,EAC/B,IAAK,IACH,OAAO,KAAK,IAAI,KAAK,MAAMA,EAAG,GAAK,GAAI,CAAC,EAC1C,IAAK,IACH,OAAO,KAAK,IAAIA,EAAG,EAAE,EACvB,QACE,OAAOsP,EAAWtC,CAAK,CAC1B,CACT,EAEI,OAAOH,GAAgB0B,GAAU,YAAYC,CAAG,EAAGzB,CAAa,CACjE,CAED,yBAAyB0C,EAAKjB,EAAK,CACjC,MAAMkB,EAAgB1C,GAAU,CAC5B,OAAQA,EAAM,CAAC,EAAC,CACd,IAAK,IACH,MAAO,cACT,IAAK,IACH,MAAO,SACT,IAAK,IACH,MAAO,SACT,IAAK,IACH,MAAO,OACT,IAAK,IACH,MAAO,MACT,IAAK,IACH,MAAO,OACT,IAAK,IACH,MAAO,QACT,IAAK,IACH,MAAO,OACT,QACE,OAAO,IACV,CACF,EACDD,EAAiB4C,GAAY3C,GAAU,CACrC,MAAM4C,EAASF,EAAa1C,CAAK,EACjC,OAAI4C,EACK,KAAK,IAAID,EAAO,IAAIC,CAAM,EAAG5C,EAAM,MAAM,EAEzCA,CAEV,EACD6C,EAAStB,GAAU,YAAYC,CAAG,EAClCsB,EAAaD,EAAO,OAClB,CAACE,EAAO,CAAE,QAAAC,EAAS,IAAA5hB,CAAK,IAAM4hB,EAAUD,EAAQA,EAAM,OAAO3hB,CAAG,EAChE,CAAE,CACH,EACD6hB,EAAYR,EAAI,QAAQ,GAAGK,EAAW,IAAIJ,CAAY,EAAE,OAAQ7K,GAAMA,CAAC,CAAC,EAC1E,OAAOgI,GAAgBgD,EAAQ9C,EAAckD,CAAS,CAAC,CACxD,CACH,EClYA,MAAMC,GAAY,+EAElB,SAASC,MAAkBC,EAAS,CAClC,MAAMC,EAAOD,EAAQ,OAAO,CAAC7d,EAAGkF,IAAMlF,EAAIkF,EAAE,OAAQ,EAAE,EACtD,OAAO,OAAO,IAAI4Y,CAAI,GAAG,CAC3B,CAEA,SAASC,MAAqBC,EAAY,CACxC,OAAQrY,GACNqY,EACG,OACC,CAAC,CAACC,EAAYC,EAAYC,CAAM,EAAGC,IAAO,CACxC,KAAM,CAACviB,EAAKgO,EAAMqM,CAAI,EAAIkI,EAAGzY,EAAGwY,CAAM,EACtC,MAAO,CAAC,CAAE,GAAGF,EAAY,GAAGpiB,CAAK,EAAEgO,GAAQqU,EAAYhI,CAAI,CAC5D,EACD,CAAC,CAAE,EAAE,KAAM,CAAC,CACb,EACA,MAAM,EAAG,CAAC,CACjB,CAEA,SAASmI,GAAM9a,KAAM+a,EAAU,CAC7B,GAAI/a,GAAK,KACP,MAAO,CAAC,KAAM,IAAI,EAGpB,SAAW,CAACgb,EAAOC,CAAS,IAAKF,EAAU,CACzC,MAAM3Y,EAAI4Y,EAAM,KAAKhb,CAAC,EACtB,GAAIoC,EACF,OAAO6Y,EAAU7Y,CAAC,CAErB,CACD,MAAO,CAAC,KAAM,IAAI,CACpB,CAEA,SAAS8Y,MAAexd,EAAM,CAC5B,MAAO,CAACyd,EAAOP,IAAW,CACxB,MAAMQ,EAAM,GACZ,IAAIjmB,EAEJ,IAAKA,EAAI,EAAGA,EAAIuI,EAAK,OAAQvI,IAC3BimB,EAAI1d,EAAKvI,CAAC,CAAC,EAAIie,GAAa+H,EAAMP,EAASzlB,CAAC,CAAC,EAE/C,MAAO,CAACimB,EAAK,KAAMR,EAASzlB,CAAC,CACjC,CACA,CAGA,MAAMkmB,GAAc,kCACdC,GAAkB,MAAMD,GAAY,MAAM,WAAWjB,GAAU,MAAM,WACrEmB,GAAmB,sDACnBC,GAAe,OAAO,GAAGD,GAAiB,MAAM,GAAGD,EAAe,EAAE,EACpEG,GAAwB,OAAO,OAAOD,GAAa,MAAM,IAAI,EAC7DE,GAAc,8CACdC,GAAe,8BACfC,GAAkB,mBAClBC,GAAqBX,GAAY,WAAY,aAAc,SAAS,EACpEY,GAAwBZ,GAAY,OAAQ,SAAS,EACrDa,GAAc,wBACdC,GAAe,OACnB,GAAGT,GAAiB,MAAM,QAAQF,GAAY,MAAM,KAAKjB,GAAU,MAAM,KAC3E,EACM6B,GAAwB,OAAO,OAAOD,GAAa,MAAM,IAAI,EAEnE,SAASE,GAAIf,EAAO7T,EAAK6U,EAAU,CACjC,MAAM/Z,EAAI+Y,EAAM7T,CAAG,EACnB,OAAOC,GAAYnF,CAAC,EAAI+Z,EAAW/I,GAAahR,CAAC,CACnD,CAEA,SAASga,GAAcjB,EAAOP,EAAQ,CAOpC,MAAO,CANM,CACX,KAAMsB,GAAIf,EAAOP,CAAM,EACvB,MAAOsB,GAAIf,EAAOP,EAAS,EAAG,CAAC,EAC/B,IAAKsB,GAAIf,EAAOP,EAAS,EAAG,CAAC,CACjC,EAEgB,KAAMA,EAAS,CAAC,CAChC,CAEA,SAASyB,GAAelB,EAAOP,EAAQ,CAQrC,MAAO,CAPM,CACX,MAAOsB,GAAIf,EAAOP,EAAQ,CAAC,EAC3B,QAASsB,GAAIf,EAAOP,EAAS,EAAG,CAAC,EACjC,QAASsB,GAAIf,EAAOP,EAAS,EAAG,CAAC,EACjC,aAAcrH,GAAY4H,EAAMP,EAAS,CAAC,CAAC,CAC/C,EAEgB,KAAMA,EAAS,CAAC,CAChC,CAEA,SAAS0B,GAAiBnB,EAAOP,EAAQ,CACvC,MAAM2B,EAAQ,CAACpB,EAAMP,CAAM,GAAK,CAACO,EAAMP,EAAS,CAAC,EAC/C4B,EAAa1O,GAAaqN,EAAMP,EAAS,CAAC,EAAGO,EAAMP,EAAS,CAAC,CAAC,EAC9DtU,EAAOiW,EAAQ,KAAO1O,GAAgB,SAAS2O,CAAU,EAC3D,MAAO,CAAC,GAAIlW,EAAMsU,EAAS,CAAC,CAC9B,CAEA,SAAS6B,GAAgBtB,EAAOP,EAAQ,CACtC,MAAMtU,EAAO6U,EAAMP,CAAM,EAAInT,GAAS,OAAO0T,EAAMP,CAAM,CAAC,EAAI,KAC9D,MAAO,CAAC,GAAItU,EAAMsU,EAAS,CAAC,CAC9B,CAIA,MAAM8B,GAAc,OAAO,MAAMnB,GAAiB,MAAM,GAAG,EAIrDoB,GACJ,+PAEF,SAASC,GAAmBzB,EAAO,CACjC,KAAM,CAACnb,EAAG6c,EAASC,EAAUC,EAASC,EAAQC,EAASC,EAAWC,EAAWC,CAAe,EAC1FjC,EAEIkC,EAAoBrd,EAAE,CAAC,IAAM,IAC7Bsd,EAAkBH,GAAaA,EAAU,CAAC,IAAM,IAEhDI,EAAc,CAACC,EAAKC,EAAQ,KAChCD,IAAQ,SAAcC,GAAUD,GAAOH,GAAsB,CAACG,EAAMA,EAEtE,MAAO,CACL,CACE,MAAOD,EAAYjK,GAAcuJ,CAAO,CAAC,EACzC,OAAQU,EAAYjK,GAAcwJ,CAAQ,CAAC,EAC3C,MAAOS,EAAYjK,GAAcyJ,CAAO,CAAC,EACzC,KAAMQ,EAAYjK,GAAc0J,CAAM,CAAC,EACvC,MAAOO,EAAYjK,GAAc2J,CAAO,CAAC,EACzC,QAASM,EAAYjK,GAAc4J,CAAS,CAAC,EAC7C,QAASK,EAAYjK,GAAc6J,CAAS,EAAGA,IAAc,IAAI,EACjE,aAAcI,EAAYhK,GAAY6J,CAAe,EAAGE,CAAe,CACxE,CACL,CACA,CAKA,MAAMI,GAAa,CACjB,IAAK,EACL,IAAK,GAAK,GACV,IAAK,GAAK,GACV,IAAK,GAAK,GACV,IAAK,GAAK,GACV,IAAK,GAAK,GACV,IAAK,GAAK,GACV,IAAK,GAAK,GACV,IAAK,GAAK,EACZ,EAEA,SAASC,GAAYC,EAAYf,EAASC,EAAUE,EAAQC,EAASC,EAAWC,EAAW,CACzF,MAAMrb,EAAS,CACb,KAAM+a,EAAQ,SAAW,EAAI5I,GAAeb,GAAayJ,CAAO,CAAC,EAAIzJ,GAAayJ,CAAO,EACzF,MAAOgB,GAAoB,QAAQf,CAAQ,EAAI,EAC/C,IAAK1J,GAAa4J,CAAM,EACxB,KAAM5J,GAAa6J,CAAO,EAC1B,OAAQ7J,GAAa8J,CAAS,CAClC,EAEE,OAAIC,IAAWrb,EAAO,OAASsR,GAAa+J,CAAS,GACjDS,IACF9b,EAAO,QACL8b,EAAW,OAAS,EAChBE,GAAqB,QAAQF,CAAU,EAAI,EAC3CG,GAAsB,QAAQH,CAAU,EAAI,GAG7C9b,CACT,CAGA,MAAMkc,GACJ,kMAEF,SAASC,GAAe9C,EAAO,CAC7B,KAAM,CACR,CACMyC,EACAZ,EACAF,EACAD,EACAI,EACAC,EACAC,EACAe,EACAC,EACA9J,EACAC,CACN,EAAQ6G,EACJrZ,EAAS6b,GAAYC,EAAYf,EAASC,EAAUE,EAAQC,EAASC,EAAWC,CAAS,EAE3F,IAAI7nB,EACJ,OAAI4oB,EACF5oB,EAASooB,GAAWQ,CAAS,EACpBC,EACT7oB,EAAS,EAETA,EAASwY,GAAauG,EAAYC,CAAY,EAGzC,CAACxS,EAAQ,IAAI+L,GAAgBvY,CAAM,CAAC,CAC7C,CAEA,SAAS8oB,GAAkBpe,EAAG,CAE5B,OAAOA,EACJ,QAAQ,qBAAsB,GAAG,EACjC,QAAQ,WAAY,GAAG,EACvB,MACL,CAIA,MAAMqe,GACF,6HACFC,GACE,yJACFC,GACE,4HAEJ,SAASC,GAAoBrD,EAAO,CAClC,KAAM,CAAG,CAAAyC,EAAYZ,EAAQF,EAAUD,EAASI,EAASC,EAAWC,CAAS,EAAIhC,EAEjF,MAAO,CADIwC,GAAYC,EAAYf,EAASC,EAAUE,EAAQC,EAASC,EAAWC,CAAS,EAC3EtP,GAAgB,WAAW,CAC7C,CAEA,SAAS4Q,GAAatD,EAAO,CAC3B,KAAM,CAAG,CAAAyC,EAAYd,EAAUE,EAAQC,EAASC,EAAWC,EAAWN,CAAO,EAAI1B,EAEjF,MAAO,CADIwC,GAAYC,EAAYf,EAASC,EAAUE,EAAQC,EAASC,EAAWC,CAAS,EAC3EtP,GAAgB,WAAW,CAC7C,CAEA,MAAM6Q,GAA+BrE,GAAeqB,GAAaD,EAAqB,EAChFkD,GAAgCtE,GAAesB,GAAcF,EAAqB,EAClFmD,GAAmCvE,GAAeuB,GAAiBH,EAAqB,EACxFoD,GAAuBxE,GAAemB,EAAY,EAElDsD,GAA6BtE,GACjC4B,GACAC,GACAC,GACAG,EACF,EACMsC,GAA8BvE,GAClCqB,GACAQ,GACAC,GACAG,EACF,EACMuC,GAA+BxE,GACnCsB,GACAO,GACAC,GACAG,EACF,EACMwC,GAA0BzE,GAC9B6B,GACAC,GACAG,EACF,EAMO,SAASyC,GAAalf,EAAG,CAC9B,OAAO8a,GACL9a,EACA,CAAC0e,GAA8BI,EAA0B,EACzD,CAACH,GAA+BI,EAA2B,EAC3D,CAACH,GAAkCI,EAA4B,EAC/D,CAACH,GAAsBI,EAAuB,CAClD,CACA,CAEO,SAASE,GAAiBnf,EAAG,CAClC,OAAO8a,GAAMsD,GAAkBpe,CAAC,EAAG,CAACge,GAASC,EAAc,CAAC,CAC9D,CAEO,SAASmB,GAAcpf,EAAG,CAC/B,OAAO8a,GACL9a,EACA,CAACqe,GAASG,EAAmB,EAC7B,CAACF,GAAQE,EAAmB,EAC5B,CAACD,GAAOE,EAAY,CACxB,CACA,CAEO,SAASY,GAAiBrf,EAAG,CAClC,OAAO8a,GAAM9a,EAAG,CAAC2c,GAAaC,EAAkB,CAAC,CACnD,CAEA,MAAM0C,GAAqB9E,GAAkB6B,EAAc,EAEpD,SAASkD,GAAiBvf,EAAG,CAClC,OAAO8a,GAAM9a,EAAG,CAAC0c,GAAa4C,EAAkB,CAAC,CACnD,CAEA,MAAME,GAA+BnF,GAAe0B,GAAaE,EAAqB,EAChFwD,GAAuBpF,GAAe2B,EAAY,EAElD0D,GAAkClF,GACtC6B,GACAC,GACAG,EACF,EAEO,SAASkD,GAAS3f,EAAG,CAC1B,OAAO8a,GACL9a,EACA,CAACwf,GAA8BV,EAA0B,EACzD,CAACW,GAAsBC,EAA+B,CAC1D,CACA,CC9TA,MAAME,GAAU,mBAGHC,GAAiB,CAC1B,MAAO,CACL,KAAM,EACN,MAAO,EAAI,GACX,QAAS,EAAI,GAAK,GAClB,QAAS,EAAI,GAAK,GAAK,GACvB,aAAc,EAAI,GAAK,GAAK,GAAK,GAClC,EACD,KAAM,CACJ,MAAO,GACP,QAAS,GAAK,GACd,QAAS,GAAK,GAAK,GACnB,aAAc,GAAK,GAAK,GAAK,GAC9B,EACD,MAAO,CAAE,QAAS,GAAI,QAAS,GAAK,GAAI,aAAc,GAAK,GAAK,GAAM,EACtE,QAAS,CAAE,QAAS,GAAI,aAAc,GAAK,GAAM,EACjD,QAAS,CAAE,aAAc,GAAM,CAChC,EACDC,GAAe,CACb,MAAO,CACL,SAAU,EACV,OAAQ,GACR,MAAO,GACP,KAAM,IACN,MAAO,IAAM,GACb,QAAS,IAAM,GAAK,GACpB,QAAS,IAAM,GAAK,GAAK,GACzB,aAAc,IAAM,GAAK,GAAK,GAAK,GACpC,EACD,SAAU,CACR,OAAQ,EACR,MAAO,GACP,KAAM,GACN,MAAO,GAAK,GACZ,QAAS,GAAK,GAAK,GACnB,QAAS,GAAK,GAAK,GAAK,GACxB,aAAc,GAAK,GAAK,GAAK,GAAK,GACnC,EACD,OAAQ,CACN,MAAO,EACP,KAAM,GACN,MAAO,GAAK,GACZ,QAAS,GAAK,GAAK,GACnB,QAAS,GAAK,GAAK,GAAK,GACxB,aAAc,GAAK,GAAK,GAAK,GAAK,GACnC,EAED,GAAGD,EACJ,EACDE,GAAqB,OAAW,IAChCC,GAAsB,OAAW,KACjCC,GAAiB,CACf,MAAO,CACL,SAAU,EACV,OAAQ,GACR,MAAOF,GAAqB,EAC5B,KAAMA,GACN,MAAOA,GAAqB,GAC5B,QAASA,GAAqB,GAAK,GACnC,QAASA,GAAqB,GAAK,GAAK,GACxC,aAAcA,GAAqB,GAAK,GAAK,GAAK,GACnD,EACD,SAAU,CACR,OAAQ,EACR,MAAOA,GAAqB,GAC5B,KAAMA,GAAqB,EAC3B,MAAQA,GAAqB,GAAM,EACnC,QAAUA,GAAqB,GAAK,GAAM,EAC1C,QAAUA,GAAqB,GAAK,GAAK,GAAM,EAC/C,aAAeA,GAAqB,GAAK,GAAK,GAAK,IAAQ,CAC5D,EACD,OAAQ,CACN,MAAOC,GAAsB,EAC7B,KAAMA,GACN,MAAOA,GAAsB,GAC7B,QAASA,GAAsB,GAAK,GACpC,QAASA,GAAsB,GAAK,GAAK,GACzC,aAAcA,GAAsB,GAAK,GAAK,GAAK,GACpD,EACD,GAAGH,EACP,EAGMK,GAAe,CACnB,QACA,WACA,SACA,QACA,OACA,QACA,UACA,UACA,cACF,EAEMC,GAAeD,GAAa,MAAM,CAAC,EAAE,QAAO,EAGlD,SAAS5iB,GAAMqc,EAAKxM,EAAMiT,EAAQ,GAAO,CAEvC,MAAMC,EAAO,CACX,OAAQD,EAAQjT,EAAK,OAAS,CAAE,GAAGwM,EAAI,OAAQ,GAAIxM,EAAK,QAAU,EAAK,EACvE,IAAKwM,EAAI,IAAI,MAAMxM,EAAK,GAAG,EAC3B,mBAAoBA,EAAK,oBAAsBwM,EAAI,mBACnD,OAAQxM,EAAK,QAAUwM,EAAI,MAC/B,EACE,OAAO,IAAI2G,GAASD,CAAI,CAC1B,CAEA,SAASE,GAAiBC,EAAQC,EAAM,CACtC,IAAIC,EAAMD,EAAK,cAAgB,EAC/B,UAAWxc,KAAQkc,GAAa,MAAM,CAAC,EACjCM,EAAKxc,CAAI,IACXyc,GAAOD,EAAKxc,CAAI,EAAIuc,EAAOvc,CAAI,EAAE,cAGrC,OAAOyc,CACT,CAGA,SAASC,GAAgBH,EAAQC,EAAM,CAGrC,MAAM9M,EAAS4M,GAAiBC,EAAQC,CAAI,EAAI,EAAI,GAAK,EAEzDP,GAAa,YAAY,CAACU,EAAUjI,IAAY,CAC9C,GAAKpR,GAAYkZ,EAAK9H,CAAO,CAAC,EA0B5B,OAAOiI,EAzBP,GAAIA,EAAU,CACZ,MAAMC,EAAcJ,EAAKG,CAAQ,EAAIjN,EAC/BmN,EAAON,EAAO7H,CAAO,EAAEiI,CAAQ,EAiB/BG,EAAS,KAAK,MAAMF,EAAcC,CAAI,EAC5CL,EAAK9H,CAAO,GAAKoI,EAASpN,EAC1B8M,EAAKG,CAAQ,GAAKG,EAASD,EAAOnN,CACnC,CACD,OAAOgF,CAIV,EAAE,IAAI,EAIPuH,GAAa,OAAO,CAACU,EAAUjI,IAAY,CACzC,GAAKpR,GAAYkZ,EAAK9H,CAAO,CAAC,EAQ5B,OAAOiI,EAPP,GAAIA,EAAU,CACZ,MAAMpN,EAAWiN,EAAKG,CAAQ,EAAI,EAClCH,EAAKG,CAAQ,GAAKpN,EAClBiN,EAAK9H,CAAO,GAAKnF,EAAWgN,EAAOI,CAAQ,EAAEjI,CAAO,CACrD,CACD,OAAOA,CAIV,EAAE,IAAI,CACT,CAGA,SAASqI,GAAaP,EAAM,CAC1B,MAAMQ,EAAU,GAChB,SAAW,CAAC/oB,EAAKC,CAAK,IAAK,OAAO,QAAQsoB,CAAI,EACxCtoB,IAAU,IACZ8oB,EAAQ/oB,CAAG,EAAIC,GAGnB,OAAO8oB,CACT,CAee,MAAMX,EAAS,CAI5B,YAAYY,EAAQ,CAClB,MAAMC,EAAWD,EAAO,qBAAuB,YAAc,GAC7D,IAAIV,EAASW,EAAWlB,GAAiBH,GAErCoB,EAAO,SACTV,EAASU,EAAO,QAMlB,KAAK,OAASA,EAAO,OAIrB,KAAK,IAAMA,EAAO,KAAO/U,GAAO,OAAM,EAItC,KAAK,mBAAqBgV,EAAW,WAAa,SAIlD,KAAK,QAAUD,EAAO,SAAW,KAIjC,KAAK,OAASV,EAId,KAAK,gBAAkB,EACxB,CAWD,OAAO,WAAWxU,EAAOpG,EAAM,CAC7B,OAAO0a,GAAS,WAAW,CAAE,aAActU,CAAK,EAAIpG,CAAI,CACzD,CAsBD,OAAO,WAAW5N,EAAK4N,EAAO,GAAI,CAChC,GAAI5N,GAAO,MAAQ,OAAOA,GAAQ,SAChC,MAAM,IAAIkM,GACR,+DACElM,IAAQ,KAAO,OAAS,OAAOA,CACzC,EACA,EAGI,OAAO,IAAIsoB,GAAS,CAClB,OAAQ1L,GAAgB5c,EAAKsoB,GAAS,aAAa,EACnD,IAAKnU,GAAO,WAAWvG,CAAI,EAC3B,mBAAoBA,EAAK,mBACzB,OAAQA,EAAK,MACnB,CAAK,CACF,CAYD,OAAO,iBAAiBwb,EAAc,CACpC,GAAI9S,GAAS8S,CAAY,EACvB,OAAOd,GAAS,WAAWc,CAAY,EAClC,GAAId,GAAS,WAAWc,CAAY,EACzC,OAAOA,EACF,GAAI,OAAOA,GAAiB,SACjC,OAAOd,GAAS,WAAWc,CAAY,EAEvC,MAAM,IAAIld,GACR,6BAA6Bkd,CAAY,YAAY,OAAOA,CAAY,EAChF,CAEG,CAgBD,OAAO,QAAQC,EAAMzb,EAAM,CACzB,KAAM,CAACrH,CAAM,EAAI8gB,GAAiBgC,CAAI,EACtC,OAAI9iB,EACK+hB,GAAS,WAAW/hB,EAAQqH,CAAI,EAEhC0a,GAAS,QAAQ,aAAc,cAAce,CAAI,+BAA+B,CAE1F,CAkBD,OAAO,YAAYA,EAAMzb,EAAM,CAC7B,KAAM,CAACrH,CAAM,EAAIghB,GAAiB8B,CAAI,EACtC,OAAI9iB,EACK+hB,GAAS,WAAW/hB,EAAQqH,CAAI,EAEhC0a,GAAS,QAAQ,aAAc,cAAce,CAAI,+BAA+B,CAE1F,CAQD,OAAO,QAAQzd,EAAQqL,EAAc,KAAM,CACzC,GAAI,CAACrL,EACH,MAAM,IAAIM,GAAqB,kDAAkD,EAGnF,MAAMod,EAAU1d,aAAkBoL,GAAUpL,EAAS,IAAIoL,GAAQpL,EAAQqL,CAAW,EAEpF,GAAI1C,GAAS,eACX,MAAM,IAAIzI,GAAqBwd,CAAO,EAEtC,OAAO,IAAIhB,GAAS,CAAE,QAAAgB,CAAO,CAAE,CAElC,CAKD,OAAO,cAAcrd,EAAM,CACzB,MAAM6Q,EAAa,CACjB,KAAM,QACN,MAAO,QACP,QAAS,WACT,SAAU,WACV,MAAO,SACP,OAAQ,SACR,KAAM,QACN,MAAO,QACP,IAAK,OACL,KAAM,OACN,KAAM,QACN,MAAO,QACP,OAAQ,UACR,QAAS,UACT,OAAQ,UACR,QAAS,UACT,YAAa,eACb,aAAc,cACf,EAAC7Q,GAAOA,EAAK,YAAa,CAAO,EAElC,GAAI,CAAC6Q,EAAY,MAAM,IAAI9Q,GAAiBC,CAAI,EAEhD,OAAO6Q,CACR,CAOD,OAAO,WAAW1C,EAAG,CACnB,OAAQA,GAAKA,EAAE,iBAAoB,EACpC,CAMD,IAAI,QAAS,CACX,OAAO,KAAK,QAAU,KAAK,IAAI,OAAS,IACzC,CAOD,IAAI,iBAAkB,CACpB,OAAO,KAAK,QAAU,KAAK,IAAI,gBAAkB,IAClD,CAwBD,SAASsG,EAAK9S,EAAO,GAAI,CAEvB,MAAM2b,EAAU,CACd,GAAG3b,EACH,MAAOA,EAAK,QAAU,IAASA,EAAK,QAAU,EACpD,EACI,OAAO,KAAK,QACR6S,GAAU,OAAO,KAAK,IAAK8I,CAAO,EAAE,yBAAyB,KAAM7I,CAAG,EACtEkH,EACL,CAgBD,QAAQha,EAAO,GAAI,CACjB,GAAI,CAAC,KAAK,QAAS,OAAOga,GAE1B,MAAM7e,EAAImf,GACP,IAAKjc,GAAS,CACb,MAAM3L,EAAM,KAAK,OAAO2L,CAAI,EAC5B,OAAIsD,GAAYjP,CAAG,EACV,KAEF,KAAK,IACT,gBAAgB,CAAE,MAAO,OAAQ,YAAa,OAAQ,GAAGsN,EAAM,KAAM3B,EAAK,MAAM,EAAG,EAAE,CAAC,CAAE,EACxF,OAAO3L,CAAG,CACrB,CAAO,EACA,OAAQd,GAAMA,CAAC,EAElB,OAAO,KAAK,IACT,cAAc,CAAE,KAAM,cAAe,MAAOoO,EAAK,WAAa,SAAU,GAAGA,EAAM,EACjF,OAAO7E,CAAC,CACZ,CAOD,UAAW,CACT,OAAK,KAAK,QACH,CAAE,GAAG,KAAK,QADS,EAE3B,CAYD,OAAQ,CAEN,GAAI,CAAC,KAAK,QAAS,OAAO,KAE1B,IAAIf,EAAI,IACR,OAAI,KAAK,QAAU,IAAGA,GAAK,KAAK,MAAQ,MACpC,KAAK,SAAW,GAAK,KAAK,WAAa,KAAGA,GAAK,KAAK,OAAS,KAAK,SAAW,EAAI,KACjF,KAAK,QAAU,IAAGA,GAAK,KAAK,MAAQ,KACpC,KAAK,OAAS,IAAGA,GAAK,KAAK,KAAO,MAClC,KAAK,QAAU,GAAK,KAAK,UAAY,GAAK,KAAK,UAAY,GAAK,KAAK,eAAiB,KACxFA,GAAK,KACH,KAAK,QAAU,IAAGA,GAAK,KAAK,MAAQ,KACpC,KAAK,UAAY,IAAGA,GAAK,KAAK,QAAU,MACxC,KAAK,UAAY,GAAK,KAAK,eAAiB,KAG9CA,GAAKoL,GAAQ,KAAK,QAAU,KAAK,aAAe,IAAM,CAAC,EAAI,KACzDpL,IAAM,MAAKA,GAAK,OACbA,CACR,CAkBD,UAAU4F,EAAO,GAAI,CACnB,GAAI,CAAC,KAAK,QAAS,OAAO,KAE1B,MAAM4b,EAAS,KAAK,WACpB,OAAIA,EAAS,GAAKA,GAAU,MAAiB,MAE7C5b,EAAO,CACL,qBAAsB,GACtB,gBAAiB,GACjB,cAAe,GACf,OAAQ,WACR,GAAGA,EACH,cAAe,EACrB,EAEqBuE,GAAS,WAAWqX,EAAQ,CAAE,KAAM,KAAK,CAAE,EAC5C,UAAU5b,CAAI,EAC/B,CAMD,QAAS,CACP,OAAO,KAAK,OACb,CAMD,UAAW,CACT,OAAO,KAAK,OACb,CAMD,CAAC,OAAO,IAAI,4BAA4B,CAAC,GAAI,CAC3C,OAAI,KAAK,QACA,sBAAsB,KAAK,UAAU,KAAK,MAAM,CAAC,KAEjD,+BAA+B,KAAK,aAAa,IAE3D,CAMD,UAAW,CACT,OAAK,KAAK,QAEH2a,GAAiB,KAAK,OAAQ,KAAK,MAAM,EAFtB,GAG3B,CAMD,SAAU,CACR,OAAO,KAAK,UACb,CAOD,KAAKkB,EAAU,CACb,GAAI,CAAC,KAAK,QAAS,OAAO,KAE1B,MAAM9H,EAAM2G,GAAS,iBAAiBmB,CAAQ,EAC5C3f,EAAS,GAEX,UAAW1J,KAAK8nB,IACVpN,GAAe6G,EAAI,OAAQvhB,CAAC,GAAK0a,GAAe,KAAK,OAAQ1a,CAAC,KAChE0J,EAAO1J,CAAC,EAAIuhB,EAAI,IAAIvhB,CAAC,EAAI,KAAK,IAAIA,CAAC,GAIvC,OAAOkF,GAAM,KAAM,CAAE,OAAQwE,CAAM,EAAI,EAAI,CAC5C,CAOD,MAAM2f,EAAU,CACd,GAAI,CAAC,KAAK,QAAS,OAAO,KAE1B,MAAM9H,EAAM2G,GAAS,iBAAiBmB,CAAQ,EAC9C,OAAO,KAAK,KAAK9H,EAAI,OAAQ,EAC9B,CASD,SAAS+H,EAAI,CACX,GAAI,CAAC,KAAK,QAAS,OAAO,KAC1B,MAAM5f,EAAS,GACf,UAAW1J,KAAK,OAAO,KAAK,KAAK,MAAM,EACrC0J,EAAO1J,CAAC,EAAIsc,GAASgN,EAAG,KAAK,OAAOtpB,CAAC,EAAGA,CAAC,CAAC,EAE5C,OAAOkF,GAAM,KAAM,CAAE,OAAQwE,CAAM,EAAI,EAAI,CAC5C,CAUD,IAAImC,EAAM,CACR,OAAO,KAAKqc,GAAS,cAAcrc,CAAI,CAAC,CACzC,CASD,IAAIjJ,EAAQ,CACV,GAAI,CAAC,KAAK,QAAS,OAAO,KAE1B,MAAM2mB,EAAQ,CAAE,GAAG,KAAK,OAAQ,GAAG/M,GAAgB5Z,EAAQslB,GAAS,aAAa,GACjF,OAAOhjB,GAAM,KAAM,CAAE,OAAQqkB,CAAO,EACrC,CAOD,YAAY,CAAE,OAAA1b,EAAQ,gBAAA2D,EAAiB,mBAAAgY,EAAoB,OAAApB,CAAQ,EAAG,GAAI,CAExE,MAAM5a,EAAO,CAAE,IADH,KAAK,IAAI,MAAM,CAAE,OAAAK,EAAQ,gBAAA2D,CAAe,CAAE,EAClC,OAAA4W,EAAQ,mBAAAoB,CAAkB,EAC9C,OAAOtkB,GAAM,KAAMsI,CAAI,CACxB,CAUD,GAAG3B,EAAM,CACP,OAAO,KAAK,QAAU,KAAK,QAAQA,CAAI,EAAE,IAAIA,CAAI,EAAI,GACtD,CAiBD,WAAY,CACV,GAAI,CAAC,KAAK,QAAS,OAAO,KAC1B,MAAMwc,EAAO,KAAK,WAClB,OAAAE,GAAgB,KAAK,OAAQF,CAAI,EAC1BnjB,GAAM,KAAM,CAAE,OAAQmjB,CAAI,EAAI,EAAI,CAC1C,CAOD,SAAU,CACR,GAAI,CAAC,KAAK,QAAS,OAAO,KAC1B,MAAMA,EAAOO,GAAa,KAAK,UAAW,EAAC,WAAY,EAAC,SAAQ,CAAE,EAClE,OAAO1jB,GAAM,KAAM,CAAE,OAAQmjB,CAAI,EAAI,EAAI,CAC1C,CAOD,WAAWlK,EAAO,CAChB,GAAI,CAAC,KAAK,QAAS,OAAO,KAE1B,GAAIA,EAAM,SAAW,EACnB,OAAO,KAGTA,EAAQA,EAAM,IAAKxB,GAAMuL,GAAS,cAAcvL,CAAC,CAAC,EAElD,MAAM8M,EAAQ,CAAE,EACdC,EAAc,CAAE,EAChBrB,EAAO,KAAK,WACd,IAAIsB,EAEJ,UAAW3pB,KAAK8nB,GACd,GAAI3J,EAAM,QAAQne,CAAC,GAAK,EAAG,CACzB2pB,EAAW3pB,EAEX,IAAI4pB,EAAM,EAGV,UAAWC,KAAMH,EACfE,GAAO,KAAK,OAAOC,CAAE,EAAE7pB,CAAC,EAAI0pB,EAAYG,CAAE,EAC1CH,EAAYG,CAAE,EAAI,EAIhB3T,GAASmS,EAAKroB,CAAC,CAAC,IAClB4pB,GAAOvB,EAAKroB,CAAC,GAKf,MAAMjD,EAAI,KAAK,MAAM6sB,CAAG,EACxBH,EAAMzpB,CAAC,EAAIjD,EACX2sB,EAAY1pB,CAAC,GAAK4pB,EAAM,IAAO7sB,EAAI,KAAQ,GAG5C,MAAUmZ,GAASmS,EAAKroB,CAAC,CAAC,IACzB0pB,EAAY1pB,CAAC,EAAIqoB,EAAKroB,CAAC,GAM3B,UAAWF,KAAO4pB,EACZA,EAAY5pB,CAAG,IAAM,IACvB2pB,EAAME,CAAQ,GACZ7pB,IAAQ6pB,EAAWD,EAAY5pB,CAAG,EAAI4pB,EAAY5pB,CAAG,EAAI,KAAK,OAAO6pB,CAAQ,EAAE7pB,CAAG,GAIxF,OAAAyoB,GAAgB,KAAK,OAAQkB,CAAK,EAC3BvkB,GAAM,KAAM,CAAE,OAAQukB,CAAK,EAAI,EAAI,CAC3C,CAOD,YAAa,CACX,OAAK,KAAK,QACH,KAAK,QACV,QACA,SACA,QACA,OACA,QACA,UACA,UACA,cACN,EAV8B,IAW3B,CAOD,QAAS,CACP,GAAI,CAAC,KAAK,QAAS,OAAO,KAC1B,MAAMK,EAAU,GAChB,UAAW9pB,KAAK,OAAO,KAAK,KAAK,MAAM,EACrC8pB,EAAQ9pB,CAAC,EAAI,KAAK,OAAOA,CAAC,IAAM,EAAI,EAAI,CAAC,KAAK,OAAOA,CAAC,EAExD,OAAOkF,GAAM,KAAM,CAAE,OAAQ4kB,CAAO,EAAI,EAAI,CAC7C,CAMD,IAAI,OAAQ,CACV,OAAO,KAAK,QAAU,KAAK,OAAO,OAAS,EAAI,GAChD,CAMD,IAAI,UAAW,CACb,OAAO,KAAK,QAAU,KAAK,OAAO,UAAY,EAAI,GACnD,CAMD,IAAI,QAAS,CACX,OAAO,KAAK,QAAU,KAAK,OAAO,QAAU,EAAI,GACjD,CAMD,IAAI,OAAQ,CACV,OAAO,KAAK,QAAU,KAAK,OAAO,OAAS,EAAI,GAChD,CAMD,IAAI,MAAO,CACT,OAAO,KAAK,QAAU,KAAK,OAAO,MAAQ,EAAI,GAC/C,CAMD,IAAI,OAAQ,CACV,OAAO,KAAK,QAAU,KAAK,OAAO,OAAS,EAAI,GAChD,CAMD,IAAI,SAAU,CACZ,OAAO,KAAK,QAAU,KAAK,OAAO,SAAW,EAAI,GAClD,CAMD,IAAI,SAAU,CACZ,OAAO,KAAK,QAAU,KAAK,OAAO,SAAW,EAAI,GAClD,CAMD,IAAI,cAAe,CACjB,OAAO,KAAK,QAAU,KAAK,OAAO,cAAgB,EAAI,GACvD,CAOD,IAAI,SAAU,CACZ,OAAO,KAAK,UAAY,IACzB,CAMD,IAAI,eAAgB,CAClB,OAAO,KAAK,QAAU,KAAK,QAAQ,OAAS,IAC7C,CAMD,IAAI,oBAAqB,CACvB,OAAO,KAAK,QAAU,KAAK,QAAQ,YAAc,IAClD,CAQD,OAAOlpB,EAAO,CAKZ,GAJI,CAAC,KAAK,SAAW,CAACA,EAAM,SAIxB,CAAC,KAAK,IAAI,OAAOA,EAAM,GAAG,EAC5B,MAAO,GAGT,SAASmpB,EAAGC,EAAIC,EAAI,CAElB,OAAID,IAAO,QAAaA,IAAO,EAAUC,IAAO,QAAaA,IAAO,EAC7DD,IAAOC,CACf,CAED,UAAWtN,KAAKmL,GACd,GAAI,CAACiC,EAAG,KAAK,OAAOpN,CAAC,EAAG/b,EAAM,OAAO+b,CAAC,CAAC,EACrC,MAAO,GAGX,MAAO,EACR,CACH,CCr9BA,MAAM6K,GAAU,mBAGhB,SAAS0C,GAAiBC,EAAOC,EAAK,CACpC,MAAI,CAACD,GAAS,CAACA,EAAM,QACZE,GAAS,QAAQ,0BAA0B,EACzC,CAACD,GAAO,CAACA,EAAI,QACfC,GAAS,QAAQ,wBAAwB,EACvCD,EAAMD,EACRE,GAAS,QACd,mBACA,qEAAqEF,EAAM,MAAK,CAAE,YAAYC,EAAI,MAAK,CAAE,EAC/G,EAEW,IAEX,CAce,MAAMC,EAAS,CAI5B,YAAYvB,EAAQ,CAIlB,KAAK,EAAIA,EAAO,MAIhB,KAAK,EAAIA,EAAO,IAIhB,KAAK,QAAUA,EAAO,SAAW,KAIjC,KAAK,gBAAkB,EACxB,CAQD,OAAO,QAAQtd,EAAQqL,EAAc,KAAM,CACzC,GAAI,CAACrL,EACH,MAAM,IAAIM,GAAqB,kDAAkD,EAGnF,MAAMod,EAAU1d,aAAkBoL,GAAUpL,EAAS,IAAIoL,GAAQpL,EAAQqL,CAAW,EAEpF,GAAI1C,GAAS,eACX,MAAM,IAAI1I,GAAqByd,CAAO,EAEtC,OAAO,IAAImB,GAAS,CAAE,QAAAnB,CAAO,CAAE,CAElC,CAQD,OAAO,cAAciB,EAAOC,EAAK,CAC/B,MAAME,EAAaC,GAAiBJ,CAAK,EACvCK,EAAWD,GAAiBH,CAAG,EAE3BK,EAAgBP,GAAiBI,EAAYE,CAAQ,EAE3D,OAAIC,GACK,IAAIJ,GAAS,CAClB,MAAOC,EACP,IAAKE,CACb,CAAO,CAIJ,CAQD,OAAO,MAAML,EAAOd,EAAU,CAC5B,MAAM9H,EAAM2G,GAAS,iBAAiBmB,CAAQ,EAC5CvX,EAAKyY,GAAiBJ,CAAK,EAC7B,OAAOE,GAAS,cAAcvY,EAAIA,EAAG,KAAKyP,CAAG,CAAC,CAC/C,CAQD,OAAO,OAAO6I,EAAKf,EAAU,CAC3B,MAAM9H,EAAM2G,GAAS,iBAAiBmB,CAAQ,EAC5CvX,EAAKyY,GAAiBH,CAAG,EAC3B,OAAOC,GAAS,cAAcvY,EAAG,MAAMyP,CAAG,EAAGzP,CAAE,CAChD,CAUD,OAAO,QAAQmX,EAAMzb,EAAM,CACzB,KAAM,CAAC5F,EAAGnJ,CAAC,GAAKwqB,GAAQ,IAAI,MAAM,IAAK,CAAC,EACxC,GAAIrhB,GAAKnJ,EAAG,CACV,IAAI0rB,EAAOO,EACX,GAAI,CACFP,EAAQpY,GAAS,QAAQnK,EAAG4F,CAAI,EAChCkd,EAAeP,EAAM,OACtB,MAAW,CACVO,EAAe,EAChB,CAED,IAAIN,EAAKO,EACT,GAAI,CACFP,EAAMrY,GAAS,QAAQtT,EAAG+O,CAAI,EAC9Bmd,EAAaP,EAAI,OAClB,MAAW,CACVO,EAAa,EACd,CAED,GAAID,GAAgBC,EAClB,OAAON,GAAS,cAAcF,EAAOC,CAAG,EAG1C,GAAIM,EAAc,CAChB,MAAMnJ,EAAM2G,GAAS,QAAQzpB,EAAG+O,CAAI,EACpC,GAAI+T,EAAI,QACN,OAAO8I,GAAS,MAAMF,EAAO5I,CAAG,CAEnC,SAAUoJ,EAAY,CACrB,MAAMpJ,EAAM2G,GAAS,QAAQtgB,EAAG4F,CAAI,EACpC,GAAI+T,EAAI,QACN,OAAO8I,GAAS,OAAOD,EAAK7I,CAAG,CAElC,CACF,CACD,OAAO8I,GAAS,QAAQ,aAAc,cAAcpB,CAAI,+BAA+B,CACxF,CAOD,OAAO,WAAWjP,EAAG,CACnB,OAAQA,GAAKA,EAAE,iBAAoB,EACpC,CAMD,IAAI,OAAQ,CACV,OAAO,KAAK,QAAU,KAAK,EAAI,IAChC,CAMD,IAAI,KAAM,CACR,OAAO,KAAK,QAAU,KAAK,EAAI,IAChC,CAMD,IAAI,SAAU,CACZ,OAAO,KAAK,gBAAkB,IAC/B,CAMD,IAAI,eAAgB,CAClB,OAAO,KAAK,QAAU,KAAK,QAAQ,OAAS,IAC7C,CAMD,IAAI,oBAAqB,CACvB,OAAO,KAAK,QAAU,KAAK,QAAQ,YAAc,IAClD,CAOD,OAAOnO,EAAO,eAAgB,CAC5B,OAAO,KAAK,QAAU,KAAK,WAAeA,CAAK,EAAE,IAAIA,CAAI,EAAI,GAC9D,CAWD,MAAMA,EAAO,eAAgB2B,EAAM,CACjC,GAAI,CAAC,KAAK,QAAS,MAAO,KAC1B,MAAM2c,EAAQ,KAAK,MAAM,QAAQte,EAAM2B,CAAI,EAC3C,IAAI4c,EACJ,OAAI5c,GAAA,MAAAA,EAAM,eACR4c,EAAM,KAAK,IAAI,YAAY,CAAE,OAAQD,EAAM,MAAM,CAAE,EAEnDC,EAAM,KAAK,IAEbA,EAAMA,EAAI,QAAQve,EAAM2B,CAAI,EACrB,KAAK,MAAM4c,EAAI,KAAKD,EAAOte,CAAI,EAAE,IAAIA,CAAI,CAAC,GAAKue,EAAI,QAAS,IAAK,KAAK,IAAI,QAAO,EACzF,CAOD,QAAQve,EAAM,CACZ,OAAO,KAAK,QAAU,KAAK,QAAS,GAAI,KAAK,EAAE,MAAM,CAAC,EAAE,QAAQ,KAAK,EAAGA,CAAI,EAAI,EACjF,CAMD,SAAU,CACR,OAAO,KAAK,EAAE,QAAO,IAAO,KAAK,EAAE,SACpC,CAOD,QAAQ+e,EAAU,CAChB,OAAK,KAAK,QACH,KAAK,EAAIA,EADU,EAE3B,CAOD,SAASA,EAAU,CACjB,OAAK,KAAK,QACH,KAAK,GAAKA,EADS,EAE3B,CAOD,SAASA,EAAU,CACjB,OAAK,KAAK,QACH,KAAK,GAAKA,GAAY,KAAK,EAAIA,EADZ,EAE3B,CASD,IAAI,CAAE,MAAAT,EAAO,IAAAC,CAAG,EAAK,GAAI,CACvB,OAAK,KAAK,QACHC,GAAS,cAAcF,GAAS,KAAK,EAAGC,GAAO,KAAK,CAAC,EADlC,IAE3B,CAOD,WAAWS,EAAW,CACpB,GAAI,CAAC,KAAK,QAAS,MAAO,GAC1B,MAAMC,EAASD,EACV,IAAIN,EAAgB,EACpB,OAAQroB,GAAM,KAAK,SAASA,CAAC,CAAC,EAC9B,KAAK,CAACuB,EAAGC,IAAMD,EAAE,WAAaC,EAAE,UAAU,EAC7C4R,EAAU,GACZ,GAAI,CAAE,EAAA1N,CAAC,EAAK,KACV7K,EAAI,EAEN,KAAO6K,EAAI,KAAK,GAAG,CACjB,MAAMmjB,EAAQD,EAAO/tB,CAAC,GAAK,KAAK,EAC9Bwd,EAAO,CAACwQ,EAAQ,CAAC,KAAK,EAAI,KAAK,EAAIA,EACrCzV,EAAQ,KAAK+U,GAAS,cAAcziB,EAAG2S,CAAI,CAAC,EAC5C3S,EAAI2S,EACJxd,GAAK,CACN,CAED,OAAOuY,CACR,CAQD,QAAQ+T,EAAU,CAChB,MAAM9H,EAAM2G,GAAS,iBAAiBmB,CAAQ,EAE9C,GAAI,CAAC,KAAK,SAAW,CAAC9H,EAAI,SAAWA,EAAI,GAAG,cAAc,IAAM,EAC9D,MAAO,GAGT,GAAI,CAAE,EAAA3Z,CAAC,EAAK,KACVojB,EAAM,EACNzQ,EAEF,MAAMjF,EAAU,GAChB,KAAO1N,EAAI,KAAK,GAAG,CACjB,MAAMmjB,EAAQ,KAAK,MAAM,KAAKxJ,EAAI,SAAUxX,GAAMA,EAAIihB,CAAG,CAAC,EAC1DzQ,EAAO,CAACwQ,EAAQ,CAAC,KAAK,EAAI,KAAK,EAAIA,EACnCzV,EAAQ,KAAK+U,GAAS,cAAcziB,EAAG2S,CAAI,CAAC,EAC5C3S,EAAI2S,EACJyQ,GAAO,CACR,CAED,OAAO1V,CACR,CAOD,cAAc2V,EAAe,CAC3B,OAAK,KAAK,QACH,KAAK,QAAQ,KAAK,OAAM,EAAKA,CAAa,EAAE,MAAM,EAAGA,CAAa,EAD/C,EAE3B,CAOD,SAASrqB,EAAO,CACd,OAAO,KAAK,EAAIA,EAAM,GAAK,KAAK,EAAIA,EAAM,CAC3C,CAOD,WAAWA,EAAO,CAChB,OAAK,KAAK,QACH,CAAC,KAAK,GAAM,CAACA,EAAM,EADA,EAE3B,CAOD,SAASA,EAAO,CACd,OAAK,KAAK,QACH,CAACA,EAAM,GAAM,CAAC,KAAK,EADA,EAE3B,CAOD,QAAQA,EAAO,CACb,OAAK,KAAK,QACH,KAAK,GAAKA,EAAM,GAAK,KAAK,GAAKA,EAAM,EADlB,EAE3B,CAOD,OAAOA,EAAO,CACZ,MAAI,CAAC,KAAK,SAAW,CAACA,EAAM,QACnB,GAGF,KAAK,EAAE,OAAOA,EAAM,CAAC,GAAK,KAAK,EAAE,OAAOA,EAAM,CAAC,CACvD,CASD,aAAaA,EAAO,CAClB,GAAI,CAAC,KAAK,QAAS,OAAO,KAC1B,MAAMgH,EAAI,KAAK,EAAIhH,EAAM,EAAI,KAAK,EAAIA,EAAM,EAC1CnC,EAAI,KAAK,EAAImC,EAAM,EAAI,KAAK,EAAIA,EAAM,EAExC,OAAIgH,GAAKnJ,EACA,KAEA4rB,GAAS,cAAcziB,EAAGnJ,CAAC,CAErC,CAQD,MAAMmC,EAAO,CACX,GAAI,CAAC,KAAK,QAAS,OAAO,KAC1B,MAAMgH,EAAI,KAAK,EAAIhH,EAAM,EAAI,KAAK,EAAIA,EAAM,EAC1CnC,EAAI,KAAK,EAAImC,EAAM,EAAI,KAAK,EAAIA,EAAM,EACxC,OAAOypB,GAAS,cAAcziB,EAAGnJ,CAAC,CACnC,CAQD,OAAO,MAAMysB,EAAW,CACtB,KAAM,CAACrJ,EAAOsJ,CAAK,EAAID,EACpB,KAAK,CAACznB,EAAGC,IAAMD,EAAE,EAAIC,EAAE,CAAC,EACxB,OACC,CAAC,CAAC0nB,EAAO7K,CAAO,EAAGvf,IACZuf,EAEMA,EAAQ,SAASvf,CAAI,GAAKuf,EAAQ,WAAWvf,CAAI,EACnD,CAACoqB,EAAO7K,EAAQ,MAAMvf,CAAI,CAAC,EAE3B,CAACoqB,EAAM,OAAO,CAAC7K,CAAO,CAAC,EAAGvf,CAAI,EAJ9B,CAACoqB,EAAOpqB,CAAI,EAOvB,CAAC,GAAI,IAAI,CACjB,EACI,OAAImqB,GACFtJ,EAAM,KAAKsJ,CAAK,EAEXtJ,CACR,CAOD,OAAO,IAAIqJ,EAAW,CACpB,IAAIf,EAAQ,KACVkB,EAAe,EACjB,MAAM/V,EAAU,CAAE,EAChBgW,EAAOJ,EAAU,IAAKnuB,GAAM,CAC1B,CAAE,KAAMA,EAAE,EAAG,KAAM,GAAK,EACxB,CAAE,KAAMA,EAAE,EAAG,KAAM,GAAK,CAChC,CAAO,EACDwuB,EAAY,MAAM,UAAU,OAAO,GAAGD,CAAI,EAC1CruB,EAAMsuB,EAAU,KAAK,CAAC9nB,EAAGC,IAAMD,EAAE,KAAOC,EAAE,IAAI,EAEhD,UAAW3G,KAAKE,EACdouB,GAAgBtuB,EAAE,OAAS,IAAM,EAAI,GAEjCsuB,IAAiB,EACnBlB,EAAQptB,EAAE,MAENotB,GAAS,CAACA,GAAU,CAACptB,EAAE,MACzBuY,EAAQ,KAAK+U,GAAS,cAAcF,EAAOptB,EAAE,IAAI,CAAC,EAGpDotB,EAAQ,MAIZ,OAAOE,GAAS,MAAM/U,CAAO,CAC9B,CAOD,cAAc4V,EAAW,CACvB,OAAOb,GAAS,IAAI,CAAC,IAAI,EAAE,OAAOa,CAAS,CAAC,EACzC,IAAKnuB,GAAM,KAAK,aAAaA,CAAC,CAAC,EAC/B,OAAQA,GAAMA,GAAK,CAACA,EAAE,QAAO,CAAE,CACnC,CAMD,UAAW,CACT,OAAK,KAAK,QACH,IAAI,KAAK,EAAE,MAAO,OAAM,KAAK,EAAE,MAAO,KADnByqB,EAE3B,CAMD,CAAC,OAAO,IAAI,4BAA4B,CAAC,GAAI,CAC3C,OAAI,KAAK,QACA,qBAAqB,KAAK,EAAE,MAAO,WAAU,KAAK,EAAE,MAAO,MAE3D,+BAA+B,KAAK,aAAa,IAE3D,CAoBD,eAAe9G,EAAa1B,GAAoBxR,EAAO,GAAI,CACzD,OAAO,KAAK,QACR6S,GAAU,OAAO,KAAK,EAAE,IAAI,MAAM7S,CAAI,EAAGkT,CAAU,EAAE,eAAe,IAAI,EACxE8G,EACL,CAQD,MAAMha,EAAM,CACV,OAAK,KAAK,QACH,GAAG,KAAK,EAAE,MAAMA,CAAI,CAAC,IAAI,KAAK,EAAE,MAAMA,CAAI,CAAC,GADxBga,EAE3B,CAQD,WAAY,CACV,OAAK,KAAK,QACH,GAAG,KAAK,EAAE,UAAW,KAAI,KAAK,EAAE,UAAW,IADxBA,EAE3B,CASD,UAAUha,EAAM,CACd,OAAK,KAAK,QACH,GAAG,KAAK,EAAE,UAAUA,CAAI,CAAC,IAAI,KAAK,EAAE,UAAUA,CAAI,CAAC,GADhCga,EAE3B,CAaD,SAASgE,EAAY,CAAE,UAAAC,EAAY,KAAK,EAAK,GAAI,CAC/C,OAAK,KAAK,QACH,GAAG,KAAK,EAAE,SAASD,CAAU,CAAC,GAAGC,CAAS,GAAG,KAAK,EAAE,SAASD,CAAU,CAAC,GADrDhE,EAE3B,CAcD,WAAW3b,EAAM2B,EAAM,CACrB,OAAK,KAAK,QAGH,KAAK,EAAE,KAAK,KAAK,EAAG3B,EAAM2B,CAAI,EAF5B0a,GAAS,QAAQ,KAAK,aAAa,CAG7C,CASD,aAAawD,EAAO,CAClB,OAAOrB,GAAS,cAAcqB,EAAM,KAAK,CAAC,EAAGA,EAAM,KAAK,CAAC,CAAC,CAC3D,CACH,CCroBe,MAAMC,EAAK,CAMxB,OAAO,OAAOzd,EAAOiG,GAAS,YAAa,CACzC,MAAMyX,EAAQ7Z,GAAS,IAAG,EAAG,QAAQ7D,CAAI,EAAE,IAAI,CAAE,MAAO,EAAI,GAE5D,MAAO,CAACA,EAAK,aAAe0d,EAAM,SAAWA,EAAM,IAAI,CAAE,MAAO,CAAG,GAAE,MACtE,CAOD,OAAO,gBAAgB1d,EAAM,CAC3B,OAAOmB,GAAS,YAAYnB,CAAI,CACjC,CAgBD,OAAO,cAAc4H,EAAO,CAC1B,OAAOD,GAAcC,EAAO3B,GAAS,WAAW,CACjD,CASD,OAAO,eAAe,CAAE,OAAAtG,EAAS,KAAM,OAAAge,EAAS,IAAM,EAAG,GAAI,CAC3D,OAAQA,GAAU9X,GAAO,OAAOlG,CAAM,GAAG,gBAC1C,CAUD,OAAO,0BAA0B,CAAE,OAAAA,EAAS,KAAM,OAAAge,EAAS,IAAM,EAAG,GAAI,CACtE,OAAQA,GAAU9X,GAAO,OAAOlG,CAAM,GAAG,uBAC1C,CASD,OAAO,mBAAmB,CAAE,OAAAA,EAAS,KAAM,OAAAge,EAAS,IAAM,EAAG,GAAI,CAE/D,OAAQA,GAAU9X,GAAO,OAAOlG,CAAM,GAAG,eAAc,EAAG,OAC3D,CAmBD,OAAO,OACLsE,EAAS,OACT,CAAE,OAAAtE,EAAS,KAAM,gBAAA2D,EAAkB,KAAM,OAAAqa,EAAS,KAAM,eAAAla,EAAiB,SAAS,EAAK,CAAE,EACzF,CACA,OAAQka,GAAU9X,GAAO,OAAOlG,EAAQ2D,EAAiBG,CAAc,GAAG,OAAOQ,CAAM,CACxF,CAeD,OAAO,aACLA,EAAS,OACT,CAAE,OAAAtE,EAAS,KAAM,gBAAA2D,EAAkB,KAAM,OAAAqa,EAAS,KAAM,eAAAla,EAAiB,SAAS,EAAK,CAAE,EACzF,CACA,OAAQka,GAAU9X,GAAO,OAAOlG,EAAQ2D,EAAiBG,CAAc,GAAG,OAAOQ,EAAQ,EAAI,CAC9F,CAgBD,OAAO,SAASA,EAAS,OAAQ,CAAE,OAAAtE,EAAS,KAAM,gBAAA2D,EAAkB,KAAM,OAAAqa,EAAS,IAAI,EAAK,GAAI,CAC9F,OAAQA,GAAU9X,GAAO,OAAOlG,EAAQ2D,EAAiB,IAAI,GAAG,SAASW,CAAM,CAChF,CAcD,OAAO,eACLA,EAAS,OACT,CAAE,OAAAtE,EAAS,KAAM,gBAAA2D,EAAkB,KAAM,OAAAqa,EAAS,IAAI,EAAK,CAAE,EAC7D,CACA,OAAQA,GAAU9X,GAAO,OAAOlG,EAAQ2D,EAAiB,IAAI,GAAG,SAASW,EAAQ,EAAI,CACtF,CAUD,OAAO,UAAU,CAAE,OAAAtE,EAAS,IAAI,EAAK,GAAI,CACvC,OAAOkG,GAAO,OAAOlG,CAAM,EAAE,UAAS,CACvC,CAYD,OAAO,KAAKsE,EAAS,QAAS,CAAE,OAAAtE,EAAS,IAAM,EAAG,GAAI,CACpD,OAAOkG,GAAO,OAAOlG,EAAQ,KAAM,SAAS,EAAE,KAAKsE,CAAM,CAC1D,CAWD,OAAO,UAAW,CAChB,MAAO,CAAE,SAAUwB,GAAW,EAAI,WAAY6B,GAAmB,EAClE,CACH,CC1MA,SAASsW,GAAQC,EAASC,EAAO,CAC/B,MAAMC,EAAena,GAAOA,EAAG,MAAM,EAAG,CAAE,cAAe,EAAI,CAAE,EAAE,QAAQ,KAAK,EAAE,QAAS,EACvFD,EAAKoa,EAAYD,CAAK,EAAIC,EAAYF,CAAO,EAC/C,OAAO,KAAK,MAAM7D,GAAS,WAAWrW,CAAE,EAAE,GAAG,MAAM,CAAC,CACtD,CAEA,SAASqa,GAAe1J,EAAQwJ,EAAO7N,EAAO,CAC5C,MAAMgO,EAAU,CACd,CAAC,QAAS,CAAC1oB,EAAGC,IAAMA,EAAE,KAAOD,EAAE,IAAI,EACnC,CAAC,WAAY,CAACA,EAAGC,IAAMA,EAAE,QAAUD,EAAE,SAAWC,EAAE,KAAOD,EAAE,MAAQ,CAAC,EACpE,CAAC,SAAU,CAACA,EAAGC,IAAMA,EAAE,MAAQD,EAAE,OAASC,EAAE,KAAOD,EAAE,MAAQ,EAAE,EAC/D,CACE,QACA,CAACA,EAAGC,IAAM,CACR,MAAM0oB,EAAON,GAAQroB,EAAGC,CAAC,EACzB,OAAQ0oB,EAAQA,EAAO,GAAM,CAC9B,CACF,EACD,CAAC,OAAQN,EAAO,CACpB,EAEQxW,EAAU,GACVyW,EAAUvJ,EAChB,IAAI6J,EAAaC,EAUjB,SAAW,CAACzgB,EAAM0gB,CAAM,IAAKJ,EACvBhO,EAAM,QAAQtS,CAAI,GAAK,IACzBwgB,EAAcxgB,EAEdyJ,EAAQzJ,CAAI,EAAI0gB,EAAO/J,EAAQwJ,CAAK,EACpCM,EAAYP,EAAQ,KAAKzW,CAAO,EAE5BgX,EAAYN,GAEd1W,EAAQzJ,CAAI,IACZ2W,EAASuJ,EAAQ,KAAKzW,CAAO,EAKzBkN,EAASwJ,IAEXM,EAAY9J,EAEZlN,EAAQzJ,CAAI,IACZ2W,EAASuJ,EAAQ,KAAKzW,CAAO,IAG/BkN,EAAS8J,GAKf,MAAO,CAAC9J,EAAQlN,EAASgX,EAAWD,CAAW,CACjD,CAEe,SAAQG,GAAET,EAASC,EAAO7N,EAAO3Q,EAAM,CACpD,GAAI,CAACgV,EAAQlN,EAASgX,EAAWD,CAAW,EAAIH,GAAeH,EAASC,EAAO7N,CAAK,EAEpF,MAAMsO,EAAkBT,EAAQxJ,EAE1BkK,EAAkBvO,EAAM,OAC3BxB,GAAM,CAAC,QAAS,UAAW,UAAW,cAAc,EAAE,QAAQA,CAAC,GAAK,CACzE,EAEM+P,EAAgB,SAAW,IACzBJ,EAAYN,IACdM,EAAY9J,EAAO,KAAK,CAAE,CAAC6J,CAAW,EAAG,CAAC,CAAE,GAG1CC,IAAc9J,IAChBlN,EAAQ+W,CAAW,GAAK/W,EAAQ+W,CAAW,GAAK,GAAKI,GAAmBH,EAAY9J,KAIxF,MAAM6G,EAAWnB,GAAS,WAAW5S,EAAS9H,CAAI,EAElD,OAAIkf,EAAgB,OAAS,EACpBxE,GAAS,WAAWuE,EAAiBjf,CAAI,EAC7C,QAAQ,GAAGkf,CAAe,EAC1B,KAAKrD,CAAQ,EAETA,CAEX,CC9FA,MAAMsD,GAAmB,CACvB,KAAM,QACN,QAAS,QACT,KAAM,QACN,KAAM,QACN,KAAM,QACN,SAAU,QACV,KAAM,QACN,QAAS,wBACT,KAAM,QACN,KAAM,QACN,KAAM,QACN,KAAM,QACN,KAAM,QACN,KAAM,QACN,KAAM,QACN,KAAM,QACN,QAAS,QACT,KAAM,QACN,KAAM,QACN,KAAM,QACN,KAAM,KACR,EAEMC,GAAwB,CAC5B,KAAM,CAAC,KAAM,IAAI,EACjB,QAAS,CAAC,KAAM,IAAI,EACpB,KAAM,CAAC,KAAM,IAAI,EACjB,KAAM,CAAC,KAAM,IAAI,EACjB,KAAM,CAAC,KAAM,IAAI,EACjB,SAAU,CAAC,MAAO,KAAK,EACvB,KAAM,CAAC,KAAM,IAAI,EACjB,KAAM,CAAC,KAAM,IAAI,EACjB,KAAM,CAAC,KAAM,IAAI,EACjB,KAAM,CAAC,KAAM,IAAI,EACjB,KAAM,CAAC,KAAM,IAAI,EACjB,KAAM,CAAC,KAAM,IAAI,EACjB,KAAM,CAAC,KAAM,IAAI,EACjB,KAAM,CAAC,KAAM,IAAI,EACjB,KAAM,CAAC,KAAM,IAAI,EACjB,QAAS,CAAC,KAAM,IAAI,EACpB,KAAM,CAAC,KAAM,IAAI,EACjB,KAAM,CAAC,KAAM,IAAI,EACjB,KAAM,CAAC,KAAM,IAAI,CACnB,EAEMC,GAAeF,GAAiB,QAAQ,QAAQ,WAAY,EAAE,EAAE,MAAM,EAAE,EAEvE,SAASG,GAAY7mB,EAAK,CAC/B,IAAIlG,EAAQ,SAASkG,EAAK,EAAE,EAC5B,GAAI,MAAMlG,CAAK,EAAG,CAChBA,EAAQ,GACR,QAAShD,EAAI,EAAGA,EAAIkJ,EAAI,OAAQlJ,IAAK,CACnC,MAAMoB,EAAO8H,EAAI,WAAWlJ,CAAC,EAE7B,GAAIkJ,EAAIlJ,CAAC,EAAE,OAAO4vB,GAAiB,OAAO,IAAM,GAC9C5sB,GAAS8sB,GAAa,QAAQ5mB,EAAIlJ,CAAC,CAAC,MAEpC,WAAW+C,KAAO8sB,GAAuB,CACvC,KAAM,CAAC/iB,EAAKf,CAAG,EAAI8jB,GAAsB9sB,CAAG,EACxC3B,GAAQ0L,GAAO1L,GAAQ2K,IACzB/I,GAAS5B,EAAO0L,EAEnB,CAEJ,CACD,OAAO,SAAS9J,EAAO,EAAE,CAC7B,KACI,QAAOA,CAEX,CAEO,SAASgtB,GAAW,CAAE,gBAAAvb,GAAmBwb,EAAS,GAAI,CAC3D,OAAO,IAAI,OAAO,GAAGL,GAAiBnb,GAAmB,MAAM,CAAC,GAAGwb,CAAM,EAAE,CAC7E,CClEA,MAAMC,GAAc,oDAEpB,SAASC,GAAQtK,EAAOuK,EAAQpwB,GAAMA,EAAG,CACvC,MAAO,CAAE,MAAA6lB,EAAO,MAAO,CAAC,CAAChb,CAAC,IAAMulB,EAAKL,GAAYllB,CAAC,CAAC,EACrD,CAEA,MAAMwlB,GAAO,IACPC,GAAc,KAAKD,EAAI,IACvBE,GAAoB,IAAI,OAAOD,GAAa,GAAG,EAErD,SAASE,GAAa3lB,EAAG,CAGvB,OAAOA,EAAE,QAAQ,MAAO,MAAM,EAAE,QAAQ0lB,GAAmBD,EAAW,CACxE,CAEA,SAASG,GAAqB5lB,EAAG,CAC/B,OAAOA,EACJ,QAAQ,MAAO,EAAE,EACjB,QAAQ0lB,GAAmB,GAAG,EAC9B,aACL,CAEA,SAASG,GAAMC,EAASC,EAAY,CAClC,OAAID,IAAY,KACP,KAEA,CACL,MAAO,OAAOA,EAAQ,IAAIH,EAAY,EAAE,KAAK,GAAG,CAAC,EACjD,MAAO,CAAC,CAAC3lB,CAAC,IACR8lB,EAAQ,UAAW,GAAMF,GAAqB5lB,CAAC,IAAM4lB,GAAqB,CAAC,CAAC,EAAIG,CACxF,CAEA,CAEA,SAASzwB,GAAO0lB,EAAOgL,EAAQ,CAC7B,MAAO,CAAE,MAAAhL,EAAO,MAAO,CAAC,CAAG,CAAA9Y,EAAGE,CAAC,IAAM0L,GAAa5L,EAAGE,CAAC,EAAG,OAAA4jB,CAAM,CACjE,CAEA,SAASC,GAAOjL,EAAO,CACrB,MAAO,CAAE,MAAAA,EAAO,MAAO,CAAC,CAAChb,CAAC,IAAMA,EAClC,CAEA,SAASkmB,GAAY/tB,EAAO,CAC1B,OAAOA,EAAM,QAAQ,8BAA+B,MAAM,CAC5D,CAMA,SAASguB,GAAajP,EAAO5M,EAAK,CAChC,MAAM8b,EAAMjB,GAAW7a,CAAG,EACxB+b,EAAMlB,GAAW7a,EAAK,KAAK,EAC3Bgc,EAAQnB,GAAW7a,EAAK,KAAK,EAC7Bic,EAAOpB,GAAW7a,EAAK,KAAK,EAC5Bkc,EAAMrB,GAAW7a,EAAK,KAAK,EAC3Bmc,EAAWtB,GAAW7a,EAAK,OAAO,EAClCoc,EAAavB,GAAW7a,EAAK,OAAO,EACpCqc,EAAWxB,GAAW7a,EAAK,OAAO,EAClCsc,EAAYzB,GAAW7a,EAAK,OAAO,EACnCuc,EAAY1B,GAAW7a,EAAK,OAAO,EACnCwc,EAAY3B,GAAW7a,EAAK,OAAO,EACnC4P,EAAWnL,IAAO,CAAE,MAAO,OAAOmX,GAAYnX,EAAE,GAAG,CAAC,EAAG,MAAO,CAAC,CAAC/O,CAAC,IAAMA,EAAG,QAAS,KA4H/EiE,GA3HO8K,GAAM,CACf,GAAImI,EAAM,QACR,OAAOgD,EAAQnL,CAAC,EAElB,OAAQA,EAAE,IAAG,CAEX,IAAK,IACH,OAAO8W,GAAMvb,EAAI,KAAK,OAAO,EAAG,CAAC,EACnC,IAAK,KACH,OAAOub,GAAMvb,EAAI,KAAK,MAAM,EAAG,CAAC,EAElC,IAAK,IACH,OAAOgb,GAAQqB,CAAQ,EACzB,IAAK,KACH,OAAOrB,GAAQuB,EAAW5S,EAAc,EAC1C,IAAK,OACH,OAAOqR,GAAQiB,CAAI,EACrB,IAAK,QACH,OAAOjB,GAAQwB,CAAS,EAC1B,IAAK,SACH,OAAOxB,GAAQkB,CAAG,EAEpB,IAAK,IACH,OAAOlB,GAAQmB,CAAQ,EACzB,IAAK,KACH,OAAOnB,GAAQe,CAAG,EACpB,IAAK,MACH,OAAOR,GAAMvb,EAAI,OAAO,QAAS,EAAI,EAAG,CAAC,EAC3C,IAAK,OACH,OAAOub,GAAMvb,EAAI,OAAO,OAAQ,EAAI,EAAG,CAAC,EAC1C,IAAK,IACH,OAAOgb,GAAQmB,CAAQ,EACzB,IAAK,KACH,OAAOnB,GAAQe,CAAG,EACpB,IAAK,MACH,OAAOR,GAAMvb,EAAI,OAAO,QAAS,EAAK,EAAG,CAAC,EAC5C,IAAK,OACH,OAAOub,GAAMvb,EAAI,OAAO,OAAQ,EAAK,EAAG,CAAC,EAE3C,IAAK,IACH,OAAOgb,GAAQmB,CAAQ,EACzB,IAAK,KACH,OAAOnB,GAAQe,CAAG,EAEpB,IAAK,IACH,OAAOf,GAAQoB,CAAU,EAC3B,IAAK,MACH,OAAOpB,GAAQgB,CAAK,EAEtB,IAAK,KACH,OAAOhB,GAAQe,CAAG,EACpB,IAAK,IACH,OAAOf,GAAQmB,CAAQ,EACzB,IAAK,KACH,OAAOnB,GAAQe,CAAG,EACpB,IAAK,IACH,OAAOf,GAAQmB,CAAQ,EACzB,IAAK,KACH,OAAOnB,GAAQe,CAAG,EACpB,IAAK,IACH,OAAOf,GAAQmB,CAAQ,EACzB,IAAK,IACH,OAAOnB,GAAQmB,CAAQ,EACzB,IAAK,KACH,OAAOnB,GAAQe,CAAG,EACpB,IAAK,IACH,OAAOf,GAAQmB,CAAQ,EACzB,IAAK,KACH,OAAOnB,GAAQe,CAAG,EACpB,IAAK,IACH,OAAOf,GAAQoB,CAAU,EAC3B,IAAK,MACH,OAAOpB,GAAQgB,CAAK,EACtB,IAAK,IACH,OAAOL,GAAOW,CAAS,EACzB,IAAK,KACH,OAAOX,GAAOQ,CAAQ,EACxB,IAAK,MACH,OAAOnB,GAAQc,CAAG,EAEpB,IAAK,IACH,OAAOP,GAAMvb,EAAI,UAAW,EAAE,CAAC,EAEjC,IAAK,OACH,OAAOgb,GAAQiB,CAAI,EACrB,IAAK,KACH,OAAOjB,GAAQuB,EAAW5S,EAAc,EAE1C,IAAK,IACH,OAAOqR,GAAQmB,CAAQ,EACzB,IAAK,KACH,OAAOnB,GAAQe,CAAG,EAEpB,IAAK,IACL,IAAK,IACH,OAAOf,GAAQc,CAAG,EACpB,IAAK,MACH,OAAOP,GAAMvb,EAAI,SAAS,QAAS,EAAK,EAAG,CAAC,EAC9C,IAAK,OACH,OAAOub,GAAMvb,EAAI,SAAS,OAAQ,EAAK,EAAG,CAAC,EAC7C,IAAK,MACH,OAAOub,GAAMvb,EAAI,SAAS,QAAS,EAAI,EAAG,CAAC,EAC7C,IAAK,OACH,OAAOub,GAAMvb,EAAI,SAAS,OAAQ,EAAI,EAAG,CAAC,EAE5C,IAAK,IACL,IAAK,KACH,OAAOhV,GAAO,IAAI,OAAO,QAAQmxB,EAAS,MAAM,SAASJ,EAAI,MAAM,KAAK,EAAG,CAAC,EAC9E,IAAK,MACH,OAAO/wB,GAAO,IAAI,OAAO,QAAQmxB,EAAS,MAAM,KAAKJ,EAAI,MAAM,IAAI,EAAG,CAAC,EAGzE,IAAK,IACH,OAAOJ,GAAO,oBAAoB,EAGpC,IAAK,IACH,OAAOA,GAAO,WAAW,EAC3B,QACE,OAAO/L,EAAQnL,CAAC,CACnB,CACP,GAEuBmI,CAAK,GAAK,CAC7B,cAAemO,EACnB,EAEE,OAAAphB,EAAK,MAAQiT,EAENjT,CACT,CAEA,MAAM8iB,GAA0B,CAC9B,KAAM,CACJ,UAAW,KACX,QAAS,OACV,EACD,MAAO,CACL,QAAS,IACT,UAAW,KACX,MAAO,MACP,KAAM,MACP,EACD,IAAK,CACH,QAAS,IACT,UAAW,IACZ,EACD,QAAS,CACP,MAAO,MACP,KAAM,MACP,EACD,UAAW,IACX,UAAW,IACX,OAAQ,CACN,QAAS,IACT,UAAW,IACZ,EACD,OAAQ,CACN,QAAS,IACT,UAAW,IACZ,EACD,OAAQ,CACN,QAAS,IACT,UAAW,IACZ,EACD,OAAQ,CACN,QAAS,IACT,UAAW,IACZ,EACD,aAAc,CACZ,KAAM,QACN,MAAO,KACR,CACH,EAEA,SAASC,GAAarb,EAAMmN,EAAYmO,EAAc,CACpD,KAAM,CAAE,KAAA5f,EAAM,MAAAlP,CAAO,EAAGwT,EAExB,GAAItE,IAAS,UAAW,CACtB,MAAM6f,EAAU,QAAQ,KAAK/uB,CAAK,EAClC,MAAO,CACL,QAAS,CAAC+uB,EACV,IAAKA,EAAU,IAAM/uB,CAC3B,CACG,CAED,MAAMgvB,EAAQrO,EAAWzR,CAAI,EAK7B,IAAI+f,EAAa/f,EACbA,IAAS,SACPyR,EAAW,QAAU,KACvBsO,EAAatO,EAAW,OAAS,SAAW,SACnCA,EAAW,WAAa,KAC7BA,EAAW,YAAc,OAASA,EAAW,YAAc,MAC7DsO,EAAa,SAEbA,EAAa,SAKfA,EAAaH,EAAa,OAAS,SAAW,UAGlD,IAAI3uB,EAAMyuB,GAAwBK,CAAU,EAK5C,GAJI,OAAO9uB,GAAQ,WACjBA,EAAMA,EAAI6uB,CAAK,GAGb7uB,EACF,MAAO,CACL,QAAS,GACT,IAAAA,CACN,CAIA,CAEA,SAAS+uB,GAAW9Q,EAAO,CAEzB,MAAO,CAAC,IADGA,EAAM,IAAKxB,GAAMA,EAAE,KAAK,EAAE,OAAO,CAACtY,EAAGkF,IAAM,GAAGlF,CAAC,IAAIkF,EAAE,MAAM,IAAK,EAAE,CAC/D,IAAK4U,CAAK,CAC1B,CAEA,SAAS4E,GAAMjN,EAAO8M,EAAOsM,EAAU,CACrC,MAAMC,EAAUrZ,EAAM,MAAM8M,CAAK,EAEjC,GAAIuM,EAAS,CACX,MAAMC,EAAM,GACZ,IAAIC,EAAa,EACjB,UAAWtyB,KAAKmyB,EACd,GAAIxU,GAAewU,EAAUnyB,CAAC,EAAG,CAC/B,MAAM+M,EAAIolB,EAASnyB,CAAC,EAClB6wB,EAAS9jB,EAAE,OAASA,EAAE,OAAS,EAAI,EACjC,CAACA,EAAE,SAAWA,EAAE,QAClBslB,EAAItlB,EAAE,MAAM,IAAI,CAAC,CAAC,EAAIA,EAAE,MAAMqlB,EAAQ,MAAME,EAAYA,EAAazB,CAAM,CAAC,GAE9EyB,GAAczB,CACf,CAEH,MAAO,CAACuB,EAASC,CAAG,CACxB,KACI,OAAO,CAACD,EAAS,EAAE,CAEvB,CAEA,SAASG,GAAoBH,EAAS,CACpC,MAAMI,EAAWzQ,GAAU,CACzB,OAAQA,EAAK,CACX,IAAK,IACH,MAAO,cACT,IAAK,IACH,MAAO,SACT,IAAK,IACH,MAAO,SACT,IAAK,IACL,IAAK,IACH,MAAO,OACT,IAAK,IACH,MAAO,MACT,IAAK,IACH,MAAO,UACT,IAAK,IACL,IAAK,IACH,MAAO,QACT,IAAK,IACH,MAAO,OACT,IAAK,IACL,IAAK,IACH,MAAO,UACT,IAAK,IACH,MAAO,aACT,IAAK,IACH,MAAO,WACT,IAAK,IACH,MAAO,UACT,QACE,OAAO,IACV,CACL,EAEE,IAAI5Q,EAAO,KACPshB,EACJ,OAAKrgB,GAAYggB,EAAQ,CAAC,IACxBjhB,EAAOmB,GAAS,OAAO8f,EAAQ,CAAC,GAG7BhgB,GAAYggB,EAAQ,CAAC,IACnBjhB,IACHA,EAAO,IAAIuH,GAAgB0Z,EAAQ,CAAC,GAEtCK,EAAiBL,EAAQ,GAGtBhgB,GAAYggB,EAAQ,CAAC,IACxBA,EAAQ,GAAKA,EAAQ,EAAI,GAAK,EAAI,GAG/BhgB,GAAYggB,EAAQ,CAAC,IACpBA,EAAQ,EAAI,IAAMA,EAAQ,IAAM,EAClCA,EAAQ,GAAK,GACJA,EAAQ,IAAM,IAAMA,EAAQ,IAAM,IAC3CA,EAAQ,EAAI,IAIZA,EAAQ,IAAM,GAAKA,EAAQ,IAC7BA,EAAQ,EAAI,CAACA,EAAQ,GAGlBhgB,GAAYggB,EAAQ,CAAC,IACxBA,EAAQ,EAAIhU,GAAYgU,EAAQ,CAAC,GAY5B,CATM,OAAO,KAAKA,CAAO,EAAE,OAAO,CAAC5lB,EAAGvJ,IAAM,CACjD,MAAMqE,EAAIkrB,EAAQvvB,CAAC,EACnB,OAAIqE,IACFkF,EAAElF,CAAC,EAAI8qB,EAAQnvB,CAAC,GAGXuJ,CACR,EAAE,CAAE,GAES2E,EAAMshB,CAAc,CACpC,CAEA,IAAIC,GAAqB,KAEzB,SAASC,IAAmB,CAC1B,OAAKD,KACHA,GAAqB1d,GAAS,WAAW,aAAa,GAGjD0d,EACT,CAEA,SAASE,GAAsB7Q,EAAOjR,EAAQ,CAC5C,GAAIiR,EAAM,QACR,OAAOA,EAGT,MAAM4B,EAAaL,GAAU,uBAAuBvB,EAAM,GAAG,EACvD6C,EAASiO,GAAmBlP,EAAY7S,CAAM,EAEpD,OAAI8T,GAAU,MAAQA,EAAO,SAAS,MAAS,EACtC7C,EAGF6C,CACT,CAEO,SAASkO,GAAkBlO,EAAQ9T,EAAQ,CAChD,OAAO,MAAM,UAAU,OAAO,GAAG8T,EAAO,IAAK,GAAMgO,GAAsB,EAAG9hB,CAAM,CAAC,CAAC,CACtF,CAMO,SAASiiB,GAAkBjiB,EAAQiI,EAAOrI,EAAQ,CACvD,MAAMkU,EAASkO,GAAkBxP,GAAU,YAAY5S,CAAM,EAAGI,CAAM,EACpEsQ,EAAQwD,EAAO,IAAKhL,GAAMoX,GAAapX,EAAG9I,CAAM,CAAC,EACjDkiB,EAAoB5R,EAAM,KAAMxH,GAAMA,EAAE,aAAa,EAEvD,GAAIoZ,EACF,MAAO,CAAE,MAAAja,EAAO,OAAA6L,EAAQ,cAAeoO,EAAkB,aAAa,EACjE,CACL,KAAM,CAACC,EAAad,CAAQ,EAAID,GAAW9Q,CAAK,EAC9CyE,EAAQ,OAAOoN,EAAa,GAAG,EAC/B,CAACC,EAAYd,CAAO,EAAIpM,GAAMjN,EAAO8M,EAAOsM,CAAQ,EACpD,CAACxlB,EAAQwE,EAAMshB,CAAc,EAAIL,EAC7BG,GAAoBH,CAAO,EAC3B,CAAC,KAAM,KAAM,MAAS,EAC5B,GAAIzU,GAAeyU,EAAS,GAAG,GAAKzU,GAAeyU,EAAS,GAAG,EAC7D,MAAM,IAAIxjB,GACR,uDACR,EAEI,MAAO,CAAE,MAAAmK,EAAO,OAAA6L,EAAQ,MAAAiB,EAAO,WAAAqN,EAAY,QAAAd,EAAS,OAAAzlB,EAAQ,KAAAwE,EAAM,eAAAshB,EACnE,CACH,CAEO,SAASU,GAAgBriB,EAAQiI,EAAOrI,EAAQ,CACrD,KAAM,CAAE,OAAA/D,EAAQ,KAAAwE,EAAM,eAAAshB,EAAgB,cAAAW,GAAkBL,GAAkBjiB,EAAQiI,EAAOrI,CAAM,EAC/F,MAAO,CAAC/D,EAAQwE,EAAMshB,EAAgBW,CAAa,CACrD,CAEO,SAASP,GAAmBlP,EAAY7S,EAAQ,CACrD,GAAI,CAAC6S,EACH,OAAO,KAIT,MAAMrL,EADYgL,GAAU,OAAOxS,EAAQ6S,CAAU,EAChC,YAAYgP,GAAkB,GAC7Cpc,EAAQ+B,EAAG,gBACXwZ,EAAexZ,EAAG,kBACxB,OAAO/B,EAAM,IAAK3R,GAAMitB,GAAajtB,EAAG+e,EAAYmO,CAAY,CAAC,CACnE,CCpaA,MAAMrH,GAAU,mBACV4I,GAAW,OAEjB,SAASC,GAAgBniB,EAAM,CAC7B,OAAO,IAAI0I,GAAQ,mBAAoB,aAAa1I,EAAK,IAAI,oBAAoB,CACnF,CAMA,SAASoiB,GAAuBxe,EAAI,CAClC,OAAIA,EAAG,WAAa,OAClBA,EAAG,SAAW8F,GAAgB9F,EAAG,CAAC,GAE7BA,EAAG,QACZ,CAKA,SAASye,GAA4Bze,EAAI,CACvC,OAAIA,EAAG,gBAAkB,OACvBA,EAAG,cAAgB8F,GACjB9F,EAAG,EACHA,EAAG,IAAI,sBAAuB,EAC9BA,EAAG,IAAI,eAAgB,CAC7B,GAESA,EAAG,aACZ,CAIA,SAAS5M,GAAMsrB,EAAMzb,EAAM,CACzB,MAAMwL,EAAU,CACd,GAAIiQ,EAAK,GACT,KAAMA,EAAK,KACX,EAAGA,EAAK,EACR,EAAGA,EAAK,EACR,IAAKA,EAAK,IACV,QAASA,EAAK,OAClB,EACE,OAAO,IAAIze,GAAS,CAAE,GAAGwO,EAAS,GAAGxL,EAAM,IAAKwL,CAAO,CAAE,CAC3D,CAIA,SAASkQ,GAAUC,EAAS1W,EAAG2W,EAAI,CAEjC,IAAIC,EAAWF,EAAU1W,EAAI,GAAK,IAGlC,MAAM6W,EAAKF,EAAG,OAAOC,CAAQ,EAG7B,GAAI5W,IAAM6W,EACR,MAAO,CAACD,EAAU5W,CAAC,EAIrB4W,IAAaC,EAAK7W,GAAK,GAAK,IAG5B,MAAM8W,EAAKH,EAAG,OAAOC,CAAQ,EAC7B,OAAIC,IAAOC,EACF,CAACF,EAAUC,CAAE,EAIf,CAACH,EAAU,KAAK,IAAIG,EAAIC,CAAE,EAAI,GAAK,IAAM,KAAK,IAAID,EAAIC,CAAE,CAAC,CAClE,CAGA,SAASC,GAAQxjB,EAAIrQ,EAAQ,CAC3BqQ,GAAMrQ,EAAS,GAAK,IAEpB,MAAMgF,EAAI,IAAI,KAAKqL,CAAE,EAErB,MAAO,CACL,KAAMrL,EAAE,eAAgB,EACxB,MAAOA,EAAE,YAAW,EAAK,EACzB,IAAKA,EAAE,WAAY,EACnB,KAAMA,EAAE,YAAa,EACrB,OAAQA,EAAE,cAAe,EACzB,OAAQA,EAAE,cAAe,EACzB,YAAaA,EAAE,mBAAoB,CACvC,CACA,CAGA,SAAS8uB,GAAQpxB,EAAK1C,EAAQgR,EAAM,CAClC,OAAOuiB,GAAU1gB,GAAanQ,CAAG,EAAG1C,EAAQgR,CAAI,CAClD,CAGA,SAAS+iB,GAAWT,EAAMjP,EAAK,CAC7B,MAAM2P,EAAOV,EAAK,EAChBjhB,EAAOihB,EAAK,EAAE,KAAO,KAAK,MAAMjP,EAAI,KAAK,EACzC/R,EAAQghB,EAAK,EAAE,MAAQ,KAAK,MAAMjP,EAAI,MAAM,EAAI,KAAK,MAAMA,EAAI,QAAQ,EAAI,EAC3EjY,EAAI,CACF,GAAGknB,EAAK,EACR,KAAAjhB,EACA,MAAAC,EACA,IACE,KAAK,IAAIghB,EAAK,EAAE,IAAK/W,GAAYlK,EAAMC,CAAK,CAAC,EAC7C,KAAK,MAAM+R,EAAI,IAAI,EACnB,KAAK,MAAMA,EAAI,KAAK,EAAI,CAC3B,EACD4P,EAAcjJ,GAAS,WAAW,CAChC,MAAO3G,EAAI,MAAQ,KAAK,MAAMA,EAAI,KAAK,EACvC,SAAUA,EAAI,SAAW,KAAK,MAAMA,EAAI,QAAQ,EAChD,OAAQA,EAAI,OAAS,KAAK,MAAMA,EAAI,MAAM,EAC1C,MAAOA,EAAI,MAAQ,KAAK,MAAMA,EAAI,KAAK,EACvC,KAAMA,EAAI,KAAO,KAAK,MAAMA,EAAI,IAAI,EACpC,MAAOA,EAAI,MACX,QAASA,EAAI,QACb,QAASA,EAAI,QACb,aAAcA,EAAI,YACxB,CAAK,EAAE,GAAG,cAAc,EACpBmP,EAAU3gB,GAAazG,CAAC,EAE1B,GAAI,CAACiE,EAAIyM,CAAC,EAAIyW,GAAUC,EAASQ,EAAMV,EAAK,IAAI,EAEhD,OAAIW,IAAgB,IAClB5jB,GAAM4jB,EAENnX,EAAIwW,EAAK,KAAK,OAAOjjB,CAAE,GAGlB,CAAE,GAAAA,EAAI,EAAAyM,EACf,CAIA,SAASoX,GAAoBjrB,EAAQkrB,EAAY7jB,EAAMC,EAAQwb,EAAMuG,EAAgB,CACnF,KAAM,CAAE,QAAA8B,EAAS,KAAApjB,CAAM,EAAGV,EAC1B,GAAKrH,GAAU,OAAO,KAAKA,CAAM,EAAE,SAAW,GAAMkrB,EAAY,CAC9D,MAAME,EAAqBF,GAAcnjB,EACvCsiB,EAAOze,GAAS,WAAW5L,EAAQ,CACjC,GAAGqH,EACH,KAAM+jB,EACN,eAAA/B,CACR,CAAO,EACH,OAAO8B,EAAUd,EAAOA,EAAK,QAAQtiB,CAAI,CAC7C,KACI,QAAO6D,GAAS,QACd,IAAI6E,GAAQ,aAAc,cAAcqS,CAAI,wBAAwBxb,CAAM,EAAE,CAClF,CAEA,CAIA,SAAS+jB,GAAa1f,EAAIrE,EAAQgkB,EAAS,GAAM,CAC/C,OAAO3f,EAAG,QACNuO,GAAU,OAAOtM,GAAO,OAAO,OAAO,EAAG,CACvC,OAAA0d,EACA,YAAa,EACrB,CAAO,EAAE,yBAAyB3f,EAAIrE,CAAM,EACtC,IACN,CAEA,SAASikB,GAAU1X,EAAG2X,EAAU,CAC9B,MAAMC,EAAa5X,EAAE,EAAE,KAAO,MAAQA,EAAE,EAAE,KAAO,EACjD,IAAI1Q,EAAI,GACR,OAAIsoB,GAAc5X,EAAE,EAAE,MAAQ,IAAG1Q,GAAK,KACtCA,GAAK2J,GAAS+G,EAAE,EAAE,KAAM4X,EAAa,EAAI,CAAC,EAEtCD,GACFroB,GAAK,IACLA,GAAK2J,GAAS+G,EAAE,EAAE,KAAK,EACvB1Q,GAAK,IACLA,GAAK2J,GAAS+G,EAAE,EAAE,GAAG,IAErB1Q,GAAK2J,GAAS+G,EAAE,EAAE,KAAK,EACvB1Q,GAAK2J,GAAS+G,EAAE,EAAE,GAAG,GAEhB1Q,CACT,CAEA,SAASuoB,GACP7X,EACA2X,EACAG,EACAC,EACAC,EACAC,EACA,CACA,IAAI3oB,EAAI2J,GAAS+G,EAAE,EAAE,IAAI,EACzB,OAAI2X,GACFroB,GAAK,IACLA,GAAK2J,GAAS+G,EAAE,EAAE,MAAM,GACpBA,EAAE,EAAE,cAAgB,GAAKA,EAAE,EAAE,SAAW,GAAK,CAAC8X,KAChDxoB,GAAK,MAGPA,GAAK2J,GAAS+G,EAAE,EAAE,MAAM,GAGtBA,EAAE,EAAE,cAAgB,GAAKA,EAAE,EAAE,SAAW,GAAK,CAAC8X,KAChDxoB,GAAK2J,GAAS+G,EAAE,EAAE,MAAM,GAEpBA,EAAE,EAAE,cAAgB,GAAK,CAAC+X,KAC5BzoB,GAAK,IACLA,GAAK2J,GAAS+G,EAAE,EAAE,YAAa,CAAC,IAIhCgY,IACEhY,EAAE,eAAiBA,EAAE,SAAW,GAAK,CAACiY,EACxC3oB,GAAK,IACI0Q,EAAE,EAAI,GACf1Q,GAAK,IACLA,GAAK2J,GAAS,KAAK,MAAM,CAAC+G,EAAE,EAAI,EAAE,CAAC,EACnC1Q,GAAK,IACLA,GAAK2J,GAAS,KAAK,MAAM,CAAC+G,EAAE,EAAI,EAAE,CAAC,IAEnC1Q,GAAK,IACLA,GAAK2J,GAAS,KAAK,MAAM+G,EAAE,EAAI,EAAE,CAAC,EAClC1Q,GAAK,IACLA,GAAK2J,GAAS,KAAK,MAAM+G,EAAE,EAAI,EAAE,CAAC,IAIlCiY,IACF3oB,GAAK,IAAM0Q,EAAE,KAAK,SAAW,KAExB1Q,CACT,CAGA,MAAM4oB,GAAoB,CACtB,MAAO,EACP,IAAK,EACL,KAAM,EACN,OAAQ,EACR,OAAQ,EACR,YAAa,CACd,EACDC,GAAwB,CACtB,WAAY,EACZ,QAAS,EACT,KAAM,EACN,OAAQ,EACR,OAAQ,EACR,YAAa,CACd,EACDC,GAA2B,CACzB,QAAS,EACT,KAAM,EACN,OAAQ,EACR,OAAQ,EACR,YAAa,CACjB,EAGMtK,GAAe,CAAC,OAAQ,QAAS,MAAO,OAAQ,SAAU,SAAU,aAAa,EACrFuK,GAAmB,CACjB,WACA,aACA,UACA,OACA,SACA,SACA,aACD,EACDC,GAAsB,CAAC,OAAQ,UAAW,OAAQ,SAAU,SAAU,aAAa,EAGrF,SAASC,GAAc1mB,EAAM,CAC3B,MAAM6Q,EAAa,CACjB,KAAM,OACN,MAAO,OACP,MAAO,QACP,OAAQ,QACR,IAAK,MACL,KAAM,MACN,KAAM,OACN,MAAO,OACP,OAAQ,SACR,QAAS,SACT,QAAS,UACT,SAAU,UACV,OAAQ,SACR,QAAS,SACT,YAAa,cACb,aAAc,cACd,QAAS,UACT,SAAU,UACV,WAAY,aACZ,YAAa,aACb,YAAa,aACb,SAAU,WACV,UAAW,WACX,QAAS,SACb,EAAI7Q,EAAK,YAAW,CAAE,EAEpB,GAAI,CAAC6Q,EAAY,MAAM,IAAI9Q,GAAiBC,CAAI,EAEhD,OAAO6Q,CACT,CAEA,SAAS8V,GAA4B3mB,EAAM,CACzC,OAAQA,EAAK,YAAa,GACxB,IAAK,eACL,IAAK,gBACH,MAAO,eACT,IAAK,kBACL,IAAK,mBACH,MAAO,kBACT,IAAK,gBACL,IAAK,iBACH,MAAO,gBACT,QACE,OAAO0mB,GAAc1mB,CAAI,CAC5B,CACH,CAKA,SAAS4mB,GAAQ7yB,EAAK4N,EAAM,CAC1B,MAAMU,EAAO2H,GAAcrI,EAAK,KAAM2G,GAAS,WAAW,EACxDjC,EAAM6B,GAAO,WAAWvG,CAAI,EAC5BklB,EAAQve,GAAS,MAEnB,IAAI5G,EAAI,EAGR,GAAK4B,GAAYvP,EAAI,IAAI,EAevB2N,EAAKmlB,MAfqB,CAC1B,UAAW,KAAK5K,GACV3Y,GAAYvP,EAAI,CAAC,CAAC,IACpBA,EAAI,CAAC,EAAIsyB,GAAkB,CAAC,GAIhC,MAAMhJ,EAAU5P,GAAwB1Z,CAAG,GAAK8Z,GAAmB9Z,CAAG,EACtE,GAAIspB,EACF,OAAOnX,GAAS,QAAQmX,CAAO,EAGjC,MAAMyJ,EAAezkB,EAAK,OAAOwkB,CAAK,EACtC,CAACnlB,EAAI,CAAC,EAAIyjB,GAAQpxB,EAAK+yB,EAAczkB,CAAI,CAC7C,CAIE,OAAO,IAAI6D,GAAS,CAAE,GAAAxE,EAAI,KAAAW,EAAM,IAAAgE,EAAK,CAAC,CAAE,CAC1C,CAEA,SAAS0gB,GAAazI,EAAOC,EAAK5c,EAAM,CACtC,MAAMqlB,EAAQ1jB,GAAY3B,EAAK,KAAK,EAAI,GAAOA,EAAK,MAClDC,EAAS,CAACnE,EAAGuC,KACXvC,EAAI0J,GAAQ1J,EAAGupB,GAASrlB,EAAK,UAAY,EAAI,EAAG,EAAI,EAClC4c,EAAI,IAAI,MAAM5c,CAAI,EAAE,aAAaA,CAAI,EACtC,OAAOlE,EAAGuC,CAAI,GAEjC0gB,EAAU1gB,GACJ2B,EAAK,UACF4c,EAAI,QAAQD,EAAOte,CAAI,EAEd,EADLue,EAAI,QAAQve,CAAI,EAAE,KAAKse,EAAM,QAAQte,CAAI,EAAGA,CAAI,EAAE,IAAIA,CAAI,EAG5Due,EAAI,KAAKD,EAAOte,CAAI,EAAE,IAAIA,CAAI,EAI3C,GAAI2B,EAAK,KACP,OAAOC,EAAO8e,EAAO/e,EAAK,IAAI,EAAGA,EAAK,IAAI,EAG5C,UAAW3B,KAAQ2B,EAAK,MAAO,CAC7B,MAAMoG,EAAQ2Y,EAAO1gB,CAAI,EACzB,GAAI,KAAK,IAAI+H,CAAK,GAAK,EACrB,OAAOnG,EAAOmG,EAAO/H,CAAI,CAE5B,CACD,OAAO4B,EAAO0c,EAAQC,EAAM,GAAK,EAAG5c,EAAK,MAAMA,EAAK,MAAM,OAAS,CAAC,CAAC,CACvE,CAEA,SAASslB,GAASC,EAAS,CACzB,IAAIvlB,EAAO,CAAE,EACXwlB,EACF,OAAID,EAAQ,OAAS,GAAK,OAAOA,EAAQA,EAAQ,OAAS,CAAC,GAAM,UAC/DvlB,EAAOulB,EAAQA,EAAQ,OAAS,CAAC,EACjCC,EAAO,MAAM,KAAKD,CAAO,EAAE,MAAM,EAAGA,EAAQ,OAAS,CAAC,GAEtDC,EAAO,MAAM,KAAKD,CAAO,EAEpB,CAACvlB,EAAMwlB,CAAI,CACpB,CAsBe,MAAMjhB,EAAS,CAI5B,YAAY+W,EAAQ,CAClB,MAAM5a,EAAO4a,EAAO,MAAQ3U,GAAS,YAErC,IAAI+U,EACFJ,EAAO,UACN,OAAO,MAAMA,EAAO,EAAE,EAAI,IAAIlS,GAAQ,eAAe,EAAI,QACxD1I,EAAK,QAAkC,KAAxBmiB,GAAgBniB,CAAI,GAIvC,KAAK,GAAKiB,GAAY2Z,EAAO,EAAE,EAAI3U,GAAS,IAAG,EAAK2U,EAAO,GAE3D,IAAIxf,EAAI,KACN0Q,EAAI,KACN,GAAI,CAACkP,EAGH,GAFkBJ,EAAO,KAAOA,EAAO,IAAI,KAAO,KAAK,IAAMA,EAAO,IAAI,KAAK,OAAO5a,CAAI,EAGtF,CAAC5E,EAAG0Q,CAAC,EAAI,CAAC8O,EAAO,IAAI,EAAGA,EAAO,IAAI,CAAC,MAC/B,CACL,MAAMmK,EAAK/kB,EAAK,OAAO,KAAK,EAAE,EAC9B5E,EAAIynB,GAAQ,KAAK,GAAIkC,CAAE,EACvB/J,EAAU,OAAO,MAAM5f,EAAE,IAAI,EAAI,IAAIsN,GAAQ,eAAe,EAAI,KAChEtN,EAAI4f,EAAU,KAAO5f,EACrB0Q,EAAIkP,EAAU,KAAO+J,CACtB,CAMH,KAAK,MAAQ/kB,EAIb,KAAK,IAAM4a,EAAO,KAAO/U,GAAO,OAAM,EAItC,KAAK,QAAUmV,EAIf,KAAK,SAAW,KAIhB,KAAK,cAAgB,KAIrB,KAAK,EAAI5f,EAIT,KAAK,EAAI0Q,EAIT,KAAK,gBAAkB,EACxB,CAWD,OAAO,KAAM,CACX,OAAO,IAAIjI,GAAS,EAAE,CACvB,CAuBD,OAAO,OAAQ,CACb,KAAM,CAACvE,EAAMwlB,CAAI,EAAIF,GAAS,SAAS,EACrC,CAACvjB,EAAMC,EAAOC,EAAKE,EAAMC,EAAQC,EAAQ8J,CAAW,EAAIqZ,EAC1D,OAAOP,GAAQ,CAAE,KAAAljB,EAAM,MAAAC,EAAO,IAAAC,EAAK,KAAAE,EAAM,OAAAC,EAAQ,OAAAC,EAAQ,YAAA8J,CAAa,EAAEnM,CAAI,CAC7E,CA0BD,OAAO,KAAM,CACX,KAAM,CAACA,EAAMwlB,CAAI,EAAIF,GAAS,SAAS,EACrC,CAACvjB,EAAMC,EAAOC,EAAKE,EAAMC,EAAQC,EAAQ8J,CAAW,EAAIqZ,EAE1D,OAAAxlB,EAAK,KAAOiI,GAAgB,YACrBgd,GAAQ,CAAE,KAAAljB,EAAM,MAAAC,EAAO,IAAAC,EAAK,KAAAE,EAAM,OAAAC,EAAQ,OAAAC,EAAQ,YAAA8J,CAAa,EAAEnM,CAAI,CAC7E,CASD,OAAO,WAAWc,EAAM7Q,EAAU,GAAI,CACpC,MAAM8P,EAAK0M,GAAO3L,CAAI,EAAIA,EAAK,QAAS,EAAG,IAC3C,GAAI,OAAO,MAAMf,CAAE,EACjB,OAAOwE,GAAS,QAAQ,eAAe,EAGzC,MAAMmhB,EAAYrd,GAAcpY,EAAQ,KAAM0W,GAAS,WAAW,EAClE,OAAK+e,EAAU,QAIR,IAAInhB,GAAS,CAClB,GAAIxE,EACJ,KAAM2lB,EACN,IAAKnf,GAAO,WAAWtW,CAAO,CACpC,CAAK,EAPQsU,GAAS,QAAQse,GAAgB6C,CAAS,CAAC,CAQrD,CAYD,OAAO,WAAWC,EAAc11B,EAAU,GAAI,CAC5C,GAAKyY,GAASid,CAAY,EAInB,OAAIA,EAAe,CAAC/C,IAAY+C,EAAe/C,GAE7Cre,GAAS,QAAQ,wBAAwB,EAEzC,IAAIA,GAAS,CAClB,GAAIohB,EACJ,KAAMtd,GAAcpY,EAAQ,KAAM0W,GAAS,WAAW,EACtD,IAAKJ,GAAO,WAAWtW,CAAO,CACtC,CAAO,EAXD,MAAM,IAAIqO,GACR,yDAAyD,OAAOqnB,CAAY,eAAeA,CAAY,EAC/G,CAWG,CAYD,OAAO,YAAYC,EAAS31B,EAAU,GAAI,CACxC,GAAKyY,GAASkd,CAAO,EAGnB,OAAO,IAAIrhB,GAAS,CAClB,GAAIqhB,EAAU,IACd,KAAMvd,GAAcpY,EAAQ,KAAM0W,GAAS,WAAW,EACtD,IAAKJ,GAAO,WAAWtW,CAAO,CACtC,CAAO,EAND,MAAM,IAAIqO,GAAqB,wCAAwC,CAQ1E,CAkCD,OAAO,WAAWlM,EAAK4N,EAAO,GAAI,CAChC5N,EAAMA,GAAO,GACb,MAAMszB,EAAYrd,GAAcrI,EAAK,KAAM2G,GAAS,WAAW,EAC/D,GAAI,CAAC+e,EAAU,QACb,OAAOnhB,GAAS,QAAQse,GAAgB6C,CAAS,CAAC,EAGpD,MAAMhhB,EAAM6B,GAAO,WAAWvG,CAAI,EAC5BkP,EAAaF,GAAgB5c,EAAK4yB,EAA2B,EAC7D,CAAE,mBAAA1a,EAAoB,YAAAH,CAAW,EAAKkB,GAAoB6D,EAAYxK,CAAG,EAEzEwgB,EAAQve,GAAS,IAAK,EAC1Bwe,EAAgBxjB,GAAY3B,EAAK,cAAc,EAE3C0lB,EAAU,OAAOR,CAAK,EADtBllB,EAAK,eAET6lB,EAAkB,CAAClkB,GAAYuN,EAAW,OAAO,EACjD4W,EAAqB,CAACnkB,GAAYuN,EAAW,IAAI,EACjD6W,EAAmB,CAACpkB,GAAYuN,EAAW,KAAK,GAAK,CAACvN,GAAYuN,EAAW,GAAG,EAChF8W,EAAiBF,GAAsBC,EACvCE,EAAkB/W,EAAW,UAAYA,EAAW,WAQtD,IAAK8W,GAAkBH,IAAoBI,EACzC,MAAM,IAAI9nB,GACR,qEACR,EAGI,GAAI4nB,GAAoBF,EACtB,MAAM,IAAI1nB,GAA8B,wCAAwC,EAGlF,MAAM+nB,EAAcD,GAAoB/W,EAAW,SAAW,CAAC8W,EAG/D,IAAIrV,EACFwV,EACAC,EAAS7C,GAAQ2B,EAAOC,CAAY,EAClCe,GACFvV,EAAQkU,GACRsB,EAAgBxB,GAChByB,EAAShc,GAAgBgc,EAAQ9b,EAAoBH,CAAW,GACvD0b,GACTlV,EAAQmU,GACRqB,EAAgBvB,GAChBwB,EAASnb,GAAmBmb,CAAM,IAElCzV,EAAQ2J,GACR6L,EAAgBzB,IAIlB,IAAI2B,EAAa,GACjB,UAAWlX,KAAKwB,EAAO,CACrB,MAAMxY,EAAI+W,EAAWC,CAAC,EACjBxN,GAAYxJ,CAAC,EAEPkuB,EACTnX,EAAWC,CAAC,EAAIgX,EAAchX,CAAC,EAE/BD,EAAWC,CAAC,EAAIiX,EAAOjX,CAAC,EAJxBkX,EAAa,EAMhB,CAGD,MAAMC,EAAqBJ,EACrB5a,GAAmB4D,EAAY5E,EAAoBH,CAAW,EAC9D0b,EACAja,GAAsBsD,CAAU,EAChCpD,GAAwBoD,CAAU,EACtCwM,EAAU4K,GAAsBpa,GAAmBgD,CAAU,EAE/D,GAAIwM,EACF,OAAOnX,GAAS,QAAQmX,CAAO,EAIjC,MAAM6K,EAAYL,EACZtb,GAAgBsE,EAAY5E,EAAoBH,CAAW,EAC3D0b,EACA1a,GAAmB+D,CAAU,EAC7BA,EACJ,CAACsX,EAASC,CAAW,EAAIjD,GAAQ+C,EAAWpB,EAAcO,CAAS,EACnE1C,EAAO,IAAIze,GAAS,CAClB,GAAIiiB,EACJ,KAAMd,EACN,EAAGe,EACH,IAAA/hB,CACR,CAAO,EAGH,OAAIwK,EAAW,SAAW8W,GAAkB5zB,EAAI,UAAY4wB,EAAK,QACxDze,GAAS,QACd,qBACA,uCAAuC2K,EAAW,OAAO,kBAAkB8T,EAAK,MAAK,CAAE,EAC/F,EAGWA,CACR,CAkBD,OAAO,QAAQvH,EAAMzb,EAAO,GAAI,CAC9B,KAAM,CAAC6a,EAAMgJ,CAAU,EAAIvK,GAAamC,CAAI,EAC5C,OAAOmI,GAAoB/I,EAAMgJ,EAAY7jB,EAAM,WAAYyb,CAAI,CACpE,CAgBD,OAAO,YAAYA,EAAMzb,EAAO,GAAI,CAClC,KAAM,CAAC6a,EAAMgJ,CAAU,EAAItK,GAAiBkC,CAAI,EAChD,OAAOmI,GAAoB/I,EAAMgJ,EAAY7jB,EAAM,WAAYyb,CAAI,CACpE,CAiBD,OAAO,SAASA,EAAMzb,EAAO,GAAI,CAC/B,KAAM,CAAC6a,EAAMgJ,CAAU,EAAIrK,GAAciC,CAAI,EAC7C,OAAOmI,GAAoB/I,EAAMgJ,EAAY7jB,EAAM,OAAQA,CAAI,CAChE,CAeD,OAAO,WAAWyb,EAAM3I,EAAK9S,EAAO,GAAI,CACtC,GAAI2B,GAAY8Z,CAAI,GAAK9Z,GAAYmR,CAAG,EACtC,MAAM,IAAIxU,GAAqB,kDAAkD,EAGnF,KAAM,CAAE,OAAA+B,EAAS,KAAM,gBAAA2D,EAAkB,IAAM,EAAGhE,EAChD0mB,EAAcngB,GAAO,SAAS,CAC5B,OAAAlG,EACA,gBAAA2D,EACA,YAAa,EACrB,CAAO,EACD,CAAC6W,EAAMgJ,EAAY7B,EAAgBtG,CAAO,EAAIgH,GAAgBgE,EAAajL,EAAM3I,CAAG,EACtF,OAAI4I,EACKnX,GAAS,QAAQmX,CAAO,EAExBkI,GAAoB/I,EAAMgJ,EAAY7jB,EAAM,UAAU8S,CAAG,GAAI2I,EAAMuG,CAAc,CAE3F,CAKD,OAAO,WAAWvG,EAAM3I,EAAK9S,EAAO,GAAI,CACtC,OAAOuE,GAAS,WAAWkX,EAAM3I,EAAK9S,CAAI,CAC3C,CAsBD,OAAO,QAAQyb,EAAMzb,EAAO,GAAI,CAC9B,KAAM,CAAC6a,EAAMgJ,CAAU,EAAI9J,GAAS0B,CAAI,EACxC,OAAOmI,GAAoB/I,EAAMgJ,EAAY7jB,EAAM,MAAOyb,CAAI,CAC/D,CAQD,OAAO,QAAQzd,EAAQqL,EAAc,KAAM,CACzC,GAAI,CAACrL,EACH,MAAM,IAAIM,GAAqB,kDAAkD,EAGnF,MAAMod,EAAU1d,aAAkBoL,GAAUpL,EAAS,IAAIoL,GAAQpL,EAAQqL,CAAW,EAEpF,GAAI1C,GAAS,eACX,MAAM,IAAI5I,GAAqB2d,CAAO,EAEtC,OAAO,IAAInX,GAAS,CAAE,QAAAmX,CAAO,CAAE,CAElC,CAOD,OAAO,WAAWlP,EAAG,CACnB,OAAQA,GAAKA,EAAE,iBAAoB,EACpC,CAQD,OAAO,mBAAmB0G,EAAYyT,EAAa,GAAI,CACrD,MAAMC,EAAYxE,GAAmBlP,EAAY3M,GAAO,WAAWogB,CAAU,CAAC,EAC9E,OAAQC,EAAmBA,EAAU,IAAKzd,GAAOA,EAAIA,EAAE,IAAM,IAAK,EAAE,KAAK,EAAE,EAAvD,IACrB,CASD,OAAO,aAAa2J,EAAK6T,EAAa,GAAI,CAExC,OADiBtE,GAAkBxP,GAAU,YAAYC,CAAG,EAAGvM,GAAO,WAAWogB,CAAU,CAAC,EAC5E,IAAKxd,GAAMA,EAAE,GAAG,EAAE,KAAK,EAAE,CAC1C,CAWD,IAAI9K,EAAM,CACR,OAAO,KAAKA,CAAI,CACjB,CAQD,IAAI,SAAU,CACZ,OAAO,KAAK,UAAY,IACzB,CAMD,IAAI,eAAgB,CAClB,OAAO,KAAK,QAAU,KAAK,QAAQ,OAAS,IAC7C,CAMD,IAAI,oBAAqB,CACvB,OAAO,KAAK,QAAU,KAAK,QAAQ,YAAc,IAClD,CAOD,IAAI,QAAS,CACX,OAAO,KAAK,QAAU,KAAK,IAAI,OAAS,IACzC,CAOD,IAAI,iBAAkB,CACpB,OAAO,KAAK,QAAU,KAAK,IAAI,gBAAkB,IAClD,CAOD,IAAI,gBAAiB,CACnB,OAAO,KAAK,QAAU,KAAK,IAAI,eAAiB,IACjD,CAMD,IAAI,MAAO,CACT,OAAO,KAAK,KACb,CAMD,IAAI,UAAW,CACb,OAAO,KAAK,QAAU,KAAK,KAAK,KAAO,IACxC,CAOD,IAAI,MAAO,CACT,OAAO,KAAK,QAAU,KAAK,EAAE,KAAO,GACrC,CAOD,IAAI,SAAU,CACZ,OAAO,KAAK,QAAU,KAAK,KAAK,KAAK,EAAE,MAAQ,CAAC,EAAI,GACrD,CAOD,IAAI,OAAQ,CACV,OAAO,KAAK,QAAU,KAAK,EAAE,MAAQ,GACtC,CAOD,IAAI,KAAM,CACR,OAAO,KAAK,QAAU,KAAK,EAAE,IAAM,GACpC,CAOD,IAAI,MAAO,CACT,OAAO,KAAK,QAAU,KAAK,EAAE,KAAO,GACrC,CAOD,IAAI,QAAS,CACX,OAAO,KAAK,QAAU,KAAK,EAAE,OAAS,GACvC,CAOD,IAAI,QAAS,CACX,OAAO,KAAK,QAAU,KAAK,EAAE,OAAS,GACvC,CAOD,IAAI,aAAc,CAChB,OAAO,KAAK,QAAU,KAAK,EAAE,YAAc,GAC5C,CAQD,IAAI,UAAW,CACb,OAAO,KAAK,QAAUykB,GAAuB,IAAI,EAAE,SAAW,GAC/D,CAQD,IAAI,YAAa,CACf,OAAO,KAAK,QAAUA,GAAuB,IAAI,EAAE,WAAa,GACjE,CASD,IAAI,SAAU,CACZ,OAAO,KAAK,QAAUA,GAAuB,IAAI,EAAE,QAAU,GAC9D,CAMD,IAAI,WAAY,CACd,OAAO,KAAK,SAAW,KAAK,IAAI,eAAc,EAAG,SAAS,KAAK,OAAO,CACvE,CAQD,IAAI,cAAe,CACjB,OAAO,KAAK,QAAUC,GAA4B,IAAI,EAAE,QAAU,GACnE,CAQD,IAAI,iBAAkB,CACpB,OAAO,KAAK,QAAUA,GAA4B,IAAI,EAAE,WAAa,GACtE,CAOD,IAAI,eAAgB,CAClB,OAAO,KAAK,QAAUA,GAA4B,IAAI,EAAE,SAAW,GACpE,CAOD,IAAI,SAAU,CACZ,OAAO,KAAK,QAAU9X,GAAmB,KAAK,CAAC,EAAE,QAAU,GAC5D,CAQD,IAAI,YAAa,CACf,OAAO,KAAK,QAAUkT,GAAK,OAAO,QAAS,CAAE,OAAQ,KAAK,GAAG,CAAE,EAAE,KAAK,MAAQ,CAAC,EAAI,IACpF,CAQD,IAAI,WAAY,CACd,OAAO,KAAK,QAAUA,GAAK,OAAO,OAAQ,CAAE,OAAQ,KAAK,GAAG,CAAE,EAAE,KAAK,MAAQ,CAAC,EAAI,IACnF,CAQD,IAAI,cAAe,CACjB,OAAO,KAAK,QAAUA,GAAK,SAAS,QAAS,CAAE,OAAQ,KAAK,GAAG,CAAE,EAAE,KAAK,QAAU,CAAC,EAAI,IACxF,CAQD,IAAI,aAAc,CAChB,OAAO,KAAK,QAAUA,GAAK,SAAS,OAAQ,CAAE,OAAQ,KAAK,GAAG,CAAE,EAAE,KAAK,QAAU,CAAC,EAAI,IACvF,CAQD,IAAI,QAAS,CACX,OAAO,KAAK,QAAU,CAAC,KAAK,EAAI,GACjC,CAOD,IAAI,iBAAkB,CACpB,OAAI,KAAK,QACA,KAAK,KAAK,WAAW,KAAK,GAAI,CACnC,OAAQ,QACR,OAAQ,KAAK,MACrB,CAAO,EAEM,IAEV,CAOD,IAAI,gBAAiB,CACnB,OAAI,KAAK,QACA,KAAK,KAAK,WAAW,KAAK,GAAI,CACnC,OAAQ,OACR,OAAQ,KAAK,MACrB,CAAO,EAEM,IAEV,CAMD,IAAI,eAAgB,CAClB,OAAO,KAAK,QAAU,KAAK,KAAK,YAAc,IAC/C,CAMD,IAAI,SAAU,CACZ,OAAI,KAAK,cACA,GAGL,KAAK,OAAS,KAAK,IAAI,CAAE,MAAO,EAAG,IAAK,CAAG,GAAE,QAC7C,KAAK,OAAS,KAAK,IAAI,CAAE,MAAO,CAAG,GAAE,MAG1C,CASD,oBAAqB,CACnB,GAAI,CAAC,KAAK,SAAW,KAAK,cACxB,MAAO,CAAC,IAAI,EAEd,MAAM0I,EAAQ,MACRC,EAAW,IACX5D,EAAU3gB,GAAa,KAAK,CAAC,EAC7BwkB,EAAW,KAAK,KAAK,OAAO7D,EAAU2D,CAAK,EAC3CG,EAAS,KAAK,KAAK,OAAO9D,EAAU2D,CAAK,EAEzCI,EAAK,KAAK,KAAK,OAAO/D,EAAU6D,EAAWD,CAAQ,EACnDzD,EAAK,KAAK,KAAK,OAAOH,EAAU8D,EAASF,CAAQ,EACvD,GAAIG,IAAO5D,EACT,MAAO,CAAC,IAAI,EAEd,MAAM6D,EAAMhE,EAAU+D,EAAKH,EACrBK,EAAMjE,EAAUG,EAAKyD,EACrBM,EAAK7D,GAAQ2D,EAAKD,CAAE,EACpBI,EAAK9D,GAAQ4D,EAAK9D,CAAE,EAC1B,OACE+D,EAAG,OAASC,EAAG,MACfD,EAAG,SAAWC,EAAG,QACjBD,EAAG,SAAWC,EAAG,QACjBD,EAAG,cAAgBC,EAAG,YAEf,CAAC3vB,GAAM,KAAM,CAAE,GAAIwvB,CAAK,GAAGxvB,GAAM,KAAM,CAAE,GAAIyvB,CAAG,CAAE,CAAC,EAErD,CAAC,IAAI,CACb,CAQD,IAAI,cAAe,CACjB,OAAOvd,GAAW,KAAK,IAAI,CAC5B,CAQD,IAAI,aAAc,CAChB,OAAOqC,GAAY,KAAK,KAAM,KAAK,KAAK,CACzC,CAQD,IAAI,YAAa,CACf,OAAO,KAAK,QAAUjB,GAAW,KAAK,IAAI,EAAI,GAC/C,CASD,IAAI,iBAAkB,CACpB,OAAO,KAAK,QAAUN,GAAgB,KAAK,QAAQ,EAAI,GACxD,CAQD,IAAI,sBAAuB,CACzB,OAAO,KAAK,QACRA,GACE,KAAK,cACL,KAAK,IAAI,sBAAuB,EAChC,KAAK,IAAI,eAAgB,CAC1B,EACD,GACL,CAQD,sBAAsB1K,EAAO,GAAI,CAC/B,KAAM,CAAE,OAAAK,EAAQ,gBAAA2D,EAAiB,SAAAC,CAAU,EAAG4O,GAAU,OACtD,KAAK,IAAI,MAAM7S,CAAI,EACnBA,CACN,EAAM,gBAAgB,IAAI,EACtB,MAAO,CAAE,OAAAK,EAAQ,gBAAA2D,EAAiB,eAAgBC,CAAQ,CAC3D,CAYD,MAAMvU,EAAS,EAAGsQ,EAAO,GAAI,CAC3B,OAAO,KAAK,QAAQiI,GAAgB,SAASvY,CAAM,EAAGsQ,CAAI,CAC3D,CAQD,SAAU,CACR,OAAO,KAAK,QAAQ2G,GAAS,WAAW,CACzC,CAWD,QAAQjG,EAAM,CAAE,cAAA4mB,EAAgB,GAAO,iBAAAC,EAAmB,EAAO,EAAG,GAAI,CAEtE,GADA7mB,EAAO2H,GAAc3H,EAAMiG,GAAS,WAAW,EAC3CjG,EAAK,OAAO,KAAK,IAAI,EACvB,OAAO,KACF,GAAKA,EAAK,QAEV,CACL,IAAI8mB,EAAQ,KAAK,GACjB,GAAIF,GAAiBC,EAAkB,CACrC,MAAME,EAAc/mB,EAAK,OAAO,KAAK,EAAE,EACjCgnB,EAAQ,KAAK,WACnB,CAACF,CAAK,EAAIhE,GAAQkE,EAAOD,EAAa/mB,CAAI,CAC3C,CACD,OAAOhJ,GAAM,KAAM,CAAE,GAAI8vB,EAAO,KAAA9mB,CAAI,CAAE,CACvC,KATC,QAAO6D,GAAS,QAAQse,GAAgBniB,CAAI,CAAC,CAUhD,CAQD,YAAY,CAAE,OAAAL,EAAQ,gBAAA2D,EAAiB,eAAAG,CAAc,EAAK,GAAI,CAC5D,MAAMO,EAAM,KAAK,IAAI,MAAM,CAAE,OAAArE,EAAQ,gBAAA2D,EAAiB,eAAAG,CAAc,CAAE,EACtE,OAAOzM,GAAM,KAAM,CAAE,IAAAgN,CAAK,EAC3B,CAQD,UAAUrE,EAAQ,CAChB,OAAO,KAAK,YAAY,CAAE,OAAAA,CAAQ,EACnC,CAeD,IAAIjL,EAAQ,CACV,GAAI,CAAC,KAAK,QAAS,OAAO,KAE1B,MAAM8Z,EAAaF,GAAgB5Z,EAAQ4vB,EAA2B,EAChE,CAAE,mBAAA1a,EAAoB,YAAAH,CAAa,EAAGkB,GAAoB6D,EAAY,KAAK,GAAG,EAE9EyY,EACF,CAAChmB,GAAYuN,EAAW,QAAQ,GAChC,CAACvN,GAAYuN,EAAW,UAAU,GAClC,CAACvN,GAAYuN,EAAW,OAAO,EACjC2W,EAAkB,CAAClkB,GAAYuN,EAAW,OAAO,EACjD4W,EAAqB,CAACnkB,GAAYuN,EAAW,IAAI,EACjD6W,EAAmB,CAACpkB,GAAYuN,EAAW,KAAK,GAAK,CAACvN,GAAYuN,EAAW,GAAG,EAChF8W,EAAiBF,GAAsBC,EACvCE,EAAkB/W,EAAW,UAAYA,EAAW,WAEtD,IAAK8W,GAAkBH,IAAoBI,EACzC,MAAM,IAAI9nB,GACR,qEACR,EAGI,GAAI4nB,GAAoBF,EACtB,MAAM,IAAI1nB,GAA8B,wCAAwC,EAGlF,IAAI4d,EACA4L,EACF5L,EAAQnR,GACN,CAAE,GAAGR,GAAgB,KAAK,EAAGE,EAAoBH,CAAW,EAAG,GAAG+E,CAAY,EAC9E5E,EACAH,CACR,EACgBxI,GAAYuN,EAAW,OAAO,GAGxC6M,EAAQ,CAAE,GAAG,KAAK,SAAQ,EAAI,GAAG7M,CAAU,EAIvCvN,GAAYuN,EAAW,GAAG,IAC5B6M,EAAM,IAAM,KAAK,IAAI9P,GAAY8P,EAAM,KAAMA,EAAM,KAAK,EAAGA,EAAM,GAAG,IAPtEA,EAAQ5Q,GAAmB,CAAE,GAAGF,GAAmB,KAAK,CAAC,EAAG,GAAGiE,CAAU,CAAE,EAW7E,KAAM,CAACnP,EAAIyM,CAAC,EAAIgX,GAAQzH,EAAO,KAAK,EAAG,KAAK,IAAI,EAChD,OAAOrkB,GAAM,KAAM,CAAE,GAAAqI,EAAI,EAAAyM,CAAG,EAC7B,CAeD,KAAKqP,EAAU,CACb,GAAI,CAAC,KAAK,QAAS,OAAO,KAC1B,MAAM9H,EAAM2G,GAAS,iBAAiBmB,CAAQ,EAC9C,OAAOnkB,GAAM,KAAM+rB,GAAW,KAAM1P,CAAG,CAAC,CACzC,CAQD,MAAM8H,EAAU,CACd,GAAI,CAAC,KAAK,QAAS,OAAO,KAC1B,MAAM9H,EAAM2G,GAAS,iBAAiBmB,CAAQ,EAAE,OAAM,EACtD,OAAOnkB,GAAM,KAAM+rB,GAAW,KAAM1P,CAAG,CAAC,CACzC,CAcD,QAAQ1V,EAAM,CAAE,eAAAupB,EAAiB,EAAK,EAAK,GAAI,CAC7C,GAAI,CAAC,KAAK,QAAS,OAAO,KAE1B,MAAMpb,EAAI,CAAE,EACVqb,EAAiBnN,GAAS,cAAcrc,CAAI,EAC9C,OAAQwpB,EAAc,CACpB,IAAK,QACHrb,EAAE,MAAQ,EAEZ,IAAK,WACL,IAAK,SACHA,EAAE,IAAM,EAEV,IAAK,QACL,IAAK,OACHA,EAAE,KAAO,EAEX,IAAK,QACHA,EAAE,OAAS,EAEb,IAAK,UACHA,EAAE,OAAS,EAEb,IAAK,UACHA,EAAE,YAAc,EAChB,KAIH,CAED,GAAIqb,IAAmB,QACrB,GAAID,EAAgB,CAClB,MAAMzd,EAAc,KAAK,IAAI,eAAc,EACrC,CAAE,QAAAI,CAAS,EAAG,KAChBA,EAAUJ,IACZqC,EAAE,WAAa,KAAK,WAAa,GAEnCA,EAAE,QAAUrC,CACpB,MACQqC,EAAE,QAAU,EAIhB,GAAIqb,IAAmB,WAAY,CACjC,MAAMC,EAAI,KAAK,KAAK,KAAK,MAAQ,CAAC,EAClCtb,EAAE,OAASsb,EAAI,GAAK,EAAI,CACzB,CAED,OAAO,KAAK,IAAItb,CAAC,CAClB,CAcD,MAAMnO,EAAM2B,EAAM,CAChB,OAAO,KAAK,QACR,KAAK,KAAK,CAAE,CAAC3B,CAAI,EAAG,CAAC,CAAE,EACpB,QAAQA,EAAM2B,CAAI,EAClB,MAAM,CAAC,EACV,IACL,CAgBD,SAAS8S,EAAK9S,EAAO,GAAI,CACvB,OAAO,KAAK,QACR6S,GAAU,OAAO,KAAK,IAAI,cAAc7S,CAAI,CAAC,EAAE,yBAAyB,KAAM8S,CAAG,EACjFkH,EACL,CAqBD,eAAe9G,EAAa1B,GAAoBxR,EAAO,GAAI,CACzD,OAAO,KAAK,QACR6S,GAAU,OAAO,KAAK,IAAI,MAAM7S,CAAI,EAAGkT,CAAU,EAAE,eAAe,IAAI,EACtE8G,EACL,CAeD,cAAcha,EAAO,GAAI,CACvB,OAAO,KAAK,QACR6S,GAAU,OAAO,KAAK,IAAI,MAAM7S,CAAI,EAAGA,CAAI,EAAE,oBAAoB,IAAI,EACrE,EACL,CAgBD,MAAM,CACJ,OAAAC,EAAS,WACT,gBAAAqkB,EAAkB,GAClB,qBAAAC,EAAuB,GACvB,cAAAC,EAAgB,GAChB,aAAAC,EAAe,EAChB,EAAG,GAAI,CACN,GAAI,CAAC,KAAK,QACR,OAAO,KAGT,MAAMsD,EAAM9nB,IAAW,WAEvB,IAAInE,EAAIooB,GAAU,KAAM6D,CAAG,EAC3B,OAAAjsB,GAAK,IACLA,GAAKuoB,GAAU,KAAM0D,EAAKzD,EAAiBC,EAAsBC,EAAeC,CAAY,EACrF3oB,CACR,CAUD,UAAU,CAAE,OAAAmE,EAAS,UAAU,EAAK,GAAI,CACtC,OAAK,KAAK,QAIHikB,GAAU,KAAMjkB,IAAW,UAAU,EAHnC,IAIV,CAOD,eAAgB,CACd,OAAO+jB,GAAa,KAAM,cAAc,CACzC,CAiBD,UAAU,CACR,qBAAAO,EAAuB,GACvB,gBAAAD,EAAkB,GAClB,cAAAE,EAAgB,GAChB,cAAAwD,EAAgB,GAChB,aAAAvD,EAAe,GACf,OAAAxkB,EAAS,UACV,EAAG,GAAI,CACN,OAAK,KAAK,SAIF+nB,EAAgB,IAAM,IAG5B3D,GACE,KACApkB,IAAW,WACXqkB,EACAC,EACAC,EACAC,CACD,EAbM,IAeV,CAQD,WAAY,CACV,OAAOT,GAAa,KAAM,gCAAiC,EAAK,CACjE,CAUD,QAAS,CACP,OAAOA,GAAa,KAAK,MAAO,EAAE,iCAAiC,CACpE,CAOD,WAAY,CACV,OAAK,KAAK,QAGHE,GAAU,KAAM,EAAI,EAFlB,IAGV,CAcD,UAAU,CAAE,cAAAM,EAAgB,GAAM,YAAAyD,EAAc,GAAO,mBAAAC,EAAqB,EAAM,EAAG,GAAI,CACvF,IAAIpV,EAAM,eAEV,OAAImV,GAAezD,KACb0D,IACFpV,GAAO,KAELmV,EACFnV,GAAO,IACE0R,IACT1R,GAAO,OAIJkR,GAAa,KAAMlR,EAAK,EAAI,CACpC,CAcD,MAAM9S,EAAO,GAAI,CACf,OAAK,KAAK,QAIH,GAAG,KAAK,WAAW,IAAI,KAAK,UAAUA,CAAI,CAAC,GAHzC,IAIV,CAMD,UAAW,CACT,OAAO,KAAK,QAAU,KAAK,MAAK,EAAKga,EACtC,CAMD,CAAC,OAAO,IAAI,4BAA4B,CAAC,GAAI,CAC3C,OAAI,KAAK,QACA,kBAAkB,KAAK,MAAK,CAAE,WAAW,KAAK,KAAK,IAAI,aAAa,KAAK,MAAM,KAE/E,+BAA+B,KAAK,aAAa,IAE3D,CAMD,SAAU,CACR,OAAO,KAAK,UACb,CAMD,UAAW,CACT,OAAO,KAAK,QAAU,KAAK,GAAK,GACjC,CAMD,WAAY,CACV,OAAO,KAAK,QAAU,KAAK,GAAK,IAAO,GACxC,CAMD,eAAgB,CACd,OAAO,KAAK,QAAU,KAAK,MAAM,KAAK,GAAK,GAAI,EAAI,GACpD,CAMD,QAAS,CACP,OAAO,KAAK,OACb,CAMD,QAAS,CACP,OAAO,KAAK,UACb,CASD,SAASha,EAAO,GAAI,CAClB,GAAI,CAAC,KAAK,QAAS,MAAO,GAE1B,MAAMoD,EAAO,CAAE,GAAG,KAAK,CAAC,EAExB,OAAIpD,EAAK,gBACPoD,EAAK,eAAiB,KAAK,eAC3BA,EAAK,gBAAkB,KAAK,IAAI,gBAChCA,EAAK,OAAS,KAAK,IAAI,QAElBA,CACR,CAMD,UAAW,CACT,OAAO,IAAI,KAAK,KAAK,QAAU,KAAK,GAAK,GAAG,CAC7C,CAmBD,KAAK+kB,EAAe9pB,EAAO,eAAgB2B,EAAO,GAAI,CACpD,GAAI,CAAC,KAAK,SAAW,CAACmoB,EAAc,QAClC,OAAOzN,GAAS,QAAQ,wCAAwC,EAGlE,MAAM0N,EAAU,CAAE,OAAQ,KAAK,OAAQ,gBAAiB,KAAK,gBAAiB,GAAGpoB,GAE3E2Q,EAAQjE,GAAWrO,CAAI,EAAE,IAAIqc,GAAS,aAAa,EACvD2N,EAAeF,EAAc,UAAY,KAAK,QAAS,EACvD5J,EAAU8J,EAAe,KAAOF,EAChC3J,EAAQ6J,EAAeF,EAAgB,KACvCG,EAAStJ,GAAKT,EAASC,EAAO7N,EAAOyX,CAAO,EAE9C,OAAOC,EAAeC,EAAO,OAAM,EAAKA,CACzC,CAUD,QAAQjqB,EAAO,eAAgB2B,EAAO,GAAI,CACxC,OAAO,KAAK,KAAKuE,GAAS,IAAG,EAAIlG,EAAM2B,CAAI,CAC5C,CAOD,MAAMmoB,EAAe,CACnB,OAAO,KAAK,QAAUtL,GAAS,cAAc,KAAMsL,CAAa,EAAI,IACrE,CAaD,QAAQA,EAAe9pB,EAAM2B,EAAM,CACjC,GAAI,CAAC,KAAK,QAAS,MAAO,GAE1B,MAAMuoB,EAAUJ,EAAc,UACxBK,EAAiB,KAAK,QAAQL,EAAc,KAAM,CAAE,cAAe,EAAI,CAAE,EAC/E,OACEK,EAAe,QAAQnqB,EAAM2B,CAAI,GAAKuoB,GAAWA,GAAWC,EAAe,MAAMnqB,EAAM2B,CAAI,CAE9F,CASD,OAAO5M,EAAO,CACZ,OACE,KAAK,SACLA,EAAM,SACN,KAAK,QAAO,IAAOA,EAAM,QAAS,GAClC,KAAK,KAAK,OAAOA,EAAM,IAAI,GAC3B,KAAK,IAAI,OAAOA,EAAM,GAAG,CAE5B,CAoBD,WAAWnD,EAAU,GAAI,CACvB,GAAI,CAAC,KAAK,QAAS,OAAO,KAC1B,MAAMmT,EAAOnT,EAAQ,MAAQsU,GAAS,WAAW,CAAE,EAAE,CAAE,KAAM,KAAK,KAAM,EACtEkkB,EAAUx4B,EAAQ,QAAW,KAAOmT,EAAO,CAACnT,EAAQ,QAAUA,EAAQ,QAAW,EACnF,IAAI0gB,EAAQ,CAAC,QAAS,SAAU,OAAQ,QAAS,UAAW,SAAS,EACjEtS,EAAOpO,EAAQ,KACnB,OAAI,MAAM,QAAQA,EAAQ,IAAI,IAC5B0gB,EAAQ1gB,EAAQ,KAChBoO,EAAO,QAEF+mB,GAAahiB,EAAM,KAAK,KAAKqlB,CAAO,EAAG,CAC5C,GAAGx4B,EACH,QAAS,SACT,MAAA0gB,EACA,KAAAtS,CACN,CAAK,CACF,CAeD,mBAAmBpO,EAAU,GAAI,CAC/B,OAAK,KAAK,QAEHm1B,GAAan1B,EAAQ,MAAQsU,GAAS,WAAW,GAAI,CAAE,KAAM,KAAK,IAAM,GAAG,KAAM,CACtF,GAAGtU,EACH,QAAS,OACT,MAAO,CAAC,QAAS,SAAU,MAAM,EACjC,UAAW,EACjB,CAAK,EAPyB,IAQ3B,CAOD,OAAO,OAAOotB,EAAW,CACvB,GAAI,CAACA,EAAU,MAAM9Y,GAAS,UAAU,EACtC,MAAM,IAAIjG,GAAqB,yCAAyC,EAE1E,OAAOsO,GAAOyQ,EAAY9tB,GAAMA,EAAE,QAAS,EAAE,KAAK,GAAG,CACtD,CAOD,OAAO,OAAO8tB,EAAW,CACvB,GAAI,CAACA,EAAU,MAAM9Y,GAAS,UAAU,EACtC,MAAM,IAAIjG,GAAqB,yCAAyC,EAE1E,OAAOsO,GAAOyQ,EAAY9tB,GAAMA,EAAE,QAAS,EAAE,KAAK,GAAG,CACtD,CAWD,OAAO,kBAAkBksB,EAAM3I,EAAK7iB,EAAU,GAAI,CAChD,KAAM,CAAE,OAAAoQ,EAAS,KAAM,gBAAA2D,EAAkB,IAAM,EAAG/T,EAChDy2B,EAAcngB,GAAO,SAAS,CAC5B,OAAAlG,EACA,gBAAA2D,EACA,YAAa,EACrB,CAAO,EACH,OAAOse,GAAkBoE,EAAajL,EAAM3I,CAAG,CAChD,CAKD,OAAO,kBAAkB2I,EAAM3I,EAAK7iB,EAAU,GAAI,CAChD,OAAOsU,GAAS,kBAAkBkX,EAAM3I,EAAK7iB,CAAO,CACrD,CAQD,WAAW,YAAa,CACtB,OAAOuhB,EACR,CAMD,WAAW,UAAW,CACpB,OAAOC,EACR,CAMD,WAAW,uBAAwB,CACjC,OAAOiX,EACR,CAMD,WAAW,WAAY,CACrB,OAAOhX,EACR,CAMD,WAAW,WAAY,CACrB,OAAOC,EACR,CAMD,WAAW,aAAc,CACvB,OAAOC,EACR,CAMD,WAAW,mBAAoB,CAC7B,OAAOC,EACR,CAMD,WAAW,wBAAyB,CAClC,OAAOC,EACR,CAMD,WAAW,uBAAwB,CACjC,OAAOC,EACR,CAMD,WAAW,gBAAiB,CAC1B,OAAOC,EACR,CAMD,WAAW,sBAAuB,CAChC,OAAOC,EACR,CAMD,WAAW,2BAA4B,CACrC,OAAOC,EACR,CAMD,WAAW,0BAA2B,CACpC,OAAOC,EACR,CAMD,WAAW,gBAAiB,CAC1B,OAAOC,EACR,CAMD,WAAW,6BAA8B,CACvC,OAAOI,EACR,CAMD,WAAW,cAAe,CACxB,OAAOH,EACR,CAMD,WAAW,2BAA4B,CACrC,OAAOI,EACR,CAMD,WAAW,2BAA4B,CACrC,OAAOkW,EACR,CAMD,WAAW,eAAgB,CACzB,OAAOrW,EACR,CAMD,WAAW,4BAA6B,CACtC,OAAOI,EACR,CAMD,WAAW,eAAgB,CACzB,OAAOH,EACR,CAMD,WAAW,4BAA6B,CACtC,OAAOI,EACR,CACH,CAKO,SAASoK,GAAiB6L,EAAa,CAC5C,GAAIrkB,GAAS,WAAWqkB,CAAW,EACjC,OAAOA,EACF,GAAIA,GAAeA,EAAY,SAAWlgB,GAASkgB,EAAY,QAAO,CAAE,EAC7E,OAAOrkB,GAAS,WAAWqkB,CAAW,EACjC,GAAIA,GAAe,OAAOA,GAAgB,SAC/C,OAAOrkB,GAAS,WAAWqkB,CAAW,EAEtC,MAAM,IAAItqB,GACR,8BAA8BsqB,CAAW,aAAa,OAAOA,CAAW,EAC9E,CAEA,CCr3EO,MAAMC,EAAO,CAChB,OAAO,KAAK5yB,EAAGC,EAAG,CACd,OAAID,EAAE,GAAKC,EAAE,GACF,GAEPD,EAAE,GAAKC,EAAE,GACF,EAEJ,CACV,CACD,OAAO,iBAAiBD,EAAGC,EAAGpF,EAAO,CACjC,OAAO,KAAK,cAAcmF,EAAEnF,CAAK,EAAGoF,EAAEpF,CAAK,CAAC,CAC/C,CACD,OAAO,iBAAiBmF,EAAGC,EAAGpF,EAAO,CACjC,OAAO,KAAK,cAAcmF,EAAEnF,CAAK,EAAGoF,EAAEpF,CAAK,CAAC,CAC/C,CAID,OAAO,cAAcmF,EAAGC,EAAG,CACvB,MAAM4yB,EAAK7yB,EAAE,cACP8yB,EAAK7yB,EAAE,cACb,OAAI4yB,EAAKC,EACE,EAEPD,EAAKC,EACE,GAEJ,CACV,CACD,OAAO,eAAe9yB,EAAGC,EAAG,CACxB,OAAID,IAAMC,EACC,EAEPD,GAAK,CAACC,EACC,GAEJ,CACV,CACD,OAAO,YAAYD,EAAGC,EAAG8yB,EAAY,CACjC,OAAO,OAAO,OAAOA,CAAU,EAAE,QAAQ/yB,CAAC,EAAI,OAAO,OAAO+yB,CAAU,EAAE,QAAQ9yB,CAAC,CACpF,CAID,OAAO,cAAcD,EAAGC,EAAG,CACvB,OAAID,IAAMC,EACC,EAEPD,EAAIC,EACG,GAEJ,CACV,CAID,OAAO,YAAYD,EAAGC,EAAG,CACrB,OAAID,EAAE,QAAO,IAAOC,EAAE,QAAO,EAClB,EAEPD,EAAIC,EACG,GAEJ,CACV,CAID,OAAO,SAAS+yB,EAAa,CACzB,KAAOA,EAAY,OAAS,GAAG,CAC3B,MAAMpyB,EAAIoyB,EAAY,QACtB,GAAIpyB,IAAM,EACN,OAAOA,CAEd,CACD,MAAO,EACV,CACD,OAAO,uBAAuB9C,EAAO,CACjC,MAAMm1B,EAAS,IAAI,IACnB,UAAWC,KAAWp1B,EAAO,CACzB,MAAMqS,EAAQ8iB,EAAO,IAAIC,CAAO,EAC5B/iB,EACA8iB,EAAO,IAAIC,EAAS/iB,EAAQ,CAAC,EAG7B8iB,EAAO,IAAIC,EAAS,CAAC,CAE5B,CACD,IAAIC,EAAW,EACXC,EACJ,SAAW,CAACF,EAAS/iB,CAAK,IAAK8iB,EACvB9iB,EAAQgjB,IACRA,EAAWhjB,EACXijB,EAAsBF,GAG9B,OAAOE,CACV,CACL,CCjGO,MAAMxW,CAAU,CACnB,OAAO,cAAc/Q,EAAM,CACvB,OAAAA,EAAOA,EAAK,UAAU,KAAK,EAAE,QAAQ,mBAAoB,EAAE,EACpDA,CACV,CACD,OAAO,gBAAgBA,EAAM,CACzB,OAAO,KAAK,cAAcA,CAAI,EAAE,QAAQ,mBAAoB,GAAG,EAAE,MACpE,CACD,OAAO,KAAKA,EAAM,CACd,OAAO,KAAK,cAAcA,CAAI,EAAE,YAAW,EAAG,QAAQ,cAAe,GAAG,EAAE,QAAQ,MAAO,EAAE,EAAE,QAAQ,MAAO,EAAE,CACjH,CACD,OAAO,UAAUA,EAAM,CACnB,OAAO,KAAK,cAAcA,CAAI,EAAE,YAAW,EAAG,QAAQ,eAAgB,GAAG,EAAE,QAAQ,MAAO,EAAE,EAAE,QAAQ,MAAO,EAAE,CAClH,CACD,OAAO,SAASA,EAAM,CAClB,OAAO,KAAK,cAAcA,CAAI,EAAE,QAAQ,kBAAmB,GAAG,EAAE,MACnE,CACD,OAAO,sBAAsBA,EAAM,CAC/B,OAAOA,EAAK,QAAQ,MAAO,GAAG,CACjC,CACD,OAAO,YAAYrJ,EAAK6wB,EAAc,EAAGC,EAAY,IAAU,CAE3D,IAAIrtB,EAAS,GACb,QAAS3M,EAAI,EAAGA,EAAIkJ,EAAI,OAAQlJ,IACxBA,EAAI+5B,IAAgB,GAAK/5B,EAAI,IAC7B2M,GAAUqtB,GAEdrtB,GAAUzD,EAAIlJ,CAAC,EAEnB,OAAO2M,CACV,CACD,OAAO,eAAezD,EAAK+wB,EAAS,IAAK,CACrC,IAAIC,EAAO,EACX,QAASl6B,EAAI,EAAGA,EAAIkJ,EAAI,OAAQlJ,IAAK,CACjC,MAAMm6B,EAAOjxB,EAAI,WAAWlJ,CAAC,EAC7Bk6B,GAAQA,GAAQ,GAAKA,EAAOC,CAC/B,CACD,OAAO,KAAK,IAAID,CAAI,EAAID,CAC3B,CAID,OAAO,MAAMn4B,EAAO,CAChB,OAAI,OAAOA,GAAU,WAEjBA,EADiBkT,GAAS,WAAWlT,CAAK,EAAE,QAAQ,KAAK,QAAQ,EAChD,OAEF,CAAC,UAAW,WAAY,QAAS,QAAS,MAAO,OAChE,OAAQ,WAAY,YAAa,UAAW,WAAY,UACpE,EAC0BA,EAAQ,CAAC,CAC9B,CAID,OAAO,IAAIyP,EAAM,CAEb,OADiByD,GAAS,WAAWzD,CAAI,EAAE,QAAQ,KAAK,QAAQ,EAChD,IAAI,QAAQ,CAAC,CAChC,CACD,OAAO,QAAQA,EAAM,CACjB,GAAI,CAACA,EAED,MAAO,IAEX,MAAM6oB,EAAa,CAAC,UAAW,UAAW,WAAY,YAAa,UAAW,WAAY,QAAQ,EAC5FC,EAAWrlB,GAAS,WAAWzD,CAAI,EAAE,QAAQ,KAAK,QAAQ,EAChE,OAAO6oB,EAAWC,EAAS,QAAU,CAAC,CACzC,CAID,OAAO,KAAK9oB,EAAM+oB,EAAW,KAAM,CAC/B,GAAI,CAAC/oB,EAED,MAAO,IAEX,MAAMgpB,EAAcvlB,GAAS,IAAK,EAAC,QAAQ,KAAK,QAAQ,EAAE,KACpDqlB,EAAWrlB,GAAS,WAAWzD,CAAI,EAAE,QAAQ,KAAK,QAAQ,EAC1DiB,EAAO6nB,EAAS,KACtB,OAAOA,EAAS,IAAM,IAAM,KAAK,MAAMA,EAAS,KAAK,GAAKE,IAAgB/nB,GAAQ8nB,IAAa,IAAQ/oB,EAAO,IAAI,KAAU,IAAMiB,EAAQ,GAC7I,CAOD,OAAO,KAAK6c,EAAM,CACd,MAAMmL,EAAQnL,EAAO,EACfoL,EAAYpL,EAAO,EACzB,OAAImL,EAAQ,GAAKC,IAAc,EACvBD,IAAU,EACH,SAEJA,EAAQ,SAEfnL,IAAS,EACF,QAEJ,GAAGA,CAAI,QACjB,CACD,OAAO,aAAa9d,EAAM7Q,EAAS,CAE/B,IAAI+uB,EADQ,KAAK,MACAle,EAAK,QAAO,EAC7B,MAAM8d,EAAO,KAAK,MAAMI,GAAQ,GAAK,IAAO,GAAK,GAAG,EACpDA,EAAOA,GAAQ,GAAK,IAAO,GAAK,IAChC,MAAM5P,EAAQ,KAAK,MAAM4P,GAAQ,GAAK,IAAO,GAAG,EAChDA,EAAOA,GAAQ,GAAK,IAAO,IAC3B,MAAM3P,EAAU,KAAK,MAAM2P,GAAQ,GAAK,IAAK,EAC7C,GAAIJ,EAAO,EACP,OAAK3uB,GAAY,KAA6B,OAASA,EAAQ,QAAU,KAAUA,GAAY,KAA6B,OAASA,EAAQ,SAAW,GAC7I,KAAK,SAAS6Q,EAAM,GAAM,EAAI,EAErC8d,IAAS,EACF,kBAEJA,EAAO,iBAElB,GAAIxP,EAAQ,EACR,OAAKnf,GAAY,KAA6B,OAASA,EAAQ,SAAW,GAC/D,KAAK,SAAS6Q,EAAM,GAAM,EAAI,EAErCsO,IAAU,EACH,kBAEJA,EAAQ,eAEnB,GAAIC,EAAU,EACV,OAAIA,IAAY,EACL,qBAEJA,EAAU,mBAErB,MAAMuW,EAAU,KAAK,MAAM5G,EAAO,GAAI,EACtC,OAAI4G,EAAU,EACNA,IAAY,EACL,sBAEJA,EAAU,oBAEd,SACV,CAID,OAAO,eAAe9kB,EAAM7Q,EAAS,CACjC,IAAIK,EACJ,GAAI,CAACwQ,EAED,MAAO,IAEX,MAAM8oB,EAAWrlB,GAAS,WAAWzD,CAAI,EAAE,SAASxQ,EAAKL,GAAY,KAA6B,OAASA,EAAQ,YAAc,MAAQK,IAAO,OAASA,EAAK,KAAK,QAAQ,EACrKyR,EAAO6nB,EAAS,KACtB,OAAO,KAAK,MAAMA,EAAS,KAAK,EAAI,IAAM7nB,CAC7C,CAID,OAAO,KAAKjB,EAAM,CACd,OAAKA,EAIYyD,GAAS,WAAWzD,CAAI,EAAE,QAAQ,KAAK,QAAQ,EAChD,KAHL,CAId,CAED,OAAO,YAAYA,EAAM,CACrB,OAAKA,EAIYyD,GAAS,WAAWzD,CAAI,EAAE,QAAQ,KAAK,QAAQ,EAChD,MAHL,CAId,CAID,OAAO,YAAYA,EAAM+oB,EAAW,GAAO,CACvC,OAAK/oB,EAIE,KAAK,QAAQA,CAAI,EAAI,KAAO,KAAK,KAAKA,EAAM+oB,CAAQ,EAFhD,GAGd,CAID,OAAO,gBAAgB/oB,EAAMmpB,EAAW,GAAOJ,EAAW,GAAO,CAC7D,OAAK/oB,EAIE,KAAK,QAAQA,CAAI,EAAI,KAAO,KAAK,SAASA,EAAMmpB,EAAUJ,CAAQ,EAF9D,GAGd,CAID,OAAO,WAAW/oB,EAAM+oB,EAAW,GAAM,CACrC,GAAI,CAAC/oB,EAED,MAAO,IAEX,MAAM8oB,EAAWrlB,GAAS,WAAWzD,CAAI,EAAE,QAAQ,KAAK,QAAQ,EAChE,OAAQ8oB,EAAS,IAAM,IAAI,SAAS,EAAG,GAAG,EAAI,KAAOA,EAAS,MAAQ,IAAI,SAAS,EAAG,GAAG,GAAKC,EAAW,IAAMD,EAAS,KAAO,GAClI,CAID,OAAO,QAAQ9oB,EAAM,CACjB,GAAI,CAACA,EAED,MAAO,IAEX,MAAM8oB,EAAWrlB,GAAS,WAAWzD,CAAI,EAAE,QAAQ,KAAK,QAAQ,EAEhE,OADa8oB,EAAS,KACR,KAAOA,EAAS,MAAQ,IAAI,SAAS,EAAG,GAAG,EAAI,KAAOA,EAAS,IAAM,IAAI,SAAS,EAAG,GAAG,CACzG,CAID,OAAO,YAAY9oB,EAAMopB,EAAU,CAC/B,GAAI,CAACppB,EAED,MAAO,IAEX,MAAM8oB,EAAWrlB,GAAS,WAAWzD,CAAI,EAAE,QAAQopB,GAAsD,KAAK,QAAQ,EAEtH,OADaN,EAAS,KACR,KAAOA,EAAS,MAAQ,IAAI,SAAS,EAAG,GAAG,EAAI,KAAOA,EAAS,IAAM,IAAI,SAAS,EAAG,GAAG,EAAI,KAAOA,EAAS,KAAO,IAAI,SAAS,EAAG,GAAG,EAAI,KAAOA,EAAS,OAAS,IAAI,SAAS,EAAG,GAAG,EAAI,KAAOA,EAAS,OAAS,IAAI,SAAS,EAAG,GAAG,CACvP,CACD,OAAO,UAAUO,EAAWC,EAAa,GAAOP,EAAW,GAAOQ,EAAc,KAAM,CAClF,OAAKxX,EAAU,KAAKsX,CAAS,IAAM,QAAUE,IAAgB,MAASA,IAAgB,GAC9ED,EACOvX,EAAU,YAAYsX,EAAWN,CAAQ,EAE7ChX,EAAU,KAAKsX,EAAWN,CAAQ,EAEzCO,EACOvX,EAAU,gBAAgBsX,EAAWN,CAAQ,EAEjDhX,EAAU,SAASsX,EAAWN,CAAQ,CAChD,CACD,OAAO,QAAQS,EAASF,EAAa,GAAOP,EAAW,GAAOQ,EAAc,KAAM,CAC9E,OAAKxX,EAAU,KAAKyX,CAAO,IAAM,SAAWD,IAAgB,MAASA,IAAgB,GAC7ED,EACOvX,EAAU,YAAYyX,EAAST,CAAQ,EAE3ChX,EAAU,KAAKyX,EAAST,CAAQ,EAEvCO,EACOvX,EAAU,gBAAgByX,EAAST,CAAQ,EAE/ChX,EAAU,SAASyX,EAAS,GAAOT,CAAQ,CACrD,CACD,OAAO,UAAUM,EAAWG,EAASC,EAAO,MAAOF,EAAc,KAAM,CACnE,GAAIxX,EAAU,QAAQsX,CAAS,IAAMtX,EAAU,QAAQyX,CAAO,EAC1D,OAAIzX,EAAU,KAAKsX,CAAS,IAAMtX,EAAU,KAAKyX,CAAO,GAAKD,IAAgB,GAClExX,EAAU,YAAYsX,CAAS,GAAKE,IAAgB,GAAS,KAAOxX,EAAU,KAAKsX,CAAS,EAAK,IAExGtX,EAAU,KAAKsX,CAAS,IAAM,QAAUtX,EAAU,KAAKyX,CAAO,IAAM,QAC7DzX,EAAU,YAAYsX,CAAS,EAEnCtX,EAAU,YAAYsX,CAAS,EAAI,KAAOtX,EAAU,KAAKsX,CAAS,EAAII,EAAO1X,EAAU,KAAKyX,CAAO,EAG9G,MAAME,EAAgBL,EAAY,IAAI,MAAUtX,EAAU,KAAKsX,CAAS,IAAMtX,EAAU,KAAKyX,CAAO,GAAKzX,EAAU,KAAKsX,CAAS,IAAMtX,EAAU,KAAK,IAAI,IAAM,EAChK,GAAIA,EAAU,QAAQsX,CAAS,IAAMtX,EAAU,QAAQ,IAAI,KAAKyX,EAAQ,QAAO,EAAK,GAAK,GAAK,GAAK,GAAI,CAAC,GAAKzX,EAAU,QAAQyX,CAAO,GAAK,SAAWzX,EAAU,QAAQsX,CAAS,GAAK,QAClL,OAAOtX,EAAU,YAAYsX,EAAWK,CAAa,GAAKH,IAAgB,GAAS,KAAOxX,EAAU,KAAKsX,CAAS,EAAII,EAAO1X,EAAU,KAAKyX,CAAO,EAAK,IAE5J,GAAIzX,EAAU,YAAYsX,CAAS,IAAMtX,EAAU,YAAYyX,CAAO,GAAKzX,EAAU,KAAKsX,CAAS,IAAMtX,EAAU,KAAKyX,CAAO,IAEvHD,IAAgB,IAAUxX,EAAU,KAAKsX,CAAS,IAAM,QAAUtX,EAAU,KAAKyX,CAAO,IAAM,SAAU,CACxG,MAAMR,EAAcvlB,GAAS,IAAK,EAAC,QAAQ,KAAK,QAAQ,EAAE,KACpDkmB,EAAgBlmB,GAAS,WAAW4lB,CAAS,EAAE,QAAQ,KAAK,QAAQ,EACpEO,EAAcnmB,GAAS,WAAW+lB,CAAO,EAAE,QAAQ,KAAK,QAAQ,EAChEvoB,EAAO0oB,EAAc,KAC3B,OAAOA,EAAc,IAAMF,EAAOG,EAAY,IAAM,IAAM,KAAK,MAAMD,EAAc,KAAK,GAAKX,IAAgB/nB,GAAQooB,EAAY,IAAI,KAAU,IAAMpoB,EAAQ,GAChK,CAEL,OAAO8Q,EAAU,UAAUsX,EAAW,GAAOK,EAAeH,CAAW,EAAIE,EAAO1X,EAAU,QAAQyX,EAAS,GAAOE,EAAeH,CAAW,CACjJ,CAID,OAAO,KAAKvpB,EAAMyN,EAAW,KAAK,SAAU,CACxC,GAAI,CAACzN,EAED,MAAO,IAEX,MAAM8oB,EAAWrlB,GAAS,WAAWzD,CAAI,EAAE,QAAQyN,CAAQ,EAC3D,OAAOqb,EAAS,KAAO,KAAOA,EAAS,OAAS,IAAI,SAAS,EAAG,GAAG,CACtE,CACD,OAAO,MAAM9oB,EAAO,IAAI,KAAQ,CAC5B,OAAOyD,GAAS,WAAWzD,CAAI,EAAE,QAAQ,KAAK,QAAQ,CACzD,CAID,OAAO,QAAQA,EAAM,CACjB,GAAI,CAACA,EAED,MAAO,IAEX,MAAM8oB,EAAWrlB,GAAS,WAAWzD,CAAI,EAAE,QAAQ,KAAK,QAAQ,EAChE,OAAQ8oB,EAAS,KAAO,IAAI,SAAS,EAAG,GAAG,EAAI,KAAOA,EAAS,OAAS,IAAI,SAAS,EAAG,GAAG,CAC9F,CACD,OAAO,YAAY71B,EAAO,CACtB,SAAS42B,EAAWp4B,EAAOlB,EAAOu5B,EAAM,CACpC,OAAOA,EAAK,QAAQr4B,CAAK,IAAMlB,CAClC,CACD,OAAO0C,EAAM,OAAO42B,CAAU,CACjC,CAID,OAAO,SAAS7pB,EAAMmpB,EAAW,GAAOJ,EAAW,GAAO,CACtD,OAAK/oB,EAIDmpB,GAAY,KAAK,KAAKnpB,CAAI,IAAM,OACzB,KAAK,KAAKA,EAAM+oB,CAAQ,EAE5B,KAAK,KAAK/oB,EAAM+oB,CAAQ,EAAI,OAAS,KAAK,KAAK/oB,CAAI,EAL/C,GAMd,CACD,OAAO,QAAQvO,EAAO,CAClB,MAAMwO,EAAY,IAAI,KAAK,aAAa,OAAO,EAAE,OAAO,KAAK,IAAIxO,CAAK,CAAC,EAEvE,OADWA,EAAQ,EAAI,KAAO,IAAMwO,CAEvC,CACD,OAAO,MAAMxO,EAAO,CAChB,MAAMwO,EAAY,IAAI,KAAK,aAAa,QAAS,CAAE,sBAAuB,CAAG,GAAE,OAAO,KAAK,IAAIxO,CAAK,CAAC,EAErG,OADWA,EAAQ,EAAI,KAAO,IAAMwO,CAEvC,CACD,OAAO,WAAWxO,EAAO,CACrB,MAAMwO,EAAY,IAAI,KAAK,aAAa,OAAO,EAAE,OAAO,KAAK,IAAIxO,EAAQ,GAAG,CAAC,EAE7E,OADWA,EAAQ,EAAI,KAAO,IAAMwO,EACzB,GACd,CACD,OAAO,MAAMxO,EAAOs4B,EAAqB,GAAM,CAC3C,MAAM9pB,EAAY,IAAI,KAAK,aAAa,QAAS,CAC7C,MAAO,WACP,SAAU,KACtB,CAAS,EAAE,OAAO,KAAK,IAAIxO,CAAK,EAAI,GAAG,EACzB4F,GAAK5F,EAAQ,EAAI,KAAO,IAAMwO,EAAU,QAAQ,IAAI,OAAO,MAAO,IAAI,EAAG,GAAG,EAClF,OAAI8pB,IAAuB1yB,EAAE,SAAS,KAAK,GAAKA,EAAE,SAAS,KAAK,GACrDA,EAAE,UAAU,EAAGA,EAAE,OAAS,CAAC,EAE/BA,CACV,CACD,OAAO,YAAY5F,EAAO,CACtB,OAAIA,GAAS,EACF,KAAO,KAAK,MAAMA,CAAK,EAE3B,KAAK,MAAMA,CAAK,CAC1B,CACD,OAAO,sBAAsBkb,EAAQ,CACjC,OAAOA,EAAO,OAAO,CAAC,EAAE,YAAW,EAAKA,EAAO,MAAM,CAAC,CACzD,CACD,OAAO,gBAAgBA,EAAQ,CAC3B,OAAOA,EAAO,MAAM,GAAG,EAAE,IAAIrT,GAAK,KAAK,sBAAsBA,CAAC,CAAC,EAAE,KAAK,GAAG,CAC5E,CACD,OAAO,SAAS0wB,EAAO,CACnB,OAAIA,EAAQ,IACDA,EAAQ,SAEfA,EAAQ,IAAO,IACR,KAAK,MAAMA,EAAQ,GAAI,EAAI,MAElCA,EAAQ,IAAO,IAAO,IACf,KAAK,MAAMA,EAAQ,IAAO,GAAG,EAAI,GAAK,MAE1C,KAAK,MAAMA,EAAQ,IAAO,IAAO,EAAE,EAAI,IAAM,KACvD,CACD,OAAO,cAAczb,EAAS,CAC1B,MAAM/S,EAAI,KAAK,MAAM+S,EAAU,EAAE,EAC3B7S,EAAI6S,EAAU/S,EAAI,GACxB,OAAQA,EAAI,IAAI,SAAS,EAAG,GAAG,EAAI,KAAOE,EAAI,IAAI,SAAS,EAAG,GAAG,CACpE,CACD,OAAO,UAAU6S,EAAS,CACtB,MAAM/S,EAAI,KAAK,MAAM+S,EAAU,EAAE,EAC3B7S,EAAI6S,EAAU/S,EAAI,GACxB,OAAQA,EAAI,IAAI,SAAS,EAAG,GAAG,GAAKE,EAAI,IAAI,SAAS,EAAG,GAAG,CAC9D,CACD,OAAO,QAAQ6S,EAAS,CACpB,MAAM/S,EAAI,KAAK,MAAM+S,EAAU,EAAE,EAC3B7S,EAAI6S,EAAU/S,EAAI,GACxB,OAAOA,EAAI,KAAOE,EAAI,IAAI,SAAS,EAAG,GAAG,CAC5C,CACD,OAAO,WAAWuuB,EAAQ,CACtB,OAAKA,EAGEA,EACF,QAAQ,KAAM,OAAO,EACrB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,QAAQ,EACtB,QAAQ,KAAM,QAAQ,EAPhB,EAQd,CACD,OAAO,SAASh3B,EAAOkqB,EAAW+M,EAAe,CAC7Cj3B,EAAQA,EAAM,QACd,MAAMk3B,EAAOl3B,EAAM,MACnB,OAAIk3B,IAAS,OACF,GAEPl3B,EAAM,SAAW,EACVk3B,EAAO,GAEXl3B,EAAM,KAAKkqB,CAAS,EAAI+M,EAAgBC,CAClD,CACD,OAAO,cAAc7xB,EAAQ,CACzB,OAAIA,IAAW,EACJ,SAEPA,IAAW,EACJ,SAEPA,IAAW,EACJ,QAEJA,EAAS,GACnB,CACD,OAAO,WAAWwe,EAAK5G,EAAUka,EAAQ,CACrC,OAAItT,IAAQ,EACD,OAAS5G,EAEb,KAAK,MAAM4G,CAAG,EAAI,IAAMsT,CAClC,CACD,OAAO,mBAAmBC,EAAO,CAC7B,MAAMv5B,EAAIu5B,EAAM,QAAQ,KAAK,CAACl1B,EAAGC,IAAM2yB,GAAO,MAAM5yB,EAAE,SAAS,cAAcC,EAAE,QAAQ,EAAGD,EAAE,UAAU,cAAcC,EAAE,SAAS,CAAC,CAAC,EAC3Hk1B,EAAa,KAAK,YAAYx5B,EAAE,IAAIA,GAAKA,EAAE,SAAS,CAAC,EACrDy5B,EAAY,KAAK,YAAYz5B,EAAE,IAAIA,GAAKA,EAAE,QAAQ,CAAC,EACzD,OAAO,KAAK,SAASw5B,EAAY,KAAM,MAAM,GAAKC,EAAU,OAAS,EAAK,IAAMA,EAAU,KAAK,GAAG,EAAK,GAC1G,CACD,OAAO,aAAa5yB,EAAK6yB,EAAW,CAChC,OAAK7yB,EAGD6yB,IAAc,EACP7yB,EAAI,OAAO,EAAG,CAAC,EAAE,kBAAiB,EAE5Boa,EAAU,KAAKpa,CAAG,EAAE,MAAM,GAAG,EAC9B,MAAM,EAAG6yB,CAAS,EAAE,IAAIlxB,GAAKA,EAAE,OAAO,EAAG,CAAC,EAAE,kBAAmB,GAAE,KAAK,EAAE,EAN7E,EAOd,CACD,OAAO,cAAc7H,EAAOuT,EAAO,CAC/B,IAAI5J,EAAS,GACb,UAAW6J,KAAQD,EAAO,CACtB,GAAI,OAAOC,GAAS,SAAU,CAC1B7J,GAAU6J,EACV,QACH,CAGD,GAFA7J,GAAU3J,EAAM,UAAU,EAAGwT,EAAK,MAAM,EACxCxT,EAAQA,EAAM,UAAUwT,EAAK,MAAM,EAC/BxT,EAAM,SAAW,EACjB,KAEP,CACD,OAAO2J,CACV,CACL,CACA2W,EAAU,SAAW,kBC/cd,MAAM0Y,EAAc,CACvB,OAAO,aAAa9yB,EAAK,CACrB,MAAM+yB,EAAY,CAAC,WAAY,WAAY,YAAa,aAAc,WAAY,UAAW,WAAY,WAAY,YAAa,YAAa,YAAa,YAAa,WAAW,EAEpL,GAAI,CADU,sIACH,KAAK/yB,CAAG,EACR,SAEX,UAAW0C,KAAKqwB,EACZ,GAAI/yB,EAAI,SAAS,IAAM0C,CAAC,EACb,SAGR,QACX,CACA,OAAO,oBAAoB1C,EAAK,CACrB,YAAK,oBAAoB,KAAKA,CAAG,CAC5C,CACA,OAAO,OAAOlG,EAAO,CACb,cAAOA,GAAU,SACV,GAEJA,EAAM,SAAW,IAAMA,EAAM,CAAC,IAAM,KAAOA,EAAM,EAAE,IAAM,KAAOA,EAAM,EAAE,IAAM,KAAOA,EAAM,EAAE,IAAM,GAC9G,CACA,OAAO,2BAA2BkG,EAAK,CAEnC,OADgB,KAAK,oBAAoBA,CAAG,EAI/BA,EAAIA,EAAI,OAAS,CAAC,IACf,IAHL,EAIf,CACA,OAAO,4BAA4BgjB,EAAM,CACrC,MAAMgQ,EAAUhQ,EAAK,QAAQ,WAAY,EAAE,EACvC,GAAAgQ,EAAQ,SAAW,GACZ,SAEL,MAAAC,EAAU,SAASD,EAAQ,UAAU,EAAGA,EAAQ,OAAS,CAAC,CAAC,EAC3DE,EAAW,SAASF,EAAQ,UAAUA,EAAQ,OAAS,CAAC,CAAC,EAEzDG,EAAe,GAAMF,EAAU,GAC/BG,EAAgB,IAAO,IAAaH,GAAW,GAIjD,OAAAC,IAAaC,GAAgBD,IAAaE,CAKlD,CACA,OAAO,+BAA+BpQ,EAAMqQ,EAAU,CAClD,GAAI,CAACA,EACM,SAGL,MAAAC,EAAY,KAAK,8BAA8BD,CAAQ,EAC7D,MAAI,OAAK,4BAA4BrQ,CAAI,EAAE,WAAWsQ,CAAS,CAInE,CACA,OAAO,2BAA2BtQ,EAAM,CAC7B,OAAAA,EAAK,QAAQ,WAAY,EAAE,CACtC,CACA,OAAO,wCAAyC,CACrC,OACH,QAAUlpB,GACC,KAAK,2BAA2BA,CAAK,EAEhD,UAAYA,GACD,KAAK,4BAA4BA,CAAK,CACjD,CAER,CACA,OAAO,4BAA4BkpB,EAAM,CAC/B,MAAAgQ,EAAU,KAAK,2BAA2BhQ,CAAI,EAE7C,OAAA5I,EAAU,cAAc4Y,EAAS,CACpC,CAAE,OAAQ,CAAE,EACZ,IACA,CAAE,OAAQ,CAAE,EACZ,IACA,CAAE,OAAQ,CAAE,EACZ,IACA,CAAE,OAAQ,CAAE,EACZ,IACA,CAAE,OAAQ,CAAE,EACf,CACL,CACA,OAAO,8BAA8B3qB,EAAM,CAEvC,MAAMiB,EAAO8Q,EAAU,KAAK/R,CAAI,EAAE,QAAQ,EACpCkB,EAAQ6Q,EAAU,YAAY/R,CAAI,EAAE,QAAQ,EAC5CmB,EAAM4Q,EAAU,IAAI/R,CAAI,EAC9B,OAAOiB,EAAK,UAAU,CAAC,EAAI,IAAMC,EAAM,SAAS,EAAG,GAAG,EAAI,IAAMC,EAAI,SAAS,EAAG,GAAG,EAAI,GAC3F,CACJ,CACAspB,GAAc,oBAAsB,cClG7B,SAASS,GAAM3nB,EAAI,CACtB,OAAO,IAAI,QAAQ4nB,GAAW,WAAW,IAAMA,EAAQ,MAAS,EAAG5nB,CAAE,CAAC,CAC1E,CCDO,MAAM6nB,EAAc,CAKvB,OAAO,SAASC,EAAUC,EAAQ,CAC9B,OAAAD,EAAWA,EAAS,UAAU,KAAK,EAAE,QAAQ,mBAAoB,EAAE,EAAE,YAAW,EAAG,QAAQ,MAAO,GAAG,EAAE,KAAI,EAC3GC,EAASA,EAAO,UAAU,KAAK,EAAE,QAAQ,mBAAoB,EAAE,EAAE,YAAW,EAAG,QAAQ,MAAO,GAAG,EAAE,KAAI,EAChGD,EAAS,SAASC,CAAM,CAClC,CAKD,OAAO,YAAYD,EAAUC,EAAQC,EAAoB,GAAIC,EAAe,EAAG,CAC3E,GAAIH,EAAS,SAAW,EACpB,MAAO,GAEXA,EAAWA,EAAS,UAAU,KAAK,EAAE,QAAQ,mBAAoB,EAAE,EAAE,YAAW,EAAG,QAAQ,MAAO,GAAG,EAAE,KAAI,EAC3GC,EAASA,EAAO,UAAU,KAAK,EAAE,QAAQ,mBAAoB,EAAE,EAAE,YAAW,EAAG,QAAQ,MAAO,GAAG,EAAE,KAAI,EACvG,MAAMG,EAAU,KAAK,QAAQH,EAAQD,CAAQ,EAC7C,OAAKG,IAAiB,MAAQC,EAAUD,KAAkBD,IAAsB,MAAQE,GAAWJ,EAAS,OAASE,EAAoB,KAC9HE,EAEJ,CACV,CAID,OAAO,QAAQC,EAAM9wB,EAAO+wB,EAAa,GAAM,CAC3C,GAAID,EAAK,SAAW,GAAK9wB,EAAM,SAAW,EACtC,MAAO,GAEX,MAAMgxB,EAAYF,EAAK,CAAC,EAClBG,EAAajxB,EAAM,CAAC,EAC1B,OAAIgxB,IAAcC,EACP,EAAI,KAAK,QAAQH,EAAK,OAAO,CAAC,EAAG9wB,EAAM,OAAO,CAAC,EAAG,EAAI,EAE7D+wB,EACO,KAAK,IAAI,KAAK,QAAQD,EAAM9wB,EAAM,OAAO,CAAC,EAAG,EAAK,EAAG,KAAK,QAAQA,EAAO8wB,EAAK,OAAO,CAAC,EAAG,EAAK,EAAG,KAAK,QAAQA,EAAK,OAAO,CAAC,EAAG9wB,EAAM,OAAO,CAAC,EAAG,EAAK,EAAG,KAAK,QAAQA,EAAM,OAAO,CAAC,EAAG8wB,EAAK,OAAO,CAAC,EAAG,EAAK,CAAC,EAG/M,KAAK,QAAQA,EAAM9wB,EAAM,OAAO,CAAC,EAAG,EAAK,CACnD,CACD,OAAO,WAAW/D,EAAUi1B,EAAa,CAErC,OAAAj1B,EAAWA,EAAS,UAAU,KAAK,EAAE,QAAQ,mBAAoB,EAAE,EAAE,YAAW,EAAG,QAAQ,MAAO,GAAG,EAAE,KAAI,EAC3Gi1B,EAAcA,EAAY,UAAU,KAAK,EAAE,QAAQ,mBAAoB,EAAE,EAAE,YAAW,EAAG,QAAQ,MAAO,GAAG,EAAE,KAAI,EAC1G,KAAK,QAAQj1B,EAAUi1B,CAAW,CAC5C,CACD,OAAO,UAAUj1B,EAAUi1B,EAAa,CAEpC,OAAAj1B,EAAWA,EAAS,UAAU,KAAK,EAAE,QAAQ,mBAAoB,EAAE,EAAE,YAAW,EAAG,QAAQ,MAAO,GAAG,EAAE,KAAI,EAC3Gi1B,EAAcA,EAAY,UAAU,KAAK,EAAE,QAAQ,mBAAoB,EAAE,EAAE,YAAW,EAAG,QAAQ,MAAO,GAAG,EAAE,KAAI,EAC1G,KAAK,IAAIj1B,EAAS,OAAQi1B,EAAY,MAAM,EAAI,KAAK,QAAQj1B,EAAUi1B,CAAW,CAC5F,CAID,OAAO,WAAWn0B,EAAK,CACnB,MAAMqjB,EAAKjJ,EAAU,cAAcpa,CAAG,EACtC,OAAIqjB,EAAG,YAAa,IAAKA,CAI5B,CACL,CCnEY,MAAC+Q,GAAW,CAACC,EAAMC,IAAU,CACrC,IAAIC,EACAC,EACJ,OAAO,UAAY,CACf,MAAM18B,EAAU,KAEVi1B,EAAO,UACTyH,GACA,aAAaD,CAAQ,EAEzBC,EAAU,KAAK,MACfD,EAAW,WAAW,UAAY,CAC1B,KAAK,MAAQC,GAAWF,IACxBD,EAAK,MAAMv8B,EAASi1B,CAAI,EACxByH,EAAU,KAAK,MAEtB,EAAEF,GAAS,KAAK,IAAG,EAAKE,EAAQ,CACzC,CACA,EChBU,IAACC,IACV,SAAUA,EAAS,CAChBA,EAAQ,QAAa,KACrBA,EAAQ,YAAiB,KACzBA,EAAQ,WAAgB,KACxBA,EAAQ,OAAY,KACpBA,EAAQ,QAAa,KACrBA,EAAQ,OAAY,KACpBA,EAAQ,cAAmB,KAC3BA,EAAQ,YAAiB,KACzBA,EAAQ,YAAiB,KACzBA,EAAQ,cAAmB,KAC3BA,EAAQ,aAAkB,KAC1BA,EAAQ,QAAa,KACrBA,EAAQ,SAAc,KACtBA,EAAQ,MAAW,OACvB,GAAGA,KAAYA,GAAU,CAAE,EAAC,EACrB,SAASC,GAAc,CAAE,QAAAC,EAAS,mBAAAC,GAAsB,CAC3D,OAAID,IAAYF,GAAQ,MACbG,EAEJD,CACX,CAEO,MAAME,GAAiB,IAAI90B,GAAY00B,EAAO,EAC9C,MAAMK,EAAc,CACvB,OAAO,QAAQH,EAAS,CACpB,OAAQA,EAAO,CACX,KAAKF,GAAQ,QAAS,MAAO,SAC7B,KAAKA,GAAQ,YAAa,MAAO,YACjC,KAAKA,GAAQ,WAAY,MAAO,YAChC,KAAKA,GAAQ,OAAQ,MAAO,YAC5B,KAAKA,GAAQ,QAAS,MAAO,YAC7B,KAAKA,GAAQ,OAAQ,MAAO,SAC5B,KAAKA,GAAQ,cAAe,MAAO,sBACnC,KAAKA,GAAQ,YAAa,MAAO,cACjC,KAAKA,GAAQ,YAAa,MAAO,cACjC,KAAKA,GAAQ,cAAe,MAAO,WACnC,KAAKA,GAAQ,aAAc,MAAO,mBAClC,KAAKA,GAAQ,QAAS,MAAO,aAC7B,KAAKA,GAAQ,SAAU,MAAO,WAC9B,KAAKA,GAAQ,MAAO,MAAO,YAC9B,CACJ,CACD,OAAO,SAAU,CACb,OAAO,OAAO,OAAOA,EAAO,EAAE,IAAKE,IACxB,CACH,KAAM,KAAK,QAAQA,CAAO,EAC1B,MAAOA,CACvB,EACS,CACJ,CACL,CCjDO,MAAMI,WAAgB73B,EAAY,CACrC,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,OAAS,GACd,KAAK,OAAS,GACd,KAAK,WAAa,GAClB,KAAK,KAAO,EACf,CACD,IAAI,IAAK,CACL,OAAO,KAAK,UACf,CACD,OAAO,iBAAkB,CACrB,OAAOqD,CACV,CACD,UAAW,CACP,OAAO,KAAK,OAAS,IAAM,KAAK,OAAS,KAAO,KAAK,WAAa,IAAM,KAAK,KAAO,KAAOu0B,GAAc,QAAQ,KAAK,OAAO,CAChI,CACD,aAAc,CACV,OAAO,KAAK,OAAS,IAAM,KAAK,OAAS,KAAO,KAAK,IACxD,CACD,aAAc,CACV,OAAO,KAAK,aACf,CACD,gBAAgBE,EAAgB,CAC5B,OAAI,KAAK,SAAWA,EACT,KAAK,OAAS,KAAO,KAAK,KAE9B,KAAK,OAAS,KAAO,KAAK,KAAO,KAAOF,GAAc,QAAQ,KAAK,OAAO,EAAI,GACxF,CAKD,OAAO,cAAcH,EAAU,cAAe,CAC1C,OAAOI,GAAQ,OAAO,CAClB,OAAQ,GACR,OAAQ,GACR,WAAY,GACZ,KAAM,GACN,QAAAJ,CACZ,CAAS,CACJ,CAID,WAAY,CACJlB,GAAc,WAAW,KAAK,MAAM,IACpC,KAAK,OAASrZ,EAAU,gBAAgB,KAAK,OAAO,YAAW,CAAE,GAEjEqZ,GAAc,WAAW,KAAK,IAAI,IAClC,KAAK,KAAOrZ,EAAU,gBAAgB,KAAK,KAAK,YAAW,CAAE,GAEjE,KAAK,OAAS,KAAK,OAAO,KAAI,EAC9B,KAAK,OAASA,EAAU,sBAAsB,KAAK,OAAO,KAAI,CAAE,EAChE,KAAK,KAAOA,EAAU,sBAAsB,KAAK,KAAK,KAAI,CAAE,EAC5D,KAAK,WAAa,KAAK,WAAW,KAAI,EAAG,mBAC5C,CACD,OAAO,iBAAiB6a,EAAcC,EAAYC,EAAMR,EAAS,CAC7D,KAAM,CAAE,OAAAS,EAAQ,OAAAz0B,CAAM,EAAKo0B,GAAQ,iBAAiBE,CAAY,EAChE,GAAIC,EAAW,QAAU,EACrB,MAAM,IAAIv9B,GAAY,CAClB,KAAM,gBACN,QAAS,mBACT,MAAO,oBACvB,CAAa,EAEL,GAAIw9B,EAAK,QAAU,EACf,MAAM,IAAIx9B,GAAY,CAClB,KAAM,gBACN,QAAS,aACT,MAAO,oBACvB,CAAa,EAEL,IAAI0L,EACJ,GAAI,CACAA,EAAIwxB,GAAe,OAAO,IAAIp0B,GAAWk0B,EAAS,CAAE,QAAS,CAAG,EAAC,CACpE,MACS,CACN,MAAM,IAAIh9B,GAAY,CAClB,KAAM,gBACN,QAAS,kBACT,MAAO,qBACP,MAAO,SACvB,CAAa,CACJ,CAED,GADAw9B,EAAOA,EAAK,OACRA,EAAK,MAAM,OAAO,EAClB,MAAM,IAAIx9B,GAAY,CAClB,KAAM,gBACN,QAAS,eACT,MAAO,yCACP,MAAO,MACvB,CAAa,EAEL,GAAI0L,IAAMoxB,GAAQ,UACdS,EAAaA,EAAW,OACpBA,EAAW,SAAW,GAAK,CAACA,EAAW,MAAM,UAAU,GACvD,MAAM,IAAIv9B,GAAY,CAClB,KAAM,gBACN,QAAS,qBACT,MAAO,+DACP,MAAO,YAC3B,CAAiB,EAGT,GAAI0L,IAAMoxB,GAAQ,YAAa,CAC3BS,EAAaA,EAAW,OACxB,MAAMG,EAAYH,EAAW,UAAU,EAAG,CAAC,EACrCI,EAAYJ,EAAW,UAAU,CAAC,EAAE,KAAI,EAAG,oBACjD,GAAIG,EAAU,SAAW,GAAK,CAACA,EAAU,MAAM,UAAU,GAAKC,EAAU,SAAW,GAAK,CAACA,EAAU,MAAM,UAAU,EAC/G,MAAM,IAAI39B,GAAY,CAClB,KAAM,gBACN,QAAS,qBACT,MAAO,qGACP,MAAO,YAC3B,CAAiB,EAELu9B,EAAaG,EAAY,IAAMC,CAClC,CACD,MAAMC,EAAUR,GAAQ,OAAO,CAC3B,OAAAK,EACA,OAAAz0B,EACA,WAAYu0B,EACZ,KAAMC,EACN,QAAS9xB,CACrB,CAAS,EACD,OAAAkyB,EAAQ,UAAS,EACVA,CACV,CACD,OAAO,iBAAiBN,EAAc,CAClC,GAAIA,EAAa,QAAU,EACvB,MAAM,IAAIt9B,GAAY,CAClB,KAAM,gBACN,QAAS,uBACT,MAAO,gCACvB,CAAa,EAEL,GAAIs9B,EAAa,SAAS,GAAG,EACzB,MAAM,IAAIt9B,GAAY,CAClB,KAAM,gBACN,QAAS,uBACT,MAAO,qGACvB,CAAa,EAEL,GAAIs9B,EAAa,OAAS,IAEtB,MAAM,IAAIt9B,GAAY,CAClB,KAAM,gBACN,QAAS,uBACT,MAAO,gEACvB,CAAa,EAGL,MAAMmlB,EAAQ,6CAA6C,KAAKmY,CAAY,EAC5E,GAAI,CAACnY,EACD,MAAM,IAAInlB,GAAY,CAClB,KAAM,gBACN,QAAS,mCACT,MAAO,iDACvB,CAAa,EAEL,MAAMgJ,EAASmc,EAAM,CAAC,EAChBsY,EAAStY,EAAM,CAAC,EACtB,MAAO,CACH,OAAAnc,EACA,OAAAy0B,CACZ,CACK,CACD,mBAAoB,CAChB,GAAI,KAAK,OAAO,KAAI,EAAG,QAAU,EAC7B,MAAM,IAAIz9B,GAAY,CAClB,KAAM,gBACN,QAAS,eACT,MAAO,wBACvB,CAAa,EAEL,GAAI,KAAK,OAAO,KAAI,EAAG,QAAU,EAC7B,MAAM,IAAIA,GAAY,CAClB,KAAM,gBACN,QAAS,eACT,MAAO,6BACvB,CAAa,EAEL,GAAI,KAAK,WAAW,KAAI,EAAG,QAAU,EACjC,MAAM,IAAIA,GAAY,CAClB,KAAM,gBACN,QAAS,oBACT,MAAO,0BACvB,CAAa,EAEL,GAAI,KAAK,KAAK,KAAI,EAAG,QAAU,EAC3B,MAAM,IAAIA,GAAY,CAClB,KAAM,gBACN,QAAS,aACT,MAAO,0BACvB,CAAa,EAEL,GAAI,KAAK,SAAW,KAChB,MAAM,IAAIA,GAAY,CAClB,KAAM,gBACN,QAAS,gBACT,MAAO,uBACvB,CAAa,CAER,CACL,CACAuL,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGw0B,GAAQ,UAAW,SAAU,MAAM,EACtC7xB,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGw0B,GAAQ,UAAW,SAAU,MAAM,EACtC7xB,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGw0B,GAAQ,UAAW,aAAc,MAAM,EAC1C7xB,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGw0B,GAAQ,UAAW,OAAQ,MAAM,EACpC7xB,EAAW,CACP7K,EAAM,CAAE,QAASw8B,GAAgB,aAAc,IAAM,YAAW,EAAI,CACxE,EAAGE,GAAQ,UAAW,UAAW,MAAM,EAChC,MAAMS,WAAyBT,EAAQ,CAC9C,CACA7xB,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGi1B,GAAiB,UAAW,SAAU,MAAM,EAC/CtyB,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAGi1B,GAAiB,UAAW,eAAgB,MAAM,EACrDtyB,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGi1B,GAAiB,UAAW,aAAc,MAAM,ECzO5C,MAAMC,WAAiBv4B,EAAY,CAC1C,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGk1B,GAAS,UAAW,KAAM,MAAM,EACnCvyB,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGk1B,GAAS,UAAW,OAAQ,MAAM,EACrCvyB,EAAW,CACP7K,EAAM,CAAE,QAASw8B,GAAgB,CACrC,EAAGY,GAAS,UAAW,UAAW,MAAM,ECTjC,MAAMC,WAAax4B,EAAY,CAClC,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,aAAe,IACvB,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGm1B,GAAK,UAAW,KAAM,MAAM,EAC/BxyB,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGm1B,GAAK,UAAW,OAAQ,MAAM,EACjCxyB,EAAW,CACP7K,EAAM,CAAE,QAASo9B,GAAU,CAC/B,EAAGC,GAAK,UAAW,WAAY,MAAM,EACrCxyB,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAGm1B,GAAK,UAAW,eAAgB,MAAM,EACzCxyB,EAAW,CACP7K,EAAM,CAAE,QAASw8B,GAAgB,CACrC,EAAGa,GAAK,UAAW,UAAW,MAAM,ECpB7B,MAAMC,WAAgBz4B,EAAY,CACrC,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GACZ,KAAK,YAAc,GACnB,KAAK,eAAiB,GACtB,KAAK,QAAU63B,GAAQ,eAC1B,CACD,OAAO,cAAcJ,EAAS,CAC1B,OAAOgB,GAAQ,OAAO,CAAE,QAASZ,GAAQ,cAAcJ,CAAO,CAAC,CAAE,CACpE,CACL,CACAzxB,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAGq9B,GAAQ,UAAW,KAAM,MAAM,EAClCzyB,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,QAAS,GAAG,CAAE,CAClD,EAAGo1B,GAAQ,UAAW,OAAQ,MAAM,EACpCzyB,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,QAAS,GAAG,CAAE,CAClD,EAAGo1B,GAAQ,UAAW,cAAe,MAAM,EAC3CzyB,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,CAAC,CAAE,CACtD,EAAGo1B,GAAQ,UAAW,iBAAkB,MAAM,EAC9CzyB,EAAW,CACP7K,EAAM,CAAE,QAAS08B,GAAS,CAC9B,EAAGY,GAAQ,UAAW,UAAW,MAAM,ECzBhC,MAAMC,WAAsB14B,EAAY,CAC3C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,OAAS,GACd,KAAK,UAAY,GACjB,KAAK,UAAY,EACpB,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAak2B,EAAI,CAAC,CAAE,CAC7C,EAAGE,GAAc,UAAW,SAAU,MAAM,EAC5C1yB,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAai2B,EAAQ,CAAC,CAAE,CACjD,EAAGG,GAAc,UAAW,YAAa,MAAM,EAC/C1yB,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAaq1B,EAAc,CAAC,CAAE,CACvD,EAAGe,GAAc,UAAW,YAAa,MAAM,ECjBxC,MAAMC,WAAgB34B,EAAY,CACrC,aAAc,CACV,MAAM,GAAG,SAAS,EAIlB,KAAK,KAAO,GACZ,KAAK,UAAY,KACjB,KAAK,cAAgB,KACrB,KAAK,QAAU,KACf,KAAK,oBAAsB,IAC9B,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,GAAM,aAAc,IAAMjI,GAAM,EAAI,CAClF,EAAGu9B,GAAQ,UAAW,KAAM,MAAM,EAClC3yB,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGs1B,GAAQ,UAAW,OAAQ,MAAM,EACpC3yB,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAGs1B,GAAQ,UAAW,YAAa,MAAM,EACzC3yB,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAGs1B,GAAQ,UAAW,gBAAiB,MAAM,EAC7C3yB,EAAW,CACP7K,EAAM,CAAE,QAAS08B,GAAS,SAAU,EAAI,CAAE,CAC9C,EAAGc,GAAQ,UAAW,UAAW,MAAM,EACvC3yB,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,GAAM,SAAU,GAAM,CACpE,EAAGs1B,GAAQ,UAAW,sBAAuB,MAAM,EClCnD,MAAeC,GAAA,CACX,OAAU,QACV,QAAW,SACX,QAAW,QACX,iBAAkB,SAClB,iBAAkB,aAClB,qBAAsB,WACtB,eAAgB,WAChB,kBAAmB,OACnB,MAAS,cACT,OAAU,iBACV,MAAS,aACT,UAAa,WACb,SAAY,aACZ,uBAA0B,sBAC1B,SAAY,gBACZ,gBAAmB,iCACnB,MAAS,WACT,KAAQ,OACR,YAAe,eACf,mBAAsB,oBACtB,eAAkB,mBAClB,gBAAmB,iCACnB,OAAU,WACV,QAAW,YACX,eAAkB,UAClB,iBAAoB,WACpB,qBAAwB,mBACxB,iBAAoB,6BACpB,gBAAmB,2BACnB,WAAc,uBACd,UAAa,mBACb,eAAkB,mBAClB,WAAc,gBACd,cAAiB,qBACjB,MAAS,iBACT,MAAS,QACT,cAAe,QACf,qBAAsB,kBACtB,OAAU,UACV,eAAkB,iBAClB,OAAU,cACV,GAAM,MACN,IAAO,MACP,aAAgB,eAChB,yBAA4B,mCAC5B,yBAA4B,mCAC5B,4BAA+B,iCAC/B,kCAAqC,wCACrC,4BAA+B,iCAC/B,qCAAwC,sCACxC,iBAAoB,qBACpB,kBAAqB,sBACrB,MAAS,2BACT,KAAQ,wBACR,SAAY,UACZ,aAAgB,mBAChB,eAAkB,wBAClB,iCAAoC,qCACpC,MAAS,QACT,yBAA4B,2BAC5B,iBAAoB,0BACpB,kBAAqB,8BACrB,QAAW,YACX,qBAAwB,qBACxB,iCAAoC,yCACpC,cAAiB,gBACjB,eAAkB,iBAClB,cAAiB,cACjB,SAAY,UACZ,QAAW,SACX,MAAS,QACT,kBAAqB,2BACrB,6BAAgC,sBAChC,SAAY,cACZ,MAAS,iBACT,YAAe,gBACf,YAAe,UACf,WAAc,QACd,KAAQ,eACR,KAAQ,QACR,MAAS,WACT,KAAQ,oBACR,mBAAsB,kBACtB,WAAc,wBACd,gBAAmB,+BACnB,yBAA4B,+BAC5B,wBAA2B,4BAC3B,yBAA4B,mBAC5B,4BAA+B,oCAC/B,2BAA8B,2BAC9B,gBAAmB,8BACnB,wBAA2B,sBAC3B,0BAA6B,sBAC7B,iBAAoB,iBACpB,OAAU,SACV,kBAAqB,QACrB,SAAY,QACZ,SAAY,gBACZ,iBAAoB,gBACpB,eAAkB,cAClB,OAAU,QACV,QAAW,SACX,SAAY,YACZ,KAAQ,YACR,gBAAmB,cACnB,eAAkB,yBAClB,sBAAyB,qBACzB,qBAAwB,mBACxB,YAAe,cACf,WAAc,YACd,QAAW,SACX,OAAU,QACV,YAAe,iBACf,cAAiB,WACjB,aAAgB,UAChB,6BAAgC,+BAChC,UAAa,kBACb,QAAW,aACX,QAAW,qBACX,SAAY,uBACZ,cAAiB,iBACjB,aAAgB,eAChB,YAAe,aACf,oBAAuB,YACvB,mBAAsB,WACtB,WAAc,cACd,SAAY,YACZ,YAAe,cACf,mBAAoB,aACpB,WAAc,aACd,WAAc,iBACd,WAAc,eACd,MAAS,UACT,SAAY,WACZ,QAAW,UACX,iBAAoB,8BACpB,KAAQ,OACR,MAAS,WACT,UAAa,kBACb,SAAY,WACZ,kBAAmB,kBACnB,aAAgB,oBAChB,kBAAqB,6BACrB,aAAc,oBACd,YAAa,kBACb,KAAQ,eACR,kBAAqB,oBACrB,WAAc,cACd,SAAY,YACZ,aAAgB,YAChB,OAAU,SACV,OAAU,aACV,UAAa,aACb,QAAW,YACX,SAAY,oBACZ,kBAAqB,iBACrB,aAAgB,aAChB,YAAe,WACf,eAAkB,uBAClB,KAAQ,SACR,SAAY,aACZ,cAAiB,2BACjB,aAAgB,gBAChB,sCAAuC,gBACvC,4BAA+B,sBAC/B,oFAAqF,gDACrF,oBAAqB,mBACrB,qBAAsB,oBACtB,qBAAsB,SACtB,+BAAgC,sBAChC,qBAAsB,mBACtB,0BAA2B,gBAC3B,YAAe,mBACf,UAAa,qBACjB,ECvKaC,GAAkC,CAC3C,YAAa,CAAE,EACf,WAAa,IAAM,IACvB,EACO,IAAIC,IACV,SAAUA,EAAyB,CAEhCA,EAAwB,IAAS,MACjCA,EAAwB,MAAW,QACnCA,EAAwB,KAAU,OAClCA,EAAwB,MAAW,QACnCA,EAAwB,MAAW,QACnCA,EAAwB,KAAU,OAClCA,EAAwB,KAAU,OAClCA,EAAwB,SAAc,WAEtCA,EAAwB,OAAY,SACpCA,EAAwB,KAAU,OAClCA,EAAwB,aAAkB,eAC1CA,EAAwB,MAAW,QACnCA,EAAwB,MAAW,QACnCA,EAAwB,mBAAwB,qBAChDA,EAAwB,cAAmB,gBAC3CA,EAAwB,QAAa,UACrCA,EAAwB,MAAW,QACnCA,EAAwB,QAAa,UACrCA,EAAwB,uBAA4B,yBACpDA,EAAwB,qBAA0B,uBAClDA,EAAwB,iBAAsB,mBAC9CA,EAAwB,MAAW,QACnCA,EAAwB,aAAkB,eAC1CA,EAAwB,cAAmB,eAC/C,GAAGA,KAA4BA,GAA0B,CAAE,EAAC,EACrD,MAAMC,WAA4B/4B,EAAY,CACjD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,MAAQ,GACb,KAAK,YAAc,GACnB,KAAK,OAAS,EACjB,CACD,SAAU,CACN,GAAI,KAAK,OAAS84B,GAAwB,MAAO,CAC7C,MAAME,EAAgB,GACtB,UAAWx2B,KAAK,KAAK,OAAO,QAAQA,GAAKA,EAAE,QAAO,CAAE,EAAG,CACnD,GAAIA,EAAE,OAASs2B,GAAwB,IAAK,CACxC,MAAMxD,EAAO0D,EAAcA,EAAc,OAAS,CAAC,EACnD,GAAI1D,GAAQA,EAAK,OAASwD,GAAwB,IAAK,CAC/CxD,EAAK,QACLA,EAAK,OAAS,KAElBA,EAAK,OAAS9yB,EAAE,MAChB,QACH,CACJ,CACDw2B,EAAc,KAAKx2B,EAAE,MAAO,EAC/B,CACD,OAAOw2B,CACV,CACD,MAAO,CAAC,IAAI,CACf,CACD,QAAQC,EAAK,CACT,OAAKA,EAGEF,GAAoB,MAAM,CAAC,GAAGE,EAAI,QAAS,EAAE,IAAI,CAAC,EAF9C,IAGd,CACD,OAAOA,EAAK,CACR,OAAKA,EAGEF,GAAoB,MAAM,CAAC,KAAM,GAAGE,EAAI,QAAS,EAAC,EAF9C,IAGd,CACD,OAAO,QAAQx5B,EAAQ,CACnB,OAAOs5B,GAAoB,MAAMt5B,CAAM,CAC1C,CACD,OAAO,MAAMA,EAAQ,CACjB,MAAM+C,EAAIu2B,GAAoB,OAAO,CAAE,OAAQt5B,EAAO,QAAQ+C,GAAK,CAAE,IAAI7H,EAAI,OAAQA,EAAK6H,GAAM,KAAuB,OAASA,EAAE,QAAO,KAAQ,MAAQ7H,IAAO,OAASA,EAAK,EAAG,CAAE,EAAG,KAAMm+B,GAAwB,KAAO,GAAE,UAC7N,OAAIt2B,EAAE,SAAW,EACNA,EAAE,CAAC,EAEPu2B,GAAoB,OAAO,CAAE,OAAQv2B,EAAG,KAAMs2B,GAAwB,KAAK,CAAE,CACvF,CACD,OAAO,IAAIh2B,EAAK,CACZ,OAAKA,EAGEi2B,GAAoB,OAAO,CAAE,MAAOj2B,EAAK,KAAMg2B,GAAwB,GAAG,CAAE,EAFxEC,GAAoB,OAGlC,CACD,OAAO,OAAQ,CACX,OAAOA,GAAoB,MAAM,EAAE,CACtC,CACD,OAAO,KAAK/6B,EAAI,CACZ,OAAO+6B,GAAoB,OAAO,CAC9B,GAAA/6B,EACA,MAAO66B,GAAgC,WAAW76B,CAAE,GAAK,GACzD,KAAM86B,GAAwB,IAC1C,CAAS,CACJ,CACD,OAAO,OAAOh2B,EAAK,CACf,OAAOi2B,GAAoB,OAAO,CAAE,MAAOj2B,CAAK,EACnD,CACD,OAAO,KAAKA,EAAKo2B,EAAO,CACpB,OAAOH,GAAoB,OAAO,CAAE,MAAOj2B,EAAK,KAAMg2B,GAAwB,KAAM,YAAaI,CAAO,EAC3G,CACD,OAAO,SAASp2B,EAAKo2B,EAAO,CACxB,OAAOH,GAAoB,OAAO,CAAE,MAAOj2B,EAAK,KAAMg2B,GAAwB,SAAU,YAAaI,CAAO,EAC/G,CACD,UAAW,CACP,GAAI,KAAK,OAASJ,GAAwB,KAAO,KAAK,OAASA,GAAwB,cACnF,OAAOK,GAAwB,KAAK,KAAK,EAE7C,IAAI,KAAK,OAASL,GAAwB,MAAS,KAAK,IAAM,CAAC,KAAK,OAASlD,GAAc,OAAO,KAAK,EAAE,IACjG,KAAK,IAAM,CAAC,KAAK,MAAO,CACxB,MAAMzpB,EAAO0sB,GAAgC,WAAW,KAAK,EAAE,EAC/D,OAAI1sB,GAGG,EACV,CAEL,OAAI,KAAK,OAAS2sB,GAAwB,MAC/B,KAAK,OAAO,IAAIt2B,GAAKA,EAAE,SAAU,GAAE,OAAOA,GAAK,CAAC,CAACA,CAAC,EAAE,KAAK,KAAK,EAErE,KAAK,OAASs2B,GAAwB,KAC/B,KAAK,aAAe,gBAE3B,KAAK,OAASA,GAAwB,SAC/B,KAAK,aAAe,gBAE3B,KAAK,OAASA,GAAwB,MAC/B,aAEP,KAAK,OAASA,GAAwB,KAC/B,UAEJ,KAAK,KACf,CACD,OAAQ,CACJ,OAAI,KAAK,OAASA,GAAwB,MAC/B,KAAK,OAAO,IAAIt2B,GAAKA,EAAE,MAAO,GAAE,OAAOA,GAAK,CAAC,CAACA,CAAC,EAAE,KAAK,GAAG,EAE7D,KAAK,KACf,CACD,WAAY,CACR,OAAI,KAAK,OAASs2B,GAAwB,OAAS,KAAK,OAAO,OAAS,EAC7D,KAAK,OAAO,KAAK,OAAO,OAAS,CAAC,EAAE,YAE3C,KAAK,OAASA,GAAwB,IAC/B,KAAK,MAAM,MAAM,GAAG,EAAE,IAAK,GAAI,GAEnC,KAAK,KACf,CACL,CACA9yB,EAAW,CACP7K,EAAM,CAAE,MAAO,IAAK,QAASkI,EAAe,SAAU,GAAM,CAChE,EAAG01B,GAAoB,UAAW,QAAS,MAAM,EACjD/yB,EAAW,CACP7K,EAAM,CAAE,MAAO,IAAK,QAASkI,EAAe,SAAU,GAAM,CAChE,EAAG01B,GAAoB,UAAW,cAAe,MAAM,EACvD/yB,EAAW,CACP7K,EAAM,CAAE,MAAO,IAAK,QAAS,IAAImH,GAAay2B,EAAmB,EAAG,SAAU,GAAM,CACxF,EAAGA,GAAoB,UAAW,SAAU,MAAM,EAClD/yB,EAAW,CACP7K,EAAM,CAAE,MAAO,IAAK,QAASkI,EAAe,SAAU,GAAM,CAChE,EAAG01B,GAAoB,UAAW,KAAM,MAAM,EAC9C/yB,EAAW,CACP7K,EAAM,CAAE,MAAO,IAAK,QAAS,IAAI0H,GAAYi2B,EAAuB,EAAG,SAAU,GAAM,CAC3F,EAAGC,GAAoB,UAAW,OAAQ,MAAM,EAChD/yB,EAAW,CACP7K,EAAM,CAAE,MAAO,IAAK,QAASgI,GAAe,SAAU,GAAM,CAChE,EAAG41B,GAAoB,UAAW,QAAS,MAAM,EAC1C,SAASI,GAAwBx8B,EAAK,CAEzC,MAAMy8B,EAAgB,CAAC,YAAa,QAAS,eAAgB,iBAAkB,UAAW,mBAAoB,WAAY,OAAO,EACjI,UAAWn+B,KAAUm+B,EACbz8B,EAAI,WAAW1B,CAAM,IACrB0B,EAAMA,EAAI,UAAU1B,EAAO,MAAM,GAGzC,GAAI29B,GAAej8B,CAAG,EAClB,OAAOi8B,GAAej8B,CAAG,EAG7B,GAAIA,EAAI,OAAS,GAAKA,EAAI,CAAC,IAAMA,EAAI,CAAC,EAAE,cACpC,UAAW08B,KAAUR,GAAgC,YACjD,GAAI,CACA,MAAMtyB,EAAS8yB,EAAO18B,CAAG,EACzB,GAAI4J,GAAUA,IAAW5J,EACrB,OAAO4J,CAEd,OACMjL,EAAG,CACN,QAAQ,MAAMA,CAAC,CAClB,CAGT,GAAIqB,EAAI,SAAS,GAAG,EAAG,CACnB,MAAM28B,EAAW38B,EAAI,MAAM,GAAG,EAC9B,GAAI28B,EAAS,OAAS,EAAG,CACrB,MAAMC,EAAgBD,EAAS,MAAM,EAAG,CAAC,EAAE,KAAK,GAAG,EACnD,GAAIC,IAAkBJ,GAAwBI,CAAa,EACvD,MAAO,GAAGJ,GAAwBI,CAAa,CAAC,MAAMJ,GAAwBG,EAAS,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,EAEjH,CACD,MAAME,EAAYF,EAAS,CAAC,EACtBlB,EAAYkB,EAAS,MAAM,CAAC,EAAE,KAAK,GAAG,EAC5C,MAAO,GAAGH,GAAwBK,CAAS,CAAC,MAAML,GAAwBf,CAAS,CAAC,EACvF,CACD,OAAIz7B,EAAI,OAAS,GAAKA,EAAI,SAAS,IAAI,EAE5Bw8B,GAAwBx8B,EAAI,UAAU,EAAGA,EAAI,OAAS,CAAC,CAAC,GAGnEA,EAAMA,EAAI,QAAQ,kBAAmB,OAAO,EAE5CA,EAAMA,EAAI,QAAQ,MAAO,GAAG,EAAE,OACvBA,EACX,CChOU,IAAC88B,IACV,SAAUA,EAAmB,CAC1BA,EAAkB,IAAS,MAC3BA,EAAkB,KAAU,MAChC,GAAGA,KAAsBA,GAAoB,CAAE,EAAC,EACzC,SAASC,GAAeC,EAAM,CACjC,OAAOA,EAAK,IAAIl1B,GAAK,GAAGA,EAAE,GAAG,IAAIA,EAAE,KAAK,EAAE,EAAE,KAAK,GAAG,CACxD,CACO,MAAMm1B,EAAgB,CACzB,OAAO,OAAO/+B,EAAM,CAChB,MAAMiI,EAAMjI,EAAK,OAAO,KAAI,EAC5B,GAAIiI,IAAQ,GACR,MAAO,GAEX,MAAMw2B,EAAWx2B,EAAI,MAAM,GAAG,EACxB+2B,EAAO,GACb,SAAW,CAACn+B,EAAO0U,CAAI,IAAKkpB,EAAS,QAAO,EAAI,CAC5C,MAAMQ,EAAM1pB,EAAK,KAAM,EAAC,MAAM,GAAG,EACjC,GAAI0pB,EAAI,OAAS,GAAKA,EAAI,SAAW,EACjC,MAAM,IAAIr/B,GAAY,CAClB,KAAM,gBACN,QAAS,wBAAwBI,EAAK,YAAY,GAClD,MAAOA,EAAK,YAChC,CAAiB,EAEL,MAAMk/B,EAAYD,EAAI,SAAW,EAC3BL,GAAkB,IAClB5+B,EAAK,MAAM,CACT,KAAMi/B,EAAI,CAAC,EACX,QAASj/B,EAAK,QACd,MAAOA,EAAK,kBAAkBa,CAAK,CACvD,CAAiB,EAAE,KAAK+9B,EAAiB,EACvB98B,EAAMm9B,EAAI,CAAC,EAAE,KAAI,EACvBD,EAAK,KAAK,CACN,IAAAl9B,EACA,MAAOo9B,CACvB,CAAa,CACJ,CACD,OAAOF,CACV,CACL,CCrCO,MAAMG,EAA2B,CACpC,OAAO,OAAOC,EAAQr/B,EAAS,CAC3B,OAAO,KAAK,UAAUs/B,GAAuB,OAAOD,EAAQr/B,CAAO,CAAC,CACvE,CACD,OAAO,OAAOC,EAAM,CAChB,MAAMiI,EAAMjI,EAAK,OACjB,GAAI,CACA,MAAMs/B,EAAU,KAAK,MAAMr3B,CAAG,EAC9B,OAAOo3B,GAAuB,OAAOr/B,EAAK,MAAM,CAAE,KAAMs/B,EAAS,MAAOt/B,EAAK,aAAc,QAASA,EAAK,OAAO,CAAE,CAAC,CACtH,MACS,CACN,MAAM,IAAIJ,GAAY,CAClB,KAAM,gBACN,QAAS,oBAAoBI,EAAK,YAAY,GAC9C,MAAOA,EAAK,YAC5B,CAAa,CACJ,CACJ,CACL,CACO,MAAMq/B,EAAuB,CAChC,OAAO,OAAOD,EAAQr/B,EAAS,CAG3B,GAAIq/B,aAAkB,KAClB,MAAO,CAAE,EAAG,QAAS,MAAOA,EAAO,OAAOr/B,CAAO,GAErD,GAAIq/B,IAAW,KACX,OAAO,KAEX,GAAI,MAAM,QAAQA,CAAM,EACpB,OAAOA,EAAO,IAAI/4B,GAAK,KAAK,OAAOA,EAAGtG,CAAO,CAAC,EAElD,GAAI,OAAOq/B,GAAW,SAAU,CAE5B,MAAM9zB,EAAI,GACV,SAAW,CAACxJ,EAAKC,CAAK,IAAK,OAAO,QAAQq9B,CAAM,EAC5C9zB,EAAExJ,CAAG,EAAI,KAAK,OAAOC,EAAOhC,CAAO,EAEvC,OAAOuL,CACV,CACD,OAAO8zB,CACV,CACD,OAAO,OAAOp/B,EAAM,CAChB,MAAM+B,EAAQ/B,EAAK,MACnB,GAAI+B,IAAU,KACV,OAAO,KAEX,GAAI,MAAM,QAAQA,CAAK,EACnB,OAAOA,EAAM,IAAI,CAAC4F,EAAG9G,IAAU,KAAK,OAAOb,EAAK,MAAM,CAClD,KAAM2H,EACN,MAAO3H,EAAK,kBAAkBa,CAAK,EACnC,QAASb,EAAK,OACjB,EAAC,CAAC,EAEP,GAAI,OAAO+B,GAAU,SAAU,CAE3B,GAAI,MAAOA,GAASA,EAAM,IAAM,SAAW,UAAWA,EAClD,OAAOqI,GAAY,OAAOpK,EAAK,MAAM,CACjC,KAAM+B,EAAM,MACZ,MAAO/B,EAAK,kBAAkB,OAAO,EACrC,QAASA,EAAK,OACjB,EAAC,EAGN,MAAMsL,EAAI,GACV,SAAW,CAACxJ,EAAK6F,CAAC,IAAK,OAAO,QAAQ5F,CAAK,EACvCuJ,EAAExJ,CAAG,EAAI,KAAK,OAAO9B,EAAK,MAAM,CAC5B,KAAM2H,EACN,MAAO3H,EAAK,kBAAkB8B,CAAG,EACjC,QAAS9B,EAAK,OACjB,EAAC,EAEN,OAAOsL,CACV,CACD,GAAI,OAAOvJ,GAAU,UAAY,OAAOA,GAAU,UAAY,OAAOA,GAAU,UAC3E,OAAOA,EAEX,MAAM,IAAInC,GAAY,CAClB,KAAM,gBACN,QAAS,qBAAqBI,EAAK,YAAY,GAC/C,MAAOA,EAAK,YACxB,CAAS,CACJ,CACL,CACO,MAAMu/B,WAAsBp6B,EAAY,CAC/C,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,CACrC,EAAGq3B,GAAc,UAAW,QAAS,MAAM,EACpC,MAAMC,EAAqB,CAC9B,YAAYx/B,EAAM,CACd,IAAIF,EAAIG,EACR,KAAK,QAAUH,EAAKE,EAAK,UAAY,MAAQF,IAAO,OAASA,EAAK,KAClE,KAAK,QAAUG,EAAKD,EAAK,UAAY,MAAQC,IAAO,OAASA,EAAK,IACrE,CACD,OAAO,OAAOD,EAAM,CAChB,IAAIF,EAAIG,EACR,OAAO,IAAIu/B,GAAqB,CAC5B,QAAS1/B,EAAKE,EAAK,cAAc,QAAQ,KAAO,MAAQF,IAAO,OAAS,OAASA,EAAG,SAASq/B,EAA0B,EACvH,QAASl/B,EAAKD,EAAK,cAAc,QAAQ,KAAO,MAAQC,IAAO,OAAS,OAASA,EAAG,SAASuI,CAAa,CACtH,CAAS,CACJ,CACD,OAAOzI,EAAS,CACZ,IAAID,EACJ,MAAO,CACH,OAAQ,KAAK,OAASq/B,GAA2B,OAAO,KAAK,OAAQp/B,CAAO,EAAI,OAChF,QAASD,EAAK,KAAK,UAAY,MAAQA,IAAO,OAASA,EAAK,MACxE,CACK,CACL,CACO,MAAM2/B,EAAuB,CAChC,YAAYz/B,EAAM,CACd,IAAIF,EAAIG,EAAIC,EAAIgG,EAChB,KAAK,QAAUpG,EAAKE,EAAK,UAAY,MAAQF,IAAO,OAASA,EAAK,KAClE,KAAK,YAAcG,EAAKD,EAAK,cAAgB,MAAQC,IAAO,OAASA,EAAK,KAC1E,KAAK,MAAQC,EAAKF,EAAK,QAAU,MAAQE,IAAO,OAASA,EAAK,GAC9D,KAAK,MAAQF,EAAK,MAClB,KAAK,QAAUkG,EAAKlG,EAAK,UAAY,MAAQkG,IAAO,OAASA,EAAK,IACrE,CACD,OAAO,OAAOlG,EAAM,CAChB,IAAIF,EAAIG,EAAIC,EACZ,OAAO,IAAIu/B,GAAuB,CAC9B,QAAS3/B,EAAKE,EAAK,cAAc,QAAQ,KAAO,MAAQF,IAAO,OAAS,OAASA,EAAG,SAASq/B,EAA0B,EACvH,YAAal/B,EAAKD,EAAK,cAAc,YAAY,KAAO,MAAQC,IAAO,OAAS,OAASA,EAAG,SAASk/B,EAA0B,EAC/H,KAAMn/B,EAAK,MAAM,MAAM,EAAE,OAAO++B,EAAe,EAC/C,MAAO/+B,EAAK,MAAM,OAAO,EAAE,QAC3B,QAASE,EAAKF,EAAK,cAAc,QAAQ,KAAO,MAAQE,IAAO,OAAS,OAASA,EAAG,SAASsI,CAAa,CACtH,CAAS,CACJ,CACD,OAAOzI,EAAS,CACZ,IAAID,EACJ,MAAO,CACH,OAAQ,KAAK,OAASq/B,GAA2B,OAAO,KAAK,OAAQp/B,CAAO,EAAI,OAChF,WAAY,KAAK,WAAao/B,GAA2B,OAAO,KAAK,WAAYp/B,CAAO,EAAI,OAC5F,KAAM8+B,GAAe,KAAK,IAAI,EAC9B,MAAO,KAAK,MACZ,QAAS/+B,EAAK,KAAK,UAAY,MAAQA,IAAO,OAASA,EAAK,MACxE,CACK,CACL,CC5IY,MAAC4/B,GAAsB,OAAO,qBAAqB,EACxD,SAASC,GAAcP,EAAQ,CAClC,OAAIA,IAAW,KACJ,GAEP,OAAOA,GAAW,UAAYA,IAAW,KAClC,OAAO,KAAKA,CAAM,EAAE,SAAW,EAEtC,MAAM,QAAQA,CAAM,EACbA,EAAO,SAAW,EAEtB,EACX,CACO,SAASQ,GAAaC,EAAS5uB,EAAO,OAAQ,CACjD,MAAM6uB,EAAkBD,EAAQ,OAAOx5B,GAAK,CAACs5B,GAAct5B,CAAC,CAAC,EAAE,QAAQA,GAAK,MAAM,QAAQA,CAAC,EAAK4K,IAAS,OAAS5K,EAAI,CAAC,CAAE,KAAMA,CAAG,GAAK,CAACA,CAAC,CAAC,EAC1I,OAAIy5B,EAAgB,SAAW,EACpB,KAEPA,EAAgB,SAAW,EACpBA,EAAgB,CAAC,EAErB,CACH,CAAC7uB,CAAI,EAAG6uB,CAChB,CACA,CACO,SAASC,GAAWf,EAAMgB,EAAQ,CACrC,IAAIlgC,EAAIG,EAAIC,EACZ,UAAWuF,KAAKu6B,EACRhB,EAAK,KAAKr0B,GAAKA,EAAE,MAAQlF,EAAE,GAAG,IAIlCu5B,EAAO,CAAC,GAAGA,EAAM,CAAE,IAAKv5B,EAAE,IAAK,OAAQvF,GAAMJ,EAAK2F,EAAE,SAAW,MAAQ3F,IAAO,OAASA,GAAMG,EAAK++B,EAAK,CAAC,KAAO,MAAQ/+B,IAAO,OAAS,OAASA,EAAG,SAAW,MAAQC,IAAO,OAASA,EAAK0+B,GAAkB,GAAG,CAAE,GAEtN,OAAOI,CACX,CACO,SAASiB,GAAcx6B,EAAGC,EAAG,CAChC,OAAID,IAAM,KACCC,IAAM,KAEbA,IAAM,KACC,GAEJ,KAAK,UAAU25B,GAAuB,OAAO55B,EAAG,CAAE,QAAS8E,GAAS,CAAC,IAAM,KAAK,UAAU80B,GAAuB,OAAO35B,EAAG,CAAE,QAAS6E,EAAS,EAAC,CAC3J,CACO,SAAS21B,GAAWd,EAAQe,EAAM,CAErC,GAAIA,IAAST,GACT,OAAON,EAEX,GAAI,MAAM,QAAQe,CAAI,EAClB,OAAOA,EAAK,IAAIC,GAAKF,GAAWd,EAAQgB,CAAC,CAAC,EAE9C,GAAI,OAAOD,GAAS,UAAYA,IAAS,KAAM,CAC3C,MAAMnkB,EAAI,GACV,UAAWla,KAAOq+B,EACdnkB,EAAEla,CAAG,EAAIo+B,GAAWd,EAAQe,EAAKr+B,CAAG,CAAC,EAEzC,OAAOka,CACV,CACD,OAAOmkB,CACX,CAOO,SAASE,GAAajB,EAAQe,EAAM,CAEvC,GAAIA,IAAST,GACT,MAAO,CACH,MAAO,GACP,YAAaN,CACzB,EAEI,GAAI,MAAM,QAAQe,CAAI,EAAG,CACrB,GAAI,CAAC,MAAM,QAAQf,CAAM,EACrB,MAAO,CACH,MAAO,EACvB,EAEQ,GAAIA,EAAO,SAAWe,EAAK,OACvB,MAAO,CACH,MAAO,EACvB,EAEQ,MAAM5C,EAAY6B,EAAO,QACzB,IAAIkB,EAEJ,UAAWt9B,KAAQm9B,EAAM,CAErB,GAAIn9B,IAAS08B,GAET,eAAQ,KAAK,mHAAmH,EACzH,CACH,MAAO,EAC3B,EAEY,IAAI7b,EAAQ,GACZ,QAAS9kB,EAAI,EAAGA,EAAIw+B,EAAU,OAAQx+B,IAAK,CACvC,MAAMwhC,EAAOF,GAAa9C,EAAUx+B,CAAC,EAAGiE,CAAI,EAC5C,GAAIu9B,EAAK,OAAS,CAACA,EAAK,SAAU,CAC9B,GAAIA,EAAK,YAAa,CAClB,GAAID,IAAuB,OAAW,CAElC,KAAM,CAAE,MAAAvb,EAAO,SAAAyb,CAAU,EAAGH,GAAaC,EAAoBC,EAAK,WAAW,EAC7E,GAAI,CAACxb,GAASyb,EAEV,MAAO,CACH,MAAO,EAC3C,CAEyB,CACDF,EAAqBC,EAAK,WAC7B,CACDhD,EAAU,OAAOx+B,EAAG,CAAC,EACrB8kB,EAAQ,GACR,KACH,CACJ,CACD,GAAI,CAACA,EACD,MAAO,CACH,MAAO,EAC3B,CAES,CACD,OAAI0Z,EAAU,OAAS,EACZ,CACH,MAAO,EACvB,EAEe,CACH,MAAO,GACP,YAAa+C,CACzB,CACK,CACD,GAAIH,aAAgB,KAChB,OAAIf,aAAkB,KACX,CACH,MAAOA,EAAO,YAAce,EAAK,QAAS,CAC1D,EAEe,CACH,MAAO,EACnB,EAEI,GAAI,OAAOA,GAAS,UAAYA,IAAS,KAAM,CAC3C,GAAI,OAAOf,GAAW,UAAYA,IAAW,KAEzC,MAAO,CACH,MAAO,EACvB,EAEQ,IAAIkB,EACJ,UAAWx+B,KAAOq+B,EAAM,CACpB,MAAMM,EAAerB,EAAQt9B,CAAG,EAChC,GAAI2+B,IAAgB,OAEhB,MAAO,CACH,MAAO,EAC3B,EAEY,MAAMC,EAAYP,EAAKr+B,CAAG,EACpBy+B,EAAOF,GAAaI,EAAaC,CAAS,EAChD,GAAI,CAACH,EAAK,OAASA,EAAK,SAEpB,MAAO,CACH,MAAO,EAC3B,EAGY,GAAIA,EAAK,YAAa,CAClB,GAAID,IAAuB,OAAW,CAElC,KAAM,CAAE,MAAAvb,EAAO,SAAAyb,CAAU,EAAGH,GAAaC,EAAoBC,EAAK,WAAW,EAC7E,GAAI,CAACxb,GAASyb,EAEV,MAAO,CACH,MAAO,EACnC,CAEiB,CACDF,EAAqBC,EAAK,WAC7B,CACJ,CAED,MAAMI,EAAe,OAAO,KAAKvB,CAAM,EAAE,OAAOp9B,GAAK,EAAEA,KAAKm+B,EAAK,EAC3DK,EAAW,GACjB,UAAW1+B,KAAO6+B,EACdH,EAAS1+B,CAAG,EAAIs9B,EAAOt9B,CAAG,EAE9B,MAAO,CACH,MAAO,GACP,YAAaw+B,EACb,SAAUK,EAAa,OAASH,EAAW,MACvD,CACK,CAGD,OAAIpB,GAAUe,EACH,CACH,MAAO,EAEnB,EAEW,CACH,MAAO,EACf,CACA,CACO,SAASS,GAAmBxB,EAAQyB,EAAS,CAChD,GAAIA,EAAQ,SAAW,EACnB,OAAOzB,EAEX,MAAM0B,EAAQD,EAAQ,CAAC,EACvB,OAAI,OAAOC,GAAU,SACb,CAAC,MAAM,QAAQ1B,CAAM,GAGrB0B,GAAS1B,EAAO,OACT,KAEJwB,GAAmBxB,EAAO0B,CAAK,EAAGD,EAAQ,MAAM,CAAC,CAAC,EAEvD,OAAOzB,GAAW,UAGpBA,IAAW,KACJ,KAEP0B,KAAS1B,EACFwB,GAAmBxB,EAAO0B,CAAK,EAAGD,EAAQ,MAAM,CAAC,CAAC,EAEtD,IACX,CCzOO,MAAME,EAAe,CACxB,YAAYC,EAAaC,EAAc,CAKnC,KAAK,YAAc,KAMnB,KAAK,aAAe,KACpB,KAAK,YAAcD,EACnB,KAAK,aAAeC,CACvB,CACD,OAAO,eAAgB,CACnB,OAAO,IAAIF,GAAe,KAAM,EAAE,CACrC,CACD,UAAUr/B,EAAQ,CACd,OAAI,KAAK,cAAgB,KACd,GAEJA,EAAO,gBAAgB,KAAK,WAAW,CACjD,CACD,IAAI,4BAA6B,CAC7B,OAAO,KAAK,cAAgB,MAAQi+B,GAAc,KAAK,YAAY,GAAK,KAAK,eAAiB,IACjG,CACD,WAAWj+B,EAAQ,CACf,OAAI,KAAK,eAAiB,KACf,GAEJA,EAAO,gBAAgB,KAAK,YAAY,CAClD,CACD,OAAO3B,EAAS,CACZ,MAAO,CACH,YAAas/B,GAAuB,OAAO,KAAK,YAAat/B,CAAO,EACpE,aAAcs/B,GAAuB,OAAO,KAAK,aAAct/B,CAAO,CAClF,CACK,CACD,OAAO,OAAOC,EAAM,CAChB,OAAIA,EAAK,QAAQ,QAAU,KACvB,QAAQ,MAAM,2FAA2F,EAClG+gC,GAAe,iBAEnB,IAAIA,GAAe/gC,EAAK,MAAM,aAAa,EAAE,SAASq/B,EAAsB,EAAGr/B,EAAK,MAAM,cAAc,EAAE,SAASq/B,EAAsB,CAAC,CACpJ,CACD,OAAQ,CACJ,OAAO,IAAI0B,GAAep/B,GAAY,KAAK,WAAW,EAAGA,GAAY,KAAK,YAAY,CAAC,CAC1F,CACD,cAAe,CACX,OAAI,KAAK,2BACEu8B,GAAoB,IAAI,0BAA0B,EAEzD,KAAK,cAAgB,MAAQ,KAAK,eAAiB,KAC5CA,GAAoB,IAAI,0BAA0B,EAEzD,KAAK,cAAgB,MAAQ,KAAK,eAAiB,KAC5CA,GAAoB,IAAI,6BAA6B,EAE5D,KAAK,cAAgB,MAAQ,KAAK,eAAiB,KAC5CA,GAAoB,IAAI,mCAAmC,EAElE,KAAK,cAAgB,MAAQyB,GAAc,KAAK,YAAY,EACrDzB,GAAoB,IAAI,6BAA6B,EAEzDA,GAAoB,IAAI,sCAAsC,CACxE,CACL,CCxEU,IAACgD,IACV,SAAUA,EAAW,CAIlBA,EAAU,WAAgB,aAI1BA,EAAU,YAAiB,cAI3BA,EAAU,kBAAuB,mBAGrC,GAAGA,KAAcA,GAAY,GAAG,ECdtB,IAACC,IACV,SAAUA,EAAe,CACtBA,EAAc,QAAa,UAC3BA,EAAc,MAAW,QACzBA,EAAc,KAAU,OACxBA,EAAc,OAAY,SAC1BA,EAAc,QAAa,SAC/B,GAAGA,KAAkBA,GAAgB,CAAE,EAAC,EACjC,MAAMC,WAA0Bj8B,EAAY,CAC/C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,MAAQ,KACb,KAAK,OAAS,KACd,KAAK,IAAMg8B,GAAc,MAC5B,CACL,CACAh2B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,EAAI,CAAE,CACrD,EAAGk5B,GAAkB,UAAW,QAAS,MAAM,EAC/Cj2B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,EAAI,CAAE,CACrD,EAAGk5B,GAAkB,UAAW,SAAU,MAAM,EAChDj2B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0H,GAAYm5B,EAAa,CAAC,CAAE,CACrD,EAAGC,GAAkB,UAAW,MAAO,MAAM,ECnBnC,IAACC,IACV,SAAUA,EAAY,CAKnBA,EAAW,SAAc,WAIzBA,EAAW,UAAe,YAM1BA,EAAW,eAAoB,iBAI/BA,EAAW,KAAU,OAIrBA,EAAW,SAAc,WAIzBA,EAAW,QAAa,UACxBA,EAAW,MAAW,QACtBA,EAAW,MAAW,QACtBA,EAAW,KAAU,OACrBA,EAAW,MAAW,QACtBA,EAAW,MAAW,QACtBA,EAAW,KAAU,OACrBA,EAAW,QAAa,SAC5B,GAAGA,KAAeA,GAAa,CAAE,EAAC,EAC3B,IAAIC,IACV,SAAUA,EAAU,CACjBA,EAAS,IAAS,MAClBA,EAAS,KAAU,OACnBA,EAAS,MAAW,OACxB,GAAGA,KAAaA,GAAW,CAAE,EAAC,EACvB,SAASC,GAAkBtwB,EAAM,CACpC,IAAInR,EAAIG,EA2CR,OAAQA,GAAMH,EA1CF,CACR,CACI,MAAOuhC,GAAW,KAClB,KAAM,sBACT,EACD,CACI,MAAOA,GAAW,SAClB,KAAM,6BACT,EACD,CACI,MAAOA,GAAW,QAClB,KAAM,OACT,EACD,CACI,MAAOA,GAAW,MAClB,KAAM,aACT,EACD,CACI,MAAOA,GAAW,MAClB,KAAM,gBACT,EACD,CACI,MAAOA,GAAW,KAClB,KAAM,OACT,EACD,CACI,MAAOA,GAAW,SAClB,KAAM,eACT,EACD,CACI,MAAOA,GAAW,UAClB,KAAM,sBACT,EACD,CACI,MAAOA,GAAW,eAClB,KAAM,2BACT,EACD,CACI,MAAOA,GAAW,KAClB,KAAM,SACT,CACT,EAC2B,KAAK1oB,GAAKA,EAAE,QAAU1H,CAAI,KAAO,MAAQnR,IAAO,OAAS,OAASA,EAAG,QAAU,MAAQG,IAAO,OAASA,EAAK,UACvI,CACU,IAACuhC,IACV,SAAUA,EAAmB,CAC1BA,EAAkB,KAAU,OAC5BA,EAAkB,QAAa,UAC/BA,EAAkB,MAAW,OACjC,GAAGA,KAAsBA,GAAoB,CAAE,EAAC,EACzC,MAAMC,WAAsBt8B,EAAY,CAC3C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GACZ,KAAK,KAAOq8B,GAAkB,KAI9B,KAAK,SAAW,EACnB,CACD,WAAW,MAAO,CACd,MAAO,CAACE,EAAUC,IAAa,CAC3B,MAAMC,EAAYF,EAAS,KACrBG,EAAYF,EAAS,KAC3B,OAAKC,IAAcJ,GAAkB,OAASK,IAAcL,GAAkB,SACtEI,IAAcJ,GAAkB,SAAWK,IAAcL,GAAkB,MAC3EI,IAAcJ,GAAkB,OAASK,IAAcL,GAAkB,KACtE,GAEDI,IAAcJ,GAAkB,MAAQK,IAAcL,GAAkB,SAC1EI,IAAcJ,GAAkB,SAAWK,IAAcL,GAAkB,OAC3EI,IAAcJ,GAAkB,MAAQK,IAAcL,GAAkB,MACrE,EAGA,CAEvB,CACK,CACD,IAAI,MAAO,CACP,OAAQ,KAAK,KAAI,CACb,KAAKA,GAAkB,MAAO,MAAO,uBACrC,KAAKA,GAAkB,QAAS,MAAO,sBACvC,KAAKA,GAAkB,KAAM,MAAO,YACvC,CACJ,CACL,CACAr2B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAGkhC,GAAc,UAAW,KAAM,MAAM,EACxCt2B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGi5B,GAAc,UAAW,OAAQ,MAAM,EAC1Ct2B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0H,GAAYw5B,EAAiB,CAAC,CAAE,CACzD,EAAGC,GAAc,UAAW,OAAQ,MAAM,EAC1Ct2B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,CACrC,EAAG25B,GAAc,UAAW,WAAY,MAAM,EACvC,MAAMK,WAAqB38B,EAAY,CAC1C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GACZ,KAAK,YAAc,GAInB,KAAK,QAAU,IAClB,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAGuhC,GAAa,UAAW,KAAM,MAAM,EACvC32B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGs5B,GAAa,UAAW,OAAQ,MAAM,EACzC32B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,QAAS,GAAG,CAAE,CAClD,EAAGs5B,GAAa,UAAW,cAAe,MAAM,EAChD32B,EAAW,CACP7K,EAAM,CAAE,QAASmhC,GAAe,QAAS,IAAK,SAAU,GAAM,CAClE,EAAGK,GAAa,UAAW,UAAW,MAAM,EACrC,MAAMC,WAA2B58B,EAAY,CAChD,aAAc,CACV,MAAM,GAAG,SAAS,EAIlB,KAAK,KAAO,EACf,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAGwhC,GAAmB,UAAW,KAAM,MAAM,EAC7C52B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGu5B,GAAmB,UAAW,OAAQ,MAAM,EACxC,MAAMC,WAAuBD,EAAmB,CACnD,aAAc,CACV,MAAM,GAAG,SAAS,EAMlB,KAAK,SAAW,GAIhB,KAAK,UAAY,GAIjB,KAAK,YAAc,GACnB,KAAK,KAAOV,GAAW,KAIvB,KAAK,QAAU,GAOf,KAAK,MAAQ,GAKb,KAAK,YAAc,GAEnB,KAAK,iBAAmB,GAExB,KAAK,oBAAsB,GAI3B,KAAK,QAAU,KACf,KAAK,wBAA0B72B,GAAgB,MAC/C,KAAK,OAAS,IACjB,CACD,cAAe,CACX,MAAMyG,EAAOswB,GAAkB,KAAK,IAAI,EACxC,OAAI,KAAK,SACE,aAAetwB,EAEnBA,CACV,CACD,SAASgxB,EAASC,EAAmB,GAAM,CACvC,MAAMC,EAASF,EAAQ,IAAI,KAAK,EAAE,EAClC,GAAI,GAACC,IAAqB,CAACC,GAAUA,EAAO,UAI5C,IAAI,KAAK,UAAY,CAACA,EAClB,MAAM,IAAIviC,GAAY,CAClB,KAAM,gBACN,QAAS,wBACT,MAAO,KAAK,EAC5B,CAAa,EAEDuiC,GACAA,EAAO,SAAQ,EAEtB,CACD,8BAA8Bz3B,EAAO,CACjC,OAAOD,GAAyB,KAAK,uBAAuB,GAAKA,GAAyBC,CAAK,CAClG,CACD,IAAI,cAAe,CACf,OAAI,KAAK,OAAS22B,GAAW,QAClB,CACH,KAAK,KAAO,sBACZ,KAAK,KAAO,cACZ,KAAK,KAAO,cACZ,KAAK,KAAO,SAC5B,EAEe,CAAC,KAAK,IAAI,CACpB,CACD,UAAUZ,EAAahhC,EAAS,CAC5B,IAAIK,EACJ,GAAIL,GAAY,MAAsCA,EAAQ,MAAO,CACjE,MAAMiL,EAAQjL,GAAY,KAA6B,OAASA,EAAQ,MACxE,GAAI,CAAC,KAAK,8BAA8BiL,CAAK,EACzC,MAAO,EAEd,CAMD,OALIjL,GAAY,MAAsCA,EAAQ,kBACtD,CAACA,EAAQ,iBAAiB,IAAI,GAIlC,KAAK,QAAU,EAAG,GAAAK,EAAK,KAAK,UAAY,MAAQA,IAAO,SAAkBA,EAAG,UAAU2gC,CAAW,GAC1F,GAEJ,CAAC,CAACA,EAAY,gBAAgB,IAAI,CAC5C,CACD,WAAY,CACR,MAAMn1B,EAAI,KAAK,QACf,OAAAA,EAAE,GAAK/K,KACA+K,CACV,CACL,CACAH,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,CACrC,EAAGk6B,GAAe,UAAW,WAAY,MAAM,EAC/C72B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,QAAS,GAAG,CAAE,CACnD,EAAGk6B,GAAe,UAAW,YAAa,MAAM,EAChD72B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,QAAS,GAAG,CAAE,CACnD,EAAGk6B,GAAe,UAAW,cAAe,MAAM,EAClD72B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0H,GAAYq5B,EAAU,CAAC,CAAE,CAClD,EAAGW,GAAe,UAAW,OAAQ,MAAM,EAC3C72B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAaq6B,EAAY,CAAC,CAAE,CACrD,EAAGE,GAAe,UAAW,UAAW,MAAM,EAC9C72B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGw5B,GAAe,UAAW,QAAS,MAAM,EAC5C72B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGw5B,GAAe,UAAW,cAAe,MAAM,EAClD72B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGw5B,GAAe,UAAW,mBAAoB,MAAM,EACvD72B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,QAAS,GAAG,CAAE,CAClD,EAAGw5B,GAAe,UAAW,sBAAuB,MAAM,EAC1D72B,EAAW,CACP7K,EAAM,CAAE,QAASmhC,GAAe,QAAS,IAAK,SAAU,GAAM,CAClE,EAAGO,GAAe,UAAW,UAAW,MAAM,EAC9C72B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa25B,EAAiB,EAAG,SAAU,GAAM,CAC1E,EAAGY,GAAe,UAAW,cAAe,MAAM,EAClD72B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0H,GAAYs5B,EAAQ,EAAG,SAAU,GAAM,SAAU,GAAM,CAChF,EAAGU,GAAe,UAAW,WAAY,MAAM,EAC/C72B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0H,GAAYwC,EAAe,EAAG,QAAS,IAAK,CACrE,EAAGw3B,GAAe,UAAW,0BAA2B,MAAM,EAC9D72B,EAAW,CACP7K,EAAM,CAAE,QAASygC,GAAgB,QAAS,IAAK,SAAU,GAAM,SAAU,GAAM,CACnF,EAAGiB,GAAe,UAAW,SAAU,MAAM,EC1UtC,MAAMI,WAAuBj9B,EAAY,CAC5C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GACZ,KAAK,YAAc,GAKnB,KAAK,eAAiB,GAKtB,KAAK,gBAAkB,GACvB,KAAK,QAAU,GACf,KAAK,OAAS,IACjB,CACD,IAAI,uBAAwB,CACxB,MAAO,CAAC,CAAC,KAAK,cAAe,EAAC,KAAKoG,GAAKA,EAAE,SAAS,CACtD,CACD,eAAgB,CACZ,OAAI,KAAK,gBAAgB,OAAS,EACvB,CAAC,GAAG,KAAK,gBAAgB,QAAQD,GAAKA,EAAE,eAAe,EAAG,GAAG,KAAK,OAAO,EAE7E,KAAK,OACf,CACD,sBAAsBm1B,EAAahhC,EAAS,CACxC,OAAI,KAAK,gBAAgB,OAAS,EACvB,CACH,GAAG,KAAK,sBAAsBghC,CAAW,EAAE,QAAQn1B,GAAKA,EAAE,sBAAsBm1B,EAAahhC,CAAO,CAAC,EACrG,GAAG,KAAK,cAAcghC,EAAahhC,CAAO,CAC1D,EAEe,KAAK,cAAcghC,EAAahhC,CAAO,CACjD,CACD,cAAcghC,EAAahhC,EAAS,CAChC,OAAO,KAAK,QAAQ,OAAO8L,GAAKA,EAAE,UAAUk1B,EAAahhC,CAAO,CAAC,CACpE,CACD,SAASsC,EAAO,CAEZ,MAAMmgC,EAAmB,KAAK,WAAWngC,CAAK,EAExCnB,EAAS,IAAID,GACnB,UAAW0hC,KAAU,KAAK,sBAAsBtgC,CAAK,EACjD,GAAI,CACAsgC,EAAO,SAAStgC,EAAM,iBAAkB,EAAEmgC,CAAgB,CAC7D,OACMzhC,EAAG,CACN,GAAIC,GAAeD,CAAC,GAAKD,GAAcC,CAAC,EACpCG,EAAO,SAASH,CAAC,MAGjB,OAAMA,CAEb,CAELG,EAAO,gBAAe,CACzB,CACD,WAAWmB,EAAOugC,EAAe,KAAM,CAEnC,MAAMC,EAAU,KAAK,sBAAsBxgC,CAAK,EAEhD,UAAWsgC,KAAUE,EAAS,CAC1B,MAAMJ,EAASpgC,EAAM,iBAAgB,EAAG,IAAIsgC,EAAO,EAAE,EAKrD,GAJI,CAACF,GAIDG,IAAiB,MACbH,EAAO,WAAWG,CAAY,EAE9B,MAAO,GAGf,GAAI,CACAH,EAAO,SAAQ,CAClB,MACS,CAEN,MAAO,EACV,CACJ,CACD,MAAO,EACV,CACD,gBAAgBpgC,EAAO,CACnB,OAAO,KAAK,sBAAsBA,CAAK,EAAE,MAC5C,CACD,wBAAwBA,EAAO,CAE3B,MAAMwgC,EAAU,KAAK,sBAAsBxgC,CAAK,EAChD,IAAI6T,EAAQ,EAEZ,UAAWysB,KAAUE,EAAS,CAC1B,MAAMJ,EAASpgC,EAAM,iBAAgB,EAAG,IAAIsgC,EAAO,EAAE,EACrD,GAAKF,EAIL,GAAI,CACAA,EAAO,SAAQ,EACfvsB,GAAS,CACZ,MACS,CAET,CACJ,CACD,OAAOA,CACV,CACD,UAAU6qB,EAAa+B,EAAe,GAAOC,EAAe,CACxD,MAAI,CAACD,IACG,CAAC,KAAK,gBAGN,KAAK,QAAU,CAAC,KAAK,OAAO,UAAU/B,CAAW,GAC1C,GAGX,KAAK,gBAAgB,OAAS,GAC1B,KAAK,sBAAsBA,EAAagC,CAAa,EAAE,OAAS,GAIpE,KAAK,cAAchC,EAAagC,CAAa,EAAE,OAAS,CAI/D,CACD,8BAA8B/3B,EAAO,CACjC,MAAMg4B,EAAcj4B,GAAyBC,CAAK,EAElD,OADsB,KAAK,QAAQ,KAAK,GAAKD,GAAyB,EAAE,uBAAuB,GAAKi4B,CAAW,EAEpG,GAEP,KAAK,gBAAgB,OACd,KAAK,gBAAgB,KAAKp3B,GAAKA,EAAE,8BAA8BZ,CAAK,CAAC,EAEzE,EACV,CACD,WAAW+1B,EAAa,CACpB,MAAI,IAAC,KAAK,QAAU,KAAK,OAAO,WAAWA,CAAW,EAIzD,CACD,OAAO,iBAAiBkC,EAAYlC,EAAagC,EAAe,CAC5D,OAAOE,EAAW,OAAQC,GACfA,EAAS,UAAUnC,EAAa,GAAOgC,CAAa,CAC9D,CACJ,CACD,sBAAsBhC,EAAagC,EAAe,CAC9C,OAAOL,GAAe,iBAAiB,KAAK,gBAAiB3B,EAAagC,CAAa,CAC1F,CAID,OAAO,kBAAkBE,EAAYlC,EAAahhC,EAAS,CACvD,OAAO2iC,GAAe,iBAAiBO,EAAYlC,EAAahhC,CAAO,EAAE,QAASojC,GAAQ,CAEtF,MAAMC,EAAOV,GAAe,OAAOS,CAAG,EAGtC,OAFAC,EAAK,gBAAkB,GACvBA,EAAK,QAAUA,EAAK,cAAcrC,EAAahhC,CAAO,EAClDojC,EAAI,gBAAgB,OAAS,EAEtB,CACH,GAAIC,EAAK,QAAQ,OAAS,EAAI,CAACA,CAAI,EAAI,CAAE,EACzC,GAAG,KAAK,kBAAkBD,EAAI,gBAAiBpC,EAAahhC,CAAO,EAAE,IAAK6L,GAAM,CAE5E,MAAMy3B,EAAKX,GAAe,OAAO92B,CAAC,EAClC,OAAAy3B,EAAG,KAAOF,EAAI,KAAO,MAAQv3B,EAAE,KACxBy3B,CAC/B,CAAqB,CACrB,EAEoBD,EAAK,QAAQ,OAAS,EAAI,CAACA,CAAI,EAAI,EACvD,CAAS,CACJ,CAID,OAAO,sBAAsBH,EAAYvD,EAAQ,CAC7C,OAAOuD,EAAW,QAASE,GAAQ,CAE/B,MAAMC,EAAOV,GAAe,OAAOS,CAAG,EAChCG,EAAiBH,EAAI,QAAQ,OAAQt3B,GAChC6zB,EAAO7zB,CAAC,CAClB,EAED,OADAu3B,EAAK,QAAUE,EACXH,EAAI,gBAAgB,OAAS,GAE7BC,EAAK,gBAAkB,GAChB,CACH,GAAIA,EAAK,QAAQ,OAAS,EAAI,CAACA,CAAI,EAAI,CAAE,EACzC,GAAG,KAAK,sBAAsBD,EAAI,gBAAiBzD,CAAM,EAAE,IAAK9zB,GAAM,CAElE,MAAMy3B,EAAKX,GAAe,OAAO92B,CAAC,EAClC,OAAAy3B,EAAG,KAAOF,EAAI,KAAO,MAAQv3B,EAAE,KACxBy3B,CAC/B,CAAqB,CACrB,GAEmBD,EAAK,QAAQ,OAAS,EAAI,CAACA,CAAI,EAAI,EACtD,CAAS,CACJ,CAID,OAAO,kBAAkBH,EAAYvD,EAAQ,CACzC,OAAOuD,EAAW,QAASE,GAAQ,CAE/B,MAAMC,EAAOV,GAAe,OAAOS,CAAG,EAChCG,EAAiBH,EAAI,QAAQ,OAAQt3B,GAChC6zB,EAAO7zB,CAAC,CAClB,EACD,OAAAu3B,EAAK,QAAUE,EACfF,EAAK,gBAAkB,KAAK,kBAAkBD,EAAI,gBAAiBzD,CAAM,EAClE0D,EAAK,QAAQ,OAAS,GAAKA,EAAK,gBAAgB,OAAS,EAAI,CAACA,CAAI,EAAI,EACzF,CAAS,CACJ,CACD,OAAO,SAASH,EAAYlC,EAAa,CACrC,MAAMwC,EAAqBb,GAAe,iBAAiBO,EAAYlC,CAAW,EAC5E7/B,EAAS,IAAID,GAEnB,UAAWiiC,KAAYK,EACnB,GAAI,CACAL,EAAS,SAASnC,CAAW,CAChC,OACMhgC,EAAG,CACN,GAAIC,GAAeD,CAAC,GAAKD,GAAcC,CAAC,EACpCG,EAAO,SAASH,CAAC,MAGjB,OAAMA,CAEb,CAELG,EAAO,gBAAe,CACzB,CACD,OAAO,iBAAiB+hC,EAAYlC,EAAagC,EAAe,CAC5D,MAAMR,EAAUxB,EAAY,mBAEtB8B,EADqBH,GAAe,iBAAiBO,EAAYlC,EAAagC,CAAa,EAC9D,QAAQn3B,GAAKA,EAAE,sBAAsBm1B,EAAagC,CAAa,CAAC,EAC7F3/B,EAAQ,IAAImE,GAElB,SAAW,CAAC9D,EAAI+/B,CAAC,IAAKjB,EACbM,EAAQ,KAAKh3B,GAAKA,EAAE,KAAOpI,CAAE,GAC9BL,EAAM,IAAIK,EAAI,IAAI,EAG1B,OAAOs9B,EAAY,mBAAmB39B,CAAK,CAC9C,CACD,WAAY,CACR,MAAMwI,EAAI,KAAK,QACf,OAAAA,EAAE,GAAK/K,KACP+K,EAAE,gBAAkB,KAAK,gBAAgB,IAAIA,GAAKA,EAAE,UAAS,CAAE,EAC/DA,EAAE,QAAU,KAAK,QAAQ,IAAIC,GAAKA,EAAE,UAAS,CAAE,EACxCD,CACV,CACL,CACAH,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAG6hC,GAAe,UAAW,KAAM,MAAM,EACzCj3B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG45B,GAAe,UAAW,OAAQ,MAAM,EAC3Cj3B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG45B,GAAe,UAAW,cAAe,MAAM,EAClDj3B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,QAAS,GAAG,CAAE,CACnD,EAAGs6B,GAAe,UAAW,iBAAkB,MAAM,EACrDj3B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa26B,EAAc,CAAC,CAAE,CACvD,EAAGA,GAAe,UAAW,kBAAmB,MAAM,EACtDj3B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAau6B,EAAc,CAAC,CAAE,CACvD,EAAGI,GAAe,UAAW,UAAW,MAAM,EAC9Cj3B,EAAW,CACP7K,EAAM,CAAE,QAASygC,GAAgB,QAAS,IAAK,SAAU,GAAM,SAAU,GAAM,CACnF,EAAGqB,GAAe,UAAW,SAAU,MAAM,ECzRtC,IAAIe,IACV,SAAUA,EAAgB,CACvBA,EAAe,SAAc,WAC7BA,EAAe,SAAc,WAC7BA,EAAe,SAAc,UACjC,GAAGA,KAAmBA,GAAiB,CAAE,EAAC,EACnC,MAAMC,WAAiCj+B,EAAY,CACtD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,YAAc,GACnB,KAAK,QAAU,CAAC,IAAK,KAAM,GAAI,CAClC,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG46B,GAAyB,UAAW,cAAe,MAAM,EAC5Dj4B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAaS,EAAc,CAAC,CAAE,CACvD,EAAGk7B,GAAyB,UAAW,UAAW,MAAM,EACjD,MAAMC,WAAiCl+B,EAAY,CACtD,aAAc,CACV,MAAM,GAAG,SAAS,EAIlB,KAAK,MAAQk+B,GAAyB,aAItC,KAAK,YAAcA,GAAyB,mBAI5C,KAAK,cAAgBA,GAAyB,qBAI9C,KAAK,UAAYA,GAAyB,iBAI1C,KAAK,YAAcA,GAAyB,mBAK5C,KAAK,sBAAwB,GAI7B,KAAK,0BAA4B,IACpC,CACD,WAAW,oBAAqB,CAC5B,MAAO,gVACV,CACD,WAAW,cAAe,CACtB,MAAO,0BACV,CACD,WAAW,kBAAmB,CAC1B,MAAO,iBACV,CACD,WAAW,sBAAuB,CAC9B,MAAO,yFACV,CACD,WAAW,oBAAqB,CAC5B,MAAO,mCACV,CACD,WAAW,kCAAmC,CAC1C,MAAO,2GACV,CACL,CACAl4B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG66B,GAAyB,UAAW,QAAS,MAAM,EACtDl4B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG66B,GAAyB,UAAW,cAAe,MAAM,EAC5Dl4B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG66B,GAAyB,UAAW,gBAAiB,MAAM,EAC9Dl4B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,QAAS,GAAG,CAAE,CAClD,EAAG66B,GAAyB,UAAW,YAAa,MAAM,EAC1Dl4B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAG66B,GAAyB,UAAW,cAAe,MAAM,EAC5Dl4B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,SAAU,GAAM,QAAS,IAAK,CACnE,EAAGu7B,GAAyB,UAAW,wBAAyB,MAAM,EACtEl4B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,GAAM,QAAS,IAAK,CAClE,EAAG66B,GAAyB,UAAW,4BAA6B,MAAM,EACnE,MAAMC,WAAgCn+B,EAAY,CACrD,aAAc,CACV,MAAM,GAAG,SAAS,EAIlB,KAAK,MAAQm+B,GAAwB,aAIrC,KAAK,YAAcA,GAAwB,mBAI3C,KAAK,cAAgBA,GAAwB,qBAK7C,KAAK,gBAAkB,KAKvB,KAAK,YAAcA,GAAwB,kBAC9C,CACD,WAAW,oBAAqB,CAC5B,MAAO,EACV,CACD,WAAW,cAAe,CACtB,MAAO,2CACV,CACD,WAAW,sBAAuB,CAC9B,MAAO,8IACV,CACD,WAAW,oBAAqB,CAC5B,MAAO,sDACV,CACD,WAAW,wBAAyB,CAChC,MAAO,EACV,CACL,CACAn4B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG86B,GAAwB,UAAW,QAAS,MAAM,EACrDn4B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG86B,GAAwB,UAAW,cAAe,MAAM,EAC3Dn4B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG86B,GAAwB,UAAW,gBAAiB,MAAM,EAC7Dn4B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,GAAM,QAAS,IAAK,CAClE,EAAG86B,GAAwB,UAAW,kBAAmB,MAAM,EAC/Dn4B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAG86B,GAAwB,UAAW,cAAe,MAAM,EACpD,MAAMC,WAAyCp+B,EAAY,CAC9D,aAAc,CAEV,MAAM,GAAG,SAAS,EAIlB,KAAK,iBAAmB,GAIxB,KAAK,eAAiB,GACtB,KAAK,aAAe,KACpB,KAAK,MAAQ,KACb,KAAK,OAAS,KACd,KAAK,SAAW,KAChB,KAAK,QAAU,KACf,KAAK,QAAU,KACf,KAAK,kBAAoB,KACzB,KAAK,aAAe,KACpB,KAAK,uBAAyB,KAC9B,KAAK,iBAAmB,GAIxB,KAAK,0BAA4B,IAAI,IAErC,KAAK,iBAAmB,IAC3B,CACD,OAAO,MAAM1F,EAAS,CAClB,IAAIK,EAAIG,EAAIC,EAEZ,MAAMsjC,EAAiB/jC,EAAQ,SAAS,OAAO,qBAAqB,QACpE,IAAK,CAACA,EAAQ,OAAS,CAACA,EAAQ,MAAM,oBAAsB,CAACA,EAAQ,qBACjE,UAAW6L,KAAKk4B,EAAe,iBAC3Bl4B,EAAE,eAAiB,GAG3B,IAAIm4B,EAAqB,KACrBC,EAAqB,KACrBC,EAAc,KAClB,GAAIlkC,EAAQ,aAAc,CAEtB,GADAgkC,EAAqBhkC,EAAQ,aAAa,KAAK,qBAAqB,MAAK,EACrEA,EAAQ,OAASA,EAAQ,MAAM,OAASyhC,GAAU,WAElD,UAAW51B,KAAKm4B,EAAmB,iBAC/Bn4B,EAAE,eAAiB,GAGvB7L,EAAQ,OAASA,EAAQ,MAAM,OAASyhC,GAAU,cAIlDuC,EAAqBF,GAAiC,OAAO,CACzD,iBAAkBE,EAAmB,gBACzD,CAAiB,EAER,CAKD,GAHIhkC,EAAQ,OAASA,EAAQ,eACzBkkC,EAAclkC,EAAQ,MAAM,SAAS,qBAAqB,MAAK,GAE/DA,EAAQ,QAAW,GAAAK,EAAKL,EAAQ,SAAW,MAAQK,IAAO,SAAkBA,EAAG,mBAAoB,CACnG,MAAM8jC,EAAoBnkC,EAAQ,MAAM,kBACxCikC,GAAsBxjC,GAAMD,EAAKR,EAAQ,SAAS,OAAO,iBAAiB,KAAKmM,GAAKA,EAAE,KAAOg4B,CAAiB,KAAO,MAAQ3jC,IAAO,OAAS,OAASA,EAAG,qBAAqB,MAAO,KAAM,MAAQC,IAAO,OAASA,EAAK,IAC3N,CACD,OAAO,KAAK,cAAc,GAAI,CAACsjC,EAAgBE,EAAoBD,EAAoBE,CAAW,EAAE,OAAOt9B,GAAKA,IAAM,IAAI,CAAC,CAC9H,CACD,OAAO,iBAAiBw9B,EAAS,CAC7B,GAAIA,EAAQ,SAAW,EACnB,MAAM,IAAI,MAAM,wCAAwC,EAE5D,GAAIA,EAAQ,SAAW,EACnB,OAAOA,EAAQ,CAAC,EAEpB,MAAM/C,EAAQ+C,EAAQ,CAAC,EACjBhyB,EAASgyB,EAAQ,CAAC,EACxB,OAAO,KAAK,cAAc,KAAK,WAAW/C,EAAOjvB,CAAM,EAAG,GAAGgyB,EAAQ,MAAM,CAAC,CAAC,CAChF,CAID,OAAO,WAAWC,EAAQC,EAAO,CAC7B,MAAM78B,EAAQ68B,EAAM,QACpB,OAAID,EAAO,mBAAqB,KAC5B58B,EAAM,iBAAmB48B,EAAO,kBAEhCA,EAAO,iBAAmB,KAC1B58B,EAAM,eAAiB48B,EAAO,gBAE9BA,EAAO,eAAiB,OACxB58B,EAAM,aAAe48B,EAAO,cAE5BA,EAAO,yBAA2B,OAClC58B,EAAM,uBAAyB48B,EAAO,wBAEtCA,EAAO,eAAiB,OACxB58B,EAAM,aAAe48B,EAAO,cAE5BA,EAAO,QAAU,OACjB58B,EAAM,MAAQ48B,EAAO,OAErBA,EAAO,SAAW,OAClB58B,EAAM,OAAS48B,EAAO,QAEtBA,EAAO,WAAa,OACpB58B,EAAM,SAAW48B,EAAO,UAExBA,EAAO,UAAY,OACnB58B,EAAM,QAAU48B,EAAO,SAEvBA,EAAO,UAAY,OACnB58B,EAAM,QAAU48B,EAAO,SAEvBA,EAAO,oBAAsB,OAC7B58B,EAAM,kBAAoB48B,EAAO,mBAEjCA,EAAO,mBAAqB,OAC5B58B,EAAM,iBAAmB48B,EAAO,kBAEpC58B,EAAM,iBAAmB,CAAC,GAAG48B,EAAO,iBAAiB,IAAK,GAAM,CACxD,MAAMx4B,EAAI,EAAE,QACZ,GAAI,EAAE,eACF,OAAOA,EAEX,MAAM04B,EAAkBD,EAAM,0BAA0B,IAAI,EAAE,EAAE,EAChE,OAAIC,IAAoB,SACpB14B,EAAE,OAAS04B,EACX14B,EAAE,eAAiB,IAEhBA,CACvB,CAAa,EAAG,GAAGpE,EAAM,gBAAgB,EAEjCA,EAAM,0BAA4B,IAAI,IAC/BA,CACV,CACL,CACAiE,EAAW,CACP7K,EAAM,CAAE,QAAS+iC,GAA0B,SAAU,GAAM,QAAS,IAAK,EACzE/iC,EAAM,CACF,QAASwH,GACT,QAAS,IACT,QAAUm8B,GACC,CAAC,CAACA,CAErB,CAAK,CACL,EAAGV,GAAiC,UAAW,mBAAoB,MAAM,EACzEp4B,EAAW,CACP7K,EAAM,CAAE,QAASgjC,GAAyB,SAAU,GAAM,QAAS,IAAK,EACxEhjC,EAAM,CACF,QAASwH,GACT,QAAS,IACT,QAAUm8B,GACC,CAAC,CAACA,CAErB,CAAK,CACL,EAAGV,GAAiC,UAAW,iBAAkB,MAAM,EACvEp4B,EAAW,CACP7K,EAAM,CAAE,QAASygC,GAAgB,SAAU,GAAM,QAAS,IAAK,CACnE,EAAGwC,GAAiC,UAAW,eAAgB,MAAM,EACrEp4B,EAAW,CACP7K,EAAM,CAAE,QAASygC,GAAgB,SAAU,GAAM,QAAS,IAAK,CACnE,EAAGwC,GAAiC,UAAW,QAAS,MAAM,EAC9Dp4B,EAAW,CACP7K,EAAM,CAAE,QAASygC,GAAgB,SAAU,GAAM,QAAS,IAAK,CACnE,EAAGwC,GAAiC,UAAW,SAAU,MAAM,EAC/Dp4B,EAAW,CACP7K,EAAM,CAAE,QAASygC,GAAgB,SAAU,GAAM,QAAS,IAAK,CACnE,EAAGwC,GAAiC,UAAW,WAAY,MAAM,EACjEp4B,EAAW,CACP7K,EAAM,CAAE,QAASygC,GAAgB,SAAU,GAAM,QAAS,IAAK,CACnE,EAAGwC,GAAiC,UAAW,UAAW,MAAM,EAChEp4B,EAAW,CACP7K,EAAM,CAAE,QAASygC,GAAgB,SAAU,GAAM,QAAS,IAAK,CACnE,EAAGwC,GAAiC,UAAW,UAAW,MAAM,EAChEp4B,EAAW,CACP7K,EAAM,CAAE,QAASygC,GAAgB,SAAU,GAAM,QAAS,IAAK,CACnE,EAAGwC,GAAiC,UAAW,oBAAqB,MAAM,EAC1Ep4B,EAAW,CACP7K,EAAM,CAAE,QAASygC,GAAgB,SAAU,GAAM,QAAS,IAAK,CACnE,EAAGwC,GAAiC,UAAW,eAAgB,MAAM,EACrEp4B,EAAW,CACP7K,EAAM,CAAE,QAASygC,GAAgB,SAAU,GAAM,QAAS,IAAK,CACnE,EAAGwC,GAAiC,UAAW,yBAA0B,MAAM,EAC/Ep4B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa26B,EAAc,EAAG,QAAS,IAAK,CACrE,EAAGmB,GAAiC,UAAW,mBAAoB,MAAM,EACzEp4B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0I,GAAWR,EAAeu4B,EAAc,EAAG,QAAS,IAAK,CAClF,EAAGwC,GAAiC,UAAW,4BAA6B,MAAM,EAClFp4B,EAAW,CACP7K,EAAM,CAAE,QAAS8iC,GAA0B,SAAU,GAAM,QAAS,GAAI,CAC5E,EAAGG,GAAiC,UAAW,mBAAoB,MAAM,ECrVlE,MAAMW,WAAwB/+B,EAAY,CAC7C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,MAAQ,CAAC,EAAE,EAChB,KAAK,YAAc,GACnB,KAAK,OAAS,KACd,KAAK,OAAS,KAId,KAAK,wBAA0B,KAC/B,KAAK,uBAAyB,EAI9B,KAAK,mBAAqB,IAC7B,CACD,IAAI,MAAO,CACP,OAAOkd,EAAU,SAAS,KAAK,MAAO,KAAM,MAAM,CACrD,CACD,iBAAiB8hB,EAAM,CACnB,MAAMC,EAAmB,KAAK,mBAC9B,OAAIA,IAAqB,KACd,IAEHD,GAAS,KAA0B,OAASA,EAAK,KAAKE,GAASD,EAAiB,SAASC,CAAK,CAAC,KAAO,MACjH,CACL,CACAl5B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAG2jC,GAAgB,UAAW,KAAM,MAAM,EAC1C/4B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,CAAC,CAAE,CACtD,EAAG07B,GAAgB,UAAW,QAAS,MAAM,EAC7C/4B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAG07B,GAAgB,UAAW,cAAe,MAAM,EACnD/4B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,EAAI,CAAE,CACrD,EAAGg8B,GAAgB,UAAW,SAAU,MAAM,EAC9C/4B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,EAAI,CAAE,CACrD,EAAGg8B,GAAgB,UAAW,SAAU,MAAM,EAC9C/4B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,GAAM,QAAS,IAAK,CAClE,EAAG07B,GAAgB,UAAW,0BAA2B,MAAM,EAC/D/4B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,QAAS,GAAG,CAAE,CACnD,EAAGg8B,GAAgB,UAAW,yBAA0B,MAAM,EAC9D/4B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,EAAG,SAAU,GAAM,QAAS,IAAK,CACpF,EAAG07B,GAAgB,UAAW,qBAAsB,MAAM,EAC1D/4B,EAAW,CACP7K,EAAM,CACF,QAASijC,GACT,QAAS,IACT,aAAc,IAAMA,GAAiC,OAAO,EAAE,CACtE,CAAK,CACL,EAAGW,GAAgB,UAAW,uBAAwB,MAAM,EC5DrD,MAAMI,EAAK,CACd,YAAYtkC,EAAM,CACd,IAAIF,EAAIG,EAAIC,EAAIgG,EAEhB,KAAK,UAAY,GAGjB,KAAK,UAAY,KAKjB,KAAK,UAAY,KACjB,KAAK,GAAKlG,EAAK,GACf,KAAK,OAASA,EAAK,OACnB,KAAK,KAAOA,EAAK,KACjB,KAAK,KAAOA,EAAK,KACjB,KAAK,MAAQF,EAAKE,EAAK,QAAU,MAAQF,IAAO,OAASA,EAAK,KAC9D,KAAK,WAAaG,EAAKD,EAAK,aAAe,MAAQC,IAAO,OAASA,EAAK,GACxE,KAAK,WAAaC,EAAKF,EAAK,aAAe,MAAQE,IAAO,OAASA,EAAK,KACxE,KAAK,WAAagG,EAAKlG,EAAK,aAAe,MAAQkG,IAAO,OAASA,EAAK,IAC3E,CACD,cAAe,CACX,IAAIpG,EACJ,OAAOo+B,GAAoB,OAAO,CAC9B,GAAI,KAAK,cAAe,EACxB,OAAQp+B,EAAK,KAAK,QAAU,MAAQA,IAAO,OAASA,EAAK,OACzD,KAAMm+B,GAAwB,IAC1C,CAAS,CACJ,CACD,IAAI,aAAc,CACd,MAAO,OAAS,KAAK,GAAK;AAAA,UACP,KAAK,OAAS;AAAA,QAChB,KAAK,KAAO;AAAA,QACZ,KAAK,KAAK,QAAQ,CAAC,EAAI;AAAA,QACvB,KAAK,KAAO;AAAA,cACN,KAAK,UAAY,OAAS,QACpD,CACD,WAAW,gBAAiB,CACxB,MAAO,CAAC,CAACqG,GAAK,QACjB,CACD,MAAM,MAAO,CACT,OAAKA,GAAK,UAGV,MAAMA,GAAK,SAAS,IAAI,EACjB,IAHI,EAId,CACD,MAAM,QAAS,CAIX,MAHI,CAAC,KAAK,WAGN,CAACA,GAAK,WACC,GAEJ,MAAMA,GAAK,WAAW,IAAI,CACpC,CACD,MAAM,eAAgB,CAOlB,MANI,CAAC,KAAK,WAAa,CAAC,KAAK,WAGzB,CAACA,GAAK,kBAGN,CAAC,MAAM,KAAK,SAEL,KAEJ,MAAMA,GAAK,iBAAiB,IAAI,CAC1C,CACD,OAAO,OAAOtkC,EAAM,CAChB,IAAIF,EAAIG,EAAIC,EAAIgG,EAAI6D,EAAIC,EAAIu6B,EAAIC,EAChC,MAAMC,EAAO,IAAIH,GAAK,CAClB,GAAItkC,EAAK,MAAM,IAAI,EAAE,OACrB,OAAQA,EAAK,MAAM,QAAQ,EAAE,OAC7B,KAAMA,EAAK,MAAM,MAAM,EAAE,OACzB,KAAMA,EAAK,MAAM,MAAM,EAAE,QACzB,MAAOC,GAAMH,EAAKE,EAAK,cAAc,MAAM,KAAO,MAAQF,IAAO,OAAS,OAASA,EAAG,UAAY,MAAQG,IAAO,OAASA,EAAK,KAC/H,WAAYiG,GAAMhG,EAAKF,EAAK,cAAc,WAAW,KAAO,MAAQE,IAAO,OAAS,OAASA,EAAG,WAAa,MAAQgG,IAAO,OAASA,EAAK,GAC1I,WAAY8D,GAAMD,EAAK/J,EAAK,cAAc,WAAW,KAAO,MAAQ+J,IAAO,OAAS,OAASA,EAAG,UAAY,MAAQC,IAAO,OAASA,EAAK,KACzI,WAAYw6B,GAAMD,EAAKvkC,EAAK,cAAc,WAAW,KAAO,MAAQukC,IAAO,OAAS,OAASA,EAAG,UAAY,MAAQC,IAAO,OAASA,EAAK,IACrJ,CAAS,EAKD,IAJIxkC,EAAK,QAAQ,SAAWiK,GAAa,UAAY,CAACw6B,EAAK,WAAa,CAACA,EAAK,aAE1EA,EAAK,UAAY,MAEjBA,EAAK,WAAa,KAAK,iBAAmB,CAACzkC,EAAK,QAAQ,QAAUA,EAAK,QAAQ,SAAWiK,GAAa,UAGnG,CAACw6B,EAAK,UACN,MAAM,IAAI7kC,GAAY,CAClB,KAAM,oBACN,QAAS,oCAC7B,CAAiB,EAGT,OAAO6kC,CACV,CACD,OAAO1kC,EAAS,CACZ,MAAO,CACH,GAAI,KAAK,GACT,OAAQ,KAAK,OACb,KAAM,KAAK,KACX,KAAM,KAAK,KACX,KAAM,KAAK,KACX,UAAW,KAAK,UAChB,UAAW,KAAK,WAAa,KAAK,UAAY,KAAK,UAAY,OAC/D,UAAW,KAAK,UAAY,KAAK,UAAY,MACzD,CACK,CACD,eAAgB,CACZ,OAAI,KAAK,WAAa,KAAK,UAChB,KAAK,UAET,KAAK,OAAS,IAAM,KAAK,IACnC,CACL,CAKAukC,GAAK,WAAa,KAClBA,GAAK,SAAW,KAChBA,GAAK,iBAAmB,KC7HjB,MAAMI,EAAW,CACpB,YAAY1kC,EAAM,CACd,KAAK,KAAOA,EAAK,KACjB,KAAK,MAAQA,EAAK,MAClB,KAAK,OAASA,EAAK,MACtB,CACD,OAAO,OAAOA,EAAM,CAChB,OAAO,IAAI0kC,GAAW,CAClB,KAAM1kC,EAAK,MAAM,MAAM,EAAE,OAAOskC,EAAI,EACpC,MAAOtkC,EAAK,MAAM,OAAO,EAAE,QAC3B,OAAQA,EAAK,MAAM,QAAQ,EAAE,OACzC,CAAS,CACJ,CACD,OAAOD,EAAS,CACZ,MAAO,CACH,KAAM,KAAK,KAAK,OAAOA,CAAO,EAC9B,MAAO,KAAK,MACZ,OAAQ,KAAK,MACzB,CACK,CACL,QCfO,cAAoBoF,EAAY,CACnC,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,YAAc,EACtB,CACD,cAAe,CACX,IAAIrF,EACJ,OAAOo+B,GAAoB,OAAO,CAC9B,GAAI,KAAK,eAAe,OAAW,MAAS,EAC5C,OAAQp+B,EAAK,KAAK,OAAO,QAAU,MAAQA,IAAO,OAASA,EAAK,OAChE,KAAMm+B,GAAwB,KAC1C,CAAS,CACJ,CACD,eAAgB,CACZ,OAAI,KAAK,YAAY,OAAS,EACnB,KAAK,YAAY,CAAC,EAAE,KAAK,cAAa,EAE1C,KAAK,OAAO,eACtB,CACD,eAAe0G,EAAOC,EAAQ,CAC1B,OAAI,KAAK,YAAY,QAAU,EACpB,KAAK,gBAEG,KAAK,qBAAqBD,EAAOC,CAAM,EACxC,KAAK,eAC1B,CACD,qBAAqBD,EAAOC,EAAQ,CAChC,IAAI9kC,EACJ,IAAI+kC,EACJ,MAAMC,GAAShlC,EAAO,OAAO,OAAW,KAAgB,OAAO,iBAAmB,OAAO,iBAAwB,KAAQ,MAAQA,IAAO,OAASA,EAAK,EAClJglC,GAAS,GAAKH,IACdA,EAAQG,EAAQH,GAEhBG,GAAS,GAAKF,IACdA,EAASE,EAAQF,GAGrB,UAAWG,KAAc,KAAK,aACrBF,IAAmB,SAAe,CAACF,GAASI,EAAW,OAASF,EAAe,SAAW,CAACD,GAAUG,EAAW,QAAUF,EAAe,WACtI,CAACF,GAASI,EAAW,OAASJ,KAC9B,CAACC,GAAUG,EAAW,QAAUH,KACpCC,EAAiBE,GAGzB,GAAIF,EACA,OAAOA,EAGX,UAAWE,KAAc,KAAK,aACtBF,IAAmB,QAAcE,EAAW,OAASF,EAAe,OAASE,EAAW,QAAUF,EAAe,UACjHA,EAAiBE,GAGzB,GAAIF,EACA,OAAOA,EAEX,MAAM,IAAI,MAAM,sEAAsE,CACzF,CACL,EACA15B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAGykC,GAAM,UAAW,KAAM,MAAM,EAChC75B,EAAW,CACP7K,EAAM,CAAE,QAASgkC,GAAM,CAC3B,EAAGU,GAAM,UAAW,SAAU,MAAM,EACpC75B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAai9B,EAAU,CAAC,CAAE,CACnD,EAAGM,GAAM,UAAW,cAAe,MAAM,ECzE/B,IAACC,IACV,SAAUA,EAAiB,CACxBA,EAAgB,MAAW,QAC3BA,EAAgB,SAAc,WAC9BA,EAAgB,WAAgB,YACpC,GAAGA,KAAoBA,GAAkB,GAAG,ECFlC,IAACC,IACV,SAAUA,EAAyB,CAChCA,EAAwB,SAAc,WACtCA,EAAwB,OAAY,SACpCA,EAAwB,gBAAqB,kBAC7CA,EAAwB,iBAAsB,mBAC9CA,EAAwB,iBAAsB,gBAClD,GAAGA,KAA4BA,GAA0B,CAAE,EAAC,EACrD,SAASC,GAA8Bl0B,EAAMypB,EAAS,GAAM,CAC/D,OAAQzpB,EAAI,CACR,KAAKi0B,GAAwB,SAAU,OAAOxK,EAAS,WAAa,UACpE,KAAKwK,GAAwB,OAAQ,OAAOxK,EAAS,uBAAyB,qBAC9E,KAAKwK,GAAwB,gBAAiB,OAAOxK,EAAS,cAAgB,YAC9E,KAAKwK,GAAwB,iBAAkB,OAAOxK,EAAS,OAAS,MACxE,KAAKwK,GAAwB,iBAAkB,OAAOxK,EAAS,gBAAkB,aACpF,CACL,CCVO,MAAM0K,WAA4BjgC,EAAY,CACjD,aAAc,CACV,MAAM,GAAG,SAAS,EAIlB,KAAK,aAAe,GAKpB,KAAK,MAAQqF,GAAgB,KAI7B,KAAK,aAAe,EACvB,CACD,aAAc,CACV,OAAO,KAAK,YACf,CACD,UAAUE,EAAO,CACb,OAAOD,GAAyB,KAAK,KAAK,GAAKA,GAAyBC,CAAK,CAChF,CACD,eAAeQ,EAAO,CAClB,MAAMm6B,EAAKp6B,GAAkB,uBAAuBC,CAAK,EACzD,OAAQm6B,GAAM,KAAK,UAAUA,CAAE,GAAM,KAAK,aAAa,SAASn6B,CAAK,CACxE,CACD,kBAAkB+F,EAAMq0B,EAAYC,EAAmB,CACnD,MAAMziC,EAAQyiC,EAAkB,OAAO,MAAM,CAAE,GAE/C,GAAIA,EAAkB,UAAU,IAAIt0B,CAAI,EAAG,CAEvC,MAAMtN,EAAI,IAAIsD,GACdtD,EAAE,IAAI2hC,EAAY,IAAI,EACtBxiC,EAAM,UAAU,IAAImO,EAAMtN,CAAC,CAC9B,KACI,CAED,MAAMA,EAAI,IAAI,IACdA,EAAE,IAAI2hC,EAAY,IAAI,EACtBxiC,EAAM,UAAU,IAAImO,EAAMtN,CAAC,CAC9B,CACD,OAAOb,CACV,CACD,MAAMF,EAAO,CACT,MAAMe,EAAI,IAAIyhC,GACdzhC,EAAE,MAAQ,KAAK,MACfA,EAAE,aAAe,KAAK,aAAa,MAAK,EACpC8G,GAAyB7H,EAAM,KAAK,EAAI6H,GAAyB9G,EAAE,KAAK,IACxEA,EAAE,MAAQf,EAAM,OAEpB,UAAWsI,KAAStI,EAAM,aACjBe,EAAE,aAAa,SAASuH,CAAK,GAC9BvH,EAAE,aAAa,KAAKuH,CAAK,EAGjC,OAAOvH,CACV,CACD,mBAAmB6hC,EAAQ,CACvB,KAAK,aAAe,KAAK,aAAa,OAAOj6B,GAAK,CAACi6B,EAAO,SAASj6B,CAAC,CAAC,CACxE,CACD,IAAI,SAAU,CACV,OAAO,KAAK,QAAUf,GAAgB,MAAQ,KAAK,aAAa,SAAW,CAC9E,CACD,OAAO,kBAAkBpB,EAAK,CAC1B,IAAItJ,EACJ,MAAM2lC,EAAQ,GACRC,EAAuBC,GAAa,CACtC,MAAMC,EAAeD,EAAS,aAAa,IAAIlgC,GAAKwF,GAAkB,eAAexF,CAAC,CAAC,EACvF,GAAIkgC,EAAS,QAAUn7B,GAAgB,KACnC,OAAO6X,EAAU,SAASujB,EAAc,KAAM,MAAM,EAExD,IAAIxlC,EAAS,QACb,OAAIulC,EAAS,QAAUn7B,GAAgB,MACnCpK,EAAS,WAEJulC,EAAS,QAAUn7B,GAAgB,OACxCpK,EAAS,qBAENA,GAAUwlC,EAAa,OAAS,EAAI,QAAUvjB,EAAU,SAASujB,EAAc,KAAM,MAAM,EAAI,GAClH,EACQ,SAAW,CAAC30B,EAAM40B,CAAS,IAAKz8B,EAAK,CACjC,MAAMgoB,EAAMyU,EAAU,IAAI,EAAE,EAC5B,IAAIC,EAAiB,KACrB,GAAI1U,GAAO,CAACA,EAAI,QAAS,CACrB,MAAMwU,EAAexU,EAAI,aAAa,IAAI3rB,GAAKwF,GAAkB,eAAexF,CAAC,CAAC,EAC9E2rB,EAAI,QAAU5mB,GAAgB,MAC9Bi7B,EAAM,KAAK,QAAUN,GAA8Bl0B,EAAM,EAAI,EAAI,KAAOoR,EAAU,SAASujB,EAAc,KAAM,MAAM,CAAC,EAE1H,IAAIxlC,EAAS,QACT2lC,EAAS,SACT3U,EAAI,QAAU5mB,GAAgB,MAC9Bu7B,EAAS,YAEJ3U,EAAI,QAAU5mB,GAAgB,OACnCpK,EAAS,8BACT2lC,EAAS,IAEbN,EAAM,KAAKrlC,EAAS+kC,GAA8Bl0B,EAAM,EAAI,EAAI80B,GAAUH,EAAa,OAAS,EAAI,QAAUvjB,EAAU,SAASujB,EAAc,KAAM,MAAM,EAAI,GAAG,EAClKE,EAAiBJ,EAAoBtU,CAAG,CAC3C,CACD,MAAM4U,EAAY,IAAI,IACtB,UAAWL,KAAYE,EAAU,SAC7B,GAAI,CAACF,EAAS,QAAS,CACnB,MAAMM,EAAcP,EAAoBC,CAAQ,EAChD,GAAIM,IAAgBH,EAChB,SAECE,EAAU,IAAIC,CAAW,GAC1BD,EAAU,IAAIC,EAAa,CAAE,MAAO,EAAG,WAAYnmC,EAAK6lC,EAAS,gBAAkB,MAAQ7lC,IAAO,OAASA,EAAK,IAAI,CAAE,EAE1HkmC,EAAU,IAAIC,CAAW,EAAE,OAAS,CACvC,CAEL,SAAW,CAACA,EAAa,CAAE,MAAArwB,EAAO,UAAAswB,CAAS,CAAE,IAAKF,EAC9CP,EAAM,MAAM7vB,IAAU,GAAKswB,EAAYA,EAAatwB,EAAQ,IAAMuvB,GAA8Bl0B,EAAM2E,EAAQ,CAAC,GAAM,KAAOqwB,EAAc,GAAG,CAEpJ,CACD,OAAOR,CACV,CACL,CACAt6B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,MAAO,GAAG,CAAE,CAChD,EAAG48B,GAAoB,UAAW,eAAgB,MAAM,EACxDj6B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0H,GAAYwC,EAAe,EAAG,MAAO,IAAK,CACnE,EAAG46B,GAAoB,UAAW,QAAS,MAAM,EACjDj6B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa,IAAIO,GAAYgD,EAAW,CAAC,EAAG,MAAO,IAAK,CACjF,EAAGo6B,GAAoB,UAAW,eAAgB,MAAM,EClIjD,MAAMe,WAAuBhhC,EAAY,CAC5C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,EACf,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAG4lC,GAAe,UAAW,KAAM,MAAM,EACzCh7B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG29B,GAAe,UAAW,OAAQ,MAAM,EACpC,MAAMC,WAA+BD,EAAe,CACvD,aAAc,CACV,MAAM,GAAG,SAAS,EAIlB,KAAK,MAAQ37B,GAAgB,KAC7B,KAAK,aAAe,GACpB,KAAK,UAAY,IAAI,IAKrB,KAAK,qBAAuB,GAK5B,KAAK,sBAAwB,GAK7B,KAAK,qBAAuB,EAC/B,CACD,cAAe,CACX,OAAO,KAAK,gBACf,CACD,gBAAiB,CACb,MAAMi7B,EAAQ,GACV,KAAK,QAAUj7B,GAAgB,MAC/Bi7B,EAAM,KAAK,aAAa,EAExB,KAAK,QAAUj7B,GAAgB,OAC/Bi7B,EAAM,KAAK,gBAAgB,EAE3B,KAAK,QAAUj7B,GAAgB,MAC/Bi7B,EAAM,KAAK,mBAAmB,EAElC,UAAWv6B,KAAS,KAAK,aACrBu6B,EAAM,KAAKx6B,GAAkB,eAAeC,CAAK,CAAC,EAGtD,OADAu6B,EAAM,KAAK,GAAGL,GAAoB,kBAAkB,KAAK,SAAS,CAAC,EAC/DK,EAAM,SAAW,EACV,eAEJpjB,EAAU,sBAAsBA,EAAU,SAASojB,EAAO,KAAM,MAAM,CAAC,CACjF,CACD,UAAU/6B,EAAO,CACb,OAAOD,GAAyB,KAAK,KAAK,GAAKA,GAAyBC,CAAK,CAChF,CACD,eAAeQ,EAAO,CAClB,MAAMm6B,EAAKp6B,GAAkB,uBAAuBC,CAAK,EACzD,GAAKm6B,GAAM,KAAK,UAAUA,CAAE,GAAM,KAAK,aAAa,SAASn6B,CAAK,EAC9D,MAAO,GAEX,MAAMm7B,EAAcp7B,GAAkB,gBAAgBC,CAAK,EAC3D,UAAW,KAAKm7B,EACZ,GAAI,KAAK,eAAe,CAAC,EACrB,MAAO,GAGf,MAAO,EACV,CACD,uBAAuBp1B,EAAM9N,EAAI,CAC7B,MAAMwiC,EAAW,KAAK,UAAU,IAAI10B,CAAI,EACxC,GAAI,CAAC00B,EACD,OAAO,KAEX,MAAMW,EAAYX,EAAS,IAAIxiC,CAAE,EAC3BojC,EAAcZ,EAAS,IAAI,EAAE,EACnC,OAAKW,EAMDC,EACOD,EAAU,MAAMC,CAAW,EAE/BD,EARCC,GAGG,IAMd,CACD,6BAA6Bt1B,EAAM9N,EAAI,CACnC,IAAIrD,EACJ,IAAI8S,EAAO,KAAK,uBAAuB3B,EAAM9N,CAAE,EAC/C,OAAIsH,GAAyB,KAAK,KAAK,EAAIA,IAA0B3K,EAAK8S,GAAS,KAA0B,OAASA,EAAK,SAAW,MAAQ9S,IAAO,OAASA,EAAK0K,GAAgB,IAAI,IAC9KoI,IACDA,EAAOwyB,GAAoB,OAAO,CAAE,MAAO,KAAK,KAAK,CAAE,GAE3DxyB,EAAK,MAAQ,KAAK,OAEfA,CACV,CACD,kBAAkB3B,EAAM9N,EAAIuH,EAAO,CAC/B,IAAI5K,EAAIG,EACR,OAAI,KAAK,UAAUyK,CAAK,EACb,IAEHzK,GAAMH,EAAK,KAAK,uBAAuBmR,EAAM9N,CAAE,KAAO,MAAQrD,IAAO,OAAS,OAASA,EAAG,UAAU4K,CAAK,KAAO,MAAQzK,IAAO,OAASA,EAAK,EACxJ,CACD,uBAAuBgR,EAAM9N,EAAI+H,EAAO,CACpC,IAAIpL,EAAIG,EACR,OAAI,KAAK,eAAeiL,CAAK,EAClB,IAEHjL,GAAMH,EAAK,KAAK,uBAAuBmR,EAAM9N,CAAE,KAAO,MAAQrD,IAAO,OAAS,OAASA,EAAG,eAAeoL,CAAK,KAAO,MAAQjL,IAAO,OAASA,EAAK,EAC7J,CACD,oCAAoCgR,EAAM/F,EAAO,CAC7C,GAAI,KAAK,eAAeA,CAAK,EACzB,MAAO,GAEX,MAAMy6B,EAAW,KAAK,UAAU,IAAI10B,CAAI,EACxC,GAAI,CAAC00B,EACD,MAAO,GAEX,UAAW,KAAKA,EAAS,SACrB,GAAI,EAAE,eAAez6B,CAAK,EACtB,MAAO,GAGf,MAAO,EACV,CACD,IAAItI,EAAO,CACH6H,GAAyB,KAAK,KAAK,EAAIA,GAAyB7H,EAAM,KAAK,IAC3E,KAAK,MAAQA,EAAM,OAEvB,UAAWsI,KAAStI,EAAM,aACjB,KAAK,aAAa,SAASsI,CAAK,GACjC,KAAK,aAAa,KAAKA,CAAK,EAGpC,SAAW,CAAC+F,EAAM1F,CAAC,IAAK3I,EAAM,UAC1B,SAAW,CAACO,EAAIwiC,CAAQ,IAAKp6B,EAAG,CACvB,KAAK,UAAU,IAAI0F,CAAI,GACxB,KAAK,UAAU,IAAIA,EAAM,IAAI,GAAK,EAEtC,MAAMsR,EAAU,KAAK,UAAU,IAAItR,CAAI,EAAE,IAAI9N,CAAE,EAC1Cof,EAID,KAAK,UAAU,IAAItR,CAAI,EAAE,IAAI9N,EAAIof,EAAQ,MAAMojB,CAAQ,CAAC,EAHxD,KAAK,UAAU,IAAI10B,CAAI,EAAE,IAAI9N,EAAIwiC,CAAQ,CAKhD,CAER,CACD,IAAI,SAAU,CACV,IAAIa,EAAiB,GACrB,UAAWb,KAAY,KAAK,UAAU,OAAM,EACxC,UAAWp6B,KAAKo6B,EAAS,SACrB,GAAI,CAACp6B,EAAE,QAAS,CACZi7B,EAAiB,GACjB,KACH,CAGT,OAAO,KAAK,QAAUh8B,GAAgB,MAAQ,KAAK,aAAa,SAAW,GAAKg8B,CACnF,CACD,mBAAmBhB,EAAQ,CACvB,KAAK,aAAe,KAAK,aAAa,OAAOj6B,GAAK,CAACi6B,EAAO,SAASj6B,CAAC,CAAC,EACrE,UAAWo6B,KAAY,KAAK,UAAU,OAAM,EACxC,UAAWp6B,KAAKo6B,EAAS,SACrBp6B,EAAE,mBAAmBi6B,CAAM,CAGtC,CACL,CACAr6B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0H,GAAYwC,EAAe,EAAG,QAAS,IAAK,CACrE,EAAG47B,GAAuB,UAAW,QAAS,MAAM,EACpDj7B,EAAW,CACP7K,EAAM,CACF,QAAS,IAAImH,GAAa,IAAIO,GAAYgD,EAAW,CAAC,EACtD,QAAS,IACT,QAAS,UAAY,CACjB,MAAM4H,EAAO,GACb,OAAI,KAAK,sBACLA,EAAK,KAAK5H,GAAY,0BAA0B,EAEhD,KAAK,uBACL4H,EAAK,KAAK5H,GAAY,2BAA2B,EAEjD,KAAK,sBACL4H,EAAK,KAAK5H,GAAY,0BAA0B,EAE7C4H,CACV,CACT,CAAK,CACL,EAAGwzB,GAAuB,UAAW,eAAgB,MAAM,EAC3Dj7B,EAAW,CACP7K,EAAM,CACF,QAAS,IAAI0I,GAAW,IAAIhB,GAAYk9B,EAAuB,EAAG,IAAIl8B,GAEtER,EAAe48B,EAAmB,CAAC,EACnC,QAAS,GACjB,CAAK,CACL,EAAGgB,GAAuB,UAAW,YAAa,MAAM,EACxDj7B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,MAAO,iBAAkB,SAAU,GAAM,CAC9E,EAAGs+B,GAAuB,UAAW,uBAAwB,MAAM,EACnEj7B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,QAAS,IAAK,MAAO,kBAAmB,SAAU,GAAM,CAC7F,EAAGs+B,GAAuB,UAAW,wBAAyB,MAAM,EACpEj7B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,MAAO,iBAAkB,SAAU,GAAM,CAC9E,EAAGs+B,GAAuB,UAAW,uBAAwB,MAAM,EAC5D,MAAMK,WAAwCL,EAAuB,CACxE,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,sBAAwB,IAChC,CACL,CACAj7B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGi+B,GAAgC,UAAW,mBAAoB,MAAM,EACxEt7B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAGi+B,GAAgC,UAAW,wBAAyB,MAAM,ECpOtE,MAAMC,WAA0BvhC,EAAY,CAC/C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GACZ,KAAK,MAAQ,GACb,KAAK,KAAO,EACf,CAID,uBAAuBwhC,EAAM,CACzB,UAAWp7B,KAAK,KAAK,KACjB,GAAIA,EAAE,KAAOo7B,EAAK,GACd,OAAOn8B,GAAgB,KAG/B,UAAWe,KAAK,KAAK,MACjB,GAAIA,EAAE,KAAOo7B,EAAK,GACd,OAAOn8B,GAAgB,MAG/B,UAAWe,KAAK,KAAK,KACjB,GAAIA,EAAE,KAAOo7B,EAAK,GACd,OAAOn8B,GAAgB,KAG/B,OAAOA,GAAgB,IAC1B,CACD,cAAcm8B,EAAMj8B,EAAQF,GAAgB,KAAM,CAC9C,OAAOC,GAAyB,KAAK,uBAAuBk8B,CAAI,CAAC,GAAKl8B,GAAyBC,CAAK,CACvG,CACL,CACAS,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa0+B,EAAc,CAAC,CAAE,CACvD,EAAGO,GAAkB,UAAW,OAAQ,MAAM,EAC9Cv7B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa0+B,EAAc,CAAC,CAAE,CACvD,EAAGO,GAAkB,UAAW,QAAS,MAAM,EAC/Cv7B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa0+B,EAAc,CAAC,CAAE,CACvD,EAAGO,GAAkB,UAAW,OAAQ,MAAM,EC9CvC,MAAME,WAA6BzhC,EAAY,CAClD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,eAAiB,KACtB,KAAK,YAAcuhC,GAAkB,OAAO,CAAE,EACjD,CACL,CACAv7B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,GAAM,QAAS,GAAI,CACjE,EAAGo+B,GAAqB,UAAW,iBAAkB,MAAM,EAC3Dz7B,EAAW,CACP7K,EAAM,CAAE,QAASomC,GAAmB,QAAS,GAAI,SAAU,GAAM,CACrE,EAAGE,GAAqB,UAAW,cAAe,MAAM,EACfA,GAAqB,UAAS,ECbhE,MAAMC,WAAsB1hC,EAAY,CAC3C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,MAAQ,EACb,KAAK,aAAe,IACvB,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,CACrC,EAAG2+B,GAAc,UAAW,QAAS,MAAM,EAC3C17B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,EAAI,CAAE,CACrD,EAAG2+B,GAAc,UAAW,eAAgB,MAAM,EAI3C,MAAMC,WAAuB3hC,EAAY,CAC5C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,UAAY,KAIjB,KAAK,uBAAyB,GAI9B,KAAK,cAAgB,GAIrB,KAAK,OAAS,CAAC0hC,GAAc,OAAO,EAAE,CAAC,EAIvC,KAAK,MAAQ,EAIb,KAAK,aAAe,KAKpB,KAAK,YAAc,KAKnB,KAAK,iBAAmB,IAC3B,CACD,YAAYE,EAASC,EAAyB,EAAG,CAC7C,IAAIlnC,EACJ,GAAI,KAAK,OAAO,QAAU,GAAKknC,EAAyB,EACpD,MAAO,GAEX,MAAMC,EAAQ,KAAK,OAAO,KAAK,IAAI,KAAK,OAAO,OAAS,EAAGD,CAAsB,CAAC,EAClF,OAAID,IACQjnC,EAAKmnC,EAAM,gBAAkB,MAAQnnC,IAAO,OAASA,EAE1DmnC,EAAM,KAChB,CACL,CACA97B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,QAAS,EAAG,aAAc,IAAMjI,GAAM,EAAI,CAC9E,EAAGumC,GAAe,UAAW,KAAM,MAAM,EACzC37B,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,EAAI,CAAE,CAClD,EAAG08B,GAAe,UAAW,YAAa,MAAM,EAChD37B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,QAAS,IAAM,GAAO,QAAS,GAAI,CACxE,EAAGg/B,GAAe,UAAW,yBAA0B,MAAM,EAC7D37B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,QAAS,IAAM,GAAO,QAAS,GAAI,CACxE,EAAGg/B,GAAe,UAAW,gBAAiB,MAAM,EACpD37B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAao/B,EAAa,EAAG,QAAS,GAAI,QAAS,UAAY,CAC5E,MAAM5nC,EAAM,CACR4nC,GAAc,OAAO,CACjB,MAAO,KAAK,MACZ,aAAc,KAAK,YACvC,CAAiB,CACjB,EACY,OAAI,KAAK,cAAgB,OACrB5nC,EAAI,KAAK4nC,GAAc,OAAO,CAC1B,MAAO,KAAK,YACZ,aAAe,KAAK,eAAiB,MAAQ,KAAK,YAAc,KAAK,aAAgB,KAAO,KAAK,YACpG,EAAC,EACE,KAAK,mBAAqB,MAC1B5nC,EAAI,KAAK4nC,GAAc,OAAO,CAC1B,MAAO,KAAK,iBACZ,aAAe,KAAK,eAAiB,MAAQ,KAAK,iBAAmB,KAAK,aAAgB,KAAO,KAAK,YACzG,EAAC,GAGH5nC,CACnB,EAAW,CACX,EAAG6nC,GAAe,UAAW,SAAU,MAAM,EAC7C37B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,CACrC,EAAG4+B,GAAe,UAAW,QAAS,MAAM,EAC5C37B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,EAAI,CAAE,CACrD,EAAG4+B,GAAe,UAAW,eAAgB,MAAM,EACnD37B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,GAAM,QAAS,GAAI,CAClE,EAAG4+B,GAAe,UAAW,cAAe,MAAM,EAClD37B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,GAAM,QAAS,GAAI,CAClE,EAAG4+B,GAAe,UAAW,mBAAoB,MAAM,EC5GhD,MAAMI,WAA+B/hC,EAAY,CACpD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,UAAY,IAAI,KACrB,KAAK,QAAU,IAAI,KACnB,KAAK,OAAS,GACd,KAAK,iBAAmB,IAC3B,CACD,IAAI,MAAO,CACP,MAAO,YAAckd,EAAU,KAAK,KAAK,SAAS,EAAI,MAAQA,EAAU,KAAK,KAAK,OAAO,CAC5F,CACD,IAAI,WAAY,CACZ,OAAOA,EAAU,KAAK,KAAK,SAAS,EAAI,MAAQA,EAAU,KAAK,KAAK,OAAO,CAC9E,CACD,cAAe,CACX,OAAO,KAAK,IACf,CACL,CACAlX,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAG2mC,GAAuB,UAAW,KAAM,MAAM,EACjD/7B,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAG88B,GAAuB,UAAW,YAAa,MAAM,EACxD/7B,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAG88B,GAAuB,UAAW,UAAW,MAAM,EACtD/7B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,SAAU,EAAI,CAAE,CACrD,EAAGo/B,GAAuB,UAAW,SAAU,MAAM,EACrD/7B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,GAAM,QAAS,IAAK,CAClE,EAAG0+B,GAAuB,UAAW,mBAAoB,MAAM,EClCxD,MAAMC,WAAyBhiC,EAAY,CAC9C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,OAAS,EACd,KAAK,SAAW,EACnB,CACD,OAAO,UAAU8L,EAAM9N,EAAI67B,EAAM,CAC7B,IAAIoI,EAAS,EACb,UAAWC,KAAerI,EAClBqI,EAAY,aAAep2B,IAAS9N,IAAO,MAAQkkC,EAAY,WAAalkC,KAC5EikC,GAAUC,EAAY,QAG9B,OAAOD,CACV,CACD,OAAO,OAAOn2B,EAAM9N,EAAI67B,EAAM,CAC1B,OAAOA,EAAK,OAAO,GAAK,EAAE,aAAe/tB,GAAQ,EAAE,WAAa9N,CAAE,EAAE,QAAQ,GAAK,EAAE,QAAQ,CAC9F,CACD,OAAO,IAAIyP,EAAMwrB,EAAK,CAClB,MAAMkJ,EAAgB10B,EAAK,UAAU,GAAK,EAAE,aAAewrB,EAAI,YAAc,EAAE,WAAaA,EAAI,QAAQ,EACxG,GAAIkJ,IAAkB,GAAI,CACtB,MAAMC,EAAW30B,EAAK00B,CAAa,EAGnC,GAFAC,EAAS,QAAUnJ,EAAI,OACvBmJ,EAAS,SAAWJ,GAAiB,MAAMI,EAAS,SAAUnJ,EAAI,QAAQ,EACtEmJ,EAAS,QAAU,GAAKA,EAAS,SAAS,SAAW,EAAG,CAGxD30B,EAAK,OAAO00B,EAAe,CAAC,EAC5B,MACH,CACJ,MAEG10B,EAAK,KAAKwrB,EAAI,MAAO,EAE5B,CACD,QAAS,CACL,KAAK,OAAS,CAAC,KAAK,OACpB,UAAW2F,KAAS,KAAK,SACrBA,EAAM,OAAM,CAEnB,CACD,OAAO,OAAOnxB,EAAM40B,EAAQ,CACxB,MAAMl8B,EAAIk8B,EAAO,QACjB,OAAAl8B,EAAE,OAAM,EACD,KAAK,IAAIsH,EAAMtH,CAAC,CAC1B,CACD,OAAO,MAAMsH,EAAMwrB,EAAK,CACpB,MAAMqJ,EAAkB,GACxB,UAAW,KAAK70B,EAEZ,KAAK,IAAI60B,EAAiB,CAAC,EAE/B,UAAW,KAAKrJ,EACZ,KAAK,IAAIqJ,EAAiB,CAAC,EAE/B,OAAOA,CACV,CACD,OAAO,QAAQ70B,EAAM40B,EAAQ,CACzB,MAAMC,EAAkB,GACxB,UAAW,KAAK70B,EAEZ,KAAK,IAAI60B,EAAiB,CAAC,EAE/B,UAAW,KAAKD,EACZ,KAAK,OAAOC,EAAiB,CAAC,EAElC,OAAOA,CACV,CACL,CACAt8B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,MAAO,IAAI,CAAE,CACjD,EAAG2+B,GAAiB,UAAW,WAAY,MAAM,EACjDh8B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,MAAO,GAAG,CAAE,CAChD,EAAG2+B,GAAiB,UAAW,aAAc,MAAM,EACnDh8B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,MAAO,GAAG,CAAE,CACjD,EAAGi/B,GAAiB,UAAW,SAAU,MAAM,EAC/Ch8B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa0/B,EAAgB,EAAG,MAAO,IAAK,CACrE,EAAGA,GAAiB,UAAW,WAAY,MAAM,ECtE1C,MAAMO,WAAwBviC,EAAY,CAC7C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,MAAQ,EACb,KAAK,aAAe,IACvB,CACD,SAASwiC,EAAW,CAChB,OAAI,KAAK,eAAiB,KACf,KAAK,MAETA,EAAY,KAAK,aAAe,KAAK,KAC/C,CACD,UAAUC,EAAQ,CACd,OAAO,KAAK,SAASA,EAAO,cAAc,QAAQ,uBAAuB,CAC5E,CACL,CACAz8B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,CACrC,EAAGw/B,GAAgB,UAAW,QAAS,MAAM,EAC7Cv8B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,EAAI,CAAE,CACrD,EAAGw/B,GAAgB,UAAW,eAAgB,MAAM,EAC7C,MAAMG,WAAmB1iC,EAAY,CACxC,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,kBACZ,KAAK,MAAQuiC,GAAgB,OAAO,CAAE,GACtC,KAAK,OAAS,GAId,KAAK,MAAQ,KAIb,KAAK,WAAa,EAIlB,KAAK,UAAY,CACpB,CACD,aAAaI,EAAO,CAChB,MAAMC,EAAyBD,EAAM,kBACrC,OAAOX,GAAiB,UAAU,aAAc,KAAK,GAAIY,CAAsB,CAClF,CAID,gBAAgB/kC,EAAM,CAClB,MAAMglC,EAAQhlC,EAAK,kCACnB,OAAOmkC,GAAiB,UAAU,aAAc,KAAK,GAAIA,GAAiB,OAAO,QAASnkC,EAAK,MAAM,GAAIglC,CAAK,CAAC,CAClH,CACD,UAAUhlC,EAAM,CACZ,OAAI,KAAK,QAAU,KACR,GAEPA,aAAgBilC,GACT,KAAK,aAAajlC,CAAI,GAAK,KAAK,MAEpC,KAAK,aAAaA,EAAK,KAAK,EAAI,KAAK,gBAAgBA,CAAI,GAAK,KAAK,KAC7E,CACD,kBAAkBA,EAAM,CACpB,OAAI,KAAK,QAAU,KACR,KAEPA,aAAgBilC,GACT,KAAK,IAAI,EAAG,KAAK,MAAQ,KAAK,aAAajlC,CAAI,CAAC,EAEpD,KAAK,IAAI,EAAG,KAAK,MAAQ,KAAK,gBAAgBA,CAAI,EAAI,KAAK,aAAaA,EAAK,KAAK,CAAC,CAC7F,CACL,CACAmI,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAGsnC,GAAW,UAAW,KAAM,MAAM,EACrC18B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGq/B,GAAW,UAAW,OAAQ,MAAM,EACvC18B,EAAW,CACP7K,EAAM,CAAE,QAASonC,GAAiB,CACtC,EAAGG,GAAW,UAAW,QAAS,MAAM,EACxC18B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,QAAS,GAAG,CAAE,CACnD,EAAG+/B,GAAW,UAAW,SAAU,MAAM,EACzC18B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,GAAM,QAAS,IAAK,CACnE,EAAG2/B,GAAW,UAAW,QAAS,MAAM,EACxC18B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,GAAM,MAAO,YAAa,CACzE,EAAG2/B,GAAW,UAAW,aAAc,MAAM,EAC7C18B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,GAAM,MAAO,WAAY,CACxE,EAAG2/B,GAAW,UAAW,YAAa,MAAM,EACrC,MAAMK,WAAoB/iC,EAAY,CACzC,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GACZ,KAAK,OAAS,GAId,KAAK,MAAQuiC,GAAgB,OAAO,CAAE,GAKtC,KAAK,YAAc,GAKnB,KAAK,QAAU,KAIf,KAAK,MAAQ,KAIb,KAAK,WAAa,EAIlB,KAAK,UAAY,CACpB,CACD,aAAaI,EAAO,CAChB,MAAMC,EAAyBD,EAAM,kBACrC,OAAOX,GAAiB,UAAU,cAAe,KAAK,GAAIY,CAAsB,CACnF,CAID,gBAAgB/kC,EAAM,CAClB,MAAMglC,EAAQhlC,EAAK,kCACnB,OAAOmkC,GAAiB,UAAU,cAAe,KAAK,GAAIA,GAAiB,OAAO,QAASnkC,EAAK,MAAM,GAAIglC,CAAK,CAAC,CACnH,CACD,UAAUhlC,EAAM,CACZ,OAAI,KAAK,QAAU,KACR,GAEPA,aAAgBilC,GACT,KAAK,aAAajlC,CAAI,GAAK,KAAK,MAEpC,KAAK,aAAaA,EAAK,KAAK,EAAI,KAAK,gBAAgBA,CAAI,GAAK,KAAK,KAC7E,CACD,kBAAkBA,EAAM,CACpB,OAAI,KAAK,QAAU,KACR,KAEPA,aAAgBilC,GACT,KAAK,IAAI,EAAG,KAAK,MAAQ,KAAK,aAAajlC,CAAI,CAAC,EAEpD,KAAK,IAAI,EAAG,KAAK,MAAQ,KAAK,gBAAgBA,CAAI,EAAI,KAAK,aAAaA,EAAK,KAAK,CAAC,CAC7F,CACD,oBAAoBA,EAAM,CACtB,GAAI,KAAK,UAAY,KACjB,OAAO,KAAK,kBAAkBA,CAAI,EAEtC,MAAMu6B,EAAY,KAAK,kBAAkBv6B,CAAI,EAC7C,OAAIu6B,IAAc,KACP,KAAK,QAET,KAAK,IAAI,KAAK,QAASA,CAAS,CAC1C,CACL,CACApyB,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAG2nC,GAAY,UAAW,KAAM,MAAM,EACtC/8B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG0/B,GAAY,UAAW,OAAQ,MAAM,EACxC/8B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,QAAS,GAAG,CAAE,CACnD,EAAGogC,GAAY,UAAW,SAAU,MAAM,EAC1C/8B,EAAW,CACP7K,EAAM,CAAE,QAASonC,GAAiB,CACtC,EAAGQ,GAAY,UAAW,QAAS,MAAM,EACzC/8B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,CACrC,EAAGogC,GAAY,UAAW,cAAe,MAAM,EAC/C/8B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,EAAI,CAAE,CACrD,EAAGggC,GAAY,UAAW,UAAW,MAAM,EAC3C/8B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,GAAM,QAAS,IAAK,CACnE,EAAGggC,GAAY,UAAW,QAAS,MAAM,EACzC/8B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,GAAM,MAAO,YAAa,CACzE,EAAGggC,GAAY,UAAW,aAAc,MAAM,EAC9C/8B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,GAAM,MAAO,WAAY,CACxE,EAAGggC,GAAY,UAAW,YAAa,MAAM,EACtC,MAAMC,WAAwBhjC,EAAY,CAC7C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GACZ,KAAK,YAAc,GACnB,KAAK,eAAiB,GACtB,KAAK,QAAU,CACX+iC,GAAY,OAAO,EAAE,CACjC,CACK,CACD,IAAI,QAAS,CACT,OAAO,KAAK,QAAQ,OAAS,GAAK,KAAK,QAAQ,MAAMlsB,GAAKA,EAAE,MAAM,CACrE,CACD,mBAAmBvc,EAAS,CACxB,OAAO,KAAK,QAAQ,OAAQkE,GACpB,EAAAA,EAAE,QAAU,EAAElE,GAAY,MAAsCA,EAAQ,OAI/E,CACJ,CACD,iBAAiBA,EAAS,CACtB,OAAKA,GAAY,MAAsCA,EAAQ,OAAU,KAAK,OACnE,KAAK,QAAQ,CAAC,EAElB,KAAK,QAAQ,OAAOuc,GAAK,CAACA,EAAE,MAAM,EAAE,CAAC,CAC/C,CACL,CACA7Q,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAG4nC,GAAgB,UAAW,KAAM,MAAM,EAC1Ch9B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG2/B,GAAgB,UAAW,OAAQ,MAAM,EAC5Ch9B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG2/B,GAAgB,UAAW,cAAe,MAAM,EACnDh9B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,CACrC,EAAGqgC,GAAgB,UAAW,iBAAkB,MAAM,EACtDh9B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAaygC,EAAW,CAAC,CAAE,CACpD,EAAGC,GAAgB,UAAW,UAAW,MAAM,EACxC,IAAIC,IACV,SAAUA,EAAiB,CACxBA,EAAgB,KAAU,OAC1BA,EAAgB,iBAAsB,mBACtCA,EAAgB,qBAA0B,uBAC1CA,EAAgB,IAAS,KAC7B,GAAGA,KAAoBA,GAAkB,CAAE,EAAC,EACrC,MAAMC,WAAyBljC,EAAY,CAC9C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,UAAY,KACjB,KAAK,QAAU,KACf,KAAK,kBAAoB,EAIzB,KAAK,gBAAkB,EAIvB,KAAK,gBAAkB,CAC1B,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,EAAI,CAAE,CAClD,EAAGi+B,GAAiB,UAAW,YAAa,MAAM,EAClDl9B,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,EAAI,CAAE,CAClD,EAAGi+B,GAAiB,UAAW,UAAW,MAAM,EAChDl9B,EAAW,CACP7K,EAAM,CACF,QAAS4H,GACT,SAAU,EAClB,CAAK,CACL,EAAGmgC,GAAiB,UAAW,oBAAqB,MAAM,EAC1Dl9B,EAAW,CACP7K,EAAM,CACF,QAAS4H,GACT,SAAU,GACV,QAAS,GACjB,CAAK,CACL,EAAGmgC,GAAiB,UAAW,kBAAmB,MAAM,EACxDl9B,EAAW,CACP7K,EAAM,CACF,QAAS4H,GACT,SAAU,GACV,QAAS,GACjB,CAAK,CACL,EAAGmgC,GAAiB,UAAW,kBAAmB,MAAM,EACjD,MAAMC,WAA8BnjC,EAAY,CACnD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,UAAY,EACjB,KAAK,UAAY,EACjB,KAAK,QAAU,CAClB,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,CACrC,EAAGogC,GAAsB,UAAW,YAAa,MAAM,EACvDn9B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,CACrC,EAAGogC,GAAsB,UAAW,YAAa,MAAM,EACvDn9B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,CACrC,EAAGogC,GAAsB,UAAW,UAAW,MAAM,EAC9C,MAAMC,WAAsBpjC,EAAY,CAC3C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GACZ,KAAK,YAAc,GACnB,KAAK,QAAU,KAKf,KAAK,OAAS,KACd,KAAK,OAAS,CAAC0iC,GAAW,OAAO,EAAE,CAAC,EACpC,KAAK,YAAc,GAKnB,KAAK,iBAAmB,GAIxB,KAAK,sBAAwB,KAI7B,KAAK,oBAAsB,KAI3B,KAAK,iBAAmB,KACxB,KAAK,WAAa5C,GAAgB,MAIlC,KAAK,UAAY,EACjB,KAAK,OAAS,KACd,KAAK,OAAS,KACd,KAAK,gBAAkBmD,GAAgB,KAIvC,KAAK,qBAAuB,KAC5B,KAAK,WAAa,KAKlB,KAAK,kBAAoB,GAKzB,KAAK,kBAAoB,EAKzB,KAAK,gBAAkB,EAKvB,KAAK,gBAAkB,KAIvB,KAAK,kBAAoB,GACzB,KAAK,WAAa,KAClB,KAAK,YAAc,KAInB,KAAK,UAAY,GAIjB,KAAK,OAAS,GAId,KAAK,SAAW,GAKhB,KAAK,gBAAkB,GAKvB,KAAK,0BAA4B,GAIjC,KAAK,4BAA8B,KAInC,KAAK,4CAA8C,GAMnD,KAAK,uBAAyB,GAM9B,KAAK,wBAA0B,GAK/B,KAAK,iCAAmC,GAMxC,KAAK,wBAA0B,GAI/B,KAAK,wBAA0B,GAK/B,KAAK,cAAgB,IAAI,IACzB,KAAK,UAAY,IAAI,KACrB,KAAK,QAAU,IAAI,KAKnB,KAAK,oBAAsB,EAC9B,CACD,aAAaN,EAAO,CAChB,MAAMC,EAAyBD,EAAM,kBACrC,OAAOX,GAAiB,UAAU,aAAc,KAAMY,CAAsB,CAC/E,CAID,gBAAgB/kC,EAAM,CAClB,MAAMglC,EAAQhlC,EAAK,kCACnB,OAAOmkC,GAAiB,UAAU,QAASnkC,EAAK,MAAM,GAAIglC,CAAK,CAClE,CACD,UAAUhlC,EAAM,CACZ,OAAI,KAAK,aAAe,KACb,GAEPA,aAAgBilC,GACT,KAAK,aAAajlC,CAAI,GAAK,KAAK,WAEpC,KAAK,aAAaA,EAAK,KAAK,EAAI,KAAK,gBAAgBA,CAAI,GAAK,KAAK,UAC7E,CACD,kBAAkBA,EAAM,CACpB,OAAI,KAAK,aAAe,KACb,KAEPA,aAAgBilC,GACT,KAAK,IAAI,EAAG,KAAK,WAAa,KAAK,aAAajlC,CAAI,CAAC,EAEzD,KAAK,IAAI,EAAG,KAAK,WAAa,KAAK,gBAAgBA,CAAI,EAAI,KAAK,aAAaA,EAAK,KAAK,CAAC,CAClG,CACD,IAAI,QAAS,CACT,IAAIlD,EACJ,OAAO,KAAK,aAAe,MAAQ,KAAK,oBAAsB,MAAS,KAAK,oBAAsBA,EAAK,KAAK,mBAAqB,MAAQA,IAAO,OAASA,EAAK,IAAO,KAAK,UAC7K,CACD,IAAI,kBAAmB,CACnB,IAAIA,EAIJ,OAHI,KAAK,aAAe,MAGpB,KAAK,oBAAsB,KACpB,KAEJ,KAAK,WAAa,KAAK,oBAAsBA,EAAK,KAAK,mBAAqB,MAAQA,IAAO,OAASA,EAAK,EACnH,CAID,eAAewQ,EAAM,CACjB,IAAIk4B,EAEJ,UAAWvB,KAAS,KAAK,WACjB,CAACA,EAAM,WAAaA,EAAM,WAAa32B,KACvCk4B,EAAavB,GAGrB,OAAOuB,CACV,CACD,IAAI,SAAU,CACV,OAAI,KAAK,SAAW,KACT,KAEH,KAAK,UAAU,YAAW,EAAK,KAAK,MAC/C,CACD,IAAI,SAAU,CACV,OAAI,KAAK,SAAW,KACT,KAEH,KAAK,UAAU,YAAW,EAAK,KAAK,MAC/C,CACD,IAAI,WAAY,CACZ,OAAS,KAAK,QAAU,KAAK,QAAU,IAAQ,KAAK,QAAU,KAAK,OAAS,EAC/E,CACD,wBAAwB,CAAE,WAAAC,EAAa,GAAO,cAAAC,EAAgB,EAAO,EAAG,GAAI,CACxE,IAAIC,EAAM,GAqFV,OApFIF,GAAc,KAAK,SAAW,KAAK,SAC/BC,GAAiB,KAAK,aAAezD,GAAgB,SACjD,KAAK,UACL0D,GAAO,oBAGPA,GAAO,qBAGND,GAAiB,KAAK,aAAezD,GAAgB,WACtD,KAAK,UACL0D,GAAO,qBAGPA,GAAO,qBAIXA,GAAO,aAEXA,GAAO,IAAO,KAAK,QAAW,MAAS,KAAK,SAEvCF,GAAc,KAAK,SACpBC,GAAiB,KAAK,aAAezD,GAAgB,SACjD,KAAK,UACL0D,GAAO,4BAGPA,GAAO,6BAGND,GAAiB,KAAK,aAAezD,GAAgB,WACtD,KAAK,UACL0D,GAAO,6BAGPA,GAAO,6BAIXA,GAAO,qBAEXA,GAAO,IAAO,KAAK,SAEdF,GAAc,KAAK,SACpBC,GAAiB,KAAK,aAAezD,GAAgB,SACjD,KAAK,UACL0D,GAAO,0BAGPA,GAAO,2BAGND,GAAiB,KAAK,aAAezD,GAAgB,WACtD,KAAK,UACL0D,GAAO,2BAGPA,GAAO,2BAIXA,GAAO,mBAEXA,GAAO,IAAO,KAAK,SAEdD,IACD,KAAK,aAAezD,GAAgB,SAChC,KAAK,UACL0D,GAAO,SAGPA,GAAO,UAGN,KAAK,aAAe1D,GAAgB,aACrC,KAAK,UACL0D,GAAO,UAGPA,GAAO,YAIdA,GACM,IAGd,CACD,eAAe,CAAE,YAAAC,GAAe,CAC5B,OAAIA,EACO,KAAK,gBAET,KAAK,iBACf,CACD,aAAa9N,EAAW,CACpB,OAAOzY,EAAU,aAAa,KAAK,KAAMyY,CAAS,CACrD,CACD,kBAAkBr7B,EAAS,CACvB,OAAO,KAAK,OAAO,OAAQkE,GACnB,EAAAA,EAAE,QAAU,EAAElE,GAAY,MAAsCA,EAAQ,OAI/E,CACJ,CACD,uBAAuBA,EAAS,CAC5B,OAAO,KAAK,YAAY,OAAQkE,GACrBA,EAAE,mBAAmBlE,CAAO,EAAE,OAAS,CACjD,CACJ,CACD,IAAI,QAAS,CACT,MAAO,CAAC,KAAK,OAAO,KAAKkE,GAAKA,EAAE,MAAM,MAAQ,CAAC,GAAK,CAAC,KAAK,YAAY,KAAKqY,GAAKA,EAAE,QAAQ,KAAKrY,GAAKA,EAAE,MAAM,MAAQ,CAAC,CAAC,CACzH,CACL,CACAwH,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG+/B,GAAc,UAAW,OAAQ,MAAM,EAC1Cp9B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG+/B,GAAc,UAAW,cAAe,MAAM,EACjDp9B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,QAAS,IAAK,SAAU,GAAM,CAClE,EAAG+/B,GAAc,UAAW,UAAW,MAAM,EAC7Cp9B,EAAW,CACP7K,EAAM,CAAE,QAAS4mC,GAAwB,SAAU,GAAM,QAAS,IAAK,CAC3E,EAAGqB,GAAc,UAAW,SAAU,MAAM,EAC5Cp9B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAaogC,EAAU,EAAG,QAAS,IAAK,QAAS,IAAe,CAAE,CAAG,CAAE,CAChG,EAAGU,GAAc,UAAW,SAAU,MAAM,EAC5Cp9B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa0gC,EAAe,EAAG,QAAS,IAAK,CACtE,EAAGI,GAAc,UAAW,cAAe,MAAM,EACjDp9B,EAAW,CACP7K,EAAM,CACF,QAASijC,GACT,QAAS,IACT,aAAc,IAAMA,GAAiC,OAAO,EAAE,CACtE,CAAK,CACL,EAAGgF,GAAc,UAAW,uBAAwB,MAAM,EAC1Dp9B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa26B,EAAc,EAAG,QAAS,IAAK,CACrE,EAAGmG,GAAc,UAAW,mBAAoB,MAAM,EACtDp9B,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,GAAO,QAAS,GAAI,QAAS,UAAY,CAAE,OAAO,KAAK,SAAY,EAAE,EAC7G9J,EAAM,CAAE,QAAS8J,GAAa,SAAU,GAAM,QAAS,IAAK,UAAW,UAAY,CAAE,IAAItK,EAAI,OAAQA,EAAK,KAAK,yBAA2B,MAAQA,IAAO,OAASA,EAAK,KAAK,SAAY,EAAE,CAC9L,EAAGyoC,GAAc,UAAW,wBAAyB,MAAM,EAC3Dp9B,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,GAAO,QAAS,GAAI,QAAS,UAAY,CAAE,OAAO,KAAK,OAAU,EAAE,EAC3G9J,EAAM,CAAE,QAAS8J,GAAa,SAAU,GAAM,QAAS,IAAK,UAAW,UAAY,CAAE,IAAItK,EAAI,OAAQA,EAAK,KAAK,uBAAyB,MAAQA,IAAO,OAASA,EAAK,KAAK,OAAU,EAAE,CAC1L,EAAGyoC,GAAc,UAAW,sBAAuB,MAAM,EACzDp9B,EAAW,CACP7K,EAAM,CAAE,QAASgoC,GAAuB,SAAU,GAAM,QAAS,IAAK,CAC1E,EAAGC,GAAc,UAAW,mBAAoB,MAAM,EACtDp9B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0H,GAAYi9B,EAAe,CAAC,CAAE,CACvD,EAAGsD,GAAc,UAAW,aAAc,MAAM,EAChDp9B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,QAAS,GAAG,CAAE,CACnD,EAAGqgC,GAAc,UAAW,YAAa,MAAM,EAC/Cp9B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,GAAM,MAAO,eAAgB,EACxE5H,EAAM,CAAE,QAAS4H,GAAgB,SAAU,GAAM,QAAS,GAAI,QAAUqJ,GAC5DA,IAAS,KACF,KAEJ,KAAOA,EACf,CACX,EAAGg3B,GAAc,UAAW,SAAU,MAAM,EAC5Cp9B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,GAAM,MAAO,eAAgB,EACxE5H,EAAM,CACF,QAAS4H,GAAgB,SAAU,GAAM,QAAS,GAAI,QAAUqJ,GACxDA,IAAS,KACF,KAEJ,KAAOA,CAE1B,CAAK,CACL,EAAGg3B,GAAc,UAAW,SAAU,MAAM,EAC5Cp9B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0H,GAAYogC,EAAe,EAAG,QAAS,GAAI,CACpE,EAAGG,GAAc,UAAW,kBAAmB,MAAM,EACrDp9B,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,GAAM,QAAS,GAAI,CAC/D,EAAGm+B,GAAc,UAAW,uBAAwB,MAAM,EAC1Dp9B,EAAW,CACP7K,EAAM,CACF,QAAS4H,GAAgB,SAAU,GAAM,QAAS,EAC1D,CAAK,EACD5H,EAAM,CACF,QAAS4H,GACT,SAAU,GACV,QAAS,GACT,QAAS,SAAU+7B,EAAK,CAEpB,OAAI,KAAK,kBAAoBmE,GAAgB,KAClCnE,EAEJ,IACV,CACT,CAAK,CACL,EAAGsE,GAAc,UAAW,aAAc,MAAM,EAChDp9B,EAAW,CACP7K,EAAM,CACF,QAASwH,GAAgB,QAAS,EAC1C,CAAK,CACL,EAAGygC,GAAc,UAAW,oBAAqB,MAAM,EACvDp9B,EAAW,CACP7K,EAAM,CACF,QAAS4H,GACT,SAAU,GACV,QAAS,EACjB,CAAK,CACL,EAAGqgC,GAAc,UAAW,oBAAqB,MAAM,EACvDp9B,EAAW,CACP7K,EAAM,CACF,QAAS4H,GACT,SAAU,GACV,QAAS,GACjB,CAAK,CACL,EAAGqgC,GAAc,UAAW,kBAAmB,MAAM,EACrDp9B,EAAW,CACP7K,EAAM,CACF,QAAS4H,GACT,SAAU,GACV,QAAS,IACT,SAAU,EAClB,CAAK,CACL,EAAGqgC,GAAc,UAAW,kBAAmB,MAAM,EACrDp9B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,QAAS,EAAE,CAAE,CAClD,EAAGygC,GAAc,UAAW,oBAAqB,MAAM,EACvDp9B,EAAW,CACP7K,EAAM,CAAE,QAAS0kC,GAAO,SAAU,GAAM,QAAS,GAAI,CACzD,EAAGuD,GAAc,UAAW,aAAc,MAAM,EAChDp9B,EAAW,CACP7K,EAAM,CAAE,QAAS0kC,GAAO,SAAU,GAAM,QAAS,GAAI,CACzD,EAAGuD,GAAc,UAAW,cAAe,MAAM,EACjDp9B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAaq/B,EAAc,EAAG,MAAO,SAAU,EACpExmC,EAAM,CAAE,QAAS,IAAImH,GAAaq/B,EAAc,EAAG,MAAO,YAAa,SAAU,GAAM,QAAS,GAAG,CAAE,CACzG,EAAGyB,GAAc,UAAW,YAAa,MAAM,EAC/Cp9B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAau9B,EAAK,EAAG,QAAS,GAAI,SAAU,GAAM,CAC3E,EAAGuD,GAAc,UAAW,SAAU,MAAM,EAC5Cp9B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,QAAS,GAAI,SAAU,GAAM,CACjE,EAAG+/B,GAAc,UAAW,WAAY,MAAM,EAC9Cp9B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,EAAG,QAAS,GAAI,CACnE,EAAG+/B,GAAc,UAAW,kBAAmB,MAAM,EACrDp9B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,EAAG,QAAS,IAAK,CACpE,EAAG+/B,GAAc,UAAW,4BAA6B,MAAM,EAC/Dp9B,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,GAAM,QAAS,IAAK,CAChE,EAAGm+B,GAAc,UAAW,8BAA+B,MAAM,EACjEp9B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,QAAS,GAAG,CAAE,CACnD,EAAGygC,GAAc,UAAW,8CAA+C,MAAM,EACjFp9B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,EAAG,QAAS,IAAK,CACpE,EAAG+/B,GAAc,UAAW,yBAA0B,MAAM,EAC5Dp9B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,EAAG,QAAS,IAAK,CACpE,EAAG+/B,GAAc,UAAW,0BAA2B,MAAM,EAC7Dp9B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,QAAS,GAAG,CAAE,CACnD,EAAGygC,GAAc,UAAW,mCAAoC,MAAM,EACtEp9B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,EAAG,QAAS,IAAK,SAAU,GAAM,CACpF,EAAG+/B,GAAc,UAAW,0BAA2B,MAAM,EAC7Dp9B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,EAAG,QAAS,IAAK,SAAU,GAAM,CACpF,EAAG+/B,GAAc,UAAW,0BAA2B,MAAM,EAC7Dp9B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0I,GAAWd,GAAgBmgC,EAAgB,EAAG,QAAS,IAAK,SAAU,EAAI,CAAE,CACrG,EAAGE,GAAc,UAAW,gBAAiB,MAAM,EACnDp9B,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,EAC9B9J,EAAM,CAAE,QAAS8J,GAAa,QAAS,GAAI,QAAUlG,GAAM,CACnD,MAAM2kC,EAAK,IAAI,KAAK3kC,CAAC,EACrB,OAAA2kC,EAAG,YAAY,GAAI,EAAG,EAAG,CAAC,EACnBA,CACnB,EAAW,SAAU,GAAM,CAC3B,EAAGN,GAAc,UAAW,YAAa,MAAM,EAC/Cp9B,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,EAC9B9J,EAAM,CAAE,QAAS8J,GAAa,QAAS,GAAI,QAAUlG,GAAM,CACnD,MAAM2kC,EAAK,IAAI,KAAK3kC,CAAC,EACrB,OAAA2kC,EAAG,YAAY,GAAQ,GAAI,EAAG,CAAC,EACxBA,CACnB,EAAW,SAAU,GAAM,CAC3B,EAAGN,GAAc,UAAW,UAAW,MAAM,EAC7Cp9B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,QAAS,GAAI,SAAU,GAAM,CAClE,EAAGygC,GAAc,UAAW,sBAAuB,MAAM,EACvBA,GAAc,UAAS,ECtzB/C,IAACO,IACV,SAAUA,EAAQ,CACfA,EAAO,KAAU,OACjBA,EAAO,OAAY,SACnBA,EAAO,MAAW,OACtB,GAAGA,KAAWA,GAAS,CAAE,EAAC,EACnB,SAASC,GAAcC,EAAQ,CAClC,OAAQA,EAAM,CACV,KAAKF,GAAO,KACR,MAAO,MACX,KAAKA,GAAO,OACR,MAAO,QACX,KAAKA,GAAO,MACR,MAAO,QACd,CACL,CCJU,IAACG,IACV,SAAUA,EAAa,CACpBA,EAAY,KAAU,OACtBA,EAAY,OAAY,SAIxBA,EAAY,SAAc,UAC9B,GAAGA,KAAgBA,GAAc,CAAE,EAAC,EAC7B,SAASC,GAAmBC,EAAQ,CACvC,OAAQA,EAAM,CACV,KAAKF,GAAY,KACb,MAAO,UACX,KAAKA,GAAY,OACb,MAAO,WACX,KAAKA,GAAY,SACb,MAAO,aACd,CACL,CACO,MAAMhB,WAAc9iC,EAAY,CACnC,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO+7B,GAAU,WACtB,KAAK,eAAiB,GACtB,KAAK,SAAW,GAChB,KAAK,kBAAoB,KACzB,KAAK,YAAc,KACnB,KAAK,kBAAoB,GAIzB,KAAK,MAAQ,EACb,KAAK,SAAWqH,GAAc,OAAO,CAAE,GACvC,KAAK,UAAY,IAAI,KACrB,KAAK,UAAY,KAIjB,KAAK,gBAAkB,KAIvB,KAAK,OAASU,GAAY,KAE1B,KAAK,MAAQ,IAChB,CACD,aAAc,CACV,OAAO,KAAK,SAAS,IACxB,CACD,OAAO,YAAYxjC,EAAGC,EAAG,CACrB,OAAID,EAAE,SAAS,QAAU,CAACC,EAAE,SAAS,OAC1B,GAEPA,EAAE,SAAS,QAAU,CAACD,EAAE,SAAS,OAC1B,EAEP,CAACC,EAAE,SAAS,QAAU,CAACD,EAAE,SAAS,OAE3BwiC,GAAM,SAASxiC,EAAGC,CAAC,EAE1BD,EAAE,SAAS,OAASC,EAAE,SAAS,OACxB,EAEPD,EAAE,SAAS,OAASC,EAAE,SAAS,OACxB,GAEJuiC,GAAM,SAASxiC,EAAGC,CAAC,CAC7B,CACD,OAAO,SAASD,EAAGC,EAAG,CAClB,OAAID,EAAE,SAAS,KAAK,YAAW,EAAKC,EAAE,SAAS,KAAK,cACzC,GAEPD,EAAE,SAAS,KAAK,YAAW,EAAKC,EAAE,SAAS,KAAK,cACzC,EAEJ,CACV,CACD,eAAe,CAAE,YAAAkjC,CAAa,EAAG,GAAI,CACjC,OAAO,KAAK,SAAS,eAAe,CAAE,YAAAA,CAAa,EACtD,CAID,IAAI,2BAA4B,CAK5B,MAJI,CAAC,KAAK,SAAS,uBAIf,KAAK,SAAS,sBAAwB,IAAI,MAAU,KAAK,SAAS,kBAAoBR,GAAgB,iBAE/F,KAEJ,KAAK,SAAS,oBACxB,CAID,IAAI,YAAa,CACb,GAAI,CAAC,KAAK,SAAS,sBACf,MAAO,GAEX,MAAMjwB,EAAM,IAAI,KACVixB,EAAsB,KAAK,0BACjC,OAAI,KAAK,SAAS,sBAAwBjxB,IAAQ,CAACixB,GAAuBA,EAAsBjxB,EAKnG,CAID,IAAI,QAAS,CAIT,GAHI,KAAK,SAAW8wB,GAAY,MAG5B,KAAK,WAEL,MAAO,GAEX,MAAM9wB,EAAM,IAAI,KAChB,MAAI,QAAK,SAAS,qBAAuB,KAAK,SAAS,oBAAsBA,EAIhF,CAID,oBAAoBiZ,EAAKiY,EAAY,GAAM,CACvC,MAAMjgC,EAAM,IAAI,IACVkgC,EAAUlY,EAAI,OAAOxlB,GAAKA,EAAE,SAAS,SAAS,KAAK,EAAE,CAAC,EAC5D,UAAWk4B,KAAUwF,EAEjB,GADAlgC,EAAI,IAAI06B,EAAO,GAAIA,CAAM,EACrBuF,EAAW,CACX,MAAME,EAAazF,EAAO,oBAAoB1S,CAAG,EACjD,UAAWoY,KAAMD,EACbngC,EAAI,IAAIogC,EAAG,GAAIA,CAAE,CAExB,CAEL,MAAO,CAAC,GAAGpgC,EAAI,OAAM,CAAE,CAC1B,CACD,UAAUqgC,EAAaC,EAAeC,EAAkBn/B,GAAgB,KAAM,CAC1E,GAAI,CAACi/B,EACD,MAAO,GAEX,GAAIA,EAAY,kBAAkBvE,GAAwB,OAAQ,KAAK,GAAIyE,CAAe,EACtF,MAAO,GAGX,MAAMC,EAAmB,KAAK,oBAAoBF,CAAa,EAC/D,UAAW9G,KAAYgH,EACnB,GAAIH,EAAY,kBAAkBvE,GAAwB,gBAAiBtC,EAAS,GAAI+G,CAAe,EACnG,MAAO,GAGf,MAAO,EACV,CACD,SAASD,EAAe,CACpB,UAAW5F,KAAU,KAAK,oBAAoB4F,CAAa,EACvD,GAAI,CAAC5F,EAAO,SAAS,OACjB,MAAO,GAGf,MAAO,EACV,CACD,cAAc2F,EAAaC,EAAe,CACtC,OAAO,KAAK,UAAUD,EAAaC,EAAel/B,GAAgB,IAAI,CACzE,CACD,eAAei/B,EAAaC,EAAe,CACvC,OAAO,KAAK,UAAUD,EAAaC,EAAel/B,GAAgB,KAAK,CAC1E,CACD,cAAci/B,EAAaC,EAAe,CACtC,OAAO,KAAK,UAAUD,EAAaC,EAAel/B,GAAgB,IAAI,CACzE,CACD,IAAI,aAAc,CACd,IAAI1K,EACJ,OAAQA,EAAK,KAAK,SAAS,eAAiB,MAAQA,IAAO,OAASA,EAAK,KAAK,SAAS,UAC1F,CACD,qBAAqB+pC,EAAyB,CAC1C,MAAMzK,EAAS,GAoCf,GAnCI,KAAK,SAAS,SAAW,MACzBA,EAAO,KAAK,CACR,IAAK,CACD,IAAK,KAAK,SAAS,OAAS,CAC/B,CACjB,CAAa,EAED,KAAK,SAAS,SAAW,MACzBA,EAAO,KAAK,CACR,IAAK,CACD,IAAK,KAAK,SAAS,OAAS,CAC/B,CACjB,CAAa,EAED,KAAK,SAAS,aAAe6F,GAAgB,UAC7C7F,EAAO,KAAK,CACR,OAAQ0J,GAAO,IAC/B,CAAa,EAED,KAAK,SAAS,aAAe7D,GAAgB,YAC7C7F,EAAO,KAAK,CACR,OAAQ0J,GAAO,IAC/B,CAAa,EAED,KAAK,SAAS,gBAAgB,QAC9B1J,EAAO,KAAK,CACR,cAAe,CACX,WAAY,CACR,QAAS,CACL,IAAK,KAAK,SAAS,eACtB,CACJ,CACJ,CACjB,CAAa,EAED,KAAK,SAAS,0BAA0B,OACxCA,EAAO,KAAK,CACR,cAAe,CACX,WAAY,CACR,SAAU,KAAK,SACf,MAAO,CACH,kBAAmB,CACf,IAAK,KAAK,SAAS,yBACtB,CACJ,CACJ,CACJ,CACjB,CAAa,MAEA,CACD,GAAI,KAAK,SAAS,8BAAgC,KAAM,CACpD,MAAM0K,EAA8B,KAAK,SAAS,4BAClD1K,EAAO,KAAK,CACR,oBAAqB,CACjB,WAAY,CACR,UAAW,CACP,KAAM0K,CACT,EACD,QAAS,CACL,IAAKA,CACR,CACJ,CACJ,CACrB,CAAiB,CACJ,CACG,KAAK,SAAS,8CAAgD,MAC9D1K,EAAO,KAAK,CACR,oBAAqB,CACjB,WAAY,CACR,UAAW,CACP,KAAM,CAAE,EAAG,MAAQ,CACtB,EACD,QAAS,CACL,IAAK,CAAE,EAAG,MAAQ,CACrB,CACJ,CACJ,CACrB,CAAiB,CAER,CACD,OAAIyK,IAA4B,CAAC,KAAK,SAAS,uBAAuB,QAAU,KAAK,SAAS,uBAAuB,SAASA,CAAuB,GACjJzK,EAAO,KAAK,CACR,cAAe,CACX,WAAY,CACR,SAAU,KAAK,SACf,eAAgByK,CACnB,CACJ,CACjB,CAAa,EAEI,KAAK,SAAS,uBAAuB,QAC1CzK,EAAO,KAAK,CACR,cAAe,CACX,WAAY,CACR,SAAU,KAAK,SACf,eAAgB,CACZ,IAAK,KAAK,SAAS,sBACtB,CACJ,CACJ,CACjB,CAAa,EAED,KAAK,SAAS,wBAAwB,QACtCA,EAAO,KAAK,CACR,cAAe,CACX,WAAY,CACR,SAAU,KAAK,SACf,aAAc,CACV,KAAM,CACF,IAAK,KAAK,SAAS,uBACtB,CACJ,CACJ,CACJ,CACjB,CAAa,EAEEA,CACV,CACL,CACAj0B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAG0nC,GAAM,UAAW,KAAM,MAAM,EAChC98B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0H,GAAYk5B,EAAS,EAAG,QAAS,IAAK,CAC/D,EAAG+G,GAAM,UAAW,OAAQ,MAAM,EAClC98B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,QAAS,GAAG,CAAE,CAClD,EAAGy/B,GAAM,UAAW,iBAAkB,MAAM,EAC5C98B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,QAAS,GAAG,CAAE,CAClD,EAAGy/B,GAAM,UAAW,WAAY,MAAM,EACtC98B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,GAAM,QAAS,IAAK,CAClE,EAAGy/B,GAAM,UAAW,oBAAqB,MAAM,EAC/C98B,EAAW,CACP7K,EAAM,CAAE,QAAS2nC,GAAO,SAAU,GAAM,QAAS,IAAK,CAC1D,EAAGA,GAAM,UAAW,cAAe,MAAM,EACzC98B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa0/B,EAAgB,EAAG,QAAS,IAAK,CACvE,EAAGc,GAAM,UAAW,oBAAqB,MAAM,EAC/C98B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,CACrC,EAAG+/B,GAAM,UAAW,QAAS,MAAM,EACnC98B,EAAW,CACP7K,EAAM,CAAE,QAASioC,GAAe,CACpC,EAAGN,GAAM,UAAW,WAAY,MAAM,EACtC98B,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,QAAS,GAAG,CAAE,CAChD,EAAG69B,GAAM,UAAW,YAAa,MAAM,EACvC98B,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,GAAM,QAAS,IAAK,CAChE,EAAG69B,GAAM,UAAW,YAAa,MAAM,EACvC98B,EAAW,CACP7K,EAAM,CAAE,QAASsmC,GAAsB,SAAU,GAAM,QAAS,GAAI,CACxE,EAAGqB,GAAM,UAAW,kBAAmB,MAAM,EAC7C98B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0H,GAAYihC,EAAW,EAAG,QAAS,IAAK,CACjE,EAAGhB,GAAM,UAAW,SAAU,MAAM,EC1V7B,MAAM8B,WAAyB5kC,EAAY,CAC9C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,aAAe,GACpB,KAAK,WAAa,GAClB,KAAK,sBAAwB,GAC7B,KAAK,gBAAkB,EAC1B,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGuhC,GAAiB,UAAW,QAAS,MAAM,EAC9C5+B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,CACrC,EAAGiiC,GAAiB,UAAW,eAAgB,MAAM,EACrD5+B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,CACrC,EAAGiiC,GAAiB,UAAW,aAAc,MAAM,EACnD5+B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,CACrC,EAAGiiC,GAAiB,UAAW,wBAAyB,MAAM,EAC9D5+B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,CACrC,EAAGiiC,GAAiB,UAAW,kBAAmB,MAAM,EACjD,MAAMC,WAAoB7kC,EAAY,CACzC,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,MAAQ,EAChB,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGwhC,GAAY,UAAW,QAAS,MAAM,EACzC7+B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGwhC,GAAY,UAAW,QAAS,MAAM,EACzC7+B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAGwhC,GAAY,UAAW,OAAQ,MAAM,EACjC,MAAMC,WAAkB9kC,EAAY,CACvC,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,UAAY,KACjB,KAAK,SAAW,KAChB,KAAK,aAAe,GACpB,KAAK,QAAU,KAKf,KAAK,OAAS,KAMd,KAAK,KAAO,KAEZ,KAAK,MAAQ,EAChB,CACD,wBAAyB,CACrB,IAAIrF,EAAIG,EACR,MAAO,CACH+pC,GAAY,OAAO,CACf,MAAO,YACP,OAAQlqC,EAAK,KAAK,aAAe,MAAQA,IAAO,OAASA,EAAK,EAC9E,CAAa,EACDkqC,GAAY,OAAO,CACf,MAAO,WACP,OAAQ/pC,EAAK,KAAK,YAAc,MAAQA,IAAO,OAASA,EAAK,EAC7E,CAAa,EACD+pC,GAAY,OAAO,CACf,MAAO,QACP,MAAO,KAAK,KAC5B,CAAa,EACDA,GAAY,OAAO,CACf,MAAO,WACP,MAAO,KAAK,UAAY,OAAO,KAAK,SAAS,IAAM,QACnE,CAAa,CACb,CACK,CACD,MAAME,EAAW,CACb,IAAIpqC,EACJ,KAAK,UAAY,KAAK,YAAc,MAAQ,KAAK,UAAU,OAAS,EAAI,KAAK,UAAYoqC,EAAU,UACnG,KAAK,SAAW,KAAK,WAAa,MAAQ,KAAK,SAAS,OAAS,EAAI,KAAK,SAAWA,EAAU,SAC/F,UAAWC,KAAeD,EAAU,aAAc,CAC9C,MAAM3C,EAAW,KAAK,aAAa,KAAKh8B,GAAKA,EAAE,OAAS4+B,EAAY,KAAK,EACpE5C,EAIGA,EAAS,MAAM,QAAU,IACzBA,EAAS,MAAQ4C,EAAY,OAJjC,KAAK,aAAa,KAAKA,CAAW,CAOzC,CACD,KAAK,QAAUrqC,EAAK,KAAK,UAAY,MAAQA,IAAO,OAASA,EAAKoqC,EAAU,OAC5E,KAAK,MAAQ7nB,EAAU,YAAY,KAAK,MAAM,OAAO6nB,EAAU,KAAK,CAAC,CACxE,CAID,kBAAmB,CACf,MAAME,EAAe,GACrB,UAAWD,KAAe,KAAK,aAAa,MAAK,EAAG,UAC3CC,EAAa,KAAK7+B,GAAKA,EAAE,QAAU4+B,EAAY,KAAK,GACrDC,EAAa,QAAQD,CAAW,EAGxC,KAAK,aAAeC,CACvB,CACL,CACAj/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAGyhC,GAAU,UAAW,YAAa,MAAM,EAC3C9+B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,GAAM,QAAS,IAAK,CAClE,EAAGyhC,GAAU,UAAW,WAAY,MAAM,EAC1C9+B,EAAW,CACP7K,EAAM,CAAE,QAASmJ,GAAc,CACnC,EAAGwgC,GAAU,UAAW,QAAS,MAAM,EACvC9+B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAauiC,EAAW,CAAC,CAAE,CACpD,EAAGC,GAAU,UAAW,eAAgB,MAAM,EAC9C9+B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAIoJ,GAAclB,EAAeA,CAAa,EAAG,QAAS,IAAK,SAAU,EAAI,CAAE,CACpG,EAAGyhC,GAAU,UAAW,UAAW,MAAM,EACzC9+B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,GAAM,QAAS,GAAI,CACjE,EAAGyhC,GAAU,UAAW,SAAU,MAAM,EACxC9+B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,GAAM,QAAS,GAAI,CACjE,EAAGyhC,GAAU,UAAW,OAAQ,MAAM,EACtC9+B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,EAAG,SAAU,GAAM,CACtE,EAAGyhC,GAAU,UAAW,QAAS,MAAM,EAChC,MAAMI,WAAwBllC,EAAY,CAC7C,IAAI,OAAQ,CAER,OAAO,KAAK,KAAM,KAAK,QAAQ,OAAS,EAAK,CAAC,GAAK,KAAK,QAAQ,SAAS,IAAI,EAAI,EAAI,KAAK,QAAQ,SAAS,GAAG,EAAI,EAAI,EACzH,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAG8pC,GAAgB,UAAW,KAAM,MAAM,EAC1Cl/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG6hC,GAAgB,UAAW,WAAY,MAAM,EAChDl/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG6hC,GAAgB,UAAW,cAAe,MAAM,EACnDl/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG6hC,GAAgB,UAAW,UAAW,MAAM,EACxC,MAAMC,WAAqBnlC,EAAY,CAC1C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,KACZ,KAAK,KAAO,KACZ,KAAK,YAAc,GACnB,KAAK,oBAAsB,EAC9B,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG8hC,GAAa,UAAW,UAAW,MAAM,EAC5Cn/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG8hC,GAAa,UAAW,UAAW,MAAM,EAC5Cn/B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAawiC,EAAS,CAAC,CAAE,CAClD,EAAGK,GAAa,UAAW,aAAc,MAAM,EAC/Cn/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAG8hC,GAAa,UAAW,OAAQ,MAAM,EACzCn/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAG8hC,GAAa,UAAW,OAAQ,MAAM,EACzCn/B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa4iC,EAAe,EAAG,QAAS,GAAI,CACrE,EAAGC,GAAa,UAAW,cAAe,MAAM,EAChDn/B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAauiC,EAAW,EAAG,QAAS,IAAK,CAClE,EAAGM,GAAa,UAAW,sBAAuB,MAAM,ECvLjD,MAAMC,WAAkCplC,EAAY,CACvD,aAAc,CACV,MAAM,GAAG,SAAS,EAIlB,KAAK,UAAY,IAAI,KACrB,KAAK,QAAU,IAAI,KACnB,KAAK,SAAW,IAAI,KAKpB,KAAK,aAAe,KACpB,KAAK,cAAgB,KAIrB,KAAK,aAAe,IACvB,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,GAAM,aAAc,IAAMjI,GAAM,EAAI,CAClF,EAAGgqC,GAA0B,UAAW,KAAM,MAAM,EACpDp/B,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAGmgC,GAA0B,UAAW,YAAa,MAAM,EAC3Dp/B,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAGmgC,GAA0B,UAAW,UAAW,MAAM,EACzDp/B,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAGmgC,GAA0B,UAAW,WAAY,MAAM,EAC1Dp/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAG+hC,GAA0B,UAAW,eAAgB,MAAM,EAC9Dp/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,GAAM,QAAS,IAAK,CAClE,EAAG+hC,GAA0B,UAAW,gBAAiB,MAAM,EAC/Dp/B,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,EAAI,CAAE,CAClD,EAAGmgC,GAA0B,UAAW,eAAgB,MAAM,EACvD,MAAMC,WAA8BrlC,EAAY,CACnD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,aAAe,GAIpB,KAAK,MAAQ,GAIb,KAAK,YAAc,GAInB,KAAK,YAAc,GAInB,KAAK,kBAAoB,GAIzB,KAAK,UAAY,GAMjB,KAAK,iBAAmB,GAIxB,KAAK,yBAA2B,EACnC,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,GAAM,aAAc,IAAMjI,GAAM,EAAI,CAClF,EAAGiqC,GAAsB,UAAW,KAAM,MAAM,EAChDr/B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,CAAC,CAAE,CACtD,EAAGgiC,GAAsB,UAAW,eAAgB,MAAM,EAC1Dr/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGgiC,GAAsB,UAAW,QAAS,MAAM,EACnDr/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGgiC,GAAsB,UAAW,cAAe,MAAM,EACzDr/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGgiC,GAAsB,UAAW,cAAe,MAAM,EACzDr/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGgiC,GAAsB,UAAW,oBAAqB,MAAM,EAC/Dr/B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa8iC,EAAyB,CAAC,CAAE,CAClE,EAAGC,GAAsB,UAAW,YAAa,MAAM,EACvDr/B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa26B,EAAc,CAAC,CAAE,CACvD,EAAGoI,GAAsB,UAAW,mBAAoB,MAAM,EAC9Dr/B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,EAAG,QAAS,IAAK,CACpE,EAAGgiC,GAAsB,UAAW,2BAA4B,MAAM,ECzG5D,IAACC,IACV,SAAUA,EAAa,CACpBA,EAAY,SAAc,WAC1BA,EAAY,IAAS,MACrBA,EAAY,OAAY,QAC5B,GAAGA,KAAgBA,GAAc,CAAE,EAAC,EAI7B,MAAMC,WAA0BvlC,EAAY,CAC/C,aAAc,CACV,MAAM,GAAG,SAAS,EAIlB,KAAK,gBAAkB,KAIvB,KAAK,SAAW,KAIhB,KAAK,UAAY,KAKjB,KAAK,UAAY,GAIjB,KAAK,UAAY,EACpB,CACD,kBAAkBwlC,EAAO,CAErB,MAAMC,EAAcD,EAAM,MAAM,GAAG,EAAE,CAAC,EAAE,cACxC,GAAI,CAACC,EACD,MAAO,GAEX,UAAWC,KAAW,KAAK,UACvB,GAAID,IAAgBC,EAAQ,cACxB,MAAO,GAGf,GAAI,KAAK,UAAU,OAAS,EAAG,CAC3B,UAAWC,KAAW,KAAK,UACvB,GAAIF,IAAgBE,EAAQ,cACxB,MAAO,GAGf,MAAO,EACV,CACD,MAAO,EACV,CACL,CACA3/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAGkiC,GAAkB,UAAW,kBAAmB,MAAM,EACzDv/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAGkiC,GAAkB,UAAW,WAAY,MAAM,EAClDv/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAGkiC,GAAkB,UAAW,YAAa,MAAM,EACnDv/B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,CAAC,CAAE,CACtD,EAAGkiC,GAAkB,UAAW,YAAa,MAAM,EACnDv/B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,CAAC,CAAE,CACtD,EAAGkiC,GAAkB,UAAW,YAAa,MAAM,EClE5C,MAAMK,WAA6B5lC,EAAY,CAClD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GACZ,KAAK,YAAc,GACnB,KAAK,eAAiB,KACtB,KAAK,eAAiB,KAItB,KAAK,kBAAoB,GAIzB,KAAK,mBAAqB,KAI1B,KAAK,mBAAqB,KAI1B,KAAK,YAAc,KAInB,KAAK,qBAAuBqF,GAAgB,IAC/C,CACD,IAAI,cAAe,CACf,OAAO,KAAK,qBAAuB,IACtC,CACD,yBAAyBs9B,EAAO,CAC5B,IAAIhoC,EACJ,OAAO2mC,GAAgC,OAAO,CAC1C,KAAM,KAAK,MAAQqB,EAAQ,QAAQA,EAAM,SAAS,IAAI,GAAK,IAC3D,iBAAkB,KAAK,GACvB,uBAAwBhoC,EAAKgoC,GAAU,KAA2B,OAASA,EAAM,MAAQ,MAAQhoC,IAAO,OAASA,EAAK,IAClI,CAAS,CACJ,CACD,eAAekrC,EAAS,CACpB,IAAIlrC,EAAIG,EACR,MAAM,GAAKA,GAAMH,EAAK,KAAK,eAAiB,MAAQA,IAAO,OAAS,OAASA,EAAG,MAAO,KAAM,MAAQG,IAAO,OAASA,EAAKwmC,GAAgC,OAAO,CAC7J,GAAI,KAAK,GACT,KAAM,KAAK,KACX,MAAOj8B,GAAgB,KACvB,iBAAkB,KAAK,GACvB,sBAAuBwgC,EACvB,UAAW,IAAI,GAC3B,CAAS,EAKD,GAJA,EAAE,KAAO,KAAK,KACd,EAAE,GAAK,KAAK,IAAMA,EAAU,IAAMA,EAAU,IAC5C,EAAE,iBAAmB,KAAK,GAC1B,EAAE,sBAAwBA,EACtBA,GAAW,KAAK,uBAAyBxgC,GAAgB,KAAM,CAC/D,MAAMpB,EAAM,IAAI,IAChBA,EAAI,IAAI4hC,EAAS5F,GAAoB,OAAO,CAAE,MAAO,KAAK,oBAAsB,EAAC,EACjF,EAAE,UAAU,IAAIF,GAAwB,OAAQ97B,CAAG,CACtD,CACD,OAAO,CACV,CACL,CACA+B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAGwqC,GAAqB,UAAW,KAAM,MAAM,EAC/C5/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGuiC,GAAqB,UAAW,OAAQ,MAAM,EACjD5/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGuiC,GAAqB,UAAW,cAAe,MAAM,EACxD5/B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,EAAI,CAAE,CACrD,EAAG6iC,GAAqB,UAAW,iBAAkB,MAAM,EAC3D5/B,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,EAAI,CAAE,CACrD,EAAG6iC,GAAqB,UAAW,iBAAkB,MAAM,EAC3D5/B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,SAAU,EAAI,CAAE,CACrD,EAAGijC,GAAqB,UAAW,oBAAqB,MAAM,EAC9D5/B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,EAAG,SAAU,GAAM,QAAS,IAAK,CACpF,EAAGuiC,GAAqB,UAAW,qBAAsB,MAAM,EAC/D5/B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,EAAG,SAAU,GAAM,QAAS,IAAK,CACpF,EAAGuiC,GAAqB,UAAW,qBAAsB,MAAM,EAC/D5/B,EAAW,CACP7K,EAAM,CAAE,QAASmmC,GAAiC,SAAU,GAAM,QAAS,IAAK,CACpF,EAAGsE,GAAqB,UAAW,cAAe,MAAM,EACxD5/B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0H,GAAYwC,EAAe,EAAG,QAAS,IAAK,CACrE,EAAGugC,GAAqB,UAAW,uBAAwB,MAAM,EC9F1D,MAAME,WAA0B9lC,EAAY,CAC/C,aAAc,CACV,MAAM,GAAG,SAAS,EAIlB,KAAK,KAAO,KAIZ,KAAK,QAAU,GAIf,KAAK,WAAa,EACrB,CACD,aAAc,CACV,OAAI,KAAK,KACE,KAAK,KAAO,KAAO,KAAK,MAAQ,IAEpC,KAAK,KACf,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAG0qC,GAAkB,UAAW,KAAM,MAAM,EAC5C9/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAGyiC,GAAkB,UAAW,OAAQ,MAAM,EAC9C9/B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGyiC,GAAkB,UAAW,QAAS,MAAM,EAC/C9/B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,CACrC,EAAGmjC,GAAkB,UAAW,UAAW,MAAM,EACjD9/B,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,CACrC,EAAGmjC,GAAkB,UAAW,aAAc,MAAM,ECrC7C,MAAMC,WAA8C/lC,EAAY,CACnE,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,iBAAmB,EAC3B,CACD,qBAAqBgmC,EAAc,CAC/B,OAAO,KAAK,iBAAiB,OAAOvI,GAAYA,EAAS,UAAUuI,CAAY,CAAC,CACnF,CACL,CACAhgC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa26B,EAAc,CAAC,CAAE,CACvD,EAAG8I,GAAsC,UAAW,mBAAoB,MAAM,ECHvE,MAAME,WAAiCjmC,EAAY,CACtD,aAAc,CACV,MAAM,GAAG,SAAS,EAKlB,KAAK,OAAS,GAKd,KAAK,iBAAmBuhC,GAAkB,OAAO,CAAE,EACtD,CACL,CACAv7B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa0+B,EAAc,CAAC,CAAE,CACvD,EAAGiF,GAAyB,UAAW,SAAU,MAAM,EACvDjgC,EAAW,CACP7K,EAAM,CAAE,QAASomC,GAAmB,QAAS,IAAK,SAAU,GAAM,CACtE,EAAG0E,GAAyB,UAAW,mBAAoB,MAAM,EAC1D,MAAMC,WAA8BlmC,EAAY,CACnD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GAIZ,KAAK,YAAc,GACnB,KAAK,OAAS,GACd,KAAK,qBAAuB,KAI5B,KAAK,YAAcimC,GAAyB,OAAO,CAAE,GAIrD,KAAK,OAAS,EACjB,CACL,CACAjgC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG6iC,GAAsB,UAAW,OAAQ,MAAM,EAClDlgC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG6iC,GAAsB,UAAW,cAAe,MAAM,EACzDlgC,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,CACrC,EAAGujC,GAAsB,UAAW,SAAU,MAAM,EACpDlgC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,GAAM,QAAS,GAAI,CAClE,EAAGmjC,GAAsB,UAAW,uBAAwB,MAAM,EAClElgC,EAAW,CACP7K,EAAM,CAAE,QAAS8qC,GAA0B,QAAS,EAAE,CAAE,CAC5D,EAAGC,GAAsB,UAAW,cAAe,MAAM,EACzDlgC,EAAW,CACP7K,EAAM,CACF,QAASwH,GAAgB,QAAS,GAC1C,CAAK,CACL,EAAGujC,GAAsB,UAAW,SAAU,MAAM,EAC7C,MAAMC,WAAsBnmC,EAAY,CAC3C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,SAAWkmC,GAAsB,OAAO,CAAE,GAI/C,KAAK,SAAW,GAKhB,KAAK,YAAc,EACtB,CAID,oBAAoBja,EAAK,CACrB,MAAMhoB,EAAM,IAAI,IAEVmiC,EAAcna,EAAI,OAAOxlB,GAAKA,EAAE,KAAO,KAAK,EAAE,EAC9C09B,EAAUiC,EAAY,OAAO3/B,GAAKA,EAAE,YAAY,SAAS,KAAK,EAAE,CAAC,EACvE,UAAWk4B,KAAUwF,EAAS,CAC1BlgC,EAAI,IAAI06B,EAAO,GAAIA,CAAM,EACzB,MAAMyF,EAAazF,EAAO,oBAAoByH,CAAW,EACzD,UAAW/B,KAAMD,EACbngC,EAAI,IAAIogC,EAAG,GAAIA,CAAE,CAExB,CACD,MAAO,CAAC,GAAGpgC,EAAI,OAAM,CAAE,CAC1B,CACD,SAASsgC,EAAe,CACpB,GAAI,CAAC,KAAK,SAAS,OACf,MAAO,GAEX,UAAW5F,KAAU,KAAK,oBAAoB4F,CAAa,EACvD,GAAI,CAAC5F,EAAO,SAAS,OACjB,MAAO,GAGf,MAAO,EACV,CACD,QAAQ2F,EAAa,CACjB,MAAI,GAAAA,GAAgB,MAA0CA,EAAY,gBAI7E,CACD,UAAUA,EAAa9G,EAAa,GAAI,CACpC,GAAI,CAAC8G,EACD,MAAO,GAEX,GAAIA,EAAY,uBAAuBvE,GAAwB,gBAAiB,KAAK,GAAIl6B,GAAY,wBAAwB,EACzH,MAAO,GAEX,MAAMs+B,EAAU,KAAK,oBAAoB3G,CAAU,EACnD,UAAWmB,KAAUwF,EACjB,GAAIG,EAAY,uBAAuBvE,GAAwB,gBAAiBpB,EAAO,GAAI94B,GAAY,wBAAwB,EAC3H,MAAO,GAGf,MAAO,EACV,CACD,aAAc,CACV,OAAO,KAAK,SAAS,IACxB,CACL,CACAG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAG+qC,GAAc,UAAW,KAAM,MAAM,EACxCngC,EAAW,CACP7K,EAAM,CAAE,QAAS+qC,GAAuB,CAC5C,EAAGC,GAAc,UAAW,WAAY,MAAM,EAC9CngC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,CAAC,CAAE,CACtD,EAAG8iC,GAAc,UAAW,WAAY,MAAM,EAC9CngC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,CAAC,CAAE,CACtD,EAAG8iC,GAAc,UAAW,cAAe,MAAM,EAC1C,MAAME,WAA0BF,EAAc,CACjD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,OAAS,GACd,KAAK,WAAa,EACrB,CACD,IAAI,OAAQ,CAIR,OAHI,KAAK,OAAO,OAAS,GAGrB,KAAK,WAAW,QAAU,EACnB,EAEJ,KAAK,IAAI,GAAG,KAAK,WAAW,IAAIhgC,GAAKA,EAAE,KAAK,CAAC,EAAI,CAC3D,CACD,cAAe,CACX,MAAO,CAAC,GAAG,KAAK,OAAQ,GAAG,KAAK,WAAW,QAAQA,GAAKA,EAAE,aAAY,CAAE,CAAC,CAC5E,CACD,kBAAmB,CACf,MAAO,CAAC,GAAG,KAAK,WAAY,GAAG,KAAK,WAAW,QAAQA,GAAKA,EAAE,iBAAgB,CAAE,CAAC,CACpF,CACD,eAAe,CAAE,YAAAs9B,CAAa,EAAG,GAAI,CACjC,GAAI,KAAK,eAAe,QAAU,EAC9B,OAAO,KAEX,IAAIhzB,EAAQ,EACZ,UAAWkyB,KAAS,KAAK,eAAgB,CACrC,MAAMx8B,EAAIw8B,EAAM,eAAe,CAAE,YAAAc,CAAa,GAC9C,GAAIt9B,IAAM,KACN,OAAO,KAEXsK,GAAStK,CACZ,CACD,OAAOsK,CACV,CACD,OAAO,MAAM61B,EAAMC,EAAoBjsC,EAAU,GAAI,CACjD,IAAIK,EAAIG,EAAIC,EAAIgG,EAChB,MAAMy8B,EAAa+I,EAAmB,SAAS,WACzC9b,GAAU9vB,EAAKL,GAAY,KAA6B,OAASA,EAAQ,UAAY,MAAQK,IAAO,OAASA,EAAK4rC,EAAmB,OACrIjC,GAAexpC,EAAKR,EAAQ,eAAiB,MAAQQ,IAAO,OAASA,EAAK,KAC1E0rC,GAAYzrC,EAAKT,EAAQ,YAAc,MAAQS,IAAO,OAASA,EAAK,KACpE0rC,GAAgB1lC,EAAKzG,EAAQ,gBAAkB,MAAQyG,IAAO,OAASA,EAAK,GAClF,OAAOslC,GAAkB,OAAO,CAC5B,GAAGC,EACH,WAAYA,EAAK,YAAY,QAAStoC,GAAO,CACzC,MAAMkD,EAAIs8B,EAAW,KAAKr3B,GAAKA,EAAE,KAAOnI,CAAE,EAC1C,GAAIkD,EAAG,CACH,MAAMsS,EAAI6yB,GAAkB,MAAMnlC,EAAGqlC,EAAoB,CACrD,GAAGjsC,EACH,SAAUksC,IAAa,KAAOA,EAAW,EAAI,IACrE,CAAqB,EACD,GAAIhzB,EAAE,WAAW,QAAU,GAAKA,EAAE,OAAO,QAAU,IAAMizB,GAAiBnC,IAAgB,MAAQ,CAACA,EAAY,uBAAuBvE,GAAwB,gBAAiBvsB,EAAE,GAAI3N,GAAY,wBAAwB,GAErN,MAAO,GAOX,GAAI2gC,IAAa,MAAQhzB,EAAE,OAASgzB,GAAYhzB,EAAE,WAAW,OAAS,EAAG,CACrE,MAAMgqB,EAAa,GACnB,UAAWE,KAAOlqB,EAAE,WACZizB,GAAgB/I,EAAI,OAAO,SAAW,GAAKA,EAAI,WAAW,SAAW,IAIzEA,EAAI,SAAWwI,GAAsB,OAAOxI,EAAI,QAAQ,EACxDA,EAAI,SAAS,KAAOlqB,EAAE,SAAS,KAAO,MAAQkqB,EAAI,SAAS,KAC3DA,EAAI,SAAS,OAASlqB,EAAE,SAAS,QAAUkqB,EAAI,SAAS,OACxDF,EAAW,KAAKE,CAAG,GAGvB,OAAOF,CACV,CACD,MAAO,CAAChqB,CAAC,CACZ,CACD,MAAO,EACvB,CAAa,EACD,OAAQ8yB,EAAK,SAAS,QAAStoC,GAAO,CAClC,MAAM,EAAIysB,EAAO,KAAKtkB,GAAKA,EAAE,KAAOnI,CAAE,EACtC,OAAI,EAEIsmC,GAAgB,CAAC,EAAE,cAAcA,EAAa9G,CAAU,EACjD,GAEJ,CAAC,CAAC,EAEN,EACvB,CAAa,CACb,CAAS,CACJ,CAID,OAAOkJ,EAAM,CACT,MAAMlJ,EAAa,KAAK,WAAW,QAASC,GAAa,CACrD,MAAMkJ,EAAWlJ,EAAS,OAAOiJ,CAAI,EACrC,OAAIC,EAAS,OAAO,QAAU,GAAKA,EAAS,WAAW,QAAU,EACtD,GAEJ,CAACA,CAAQ,CAC5B,CAAS,EACKlc,EAAS,KAAK,OAAO,OAAOic,CAAI,EACtC,OAAOL,GAAkB,OAAO,OAAO,OAAO,GAAI,KAAM,CACpD,WAAA7I,EACA,OAAA/S,CACH,EAAC,CACL,CAKD,iBAAiBmc,EAAQ,GAAOC,EAAgB,GAAMJ,EAAe,GAAO,CACxE,MAAMjJ,EAAa,KAAK,WAAW,QAASC,GAAa,CACrD,GAAI,CAACmJ,GAAS,CAACnJ,EAAS,SAAS,OAC7B,MAAO,GAEX,MAAMkJ,EAAWlJ,EAAS,iBAAiBmJ,EAAOC,CAAa,EAC/D,OAAIJ,GAAgBE,EAAS,OAAO,QAAU,GAAKA,EAAS,WAAW,QAAU,EACtE,GAEJ,CAACA,CAAQ,CAC5B,CAAS,EACD,OAAON,GAAkB,OAAO,OAAO,OAAO,GAAI,KAAM,CACpD,WAAaQ,GAAiBrJ,EAAW,QAAU,EAAKA,EAAa,CAACA,EAAW,CAAC,CAAC,CACtF,EAAC,CACL,CACL,CACAx3B,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAawgC,EAAK,CAAC,CAAE,CAC9C,EAAGuD,GAAkB,UAAW,SAAU,MAAM,EAChDrgC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa+jC,EAAiB,CAAC,CAAE,CAC1D,EAAGA,GAAkB,UAAW,aAAc,MAAM,EC3R7C,MAAMS,WAAwB9mC,EAAY,CAC7C,cAAe,CACX,OAAO,KAAK,QACf,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAG6hC,GAAgB,UAAW,OAAQ,MAAM,EAC5C9gC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGyjC,GAAgB,UAAW,WAAY,MAAM,EAChD9gC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGyjC,GAAgB,UAAW,SAAU,MAAM,ECfpC,IAACC,IACV,SAAUA,EAAe,CACtBA,EAAc,iBAAsB,YACpCA,EAAc,UAAe,YAC7BA,EAAc,OAAY,SAC1BA,EAAc,SAAc,WAC5BA,EAAc,OAAY,SAC1BA,EAAc,QAAa,UAC3BA,EAAc,cAAmB,eACrC,GAAGA,KAAkBA,GAAgB,CAAE,EAAC,EACjC,SAASC,GAAiBC,EAAM,CACnC,OAAQA,EAAI,CACR,KAAKF,GAAc,iBACf,MAAO,WACX,KAAKA,GAAc,UACf,MAAO,qBACX,KAAKA,GAAc,OACf,MAAO,mBACX,KAAKA,GAAc,SACf,MAAO,UACX,KAAKA,GAAc,OACf,MAAO,iBACX,KAAKA,GAAc,QACf,MAAO,qBACX,KAAKA,GAAc,cACf,MAAO,gBACd,CACL,CCrBO,MAAMG,WAAkBlnC,EAAY,CACvC,aAAc,CACV,MAAM,GAAG,SAAS,EAKlB,KAAK,aAAe,KAIpB,KAAK,OAAS,KAId,KAAK,UAAY,IAAI,KACrB,KAAK,cAAgB,EACrB,KAAK,WAAa,CACrB,CACD,kBAAmB,CACf,OAAI,KAAK,OACD,KAAK,OACE,4BAA8Bkd,EAAU,WAAW,KAAK,OAAO,IAAI,EAEvE,WAEJ,KAAK,cAAgB,IAAM,KAAK,UAC1C,CACD,IAAI,QAAS,CACT,OAAO,KAAK,eAAiB,KAAK,UACrC,CACD,IAAI,YAAa,CACb,OAAO,KAAK,SAAW,IAC1B,CACD,IAAI,YAAa,CACb,OAAO,KAAK,QAAU,KAAK,UAC9B,CACD,IAAI,UAAW,CACX,OAAK,KAAK,WAEH,KAAK,cAAgB,KAAK,WADtB,CAEd,CACD,IAAI,UAAW,CACX,MAAMiqB,EAAS,KAAK,OACdC,EAAa,KAAK,WACxB,OAAID,GAAUC,EACH,EAEPD,GAAU,CAACC,EACJ,EAEP,CAACD,GAAUC,EACJ,EAEJ,CACV,CACD,aAAa,CAAE,OAAAC,EAAQ,SAAAC,GAAY,CAC/B,MAAMt0B,EAAM,IAAI,KACZ,KAAK,SAAW,OAChB,KAAK,OAAS8zB,GAAgB,OAAO,CACjC,KAAM9zB,EACN,SAAAs0B,EACA,OAAAD,CAChB,CAAa,EAER,CACD,eAAgB,CACZ,KAAK,OAAS,IACjB,CACD,OAAOE,EAAeC,EAAY,CAC9B,GAAID,IAAkB,KAAK,eAAiBC,IAAe,KAAK,WAC5D,OAEJ,MAAMx0B,EAAM,IAAI,KACZw0B,IAAe,IACfD,EAAgB,EAChBC,EAAa,GAEjB,KAAK,cAAgBD,EACrB,KAAK,WAAaC,EAClB,KAAK,UAAYx0B,EACb,KAAK,cAAgB,KAAK,YAAc,KAAK,QAC7C,KAAK,cAAa,CAEzB,CACL,CACAhN,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,GAAM,MAAO,aAAc,SAAU,GAAM,CACvF,EAAGiiC,GAAU,UAAW,eAAgB,MAAM,EAC9ClhC,EAAW,CACP7K,EAAM,CAAE,QAAS2rC,GAAiB,SAAU,GAAM,QAAS,IAAK,CACpE,EAAGI,GAAU,UAAW,SAAU,MAAM,EACxClhC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAGiiC,GAAU,UAAW,YAAa,MAAM,EAC3ClhC,EAAW,CACP7K,EAAM,CAAE,QAASgI,GAAe,CACpC,EAAG+jC,GAAU,UAAW,gBAAiB,MAAM,EAC/ClhC,EAAW,CACP7K,EAAM,CAAE,QAASgI,GAAe,CACpC,EAAG+jC,GAAU,UAAW,aAAc,MAAM,EACrC,MAAMO,WAAmBznC,EAAY,CACxC,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,MAAQ,IAAI,GACpB,CACD,IAAI8L,EAAM,CACN,OAAO,KAAK,MAAM,IAAIA,CAAI,CAC7B,CACD,QAAS,CACL,MAAMvF,EAAS,GACf,UAAW3J,KAAS,OAAO,OAAOmqC,EAAa,EAAG,CAC9C,MAAME,EAAO,KAAK,MAAM,IAAIrqC,CAAK,EAC7BqqC,GACA1gC,EAAO,KAAK,CAAE,KAAM3J,EAAO,KAAAqqC,CAAM,EAExC,CACD,OAAO1gC,CACV,CACD,SAAU,CACN,OAAO,KAAK,MAAM,OAAS,CAC9B,CACD,gBAAiB,CACb,OAAO,MAAM,KAAK,KAAK,MAAM,QAAQ,EAAE,MAAM9B,GAAKA,EAAE,UAAU,CACjE,CACD,sBAAuB,CACnB,MAAM8B,EAAS,GACf,UAAW3J,KAAS,OAAO,OAAOmqC,EAAa,EAAG,CAC9C,MAAME,EAAO,KAAK,MAAM,IAAIrqC,CAAK,EACjC,GAAIqqC,EAAM,CAEN,GAAIA,EAAK,QAAUA,EAAK,WACpB,SAEJ1gC,EAAO,KAAK,CAAE,KAAM3J,EAAO,KAAAqqC,CAAM,EACpC,CACJ,CACD,OAAO1gC,CACV,CACD,aAAc,CACV,MAAMmhC,EAAQ,KAAK,MAAM,KAEzB,MAAO,CAAE,UADS,MAAM,KAAK,KAAK,MAAM,QAAQ,EAAE,OAAOjjC,GAAKA,EAAE,UAAU,EAAE,OACxD,MAAAijC,EACvB,CACD,aAAaC,EAAUzwB,EAAI,CACvB,MAAM+vB,EAAO,KAAK,MAAM,IAAIU,CAAQ,EAChCV,GACAA,EAAK,aAAa/vB,CAAE,CAE3B,CACD,cAAcywB,EAAU,CACpB,MAAMV,EAAO,KAAK,MAAM,IAAIU,CAAQ,EAChCV,GACAA,EAAK,cAAa,CAEzB,CACD,OAAOU,EAAU,CAAE,cAAAJ,EAAe,WAAAC,CAAU,EAAI,CAC5C,MAAMP,EAAO,KAAK,MAAM,IAAIU,CAAQ,EAChCV,EACAA,EAAK,OAAOM,EAAeC,CAAU,EAGjCA,IAAe,EACf,KAAK,MAAM,IAAIG,EAAUT,GAAU,OAAO,CAAE,cAAe,EAAG,WAAY,CAAC,CAAE,CAAC,EAG9E,KAAK,MAAM,IAAIS,EAAUT,GAAU,OAAO,CAAE,cAAAK,EAAe,WAAAC,CAAY,EAAC,CAGnF,CACD,OAAOG,EAAU,CACb,OAAO,KAAK,MAAM,OAAOA,CAAQ,CACpC,CACL,CACA3hC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0I,GAAW,IAAIhB,GAAYkkC,EAAa,EAAGG,EAAS,EAAG,QAAS,GAAG,CAAE,CAC9F,EAAGO,GAAW,UAAW,QAAS,MAAM,EC9KjC,MAAMG,WAAmC5nC,EAAY,CAC5D,CACO,MAAM6nC,WAA2B9F,EAAuB,CAC3D,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,SAAW6F,GAA2B,OAAO,CAAE,EACvD,CACL,CACA5hC,EAAW,CACP7K,EAAM,CAAE,QAASysC,GAA4B,CACjD,EAAGC,GAAmB,UAAW,WAAY,MAAM,EAC5C,MAAMC,WAA+C9nC,EAAY,CACpE,aAAc,CACV,IAAIrF,EAAIG,EACR,MAAM,GAAG,SAAS,EAIlB,KAAK,WAAa,CAACqrC,GAAc,OAAO,CAAE,GAAI,MAAQ,EAAC,EAIvD,KAAK,gBAAkBrrC,GAAMH,EAAK,KAAK,WAAW,CAAC,KAAO,MAAQA,IAAO,OAAS,OAASA,EAAG,MAAQ,MAAQG,IAAO,OAASA,EAAK,EACtI,CACD,IAAI,cAAe,CACf,OAAO,KAAK,WAAW,KAAKqL,GAAKA,EAAE,KAAO,KAAK,cAAc,CAChE,CACL,CACAH,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa6jC,EAAa,CAAC,CAAE,CACtD,EAAG2B,GAAuC,UAAW,aAAc,MAAM,EACzE9hC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGykC,GAAuC,UAAW,iBAAkB,MAAM,EACtE,MAAMC,WAAuC/nC,EAAY,CAC5D,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,SAAW8nC,GAAuC,OAAO,CAAE,GAChE,KAAK,OAAS,GACd,KAAK,WAAaL,GAAW,OAAO,CAAE,EACzC,CACD,aAAc,CACV,OAAO,KAAK,OAAO,IACtB,CACD,cAAe,CACX,OAAO,KAAK,OAAO,IACtB,CAID,IAAI,qBAAsB,CACtB,OAAO,KAAK,kBAAkB,kBACjC,CAID,IAAI,cAAe,CACf,OAAO,KAAK,iBACf,CACD,IAAI,oBAAqB,CACrB,OAAO,KAAK,gBAAgB,CAAE,aAAc,EAAM,EACrD,CACD,IAAI,mBAAoB,CACpB,OAAO,KAAK,gBAAgB,CAAE,MAAO,EAAM,EAC9C,CACD,IAAI,cAAe,CACf,OAAO,KAAK,OAAO,OAAOhhC,GAAKA,EAAE,OAASs1B,GAAU,WAAW,CAClE,CACD,IAAI,cAAe,CACf,OAAO,KAAK,SAAS,WAAW,KAAK51B,GAAKA,EAAE,KAAO,KAAK,SAAS,cAAc,CAClF,CAOD,gBAAgB7L,EAAS,CACrB,IAAIK,EAAIG,EAAIC,EACZ,MAAMurC,EAAO,KAAK,aAClB,GAAIA,EAAM,CACN,IAAI0B,EAAO3B,GAAkB,MAAMC,EAAM,KAAM,CAC3C,OAAShsC,GAAY,MAAsCA,EAAQ,aAAgB,KAAK,OAAO,OAAOA,EAAQ,YAAY,EAAI,OAC9H,YAAaA,GAAY,KAA6B,OAASA,EAAQ,YACvE,SAAUA,GAAY,KAA6B,OAASA,EAAQ,SACpE,aAAcA,GAAY,KAA6B,OAASA,EAAQ,YACxF,CAAa,EAKD,GAJMA,GAAY,MAAsCA,EAAQ,cAE5D0tC,EAAOA,EAAK,kBAAkBrtC,EAAKL,GAAY,KAA6B,OAASA,EAAQ,SAAW,MAAQK,IAAO,OAASA,EAAK,KAASI,GAAMD,EAAKR,GAAY,KAA6B,OAASA,EAAQ,gBAAkB,MAAQQ,IAAO,OAAS,OAASA,EAAG,KAAK,SAAS,iBAAmB,MAAQC,IAAO,OAASA,EAAK,MAAUT,GAAY,KAA6B,OAASA,EAAQ,OAAQA,GAAY,KAA6B,OAASA,EAAQ,YAAY,GAEzd0tC,EAAK,WAAW,QAAU,GAAKA,EAAK,OAAO,OAAS,EACpD,OAAAA,EAAK,SAAS,KAAO,uBACd3B,GAAkB,OAAO,CAC5B,SAAUH,GAAsB,OAAO,CACnC,KAAM,EAC9B,CAAqB,EACD,WAAY,CAAC8B,CAAI,CACrC,CAAiB,EAEL,MAAMC,EAAaD,EAAK,eAExB,OADqB,KAAK,OAAO,OAAOvhC,GAAK,CAACwhC,EAAW,SAASxhC,CAAC,CAAC,EACnD,OAAS,GACtB,QAAQ,KAAK,sCAAsC,EAEhDuhC,CACV,CAED,eAAQ,KAAK,sEAAsE,EAC5E3B,GAAkB,OAAO,EAAE,CACrC,CACD,sBAAsBL,EAAcvI,EAAU,CAK1C,MAJI,EAAAuI,EAAa,KAAK,SAAS,eAGX,KAAK,gBAAgB,CAAE,SAAU,CAAC,CAAE,EACxC,WAAW,KAAK7/B,GAAKA,EAAE,KAAOs3B,EAAS,EAAE,EAI5D,CACD,UAAUyK,EAAW,CAEjB,MAAMC,EAAW,IAAI,IACfC,EAAc,IAAI,IAClBC,EAAwBN,GAA+B,OAAO,CAChE,OAAQG,CACpB,CAAS,EACKI,EAAiBJ,EAAU,UAAU,YAAW,EAAK,KAAK,OAAO,UAAU,cACjF,UAAWvF,KAAS,KAAK,OAAQ,CAC7B,MAAM4F,EAAWzF,GAAM,OAAO,CAC1B,GAAGH,EACH,GAAI,OACJ,SAAUuF,EAAU,GACpB,SAAUvF,EAAM,SAAS,MAAO,CAChD,CAAa,EAEG4F,EAAS,SAAS,uBAClBA,EAAS,SAAS,sBAAsB,YAAYA,EAAS,SAAS,sBAAsB,cAAgBD,CAAc,EAE1HC,EAAS,SAAS,qBAClBA,EAAS,SAAS,oBAAoB,YAAYA,EAAS,SAAS,oBAAoB,cAAgBD,CAAc,EAG1HC,EAAS,OAASzE,GAAY,OAC9BqE,EAAS,IAAIxF,EAAM,GAAI4F,EAAS,EAAE,EAClCF,EAAsB,OAAO,KAAKE,CAAQ,CAC7C,CACD,UAAW9K,KAAY,KAAK,SAAS,WAAY,CAC7C,MAAM+K,EAAc/K,EAAS,QAC7B+K,EAAY,GAAKptC,KACjBotC,EAAY,SAAW/K,EAAS,SAAS,IAAIoI,GAAWsC,EAAS,IAAItC,CAAO,CAAC,EAAE,OAAO7nC,GAAMA,CAAE,EAC9FoqC,EAAY,IAAI3K,EAAS,GAAI+K,EAAY,EAAE,EAC3CH,EAAsB,SAAS,WAAW,KAAKG,CAAW,CAC7D,CAED,UAAW/K,KAAY4K,EAAsB,SAAS,WAClD5K,EAAS,YAAcA,EAAS,YAAY,IAAIgL,GAAcL,EAAY,IAAIK,CAAU,CAAC,EAAE,OAAOzqC,GAAMA,CAAE,EAG9G,OAAAqqC,EAAsB,SAAS,eAAiBD,EAAY,IAAI,KAAK,SAAS,cAAc,EACrFC,CACV,CACL,CACAriC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAG2sC,GAA+B,UAAW,KAAM,MAAM,EACzD/hC,EAAW,CACP7K,EAAM,CAAE,QAAS0sC,GAAoB,CACzC,EAAGE,GAA+B,UAAW,SAAU,MAAM,EAC7D/hC,EAAW,CACP7K,EAAM,CAAE,QAAS2sC,GAAwC,CAC7D,EAAGC,GAA+B,UAAW,WAAY,MAAM,EAC/D/hC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAawgC,EAAK,CAAC,CAAE,CAC9C,EAAGiF,GAA+B,UAAW,SAAU,MAAM,EAC7D/hC,EAAW,CACP7K,EAAM,CAAE,QAASssC,GAAY,QAAS,GAAG,CAAE,CAC/C,EAAGM,GAA+B,UAAW,aAAc,MAAM,EAC1D,MAAMW,WAA+B1oC,EAAY,CACpD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,oBAAsB,GAC3B,KAAK,QAAU,EAClB,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAaylC,EAA8B,CAAC,CAAE,CACvE,EAAGW,GAAuB,UAAW,sBAAuB,MAAM,EAClE1iC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAaulC,EAAkB,CAAC,CAAE,CAC3D,EAAGa,GAAuB,UAAW,UAAW,MAAM,ECrM/C,MAAMC,WAAiB3oC,EAAY,CACtC,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GACZ,KAAK,KAAO,EACf,CACD,UAAW,CACP,OAAO,KAAK,IACf,CACD,cAAe,CACX,OAAO,KAAK,IACf,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGslC,GAAS,UAAW,OAAQ,MAAM,EACrC3iC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGslC,GAAS,UAAW,OAAQ,MAAM,ECH9B,MAAMC,WAA8B5oC,EAAY,CACnD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,MAAQ,GACb,KAAK,OAAS,EACjB,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa2+B,EAAsB,CAAC,CAAE,CAC/D,EAAG2H,GAAsB,UAAW,QAAS,MAAM,EACnD5iC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAawjC,EAAiB,EAAG,QAAS,IAAK,CACxE,EAAG8C,GAAsB,UAAW,SAAU,MAAM,EAC7C,IAAIC,IACV,SAAUA,EAAqB,CAC5BA,EAAoB,IAAS,MAC7BA,EAAoB,QAAa,UACjCA,EAAoB,OAAY,SAChCA,EAAoB,KAAU,MAClC,GAAGA,KAAwBA,GAAsB,CAAE,EAAC,EAC7C,SAASC,GAA2Bh9B,EAAM,CAC7C,OAAQA,EAAI,CACR,KAAK+8B,GAAoB,IACrB,MAAO,MACX,KAAKA,GAAoB,QACrB,MAAO,UACX,KAAKA,GAAoB,OACrB,MAAO,SACX,KAAKA,GAAoB,KACrB,MAAO,MACd,CACL,CACO,SAASE,GAAiCj9B,EAAM,CACnD,OAAQA,EAAI,CACR,KAAK+8B,GAAoB,IACrB,MAAO,OACX,KAAKA,GAAoB,QACrB,MAAO,YACX,KAAKA,GAAoB,OACrB,MAAO,WACX,KAAKA,GAAoB,KACrB,MAAO,QACd,CACL,CACO,MAAMG,WAAwBhpC,EAAY,CAC7C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GACZ,KAAK,YAAc,GACnB,KAAK,kBAAoB,EACzB,KAAK,UAAY,EACpB,CACD,IAAI,MAAO,CACP,OAAI,KAAK,KAAK,WAAW,UAAU,EACxB6oC,GAAoB,QAE3B,KAAK,KAAK,WAAW,SAAS,EACvBA,GAAoB,OAExBA,GAAoB,GAC9B,CACD,aAAaI,EAAS,CAClB,GAAI,KAAK,UAAU,SAAW,EAC1B,OAAOJ,GAAoB,IAE/B,MAAMK,EAAWD,EAAQ,KAAKz1B,GAAKA,EAAE,KAAO,KAAK,UAAU,CAAC,CAAC,EAC7D,OAAK01B,EAGEA,EAAS,KAFLL,GAAoB,GAGlC,CACL,CACA7iC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAG4tC,GAAgB,UAAW,KAAM,MAAM,EAC1ChjC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG2lC,GAAgB,UAAW,OAAQ,MAAM,EAC5ChjC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,QAAS,GAAG,CAAE,CAClD,EAAG2lC,GAAgB,UAAW,cAAe,MAAM,EACnDhjC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,QAAS,GAAG,CAAE,CACnD,EAAGimC,GAAgB,UAAW,oBAAqB,MAAM,EACzDhjC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,EAAG,QAAS,IAAK,CACpE,EAAG2lC,GAAgB,UAAW,YAAa,MAAM,EAC1C,MAAMG,WAA4BnpC,EAAY,CACjD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GACZ,KAAK,YAAc,GAInB,KAAK,IAAM,KAIX,KAAK,IAAM,IACd,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAG+tC,GAAoB,UAAW,KAAM,MAAM,EAC9CnjC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG8lC,GAAoB,UAAW,OAAQ,MAAM,EAChDnjC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,QAAS,GAAG,CAAE,CAClD,EAAG8lC,GAAoB,UAAW,cAAe,MAAM,EACvDnjC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,GAAM,QAAS,IAAK,CACnE,EAAGomC,GAAoB,UAAW,MAAO,MAAM,EAC/CnjC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,GAAM,QAAS,IAAK,CACnE,EAAGomC,GAAoB,UAAW,MAAO,MAAM,EACxC,MAAMC,WAA0CppC,EAAY,CAC/D,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,UAAY,KAIjB,KAAK,OAAS,EAEd,KAAK,OAAS,IAAI,IAAI,CAAC,CAAC,GAAIuiC,GAAgB,OAAO,CAAE,MAAO,EAAG,CAAC,CAAC,CAAC,EAIlE,KAAK,YAAc,CACtB,CACD,aAAa8G,EAAQC,EAAyB,CAC1C,IAAI/iC,EAAS,KACb,UAAW24B,KAASmK,EAAO,OAAO,CAAC,EAAE,CAAC,EAAG,CACrC,MAAMvH,EAAQ,KAAK,OAAO,IAAI5C,CAAK,EACnC,GAAI,CAAC4C,EACD,SACJ,MAAMyH,EAAiBzH,EAAM,SAASwH,CAAuB,GACzD/iC,IAAW,MAAQgjC,EAAiBhjC,KACpCA,EAASgjC,EAEhB,CACD,OAAOhjC,GAAgD,CAC1D,CACD,eAAe8iC,EAAQC,EAAyBrgB,EAAM,CAClD,MAAMugB,EAAY,KAAK,aAAaH,EAAQC,CAAuB,EACnE,OAAO,KAAK,YAAcrgB,EAAOugB,CACpC,CACD,IAAI,MAAO,CACP,OAAI,KAAK,UACE,iBAAmBtsB,EAAU,KAAK,KAAK,SAAS,EAEpD,kBACV,CACL,CACAlX,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAGguC,GAAkC,UAAW,KAAM,MAAM,EAC5DpjC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,EAAI,CAAE,CAClD,EAAGmkC,GAAkC,UAAW,YAAa,MAAM,EACnEpjC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,MAAO,QAAS,SAAU,GAAM,CACrE,EAAGqmC,GAAkC,UAAW,SAAU,MAAM,EAChEpjC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0I,GAAWR,EAAek/B,EAAe,EAAG,QAAS,IAAK,CACnF,EAAG6G,GAAkC,UAAW,SAAU,MAAM,EAChEpjC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,CACrC,EAAGqmC,GAAkC,UAAW,cAAe,MAAM,EAC9D,MAAMK,WAAqCzpC,EAAY,CAC1D,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,UAAY,IAAI,KACrB,KAAK,QAAU,IAAI,KACnB,KAAK,WAAa,KAClB,KAAK,WAAa,EAClB,KAAK,UAAY,EACjB,KAAK,OAAS,CAACopC,GAAkC,OAAO,EAAE,CAAC,CAC9D,CACD,sBAAsBj+B,EAAM,CACxB,GAAIA,IAAS,OACT,MAAM,IAAI,MAAM,kBAAkB,EAEtC,MAAMwc,EAAS,KAAK,OAAO,MAAO,EAAC,KAAK,CAACrnB,EAAGC,IAAM,CAAE,IAAI5F,EAAIG,EAAI,QAASH,EAAK2F,EAAE,aAAe,MAAQ3F,IAAO,OAASA,EAAK,IAAI,KAAK,CAAC,GAAG,QAAS,IAAKG,EAAKyF,EAAE,aAAe,MAAQzF,IAAO,OAASA,EAAK,IAAI,KAAK,CAAC,GAAG,SAAU,CAAE,EACnO,IAAIyL,EAASohB,EAAO,CAAC,EACrB,UAAW+hB,KAAe/hB,GAClB+hB,EAAY,YAAc,MAAQv+B,GAAQu+B,EAAY,aACtDnjC,EAASmjC,GAGjB,OAAOnjC,CACV,CACD,SAAS4E,EAAMk+B,EAAQC,EAAyB,CAC5C,OAAO,KAAK,sBAAsBn+B,CAAI,EAAE,aAAak+B,EAAQC,CAAuB,CACvF,CACD,IAAI,MAAO,CACP,OAAOpsB,EAAU,UAAU,KAAK,UAAW,KAAK,OAAO,CAC1D,CACL,CACAlX,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAGwkC,GAA6B,UAAW,YAAa,MAAM,EAC9DzjC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAGwkC,GAA6B,UAAW,UAAW,MAAM,EAC5DzjC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,EAAI,CAAE,CAClD,EAAGwkC,GAA6B,UAAW,aAAc,MAAM,EAC/DzjC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,CACrC,EAAG0mC,GAA6B,UAAW,aAAc,MAAM,EAC/DzjC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,QAAS,GAAG,CAAE,CACnD,EAAG0mC,GAA6B,UAAW,YAAa,MAAM,EAC9DzjC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa8mC,EAAiC,CAAC,CAAE,CAC1E,EAAGK,GAA6B,UAAW,SAAU,MAAM,EACjD,IAACE,IACV,SAAUA,EAAiC,CAIxCA,EAAgC,OAAY,SAI5CA,EAAgC,KAAU,MAC9C,GAAGA,KAAoCA,GAAkC,CAAE,EAAC,EACrE,MAAMC,WAA+B5pC,EAAY,CACpD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GACZ,KAAK,YAAc,GACnB,KAAK,UAAY2pC,GAAgC,OAIjD,KAAK,QAAU,IAAI,IAInB,KAAK,eAAiB,KAItB,KAAK,2BAA6B,IACrC,CACD,SAASE,EAAU1+B,EAAMk+B,EAAQ7G,EAAW,CACxC,MAAMsH,EAAS,KAAK,QAAQ,IAAID,CAAQ,EACxC,OAAKC,EAGEA,EAAO,SAAS3+B,EAAMk+B,EAAQ7G,CAAS,EAFnC,IAGd,CACD,UAAU6G,EAAQU,EAAoB,CAClC,OAAO,KAAK,4BAA4BA,CAAkB,GAAK,KAAK,iBAAiBV,CAAM,CAC9F,CACD,4BAA4BU,EAAoB,CAC5C,MAAMC,EAA6B,KAAK,2BACxC,OAAIA,IAA+B,KACxB,GAEJD,EAAmB,KAAK/rC,GAAMgsC,EAA2B,SAAShsC,CAAE,CAAC,IAAM,MACrF,CACD,iBAAiBghC,EAAM,CACnB,MAAMiL,EAAe,KAAK,eAC1B,OAAIA,IAAiB,KACV,GAEJjL,EAAK,KAAKE,GAAS+K,EAAa,SAAS/K,CAAK,CAAC,IAAM,MAC/D,CACL,CACAl5B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAGwuC,GAAuB,UAAW,KAAM,MAAM,EACjD5jC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGumC,GAAuB,UAAW,OAAQ,MAAM,EACnD5jC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGumC,GAAuB,UAAW,cAAe,MAAM,EAC1D5jC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0H,GAAY8mC,EAA+B,CAAC,CAAE,CACvE,EAAGC,GAAuB,UAAW,YAAa,MAAM,EACxD5jC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0I,GAAWR,EAAeomC,EAA4B,EAAG,CAClF,EAAGG,GAAuB,UAAW,UAAW,MAAM,EACtD5jC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,EAAG,SAAU,GAAM,CACtE,EAAGumC,GAAuB,UAAW,iBAAkB,MAAM,EAC7D5jC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,EAAG,SAAU,GAAM,CACtE,EAAGumC,GAAuB,UAAW,6BAA8B,MAAM,EAClE,MAAMM,WAA0BlqC,EAAY,CAC/C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GACZ,KAAK,YAAc,GAInB,KAAK,QAAU,KAIf,KAAK,YAAc,KAInB,KAAK,YAAc,KACnB,KAAK,mBAAqB,EAC7B,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAG8uC,GAAkB,UAAW,KAAM,MAAM,EAC5ClkC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG6mC,GAAkB,UAAW,OAAQ,MAAM,EAC9ClkC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG6mC,GAAkB,UAAW,cAAe,MAAM,EACrDlkC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,EAAI,CAAE,CACrD,EAAGmnC,GAAkB,UAAW,UAAW,MAAM,EACjDlkC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,GAAM,QAAS,IAAK,CACnE,EAAGmnC,GAAkB,UAAW,cAAe,MAAM,EACrDlkC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,GAAM,QAAS,IAAK,CACnE,EAAGmnC,GAAkB,UAAW,cAAe,MAAM,EACrDlkC,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,QAAS,GAAG,CAAE,CACnD,EAAGunC,GAAkB,UAAW,qBAAsB,MAAM,EACrD,MAAMC,WAAuBnqC,EAAY,CAC5C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GACZ,KAAK,IAAM,GACX,KAAK,eAAiB,GACtB,KAAK,SAAW,GAChB,KAAK,SAAW2oC,GAAS,OAAO,CAAE,EACrC,CACL,CACA3iC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAG+uC,GAAe,UAAW,KAAM,MAAM,EACzCnkC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG8mC,GAAe,UAAW,OAAQ,MAAM,EAC3CnkC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG8mC,GAAe,UAAW,MAAO,MAAM,EAC1CnkC,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,QAAS,GAAG,CAAE,CACnD,EAAGwnC,GAAe,UAAW,iBAAkB,MAAM,EACrDnkC,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,QAAS,GAAG,CAAE,CACnD,EAAGwnC,GAAe,UAAW,WAAY,MAAM,EAC/CnkC,EAAW,CACP7K,EAAM,CAAE,QAASwtC,GAAU,QAAS,GAAG,CAAE,CAC7C,EAAGwB,GAAe,UAAW,WAAY,MAAM,EACxC,MAAMC,WAAwBpqC,EAAY,CAC7C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,SAAW,EACnB,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa6nC,EAAc,CAAC,CAAE,CACvD,EAAGC,GAAgB,UAAW,WAAY,MAAM,EACzC,MAAMC,WAAuBrqC,EAAY,CAC5C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,YACZ,KAAK,aAAe,GAIpB,KAAK,iBAAmB,KAIxB,KAAK,eAAiB,KACtB,KAAK,qBAAuBo+B,GAAiC,OAAO,CAAE,GACtE,KAAK,sCAAwC2H,GAAsC,OAAO,CAAE,GAC5F,KAAK,KAAO,GACZ,KAAK,aAAe,GACpB,KAAK,iBAAmB,GACxB,KAAK,iBAAmB,GACxB,KAAK,gBAAkB,GACvB,KAAK,WAAa,GAClB,KAAK,uBAAyB,GAC9B,KAAK,WAAa,KAClB,KAAK,4BAA8B,KACnC,KAAK,4BAA8B,IACnC,KAAK,WAAa4C,GAAS,OAAO,CAAE,GACpC,KAAK,eAAiBA,GAAS,OAAO,CAAE,GACxC,KAAK,MAAQ,KACb,KAAK,mBAAqB,KAC1B,KAAK,eAAiB,KACtB,KAAK,eAAiB,KACtB,KAAK,WAAa,KAClB,KAAK,cAAgB,KACrB,KAAK,WAAa,GAClB,KAAK,QAAUyB,GAAgB,OAAO,CAAE,GACxC,KAAK,aAAe,IAAI,IAAI,CAAC,CACrB9E,GAAY,SACZC,GAAkB,OAAO,EAAE,CAC9B,EAAC,CACT,CACD,qBAAqB+E,EAAUC,EAAe,GAAO,CACjD,IAAI5vC,EAAIG,EAAIC,EAAIgG,EAChB,MAAM0M,EAAO,CACTo3B,GAAY,OAAO,CACf,MAAO,eACP,MAAO,KAAK,MAAQ,KAAK,MAAQ,SACjD,CAAa,EACDA,GAAY,OAAO,CACf,MAAO,uBACP,MAAO,KAAK,MAAQx+B,GAAO,iBAAiB,KAAK,KAAK,EAAI,MAC1E,CAAa,CACb,EACcmkC,IAAgB1vC,GAAMH,EAAK2vC,EAAS,iBAAmB,MAAQ3vC,IAAO,OAAS,OAASA,EAAG,UAAY,MAAQG,IAAO,OAAS,OAASA,EAAG,KAAKQ,GAAKA,EAAE,OAAO,MAAQP,EAAKuvC,EAAS,iBAAmB,MAAQvvC,IAAO,OAAS,OAASA,EAAG,OAAO,CAAC,GACzP,OAAIyvC,GACA/8B,EAAK,KAAKo3B,GAAY,OAAO,CACzB,MAAO,cACP,MAAO2F,EAAY,KACtB,EAAC,EACF/8B,EAAK,KAAKo3B,GAAY,OAAO,CACzB,MAAO,WACP,OAAQ9jC,EAAKypC,EAAY,QAAU,MAAQzpC,IAAO,OAASA,EAAK,KAAK,IACxE,EAAC,GAGF0M,EAAK,KAAKo3B,GAAY,OAAO,CACzB,MAAO,WACP,MAAO,KAAK,IACf,EAAC,EAED0F,GAED98B,EAAK,KAAKo3B,GAAY,OAAO,CACzB,MAAO,mBACP,MAAO,KAAK,IACf,EAAC,EAECp3B,CACV,CACD,kCAAkC47B,EAAQU,EAAoB,CAC1D,OAAO,KAAK,gBAAgB,OAAOj+B,GAAQA,EAAK,UAAUu9B,EAAQU,CAAkB,CAAC,CACxF,CACL,CACA/jC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,QAAS,GAAG,CAAE,CAClD,EAAGgnC,GAAe,UAAW,OAAQ,MAAM,EAC3CrkC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,EAAG,QAAS,IAAK,CACpE,EAAGgnC,GAAe,UAAW,eAAgB,MAAM,EACnDrkC,EAAW,CACP7K,EAAM,CAAE,QAAS+iC,GAA0B,SAAU,GAAM,QAAS,IAAK,CAC7E,EAAGmM,GAAe,UAAW,mBAAoB,MAAM,EACvDrkC,EAAW,CACP7K,EAAM,CAAE,QAASgjC,GAAyB,SAAU,GAAM,QAAS,IAAK,CAC5E,EAAGkM,GAAe,UAAW,iBAAkB,MAAM,EACrDrkC,EAAW,CACP7K,EAAM,CAAE,QAASijC,GAAkC,QAAS,GAAG,CAAE,CACrE,EAAGiM,GAAe,UAAW,uBAAwB,MAAM,EAC3DrkC,EAAW,CACP7K,EAAM,CAAE,QAAS4qC,GAAuC,QAAS,GAAG,CAAE,CAC1E,EAAGsE,GAAe,UAAW,wCAAyC,MAAM,EAC5ErkC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa0mC,EAAe,EAAG,QAAS,IAAK,CACtE,EAAGqB,GAAe,UAAW,OAAQ,MAAM,EAC3CrkC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa6mC,EAAmB,EAAG,QAAS,IAAK,CAC1E,EAAGkB,GAAe,UAAW,eAAgB,MAAM,EACnDrkC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAay8B,EAAe,EAAG,QAAS,IAAK,CACtE,EAAGsL,GAAe,UAAW,mBAAoB,MAAM,EACvDrkC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAasjC,EAAoB,EAAG,QAAS,IAAK,CAC3E,EAAGyE,GAAe,UAAW,mBAAoB,MAAM,EACvDrkC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAasnC,EAAsB,EAAG,QAAS,IAAK,CAC7E,EAAGS,GAAe,UAAW,kBAAmB,MAAM,EACtDrkC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa4nC,EAAiB,EAAG,QAAS,IAAK,CACxE,EAAGG,GAAe,UAAW,aAAc,MAAM,EACjDrkC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa+iC,EAAqB,EAAG,QAAS,IAAK,CAC5E,EAAGgF,GAAe,UAAW,yBAA0B,MAAM,EAC7DrkC,EAAW,CACP7K,EAAM,CAAE,QAAS0kC,GAAO,SAAU,GAAM,QAAS,IAAK,CAC1D,EAAGwK,GAAe,UAAW,aAAc,MAAM,EACjDrkC,EAAW,CACP7K,EAAM,CAAE,QAAS0kC,GAAO,SAAU,GAAM,QAAS,IAAK,CAC1D,EAAGwK,GAAe,UAAW,8BAA+B,MAAM,EAClErkC,EAAW,CACP7K,EAAM,CAAE,QAASgI,GAAe,QAAS,GAAG,CAAE,CAClD,EAAGknC,GAAe,UAAW,8BAA+B,MAAM,EAClErkC,EAAW,CACP7K,EAAM,CAAE,QAASwtC,GAAU,QAAS,GAAG,CAAE,CAC7C,EAAG0B,GAAe,UAAW,aAAc,MAAM,EACjDrkC,EAAW,CACP7K,EAAM,CAAE,QAASwtC,GAAU,QAAS,GAAG,CAAE,CAC7C,EAAG0B,GAAe,UAAW,iBAAkB,MAAM,EACrDrkC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,GAAM,QAAS,IAAK,CAClE,EAAGgnC,GAAe,UAAW,QAAS,MAAM,EAC5CrkC,EAAW,CACP7K,EAAM,CAAE,QAAS0kC,GAAO,SAAU,GAAM,QAAS,IAAK,CAC1D,EAAGwK,GAAe,UAAW,qBAAsB,MAAM,EACzDrkC,EAAW,CACP7K,EAAM,CAAE,QAAS0kC,GAAO,SAAU,GAAM,QAAS,IAAK,CAC1D,EAAGwK,GAAe,UAAW,iBAAkB,MAAM,EACrDrkC,EAAW,CACP7K,EAAM,CAAE,QAAS0kC,GAAO,SAAU,GAAM,QAAS,IAAK,CAC1D,EAAGwK,GAAe,UAAW,iBAAkB,MAAM,EACrDrkC,EAAW,CACP7K,EAAM,CAAE,QAAS0kC,GAAO,SAAU,GAAM,QAAS,IAAK,CAC1D,EAAGwK,GAAe,UAAW,aAAc,MAAM,EACjDrkC,EAAW,CACP7K,EAAM,CAAE,QAAS0kC,GAAO,SAAU,GAAM,QAAS,IAAK,CAC1D,EAAGwK,GAAe,UAAW,gBAAiB,MAAM,EACpDrkC,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,SAAU,GAAM,QAAS,IAAK,CACnE,EAAG0nC,GAAe,UAAW,aAAc,MAAM,EACjDrkC,EAAW,CACP7K,EAAM,CAAE,QAASivC,GAAiB,QAAS,GAAG,CAAE,CACpD,EAAGC,GAAe,UAAW,UAAW,MAAM,EAC9CrkC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0I,GAAW,IAAIhB,GAAYyiC,EAAW,EAAGC,EAAiB,EAAG,QAAS,GAAG,CAAE,CACpG,EAAG8E,GAAe,UAAW,eAAgB,MAAM,EAC5C,MAAMI,WAAiBzqC,EAAY,CACtC,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,OAASqqC,GAAe,OAAO,CAAE,GACtC,KAAK,cAAgB,KACrB,KAAK,OAASxC,GAAmB,OAAO,CAAE,GAI1C,KAAK,yBAA2B,IACnC,CAID,UAAW,CACP,IAAIltC,EAAIG,EACR,OAAQA,GAAMH,EAAK,KAAK,iBAAmB,MAAQA,IAAO,OAAS,OAASA,EAAG,SAAW,MAAQG,IAAO,OAASA,EAAK,EAC1H,CACD,WAAW,QAAS,CAChB,OAAK2vC,GAAS,WACVA,GAAS,SAAWA,GAAS,OAAO,CAAE,IAEnCA,GAAS,QACnB,CACD,WAAW,gBAAiB,CACxB,OAAOA,GAAS,QACnB,CACD,OAAO,aAAc,CACjBA,GAAS,SAAW,IACvB,CACD,WAAY,CACRA,GAAS,SAAW,IACvB,CACL,CACAA,GAAS,SAAW,KACpBzkC,EAAW,CACP7K,EAAM,CAAE,QAASkvC,GAAgB,CACrC,EAAGI,GAAS,UAAW,SAAU,MAAM,EACvCzkC,EAAW,CACP7K,EAAM,CAAE,QAASytC,GAAuB,SAAU,EAAI,CAAE,CAC5D,EAAG6B,GAAS,UAAW,gBAAiB,MAAM,EAC9CzkC,EAAW,CACP7K,EAAM,CAAE,QAAS0sC,GAAoB,CACzC,EAAG4C,GAAS,UAAW,SAAU,MAAM,EACvCzkC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,GAAM,QAAS,IAAK,CAClE,EAAGonC,GAAS,UAAW,2BAA4B,MAAM,EC9kBlD,MAAMC,WAAsB1qC,EAAY,CAC3C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GACZ,KAAK,QAAU,IAClB,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGqnC,GAAc,UAAW,OAAQ,MAAM,EAC1C1kC,EAAW,CACP7K,EAAM,CAAE,QAAS08B,GAAS,SAAU,EAAI,CAAE,CAC9C,EAAG6S,GAAc,UAAW,UAAW,MAAM,EAItC,MAAMC,WAAoB3qC,EAAY,CACzC,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,GAAK,GACV,KAAK,KAAO,GACZ,KAAK,YAAc,EACtB,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGsnC,GAAY,UAAW,KAAM,MAAM,EACtC3kC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGsnC,GAAY,UAAW,OAAQ,MAAM,EACxC3kC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGsnC,GAAY,UAAW,cAAe,MAAM,EACxC,MAAMC,WAAkB5qC,EAAY,CACvC,aAAc,CACV,MAAM,GAAG,SAAS,EAIlB,KAAK,kBAAoB,KACzB,KAAK,YAAc2oC,GAAS,OAAO,CAAE,GACrC,KAAK,QAAU,GACf,KAAK,SAAW,KAMhB,KAAK,mBAAqB,KAO1B,KAAK,OAAS,KAMd,KAAK,mBAAqB,KAC1B,KAAK,WAAa,IACrB,CACL,CACA3iC,EAAW,CACP7K,EAAM,CAAE,QAASwvC,GAAa,SAAU,GAAM,QAAS,IAAK,CAChE,EAAGC,GAAU,UAAW,oBAAqB,MAAM,EACnD5kC,EAAW,CACP7K,EAAM,CAAE,QAASwtC,GAAU,CAC/B,EAAGiC,GAAU,UAAW,cAAe,MAAM,EAC7C5kC,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,CACrC,EAAGioC,GAAU,UAAW,UAAW,MAAM,EACzC5kC,EAAW,CACP7K,EAAM,CAAE,QAASuvC,GAAe,SAAU,EAAI,CAAE,CACpD,EAAGE,GAAU,UAAW,WAAY,MAAM,EAC1C5kC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,EAAG,SAAU,GAAM,CACtE,EAAGunC,GAAU,UAAW,qBAAsB,MAAM,EACpD5kC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAaqoC,EAAW,EAAG,SAAU,GAAM,QAAS,IAAK,CAClF,EAAGC,GAAU,UAAW,SAAU,MAAM,EACxC5kC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAae,CAAa,EAAG,SAAU,GAAM,CACtE,EAAGunC,GAAU,UAAW,qBAAsB,MAAM,EACpD5kC,EAAW,CACP7K,EAAM,CAAE,QAAS0kC,GAAO,SAAU,EAAI,CAAE,CAC5C,EAAG+K,GAAU,UAAW,aAAc,MAAM,SACrC,cAAoB5qC,EAAY,CACnC,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GACZ,KAAK,OAAS,GACd,KAAK,eAAiB,KACtB,KAAK,UAAY,IAAI,KACrB,KAAK,QAAU,IAAI,KACnB,KAAK,KAAO4qC,GAAU,OAAO,CAAE,GAC/B,KAAK,MAAQ,KACb,KAAK,UAAY,IAAI,KACrB,KAAK,UAAY,IAAI,IACxB,CACD,IAAI,WAAY,CACZ,OAAO1tB,EAAU,UAAU,KAAK,UAAW,KAAK,OAAO,CAC1D,CACD,OAAO,MAAM2tB,EAAQ,CACjB,MAAM3oC,EAAQ,GACRiyB,EAAcjX,EAAU,KAAK,IAAI,IAAM,EAC7C,UAAW4tB,KAASD,EAAQ,CACxB,MAAMz+B,EAAO8Q,EAAU,KAAK4tB,EAAM,SAAS,EACrC5R,EAAQhc,EAAU,MAAM4tB,EAAM,SAAS,GAAK1+B,IAAS+nB,EAAc,IAAI/nB,CAAI,GAAK,IAChFu2B,EAAQzgC,EAAMA,EAAM,OAAS,CAAC,EAChCygC,GAASA,EAAM,QAAUzJ,EACzByJ,EAAM,OAAO,KAAKmI,CAAK,EAGvB5oC,EAAM,KAAK,CAAE,MAAAg3B,EAAO,OAAQ,CAAC4R,CAAK,CAAC,CAAE,CAE5C,CACD,OAAO5oC,CACV,CACD,IAAI,wBAAyB,CACzB,OAAOuoC,GAAS,OAAO,OAAO,uBAAuB,OAAOj3B,GAAKA,EAAE,aAAa,SAAS,KAAK,MAAM,CAAC,CACxG,CACD,OAAO,UAAUqc,EAAM,CACnB,MAAMtpB,EAAS,MAAM,OAAO,KAAK,KAAM,GAAGspB,CAAI,EAE9C,OAAItpB,EAAO,QACPA,EAAO,MAAM,MAAQA,GAElBA,CACV,CACL,EACAP,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAG2vC,GAAM,UAAW,KAAM,MAAM,EAChC/kC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG0nC,GAAM,UAAW,OAAQ,MAAM,EAClC/kC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG0nC,GAAM,UAAW,SAAU,MAAM,EACpC/kC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAG0nC,GAAM,UAAW,iBAAkB,MAAM,EAC5C/kC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAG8lC,GAAM,UAAW,YAAa,MAAM,EACvC/kC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAG8lC,GAAM,UAAW,UAAW,MAAM,EACrC/kC,EAAW,CACP7K,EAAM,CAAE,QAASyvC,GAAW,CAChC,EAAGG,GAAM,UAAW,OAAQ,MAAM,EAClC/kC,EAAW,CACP7K,EAAM,CAAE,QAAS2nC,GAAO,SAAU,EAAI,CAAE,CAC5C,EAAGiI,GAAM,UAAW,QAAS,MAAM,EACnC/kC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAG8lC,GAAM,UAAW,YAAa,MAAM,EACvC/kC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAG8lC,GAAM,UAAW,YAAa,MAAM,EC1KvC,SAASC,GAA4BC,EAAa,CAC9C,OAAQtuC,GACGsuC,EAAYtuC,CAAG,CAE9B,CACA,SAASuuC,GAA2BjR,EAAQS,EAAS,CACjD,MAAMyQ,EAAUC,GAAsBnR,EAAQS,CAAO,EACrD,OAAQn+B,GAAW,CACf,UAAW8uC,KAAUF,EACjB,GAAI,CAACE,EAAO9uC,CAAM,EACd,MAAO,GAGf,MAAO,EACf,CACA,CACA,SAAS+uC,GAA0BrR,EAAQS,EAAS,CAChD,MAAMyQ,EAAUC,GAAsBnR,EAAQS,CAAO,EACrD,OAAQn+B,GAAW,CACf,UAAW8uC,KAAUF,EACjB,GAAIE,EAAO9uC,CAAM,EACb,MAAO,GAGf,MAAO,EACf,CACA,CACA,SAASgvC,GAA2BtR,EAAQS,EAAS,CACjD,MAAM8Q,EAAYN,GAA2BjR,EAAQS,CAAO,EAC5D,OAAQn+B,GACG,CAACivC,EAAUjvC,CAAM,CAEhC,CACA,SAASkvC,GAAgCxR,EAAQ,CAC7C,OAAQl9B,GAAQ,CACZ,MAAMuD,EAAIorC,GAAeC,GAAwB5uC,CAAG,CAAC,EAC/CwD,EAAImrC,GAAeC,GAAwB1R,CAAM,CAAC,EACxD,OAAI35B,IAAM,MAAQC,IAAM,KACbD,IAAM,MAAQC,IAAM,KAExBD,EAAIC,CACnB,CACA,CACA,SAASqrC,GAAmC3R,EAAQ,CAChD,OAAQl9B,GAAQ,CACZ,MAAMuD,EAAIorC,GAAeC,GAAwB5uC,CAAG,CAAC,EAC/CwD,EAAImrC,GAAeC,GAAwB1R,CAAM,CAAC,EACxD,OAAI35B,IAAM,MAAQC,IAAM,KACbD,IAAM,MAAQC,IAAM,KAExBD,EAAIC,CACnB,CACA,CACA,SAASsrC,GAA8B5R,EAAQ,CAC3C,OAAQl9B,GAAQ,CACZ,MAAMwD,EAAImrC,GAAeC,GAAwB1R,CAAM,CAAC,EACxD,GAAI,MAAM,QAAQl9B,CAAG,EAAG,CAGpB,UAAWyF,KAAKzF,EAEZ,GADU2uC,GAAeC,GAAwBnpC,CAAC,CAAC,IACzCjC,EACN,MAAO,GAGf,MAAO,EACV,CAED,OADUmrC,GAAeC,GAAwB5uC,CAAG,CAAC,IACxCwD,CACrB,CACA,CACA,SAASurC,GAAqBC,EAAU,CACpC,MAAO,CAAC9R,EAAQ+R,IAAc,CAC1B,MAAMX,EAASU,EAAS9R,EAAQ+R,CAAS,EACzC,OAAQjvC,GACG,CAACsuC,EAAOtuC,CAAG,CAE9B,CACA,CACA,SAASkvC,GAAgChS,EAAQ,CAC7C,OAAQl9B,GAAQ,CACZ,MAAMuD,EAAIorC,GAAeC,GAAwB5uC,CAAG,CAAC,EAC/C05B,EAASiV,GAAeC,GAAwB1R,CAAM,CAAC,EAC7D,OAAI,OAAO35B,GAAM,UAAY,OAAOm2B,GAAW,SACpC,GAEJF,GAAc,SAASj2B,EAAGm2B,CAAM,CAC/C,CACA,CACA,SAASyV,GAA0BjS,EAAQ,CACvC,OAAQl9B,GAAQ,CACZ,GAAIA,IAAQ,OAER,MAAO,GAEX,GAAI,CAAC,MAAM,QAAQk9B,CAAM,EACrB,MAAM,IAAI,MAAM,wDAAwD,EAE5E,GAAI,MAAM,QAAQl9B,CAAG,EAAG,CAGpB,UAAWyF,KAAKzF,EAAK,CACjB,MAAMuD,EAAIorC,GAAeC,GAAwBnpC,CAAC,CAAC,EACnD,UAAWgxB,KAAWyG,EAAQ,CAC1B,MAAM15B,EAAImrC,GAAeC,GAAwBnY,CAAO,CAAC,EACzD,GAAIlzB,IAAMC,EACN,MAAO,EAEd,CACJ,CACD,MAAO,EACV,CACD,MAAMD,EAAIorC,GAAeC,GAAwB5uC,CAAG,CAAC,EACrD,UAAWy2B,KAAWyG,EAAQ,CAC1B,MAAM15B,EAAImrC,GAAeC,GAAwBnY,CAAO,CAAC,EACzD,GAAIlzB,IAAMC,EACN,MAAO,EAEd,CACD,MAAO,EACf,CACA,CACA,SAAS4rC,GAAiClS,EAAQ+R,EAAW,CACzD,MAAMX,EAASH,GAA2BjR,EAAQ+R,CAAS,EAC3D,OAAQjvC,GAAQ,CACZ,GAAIA,IAAQ,OAER,MAAO,GAEX,GAAI,CAAC,MAAM,QAAQA,CAAG,EAClB,MAAM,IAAI,MAAM,+DAA+D,EAEnF,UAAW8Z,KAAK9Z,EAEZ,GAAIsuC,EAAOx0B,CAAC,EACR,MAAO,GAGf,MAAO,EACf,CACA,CACA,SAASu1B,GAA8BnS,EAAQ+R,EAAW,CACtD,MAAMX,EAASH,GAA2BjR,EAAQ+R,CAAS,EAC3D,OAAQjvC,GAAQ,CACZ,GAAI,OAAOA,GAAQ,UAAY,MAAM,QAAQA,CAAG,EAC5C,OAAOsuC,EAAOtuC,EAAI,MAAM,EAE5B,MAAM,IAAI,MAAM,sEAAsE,CAC9F,CACA,CACA,SAASsvC,GAAgB9vC,EAAQ+vC,EAAM,CACnC,GAAIA,EAAK,SAAW,EAChB,OAAO/vC,EAEX,MAAMgwC,EAAeD,EAAK,CAAC,EAC3B,GAAI/vC,aAAkB,IAClB,OAAIA,EAAO,IAAIgwC,CAAY,EAChBF,GAAgB9vC,EAAO,IAAIgwC,CAAY,EAAGD,EAAK,MAAM,CAAC,CAAC,EAElE,OAEJ,GAAI,SAAO/vC,GAAW,UAAYA,IAAW,OAGzCgwC,KAAgBhwC,EAChB,OAAO8vC,GAAgB9vC,EAAOgwC,CAAY,EAAGD,EAAK,MAAM,CAAC,CAAC,CAElE,CACA,SAASX,GAAwB5uC,EAAK,CAUlC,GATIA,aAAe,MAGf,OAAOA,GAAQ,UAGf,OAAOA,GAAQ,UAGf,OAAOA,GAAQ,UACf,OAAOA,EAEX,GAAIA,IAAQ,KACR,OAAO,KAEX,GAAI,OAAOA,GAAQ,UAAY,MAAOA,GAC9BA,EAAI,IAAS,OACb,OAAOA,EAGf,MAAM,IAAI,MAAM,0EAA0E,CAC9F,CACA,SAAS2uC,GAAe3uC,EAAK,CACzB,GAAIA,aAAe,KACf,OAAOA,EAAI,UAEf,GAAI,OAAOA,GAAQ,SACf,OAAOA,EAAI,oBAEf,GAAI,OAAOA,GAAQ,UACf,OAAOA,IAAQ,GAAO,EAAI,EAE9B,GAAIA,IAAQ,KACR,OAAO,KAEX,GAAI,OAAOA,GAAQ,UAAY,MAAOA,EAAK,CACvC,MAAMyvC,EAAezvC,EAAI,EACzB,OAAQyvC,EAAY,CAChB,IAAK,OACD,OAAOd,GAAe,IAAI,IAAM,EACpC,QACI,MAAM,IAAI,MAAM,2BAA6Bc,CAAY,CAChE,CACJ,CACD,OAAOzvC,CACX,CACA,SAAS0vC,GAAgBxS,EAAQ,CAC7B,OAAI,OAAOA,GAAW,UAAY,OAAOA,GAAW,UAAY,OAAOA,GAAW,WAAaA,IAAW,MAAQA,IAAW,QAAaA,aAAkB,KACjJ,CACH,IAAKA,CACjB,EAEWA,CACX,CACO,SAASyS,GAA6BJ,EAAMK,EAA2B,CAC1E,MAAMrT,EAAW,MAAM,QAAQgT,CAAI,EAAIA,EAAOA,EAAK,MAAM,GAAG,EAC5D,MAAO,CAACrS,EAAQ+R,IAAc,CAC1B,MAAMX,EAASH,GAA2BjR,EAAQ0S,EAA6B,OAAOA,GAA8B,WAAaA,EAA4B3B,GAA4B2B,CAAyB,EAAKX,CAAS,EAChO,OAAQzvC,GAAW,CACf,MAAMK,EAAQyvC,GAAgB9vC,EAAQ+8B,CAAQ,EAC9C,OAAI18B,IAAU,OAGH,GAEJyuC,EAAOzuC,CAAK,CAC/B,CACA,CACA,CACO,SAASgwC,GAAuCD,EAA2B,CAC9E,OAAQhwC,GAEG+vC,GAA6B/vC,EAAKgwC,CAAyB,CAE1E,CAWY,MAACE,GAA8B,CACvC,KAAM3B,GACN,IAAKI,GACL,KAAMC,GACN,IAAKM,GACL,KAAMC,GAAqBD,EAA6B,EACxD,IAAKJ,GACL,IAAKG,GACL,KAAME,GAAqBF,EAAkC,EAC7D,KAAME,GAAqBL,EAA+B,EAC1D,IAAKS,GACL,WAAYC,GACZ,UAAWF,GACX,QAASG,EACb,EACA,SAAShB,GAAsBnR,EAAQ6S,EAAsB,CACzD,GAAI7S,IAAW,OACX,MAAO,GAEX,MAAMkR,EAAU,GAChB,UAAW4B,KAAO,MAAM,QAAQ9S,CAAM,EAAIA,EAAS,CAACA,CAAM,EAAI,CAC1D,MAAM/4B,EAAIurC,GAAgBM,CAAE,EAC5B,UAAWpwC,KAAO,OAAO,KAAKuE,CAAC,EAAG,CAC9B,MAAM8rC,EAAY9rC,EAAEvE,CAAG,EACjBswC,EAAiBH,EAAqBnwC,EAAKqwC,CAAS,EAC1D,GAAI,CAACC,EACD,MAAM,IAAI,MAAM,sBAAwBtwC,CAAG,EAE/C,MAAM8H,EAAIwoC,EAAeD,EAAWF,CAAoB,EACxD,GAAuBroC,GAAM,KACzB,MAAM,IAAI,MAAM,gCAAkC9H,CAAG,EAEzDwuC,EAAQ,KAAK1mC,CAAC,CACjB,CACJ,CACD,OAAO0mC,CACX,CACY,MAAC+B,GAA0B,CAACjT,EAAQS,IACxCT,IAAW,KACJ,IAAM,GAEViR,GAA2BjR,EAAQ+Q,GAA4BtQ,CAAO,CAAC,ECvSrEyS,GAAkC,CAC3C,GAAGN,GACH,SAAUH,GAA6B,UAAU,EACjD,eAAgBA,GAA6B,iBAAkB,CAC3D,GAAGG,GACH,GAAIH,GAA6B,IAAI,CAC7C,CAAK,EACD,gBAAiBA,GAA6B,kBAAmB,CAC7D,GAAGG,GACH,GAAIH,GAA6B,IAAI,CAC7C,CAAK,CACL,EACaU,GAA+B,CACxC,cAAeV,GAA6B,gBAAiBE,GAAuCO,EAA+B,CAAC,CACxI,EACaE,GAAqD,CAC9D,GAAGR,GACH,IAAKH,GAA6B,oBAAoB,EACtD,OAAQA,GAA6B,gBAAgB,EACrD,SAAUA,GAA6B,kBAAkB,EACzD,cAAeA,GAA6B,wBAAyBE,GAAuCO,EAA+B,CAAC,CAChJ,EACaG,GAAsC,CAC/C,GAAGT,EACP,EACaU,GAAsC,CAC/C,GAAGV,GACH,OAAQH,GAA6B,uBAAwBW,EAAkD,EAC/G,WAAYX,GAA6B,aAAc,CACnD,GAAGG,GACH,GAAIH,GAA6B,IAAI,CAC7C,CAAK,EACD,QAASA,GAA6B,UAAW,CAC7C,GAAGG,GACH,OAAQH,GAA6B,SAAU,CAC3C,GAAGG,GACH,GAAIH,GAA6B,IAAI,CACjD,CAAS,EACD,WAAYA,GAA6B,aAAc,CACnD,GAAGG,GACH,GAAIH,GAA6B,IAAI,CACjD,CAAS,EACD,OAAQA,GAA6B,QAAQ,CACrD,CAAK,EACD,GAAGU,EACP,EACaI,GAAkC,CAC3C,GAAGX,EACP,EACaY,GAAkC,CAC3C,GAAGZ,EACP,GACqE,CACjE,GAAGA,GACH,KAAMH,GAA6B,OAAQ,CACvC,GAAGG,GACH,kBAAmBH,GAA6B,mBAAmB,CAC3E,CAAK,CACL,GACO,MAAMgB,GAA0C,CACnD,GAAGb,GACH,KAAMH,GAA6B,WAAW,CAClD,EACaiB,GAA4C,CACrD,GAAGd,GACH,GAAGO,EACP,ECxDO,MAAMQ,WAAqB5tC,EAAY,CAC1C,aAAc,CACV,MAAM,GAAG,SAAS,EAIlB,KAAK,KAAO,IAAI,KAKhB,KAAK,WAAa,IACrB,CACD,WAAW6tC,EAAW,CAIlB,MAHI,CAAC,KAAK,YAGN,KAAK,WAAW,QAAS,EAAG,IAAI,OAAO,QAAS,EAAGA,CAI1D,CACD,cAAe,CACX,KAAK,WAAa,IAAI,IACzB,CACD,IAAI,aAAc,CACd,MAAO,UACV,CACD,IAAI,aAAc,CACd,OAAO,KAAK,WACf,CAID,IAAI,kBAAmB,CACnB,OAAO,KAAK,SAAS,KAAO,KAAO,KAAK,WAC3C,CACD,IAAI,cAAe,CACf,OAAO,KAAK,SAAS,YACxB,CACD,IAAI,aAAc,CACd,MAAO,CAAC,CACA,MAAO,KAAK,YACZ,OAAQ,IACxB,CAAa,CACR,CACD,aAAc,CACV,GAAI,CAAC,KAAK,QACN,GAAI,CACA,KAAK,SAAQ,CAChB,OACM,EAAG,CACN,GAAIxyC,GAAc,CAAC,EACf,MAAO,CACHihC,GAAc,OAAO,CACjB,GAAI,sBAAwB,KAAK,GACjC,KAAM,EAAE,SAAU,EAClB,KAAMD,GAAkB,KACpD,CAAyB,CACzB,CAGa,CAEL,MAAO,EACV,CACD,UAAW,CAEV,CAKD,IAAI,SAAU,CACV,MAAO,EACV,CACD,WAAWyR,EAAO,CACd,OAAOvX,GAAc,SAAS,KAAK,YAAauX,CAAK,CACxD,CACD,gBAAgB9Q,EAAQ,CACpB,OAAI,KAAK,YAAcA,EAAO,WACnB,KAAK,WAAaA,EAAO,WAEhC,KAAK,YAAc,CAACA,EAAO,WACpB,IAEP,CAAC,KAAK,YAAcA,EAAO,WACpB,GAId,CACD,OAAO,oBAAoBt4B,EAAU,CAEjC,OADaqpC,GAAoB,gBAAgBrpC,EAAS,IAAI,EAClD,OAAO,CACf,SAAAA,CACZ,CAAS,CACJ,CACD,aAAc,CACV,OAAO,KAAK,SAAS,IACxB,CACD,cAAe,CACX,IAAI/J,EACJ,OAAI,KAAK,SAAS,OAASuhC,GAAW,SAC3BnD,GAAoB,OAAO,CAC9B,OAAQp+B,EAAK,KAAK,eAAiB,MAAQA,IAAO,OAASA,EAAK,OAChE,KAAMm+B,GAAwB,QAC9C,CAAa,EAEE,KAAK,WACf,CACL,CACA9yB,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAGwyC,GAAa,UAAW,KAAM,MAAM,EACvC5nC,EAAW,CACP7K,EAAM,CAAE,QAAS0hC,GAAgB,CACrC,EAAG+Q,GAAa,UAAW,WAAY,MAAM,EAC7C5nC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,QAAS,GAAG,CAAE,CAChD,EAAG2oC,GAAa,UAAW,OAAQ,MAAM,EACzC5nC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,EAAI,CAAE,CAClD,EAAG2oC,GAAa,UAAW,aAAc,MAAM,EACxC,MAAMI,EAA0B,CACnC,OAAOnzC,EAAM,CAET,MAAMiR,EADWjR,EAAK,MAAM,UAAU,EAAE,OAAOgiC,EAAc,EACvC,KACtB,OAAOhiC,EAAK,OAAO,KAAK,gBAAgBiR,CAAI,CAAC,CAChD,CACD,gBAAgBA,EAAM,CAClB,OAAQA,EAAI,CACR,KAAKowB,GAAW,SAAU,OAAO+R,GACjC,KAAK/R,GAAW,KAChB,KAAKA,GAAW,MAChB,KAAKA,GAAW,MAChB,KAAKA,GAAW,SACZ,OAAOgS,GACX,KAAKhS,GAAW,eAAgB,OAAOiS,GACvC,KAAKjS,GAAW,UAAW,OAAOkS,GAClC,KAAKlS,GAAW,QAAS,OAAOmS,GAChC,KAAKnS,GAAW,KAAM,OAAOoS,GAC7B,KAAKpS,GAAW,MAAO,OAAOqS,GAC9B,KAAKrS,GAAW,MAAO,OAAOsS,GAC9B,KAAKtS,GAAW,QAAS,OAAOuS,GAChC,KAAKvS,GAAW,KAAM,OAAOwS,EAChC,CACJ,CACL,CACY,MAACX,GAAsB,IAAIC,GAChC,MAAME,WAAyBN,EAAa,CAC/C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,MAAQ,IAChB,CACD,IAAI,aAAc,CACd,IAAIjzC,EACJ,OAAQA,EAAK,KAAK,SAAW,MAAQA,IAAO,OAASA,EAAK,GAC7D,CACD,IAAI,aAAc,CACd,OAAO,KAAK,KACf,CACD,aAAc,CACV,MAAM8S,EAAO,MAAM,cACnB,OAAK,KAAK,SAAS,QAGf,KAAK,SAAS,QAAQ,SACf,KAAK,QAAU,MAAQ,KAAK,MAAM,SAAW,EAAI,CAAC,KAAK,SAAS,QAAS,GAAGA,CAAI,EAAIA,EAExF,KAAK,QAAU,MAAQ,KAAK,MAAM,OAAS,EAAI,CAAC,KAAK,SAAS,QAAS,GAAGA,CAAI,EAAIA,EAL9EA,CAMd,CACD,UAAW,CACP,GAAI,KAAK,SAAS,WAAa,KAAK,QAAU,MAAQ,KAAK,MAAM,SAAW,GACxE,MAAM,IAAIhT,GAAY,CAClB,KAAM,gBACN,QAAS,wBACT,MAAO,OACvB,CAAa,EAEL,GAAI,KAAK,OAAS,KAAK,SAAS,KAAK,kBAAmB,EAAC,SAAS,qBAAqB,EAAG,CACtF,GAAI,CAACm7B,GAAc,4BAA4B,KAAK,KAAK,EACrD,MAAM,IAAIn7B,GAAY,CAClB,KAAM,gBACN,QAAS,IAAO,KAAK,MAAS,kKAC9B,MAAO,OAC3B,CAAiB,EAGL,KAAK,MAAQm7B,GAAc,4BAA4B,KAAK,KAAK,CACpE,CACJ,CACD,IAAI,SAAU,CACV,OAAQ,KAAK,QAAU,MAAQ,KAAK,MAAM,SAAW,CACxD,CACL,CACA5vB,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAG6qC,GAAiB,UAAW,QAAS,MAAM,EACvC,MAAMD,WAA6BL,EAAa,CACnD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,SAAW,EACnB,CACD,aAAc,CACV,MAAMngC,EAAO,MAAM,cACnB,OAAK,KAAK,SAAS,QAGf,KAAK,SAAS,QAAQ,SACd,KAAK,SAA8CA,EAAnC,CAAC,KAAK,SAAS,QAAS,GAAGA,CAAI,EAEpD,KAAK,SAAW,CAAC,KAAK,SAAS,QAAS,GAAGA,CAAI,EAAIA,EAL/CA,CAMd,CACD,IAAI,aAAc,CACd,OAAO,KAAK,SAAW,aAAe,iBACzC,CACD,IAAI,aAAc,CACd,OAAO,KAAK,QACf,CACD,IAAI,aAAc,CACd,MAAO,CAAC,CACA,MAAO,KAAK,SAAY,KAAK,SAAW,KAAK,SAAW,KAAQ,MAChE,OAAQ,IACxB,CAAa,CACR,CACD,UAAW,CACP,GAAI,KAAK,SAAS,UAAY,CAAC,KAAK,SAChC,MAAM,IAAIhT,GAAY,CAClB,KAAM,gBACN,QAAS,mBACT,MAAO,OACvB,CAAa,CAER,CACD,IAAI,SAAU,CACV,MAAO,CAAC,KAAK,QAChB,CACL,CACAuL,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,CACrC,EAAGsrC,GAAqB,UAAW,WAAY,MAAM,EACrDjoC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAG4qC,GAAqB,UAAW,WAAY,MAAM,EAC9C,MAAME,WAAmCP,EAAa,CACzD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,gBAAkB,EAC1B,CACD,IAAI,aAAc,CACd,OAAO,KAAK,gBAAgB,IAAIznC,GAAKA,EAAE,IAAI,EAAE,KAAK,IAAI,CACzD,CACD,IAAI,aAAc,CACd,OAAO,KAAK,gBAAgB,IAAIA,GAAKA,EAAE,EAAE,CAC5C,CACD,aAAc,CACV,MAAMsH,EAAO,MAAM,cACnB,GAAI,KAAK,gBAAgB,SAAW,EAChC,OAAOA,EAEX,MAAMkhC,EAAWlhC,EACjB,UAAWmhC,KAAU,KAAK,gBAClBA,EAAO,SAAW,CAACA,EAAO,QAAQ,UAClCD,EAAS,KAAKC,EAAO,OAAO,EAGpC,UAAWA,KAAU,KAAK,SAAS,QAC3BA,EAAO,SAAWA,EAAO,QAAQ,WAC5B,KAAK,gBAAgB,KAAKnqC,GAAKA,EAAE,KAAOmqC,EAAO,EAAE,GAClDD,EAAS,KAAKC,EAAO,OAAO,GAIxC,OAAOD,CACV,CACD,UAAW,CACP,GAAI,KAAK,SAAS,UAAY,KAAK,gBAAgB,SAAW,EAC1D,MAAM,IAAIl0C,GAAY,CAClB,KAAM,gBACN,QAAS,8BACT,MAAO,OACvB,CAAa,CAER,CACD,IAAI,SAAU,CACV,OAAO,KAAK,gBAAgB,SAAW,CAC1C,CACL,CACAuL,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAaq6B,EAAY,CAAC,CAAE,CACrD,EAAGwR,GAA2B,UAAW,kBAAmB,MAAM,EAC3D,MAAMC,WAA8BR,EAAa,CACpD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,eAAiB,IACzB,CACD,IAAI,aAAc,CACd,IAAIjzC,EAAIG,EACR,OAAQA,GAAMH,EAAK,KAAK,kBAAoB,MAAQA,IAAO,OAAS,OAASA,EAAG,QAAU,MAAQG,IAAO,OAASA,EAAK,GAC1H,CACD,IAAI,aAAc,CACd,IAAIH,EAAIG,EACR,OAAQA,GAAMH,EAAK,KAAK,kBAAoB,MAAQA,IAAO,OAAS,OAASA,EAAG,MAAQ,MAAQG,IAAO,OAASA,EAAK,IACxH,CACD,aAAc,CACV,MAAM2S,EAAO,MAAM,cACnB,GAAI,KAAK,iBAAmB,KAExB,OAAOA,EAEX,MAAMkhC,EAAWlhC,EACb,KAAK,eAAe,SAAW,CAAC,KAAK,eAAe,QAAQ,UAC5DkhC,EAAS,KAAK,KAAK,eAAe,OAAO,EAE7C,UAAWC,KAAU,KAAK,SAAS,QAC3BA,EAAO,SAAWA,EAAO,QAAQ,UAC7B,KAAK,eAAe,KAAOA,EAAO,IAClCD,EAAS,KAAKC,EAAO,OAAO,EAIxC,OAAOD,CACV,CACD,UAAW,CACP,GAAI,KAAK,SAAS,UAAY,KAAK,iBAAmB,KAClD,MAAM,IAAIl0C,GAAY,CAClB,KAAM,gBACN,QAAS,qBACT,MAAO,OACvB,CAAa,CAER,CACD,IAAI,SAAU,CACV,OAAO,KAAK,iBAAmB,IAClC,CACL,CACAuL,EAAW,CACP7K,EAAM,CAAE,QAASwhC,GAAc,SAAU,EAAI,CAAE,CACnD,EAAGyR,GAAsB,UAAW,iBAAkB,MAAM,EACrD,MAAMC,WAA4BT,EAAa,CAClD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,QAAU,IAClB,CACD,IAAI,aAAc,CACd,IAAIjzC,EAAIG,EACR,OAAQA,GAAMH,EAAK,KAAK,WAAa,MAAQA,IAAO,OAAS,OAASA,EAAG,SAAQ,KAAQ,MAAQG,IAAO,OAASA,EAAK,GACzH,CACD,IAAI,aAAc,CACd,IAAIH,EAAIG,EACR,OAAQA,GAAMH,EAAK,KAAK,WAAa,MAAQA,IAAO,OAAS,OAASA,EAAG,OAAO,CAAE,QAAS,EAAG,KAAO,MAAQG,IAAO,OAASA,EAAK,IACrI,CACD,UAAW,CACP,GAAI,KAAK,SAAS,UAAY,KAAK,UAAY,KAC3C,MAAM,IAAIL,GAAY,CAClB,KAAM,gBACN,QAAS,yBACT,MAAO,OACvB,CAAa,CAER,CACD,IAAI,aAAc,CACd,IAAIE,EAAIG,EAAIC,EAAIgG,EAChB,MAAO,CACH,CACI,MAAO,KAAK,QAAU,GAAG,KAAK,QAAQ,MAAM,IAAI,KAAK,QAAQ,MAAM,GAAK,IACxE,OAAQ,IACX,EACD,CACI,OAAQjG,GAAMH,EAAK,KAAK,WAAa,MAAQA,IAAO,OAAS,OAASA,EAAG,cAAgB,MAAQG,IAAO,OAASA,EAAK,IACtH,OAAQ,IACX,EACD,CACI,OAAQiG,GAAMhG,EAAK,KAAK,WAAa,MAAQA,IAAO,OAAS,OAASA,EAAG,QAAU,MAAQgG,IAAO,OAASA,EAAK,IAChH,OAAQ,IACX,EACD,CACI,MAAO,KAAK,QAAU62B,GAAc,QAAQ,KAAK,QAAQ,OAAO,EAAI,IACpE,OAAQ,IACX,CACb,CACK,CACD,IAAI,SAAU,CACV,OAAO,KAAK,UAAY,IAC3B,CACL,CACA5xB,EAAW,CACP7K,EAAM,CAAE,QAAS08B,GAAS,SAAU,EAAI,CAAE,CAC9C,EAAGwW,GAAoB,UAAW,UAAW,MAAM,EAC5C,MAAMC,WAAyBV,EAAa,CAC/C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,UAAY,IACpB,CACD,IAAI,aAAc,CACd,OAAO,KAAK,UAAY1wB,EAAU,WAAW,KAAK,UAAW,EAAI,EAAI,GACxE,CACD,IAAI,aAAc,CACd,OAAO,KAAK,SACf,CACD,UAAW,CACP,GAAI,KAAK,SAAS,UAAY,KAAK,YAAc,KAC7C,MAAM,IAAIziB,GAAY,CAClB,KAAM,gBACN,QAAS,yBACT,MAAO,OACvB,CAAa,CAER,CACD,IAAI,SAAU,CACV,OAAO,KAAK,YAAc,IAC7B,CACL,CACAuL,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,EAAI,CAAE,CAClD,EAAGqpC,GAAiB,UAAW,YAAa,MAAM,EAC3C,MAAMG,WAA4Bb,EAAa,CAClD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,MAAQ,IAChB,CACD,IAAI,aAAc,CACd,OAAO,KAAK,QAAU,KAAO,KAAK,MAAM,SAAU,EAAG,GACxD,CACD,IAAI,aAAc,CACd,OAAO,KAAK,KACf,CACD,aAAc,CACV,MAAMngC,EAAO,MAAM,cACnB,OAAK,KAAK,SAAS,QAGf,KAAK,SAAS,QAAQ,SACf,KAAK,QAAU,MAAQ,KAAK,QAAU,EAAI,CAAC,KAAK,SAAS,QAAS,GAAGA,CAAI,EAAIA,EAEjF,KAAK,QAAU,MAAQ,KAAK,QAAU,EAAI,CAAC,KAAK,SAAS,QAAS,GAAGA,CAAI,EAAIA,EALzEA,CAMd,CACD,UAAW,CACP,GAAI,KAAK,SAAS,UAAa,KAAK,QAAU,KAC1C,MAAM,IAAIhT,GAAY,CAClB,KAAM,gBACN,QAAS,wBACT,MAAO,OACvB,CAAa,CAER,CACD,IAAI,SAAU,CACV,OAAQ,KAAK,QAAU,IAC1B,CACL,CACAuL,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,EAAI,CAAE,CACrD,EAAG0rC,GAAoB,UAAW,QAAS,MAAM,EAC1C,MAAMF,WAA0BE,EAAoB,CACvD,IAAI,aAAc,CACd,OAAO,KAAK,QAAU,KAAOvxB,EAAU,MAAM,KAAK,KAAK,EAAI,GAC9D,CACL,CACO,MAAMsxB,WAA0BZ,EAAa,CAChD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,MAAQ,IAChB,CACD,IAAI,aAAc,CACd,IAAIjzC,EAAIG,EACR,OAAQA,GAAMH,EAAK,KAAK,SAAW,MAAQA,IAAO,OAAS,OAASA,EAAG,cAAa,KAAQ,MAAQG,IAAO,OAASA,EAAK,GAC5H,CACD,IAAI,aAAc,CACd,IAAIH,EAAIG,EACR,OAAQA,GAAMH,EAAK,KAAK,SAAW,MAAQA,IAAO,OAAS,OAASA,EAAG,OAAO,CAAE,QAAS,EAAG,KAAO,MAAQG,IAAO,OAASA,EAAK,IACnI,CACD,UAAW,CACP,GAAI,KAAK,SAAS,UAAY,KAAK,QAAU,KACzC,MAAM,IAAIL,GAAY,CAClB,KAAM,gBACN,QAAS,yBACT,MAAO,OACvB,CAAa,CAER,CACD,IAAI,SAAU,CACV,OAAO,KAAK,QAAU,IACzB,CACD,kBAAmB,CACf,OAAO,KAAK,KACf,CACL,CACAuL,EAAW,CACP7K,EAAM,CAAE,QAAS0kC,GAAO,SAAU,EAAI,CAAE,CAC5C,EAAG2O,GAAkB,UAAW,QAAS,MAAM,EACxC,MAAME,WAAyBd,EAAa,CAC/C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,IACf,CACD,IAAI,aAAc,CACd,IAAIjzC,EAAIG,EACR,OAAQA,GAAMH,EAAK,KAAK,QAAU,MAAQA,IAAO,OAAS,OAASA,EAAG,cAAa,KAAQ,MAAQG,IAAO,OAASA,EAAK,GAC3H,CACD,IAAI,aAAc,CACd,IAAIH,EAAIG,EACR,OAAQA,GAAMH,EAAK,KAAK,QAAU,MAAQA,IAAO,OAAS,OAASA,EAAG,OAAO,CAAE,QAAS,EAAG,KAAO,MAAQG,IAAO,OAASA,EAAK,IAClI,CACD,UAAW,CACP,GAAI,KAAK,SAAS,UAAY,KAAK,OAAS,KACxC,MAAM,IAAIL,GAAY,CAClB,KAAM,gBACN,QAAS,yBACT,MAAO,OACvB,CAAa,CAER,CACD,IAAI,SAAU,CACV,OAAO,KAAK,OAAS,IACxB,CACD,kBAAmB,CACf,OAAO,KAAK,IACf,CACL,CACAuL,EAAW,CACP7K,EAAM,CAAE,QAASgkC,GAAM,SAAU,EAAI,CAAE,CAC3C,EAAGuP,GAAiB,UAAW,OAAQ,MAAM,EC7gBnC,IAACG,IACV,SAAUA,EAAgB,CACvBA,EAAe,MAAW,QAC1BA,EAAe,YAAiB,cAChCA,EAAe,UAAe,YAC9BA,EAAe,QAAa,SAChC,GAAGA,KAAmBA,GAAiB,CAAE,EAAC,EACnC,MAAMC,EAAqB,CAC9B,OAAO,QAAQ9K,EAAQ,CACnB,OAAQA,EAAM,CACV,KAAK6K,GAAe,MAAO,MAAO,OAClC,KAAKA,GAAe,YAAa,MAAO,aACxC,KAAKA,GAAe,UAAW,MAAO,eACtC,KAAKA,GAAe,QAAS,MAAO,YACvC,CACJ,CACD,OAAO,SAAS7K,EAAQ,CACpB,OAAQA,EAAM,CACV,KAAK6K,GAAe,MAAO,MAAO,OAClC,KAAKA,GAAe,YAAa,MAAO,WACxC,KAAKA,GAAe,UAAW,MAAO,YACtC,KAAKA,GAAe,QAAS,MAAO,OACvC,CACJ,CACL,CACO,MAAME,WAAyB/uC,EAAY,CAC9C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GACZ,KAAK,OAAS,KACd,KAAK,SAAW,KAChB,KAAK,aAAe,KAIpB,KAAK,aAAe,IAAI,IAIxB,KAAK,aAAe,IAAI,GAC3B,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,QAAS,GAAG,CAAE,CAClD,EAAG0rC,GAAiB,UAAW,OAAQ,MAAM,EAC7C/oC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,EAAI,CAAE,CACrD,EAAGgsC,GAAiB,UAAW,SAAU,MAAM,EAC/C/oC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,EAAI,CAAE,CACrD,EAAGgsC,GAAiB,UAAW,WAAY,MAAM,EACjD/oC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,GAAM,QAAS,IAAK,CACnE,EAAGgsC,GAAiB,UAAW,eAAgB,MAAM,EACrD/oC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAayrC,EAAmB,CAAC,CAAE,EACxD5yC,EAAM,CACF,QAAS,IAAI0I,GAAWR,EAAe0qC,EAAmB,EAC1D,QAAS,IACT,QAAUjP,GAAQ,CACd,MAAM76B,EAAM,IAAI,IAChB,UAAW+4B,KAAU8B,EACjB76B,EAAI,IAAI+4B,EAAO,SAAS,GAAIA,CAAM,EAEtC,OAAO/4B,CACV,CACT,CAAK,CACL,EAAG8qC,GAAiB,UAAW,eAAgB,MAAM,EACrD/oC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0I,GAAWR,EAAe,IAAIf,GAAae,CAAa,CAAC,EAAG,CACrF,EAAG0rC,GAAiB,UAAW,eAAgB,MAAM,EAC9C,MAAMC,WAAmChvC,EAAY,CACxD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,KACZ,KAAK,KAAO,GACZ,KAAK,gBAAkB,GAIvB,KAAK,qBAAuB,GAI5B,KAAK,wBAA0B,GAC/B,KAAK,cAAgB,KACrB,KAAK,gBAAkB,KACvB,KAAK,oBAAsB,KAC3B,KAAK,oBAAsB,GAC3B,KAAK,sBAAwB,GAC7B,KAAK,0BAA4B,GACjC,KAAK,sBAAwB,GAC7B,KAAK,UAAY,KACjB,KAAK,qBAAuB,IAC/B,CACD,kBAAmB,CAEf,OAAO,IACV,CACL,CACAgG,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,GAAM,QAAS,IAAK,QAAS,IAAM,SAAU,CAC3F,EAAG2rC,GAA2B,UAAW,OAAQ,MAAM,EACvDhpC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG2rC,GAA2B,UAAW,OAAQ,MAAM,EACvDhpC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa26B,EAAc,CAAC,CAAE,CACvD,EAAG+R,GAA2B,UAAW,kBAAmB,MAAM,EAClEhpC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa26B,EAAc,CAAC,CAAE,CACvD,EAAG+R,GAA2B,UAAW,uBAAwB,MAAM,EACvEhpC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa26B,EAAc,CAAC,CAAE,CACvD,EAAG+R,GAA2B,UAAW,0BAA2B,MAAM,EAC1EhpC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,EAAI,CAAE,CACrD,EAAGisC,GAA2B,UAAW,gBAAiB,MAAM,EAChEhpC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,EAAI,CAAE,CACrD,EAAGisC,GAA2B,UAAW,kBAAmB,MAAM,EAClEhpC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,SAAU,GAAM,QAAS,IAAK,CACnE,EAAGisC,GAA2B,UAAW,sBAAuB,MAAM,EACtEhpC,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,QAAS,GAAG,CAAE,CACnD,EAAGqsC,GAA2B,UAAW,sBAAuB,MAAM,EACtEhpC,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,QAAS,GAAG,CAAE,CACnD,EAAGqsC,GAA2B,UAAW,wBAAyB,MAAM,EACxEhpC,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,QAAS,GAAG,CAAE,CACnD,EAAGqsC,GAA2B,UAAW,4BAA6B,MAAM,EAC5EhpC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa26B,EAAc,EAAG,QAAS,IAAK,CACrE,EAAG+R,GAA2B,UAAW,wBAAyB,MAAM,EACxEhpC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,GAAM,QAAS,IAAK,CAClE,EAAG2rC,GAA2B,UAAW,YAAa,MAAM,EAC5DhpC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,GAAM,QAAS,IAAK,CAClE,EAAG2rC,GAA2B,UAAW,uBAAwB,MAAM,EAChE,MAAMC,WAA8BjvC,EAAY,CACnD,aAAc,CACV,MAAM,GAAG,SAAS,EAIlB,KAAK,MAAQ,EAIb,KAAK,aAAe,IAAI,GAC3B,CACD,aAAc,CACV,OAAO,KAAK,MAAM,IACrB,CACD,gBAAgBkvC,EAAS,CACrB,MAAO,EACV,CACD,gBAAgBjV,EAAQ,CACpB,MAAO,EACV,CACD,kBAAmB,CACf,OAAO,KAAK,YACf,CACD,mBAAmBt8B,EAAO,CACtB,OAAO,KAAK,MAAM,CACd,aAAcA,CAC1B,CAAS,CACJ,CACL,CACAqI,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,MAAO,SAAS,CAAE,EAClDlI,EAAM,CAAE,QAASwvC,GAAa,QAAS,IAAK,QAAU7L,GAAQ6L,GAAY,OAAO,CAAE,GAAI7L,EAAK,KAAM,UAAY,GAAG,CACrH,EAAGmQ,GAAsB,UAAW,QAAS,MAAM,EACnDjpC,EAAW,CACP7K,EAAM,CAAE,QAASgI,GAAe,CACpC,EAAG8rC,GAAsB,UAAW,QAAS,MAAM,EACnDjpC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAayrC,EAAmB,CAAC,CAAE,EACxD5yC,EAAM,CACF,QAAS,IAAI0I,GAAWR,EAAe0qC,EAAmB,EAC1D,QAAS,IACT,QAAUjP,GAAQ,CACd,MAAM76B,EAAM,IAAI,IAChB,UAAW+4B,KAAU8B,EACjB76B,EAAI,IAAI+4B,EAAO,SAAS,GAAIA,CAAM,EAEtC,OAAO/4B,CACV,CACT,CAAK,CACL,EAAGgrC,GAAsB,UAAW,eAAgB,MAAM,EACnD,MAAME,WAAgCnvC,EAAY,CACrD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,mBAAqBgvC,GAA2B,OAAO,CAAE,GAI9D,KAAK,OAAS,GACd,KAAK,WAAa,EACrB,CACL,CACAhpC,EAAW,CACP7K,EAAM,CAAE,QAAS6zC,GAA4B,CACjD,EAAGG,GAAwB,UAAW,qBAAsB,MAAM,EAClEnpC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAa2sC,EAAqB,CAAC,CAAE,CAC9D,EAAGE,GAAwB,UAAW,SAAU,MAAM,EACtDnpC,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,QAAS,GAAG,CAAE,CACnD,EAAGwsC,GAAwB,UAAW,aAAc,MAAM,EACnD,MAAMC,WAAgCpvC,EAAY,CACrD,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,OAAS6uC,GAAe,MAC7B,KAAK,eAAiB,GACtB,KAAK,KAAO,GACZ,KAAK,SAAWE,GAAiB,OAAO,CAAE,GAC1C,KAAK,gBAAkBI,GAAwB,OAAO,CAAE,GACxD,KAAK,UAAY,IAAI,KACrB,KAAK,UAAY,IAAI,IACxB,CACD,gBAAgBD,EAAS,CACrB,MAAO,EACV,CACD,kBAAmB,CACf,OAAO,KAAK,SAAS,YACxB,CACD,mBAAmBvxC,EAAO,CACtB,OAAO,KAAK,MAAM,CACd,SAAUoxC,GAAiB,MAAM,CAC7B,aAAcpxC,CAC9B,CAAa,CACb,CAAS,CACJ,CACD,gBAAgBs8B,EAAQ,CACpB,GAAI,CACA,MAAMoV,EAAsB,CACxB,GAAGxC,EACnB,EACY,UAAWvsC,KAAK,KAAK,SAAS,aAAa,OAAM,EAC7C+uC,EAAoB/uC,EAAE,SAAS,EAAE,EAAIosC,GAA6B,CAACpsC,EAAE,SAAS,GAAI,aAAa,CAAC,EAEpG,MAAMgvC,EAAO,CACT,GAAG9B,GACH,aAAcd,GAA6B,wBAAyB2C,CAAmB,CACvG,EAEY,OADuBnC,GAAwBjT,EAAQqV,CAAI,EACrC,IAAI,CAC7B,OACMh0C,EAAG,CACN,QAAQ,MAAM,+BAAgCA,EAAG2+B,CAAM,CAC1D,CACD,MAAO,EACV,CACL,CACAj0B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAGg0C,GAAwB,UAAW,KAAM,MAAM,EAClDppC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0H,GAAYgsC,EAAc,CAAC,CAAE,CACtD,EAAGO,GAAwB,UAAW,SAAU,MAAM,EACtDppC,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,CACrC,EAAGysC,GAAwB,UAAW,iBAAkB,MAAM,EAC9DppC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAG+rC,GAAwB,UAAW,OAAQ,MAAM,EACpDppC,EAAW,CACP7K,EAAM,CAAE,QAAS4zC,GAAkB,CACvC,EAAGK,GAAwB,UAAW,WAAY,MAAM,EACxDppC,EAAW,CACP7K,EAAM,CAAE,QAASg0C,GAAyB,CAC9C,EAAGC,GAAwB,UAAW,kBAAmB,MAAM,EAC/DppC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAGmqC,GAAwB,UAAW,YAAa,MAAM,EACzDppC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAGmqC,GAAwB,UAAW,YAAa,MAAM,EAIlD,MAAMG,WAAqBvvC,EAAY,CAC1C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,KAAO,GACZ,KAAK,YAAc,GAInB,KAAK,aAAe,IAAI,GAC3B,CACD,WAAW8tC,EAAO,CACd,UAAW9Q,KAAU,KAAK,aAAa,OAAM,EACzC,GAAIA,EAAO,WAAW8Q,CAAK,EACvB,MAAO,GAGf,MAAO,EACV,CACL,CACA9nC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGksC,GAAa,UAAW,OAAQ,MAAM,EACzCvpC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGksC,GAAa,UAAW,cAAe,MAAM,EAChDvpC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAImH,GAAayrC,EAAmB,CAAC,CAAE,EACxD5yC,EAAM,CACF,QAAS,IAAI0I,GAAWR,EAAe0qC,EAAmB,EAC1D,QAAS,IACT,QAAUjP,GAAQ,CACd,MAAM76B,EAAM,IAAI,IAChB,UAAW+4B,KAAU8B,EACjB76B,EAAI,IAAI+4B,EAAO,SAAS,GAAIA,CAAM,EAEtC,OAAO/4B,CACV,CACT,CAAK,CACL,EAAGsrC,GAAa,UAAW,eAAgB,MAAM,SAC1C,cAAuBvvC,EAAY,CACtC,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,OAAS,KACd,KAAK,OAAS6uC,GAAe,MAC7B,KAAK,KAAOU,GAAa,OAAO,CAAE,GAClC,KAAK,UAAY,IAAI,KACrB,KAAK,UAAY,IAAI,KACrB,KAAK,SAAW,KAChB,KAAK,eAAiB,IACzB,CACD,WAAWzB,EAAO,CACd,OAAO,KAAK,KAAK,WAAWA,CAAK,CACpC,CACD,gBAAgBoB,EAAS,CACrB,MAAO,EACV,CACD,kBAAmB,CACf,OAAO,KAAK,KAAK,YACpB,CACD,mBAAmBvxC,EAAO,CACtB,OAAO,KAAK,MAAM,CACd,KAAM4xC,GAAa,MAAM,CACrB,aAAc5xC,CAC9B,CAAa,CACb,CAAS,CACJ,CACD,gBAAgBs8B,EAAQ,CACpB,GAAI,CAEA,OADuBiT,GAAwBjT,EAAQuT,EAA+B,EAChE,IAAI,CAC7B,OACMlyC,EAAG,CACN,QAAQ,MAAM,+BAAgCA,EAAG2+B,CAAM,CAC1D,CACD,MAAO,EACV,CACL,EACAj0B,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAGo0C,GAAS,UAAW,KAAM,MAAM,EACnCxpC,EAAW,CACP7K,EAAM,CAAE,QAASgI,GAAe,SAAU,GAAM,QAAS,IAAK,CAClE,EAAGqsC,GAAS,UAAW,SAAU,MAAM,EACvCxpC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0H,GAAYgsC,EAAc,CAAC,CAAE,CACtD,EAAGW,GAAS,UAAW,SAAU,MAAM,EACvCxpC,EAAW,CACP7K,EAAM,CAAE,QAASo0C,GAAc,CACnC,EAAGC,GAAS,UAAW,OAAQ,MAAM,EACrCxpC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAGuqC,GAAS,UAAW,YAAa,MAAM,EAC1CxpC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAGuqC,GAAS,UAAW,YAAa,MAAM,EAC1CxpC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAGmsC,GAAS,UAAW,WAAY,MAAM,EACzCxpC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAGmsC,GAAS,UAAW,iBAAkB,MAAM,EAC/CxpC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,CACpC,EAAGmsC,GAAS,UAAW,aAAc,MAAM,EC5YpC,IAAIC,IACV,SAAUA,EAAyB,CAChCA,EAAwB,MAAW,QACnCA,EAAwB,QAAa,UACrCA,EAAwB,SAAc,WACtCA,EAAwB,kBAAuB,oBAC/CA,EAAwB,SAAc,UAC1C,GAAGA,KAA4BA,GAA0B,CAAE,EAAC,EACrD,MAAMC,EAA8B,CACvC,OAAO,QAAQ1L,EAAQ,CACnB,OAAQA,EAAM,CACV,KAAKyL,GAAwB,MACzB,OAAO,GAAG,sCAAsC,EACpD,KAAKA,GAAwB,QACzB,OAAO,GAAG,sCAAsC,EACpD,KAAKA,GAAwB,SACzB,OAAO,GAAG,sCAAsC,EACpD,KAAKA,GAAwB,kBACzB,OAAO,GAAG,uBAAuB,EACrC,KAAKA,GAAwB,SACzB,OAAO,GAAG,sCAAsC,CACvD,CACJ,CACL,CClBO,IAAIE,IACV,SAAUA,EAAe,CAEtBA,EAAc,cAAmB,gBAEjCA,EAAc,QAAa,UAE3BA,EAAc,SAAc,WAE5BA,EAAc,cAAmB,gBACjCA,EAAc,aAAkB,eAChCA,EAAc,cAAmB,eACrC,GAAGA,KAAkBA,GAAgB,CAAE,EAAC,EACjC,MAAMC,EAAoB,CAC7B,OAAO,QAAQ9jC,EAAM,CACjB,OAAQA,EAAI,CACR,KAAK6jC,GAAc,cAAe,MAAO,yCACzC,KAAKA,GAAc,QACf,MAAO,8BAEX,KAAKA,GAAc,SACf,MAAO,uCAEX,KAAKA,GAAc,cACf,MAAO,kCAEX,KAAKA,GAAc,aAAc,MAAO,0BACxC,KAAKA,GAAc,cAAe,MAAO,eAC5C,CACJ,CACL,CACO,IAAIE,IACV,SAAUA,EAAe,CACtBA,EAAc,MAAW,QAKzBA,EAAc,QAAa,UAI3BA,EAAc,UAAe,WACjC,GAAGA,KAAkBA,GAAgB,CAAE,EAAC,EACjC,MAAMC,WAAsB9vC,EAAY,CAC3C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,YAAc6vC,GAAc,MACjC,KAAK,UAAY,EAEjB,KAAK,WAAa,EAElB,KAAK,UAAY,EAIjB,KAAK,cAAgB,EAIrB,KAAK,UAAY,GAIjB,KAAK,WAAa,GAIlB,KAAK,mBAAqB,KAC1B,KAAK,mBAAqB,EAC1B,KAAK,cAAgB,EACxB,CACD,IAAI,MAAO,CACP,OAAOD,GAAoB,QAAQ,KAAK,IAAI,CAC/C,CACL,CACA5pC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,SAAU,EAAI,CAAE,CACpD,EAAGysC,GAAc,UAAW,aAAc,MAAM,EAChD9pC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0H,GAAY8sC,EAAa,CAAC,CAAE,CACrD,EAAGG,GAAc,UAAW,OAAQ,MAAM,EAC1C9pC,EAAW,CACP7K,EAAM,CAAE,QAAS,IAAI0H,GAAYgtC,EAAa,CAAC,CAAE,CACrD,EAAGC,GAAc,UAAW,cAAe,MAAM,EACjD9pC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,CACrC,EAAG+sC,GAAc,UAAW,YAAa,MAAM,EAC/C9pC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,CACrC,EAAG+sC,GAAc,UAAW,aAAc,MAAM,EAChD9pC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,CACrC,EAAG+sC,GAAc,UAAW,YAAa,MAAM,EAC/C9pC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,CACrC,EAAG+sC,GAAc,UAAW,gBAAiB,MAAM,EACnD9pC,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,CACrC,EAAGmtC,GAAc,UAAW,YAAa,MAAM,EAC/C9pC,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,CACrC,EAAGmtC,GAAc,UAAW,aAAc,MAAM,EAChD9pC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,EAAI,CAAE,CAClD,EAAG6qC,GAAc,UAAW,qBAAsB,MAAM,EACxD9pC,EAAW,CACP7K,EAAM,CAAE,QAAS4H,GAAgB,CACrC,EAAG+sC,GAAc,UAAW,qBAAsB,MAAM,EACxD9pC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAG6qC,GAAc,UAAW,YAAa,MAAM,EAC/C9pC,EAAW,CACP7K,EAAM,CAAE,QAASwH,GAAgB,CACrC,EAAGmtC,GAAc,UAAW,gBAAiB,MAAM,EAI5C,MAAMC,WAAkB/vC,EAAY,CACvC,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,UAAY,IAAI,KACrB,KAAK,UAAY,IAAI,KAKrB,KAAK,QAAU,KACf,KAAK,WAAa,KAElB,KAAK,SAAW,IACnB,CACD,iBAAkB,CAId,GAHI,CAAC,KAAK,KAAK,YAAc,KAAK,aAAe,MAG7C,KAAK,KAAK,UAAY,IAAI,KAE1B,MAAO,GAGX,MAAMgwC,EAAa,IAAI,KAAK,KAAK,UAAU,EAE3C,OADAA,EAAW,QAAQA,EAAW,QAAO,EAAK,GAAK,CAAC,EAC5CA,EAAa,IAAI,IAIxB,CACD,IAAI,QAAS,CACT,OAAOC,GAAgB,OAAO,CAC1B,UAAW,KAAK,KAAK,UACrB,WAAY,KAAK,WACjB,SAAU,KAAK,SACf,mBAAoB,KAAK,KAAK,kBAC1C,CAAS,CACJ,CACL,CACAjqC,EAAW,CACP7K,EAAM,CAAE,QAASkI,EAAe,aAAc,IAAMjI,GAAM,EAAI,CAClE,EAAG20C,GAAU,UAAW,KAAM,MAAM,EACpC/pC,EAAW,CACP7K,EAAM,CAAE,QAAS20C,GAAe,CACpC,EAAGC,GAAU,UAAW,OAAQ,MAAM,EACtC/pC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAG8qC,GAAU,UAAW,YAAa,MAAM,EAC3C/pC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAG8qC,GAAU,UAAW,YAAa,MAAM,EAC3C/pC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,EAAI,CAAE,CAClD,EAAG8qC,GAAU,UAAW,UAAW,MAAM,EACzC/pC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,EAAI,CAAE,CAClD,EAAG8qC,GAAU,UAAW,aAAc,MAAM,EAC5C/pC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,EAAI,CAAE,CAClD,EAAG8qC,GAAU,UAAW,WAAY,MAAM,EACnC,MAAME,WAAwBjwC,EAAY,CAC7C,aAAc,CACV,MAAM,GAAG,SAAS,EAClB,KAAK,WAAa,KAElB,KAAK,SAAW,KAChB,KAAK,mBAAqB,IAC7B,CACD,IAAI,UAAW,CACX,MAAMjB,EAAI,IAAI,KAQd,GANI,KAAK,WAAa,KAAK,UAAY,IAAI,KAAKA,EAAE,QAAO,EAAK,GAAK,GAAI,GAGnE,KAAK,UAAY,KAAK,SAAWA,GAGjC,KAAK,YAAc,KAAK,WAAaA,EACrC,MAAO,GAGX,MAAMmxC,EAAS,IAAI,KAEnB,OADAA,EAAO,QAAQA,EAAO,QAAS,EAAG,EAAE,EAChC,OAAK,oBAAsB,KAAK,mBAAqBA,EAI5D,CAID,IAAI,WAAY,CACZ,GAAI,KAAK,SACL,MAAO,GAEX,MAAMnxC,EAAI,IAAI,KAEd,GAAI,KAAK,WAAa,KAAK,UAAY,IAAI,KAAKA,EAAE,QAAO,EAAK,GAAK,GAAI,EACnE,MAAO,GAKX,GAAI,KAAK,YAAc,KAAK,WAAaA,EAErC,MAAO,GAGX,MAAMmxC,EAAS,IAAI,KAEnB,OADAA,EAAO,QAAQA,EAAO,QAAS,EAAG,EAAE,EAChC,QAAK,oBAAsB,KAAK,mBAAqBA,EAK5D,CACD,IAAI,gBAAiB,CACjB,MAAMC,EAAQ,GAOd,GANI,KAAK,WAAa,MAClBA,EAAM,KAAK,KAAK,QAAQ,EAExB,KAAK,aAAe,MACpBA,EAAM,KAAK,KAAK,UAAU,EAE1B,KAAK,qBAAuB,KAAM,CAClC,MAAMD,EAAS,IAAI,KAAK,KAAK,kBAAkB,EAC/CA,EAAO,QAAQA,EAAO,QAAS,EAAG,EAAE,EACpCC,EAAM,KAAKD,CAAM,CACpB,CACD,OAAIC,EAAM,SAAW,EACV,KAEJ,IAAI,KAAK,KAAK,IAAI,GAAGA,EAAM,IAAIpxC,GAAKA,EAAE,QAAS,EAAC,CAAC,CAC3D,CACD,MAAMilC,EAAQ,CACNA,EAAO,UAAY,KAAK,YACxB,KAAK,UAAYA,EAAO,WAGxBA,EAAO,aAAe,KACtB,KAAK,WAAa,KAEb,KAAK,aAAe,MACrBA,EAAO,WAAa,KAAK,aACzB,KAAK,WAAaA,EAAO,YAG7BA,EAAO,WAAa,KACpB,KAAK,SAAW,KAEX,KAAK,WAAa,MACnBA,EAAO,SAAW,KAAK,WACvB,KAAK,SAAWA,EAAO,UAG3B,KAAK,qBAAuB,KAC5B,KAAK,mBAAqBA,EAAO,mBAE5BA,EAAO,qBAAuB,MAC/BA,EAAO,mBAAqB,KAAK,qBACjC,KAAK,mBAAqBA,EAAO,mBAG5C,CACL,CACAh+B,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,CAClC,EAAGgrC,GAAgB,UAAW,YAAa,MAAM,EACjDjqC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,EAAI,CAAE,CAClD,EAAGgrC,GAAgB,UAAW,aAAc,MAAM,EAClDjqC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,EAAI,CAAE,CAClD,EAAGgrC,GAAgB,UAAW,WAAY,MAAM,EAChDjqC,EAAW,CACP7K,EAAM,CAAE,QAAS8J,GAAa,SAAU,EAAI,CAAE,CAClD,EAAGgrC,GAAgB,UAAW,qBAAsB,MAAM,EC3ShD,IAACG,IACV,SAAUA,EAAwB,CAC/BA,EAAuB,MAAW,QAClCA,EAAuB,UAAe,YACtCA,EAAuB,SAAc,WACrCA,EAAuB,WAAgB,YAC3C,GAAGA,KAA2BA,GAAyB,GAAG,ECNnD,IAAIC,IACV,SAAUA,EAAsB,CAC7BA,EAAqB,eAAoB,iBACzCA,EAAqB,yBAA8B,2BACnDA,EAAqB,IAAS,MAC9BA,EAAqB,IAAS,MAC9BA,EAAqB,IAAS,kBAC9BA,EAAqB,eAAoB,iBACzCA,EAAqB,IAAS,MAC9BA,EAAqB,MAAW,OACpC,GAAGA,KAAyBA,GAAuB,CAAE,EAAC,EAC/C,MAAMC,EAA2B,CACpC,OAAO,QAAQC,EAAsB,CACjC,OAAQA,EAAoB,CACxB,KAAKF,GAAqB,eAAgB,MAAO,wBACjD,KAAKA,GAAqB,yBAA0B,MAAO,6BAC3D,KAAKA,GAAqB,IAAK,MAAO,MACtC,KAAKA,GAAqB,IAAK,MAAO,MACtC,KAAKA,GAAqB,IAAK,MAAO,oBACtC,KAAKA,GAAqB,eAAgB,MAAO,mBACjD,KAAKA,GAAqB,IAAK,MAAO,MACtC,KAAKA,GAAqB,MAAO,MAAO,eAC3C,CACJ,CACD,OAAO,SAAU,CACb,MAAMxW,EAAO,OAAO,OAAOwW,EAAoB,EACzCG,EAAK,GACX,UAAW3yC,KAAQg8B,EACf2W,EAAG,KAAK,CACJ,KAAM,KAAK,QAAQ3yC,CAAI,EACvB,MAAOA,CACvB,CAAa,EAEL,OAAO2yC,CACV,CACL,CCjCU,IAACC,IACV,SAAUA,EAAkB,CACzBA,EAAiB,MAAW,QAC5BA,EAAiB,SAAc,WAC/BA,EAAiB,OAAY,SAC7BA,EAAiB,KAAU,OAC3BA,EAAiB,UAAe,YAChCA,EAAiB,UAAe,YAChCA,EAAiB,OAAY,SAC7BA,EAAiB,QAAa,UAC9BA,EAAiB,SAAc,WAC/BA,EAAiB,MAAW,QAC5BA,EAAiB,WAAgB,aACjCA,EAAiB,WAAgB,aACjCA,EAAiB,KAAU,OAC3BA,EAAiB,MAAW,QAC5BA,EAAiB,OAAY,SAC7BA,EAAiB,QAAa,UAC9BA,EAAiB,YAAiB,cAClCA,EAAiB,aAAkB,eACnCA,EAAiB,OAAY,SAC7BA,EAAiB,MAAW,QAC5BA,EAAiB,aAAkB,eACnCA,EAAiB,IAAS,MAC1BA,EAAiB,QAAa,UAC9BA,EAAiB,MAAW,QAC5BA,EAAiB,SAAc,WAC/BA,EAAiB,MAAW,QAC5BA,EAAiB,MAAW,OAChC,GAAGA,KAAqBA,GAAmB,CAAE,EAAC,EACvC,MAAMC,EAAuB,CAChC,OAAO,QAAQ5kC,EAAM,CACjB,IAAInR,EAAIG,EAER,OAAQA,GAAMH,EADJ,KAAK,UACM,KAAK6H,GAAKA,EAAE,QAAUsJ,CAAI,KAAO,MAAQnR,IAAO,OAAS,OAASA,EAAG,QAAU,MAAQG,IAAO,OAASA,EAAKgR,EAAK,SAAQ,CACjJ,CACD,OAAO,SAAU,CACb,MAAO,CACH,CACI,MAAO2kC,GAAiB,MACxB,KAAM,eACT,EACD,CACI,MAAOA,GAAiB,SACxB,KAAM,SACT,EACD,CACI,MAAOA,GAAiB,OACxB,KAAM,QACT,EACD,CACI,MAAOA,GAAiB,KACxB,KAAM,MACT,EACD,CACI,MAAOA,GAAiB,UACxB,KAAM,UACT,EACD,CACI,MAAOA,GAAiB,UACxB,KAAM,WACT,EACD,CACI,MAAOA,GAAiB,OACxB,KAAM,QACT,EACD,CACI,MAAOA,GAAiB,QACxB,KAAM,YACT,EACD,CACI,MAAOA,GAAiB,SACxB,KAAM,SACT,EACD,CACI,MAAOA,GAAiB,MACxB,KAAM,MACT,EACD,CACI,MAAOA,GAAiB,WACxB,KAAM,WACT,EACD,CACI,MAAOA,GAAiB,WACxB,KAAM,WACT,EACD,CACI,MAAOA,GAAiB,KACxB,KAAM,YACT,EACD,CACI,MAAOA,GAAiB,MACxB,KAAM,cACT,EACD,CACI,MAAOA,GAAiB,QACxB,KAAM,qBACT,EACD,CACI,MAAOA,GAAiB,YACxB,KAAM,cACT,EACD,CACI,MAAOA,GAAiB,aACxB,KAAM,iBACT,EACD,CACI,MAAOA,GAAiB,OACxB,KAAM,kBACT,EACD,CACI,MAAOA,GAAiB,MACxB,KAAM,kBACT,EACD,CACI,MAAOA,GAAiB,aACxB,KAAM,mBACT,EACD,CACI,MAAOA,GAAiB,IACxB,KAAM,iBACT,EACD,CACI,MAAOA,GAAiB,QACxB,KAAM,SACT,EACD,CACI,MAAOA,GAAiB,MACxB,KAAM,QACT,EACD,CACI,MAAOA,GAAiB,SACxB,KAAM,UACT,EACD,CACI,MAAOA,GAAiB,MACxB,KAAM,SACT,EACD,CACI,MAAOA,GAAiB,OACxB,KAAM,QACT,EACD,CACI,MAAOA,GAAiB,MACxB,KAAM,QACT,CACb,CACK,CACD,OAAO,YAAY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","names":["byteToHex","i","unsafeStringify","arr","offset","getRandomValues","rnds8","rng","randomUUID","native","v4","options","buf","rnds","SimpleError","error","_a","context","data","_b","_c","code","prefix","fields","field","uuidv4","isSimpleError","e","isSimpleErrors","SimpleErrors","errors","index","_AppManager","$context","filename","saveAs","__vitePreload","__vite_default__","n","version","build","userAgent","AppManager","isCloneable","object","cloneObject","obj","encodedObj","key","value","k","hasId","val","getId","getOptionalId","isMove","isPut","isDelete","isPatch","PatchableArray","changes","cloned","other","change","patch","after","item","construct","newCurrentChanges","id","otherPut","isPatchable","otherPatch","array","newArray","afterIndex","encodeObject","p","PatchableArrayItemDecoder","putDecoder","patchDecoder","idDecoder","put","move","d","PatchableArrayDecoder","PatchOrPutDecoder","deepSetArray","oldArr","oldArray","newItem","isAutoEncoder","oldItem","coalesceUndefined","values","Field","upg","oldValue","dwn","newValue","aDecoder","AutoEncoder","CreatedPatch","instance","prop","patchObject","compare","a","b","latestFields","sortObjectKeysForEncoding","property","model","source","isPatchableArray","isPatchMap","_d","isRef","idField","f","stringOrNumber","classReferences","reference","appliedProperties","fieldData","from","to","didCopy","older","patchContainsChanges","patched","PatchMap","clone","original","isEncodeable","queue","keys","StringOrNumberDecoder","StringOrNumberDecoder$1","ArrayDecoder","decoder","v","elementDecoder","idFieldType","BooleanDecoder","BooleanDecoder$1","EnumDecoder","str","IntegerDecoder","parsed","IntegerDecoder$1","NullableDecoder","NumberDecoder","NumberDecoder$1","StringDecoder","StringDecoder$1","ObjectData","currentField","number","set","AnyDecoder","AnyDecoder$1","MapDecoder","keyDecoder","valueDecoder","PatchMapDecoder","map","keyDecoded","valueDecoded","container","EmailDecoderStatic","EmailDecoder","RecordDecoder","SymbolDecoder","s","settings","target","_e","_f","EncodeMedium","VersionBox","VersionBoxDecoder","DateDecoder","DateDecoder$1","URLDecoder","Version","PermissionLevel","getPermissionLevelNumber","level","l","maximumPermissionlevel","levels","max","getPermissionLevelName","AccessRight","AccessRightHelper","right","__decorate","decorators","desc","c","r","Colors","hex","result","define_STAMHOOFD_default","g","min","h","x","m","color","aRgbHex","foreground","background","L1","L2","R","G","B","rgb","blackContrast","whiteContrast","luminance","y","backgroundLuminance","foregroundLuminance","contrast","loConFactor","loConOffset","absContrast","scaledContrast","LuxonError","InvalidDateTimeError","reason","InvalidIntervalError","InvalidDurationError","ConflictingSpecificationError","InvalidUnitError","unit","InvalidArgumentError","ZoneIsAbstractError","DATE_SHORT","DATE_MED","DATE_MED_WITH_WEEKDAY","DATE_FULL","DATE_HUGE","TIME_SIMPLE","TIME_WITH_SECONDS","TIME_WITH_SHORT_OFFSET","TIME_WITH_LONG_OFFSET","TIME_24_SIMPLE","TIME_24_WITH_SECONDS","TIME_24_WITH_SHORT_OFFSET","TIME_24_WITH_LONG_OFFSET","DATETIME_SHORT","DATETIME_SHORT_WITH_SECONDS","DATETIME_MED","DATETIME_MED_WITH_SECONDS","DATETIME_MED_WITH_WEEKDAY","DATETIME_FULL","DATETIME_FULL_WITH_SECONDS","DATETIME_HUGE","DATETIME_HUGE_WITH_SECONDS","Zone","ts","opts","format","otherZone","singleton","SystemZone","locale","parseZoneInfo","formatOffset","dtfCache","makeDTF","zone","typeToPos","hackyOffset","dtf","date","formatted","fMonth","fDay","fYear","fadOrBc","fHour","fMinute","fSecond","partsOffset","filled","type","pos","isUndefined","ianaZoneCache","IANAZone","name","year","month","day","adOrBc","hour","minute","second","asUTC","objToLocalTS","asTS","over","intlLFCache","getCachedLF","locString","intlDTCache","getCachedDTF","intlNumCache","getCachedINF","inf","intlRelCache","getCachedRTF","base","cacheKeyOpts","sysLocaleCache","systemLocale","weekInfoCache","getCachedWeekInfo","parseLocaleString","localeStr","xIndex","uIndex","selectedStr","smaller","numberingSystem","calendar","intlConfigString","outputCalendar","mapMonths","ms","dt","DateTime","mapWeekdays","listStuff","loc","length","englishFn","intlFn","mode","supportsFastNumbers","PolyNumberFormatter","intl","forceSimple","padTo","floor","otherOpts","intlOpts","fixed","roundTo","padStart","PolyDateFormatter","z","gmtOffset","offsetZ","parts","part","offsetName","PolyRelFormatter","isEnglish","hasRelative","count","English.formatRelativeTime","fallbackWeekSettings","Locale","weekSettings","defaultToEN","specifiedLocale","Settings","localeR","numberingSystemR","outputCalendarR","weekSettingsR","validateWeekSettings","numbering","parsedLocale","parsedNumberingSystem","parsedOutputCalendar","isActuallyEn","hasNoWeirdness","alts","English.months","formatStr","English.weekdays","English.meridiems","English.eras","df","results","matching","hasLocaleWeekInfo","FixedOffsetZone","signedOffset","InvalidZone","zoneName","normalizeZone","input","defaultZone","isString","lowered","isNumber","now","defaultLocale","defaultNumberingSystem","defaultOutputCalendar","twoDigitCutoffYear","throwOnInvalid","defaultWeekSettings","cutoffYear","t","Invalid","explanation","nonLeapLadder","leapLadder","unitOutOfRange","dayOfWeek","js","computeOrdinal","isLeapYear","uncomputeOrdinal","ordinal","table","month0","isoWeekdayToLocal","isoWeekday","startOfWeek","gregorianToWeek","gregObj","minDaysInFirstWeek","weekday","weekNumber","weekYear","weeksInWeekYear","timeObject","weekToGregorian","weekData","weekdayOfJan4","yearInDays","daysInYear","gregorianToOrdinal","gregData","ordinalToGregorian","ordinalData","usesLocalWeekValues","hasInvalidWeekData","validYear","isInteger","validWeek","integerBetween","validWeekday","hasInvalidOrdinalData","validOrdinal","hasInvalidGregorianData","validMonth","validDay","daysInMonth","hasInvalidTimeData","millisecond","validHour","validMinute","validSecond","validMillisecond","o","isDate","maybeArray","thing","bestBy","by","best","next","pair","pick","hasOwnProperty","bottom","top","floorMod","isNeg","padded","parseInteger","string","parseFloating","parseMillis","fraction","digits","towardZero","factor","modMonth","modYear","firstWeekOffset","weekOffset","weekOffsetNext","untruncateYear","offsetFormat","timeZone","modified","offHourStr","offMinuteStr","offHour","offMin","offMinSigned","asNumber","numericValue","normalizeObject","normalizer","normalized","u","hours","minutes","sign","monthsLong","monthsShort","monthsNarrow","months","weekdaysLong","weekdaysShort","weekdaysNarrow","weekdays","meridiems","erasLong","erasShort","erasNarrow","eras","meridiemForDateTime","weekdayForDateTime","monthForDateTime","eraForDateTime","formatRelativeTime","numeric","narrow","units","lastable","isDay","isInPast","fmtValue","singular","lilUnits","fmtUnit","stringifyTokens","splits","tokenToString","token","macroTokenToFormatOpts","Formats.DATE_SHORT","Formats.DATE_MED","Formats.DATE_FULL","Formats.DATE_HUGE","Formats.TIME_SIMPLE","Formats.TIME_WITH_SECONDS","Formats.TIME_WITH_SHORT_OFFSET","Formats.TIME_WITH_LONG_OFFSET","Formats.TIME_24_SIMPLE","Formats.TIME_24_WITH_SECONDS","Formats.TIME_24_WITH_SHORT_OFFSET","Formats.TIME_24_WITH_LONG_OFFSET","Formats.DATETIME_SHORT","Formats.DATETIME_MED","Formats.DATETIME_FULL","Formats.DATETIME_HUGE","Formats.DATETIME_SHORT_WITH_SECONDS","Formats.DATETIME_MED_WITH_SECONDS","Formats.DATETIME_FULL_WITH_SECONDS","Formats.DATETIME_HUGE_WITH_SECONDS","Formatter$1","Formatter","fmt","current","currentFull","bracketed","formatOpts","interval","knownEnglish","useDateTimeFormatter","extract","meridiem","English.meridiemForDateTime","standalone","English.monthForDateTime","English.weekdayForDateTime","maybeMacro","era","English.eraForDateTime","dur","tokenToField","lildur","mapped","tokens","realTokens","found","literal","collapsed","ianaRegex","combineRegexes","regexes","full","combineExtractors","extractors","mergedVals","mergedZone","cursor","ex","parse","patterns","regex","extractor","simpleParse","match","ret","offsetRegex","isoExtendedZone","isoTimeBaseRegex","isoTimeRegex","isoTimeExtensionRegex","isoYmdRegex","isoWeekRegex","isoOrdinalRegex","extractISOWeekData","extractISOOrdinalData","sqlYmdRegex","sqlTimeRegex","sqlTimeExtensionRegex","int","fallback","extractISOYmd","extractISOTime","extractISOOffset","local","fullOffset","extractIANAZone","isoTimeOnly","isoDuration","extractISODuration","yearStr","monthStr","weekStr","dayStr","hourStr","minuteStr","secondStr","millisecondsStr","hasNegativePrefix","negativeSeconds","maybeNegate","num","force","obsOffsets","fromStrings","weekdayStr","English.monthsShort","English.weekdaysLong","English.weekdaysShort","rfc2822","extractRFC2822","obsOffset","milOffset","preprocessRFC2822","rfc1123","rfc850","ascii","extractRFC1123Or850","extractASCII","isoYmdWithTimeExtensionRegex","isoWeekWithTimeExtensionRegex","isoOrdinalWithTimeExtensionRegex","isoTimeCombinedRegex","extractISOYmdTimeAndOffset","extractISOWeekTimeAndOffset","extractISOOrdinalDateAndTime","extractISOTimeAndOffset","parseISODate","parseRFC2822Date","parseHTTPDate","parseISODuration","extractISOTimeOnly","parseISOTimeOnly","sqlYmdWithTimeExtensionRegex","sqlTimeCombinedRegex","extractISOTimeOffsetAndIANAZone","parseSQL","INVALID","lowOrderMatrix","casualMatrix","daysInYearAccurate","daysInMonthAccurate","accurateMatrix","orderedUnits","reverseUnits","clear","conf","Duration","durationToMillis","matrix","vals","sum","normalizeValues","previous","previousVal","conv","rollUp","removeZeroes","newVals","config","accurate","durationLike","text","invalid","fmtOpts","millis","duration","fn","mixed","conversionAccuracy","built","accumulated","lastUnit","own","ak","negated","eq","v1","v2","validateStartEnd","start","end","Interval","builtStart","friendlyDateTime","builtEnd","validateError","startIsValid","endIsValid","dateTime","dateTimes","sorted","added","idx","numberOfParts","intervals","final","sofar","currentCount","ends","flattened","dateFormat","separator","mapFn","Info","proto","locObj","dayDiff","earlier","later","utcDayStart","highOrderDiffs","differs","days","lowestOrder","highWater","differ","diff","remainingMillis","lowerOrderUnits","numberingSystems","numberingSystemsUTF16","hanidecChars","parseDigits","digitRegex","append","MISSING_FTP","intUnit","post","NBSP","spaceOrNBSP","spaceOrNBSPRegExp","fixListRegex","stripInsensitivities","oneOf","strings","startIndex","groups","simple","escapeToken","unitForToken","one","two","three","four","six","oneOrTwo","oneToThree","oneToSix","oneToNine","twoToFour","fourToSix","partTypeStyleToTokenVal","tokenForPart","resolvedOpts","isSpace","style","actualType","buildRegex","handlers","matches","all","matchIndex","dateTimeFromMatches","toField","specificOffset","dummyDateTimeCache","getDummyDateTime","maybeExpandMacroToken","formatOptsToTokens","expandMacroTokens","explainFromTokens","disqualifyingUnit","regexString","rawMatches","parseFromTokens","invalidReason","MAX_DATE","unsupportedZone","possiblyCachedWeekData","possiblyCachedLocalWeekData","inst","fixOffset","localTS","tz","utcGuess","o2","o3","tsToObj","objToTS","adjustTime","oPre","millisToAdd","parseDataToDateTime","parsedZone","setZone","interpretationZone","toTechFormat","allowZ","toISODate","extended","longFormat","toISOTime","suppressSeconds","suppressMilliseconds","includeOffset","extendedZone","defaultUnitValues","defaultWeekUnitValues","defaultOrdinalUnitValues","orderedWeekUnits","orderedOrdinalUnits","normalizeUnit","normalizeUnitWithLocalWeeks","quickDT","tsNow","offsetProvis","diffRelative","round","lastOpts","argList","args","ot","zoneToUse","milliseconds","seconds","containsOrdinal","containsGregorYear","containsGregorMD","containsGregor","definiteWeekDef","useWeekData","defaultValues","objNow","foundFirst","higherOrderInvalid","gregorian","tsFinal","offsetFinal","localeToUse","localeOpts","tokenList","dayMs","minuteMs","oEarlier","oLater","o1","ts1","ts2","c1","c2","keepLocalTime","keepCalendarTime","newTS","offsetGuess","asObj","settingWeekStuff","useLocaleWeeks","normalizedUnit","q","ext","includePrefix","includeZone","includeOffsetSpace","otherDateTime","durOpts","otherIsLater","diffed","inputMs","adjustedToZone","padding","Formats.DATE_MED_WITH_WEEKDAY","Formats.DATETIME_MED_WITH_WEEKDAY","dateTimeish","Sorter","af","bf","enumObject","sortResults","counts","element","maxCount","mostOccuringElement","spaceLength","spaceChar","maxInt","hash","char","monthNames","datetime","withYear","currentYear","weeks","dividable","hideZero","timezone","startDate","includeDay","includeTime","endDate","join","differentYear","startDatetime","endDatetime","onlyUnique","self","removeZeroDecimals","bytes","unsafe","lastSeparator","last","plural","names","firstNames","lastNames","maxLength","DataValidator","blockList","trimmed","toCheck","checksum","realChecksum","realChecksum2","birthDay","generated","sleep","resolve","StringCompare","haystack","needle","minimumPercentage","minimumChars","overlap","left","allowSplit","firstLeft","firstRight","compareWith","throttle","func","limit","lastFunc","lastRan","Country","countryToCode","country","defaultCountryCode","CountryDecoder","CountryHelper","Address","currentCountry","addressLine1","postalCode","city","street","firstFour","remaining","address","ValidatedAddress","Province","City","Premise","SearchRegions","Company","wordDictionary","AuditLogReplacementDependencies","AuditLogReplacementType","AuditLogReplacement","cleanedValues","add","title","getAuditLogPatchKeyName","stripPrefixes","helper","splitted","firstTwoWords","firstWord","SortItemDirection","encodeSortList","sort","SortListDecoder","list","sub","direction","StamhoofdFilterJSONDecoder","filter","StamhoofdFilterDecoder","decoded","CountResponse","CountFilteredRequest","LimitedFilteredRequest","FilterWrapperMarker","isEmptyFilter","mergeFilters","filters","filteredFilters","assertSort","assert","isEqualFilter","wrapFilter","wrap","w","unwrapFilter","pendingMarkerValue","same","leftOver","filterValue","wrapValue","leftOverKeys","unwrapFilterByPath","keyPath","first","PropertyFilter","enabledWhen","requiredWhen","GroupType","ResolutionFit","ResolutionRequest","RecordType","FileType","getRecordTypeName","RecordWarningType","RecordWarning","warning1","warning2","priority1","priority2","RecordChoice","BaseRecordSettings","RecordSettings","answers","requiredCategory","answer","RecordCategory","record","outdatedTime","records","ignoreFilter","filterOptions","levelNumber","categories","category","cat","cat2","cc","updatedRecords","filteredCategories","_","AskRequirement","FreeContributionSettings","FinancialSupportSettings","DataPermissionsSettings","OrganizationRecordsConfiguration","platformConfig","organizationConfig","defaultGroupConfig","groupConfig","defaultAgeGroupId","configs","parent","child","inheritedFilter","old","DefaultAgeGroup","tags","organizationTags","tagId","File","_g","_h","file","Resolution","width","height","bestResolution","ratio","resolution","Image","GroupGenderType","PermissionsResourceType","getPermissionResourceTypeName","ResourcePermissions","gl","resourceId","roleOrPermissions","rights","stack","resourceDescription","resource","accessRights","resources","allDescription","suffix","countsPer","description","firstName","PermissionRole","PermissionRoleDetailed","autoInherit","rInstance","allInstance","resourcesEmpty","PermissionRoleForResponsibility","PermissionsByRole","role","GroupPrivateSettings","OldGroupPrice","OldGroupPrices","reduced","alreadyRegisteredCount","price","RegistrationPeriodBase","StockReservation","amount","reservation","existingIndex","existing","remove","newReservations","ReduceablePrice","isReduced","member","GroupPrice","group","groupStockReservations","stock","Group","GroupOption","GroupOptionMenu","WaitingListType","CycleInformation","GroupDefaultEventTime","GroupSettings","foundPrice","includeAge","includeGender","who","waitingList","d2","Gender","getGenderName","gender","GroupStatus","getGroupStatusName","status","preRegistrationDate","recursive","parents","hisParents","pp","permissions","allCategories","permissionLevel","parentCategories","recommendOrganizationId","requirePlatformMembershipOn","EmailInformation","Replacement","Recipient","recipient","replacement","replacements","EmailAttachment","EmailRequest","EventNotificationDeadline","EventNotificationType","LoginMethod","LoginMethodConfig","email","emailDomain","blocked","allowed","MemberResponsibility","groupId","OrganizationEmail","OrganizationLevelRecordsConfiguration","organization","GroupCategoryPermissions","GroupCategorySettings","GroupCategory","filteredAll","GroupCategoryTree","root","organizationPeriod","maxDepth","smartCombine","keep","filtered","admin","useActivities","SetupStepReview","SetupStepType","getSetupStepName","step","SetupStep","isDone","isReviewed","userId","userName","finishedSteps","totalSteps","SetupSteps","total","stepType","RegistrationPeriodSettings","RegistrationPeriod","OrganizationRegistrationPeriodSettings","OrganizationRegistrationPeriod","tree","usedGroups","newPeriod","groupMap","categoryMap","newOrganizationPeriod","yearDifference","newGroup","newCategory","categoryId","RegistrationPeriodList","RichText","PlatformPrivateConfig","OrganizationTagType","getOrganizationTagTypeName","getOrganizationTagTypePluralName","OrganizationTag","allTags","childTag","PlatformPremiseType","PlatformMembershipTypeConfigPrice","tagIds","shouldApplyReducedPrice","priceForMember","basePrice","PlatformMembershipTypeConfig","priceConfig","PlatformMembershipTypeBehaviour","PlatformMembershipType","periodId","period","defaultAgeGroupIds","requiredDefaultAgeGroupIds","requiredTags","PlatformEventType","PlatformPolicy","PrivacySettings","PlatformConfig","platform","isPreviewing","fromAddress","Platform","EventLocation","NamedObject","EventMeta","events","event","Event","filterDefinitionsToSelector","definitions","$andInMemoryFilterCompiler","runners","compileInMemoryFilter","runner","$orInMemoryFilterCompiler","$notInMemoryFilterCompiler","andRunner","$lessThanInMemoryFilterCompiler","normalizeValue","guardFilterCompareValue","$greaterThanInMemoryFilterCompiler","$equalsInMemoryFilterCompiler","invertFilterCompiler","compiler","compilers","$containsInMemoryFilterCompiler","$inInMemoryFilterCompiler","$elemMatchInMemoryFilterCompiler","$lengthInMemoryFilterCompiler","objectPathValue","path","nextSearched","specialValue","wrapPlainFilter","createInMemoryFilterCompiler","overrideFilterDefinitions","createInMemoryWildcardCompilerSelector","baseInMemoryFilterCompilers","getCompilerForFilter","f2","subFilter","filterCompiler","compileToInMemoryFilter","recordAnswerItemFilterCompilers","recordAnswersFilterCompilers","memberWithRegistrationsBlobInMemoryFilterCompilers","registrationInMemoryFilterCompilers","registerItemInMemoryFilterCompilers","documentInMemoryFilterCompilers","checkoutInMemoryFilterCompilers","organizationItemInMemoryFilterCompilers","eventNotificationsInMemoryFilterCompilers","RecordAnswer","timeoutMs","query","RecordAnswerDecoder","RecordAnswerDecoderStatic","RecordCheckboxAnswer","RecordTextAnswer","RecordMultipleChoiceAnswer","RecordChooseOneAnswer","RecordAddressAnswer","RecordDateAnswer","RecordPriceAnswer","RecordImageAnswer","RecordIntegerAnswer","RecordFileAnswer","warnings","choice","DocumentStatus","DocumentStatusHelper","DocumentSettings","DocumentTemplateDefinition","DocumentTemplateGroup","_record","DocumentPrivateSettings","DocumentTemplatePrivate","recordAnswerFilters","defs","DocumentData","Document","EventNotificationStatus","EventNotificationStatusHelper","STPackageType","STPackageTypeHelper","STPricingType","STPackageMeta","STPackage","allowAfter","STPackageStatus","expire","dates","OrganizationGenderType","UmbrellaOrganization","UmbrellaOrganizationHelper","umbrellaOrganization","ob","OrganizationType","OrganizationTypeHelper","umbrella","activities","PaymentType","PaymentTypeHelper","PaymentMethod","PaymentMethodV150","downgradePaymentMethodV150","newerValue","PaymentMethodHelper","method","TransferDescriptionType","replaceReplacements","TransferSettings","duplicate","L","weights","numbers","C","weight","firstChars","paddedFirst","modulo","PayconiqAccount","PrivatePaymentConfiguration","AdministrationFeeSettings","PaymentMethodSettings","PaymentConfiguration","OrganizationPackages","deactivateDate","OrganizationModules","OrganizationMetaData","ids","DNSRecordType","DNSRecordStatus","DNSRecord","PaymentProvider","CreditItem","MollieStatus","AcquisitionType","MollieProfileMode","MollieProfileStatus","MollieProfile","MollieOnboarding","BuckarooSettings","BalanceNotificationSettings","unwrapped","OrganizationPrivateMetaData","stripeAccountMeta","account","Category","SeatingSizeConfiguration","SeatMarkings","SeatType","SeatingPlanSeat","SeatingPlanRow","seat","grow","SeatingPlanSection","row","minWidth","size","rowWidth","rowGrow","rowX","rowY","SeatingPlanCategory","SeatingPlan","section","colorIndexes","reservedSeats","allowedSeats","isReservedCount","s2","selectedSeats","asAdmin","adjustedSeats","didChange","emptySeatStack","selectedSeatStack","leftSwapSeat","allowRightSwap","rSeat","ReservedSeat","isNumeric","webshop","product","seatingPlan","categoryName","reservedSeat","CartReservedSeat","WebshopField","WebshopFieldAnswer","ProductPrice","Option","OptionMenu","ProductType","ProductLocation","ProductDateRange","Product","stocks","priceStocks","menu","menuStocks","option","isAdmin","Policy","Sponsor","SponsorConfig","OptionSelectionRequirement","OptionSelectionRequirementHelper","requirement","ProductSelector","optionMenu","cartItem","allPrices","productPrices","footnote","excludedOptions","requiredOptions","DiscountRequirement","checkout","GeneralDiscount","ProductDiscount","potential","ProductDiscountRepeatBehaviour","ProductDiscountSettings","titles","descriptions","footnotes","discount","ProductDiscountTracker","Discount","productDiscount","subdescriptions","matchCount","multipliedOrderDiscount","trackers","tracker","WebshopLayout","DarkMode","WebshopTimeSlot","remainingOrders","remainingPersons","aa","bb","WebshopTimeSlots","CheckoutMethodType","CheckoutMethodTypeHelper","CheckoutMethod","slot","WebshopTakeoutMethod","WebshopOnSiteMethod","CheckoutMethodPrice","WebshopDeliveryMethod","AnyCheckoutMethodPatchDecoder","AnyCheckoutMethodDecoder","WebshopTicketType","WebshopStatus","WebshopNumberingType","WebshopAuthType","WebshopMetaData","WebshopPrivateMetaData","domain","WebshopServerMetaData","WebshopPreview","margin","Webshop","plan","PrivateWebshop","BaseOrganization","Organization","allGroups","OrganizationWithWebshop","GetWebshopFromDomainResult","OrganizationPatch","EventNotification","GenericBalance","MemberPlatformMembership","MemberResponsibilityRecordBase","MemberResponsibilityRecord","includeOrganization","allResponsibilities","responsibility","NationalRegisterNumberOptOut","getUnlistedResources","resourceType","listedResources","Permissions","LoadedPermissions","responsibilityRecord","inheritedResponsibilityRoles","allResponsibilites","allRoles","loaded","roleRecord","UserPermissions","platformRoles","platformPermissions","tag","rp","specific","organizationRoles","organizationId","clonedPatch","updated","kept","realAdd","realOld","LoginProviderType","UserMeta","User","NewUser","ApiUser","ApiUserWithToken","OpenIDClientConfiguration","OpenIDAuthTokenResponse","StartOpenIDFlowStruct","OrganizationSimple","PaymentCustomer","PaymentStatus","PaymentStatusHelper","PlatformServerConfig","Payment","lowerQuery","Settlement","PrivatePayment","BalanceItemStatusV352","BalanceItemStatus","BalanceItemType","getBalanceItemTypeName","getBalanceItemTypeIcon","BalanceItemRelationType","getBalanceItemRelationTypeName","getBalanceItemRelationTypeDescription","shouldAggregateOnRelationType","allRelations","BalanceItemRelation","BalanceItem","items","totalPending","totalPaid","totalPrice","totalOpen","_j","_k","_l","_m","grouped","GroupedBalanceItems","prefixClass","newer","BalanceItemPayment","BalanceItemPaymentWithPayment","BalanceItemPaymentWithPrivatePayment","BalanceItemWithPayments","payment","BalanceItemWithPrivatePayments","acc","EmergencyContact","ParentType","ParentTypeHelper","Parent","userEmails","cleaned","ReviewTime","ReviewTimes","time","BooleanStatus","MemberDetails","contact","filterUsedAndInvalidEmails","emails","checkAlternative","formattedPhone","lastReviewed","usedAddressIds","memberAddressId","parentAddressIds","unverifiedAddress","addressId","parentPhones","parentPhone","phone","unverifiedPhone","age","changed","_parent","newAnswers","cleanedEmail","addresses","members","allowOverrides","parentsGroupByName","parentsGroupById","mergeIdMap","oldestParent","mergeTo","allowSet","nextParent","setObject","p2","oldDate","times","TinyMember","Member","sortDirection","RegisterItemOption","IDRegisterItem","RegisterItem","prices","registration","idRegisterItem","replaceRegistrations","registrationId","trialUntil","groupPrice","remainingMenus","rr","waiting","available","allPricesSoldOut","optionMenus","allOptionsSoldOut","reg","currentPeriodId","previousPeriodId","types","existingMember","reachedMaximum","maximumSelection","deleteRegistrations","cartIndex","itemsBefore","freed","Registration","RegistrationWithMember","exampleBalanceItem","exampleBalanceItem2","_injectedReplacementValues","injectReplacementValues","injected","_ExampleReplacements","fillReplacementsIfNeeded","getReplacements","ExampleReplacements","htmlPlaceholder","textPlaceholder","EditorSmartVariable","variable","variables","EditorSmartButton","buttons","MemberWithRegistrationsBlob","subtypes","recipients","shared","createLoginDetailsReplacement","formattedEmail","EmailRecipient","unverifiedEmail","MembersBlob","EmailTemplateType","EmailTemplate","EmailRecipientFilterType","sharedReplacements","getExampleRecipient","EmailStatus","EmailRecipientsStatus","EmailRecipientSubfilter","EmailRecipientFilter","Email","EmailPreview","CartStockHelper","cart","inCart","prev","reserved","remainingStock","more","productPrice","hasOption","remainingSeats","show","productStock","seatsStock","orderMaximum","allowMultiple","priceStock","optionStock","maximumPriceStock","maximumOptionStock","minArr","CartItemPrice","CartItemOption","CartItem","priceId","optionId","cartItemOption","chosenPrice","unitPrice","seatPrice","expectedPrice","priceCombinations","calculatedPrice","refresh","validateSeats","minimumRemaining","stockDefinition","invalidSeats","otherItems","otherSeats","adjusted","Cart","allowMerge","oldCode","newItems","Customer","DiscountCode","Checkout","organizationMeta","checkoutMethod","_webshop","_organizationMeta","timeSlot","availableTimeslots","i18n","user","discountOrders","discounts","bestPotential","Ticket","TicketPublic","order","isCustomer","nameField","TicketOrder","TicketPublicPrivate","TicketPrivate","OrderStatusV103","OrderStatusV137","OrderStatus","OrderStatusHelper","OrderData","Order","customer","payments","succeededTransfers","iban","PrivateOrder","PrivateOrderWithTickets","tickets","ticket","patches","orders","mainLoop","OrderResponse","BalanceItemDetailed","BalanceItemPaymentDetailed","PaymentGeneral","balanceItemPayment","shortDescriptions","shortDescription","ReceivableBalanceType","getReceivableBalanceTypeName","$t","ReceivableBalanceObjectContact","ReceivableBalanceObject","ReceivableBalance","DetailedReceivableBalance","UsedRegisterCode","RegisterCodeStatus","RegisterCode","Requirements","StripeBusinessProfile","StripeCompany","StripeMetaAccountDashboardSettings","StripeMetaAccountSettings","StripeMetaData","methods","requirementsToString","missing","StripeAccountPatch","StripeAccount","missingText","Token","_context","UserWithMembers","ChargeMembershipsTypeSummary","ChargeMembershipsSummary","ChargeOrganizationsRequest","ChargeMembersRequest","CheckMollieResponse","CreateOrganization","ForgotPasswordRequest","GroupsWithOrganizations","OrganizationAdmins","OrganizationDomains","PayableBalance","PayableBalanceCollection","DetailedPayableBalance","DetailedPayableBalanceCollection","RegisterMember","RegisterMembers","RegisterResponse","SignupResponse","VerifyEmailRequest","PollEmailVerificationRequest","PollEmailVerificationResponse","WebshopUriAvailabilityResponse","PaginatedResponse","PaginatedResponseDecoder","resultDecoder","querydecoder","PaymentPatch","PaymentWithRegistrations","BalanceItemCartItem","maxPrice","IDRegisterCart","RegisterCart","registrations","otherItem","memberId","replaceWith","cleanedBalanceItems","balanceItem","cleanedRegistrations","singleOrganization","IDRegisterCheckout","RegisterCheckout","preferredId","_item","PlatformFamily","blob","family","removeMissing","platformMember","PlatformMember","passedFamilies","memberList","cloneMember","skip","occurrences","searchString","emergencyContact","defaultGroupIds","organizationIds","documents","MembershipStatus","isTemporary","def","foundPermissions","recordsConfigurations","recordsConfiguration","configurations","checkPermissions","isUserManager","scopedOrganizations","recordCategory","hasUserManagerPermissions","hasAdminPermissions","organizationPermissions","LegacyRecordType","OldRecordType","LegacyRecordTypePriority","TrimEnumDecoder","LegacyRecord","OldRecord","RegistrationPatch","RegistrationWithEncryptedMember","SortDirection","WebshopOrdersQuery","WebshopTicketsQuery","STCredit","credits","STInvoiceStatus","STInvoiceItemDetail","STInvoiceItem","pack","pendingAmount","totalDays","remainingDays","paidDays","detail","copy","j","STInvoiceMeta","itemPrice","STInvoice","STInvoicePrivate","STPendingInvoice","STPendingInvoicePrivate","STInvoiceResponse","STBillingStatus","STPackageBundle","Admin","EditAdmin","MemberSummary","nameParts","today","OrganizationStats","OrganizationPaymentMandateDetails","OrganizationPaymentMandate","OrganizationSummary","OrganizationOverview","orgParts","isInvoiceComplete","invoice","payoutExport","StripePayoutItemType","StripePayoutItem","StripePayout","StripePayoutBreakdown","StripePayoutExport","payout","VAT","invoiceVAT","invoiceTotal","GraphData","Graph","EmailAddressSettings","ExcelExportType","ExcelSheetColumnFilter","ExcelSheetFilter","ExcelWorkbookFilter","ExcelExportRequest","ExcelExportResponse","EventPermissionChecker","getOrganization","userPermissions","accessRight","TagHelper","isRootTag","otherTag","otherTagId","tagIdToSearch","tagMap","childTagId","RendersState","helperName","vv","renderTemplate","template","state","AuditLogSource","AuditLogType","getAuditLogTypeName","getAuditLogTypeIcon","getAuditLogTypeTitleTemplate","getAuditLogTypeDescriptionTemplate","getTypeReplacements","AuditLogPatchItemType","AuditLogPatchItem","helpers","prefixes","AuditLog","uuidToName","uuid","objectLists","fillReplacements","balance1","balance2","paymentGeneral","paymentReplacemnets","RequestBag","bag","request","RequestResult","headers","responseVersion","Request","server","middleware","owner","reject","finished","response","timeout","body","typeCopy","queryString","params","retry","header","err","bodyText","json","line","Server","host","I18n","app","messages","language","namespace","replace","makeMap","EMPTY_OBJ","EMPTY_ARR","NOOP","NO","isOn","isModelListener","extend","el","hasOwn","isArray","isMap","toTypeString","isSet","isFunction","isSymbol","isObject","isPromise","objectToString","toRawType","isPlainObject","isIntegerKey","isReservedProp","cacheStringFunction","cache","camelizeRE","camelize","hyphenateRE","hyphenate","capitalize","toHandlerKey","hasChanged","invokeArrayFns","fns","arg","writable","looseToNumber","toNumber","_globalThis","getGlobalThis","normalizeStyle","res","parseStringStyle","listDelimiterRE","propertyDelimiterRE","styleCommentRE","cssText","tmp","normalizeClass","normalizeProps","props","klass","specialBooleanAttrs","isSpecialBooleanAttr","includeBooleanAttr","looseCompareArrays","equal","looseEqual","aValidType","bValidType","aKeysCount","bKeysCount","aHasKey","bHasKey","looseIndexOf","toDisplayString","replacer","_key","entries","val2","stringifySymbol","activeEffectScope","EffectScope","detached","currentEffectScope","fromParent","getCurrentScope","onScopeDispose","failSilently","activeSub","pausedQueueEffects","ReactiveEffect","batch","cleanupEffect","prepareDeps","prevEffect","prevShouldTrack","shouldTrack","cleanupDeps","link","removeSub","isDirty","batchDepth","batchedSub","batchedComputed","isComputed","startBatch","endBatch","head","tail","removeDep","refreshComputed","computed","globalVersion","dep","prevSub","soft","nextSub","prevDep","nextDep","trackStack","pauseTracking","resetTracking","cleanup","Link$1","Dep","debugInfo","Link","addSub","currentTail","targetMap","ITERATE_KEY","MAP_KEY_ITERATE_KEY","ARRAY_ITERATE_KEY","track","depsMap","trigger","oldTarget","run","targetIsArray","isArrayIndex","newLength","key2","getDepFromReactive","depMap","reactiveReadArray","raw","toRaw","isShallow","toReactive","shallowReadArray","arrayInstrumentations","iterator","thisArg","apply","searchProxy","noTracking","reduce","comparer","iter","arrayProto","wrappedRetFn","needsWrap","methodFn","result2","wrappedFn","isProxy","isNonTrackableKeys","builtInSymbols","BaseReactiveHandler","_isReadonly","_isShallow","receiver","isReadonly2","isShallow2","shallowReadonlyMap","readonlyMap","shallowReactiveMap","reactiveMap","readonly","reactive","MutableReactiveHandler","isOldValueReadonly","isReadonly","hadKey","ReadonlyReactiveHandler","mutableHandlers","readonlyHandlers","shallowReactiveHandlers","toShallow","getProto","createIterableMethod","rawTarget","targetIsMap","isPair","isKeyOnly","innerIterator","toReadonly","done","createReadonlyMethod","createInstrumentations","shallow","instrumentations","rawKey","has","callback","observed","get","hadItems","createInstrumentationGetter","mutableCollectionHandlers","shallowCollectionHandlers","readonlyCollectionHandlers","targetTypeMap","rawType","getTargetType","createReactiveObject","shallowReactive","baseHandlers","collectionHandlers","proxyMap","existingProxy","targetType","proxy","isReactive","markRaw","ref","createRef","shallowRef","rawValue","RefImpl","useDirectValue","unref","ref2","shallowUnwrapHandlers","proxyRefs","objectWithRefs","CustomRefImpl","factory","newVal","customRef","ObjectRefImpl","_object","_defaultValue","GetterRefImpl","_getter","toRef","defaultValue","propertyToRef","ComputedRefImpl","setter","isSSR","getterOrOptions","debugOptions","getter","INITIAL_WATCHER_VALUE","cleanupMap","activeWatcher","onWatcherCleanup","cleanupFn","cleanups","watch","cb","immediate","deep","once","scheduler","augmentJob","call","reactiveGetter","source2","traverse","effect","boundCleanup","forceTrigger","isMultiSource","currentEffect","baseGetter","depth","scope","watchHandle","_cb","job","immediateFirstRun","currentWatcher","cleanup2","seen","ErrorCodes","callWithErrorHandling","handleError","callWithAsyncErrorHandling","throwInDev","contextVNode","errorHandler","throwUnhandledErrorInProduction","cur","exposedInstance","errorInfo","errorCapturedHooks","logError","throwInProd","flushIndex","pendingPostFlushCbs","activePostFlushCbs","postFlushIndex","resolvedPromise","currentFlushPromise","nextTick","findInsertionIndex","middle","middleJob","middleJobId","queueJob","jobId","lastJob","queueFlush","flushJobs","queuePostFlushCb","flushPreFlushCbs","flushPostFlushCbs","deduped","currentRenderingInstance","currentScopeId","setCurrentRenderingInstance","withCtx","ctx","isNonScopedSlot","renderFnWithContext","setBlockTracking","prevInstance","withDirectives","vnode","directives","getComponentPublicInstance","bindings","dir","modifiers","invokeDirectiveHook","prevVNode","oldBindings","binding","hook","TeleportEndKey","isTeleport","isTeleportDisabled","isTeleportDeferred","isTargetSVG","isTargetMathML","resolveTarget","select","targetSelector","TeleportImpl","n1","n2","anchor","parentComponent","parentSuspense","slotScopeIds","optimized","internals","mountChildren","patchChildren","patchBlockChildren","insert","querySelector","createText","createComment","disabled","shapeFlag","children","dynamicChildren","placeholder","mainAnchor","mount","container2","anchor2","mountToTarget","targetAnchor","prepareAnchor","updateCssVars","queuePostRenderEffect","wasDisabled","currentContainer","currentAnchor","traverseStaticChildren","moveTeleport","nextTarget","unmount","hostRemove","doRemove","targetStart","shouldRemove","hydrateTeleport","parentAnchor","moveType","isReorder","node","nextSibling","parentNode","hydrateChildren","targetNode","Teleport","isDisabled","leaveCbKey","enterCbKey","useTransitionState","onMounted","onBeforeUnmount","TransitionHookValidator","BaseTransitionPropsValidators","recursiveGetSubtree","subTree","BaseTransitionImpl","slots","getCurrentInstance","getTransitionRawChildren","findNonCommentChild","rawProps","emptyPlaceholder","innerChild","getInnerChild$1","enterHooks","resolveTransitionHooks","hooks","Comment","setTransitionHooks","oldChild","oldInnerChild","isSameVNodeType","leavingHooks","earlyRemove","delayedLeave","leavingVNodesCache","getLeavingNodesForType","BaseTransition","leavingVNodes","postClone","appear","persisted","onBeforeEnter","onEnter","onAfterEnter","onEnterCancelled","onBeforeLeave","onLeave","onAfterLeave","onLeaveCancelled","onBeforeAppear","onAppear","onAfterAppear","onAppearCancelled","callHook","callAsyncHook","hook2","leavingVNode","afterHook","cancelHook","called","cancelled","vnode2","hooks2","isKeepAlive","cloneVNode","keepComment","parentKey","keyedFragmentCount","Fragment","defineComponent","extraOptions","markAsyncBoundary","useTemplateRef","refs","setRef","rawRef","oldRawRef","isUnmount","isAsyncWrapper","refValue","oldRef","setupState","rawSetupState","canSetSetupRef","_isString","_isRef","doSet","onActivated","registerKeepAliveHook","onDeactivated","currentInstance","wrappedHook","injectHook","injectToKeepAliveRoot","keepAliveRoot","onUnmounted","prepend","reset","setCurrentInstance","createHook","lifecycle","isInSSRComponentSetup","onBeforeMount","onBeforeUpdate","onUpdated","onServerPrefetch","onRenderTriggered","onRenderTracked","onErrorCaptured","COMPONENTS","DIRECTIVES","resolveComponent","maybeSelfReference","resolveAsset","NULL_DYNAMIC_COMPONENT","resolveDynamicComponent","component","resolveDirective","warnMissing","Component","selfName","getComponentName","registry","renderList","renderItem","cached","sourceIsArray","sourceIsReactiveArray","createSlots","dynamicSlots","renderSlot","noSlotted","openBlock","createBlock","createVNode","validSlotContent","ensureValidVNode","slotKey","rendered","vnodes","isVNode","toHandlers","preserveCaseIfNecessary","getPublicInstance","isStatefulComponent","publicPropertiesMap","resolveMergedOptions","instanceWatch","hasSetupBinding","PublicInstanceProxyHandlers","accessCache","appContext","normalizedProps","shouldCacheAccess","publicGetter","cssModule","globalProperties","propsOptions","descriptor","useAttrs","getContext","createSetupContext","normalizePropsOrEmits","mergeModels","applyOptions","publicThis","dataOptions","computedOptions","watchOptions","provideOptions","injectOptions","created","beforeMount","mounted","beforeUpdate","activated","deactivated","beforeDestroy","beforeUnmount","destroyed","unmounted","render","renderTracked","renderTriggered","errorCaptured","serverPrefetch","expose","inheritAttrs","components","resolveInjections","methodHandler","opt","createWatcher","provides","provide","registerLifecycleHook","register","_hook","exposed","checkDuplicateProperties","normalizeInject","inject","createPathGetter","handler","mixins","extendsOptions","globalMixins","optionMergeStrategies","resolved","mergeOptions","strats","asMixin","strat","internalOptionMergeStrats","mergeDataFn","mergeEmitsOrPropsOptions","mergeObjectOptions","mergeAsArray","mergeWatchOptions","mergeInject","merged","createAppContext","uid$1","createAppAPI","hydrate","rootComponent","rootProps","installedPlugins","pluginCleanupFns","isMounted","plugin","mixin","directive","rootContainer","isHydrate","lastApp","currentApp","parentProvides","treatDefaultAsFactory","internalObjectProto","createInternalObject","isInternalObject","initProps","isStateful","attrs","setFullProps","updateProps","rawPrevProps","patchFlag","rawCurrentProps","hasAttrsChanged","propsToUpdate","isEmitListener","camelizedKey","resolvePropValue","kebabKey","needCastKeys","rawCastValues","camelKey","castValues","isAbsent","hasDefault","propsDefaults","mixinPropsCache","normalizePropsOptions","comp","hasExtends","extendProps","raw2","normalizedKey","validatePropName","propType","shouldCast","shouldCastTrue","typeName","isInternalKey","normalizeSlotValue","normalizeVNode","normalizeSlot","rawSlot","normalizeObjectSlots","rawSlots","normalizeVNodeSlots","assignSlots","initSlots","updateSlots","needDeletionCheck","deletionComparisonTarget","queueEffectWithSuspense","createRenderer","baseCreateRenderer","createHydrationFns","hostInsert","hostPatchProp","hostCreateElement","hostCreateText","hostCreateComment","hostSetText","hostSetElementText","hostParentNode","hostNextSibling","hostSetScopeId","hostInsertStaticContent","getNextHostNode","Text","processText","processCommentNode","Static","mountStaticNode","processFragment","processElement","processComponent","moveStaticNode","removeStaticNode","mountElement","patchElement","vnodeHook","transition","dirs","resolveChildrenNamespace","setScopeId","invokeVNodeHook","needCallTransitionHooks","needTransition","scopeId","isSuspense","parentVNode","cloneIfMounted","oldProps","newProps","toggleRecurse","patchProps","oldChildren","newChildren","fallbackContainer","oldVNode","newVNode","fragmentStartAnchor","fragmentEndAnchor","fragmentSlotScopeIds","mountComponent","updateComponent","initialVNode","createComponentInstance","setupComponent","setupRenderEffect","shouldUpdateComponent","updateComponentPreRender","componentUpdateFn","bu","nonHydratedAsyncRoot","locateNonHydratedAsyncRoot","originNext","nextTree","renderComponentRoot","prevTree","updateHOCHostEl","bm","isAsyncWrapperVNode","hydrateNode","hydrateSubTree","scopedInitialVNode","update","nextVNode","prevProps","prevShapeFlag","patchKeyedChildren","patchUnkeyedChildren","unmountChildren","oldLength","commonLength","nextChild","l2","e1","e2","nextPos","s1","keyToNewIndexMap","toBePatched","moved","maxNewIndexSoFar","newIndexToOldIndexMap","prevChild","newIndex","increasingNewIndexSequence","getSequence","nextIndex","leave","delayLeave","afterLeave","remove2","performLeave","cacheIndex","shouldInvokeDirs","shouldInvokeVnodeHook","unmountComponent","removeFragment","performRemove","bum","um","invalidateMount","teleportEnd","isFlushing","currentNamespace","ch1","ch2","len","arrI","subComponent","ssrContextKey","useSSRContext","watchEffect","doWatch","watchSyncEffect","flush","baseWatchOptions","runsImmediately","ssrCleanup","watchStopHandle","isPre","isFirstRun","watch$1","segments","useModel","camelizedName","hyphenatedName","getModelModifiers","localValue","prevSetValue","prevEmittedValue","propValue","emittedValue","i2","modelName","emit","rawArgs","handlerName","onceHandler","normalizeEmitsOptions","extendEmits","normalizedFromExtend","withProxy","renderCache","fallthroughAttrs","proxyToUse","thisProxy","render2","getFunctionalFallthrough","blockStack","filterModelListeners","prevChildren","nextProps","nextChildren","emits","hasPropsChanged","dynamicProps","emitsOptions","nextKeys","suspense","currentBlock","disableTracking","closeBlock","isBlockTreeEnabled","setupBlock","createElementBlock","createBaseVNode","normalizeKey","normalizeRef","ref_key","ref_for","isBlockNode","needFullChildrenNormalization","normalizeChildren","_createVNode","isClassComponent","guardReactiveProps","extraProps","mergeRef","cloneTransition","mergedProps","mergeProps","createTextVNode","flag","createStaticVNode","content","numberOfNodes","createCommentVNode","asBlock","slotFlag","toMerge","incoming","emptyAppContext","uid","internalSetCurrentInstance","setInSSRSetupState","registerGlobalSetter","setters","unsetCurrentInstance","setupResult","setupStatefulComponent","setup","setupContext","isAsyncSetup","resolvedResult","handleSetupResult","finishComponentSetup","compile","skipOptions","isCustomElement","compilerOptions","delimiters","componentCompilerOptions","finalCompilerOptions","attrsProxyHandlers","includeInferred","computed$1","propsOrChildren","policy","tt","unsafeToTrustedHTML","svgNS","mathmlNS","doc","templateContainer","nodeOps","is","selector","before","wrapper","TRANSITION","ANIMATION","vtcKey","DOMTransitionPropsValidators","TransitionPropsValidators","decorate$1","Transition","resolveTransitionProps","h2","hasExplicitCallback","baseProps","enterFromClass","enterActiveClass","enterToClass","appearFromClass","appearActiveClass","appearToClass","leaveFromClass","leaveActiveClass","leaveToClass","durations","normalizeDuration","enterDuration","leaveDuration","finishEnter","isAppear","removeTransitionClass","finishLeave","makeEnterHook","nextFrame","addTransitionClass","whenTransitionEnds","forceReflow","NumberOf","cls","_vtc","endId","expectedType","explicitTimeout","resolveIfNotStale","propCount","getTransitionInfo","endEvent","ended","onEnd","styles","getStyleProperties","transitionDelays","transitionDurations","transitionTimeout","getTimeout","animationDelays","animationDurations","animationTimeout","hasTransform","delays","toMs","patchClass","isSVG","transitionClasses","vShowOriginalDisplay","vShowHidden","vShow","setDisplay","CSS_VAR_TEXT","displayRE","patchStyle","isCssString","hasControlledDisplay","prevStyle","setStyle","cssVarText","importantRE","prefixed","autoPrefix","prefixCache","rawName","xlinkNS","patchAttr","isBoolean","patchDOMProp","attrName","needRemove","addEventListener","removeEventListener","veiKey","patchEvent","prevValue","nextValue","invokers","existingInvoker","parseName","invoker","createInvoker","optionsModifierRE","cachedNow","getNow","initialValue","patchStopImmediatePropagation","originalStop","isNativeOn","patchProp","shouldSetAsProp","camelize$1","positionMap","newPositionMap","moveCbKey","decorate","TransitionGroupImpl","moveClass","hasCSSTransform","callPendingCbs","recordPosition","movedChildren","applyTranslation","cssTransitionProps","TransitionGroup","oldPos","newPos","dx","dy","getModelAssigner","onCompositionStart","onCompositionEnd","assignKey","vModelText","lazy","trim","castToNumber","domValue","elValue","vModelCheckbox","modelValue","elementValue","getValue","checked","assign","getCheckboxValue","setChecked","vModelRadio","vModelSelect","isSetModel","selectedVal","setSelected","_binding","isMultiple","isArrayValue","optionValue","optionType","systemModifiers","modifierGuards","withModifiers","cacheKey","guard","keyNames","withKeys","eventKey","rendererOptions","renderer","ensureRenderer","createApp","containerOrSelector","normalizeContainer","resolveRootNamespace","__defProp","__defNormalProp","__publicField","_UrlHelper","url","localFixedPrefix","protocol","search","matchPath","UrlHelper","templateParts","resultParams","templatePart","param","templateToUrl","HistoryManagerStatic","action","delta","timer","listener","didJustLoadPage","formattedUrl","lastState","undoAction","counter","deletedStates","adjustHistoryCount","onPopState","newCounter","animate","newState","clickHandler","HistoryManager","useCurrentComponent","getExposeProxy","extendingProxy","forAllRoots","alreadyProcessed","handled","ComponentWithProperties","lastItem","_ComponentWithProperties","properties","worked","promise","animated","ShapeFlags","getInnerChild","resetShapeFlag","makeProvidesParentReactive","reactiveInstance","originalProvides","ownProvides","proxyProvider","_target","_a2","ComponentWithPropertiesInstance","sharedContext","parentHistory","combinedProvide","disableUrl","inheritedUrlRaw","updateUrl","_unmount","instance2","_innerVnode","da","getChildVNode","pendingCacheKey","cacheSubtree","cachedVNode","parent2","_sfc_main$5","_export_sfc","sfc","_sfc_render$2","_ctx","_cache","$props","$setup","$data","$options","_component_ComponentWithPropertiesInstance","createElementVNode","FramedComponent","useNavigationController","NavigationController$1","extra","newComponent","mightBe","lastComponent","destroy","internalScrollElement","clientHeight","internalClientHeight","popped","adjustHistory","component2","canAnimate","parentPop","insertedElement","leavingElement","internal","nextInternal","scrollOuterHeight","h22","childElement","transitionDuration","scrollElement","_element","_sfc_main$4","_hoisted_1$3","_sfc_render$1","_component_FramedComponent","NavigationController","usePop","rawPop","pop","useNavigate","present","usePresent","useShow","showDetail","useShowDetail","toRoute","route","componentProperties","originalProperties","realComponent","currentRoutes","getCurrentRoutes","toId","urlOrName","prop1","prop2","onCheckRoutes","addCheckRoutesMountedHandler","onNotCheckRoutes","defineRoutes","routes","urlhelpers","useUrl","navigate","provideDefaultHandler","handleRoutes","routes2","defaultHandler","getDefaultRoute","allowDetail","defaultRoute","setDefaultHandler","unreffedProvideDefaultHandler","extraRoutes","checkRouteCache","useCurrentHref","useCheckRoute","currentPath","checkMatchResult","quickCheckCache","checkRoute","checkId","normalizePushOptions","currentComponent","urlHelpers","useManualPresent","rawShow","rawShowDetail","rawPresent","useDismiss","rawDismiss","dismiss","useCanPop","useCanDismiss","useFocused","rawFocused","setTitleSuffix","navigationUrl","historyIndex","_hoisted_1$2","_sfc_main$3","__props","__expose","__emit","parentIsFocused","getCustomProvide","removeAt","getFocusedComponent","hadFocus","newFocused","getComponentWithHistory","_sfc_main$2","navigationController","stackComponent","returnToHistoryIndex","navigationFocused","customProvide","_sfc_main","nav","injectHooks","instanceProxy","useSplitViewController","SplitViewController$1","succeeded","_sfc_main$1","_hoisted_1$1","_hoisted_2","_hoisted_3","_sfc_render","_component_NavigationController","SplitViewController","useModalStackComponent","usePopup","navigationMethods","navigationOptions","NavigationMixin","_hoisted_1","Popup","hide","modalStackComponent","mainContent","pushDown","popups","buildClass","vvv","isFocused","onKey","shouldNavigateAway","onClick","countries","languages","useTranslate","I18nController","setGlobalTranslateFunction","_replace","_I18nController","addPrefix","validLocales","__variableDynamicImportRuntimeHelper","Storage","defaultCountry","defaultLanguage","needsSave","isPrerender","storage","tld","localizedDomain","listCountries","hostProtocol","links","meta","redirected","LocalizedDomains","NetworkManagerStatic","Toast","latestVersion","NetworkManager","ContextPermissions","webshopId","autoIncludeScanTickets","ManagedToken","onChange","shouldRetry","LocalStorage","_Storage","dec2hex","dec","generateId","SessionContext","preventComplete","usePlatformStorage","json2","oid_rt","msg","spaState","redirectUri","respponse","usedPlatformStorage","returnedOrganization","oldAdmins","skipIfNotOutdated","fetchedUser","fetchedOrganization","updateUIForLogout","SessionManager","SessionStorage","__decorateClass","SessionManagerStatic","session","retryWithLess","allowCache","sessionStorage","sessions","LoginHelper","password","tokenResponse","lastName","registerCode","useOrganizationManager","OrganizationManager","admins","GlobalEventBus","periods","periodPatch","usePlatformManager","PlatformManager","$platform","ColorHelper","backgroundFetch","requirePrivateConfig","fromStorage","manager","platformManager","href","awaited","useRequestOwner","custom","useMemberManager","MemberManager","lastUpdatedAt","groupIds","skipOrganizationIds","storedData","idCheckout","knownGroups","requestGroupIds","groupsWithOrganizations","balanceItems","versionBox","encoded","DocumentStruct","_ViewportHelper","modern","viewportHandler","clickedElement","paddingTop","paddingBottom","scrollPosition","viewportHeight","vh","bottomPadding","elRect","scrollRect","elBottomPadding","exponential","endPosition","easingFunction","previousTimeStamp","startPosition","previousPosition","timestamp","elapsed","ViewportHelper","ErrorBox","minimum","firstElement","VueComponent","_proxy","$internalHooks","createDecorator","Ctor","buildComponent","OriginalClass","decoratorOptions","vm","defaultData","Mixins","injectPropertyDecorator","componentOptions","Prop","optionsOrTarget","Ref","refKey","Watch","STErrorBox","_openBlock","_createBlock","_Transition","afterEnter","_withCtx","_createElementVNode","STErrorsDefault","_resolveComponent","_createElementBlock","_Fragment","_renderList","_createTextVNode","_toDisplayString","STErrorsInput","_normalizeClass","_renderSlot","Validator","validation","valid","promises","validationKeys","isValid","useErrors","useValidation","validator","EmailStyler","html","subject","imported","primaryColor","primaryColorContrast","hrCSS","buttonCSS","inlineLinkCSS","descriptionCSS","elements","blockSmartVariables","buttonElements","button","inlineButtons","blocks","ps","hrElements","inlineLinkElements","buttonDescriptionElements","emptyP","escapeSubject","EventBus","useKeyDown","keyHandler","useArrowUpDown","actions","useContext","refOrReal","useAuth","useBackForward","otherProps","goBack","goForward","hasPrevious","hasNext","seek","useCountry","useDeviceWidth","useDraggableArray","addPatch","recordsPatch","useDraggableArrayIds","useEmitPatch","propName","createPatch","newPatch","usePatchableArray","patchArray","useEmitPatchArray","addArrayPatch","addPut","addDelete","useOrganization","useRequiredOrganization","usePlatform","checkFeatureFlag","useFeatureFlag","manualFeatureFlag","useGlobalEventListener","eventName","useInterval","running","useIsIOS","useIsMobile","usePatch","iv","usePatchArray","usePatchMoveUpDown","inList","movingItemId","moveTo","usePatchMoveUpDownSingle","usePatchMoveUpDownIds","useSetupStepTranslations","reviewTitleMap","reviewDescriptionMap","reviewCheckboxTitleMap","todoTitleMap","todoDescriptionMap","useUser","useUninheritedPermissions","overrides","useCount","useSetupStepReviewDescription","getDescription","review","short","textIfNotReviewed","reviewedAtString","useVisibilityChange","wasVisible","isVisible","onVisibilityChange","addListeners","removeListeners","useNow","useLoginMethods","useLoginMethod","loginMethods","useLoginMethodEnabled","loginMethod","extendSort","useMembersObjectFetcher","SelectableColumn","SelectableSheet","column","SelectableWorkbook","sheet","visibleSheet","exporting","groupedColumns","getAllSelected","columns","getAllSelectedindeterminate","setAllSelected","selected","savedFilter","decodedJson","saveFilter","startExport","doExport","ToastButton","useOrganizationsObjectFetcher","getPaymentsObjectFetcher","usePaymentsObjectFetcher","useEventsObjectFetcher","useEventNotificationsObjectFetcher","useAuditLogsObjectFetcher","firstInputElement","CenteredMessageButton","_CenteredMessage","simpleErrors","toast","confirmText","cancelText","destructive","CenteredMessage","icon","download","_Toast","message","progress","_useModel","constrain","Checkbox","onlyLine","_withDirectives","$event","checkboxValue","_vModelCheckbox","ContextMenuItemView","isOpen","_resolveDynamicComponent","_withModifiers","onMouseLeave","ContextMenuLine","triangleContains","ax","ay","bx","cx","cy","det","ContextMenuView","win","docElem","clientWidth","viewPadding","viewPaddingBottom","viewPaddingTop","usedX","usedY","objLeft","xTransform","objTop","yTransform","wasHovered","bounds","mouseX","mouseY","contextX","contextY","contextY2","contextX2","triangle","isStillHovered","p1","p3","selectedElement","popParents","_normalizeStyle","ignoreHoverTriangle","_createCommentVNode","GeneralContextMenuView","_resolveDirective","_component_ContextMenuView","_mergeProps","groupIndex","_component_ContextMenuItemView","handleAction","_createSlots","_component_Checkbox","ModalStackEventBus","ReplaceRootEventBus","ContextMenuItem","ContextMenu","position","menuComponent","useDataPermissionSettings","dataPermissionSettings","useExternalOrganization","organizationHint","loadedOrganization","errorBox","loadingOrganizationId","loadingCount","externalOrganization","check","loadOrganization","canSelect","SearchOrganizationView","$user","$navigate","isNative","letters","showContextMenu","useAppContext","getAppName","useAppData","getAppTitle","getAppDescription","_imports_2$3","logo","logoDark","injectedComponents","unreffed","OrganizationLogo","MetaLogo","_component_MetaLogo","isPlatform","Radio","hasDefaultSlot","_vModelRadio","ownKeys","enumerableOnly","symbols","sym","_objectSpread2","_defineProperty","_typeof","_extends","_objectWithoutPropertiesLoose","excluded","sourceKeys","_objectWithoutProperties","sourceSymbolKeys","pattern","IE11OrLess","Edge","FireFox","Safari","IOS","ChromeForAndroid","captureMode","on","off","getParentOrHost","closest","includeCTX","R_SPACE","toggleClass","className","css","selfOnly","appliedTransforms","transform","matrixFn","find","tagName","getWindowScrollingElement","scrollingElement","getRect","relativeToContainingBlock","relativeToNonStaticParent","undoScale","containerRect","elMatrix","scaleX","scaleY","isScrolledPast","elSide","parentSide","getParentAutoScrollElement","elSideVal","parentSideVal","visible","getChild","childNum","includeDragEl","currentChild","Sortable","lastChild","getRelativeScrollOffset","offsetLeft","offsetTop","winScroller","indexOfObject","includeSelf","elem","gotSelf","elemCSS","dst","src","isRectEqual","rect1","rect2","_throttleTimeout","_this","cancelThrottle","scrollBy","Polymer","$","getChildContainingRectFromElement","ghostEl","rect","_rect$left","_rect$top","_rect$right","_rect$bottom","childRect","expando","AnimationStateManager","animationStates","animationCallbackId","fromRect","childMatrix","animating","animationTime","toRect","prevFromRect","prevToRect","animatingRect","targetMatrix","calculateRealTime","currentRect","translateX","translateY","repaint","plugins","defaults","PluginManager","sortable","evt","eventNameGlobal","pluginName","initialized","eventProperties","modifiedValue","dispatchEvent","_ref","rootEl","targetEl","cloneEl","toEl","fromEl","oldIndex","oldDraggableIndex","newDraggableIndex","originalEvent","putSortable","extraEventProperties","onName","allEventProperties","_excluded","pluginEvent","dragEl","parentEl","nextEl","lastDownEl","cloneHidden","_hideGhostForTarget","_unhideGhostForTarget","_dispatchEvent","info","activeGroup","awaitingDragStarted","ignoreNextClick","sortables","tapEvt","touchEvt","lastDx","lastDy","tapDistanceLeft","tapDistanceTop","lastTarget","lastDirection","pastFirstInvertThresh","isCircumstantialInvert","targetMoveDistance","ghostRelativeParent","ghostRelativeParentInitialScroll","_silent","savedInputChecked","documentExists","PositionGhostAbsolutely","CSSFloatProperty","supportDraggable","supportCssPointerEvents","_detectDirection","elCSS","elWidth","child1","child2","firstChildCSS","secondChildCSS","firstChildWidth","secondChildWidth","touchingSideChild2","_dragElInRowColumn","dragRect","targetRect","vertical","dragElS1Opp","dragElS2Opp","dragElOppLength","targetS1Opp","targetS2Opp","targetOppLength","_detectNearestEmptySortable","threshold","insideHorizontally","insideVertically","_prepareGroup","toFn","pull","sameGroup","otherGroup","originalGroup","nearestEmptyInsertDetectEvent","nearest","_checkOutsideTargetEl","dataTransfer","preventOnFilter","touch","originalTarget","_saveInputCheckedState","criteria","ownerDocument","dragStartFn","_disableDraggable","_nextTick","inserted","fallbackTolerance","fallbackOffset","ghostMatrix","relativeScrollOffset","cssMatrix","revert","activeSortable","isOwner","canSort","fromSortable","completedFired","dragOverEvent","completed","_onMove","capture","insertion","elLastChild","_ghostIsLast","_ghostIsFirst","firstChild","targetBeforeFirstSwap","differentLevel","differentRowCol","side1","scrolledPastTop","scrollBefore","_getSwapDirection","sibling","dragIndex","moveVector","_unsilent","_cancelNextTick","_globalDragOver","_generateId","useAnimation","store","willInsertAfter","onMoveFn","retVal","firstElRect","childContainingRect","spacer","lastElRect","swapThreshold","invertedSwapThreshold","invertSwap","isLastTarget","mouseOnAxis","targetLength","targetS1","targetS2","invert","_getInsertDirection","inputs","_len","autoScrolls","scrollEl","scrollRootEl","scrolling","lastAutoScrollX","lastAutoScrollY","touchEvt$1","pointerElemChangedInterval","AutoScrollPlugin","AutoScroll","_ref2","clearPointerElemChangedInterval","clearAutoScrolls","autoScroll","ogElemScroller","newElem","isFallback","sens","speed","scrollThisInstance","scrollCustomFn","layersOut","currentParent","canScrollX","canScrollY","scrollWidth","scrollHeight","scrollPosX","scrollPosY","vx","vy","scrollOffsetY","scrollOffsetX","drop","dispatchSortableEvent","hideGhostForTarget","unhideGhostForTarget","toSortable","Revert","_ref3","Remove","_ref4","parentSortable","isDragging","containerRef","getKey","newDraggable","listModel","isDrag","onStart","onUpdate","moveItemInArray","STListItem","selectable","hoverable","dynamicElementName","$attrs","STNavigationBar","scroll","BackButton","InheritComponent","_component_BackButton","_component_InheritComponent","hasLeft","hasRight","canPop","canDismiss","disableDismiss","$isAndroid","$isIOS","TabBarItem","selectedItem","TabBarItemGroup","flatTabs","box","popup","tab","selectTab","useHideTabBar","injector","unregister","tabs","showTopBar","TabBarDropdownView","selectItem","deviceWidth","showBottomBar","hieBottomBarRequesters","shouldHideBottomBar","mainElement","getInternalScrollElements","saveCurrentItemState","scrollElements","appendHistory","tabUrl","positions","newScrollElements","selectTabByName","foundItem","UIFilterEditor","STList","STToolbar","canDelete","live","filterComponent","_component_STToolbar","Column","isPrefix","TableAction","hasSelection","priority","MenuTableAction","AsyncTableAction","selection","InMemoryTableAction","initialRequest","objectFetcher","fetchAll","totalFilteredCount","useTableObjectFetcher","auth","fetcher","TableObjectFetcher","maxLimit","waitTime","shorterWaitTime","filteredCount","endIndex","currentClearIndex","hasFilter","fetchUntil","objects","cachedReference","useInfiniteObjectFetcher","InfiniteObjectFetcher","hasReachedEnd","ColumnSelectorContextMenu","enabled","sortedColumns","setColumnEnabled","ColumnSortingContextMenu","getSortByColumn","TableActionsContextMenu","groupedActions","_component_ContextMenuLine","getChildContextMenu","VisibleRow","EnabledColumnConfiguration","ColumnConfiguration","getPropertiesForRoute","getNext","getPrevious","routeProps","reactiveColumns","showPrefix","wrapColumns","presentPositionableSheet","usePositionableSheet","isMobile","showSelection","isIOS","titleSuffix","hasClickListener","canLeaveSelectionMode","sortBy","visibleRows","searchQuery","selectedUIFilter","blurFocus","markedRows","isRightClicking","customFocusedRows","markedRowsAreSelected","isAllSelected","visibleRow","setShowSelection","sortedActions","filteredActions","maximum","getColumnContextMenu","getSortingContextMenu","buildSelectionObject","customMarkedRows","customMarkedRowsSelected","idFilter","showActions","isOnTop","displayedComponent","onTableHeadRightClick","errorMessage","lastRefresh","lastFilteredCount","cachedProvisionalTotalItems","updateVisibleRows","totalItemsCount","resetFilter","isColumnDragActive","isDraggingColumn","draggingStartX","draggingInitialWidth","draggingInitialColumns","dragType","toggleSort","saveColumnConfiguration","getEventX","touches","onClickRow","setSelectionValue","getSelectionValue","onRightClickRow","columnDragStart","attachDragHandlers","handleDragStart","horizontalPadding","tableElement","tableBody","canCollapse","selectionColumnWidth","totalWidth","leftPadding","rightPadding","col","updatePaddingIfNeeded","updatePadding","updateRecommendedWidths","mouseMove","mouseUp","detachDragHandlers","difference","currentWidth","newWidth","updateColumnWidth","columnMoveIndex","remainingDifference","shouldMove","neededMove","loadColumnConfiguration","getScrollElement","onScroll","listenersAdded","onResize","doRefresh","ticking","_sort","fixColumnWidths","configuration","measureDiv","distributeWidth","afterColumn","strategy","forceWidth","availableWidth","affectedColumns","shrinking","columnPriorities","columnLimits","columnPriorityIndex","updateColumns","limits","absorbed","shrinkAmount","collapse","totalRenderWidth","gridTemplateColumns","canFilter","editFilter","isValueSelected","isRowFocused","getExpectedSelectionLength","cachedScrollElement","cachedTableYPosition","topOffset","totalItems","extraItems","firstVisibleItemIndex","rowHeight","unBoundedLastVisibleItemIndex","lastVisibleItemIndex","totalHeight","observer","calculateModalPosition","innerPadding","positionOptions","isValidVnodes","PromiseView","LoadingViewTransition","LoadComponent","AsyncComponent","speedRun","PromiseComponent","appToUri","uriToApp","uri","useContextOptions","$organization","getRegistrationOption","getDefaultOptions","getOptionForOrganization","buildRootForOption","exports$2","exports$1","exports","oldPrefix","newPrefix","selectOption","isCurrent","currentOptions","otherOptions","searchOrganizations","open","OrganizationAppSelector","VersionFooter","nativeVersion","STAMHOOFD","useFinancialSupportSettings","financialSupportSettings","useRegistrationPeriods","useRegistrationPeriod","hasChanges","saving","deleting","save","deleteMe","ownErrors","$showReducedPrice","reducedPrice","defaultReducedPrice","getDefaultPrice","defaultPrice","defaultReducedPriceNow","defaultPriceNow","minPriceDifference","defaultMembershipTypeId","defaultMembership","mt","formatPriceForPlatform","priceNow","hidden","usedStock","useStock","useMaximum","allowAmount","reducedPriceName","up","canMoveUp","canMoveDown","down","patchOptionsArray","addOptionPatch","addOptionPut","addOptionDelete","draggableOptions","multipleChoice","addOption","editOption","GroupOptionView","editOptionMenu","GroupOptionMenuView","isSingle","forceShowRequireGroupIds","addRequireGroupIds","chooseOrganizer","loadingOrganizer","loadingExternalOrganizerErrorBox","patchPricesArray","addRecordCategoriesPatch","addPricePatch","addPricePut","addPriceDelete","draggablePrices","addOptionMenuPatch","addOptionMenuPut","addOptionMenuDelete","patchRecordsConfiguration","inheritedRecordsConfiguration","didSetAutomaticGroup","availableWaitingLists","usedByGroups","defaultAgeGroups","defaultAgeGroupsFiltered","defaultAgeGroup","nn","virtualOpenStatus","useRegistrationStartDate","registrationStartDate","minAge","maxAge","genderType","requireGroupIds","showAllowRegistrationsByOrganization","allowRegistrationsByOrganization","waitingListType","preRegistrationsDate","maxMembers","showEnableMaxMembers","enableMaxMembers","requirePlatformMembershipOnRegistrationDate","registrationEndDate","priorityForFamily","trialDays","useRegistrationEndDate","defaultMembershipConfig","addGroupPrice","GroupPriceView","editGroupPrice","addGroupOptionMenu","addWaitingList","EditGroupView","isPropertyEnabled","editWaitingList","genderTypes","getAgeGroupAgeString","ageGroup","getAgeGroupSelectionText","ageGroupAgeString","getRegisterItemFilterBuilders","useRegisterItemFilterBuilders","recordEditorSettings","exampleMember","RecordEditorSettings","RecordEditorType","recordCategories","distance","LongPressDirective","firstTouch","lastTouch","scrollListener","touchMoveListener","cancelLongPress","customEvent","onmove","_event","LongPressDirective$1","Dropdown","autocomplete","mappedValue","DateSelectionView","selectedDay","ny","_hoisted_4","_hoisted_5","_hoisted_6","week","onSelect","DateSelection","currentDateValue","iso1","iso2","shorter","firstSpecialCharacter","cutIndex","currentConfig","moveText","focus","focusedInput","autoDismiss","unlessFocused","activeElement","$isMobile","dateText","onFocus","onTyping","dayText","_vModelText","monthText","hasFocus","yearText","unwrapFilterForBuilder","builder","invertedFilter","UIFilter","invertedResult","filterToString","uiFilter","propertyFilterToString","enabledDescription","UIDateFilterMode","getBeginningOfDay","getEndOfDay","DateUIFilter","DateUIFilterView","DateFilterBuilder","isInverted","equals","notEquals","lessThan","greaterThan","draggableFilters","getSelectedChoiceText","choices","showChoices","ff","deleteFilter","setFilter","oldFilter","newFilter","isGroup","GroupUIFilter","setFilterMode","item1","item2","newChildGroup","flatten","filterBuilders","builders","GroupUIFilterBuilder","addFilter","copyFromChanged","encodedJson","UnknownUIFilter","UnknownUIFilterView","UnknownFilterBuilder","GroupUIFilterMode","buildFilters","GroupUIFilterView","plast","allowSelf","subfilters","unwrappedF","dd","groupFilter","isSelectAll","isOptionSelected","setOptionSelected","MultipleChoiceUIFilterOption","MultipleChoiceUIFilterMode","MultipleChoiceUIFilter","multipleChoiceConfiguration","MultipleChoiceUIFilterView","isSubjectPlural","lastJoinWord","MultipleChoiceFilterBuilder","showOptionSelectAll","NumberInput","_oldValue","float","decimals","abs","StepperInput","floatingPoint","_withKeys","internalValue","stepper","valueString","stepperValue","_component_StepperInput","PriceInput","currentValue","_value","currency","STInputBox","_component_STErrorsInput","TimeMinutesInput","split","_component_STInputBox","timeRaw","inputComponent","NumberFilterFormat","UINumberFilterMode","NumberUIFilter","NumberUIFilterView","dateZero","NumberFilterFormat2","NumberFilterBuilder","StringUIFilterView","StringFilterMode","_component_STList","_component_STListItem","_component_Radio","StringUIFilter","StringFilterBuilder","direcltyEqual","contains","notContains","paymentsUIFilterBuilders","memberWithRegistrationsBlobUIFilterBuilders","useMemberWithRegistrationsBlobFilterBuilders","recordConfiguration","getFilterBuildersForRecordCategories","usePlatformMemberFilterBuilders","useAdvancedRegistrationsUIFilterBuilders","loading","hasPlatformPermissions","useAdvancedPlatformMembershipUIFilterBuilders","membershipType","useAdvancedMemberWithRegistrationsBlobUIFilterBuilders","registrationFilters","loadingMembershipFilters","membershipFilters","filterResponsibilities","responsibilities","activeOrExpiringFilter","activeOrExpiringFilterButNoTrial","getFilter","responsibilitiesFilters","checkoutUIFilterBuilders","cachedOutstandingBalanceUIFilterBuilders","organizationMemberUIFilterBuilders","useGetOrganizationUIFilterBuilders","setupStepFilterNameMap","setupStep","elemMatch","enumValues","stringifiedValueToMatch","getOrganizationUIFilterBuildersForTags","tagFilter","useEventUIFilterBuilders","organizations","getEventUIFilterBuilders","organizationFilter","org","tagsFilter","defaultAgeGroupFilter","typeFilter","useAuditLogUIFilterBuilders","getWebshopOrderUIFilterBuilders","preview","paymentMethod","distinctCheckoutMethods","timeCount","dateCount","hasDelivery","nonDeliveryCount","getDocumentsUIFilterBuilders","allForCategory","categoryPrefix","useEventNotificationBackendFilterBuilders","eventType","useEventNotificationInMemoryFilterBuilders","normalizedRadius","circumference","strokeDashoffset","AuthenticatedView","loggedIn","noPermissionsRoot","hasToken","loginRoot","ContextProvider","ImageComponent","maxHeight","autoHeight","imgWidthDark","imgHeightDark","imgWidth","imgHeight","alt","useResizeObserver","elementRef","observing","observe","unobserveAll","rootElement","widths","seekerXOffset","seekerWidth","updateWidths","levelPrefix","tagNames","ageGroupId","useEventPermissions","canWriteSome","canWriteAllGroupEvents","canWriteAllTagEvents","groupsToFilterEventsOn","filterEventsOn","tagsToFilterEventsOn","isGroupEnabledOperatorFactory","isTagEnabledPredicateFactory","canAdminEventForExternalOrganization","ressources","lastCachedValue","getGroupValue","setGroupValue","se","organizationManager","visiblePeriodIds","missingGroups","isEnabledOperator","groupsToChoose","firstEnabled","enabledOptions","navigationActions","useNavigationActions","loadingResults","lastQuery","throttleUpdateResults","cachedCount","deleteText","confirmationCodeInput","isConfirm","doDelete","eventPermissions","isLocationRequired","multipleDays","md","wasMultipleDays","typeId","organizationTagIds","location","coverPhoto","locationName","locationAddress","canSetNationalActivity","isNationalActivity","canSelectOrganization","hasGroupRestrictions","hasTagRestrictions","addGroupsRestriction","addTagRestriction","deleteTagRestriction","isGroupEnabledOperator","isTagEnabledPredicate","resolutions","addLocation","deleteLocation","addDefaultAgeGroupRestriction","deleteDefaultAgeGroupRestriction","deleteGroupsRestriction","addRegistrations","navigation","confirmationCode","DeleteView","_imports_5$2","_imports_9$1","_imports_6$3","OrderedMap","newKey","place","without","findDiffStart","childA","childB","inner","findDiffEnd","posA","posB","iA","iB","minSize","nodeStart","blockSeparator","leafText","nodeText","otherPos","retIndex","curPos","schema","joined","nodes","compareDeep","Mark$1","Mark","placed","mark","marks","ReplaceError","Slice","openStart","openEnd","fragment","insertInto","removeRange","openIsolating","indexTo","offsetTo","dist","$from","$to","slice","replaceOuter","close","prepareSliceForReplace","replaceThreeWay","replaceTwoWay","checkJoin","main","joinable","$before","$after","addNode","addRange","$start","$end","$along","ResolvedPos","parentOffset","dOff","pred","NodeRange","rem","resolveCache","elt","ResolveCache","resolveCacheSize","emptyAttrs","Node$1","Node","startPos","includeParents","wrapMarks","TextNode","ContentMatch","validEnd","nodeTypes","stream","TokenStream","expr","parseExpr","dfa","nfa","checkForDeadEnds","frag","toEnd","tp","active","scan","out","tok","exprs","parseExprSeq","parseExprSubscript","parseExprAtom","parseExprRange","parseNum","resolveName","connect","edge","term","edges","loop","cmp","nullFrom","labeled","explore","states","work","dead","defaultAttrs","attr","computeAttrs","given","checkAttrs","initAttrs","Attribute","NodeType$2","NodeType","spec","matched","markType","topType","validateType","MarkType","rank","Schema","instanceSpec","contentExprCache","contentExpr","markExpr","gatherMarks","excl","ok","isTagRule","rule","isStyleRule","DOMParser","rules","matchedStyles","dom","ParseContext","blockTags","ignoreTags","listTags","OPT_PRESERVE_WS","OPT_PRESERVE_WS_FULL","OPT_OPEN_LEFT","wsOptionsFor","preserveWhitespace","NodeContext","pendingMarks","solid","fill","nextType","pending","markMayApply","parser","topNode","topContext","topOptions","addMarks","removeMarks","nodeBefore","domNodeBefore","matchAfter","ruleID","normalizeList","sync","oldNeedsBlock","continueAfter","nodeType","startIn","contentDOM","block","preserveWS","textNode","useRoot","minDepth","deflt","findSameMarkInSet","upto","stashMark","prevItem","DOMSerializer","markDOM","renderSpec","inline","toDOM","structure","xmlNS","gatherToDOM","suspiciousAttributeCache","suspiciousAttributes","suspiciousAttributesInner","blockArraysIn","suspicious","space","innerContent","lower16","factor16","makeRecover","recoverIndex","recoverOffset","DEL_BEFORE","DEL_AFTER","DEL_ACROSS","DEL_SIDE","MapResult$2","delInfo","recover","StepMap$2","StepMap","ranges","inverted","assoc","oldSize","newSize","side","del","MapResult","oldStart","newStart","Mapping$1","Mapping","maps","mirror","mirrors","mapping","startSize","mirr","totalSize","inverse","corr","stepsByID","Step$2","stepClass","StepResult$2","StepResult","failed","mapFragment","AddMarkStep","Step","oldSlice","RemoveMarkStep","AddNodeMarkStep","newSet","RemoveNodeMarkStep","ReplaceStep","contentBetween","ReplaceAroundStep","gapFrom","gapTo","gap","addMark","tr","removed","removing","adding","removeMark","toRemove","clearIncompatible","parentType","replSteps","newline","canCut","liftTarget","range","lift","gapStart","gapEnd","splitting","findWrapping","innerRange","around","findWrappingOutside","findWrappingInside","withAttrs","outer","inside","innerMatch","wrappers","setBlockType","mapFrom","canChangeType","startM","endM","$pos","setNodeMarkup","newNode","canSplit","typesAfter","innerType","rest","overrideChild","baseType","typeAfter","canJoin","joinPoint","insertPoint","dropPoint","pass","bias","insertPos","fits","wrapping","replaceStep","fitsTrivially","Fitter","Fitter$1","unplaced","fit","moveInline","placedSize","startDepth","sliceDepth","contentAt","frontierDepth","openAtEnd","dropFromFragment","taken","openEndCount","closeNodeStart","addToFragment","contentAfterFits","dropInner","invalidMarks","definesContent","replaceRange","targetDepths","coveredDepths","preferredTarget","preferredTargetIndex","leftNodes","preferredDepth","leftNode","openDepth","targetDepth","expand","closeFragment","startSteps","oldOpen","newOpen","replaceRangeWith","point","deleteRange","covered","AttrStep","DocAttrStep","TransformError","Transform$1","classesById","Selection","$anchor","$head","SelectionRange","lastNode","lastParent","selectionToInsertionEnd","textOnly","TextSelection","findSelectionIn","AllSelection","selectionClass","warnedAboutTextSelection","checkTextSelection","TextBookmark","dPos","NodeSelection","deleted","NodeBookmark","sel","AllBookmark","startLen","_from","_to","_newFrom","newTo","UPDATED_SEL","UPDATED_MARKS","UPDATED_SCROLL","Transaction","Transform","inheritMarks","bind","FieldDesc","baseFields","_marks","_old","Configuration","EditorState","ignore","rootTr","trs","haveNew","oldState","newInstance","$config","pluginFields","bindProps","Plugin","createKey","PluginKey","MapResult$1","StepMap$1","Step$1","StepResult$1","domIndex","reusedRange","textRange","clearReusedRange","isEquivalentPosition","targetOff","scanFor","atomElements","nodeSize","hasBlockDesc","textNodeBefore$1","textNodeAfter$1","isOnEdge","atStart","atEnd","selectionCollapsed","domSel","keyEvent","keyCode","deepActiveElement","caretFromPoint","agent","ie_edge","ie_upto10","ie_11up","ie","ie_version","gecko","_chrome","chrome","chrome_version","safari","ios","mac","windows","android","webkit","webkit_version","windowRect","vp","getSide","clientRect","scrollRectIntoView","view","startDOM","scrollThreshold","scrollMargin","atTop","bounding","moveX","moveY","startX","startY","dX","dY","storeScrollPos","refDOM","refTop","localRect","scrollStack","resetScrollPos","newRefTop","restoreScrollStack","dTop","preventScrollSupported","focusPreventScroll","stored","findOffsetInNode","coords","dxClosest","coordsClosest","rowBot","rowTop","firstBelow","coordsBelow","childIndex","rects","findOffsetInText","singleRect","inRect","targetKludge","posFromElement","posFromCaret","outsideBlock","sawBlock","elementFromPoint","startI","posAtCoords","caret","nonZero","BIDI","coordsAtPos","atom","supportEmptyRange","rectBefore","rectAfter","flattenV","takeSide","flattenH","withFlushedState","viewState","endOfTextblockVertical","boxes","maybeRTL","endOfTextblockHorizontal","oldNode","oldOff","anchorNode","anchorOffset","oldBidiLevel","parentDOM","newOff","cachedState","cachedDir","cachedResult","endOfTextblock","NOT_DIRTY","CHILD_DIRTY","CONTENT_DIRTY","NODE_DIRTY","ViewDesc","widget","outerDeco","innerDeco","nodeName","domBefore","domAfter","onlyNodes","nodeDOM","TrailingHackViewDesc","WidgetViewDesc","enter","fromOffset","toOffset","childBase","anchorDOM","headDOM","brKludge","domSelExtended","mutation","startInside","endInside","dirty","stop","CompositionViewDesc","textDOM","mut","MarkViewDesc","replaceNodes","NodeViewDesc","descObj","applyOuterDeco","CustomNodeViewDesc","TextViewDesc","sameOuterDeco","composition","localComposition","compositionInChild","updater","ViewTreeUpdater","iterDeco","insideNode","compIndex","renderDescs","iosHacks","textPos","findTextInFragment","oldDOM","patchOuterDeco","computeOuterDeco","docViewDesc","docView","descs","written","childDOM","rm","OuterDecoLevel","noDeco","outerDOM","prevComputed","curComputed","curDOM","deco","patchAttributes","prevList","curList","lock","preMatch","maxKeep","markDesc","targetDesc","domNode","nextDOM","locked","ch","hack","parentDesc","curDesc","descI","fI","compareSide","onWidget","onNode","locals","decoIndex","restNode","parentIndex","widgets","cutAt","oldCSS","childStart","selectionFromDOM","origin","nearestDesc","inWidget","nearestDescNode","selectionBetween","editorOwnsSelection","selectionToDOM","syncNodeSelection","curSel","selectCursorWrapper","resetEditableFrom","resetEditableTo","brokenSelectBetweenUneditable","temporarilyEditableNear","resetEditable","removeClassOnSelectionChange","setEditable","img","clearNodeSelection","hasFocusAndSelection","anchorInRightPlace","moveSelectionBlock","$side","selectHorizontally","mods","$newHead","nodePos","nodeLen","isIgnorable","skipIgnoredNodes","skipIgnoredNodesBefore","skipIgnoredNodesAfter","moveNode","moveOffset","setSelFocus","textNodeAfter","textNodeBefore","findDirection","mid","selectVertically","beyond","stopNativeHorizontalDelete","empty","nextNode","switchEditable","safariDownArrowBug","focusNode","focusOffset","getMods","captureKeyDown","serializeForClipboard","serializer","detachedDoc","wrapMap","parseFromClipboard","plainText","inCode","asText","readHTML","restoreReplacedSpaces","contextNode","sliceData","inlineParents","addContext","closeSlice","normalizeSiblings","lastWrap","inLast","addToSibling","closeRight","wrapped","withWrappers","closeRange","_detachedDoc","metas","firstTag","editHandlers","passiveHandlers","InputState","initInput","eventBelongsToView","runCustomHandler","ensureListeners","setSelectionOrigin","destroyInput","currentHandlers","inOrNearComposition","eventCoords","isNear","click","runHandlerOnContext","updateSelection","selectClickedLeaf","selectClickedNode","selectedNode","selectAt","handleSingleClick","selectNode","handleDoubleClick","handleTripleClick","defaultTripleClick","forceDOMFlush","endComposition","selectNodeModifier","flushed","MouseDown","MouseDown$1","targetPos","timeoutComposition","scheduleComposeEnd","delay","clearComposition","timestampFromCustomEvent","findCompositionNode","textBefore","textAfter","descAfter","lastChanged","descBefore","forceUpdate","captureCopy","brokenClipboardAPI","cut","sliceSingleNode","capturePaste","plain","doPaste","preferPlain","singleNode","getText","clipboardData","uris","Dragging$1","dragCopyModifier","mouseDown","draggedSlice","Dragging","dragging","eventPos","$mouse","isNode","beforeInsert","domChangeCount","$cursor","compareObjs","WidgetType$1","WidgetType","noSpec","span","oldOffset","Decoration","InlineType$1","InlineType","NodeType$1","Decoration$1","none","DecorationSet$1","DecorationSet","decorations","buildTree","predicate","childOff","newLocal","mapChildren","byPos","childNode","childOffset","baseOffset","takeSpansForNode","moveSpans","withoutNulls","localSet","DecorationGroup","removeOverlap","DecorationGroup$1","mappedDecos","oldEnd","newEnd","dSize","mustRebuild","fromLocal","toLocal","mapAndGatherRemainingDecorations","spans","gather","hasNulls","localStart","subtree","working","insertAhead","viewDecorations","observeOptions","useCharData","SelectionState","DOMObserver","handleDOMChange","mutations","take","ancestors","newSel","typeOver","brs","br","blockParent","readSel","checkCSS","previousSibling","cssChecked","cssCheckWarned","rangeToSelectionRange","safariShadowSelectionRange","read","parseBetween","from_","to_","startDoc","ruleFromNode","isInline","readDOMChange","addedNodes","compositionID","preferredPos","preferredSide","findDiff","resolveSelection","$fromA","inlineChange","nextSel","looksLikeBackspace","chFrom","chTo","storedMarks","markChange","isMarkChange","parsedSel","curMarks","prevMarks","$newStart","$newEnd","skipClosingAndOpening","$next","fromEnd","mayOpen","endA","endB","adjust","isSurrogatePair","EditorView","checkStateComponent","getEditable","updateCursorWrapper","buildNodeViews","computeDocDeco","redraw","updateSel","pluginsChanged","nodeViews","changedNodeViews","updateDoc","oldScrollPos","forceSelUpdate","selectionContextChanged","chromeKludge","prevState","pluginView","movedPos","dispatchTransaction","sel1","sel2","nA","nB","shift","keyName","ignoreKey","normalizeKeyName","ctrl","mod","normalize","keymap","keydownHandler","baseName","direct","noShift","fromCode","clearNewlines","convertNewlines","pre","supportLinebreak","replaceLinebreaks","replaceNewlines","deleteSelection","dispatch","atBlockStart","joinBackward","$cut","findCutBefore","deleteBarrier","textblockAt","delStep","joinTextblockBackward","joinTextblocksAround","joinTextblockForward","atBlockEnd","findCutAfter","beforeText","beforePos","afterText","afterPos","only","selectNodeBackward","joinForward","selectNodeForward","joinUp","nodeSel","joinDown","newlineInCode","defaultBlockAt","exitCode","above","createParagraphNear","liftEmptyBlock","selectParentNode","joinMaybeClear","conn","canDelAfter","joinAt","selAfter","at","afterDepth","selectTextblockSide","selectTextblockStart","selectTextblockEnd","wrapIn","applicable","wrapInList","listType","doJoin","outerRange","$insert","doWrapInList","joinBefore","splitDepth","splitPos","liftListItem","itemType","liftToOuterList","liftOutOfList","endOfList","indexBefore","sinkListItem","nestedBefore","createChainableState","transaction","CommandManager","rawCommands","editor","command","startTr","shouldDispatch","callbacks","hasStartTransaction","chain","EventEmitter","getExtensionField","extension","splitExtensions","extensions","baseExtensions","nodeExtensions","markExtensions","getAttributesFromExtensions","extensionAttributes","nodeAndMarkExtensions","defaultAttribute","addGlobalAttributes","globalAttribute","attribute","addAttributes","attributes","mergedAttr","getNodeType","nameOrType","mergeAttributes","mergedAttributes","valueClasses","existingClasses","insertClasses","valueClass","getRenderedAttributes","nodeOrMark","callOrReturn","isEmptyObject","fromString","injectExtensionAttributesToParseRule","parseRule","oldAttributes","newAttributes","cleanUpSchemaItem","getSchemaByResolvedExtensions","allAttributes","extraNodeFields","extendNodeSchema","extensionAttribute","parseHTML","renderHTML","renderText","extraMarkFields","extendMarkSchema","getSchemaTypeByName","isExtensionRulesEnabled","enabledExtension","getTextContentFromNodes","maxMatch","sliceEndPos","chunk","isRegExp","InputRule","inputRuleMatcherHandler","inputRuleMatch","run$1","commands","can","inputRulesPlugin","simulatedInputMeta","PasteRule","pasteRuleMatcherHandler","pasteRuleMatch","pasteEvent","dropEvent","resolvedFrom","resolvedTo","textToMatch","createClipboardPasteEvent","pasteRulesPlugin","dragSourceElement","isPastedFromProseMirror","isDroppedFromProseMirror","processEvent","pasteEvt","chainableState","handleDragstart","_view","transactions","isPaste","isDrop","simulatedPasteMeta","isSimulatedPaste","findDuplicates","ExtensionManager","resolvedExtensions","duplicatedNames","addExtensions","priorityA","priorityB","addCommands","inputRules","pasteRules","allPlugins","addKeyboardShortcuts","defaultBindings","shortcut","keyMapPlugin","addInputRules","addPasteRules","addProseMirrorPlugins","proseMirrorPlugins","addNodeView","nodeview","getPos","HTMLAttributes","onBeforeCreate","onCreate","onSelectionUpdate","onTransaction","onBlur","onDestroy","getType","mergeDeep","output","Extension","extendedConfig","getTextBetween","startNode","textSerializers","textSerializer","getTextSerializersFromSchema","ClipboardTextSerializer","blur","clearContent","emitUpdate","clearNodes","$mappedFrom","$mappedTo","nodeRange","targetLiftDepth","defaultType","createParagraphNear$1","originRange","contentSlice","deleteCurrentNode","currentNode","deleteNode","typeOrName","deleteSelection$1","exitCode$1","objectIncludes","object1","object2","findMarkInSet","isMarkInSet","getMarkRange","endPos","getMarkType","extendMarkRange","newSelection","isTextSelection","minMax","resolveFocusPosition","selectionAtStart","selectionAtEnd","minPos","maxPos","isiOS","delayedFocus","isSameSelection","forEach","insertContent","removeWhitespaces","elementFromString","wrappedValue","createNodeFromContent","isJSONContent","isTextContent","schemaToUse","hasInvalidContent","invalidContent","isFragment","nodeOrFragment","insertContentAt","isOnlyTextContent","isOnlyBlockContent","newContent","joinUp$1","joinDown$1","joinBackward$1","joinForward$1","joinItemBackward","joinItemForward","joinTextblockBackward$1","joinTextblockForward$1","isMacOS","keyboardShortcut","capturedTransaction","newStep","isNodeActive","nodeRanges","relativeFrom","relativeTo","selectionRange","matchedNodeRanges","lift$1","liftEmptyBlock$1","liftListItem$1","newlineInCode$1","getSchemaTypeNameByName","deleteProps","propOrProps","newObj","resetAttributes","schemaType","scrollIntoView","selectAll","selectNodeBackward$1","selectNodeForward$1","selectParentNode$1","selectTextblockEnd$1","selectTextblockStart$1","createDocument","parseOptions","setContent","document","getMarkAttributes","markItem","combineTransactionSteps","oldDoc","findChildrenInRange","nodesWithPos","findParentNodeClosestToPos","findParentNode","getHTMLFromFragment","documentFragment","getNodeAttributes","nodeItem","getAttributes","removeDuplicates","simplifyChangedRanges","uniqueChanges","otherChange","getChangedRanges","steps","stepMap","getMarksBetween","getSplittedAttributes","isMarkActive","markRanges","matchedRange","markRange","excludedRange","isActive","isList","isNodeEmpty","defaultContent","isNodeSelection","canSetMark","newMarkType","currentMarks","someNodeSupportsMark","_pos","parentAllowsMarkType","currentMarksAllowMarkType","otherMark","setMark","trimmedFrom","trimmedTo","setMeta","setNode","updatedState","setNodeSelection","setTextSelection","resolvedEnd","sinkListItem$1","ensureMarks","splittableMarks","filteredMarks","splitBlock","keepMarks","$first","splitListItem","grandParent","depthBefore","depthAfter","newNextTypeAttributes","newTypeAttributes","joinListBackwards","joinListForwards","nodeAfter","toggleList","listTypeOrName","itemTypeOrName","parentList","canWrapInList","toggleMark","extendEmptyMarkRange","toggleNode","toggleTypeOrName","toggleType","toggleWrap","undoInputRule","undoable","toUndo","unsetAllMarks","unsetMark","updateAttributes","wrapIn$1","wrapInList$1","Commands","Editable","FocusEvents","Keymap","handleBackspace","$parentPos","parentIsIsolating","parentPos","isAtStart","handleDelete","baseKeymap","pcKeymap","macKeymap","allFrom","allEnd","Tabindex","NodePos","isBlock","childNodePos","nodeAttributes","attrKeys","firstItemOnly","childPos","oldSelection","createStyleTag","nonce","tiptapStyleTag","styleNode","editable","handlePlugins","nameOrPluginKey","allExtensions","selectionHasChanged","nameOrAttributes","attributesOrUndefined","markInputRule","captureGroup","fullMatch","startSpaces","textStart","textEnd","markEnd","nodeInputRule","matchStart","lastChar","insertionStart","textblockTypeInputRule","textInputRule","cutOff","wrappingInputRule","blockRange","currentPos","markPasteRule","inputRegex","encodedTlds","encodedUtlds","alpha","asciinumeric","alphanumeric","emoji","scheme","slashscheme","whitespace","registerGroup","addToGroups","flags","flagsForToken","State","nextState","exactOnly","regexp","templateState","allFlags","ta","WORD","UWORD","LOCALHOST","TLD","UTLD","SCHEME","SLASH_SCHEME","NUM","WS","NL$1","OPENBRACE","CLOSEBRACE","OPENBRACKET","CLOSEBRACKET","OPENPAREN","CLOSEPAREN","OPENANGLEBRACKET","CLOSEANGLEBRACKET","FULLWIDTHLEFTPAREN","FULLWIDTHRIGHTPAREN","LEFTCORNERBRACKET","RIGHTCORNERBRACKET","LEFTWHITECORNERBRACKET","RIGHTWHITECORNERBRACKET","FULLWIDTHLESSTHAN","FULLWIDTHGREATERTHAN","AMPERSAND","APOSTROPHE","ASTERISK","AT","BACKSLASH","BACKTICK","CARET","COLON","COMMA","DOLLAR","DOT","EQUALS","EXCLAMATION","HYPHEN","PERCENT","PIPE","PLUS","POUND","QUERY","QUOTE","SEMI","SLASH","TILDE","UNDERSCORE","EMOJI$1","SYM","tk","ASCII_LETTER","LETTER","EMOJI","DIGIT","SPACE","NL","EMOJI_VARIATION","EMOJI_JOINER","tlds","utlds","init$2","customSchemes","Start","decodeTlds","Num","Word","UWord","Ws","Emoji","EmojiJoiner","wordjr","uwordjr","fastts","sch","iterable","stringToArray","charCount","charCursor","tokenLength","latestAccepting","sinceAccepts","charsSinceAccepts","defaultt","jr","words","popDigitCount","popCount","noop","Options","defaultRender","ignoredTags","uppercaseIgnoredTags","ir","operator","isCallable","MultiToken","truncate","formattedHref","rel","eventListeners","createTokenClass","Nl","Url","makeState","init$1","qsAccepting","qsNonAccepting","localpartAccepting","Localpart","Domain","Scheme","SlashScheme","LocalpartAt","LocalpartDot","EmailDomain","EmailDomainDot","Email$1","EmailDomainHyphen","EmailColon","DomainHyphen","DomainDot","DomainDotTld","DomainDotTldColon","DomainDotTldColonPort","Url$1","UrlNonaccept","SchemeColon","SlashSchemeColon","SlashSchemeColonSlash","UriPrefix","bracketPairs","OPEN","CLOSE","UrlOpen","UrlOpenQ","UrlOpenSyms","multis","textTokens","secondState","multiLength","initMultiToken","Multi","subtokens","startIdx","endIdx","warn","warnAdvice","INIT","registerCustomProtocol","optionalSlashSlash","init","tokenize","isValidLinkStructure","autolink","docChanges","preventAutolink","newRange","nodesInChangedRanges","textBlock","textBeforeWhitespace","wordsBeforeWhitespace","lastWordBeforeSpace","lastWordAndBlockOffset","linksBeforeSpace","els","pasteHandler","textContent","ATTR_WHITESPACE","IS_ALLOWED_URI","isAllowedUri","foundLinks","validate","emDash","override","ellipsis","openDoubleQuote","closeDoubleQuote","openSingleQuote","closeSingleQuote","leftArrow","rightArrow","copyright","trademark","servicemark","registeredTrademark","oneHalf","plusMinus","notEqual","laquo","raquo","multiplication","superscriptTwo","superscriptThree","oneQuarter","threeQuarters","Typography","Underline","Blockquote","starInputRegex","starPasteRegex","underscoreInputRegex","underscorePasteRegex","Bold","ListItem","TextStyle","BulletList","inputRule","pasteRegex","Code","backtickInputRegex","tildeInputRegex","CodeBlock","languageClassPrefix","isAtEnd","endsWithDoubleNewline","vscode","vscodeData","dropCursor","editorView","DropCursorView","nodeRect","parentLeft","parentTop","disableDropCursor","Dropcursor","GapCursor","GapBookmark","closedBefore","closedAfter","mustMove","$cur","gapCursor","drawGapCursor","handleClick","handleKeyDown","beforeinput","arrow","axis","dirStr","$found","clickPos","Gapcursor","HardBreak","Heading","GOOD_LEAF_SIZE","RopeSequence","Append","Leaf","prototypeAccessors","leftLen","max_empty_items","Branch","eventCount","preserveItems","remap","addAfter","addBefore","Item","histOptions","oldItems","overflow","DEPTH_OVERFLOW","cutOffEvents","mirrorPos","rebasedTransform","rebasedCount","rebasedItems","newUntil","iRebased","newMaps","branch","cutPoint","mirrorOffset","HistoryState","undone","prevRanges","prevTime","prevComposition","applyTransaction","history","historyTr","historyKey","rebased","closeHistoryKey","appended","mustPreserveItems","rangesFor","isAdjacentTo","mapRanges","adjacent","histTransaction","redo","newHist","cachedPreserveItems","cachedPreserveItemsPlugins","hist","inputType","undo","buildCommand","History","HorizontalRule","$originFrom","$originTo","currentChain","posAfter","Italic","OrderedList","attributesWithoutStart","Paragraph","Strike","StarterKit","_o","_p","_q","_r","_s","_t","useDebouncedRef","Editor","Editor$1","EditorContent","newElement","vueRenderers","vueRenderer","LoadingButton","Spinner","_component_Spinner","UploadButton","formData","_component_LoadingButton","elementName","uploading","DescriptiveText","SmartButtonNode","smartButton","SmartButtonInlineNode","SmartVariableNode","smartVariable","SmartVariableNodeBlock","Tooltip","usedXPlacement","usedYPlacement","transformOrigin","TooltipDirective","isMouseHover","TooltipDirective$1","TextStyleButtonsView","_directive_tooltip","CustomImage","ImageExtension","smartVariablesFor","smartButtonsFor","smartVariables","smartButtons","showTextStyles","editLink","showLinkEditor","buildEditor","linkInput","openLinkEditor","isValidHttpUrl","saveLink","cleanedUrl","clearLink","imageResolutions","insertImage","image","openTextStyles","newReplacements","oldReplacements","warnInvalidNodes","deleteInvalidNodes","newSmartVariables","oldSmartVariables","getSmartButton","getSmartVariable","showSmartVariableMenu","initialSelection","webshops","originalArray","patchedArray","addAPatch","emailAddress","isDefault","originalValue","SelectableGroup","SelectableWebshop","enableMemberModule","enableWebshopModule","organizationPatch","shouldSavePeriod","organizationPeriodPatch","hasChangesFull","otherChanges","editEmail","EditEmailView","addEmail","creatingEmail","files","selectedRecipientOptions","groupByEmail","savingPatch","sending","patchedEmail","recipientFilter","selectedIds","selectedOption","buildFilter","onlyOption","toDescription","fromName","selectedEmailAddress","doThrottledPatch","createEmail","updateEmail","patchEmail","_savingPatch","updating","manageEmails","EmailSettingsView","getHTML","send","recipientCount","resopnse","getContextMenuForOption","showToMenu","getFileIcon","deleteAttachment","attachment","toBase64","reader","changedFile","canOpenTemplates","openTemplates","hasExistingContent","EditEmailTemplatesView","exampleRecipient","defaultReplacements","viewTitle","templates","loadTemplates","cachedOutstandingBalancesEnabled","tabItems","editableList","orgId","defaultTemplate","groupedList","getTemplatePrefix","emailTemplate","EditEmailTemplateView","toCreate","saveWithoutDismiss","addTemplate","addCreateOption","deleteEmail","doSelectItem","googleMapsUrl","differentOrganization","ageGroups","chooseFamilyMembersForGroup","useChooseFamilyMembersForGroup","openGroup","_imports_6$2","defaultDisplayOptions","runDisplayOptions","pushOptions","displayOptions","glueNavigationActions","didShowView","currentNavigate","ViewStepsManager","finishHandler","currentStep","skipping","nextStep","gluedNavigate","diffEnum","diffDate","dno","dn","getDiffKey","autoEncoder","getDiffName","getDiffPutValue","getDiffValue","findOriginalById","findOriginalIndexById","findOriginal","findIndex","diffArray","orderChanged","originalIndex","diffUnknown","diffMap","transformValueForDiff","diffObject","ov","diffField","lastKeyItem","rootKey","ObjectDiffer","saveModel","canSaveDraft","saveDraft","notification","isReviewer","isComplete","deleteModel","isSaving","diffList","getRootCategory","rootCategory","outerLoop","editRecordCategory","EditEventNotificationRecordCategoryView","isEnabled","getRecordCategoryProgress","openEvent","EventOverview","doSubmit","doAcceptPartially","InputSheet","doAccept","doReject","editFeedbackText","showOriginalAnswers","OriginalEventNotificationAnswersView","doDraft","useEventNotification","eventNotificationFetcher","notifications","EventNotificationViewModel","isNew","eventNotification","saveHandler","GeneralStep","viewModel","EditEventNotificationGeneralView","RecordCategoryStep","getEventNotificationSteps","loadNotificationPromise","EventNotificationView","eventOrganization","setOrganization","groupOrganization","setGroupOrganization","canWriteEvent","MembersTableView","EditEventView","chooseOrganizationMembersForGroup","useChooseOrganizationMembersForGroup","addMembers","dayOfWeekSuggestion","selectedYear","years","createDefaultUIFilter","yearLabels","canWriteSomeEvent","getRequiredFilter","addSuggestions","suggestedGroups","suggestionsGroup","fillEventsUntil","fetcherLastDate","fillUntil","eventSuggestions","pointer","suggestions","filledEvents","groupedEvents","addEvent","defaultStartDate","defaultEndDate","onClickEvent","getDefaultStamhoofdFilter","bindingValue","myText","CopyableDirective","VATPercentage","isManualMethod","canWrite","markingPaid","sortedItems","markPaid","markPending","markFailed","loadedPayment","load","canClick","editBalanceItem","EditBalanceItemView","filteredItems","isPayable","priceBreakdown","laterBalance","balance","_imports_0$8","_imports_1$6","openPayment","AsyncPaymentView","patchedBalanceItem","platformFamilyManager","usePlatformFamilyManager","loadMember","loadFamilyFromUser","sortedPayments","hasPayments","createdAt","dueAt","originalMemberId","outstanding","paid","familyBlob","IBANInput","ibantools","ibanRaw","setItemSelected","filteredBalanceItems","isItemSelected","getItemPrice","setItemPrice","patchedPayment","availableMethods","availableTypes","availableStatuses","updateMethod","transferSettings","paidAt","transferDescription","creditor","hasWrite","groupedItems","detailedItem","selectedTab","pendingPayments","succeededPayments","reload","reloadFamily","createPayment","EditPaymentView","createBalanceItem","iframe","updateSize","elementComputedStyle","paddingLeft","paddingRight","cleanHtml","newHTML","replaceIframeContent","iframeElement","base64Encode","binString","isRenderable","copyable","tooltip","renderAny","showMember","showPayment","showEvent","showOrganization","showHtml","RenderTextComponent","memberFetcher","eventFetcher","organizationFetcher","paymentFetcher","SafeHtmlView","paymentId","PaymentView","MemberSegmentedView","eventId","OrganizationView","TextWithClass","getRenderText","hasOld","hasValue","userDescription","showDescriptionInTitle","showContext","AuditLogsView","groupedLogs","groupLogs","log","logs","dateRangeSuggestions","DateRangeSuggestion","buildSuggestions","selectSuggestion","suggestion","isSuggestionSelected","PlatformFamilyManager","updateContextFromMembersBlob","removeRegistrations","clearAfter","createdMembers","mm","savedMember","updatedMember","oldId","userMemberId","newUserMemberId","cm","fresh","processedGroups","getResponsibilityMergedRole","platformResponsibilities","selectedOrganization","organizationResponsibilities","groupedResponsibilites","groupedPlatformResponsibilities","groupedOrganizationResponsibilities","organizationGroups","disabledMemberResponsibilityRecords","deletedMemberResponsibilityRecords","labels","isResponsibilityEnabled","getResponsibilityEnabledDescription","getResponsibilityRecordEnabledDescription","setResponsibilityEnabled","originalEnabled","isMemberResponsibilityRecordEnabled","setMemberResponsibilityRecordEnabled","getResponsibilityMergedRoleDescription","getResponsibilityFromRecord","groupData","getResponsibilityRecordMergedRoleDescription","useRegistrationActionBuilder","RegistrationActionBuilder","selectedOrganizationRegistrationPeriod","checkoutRegisterItem","getSelectableWorkbook","financialSupportTitle","flattenedCategories","groupColumns","returnNullIfNoAccessRight","requiresAccessRights","parentNumber","useDirectMemberActions","useMemberActions","MemberActionBuilder","EmailView","MemberStepView","EditMemberAllBox","EditMemberResponsibilitiesBox","ExcelExportView","checkoutDefaultItem","useEditMember","deletingUsers","sortedUsers","deleteUser","isDeletingUser","amounts","amountOption","goNext","needsPay","selectedPaymentMethod","paymentMethods","paymentConfiguration","memberManager","waitingListNames","inCartRegisterItem","inCartRegisterWaitingListItem","validateRegisterItem","registerItem","validationError","canRegister","validationWarning","useCheckoutRegisterItem","editRegisterItem","hasNoMembers","canEdit","editMe","contextOrganization","canSelectAll","canUnselectAll","deselectAllResults","selectAllResults","cartLength","$addMember","useAddMember","useCheckoutDefaultItem","chooseGroupForMember","useChooseGroupForMember","isOnlyDeleting","hasPaidRegistrationDelete","hadPaidByOrganization","addMember","searchMembers","SearchOrganizationMembersForGroupView","goToCheckout","startCheckout","MemberStepManager","checkboxWarning","dataPermissions","dataPermissionsChangeDate","checkboxLabel","maxOutdatedTime","MemberDataPermissionStep","details","EditMemberDataPermissionsBox","useIsPropertyRequired","isAllOptional","useIsAllOptional","useIsPropertyEnabled","write","PhoneInput","silent","libphonenumber","phoneNumber","phoneRaw","saveText","contactTitle","minorMembers","isPropertyRequired","emergencyContacts","initialContacts","visibleContacts","isContactSelected","setContactSelected","editContact","EditEmergencyContactView","addContact","MemberEmergencyContactsStep","EditEmergencyContactsBox","requiresFinancialSupport","expectedValue","hasKansenTarief","uitpasNumber","MemberFinancialSupportStep","EditMemberFinancialSupportBox","MemberGeneralStep","EditMemberGeneralBox","EmailInput","emailRaw","nrrRaw","isSuggestion","AddressInput","isFinal","_component_Dropdown","SelectionAddressInput","_address","selectedAddress","editingAddress","editAddress","_component_AddressInput","internalValidator","clonedFamily","realMember","parentTypes","relatedMembers","isNRNRequiredForThisParent","alternativeEmails","nationalRegisterNumber","availableAddresses","newEmails","getEmail","setEmail","formatParentType","otherParents","modifyAddress","initialParents","visibleParents","isParentSelected","setParentSelected","editParent","EditParentView","addParent","reviewDate","MemberParentsStep","EditMemberParentsBox","FileInput","required","ImageInput","placeholderShownResolution","shownResolution","patchAnswer","patchMap","casted","label","inputPlaceholder","comments","selectedChoice","selectedChoiceId","integerValue","textValue","addressValue","dateValue","imageValue","fileValue","accept","getChoiceSelected","setChoiceSelected","readValue","markReviewed","doMarkReviewed","calculateLastReviewed","isLastReviewIncomplete","calculateLastReviewIncomplete","canMarkReviewed","filteredWriteableRecords","deepFilteredWriteableRecords","isOptional","childCategories","hasAnswers","clearAnswers","allOptional","owningOrganization","MemberRecordCategoryStep","EditMemberRecordCategoryBox","uitpasNumberRaw","clearErrorBox","preventInvalidUitpasNumberChars","MemberUitpasStep","_manager","EditMemberUitpasBox","defaultOutdatedTime","getAllMemberSteps","isInCart","addRecordAnswersPatch","trial","customStartDate","addToCart","getOptionSelected","setOptionAmount","getOptionAmount","filteredOptions","clonedCart","RegisterItemStep","RegisterItemView","PayconiqBannerView","STFloatingFooter","PayconiqButtonView","_component_STNavigationBar","paymentUrl","_imports_0$7","_imports_1$5","_imports_1$4","_imports_2$2","_imports_3$2","_imports_4$1","_imports_6$1","_imports_5$1","QRCodeUrl","generateQRCode","setLeave","preventLeave","isBelgium","isStructured","formattedTransferDescription","qrMessage","ibanValue","creditorValue","QRCode","helpMe","PaymentHandler","successHandler","failedHandler","transferHandler","TransferPaymentView","buttonComponent","bannerComponent","FreeContributionStep","FreeContributionView","companies","selectedCompanyId","buildCustomer","editInvoiceSettings","GeneralSettingsView","PaymentCustomerStep","PaymentCustomerView","PaymentSelectionStep","PaymentSelectionView","clearAndEmit","_payment","RegistrationSuccessView","loadGroupOrganization","originalItem","showGroupInformation","startCheckoutFlow","customNavigate","ChooseFamilyMembersForGroupView","openOrganizationCart","ChooseOrganizationMembersForGroupView","useOrganizationCart","ChooseGroupForMemberView","familyMembers","maxFamilyAge","ages","gotoMember","editMember","memberDetails","notes","editThisMember","recordsWithAnswers","isAllCheckboxAnswers","recordCheckboxAnswer","isDeactivated","isEditable","registrationOrganization","ag","editRegistration","visibleRegistrationsTitle","defaultPeriod","showDeleted","hasDeleted","filteredRegistrations","visibleRegistrations","addRegistration","openCart","buildActions","switchCycle","isRenewingSecurityCode","shouldShowResetSecurityCode","securityCode","renewSecurityCode","isLoading","showLoader","onDelete","unverifiedAddresses","unverifiedPhones","unverifiedEmails","shouldShow","formatWithIndex","addressToLines","lines","deletePhone","deleteFromMemberDetails","deleteAddress","valueToDelete","confirmMessage","confirmButtonText","membersPatch","detailsPatch","arrayPatch","autoCompletedAnswers","allRecords","answerClone","nextMembership","getNextMembership","hasWarnings","sortedWarnings","nextMemberships","responsibilityOrganization","resp","hasRegistration","hasResponsibilities","nationalResponsibilities","getResponsibilityIndex","organizationIndex","sortedResponsibilities","editResponsibilities","tmpItem","financialSupportWarningText","customEndDate","minimumStartDateForDaysTypes","availableOrganizations","availableMembershipTypes","memberDefaultAgeGroupIds","selectedMembershipType","periodConfig","platformMembershipsPatch","getTypeAvailable","getTypeDateDescription","getTypePriceDescription","getPriceForDate","getTypePriceNormalPrice","deletingMemberships","patchingMemberships","hasFull","isRegisteredAt","memberships","filteredPeriods","getMembershipsForPeriod","getOrganizationName","membership","addMembership","SelectPlatformMembershipView","deleteMembership","unlockMembership","getMembershipType","MemberDetailsTab","MemberPlatformMembershipTab","MemberPaymentsTab","tabComponents","tabLabels","tabIndex","selectOrganization","selectionCount","showSelectOrganization","canShowDueAt","chargeViewDescription","defaultOrganizationId","defaultOrganization","limitedFilteredRequest","createBody","getConfirmationText","estimatedRows","modernTableView","filterPeriodId","defaultFilter","organizationRegistrationPeriod","tableObjectFetcher","configurationId","financialRead","periodIds","allColumns","accounts","incomplete","outstandingBalance","memberGroups","getIndex","Route","actionBuilder","canAdd","excludeEdit","ChargeMembersView","_imports_0$6","_imports_16","CodeInput","letter","codeLength","selectNext","clearInput","newClone","willMarkReviewed","isDuplicate","patchMemberWithReviewed","saveClone","willChangeToWaitingList","searchOrganizationTitle","checkOrganization","allowChangingOrganization","treeFactory","alreadyRegisteredGroups","alreadyRegisteredMessage","groupsString","filterGroups","noGroupsMessage","organizationName","addOrganization","searchOrganization","updateDate","RadioGroup","trackingYear","lidSuffix","showBirthDayMenu","addTrackingYear","deleteTrackingYear","PropertyFilterInput","useCache","isAlwaysEnabled","isAlwaysRequired","isNeverRequired","hasFilters","setRequiredWhen","isDevelopment","PropertyFilterView","editingConfiguration","_component_PropertyFilterInput","$review","setupStepTranslations","checkboxTitle","hasVATNumber","companyNumber","VATNumber","companyName","companyAddress","hasCompanyNumber","doesNotHaveCompanyNumber","administrationEmail","$overrideIsDone","$hasReviewChanges","saveReview","$reviewCheckboxData","useReview","hasSomeChanges","draggableCompanies","website","addCompany","company","EditCompanyView","editCompany","patchAnswers","_imports_0$5","emailWarningSvg","missingDataSvg","_imports_3$1","useRegistrationQuickActions","fillInMemberMissingData","checkAllMemberData","activeMembers","membersWithMissingData","activeSteps","membersWithoutMissingData","membersWithMissingEmail","lastLoadedBalance","updateBalance","cartSvg","organizationStatus","outstandingAmountSvg","getReviewDescription","isSelectable","$isDone","reviewDescription","$progress","$secondaryIcon","icons","$steps","$stepsByPriority","STNavigationTitle","_imports_1$3","_imports_10","_imports_2$1","isClosing","buttonsRef","focusNextButton","onClickOutside","onClickButton","closeButton","getButtons","focusedButton","defaultButton","ToastView","ToastBox","_TransitionGroup","AgeInput","descriptionText","CompanyNumberInput","companyNumberRaw","PasswordStrength","saved","calculator","strength","_hoisted_7","_hoisted_8","warning","PermyriadInput","PrefixInput","focusPrefix","SegmentedControl","TimeInput","UrlInput","autoCorrected","urlRaw","VATNumberInput","jsvat","VATNumberRaw","Placeholder","isEmptyDoc","hasAnchor","isEmpty","classes","decoration","contrastColor","colorDark","newL","newRGB","darkMode","WarningBox","escapeHtml","WYSIWYGTextInput","STButtonToolbar","_component_editor_content","getTagValue","setTagValue","GroupAvatar","StepsHeader","Steps","$step","originalCheckboxValue","$checkboxValue","$hasChanges","updateReviewedAt","updatedPeriod","isSuccess","setValue","_imports_0$4","AddDiscountCodeBox","CartItemRow","FieldBox","withTitle","OptionMenuBox","canSelectOption","getOptionStockText","SeatSelectionBox","updatedSeats","addedSeat","seats","currentPosition","furthestSeat","ss","cartReservedSeat","isSelected","isDisabledPersonSeat","isHighlighted","highlightSeats","isOccupied","getSeatColor","ChooseSeatsView","planId","seatingPlanSection","_component_SeatSelectionBox","highlighedSeats","setSeats","pricedItem","pricedCheckout","willNeedSeats","withSeats","onChangeItem","clonedCheckout","pricedItemClone","formattedPriceWithDiscount","formattedPriceWithoutDiscount","cartEnabled","chooseSeats","suffixSingular","imageSrc","remainingReduced","discountPrice","availableStock","maximumRemaining","maximumRemainingAcrossOptions","stockText","maximumRemainingValue","getPriceStock","getPriceStockText","canSelectPrice","formatDateRange","dateRange","areSeatsSoldOut","canOrder","canSelectAmount","priceString","priceRanges","imageResolution","remainingWithoutCart","editExisting","maxOrder","onClicked","CartItemView","ProductGrid","ProductBox","products","_component_ProductBox","CategoryBox","LoadingView","ChangePasswordView","SaveView","patchedValue","LogoEditor","enable","ShowSeatsView","updatedProduct","pollCount","didFinish","poll","paymentFromResponse","_imports_0$3","sortedPaymentMethods","hasNonPayconiq","hasTransfer","hasPOS","getName","getWarning","ColorDirective","hue","formatInput","cleaner","formatter","cleanedSelectionStart","newSelectionStart","FormatInputDirective","focusNextElement","focussableElements","focussable","nextElement","VueGlobalHelper","trace","isNullOrUndef","isNumberFinite","finiteOrDefault","valueOrDefault","toPercentage","dimension","toDimension","each","loopable","reverse","_elementsEqual","a0","a1","ilen","v0","clone$1","klen","isValidKey","_merger","tval","sval","merge","sources","merger","mergeIf","_mergerIf","keyResolvers","resolveObjectKey","_getKeyResolver","_splitKey","_capitalize","defined","setsEqual","_isClickEvent","PI","TAU","PITAU","INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","niceNum","roundedRange","almostEquals","niceRange","_factorize","sqrt","epsilon","almostWhole","rounded","_setMinAndMaxByKey","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_int16Range","_isBetween","_lookup","hi","lo","_lookupByKey","_rlookupByKey","_filterBetween","arrayEvents","listenArrayEvents","unlistenArrayEvents","stub","listeners","_arrayUnique","requestAnimFrame","throttled","updateFn","updateArgs","debounce","_toLeftRightCenter","align","_alignStartEnd","_getStartAndCountOfVisiblePoints","points","animationsDisabled","pointCount","iScale","_parsed","minDefined","maxDefined","_scaleRangesChanged","xScale","yScale","_scaleRanges","newRanges","atEdge","elasticIn","elasticOut","effects","lim","p2b","n2b","b2n","n2p","map$1","h1","isShort","hexParse","hexString","HUE_RE","hsl2rgbn","hsv2rgbn","hwb2rgbn","hueValue","rgb2hsl","calln","hsl2rgb","hwb2rgb","hsv2rgb","hueParse","rotate","deg","hslString","names$1","unpack","unpacked","tkeys","nk","nameParse","RGB_RE","rgbParse","rgbString","interpolate","rgb1","rgb2","modHSL","fromObject","functionParse","Color","w2","w1","index_esm","isPatternOrGradient","getHoverColor","descriptors","getScope$1","Defaults","_descriptors","targetScope","targetName","scopeObject","targetScopeObject","privateName","toFontString","font","_measureText","gc","longest","textWidth","_longestText","arrayOfThings","jlen","nestedThing","gcLen","_alignPixel","chart","pixel","devicePixelRatio","halfWidth","clearCanvas","canvas","drawPoint","drawPointLegend","xOffset","yOffset","cornerRadius","rotation","radius","rad","_isPointInArea","area","clipArea","unclipArea","_steppedLineTo","flip","midpoint","_bezierCurveTo","stroke","setRenderOpts","decorateText","metrics","yDecoration","addRoundedRectPath","LINE_HEIGHT","FONT_STYLE","toLineHeight","numberOrZero","_readValueToProps","objProps","toTRBL","toTRBLCorners","toPadding","toFont","cacheable","_addGrace","minmax","grace","beginAtZero","keepZero","createContext","parentContext","_createResolver","scopes","rootScopes","getTarget","_resolve","_cached","_resolveWithPrefixes","getKeysFromAllScopes","_attachContext","subProxy","descriptorDefaults","_resolveWithContext","_scriptable","_indexable","_allKeys","readKey","needsSubResolver","_subProxy","_resolveScriptable","_resolveArray","_stack","createSubResolver","isIndexable","resolver","resolveFallback","getScope","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","_parseObjectDataRadialScale","EPSILON","getPoint","getValueAxis","indexAxis","splineCurve","firstPoint","middlePoint","afterPoint","d01","d12","s01","s12","fa","fb","monotoneAdjust","deltaK","mK","pointsLen","alphaK","betaK","tauK","squaredMagnitude","pointCurrent","pointAfter","monotoneCompute","valueAxis","pointBefore","iPixel","vPixel","splineCurveMonotone","slopeDelta","capControlPoint","pt","capBezierPoints","inArea","inAreaPrev","inAreaNext","_updateBezierControlPoints","controlPoints","_isDomSupported","_getParentNode","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","getStyle","getPositionedStyle","useOffsetPos","getCanvasPosition","offsetX","offsetY","getRelativePosition","currentDevicePixelRatio","borderBox","paddings","borders","getContainerSize","maxWidth","containerStyle","containerBorder","containerPadding","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","containerSize","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","supportsEventListenerOptions","passiveSupported","readUsedSize","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","intlCache","getNumberFormat","formatNumber","getRightToLeftAdapter","rectX","itemWidth","getLeftToRightAdapter","_itemWidth","getRtlAdapter","rtl","overrideTextDirection","restoreTextDirection","propertyFn","normalizeSegment","getSegment","segment","startBound","endBound","between","_boundSegment","subStart","startIsBefore","endIsBefore","shouldStart","shouldStop","_boundSegments","findStartAndEnd","spanGaps","solidSegments","_computeSegments","segmentOptions","splitByStyles","completeLoop","doSplitByStyles","chartContext","baseStyle","readStyle","datasetIndex","addStyle","st","styleChanged","Animator","anims","numSteps","draw","charts","animator","transparent","interpolators","c0","Animation","cfg","remain","rej","colors","animationOptions","Animations","animatedProps","newOptions","resolveTargetOptions","animations","awaitAll","animation","anim","scaleClip","scale","allowedOverflow","defaultClip","toClip","getSortedDatasetIndices","filterVisible","metasets","applyStack","dsIndex","singleMode","otherValue","convertObjectDataToArray","adata","isStacked","stacked","getStackKey","indexScale","valueScale","getUserBounds","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","vScale","positive","updateStacks","controller","iAxis","vAxis","itemStacks","getFirstScaleId","scales","createDatasetContext","createDataContext","clearStacks","isDirectUpdateMode","cloneIfNotShared","createStack","canStack","DatasetController","dataset","chooseId","xid","yid","rid","iid","vid","scaleID","_data","resetNewElements","stackChanged","oldStacked","scopeKeys","_stacked","isNotInOrderComparedToPrev","singleScale","xAxisKey","yAxisKey","parsedValue","otherScale","otherMin","otherMax","_skip","drawActiveElementsOnTop","elementType","sharing","sharedOptions","firstOpts","previouslySharedOptions","includeOptions","arg1","arg2","numMeta","numData","newCount","getAllScaleValues","visibleMetas","computeMinSampleSize","curr","updateMinAndPrev","computeFitCategoryTraits","ruler","stackCount","thickness","computeFlexCategoryTraits","pixels","percent","parseFloatBar","entry","startValue","endValue","barStart","barEnd","parseValue","parseArrayOrPrimitive","isFloatBar","barSign","actualBase","borderProps","setBorderSkipped","parseEdge","swap","startEnd","orig","setInflateAmount","inflateAmount","BarController","iAxisKey","vAxisKey","bars","horizontal","vpixels","ipixels","dataIndex","skipNull","barThickness","baseValue","minBarLength","floating","startPixel","endPixel","halfGrid","maxBarThickness","center","stackIndex","BubbleController","getRatioAndOffset","cutout","ratioX","ratioY","startAngle","endAngle","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","DoughnutController","chartArea","arcs","spacing","maxSize","chartWeight","maxRadius","outerRadius","innerRadius","radiusLength","animationOpts","centerX","centerY","animateScale","arc","metaData","ringWeightOffset","pointStyle","legendItem","legend","tooltipItem","dataLabel","LineController","_dataset","maxGapLength","directUpdate","prevParsed","nullData","border","lastPoint","PolarAreaController","datasetStartAngle","defaultAngle","PieController","RadarController","pointPosition","Element$1","useFinalPosition","Element","formatters","tickValue","ticks","notation","maxTick","calculateDelta","logDelta","numDecimal","Ticks","autoSkip","tickOpts","ticksLimit","determineMaxTicks","majorIndices","getMajorIndices","numMajorIndices","newTicks","skipMajors","calculateSpacing","avgMajorSpacing","tickLength","maxScale","maxChart","evenMajorSpacing","getEvenSpacing","factors","majorStart","majorEnd","reverseAlign","offsetFromEdge","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","garbageCollect","caches","getTickMarkLength","getTitleHeight","createScaleContext","createTickContext","tick","titleAlign","titleArgs","titleX","titleY","positionAxisID","Scale","_userMin","_userMax","_suggestedMin","_suggestedMax","sampleSize","samplingEnabled","reversePixels","numTicks","minRotation","maxRotation","labelRotation","tickWidth","maxLabelDiagonal","labelSizes","maxLabelWidth","maxLabelHeight","titleOpts","gridOpts","display","isHorizontal","titleHeight","widest","highest","tickPadding","angleRadians","cos","sin","labelHeight","labelWidth","isRotated","labelsBelowTicks","offsetRight","heights","widestLabelSize","highestLabelSize","tickFont","fontString","lineHeight","nestedLabel","valueAt","decimal","optionTicks","rot","grid","ticksLength","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","optsAtIndex","lineWidth","lineColor","borderDash","borderDashOffset","tickColor","tickBorderDash","tickBorderDashOffset","crossAlign","tickAndPadding","hTickAndPadding","textAlign","lineCount","textOffset","textBaseline","halfCount","strokeColor","strokeWidth","tickTextAlign","backdrop","labelPadding","backgroundColor","drawLine","lastLineWidth","gz","axisID","fontSize","TypedRegistry","parentScope","isIChartComponent","registerDefaults","itemDefaults","routeDefaults","propertyParts","sourceName","sourceScope","Registry","typedRegistry","itemReg","camelMethod","ScatterController","showLine","abstract","DateAdapter","chartOptions","adapters","binarySearch","metaset","intersect","_sorted","lookupMethod","evaluateInteractionItems","getDistanceMetricForAxis","useX","useY","deltaX","deltaY","getIntersectItems","includeInvisible","getNearestRadialItems","evaluationFunc","getNearestCartesianItems","distanceMetric","minDistance","inRange","getNearestItems","getAxisItems","rangeMethod","intersectsItem","Interaction","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","wrapBoxes","layoutBoxes","stackWeight","buildStacks","layouts","setLayoutDims","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","buildLayoutBoxes","centerHorizontal","centerVertical","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","newHeight","widthChanged","heightChanged","handleMaxPadding","updatePos","getMargins","marginForPositions","fitBoxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","layoutItem","minPadding","availableHeight","verticalBoxes","horizontalBoxes","visibleVerticalBoxCount","BasePlatform","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","isNullOrEmpty","initCanvas","renderHeight","renderWidth","displayWidth","displayHeight","eventListenerOptions","addListener","removeListener","fromNativeEvent","nodeListContains","nodeList","createAttachObserver","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","resize","listenDevicePixelRatioChanges","unlistenDevicePixelRatioChanges","createResizeObserver","releaseObserver","createProxyAndListen","DomPlatform","initial","proxies","_detectPlatform","PluginService","createDescriptors","previousDescriptors","localIds","getOpts","pluginOpts","getIndexAxis","datasetDefaults","getAxisFromDefaultScaleID","getDefaultScaleIDFromAxis","axisFromPosition","determineAxis","scaleOptions","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","firstIDs","scaleConf","defaultId","defaultScaleOptions","defaultID","initOptions","initData","initConfig","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","datasetType","mainScope","resetCache","_scopeCache","keyLists","subPrefixes","getResolver","needContext","subResolver","resolverCache","hasFunction","isScriptable","scriptable","indexable","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","onAnimationsComplete","onAnimationProgress","getCanvas","instances","getChart","moveNumericKeys","intKey","determineLastEvent","lastEvent","inChartArea","isClick","Chart","userConfig","initialCanvas","existingChart","maintainAspectRatio","_aspectRatio","newRatio","scalesOptions","axisOptions","scaleOpts","isRadial","scaleType","scaleClass","hasUpdated","datasets","newControllers","ControllerClass","datasetElementType","dataElementType","animsDisabled","_active","_lastEvent","existingEvents","newEvents","_hiddenIndices","_dataChanges","datasetCount","makeSet","changeSet","noArea","layers","clip","useClip","_add","_remove","attached","activeElements","lastActive","replay","hoverOptions","eventFilter","invalidatePlugins","enumerable","clipArc","pixelMargin","angleMargin","toRadiusCorners","parseBorderRadius$1","angleDelta","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","rThetaToXY","theta","pathArc","circular","innerR","spacingOffset","noSpacingInnerRadius","noSpacingOuterRadius","avNogSpacingRadius","adjustedAngle","beta","angleOffset","outerStart","outerEnd","innerStart","innerEnd","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","pCenter","p4","p8","outerStartX","outerStartY","outerEndX","outerEndY","drawArc","fullCircles","drawFullCircleBorders","drawBorder","borderWidth","borderJoinStyle","ArcElement","chartX","chartY","rAdjust","betweenAngles","withinRadius","halfAngle","halfRadius","radiusOffset","lineTo","getLineMethod","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","fastPathSegment","avgX","countX","prevX","lastY","pointIndex","drawX","truncX","_getSegmentMethod","_getInterpolationMethod","strokePathWithCache","strokePathDirect","segmentMethod","usePath2D","LineElement","_interpolate","interpolated","inRange$1","PointElement","getBarBounds","bar","half","skipOrLimit","parseBorderWidth","maxW","maxH","parseBorderRadius","enableBorderRadius","maxR","enableBorder","boundingRects","skipX","skipY","hasRadius","addNormalRectPath","inflateRect","refRect","BarElement","borderColor","addRectPath","_segments","tpoints","_findSegmentEnd","_getBounds","targetSegments","tgt","subBounds","fillSources","fillSource","_getEdge","_pointsFromSegments","boundary","linePoints","_createBoundaryLine","_loop","_shouldApplyFill","_resolveTarget","propagate","visited","_decodeFill","parseFillOption","decodeTargetIndex","firstCh","_getTargetPixel","_getTargetValue","fillOption","_buildStackLine","sourcePoints","linesBelow","getLinesBelow","addPointsBelow","below","sourcePoint","postponed","findPoint","pointValue","firstValue","lastValue","simpleArc","_getTarget","getLineByIndex","computeBoundary","computeCircularBoundary","computeLinearBoundary","_drawfill","lineOpts","doFill","clipVertical","clipY","lineLoop","notShape","clipBounds","interpolatedLineTo","targetLoop","interpolatedPoint","_args","positioners","eventPosition","nearestElement","pushOrConcat","toPush","splitNewlines","createTooltipItem","getTooltipSize","footer","boxWidth","boxHeight","bodyFont","titleFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","bodyLineHeight","widthPadding","maxLineWidth","determineYAlign","doesNotFitWithAlign","xAlign","determineXAlign","yAlign","chartWidth","determineAlignment","alignX","alignY","paddingAndSize","getBackgroundPoint","alignment","caretSize","caretPadding","topLeft","topRight","bottomLeft","bottomRight","getAlignedX","getBeforeAfterBodyLines","createTooltipContext","tooltipItems","overrideCallbacks","beforeTitle","afterTitle","bodyItems","scoped","beforeFooter","afterFooter","labelColors","labelPointStyles","labelTextColors","positionAndSize","backgroundPoint","tooltipPoint","caretPosition","ptX","ptY","x3","y3","titleSpacing","rtlHelper","labelPointStyle","colorX","rtlColorX","yOffSet","colorY","drawOptions","outerX","innerX","borderRadius","bodySpacing","bodyAlign","displayColors","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","tooltipSize","animX","animY","opacity","hasTooltipContent","positionChanged","caretX","caretY","plugin_tooltip","labelCount","addIfString","addedLabels","findOrAddLabel","CategoryScale","generateTicks$1","generationOptions","dataRange","precision","maxTicks","maxDigits","includeBounds","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","decimalPlaces","relativeLabelSize","LinearScaleBase","setMin","setMax","minSign","maxSign","maxTicksLimit","stepSize","numericGeneratorOptions","LinearScale","isMajor","tickVal","generateTicks","endExp","endSignificand","exp","significand","lastTick","LogarithmicScale","getTickBackdropHeight","measureLabelSize","determineLimits","fitWithPointLabels","valueCount","pointLabelOpts","additionalAngle","plFont","textSize","hLimits","vLimits","updateLimits","buildPointLabelItems","outerDistance","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","drawPointLabels","pointLabels","backdropColor","backdropLeft","backdropTop","backdropWidth","backdropHeight","pathRadiusLine","drawRadiusLine","gridLineOpts","createPointLabelContext","RadialLinearScale","leftMovement","rightMovement","topMovement","bottomMovement","angleMultiplier","scalingFactor","scaledDistance","pointLabel","distanceFromCenter","angleLines","INTERVALS","UNITS","sorter","adapter","determineUnitForAutoTicks","minUnit","capacity","determineUnitForFormatting","determineMajorUnit","addTick","timestamps","setMajorTicks","majorUnit","major","ticksFromTimestamps","TimeScale","_applyBounds","timeOpts","minor","hasWeekday","formats","minorFormat","majorFormat","offsets","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","displayFormats","exampleLabel","prevSource","nextSource","prevTarget","TimeSeriesScale","ConfirmEmailView","_imports_0","login","_component_CodeInput","submit","acceptPrivacy","policies","requiredPolicies","isAccepted","setAccepted","ForgotPasswordResetView","minChars","verificationToken","SignupPoliciesBox","_component_LoadingViewTransition","loadingSession","_component_STErrorsDefault","_component_EmailInput","_component_PasswordStrength","_component_SignupPoliciesBox","ForgotPasswordView","emailInput","showVersionFooter","passwordConfig","ssoConfig","googleConfig","startSSO","provider","automatic","gotoPasswordForgot","openSignup","filterDescription","filterBuilderForCategory","editCategory","addCategory","deleteCategory","childCategoryPatch","rootPatch","rootIndex","rootCategories","draggableCategories","EditRecordCategoryView","baseOrg","filterBuilder","buildPropertyRefs","financialSupport","getFilterConfiguration","editPropertyFilterConfiguration","setEnableProperty","cachedInheritedCategories","getRefForInheritedCategory","buildRefForInheritedCategory","requiresDataPermissions","editInheritedFilterConfiguration","previewCategory","FillRecordCategoryView","_patch","EditRecordChoiceView","_component_SaveView","warningInverted","warningText","warningType","PreviewRecordView","RecordAnswerInput","recordAnswers","ChoiceRow","editorType","patchRecord","patchedRecord","showExternalPermissionLevel","availableFileTypes","canAddWarning","warningNonInvertedText","warningInvertedText","labelTitle","descriptionTitle","fileType","askComments","shouldAskInput","shouldAskInputPlaceholder","shouldAskCommentsDescription","requiredText","commentsDescription","externalPermissionLevel","sensitive","addChoicesPatch","addChoice","openPreview","_imports_0$2","_imports_1$2","_imports_2","_imports_3","_imports_4","_imports_5","_imports_6","_imports_7","editRecord","addRootPatch","categoryPatch","me","deleteArray","putArray","parentRootCategory","childCategory","patchedRootCategories","addRootCategoriesPatch","patchedCategory","moveRecordCategories","categoriesPatch","defaultEnabled","cachedComputers","getDraggableRecords","getPatchParentCategories","addRecord","EditRecordView","Self","temporaryRootPatch","showCategoryMenu","childCategoryPatch2","showExample","reactiveValue","CheckoutManager","$webshopManager","discountCode","WebshopManager","WhatsNewCount","didCheckGlobalRoutes","useGlobalRoutes","cancel","PaymentPendingView","loadingDefault","defaultOptions","resultElements","visibleOptions","help","focusResult","setResults","wrapWithModalStack","initialPresents","ModalStackComponent","wrapContext","$memberManager","$checkoutManager","OrganizationSwitcher","AccountSwitcher","ContextNavigationBar","CustomHooksContainer","loadSessionFromUrl","ignoreUris","getLoginRoot","urlCopy","RedirectView","CoverImageContainer","LoginView","getNonAutoLoginRoot","reactiveSession","getScopedAutoRoot","getOrganizationSelectionRoot","baseRoot","OrganizationSelectionView","getNoPermissionsView","TabBarController","NoPermissionsView","getScopedDashboardRootFromUrl","getScopedDashboardRoot","getScopedAutoRootFromUrl","startView","startTab","membersTab","calendarTab","ManageEventsView","webshopsTab","whatsNewBadge","settingsTab","financesTab","documentsTab","auditLogsTab","sharedMoreItems","moreTab","_imports_0$1","_imports_1$1","_imports_9","summary","charging","membershipOrganization","$chooseMembershipOrganization","loadingOrganization","loadingOrganizationErrorBox","membershipOrganizationId","chooseMembershipOrganization","charge","getSummaryForType","useCollapsed","globalIdentifier","collapsedSections","checkingAvailability","isAvailable","lastCheckedUri","checkCount","checkAvailable","doThrottledCheck","doCheckAvailable","initialCheckCount","platformTags","rootTags","selectedTagIds","selectedTags","tagIdsToTags","allTagsWithChildren","selectedTagsWithChildren","tagsToDelete","rootTag","tagWithChildren","setTagIds","_imports_11","tagStringList","setupSteps","editOrganization","EditOrganizationView","useChargeOrganizationsPopup","ChargeOrganizationsView","_platform","getOrganizationUIFilterBuilders","chargeOrganizationsSheet","openMail","exportToExcel","OrganizationsTableView","OrganizationTagView","childTags","isShowTable","openChildTag","openThisTag","childTagCount","childType","filteredTags","contextMenuForTag","ft","ttt","parentTags","parentTag","moveToTag","allPatchedTags","getPatchedTag","draggableChildTags","patchedTag","addDeleteRecursive","editTag","EditOrganizationTagView","addTag","originalTags","draggableTags","hasFullAccess","EditOrganizationTagsView","getTagById","navigateToTag","getFilterBuilders","getScopedAdminRootFromUrl","getScopedAdminRoot","settingsView","membersTableView","organizationsTableView","OrganizationsMenu","groupsTab","ChargeMembershipsView","eventNotificationsTab","EventNotificationsTableView","recommendedFilter","updateRecommendedFilter","oldRecommendedFilter","currentFilter","EventView","_imports_1","getDocumentPdfBlob","cacheId","form","downloadDocument","downloadDocuments","pendingToast","JSZip","zip","maxConcurrency","buffer","quickActions","requestOwner","isAcceptingNewMembers","registerMembers","checkData","getRegistrationsForMember","addNewMember","downloadingDocuments","onDownloadDocument","isDocumentDownloading","getScopedRegistrationRootFromUrl","getRootView","ownDomain","StartView","cartRoot","CartView","EventsOverview","modalStack","checkGlobalRoutes","unsubscribe","dashboardContext","manualPresent","centeredMessage","CenteredMessageView","fieldName","App","script"],"ignoreList":[0,1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,35,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,234,235,236,238,239,240,241,242,259,330,331,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,652,684,685],"sources":["../../../../../node_modules/uuid/dist/esm-browser/stringify.js","../../../../../node_modules/uuid/dist/esm-browser/rng.js","../../../../../node_modules/uuid/dist/esm-browser/native.js","../../../../../node_modules/uuid/dist/esm-browser/v4.js","../../../../../node_modules/@simonbackx/simple-errors/esm/dist/src/SimpleError.js","../../../../../node_modules/@simonbackx/simple-errors/esm/dist/src/SimpleErrors.js","../../../../shared/networking/src/AppManager.ts","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/classes/Cloneable.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/classes/Identifiable.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/structs/PatchableArray.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/classes/AutoEncoder.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/classes/Patchable.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/classes/Encodeable.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/structs/StringOrNumberDecoder.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/structs/ArrayDecoder.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/structs/BooleanDecoder.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/structs/EnumDecoder.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/structs/IntegerDecoder.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/structs/NullableDecoder.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/structs/NumberDecoder.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/structs/StringDecoder.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/classes/ObjectData.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/structs/AnyDecoder.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/structs/MapDecoder.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/structs/EmailDecoder.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/structs/RecordDecoder.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/structs/SymbolDecoder.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/decorators/Field.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/classes/EncodeContext.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/structs/VersionBox.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/structs/DateDecoder.js","../../../../../node_modules/@simonbackx/simple-encoding/esm/dist/src/structs/URLDecoder.js","../../../../../shared/structures/esm/dist/src/Version.js","../../../../../shared/structures/esm/dist/src/PermissionLevel.js","../../../../../shared/structures/esm/dist/src/AccessRight.js","../../../../../node_modules/tslib/tslib.es6.mjs","../../../../../shared/utility/esm/dist/src/Colors.js","../../../../../node_modules/luxon/src/errors.js","../../../../../node_modules/luxon/src/impl/formats.js","../../../../../node_modules/luxon/src/zone.js","../../../../../node_modules/luxon/src/zones/systemZone.js","../../../../../node_modules/luxon/src/zones/IANAZone.js","../../../../../node_modules/luxon/src/impl/locale.js","../../../../../node_modules/luxon/src/zones/fixedOffsetZone.js","../../../../../node_modules/luxon/src/zones/invalidZone.js","../../../../../node_modules/luxon/src/impl/zoneUtil.js","../../../../../node_modules/luxon/src/settings.js","../../../../../node_modules/luxon/src/impl/invalid.js","../../../../../node_modules/luxon/src/impl/conversions.js","../../../../../node_modules/luxon/src/impl/util.js","../../../../../node_modules/luxon/src/impl/english.js","../../../../../node_modules/luxon/src/impl/formatter.js","../../../../../node_modules/luxon/src/impl/regexParser.js","../../../../../node_modules/luxon/src/duration.js","../../../../../node_modules/luxon/src/interval.js","../../../../../node_modules/luxon/src/info.js","../../../../../node_modules/luxon/src/impl/diff.js","../../../../../node_modules/luxon/src/impl/digits.js","../../../../../node_modules/luxon/src/impl/tokenParser.js","../../../../../node_modules/luxon/src/datetime.js","../../../../../shared/utility/esm/dist/src/Sorter.js","../../../../../shared/utility/esm/dist/src/Formatter.js","../../../../../shared/utility/esm/dist/src/DataValidator.js","../../../../../shared/utility/esm/dist/src/Sleep.js","../../../../../shared/utility/esm/dist/src/StringCompare.js","../../../../../shared/utility/esm/dist/src/Throttle.js","../../../../../shared/structures/esm/dist/src/addresses/CountryDecoder.js","../../../../../shared/structures/esm/dist/src/addresses/Address.js","../../../../../shared/structures/esm/dist/src/addresses/Province.js","../../../../../shared/structures/esm/dist/src/addresses/City.js","../../../../../shared/structures/esm/dist/src/addresses/Premise.js","../../../../../shared/structures/esm/dist/src/addresses/SearchRegions.js","../../../../../shared/structures/esm/dist/src/Company.js","../../../../../shared/structures/esm/dist/src/data/audit-log-words.js","../../../../../shared/structures/esm/dist/src/AuditLogReplacement.js","../../../../../shared/structures/esm/dist/src/filters/SortList.js","../../../../../shared/structures/esm/dist/src/filters/FilteredRequest.js","../../../../../shared/structures/esm/dist/src/filters/StamhoofdFilter.js","../../../../../shared/structures/esm/dist/src/filters/PropertyFilter.js","../../../../../shared/structures/esm/dist/src/GroupType.js","../../../../../shared/structures/esm/dist/src/files/ResolutionRequest.js","../../../../../shared/structures/esm/dist/src/members/records/RecordSettings.js","../../../../../shared/structures/esm/dist/src/members/records/RecordCategory.js","../../../../../shared/structures/esm/dist/src/members/OrganizationRecordsConfiguration.js","../../../../../shared/structures/esm/dist/src/DefaultAgeGroup.js","../../../../../shared/structures/esm/dist/src/files/File.js","../../../../../shared/structures/esm/dist/src/files/Resolution.js","../../../../../shared/structures/esm/dist/src/files/Image.js","../../../../../shared/structures/esm/dist/src/GroupGenderType.js","../../../../../shared/structures/esm/dist/src/PermissionsResourceType.js","../../../../../shared/structures/esm/dist/src/ResourcePermissions.js","../../../../../shared/structures/esm/dist/src/PermissionRole.js","../../../../../shared/structures/esm/dist/src/PermissionsByRole.js","../../../../../shared/structures/esm/dist/src/GroupPrivateSettings.js","../../../../../shared/structures/esm/dist/src/OldGroupPrices.js","../../../../../shared/structures/esm/dist/src/RegistrationPeriodBase.js","../../../../../shared/structures/esm/dist/src/StockReservation.js","../../../../../shared/structures/esm/dist/src/GroupSettings.js","../../../../../shared/structures/esm/dist/src/members/Gender.js","../../../../../shared/structures/esm/dist/src/Group.js","../../../../../shared/structures/esm/dist/src/endpoints/EmailRequest.js","../../../../../shared/structures/esm/dist/src/EventNotificationType.js","../../../../../shared/structures/esm/dist/src/LoginMethod.js","../../../../../shared/structures/esm/dist/src/MemberResponsibility.js","../../../../../shared/structures/esm/dist/src/OrganizationEmail.js","../../../../../shared/structures/esm/dist/src/OrganizationLevelRecordsConfiguration.js","../../../../../shared/structures/esm/dist/src/GroupCategory.js","../../../../../shared/structures/esm/dist/src/SetupStepReview.js","../../../../../shared/structures/esm/dist/src/SetupStepType.js","../../../../../shared/structures/esm/dist/src/SetupSteps.js","../../../../../shared/structures/esm/dist/src/RegistrationPeriod.js","../../../../../shared/structures/esm/dist/src/RichText.js","../../../../../shared/structures/esm/dist/src/Platform.js","../../../../../shared/structures/esm/dist/src/Event.js","../../../../../shared/structures/esm/dist/src/filters/InMemoryFilter.js","../../../../../shared/structures/esm/dist/src/filters/inMemoryFilterDefinitions.js","../../../../../shared/structures/esm/dist/src/members/records/RecordAnswer.js","../../../../../shared/structures/esm/dist/src/Document.js","../../../../../shared/structures/esm/dist/src/EventNotificationStatus.js","../../../../../shared/structures/esm/dist/src/billing/STPackage.js","../../../../../shared/structures/esm/dist/src/OrganizationGenderType.js","../../../../../shared/structures/esm/dist/src/UmbrellaOrganization.js","../../../../../shared/structures/esm/dist/src/OrganizationType.js","../../../../../shared/structures/esm/dist/src/PaymentType.js","../../../../../shared/structures/esm/dist/src/PaymentMethod.js","../../../../../shared/structures/esm/dist/src/webshops/TransferSettings.js","../../../../../shared/structures/esm/dist/src/PaymentConfiguration.js","../../../../../shared/structures/esm/dist/src/OrganizationMetaData.js","../../../../../shared/structures/esm/dist/src/DNSRecord.js","../../../../../shared/structures/esm/dist/src/PaymentProvider.js","../../../../../shared/structures/esm/dist/src/OrganizationPrivateMetaData.js","../../../../../shared/structures/esm/dist/src/webshops/Category.js","../../../../../shared/structures/esm/dist/src/SeatingPlan.js","../../../../../shared/structures/esm/dist/src/webshops/WebshopField.js","../../../../../shared/structures/esm/dist/src/webshops/Product.js","../../../../../shared/structures/esm/dist/src/Policy.js","../../../../../shared/structures/esm/dist/src/SponsorConfig.js","../../../../../shared/structures/esm/dist/src/webshops/Discount.js","../../../../../shared/structures/esm/dist/src/webshops/WebshopMetaData.js","../../../../../shared/structures/esm/dist/src/webshops/Webshop.js","../../../../../shared/structures/esm/dist/src/Organization.js","../../../../../shared/structures/esm/dist/src/EventNotification.js","../../../../../shared/structures/esm/dist/src/GenericBalance.js","../../../../../shared/structures/esm/dist/src/members/MemberPlatformMembership.js","../../../../../shared/structures/esm/dist/src/members/MemberResponsibilityRecord.js","../../../../../shared/structures/esm/dist/src/members/NationalRegisterNumberOptOut.js","../../../../../shared/structures/esm/dist/src/Permissions.js","../../../../../shared/structures/esm/dist/src/LoadedPermissions.js","../../../../../shared/structures/esm/dist/src/UserPermissions.js","../../../../../shared/structures/esm/dist/src/User.js","../../../../../shared/structures/esm/dist/src/OpenID.js","../../../../../shared/structures/esm/dist/src/OrganizationSimple.js","../../../../../shared/structures/esm/dist/src/PaymentCustomer.js","../../../../../shared/structures/esm/dist/src/PaymentStatus.js","../../../../../shared/structures/esm/dist/src/PlatformServerConfig.js","../../../../../shared/structures/esm/dist/src/members/Payment.js","../../../../../shared/structures/esm/dist/src/BalanceItem.js","../../../../../shared/structures/esm/dist/src/members/EmergencyContact.js","../../../../../shared/structures/esm/dist/src/members/ParentType.js","../../../../../shared/structures/esm/dist/src/members/Parent.js","../../../../../shared/structures/esm/dist/src/members/ReviewTime.js","../../../../../shared/structures/esm/dist/src/members/MemberDetails.js","../../../../../shared/structures/esm/dist/src/members/Member.js","../../../../../shared/structures/esm/dist/src/members/checkout/RegisterItem.js","../../../../../shared/structures/esm/dist/src/members/Registration.js","../../../../../shared/structures/esm/dist/src/members/RegistrationWithMember.js","../../../../../shared/structures/esm/dist/src/email/exampleReplacements.js","../../../../../shared/structures/esm/dist/src/email/EditorSmartVariable.js","../../../../../shared/structures/esm/dist/src/email/EditorSmartButton.js","../../../../../shared/structures/esm/dist/src/members/MemberWithRegistrationsBlob.js","../../../../../shared/structures/esm/dist/src/email/EmailTemplate.js","../../../../../shared/structures/esm/dist/src/email/Email.js","../../../../../shared/structures/esm/dist/src/webshops/CartStockHelper.js","../../../../../shared/structures/esm/dist/src/webshops/CartItem.js","../../../../../shared/structures/esm/dist/src/webshops/Cart.js","../../../../../shared/structures/esm/dist/src/webshops/Customer.js","../../../../../shared/structures/esm/dist/src/webshops/DiscountCode.js","../../../../../shared/structures/esm/dist/src/webshops/Checkout.js","../../../../../shared/structures/esm/dist/src/webshops/Ticket.js","../../../../../shared/structures/esm/dist/src/webshops/Order.js","../../../../../shared/structures/esm/dist/src/BalanceItemDetailed.js","../../../../../shared/structures/esm/dist/src/members/PaymentGeneral.js","../../../../../shared/structures/esm/dist/src/ReceivableBalance.js","../../../../../shared/structures/esm/dist/src/RegisterCodeStatus.js","../../../../../shared/structures/esm/dist/src/StripeAccount.js","../../../../../shared/structures/esm/dist/src/Token.js","../../../../../shared/structures/esm/dist/src/UserWithMembers.js","../../../../../shared/structures/esm/dist/src/endpoints/ChargeMembershipsSummary.js","../../../../../shared/structures/esm/dist/src/endpoints/ChargeOrganizationsRequest.js","../../../../../shared/structures/esm/dist/src/endpoints/ChargeMembersRequest.js","../../../../../shared/structures/esm/dist/src/endpoints/CheckMollieResponse.js","../../../../../shared/structures/esm/dist/src/endpoints/CreateOrganization.js","../../../../../shared/structures/esm/dist/src/endpoints/ForgotPasswordRequest.js","../../../../../shared/structures/esm/dist/src/endpoints/GroupsWithOrganizations.js","../../../../../shared/structures/esm/dist/src/endpoints/OrganizationAdmins.js","../../../../../shared/structures/esm/dist/src/endpoints/OrganizationDomains.js","../../../../../shared/structures/esm/dist/src/endpoints/PayableBalanceCollection.js","../../../../../shared/structures/esm/dist/src/endpoints/RegisterMember.js","../../../../../shared/structures/esm/dist/src/endpoints/RegisterResponse.js","../../../../../shared/structures/esm/dist/src/endpoints/SignupResponse.js","../../../../../shared/structures/esm/dist/src/endpoints/VerifyEmailRequest.js","../../../../../shared/structures/esm/dist/src/endpoints/WebshopUriAvailabilityResponse.js","../../../../../shared/structures/esm/dist/src/grouping/PaginatedResponse.js","../../../../../shared/structures/esm/dist/src/members/PaymentPatch.js","../../../../../shared/structures/esm/dist/src/members/PaymentWithRegistrations.js","../../../../../shared/structures/esm/dist/src/members/checkout/BalanceItemCartItem.js","../../../../../shared/structures/esm/dist/src/members/checkout/RegisterCart.js","../../../../../shared/structures/esm/dist/src/members/checkout/RegisterCheckout.js","../../../../../shared/structures/esm/dist/src/members/PlatformMember.js","../../../../../shared/structures/esm/dist/src/members/records/LegacyRecordType.js","../../../../../shared/structures/esm/dist/src/members/records/LegacyRecord.js","../../../../../shared/structures/esm/dist/src/members/RegistrationPatch.js","../../../../../shared/structures/esm/dist/src/members/RegistrationWithEncryptedMember.js","../../../../../shared/structures/esm/dist/src/endpoints/WebshopOrdersQuery.js","../../../../../shared/structures/esm/dist/src/endpoints/WebshopTicketsQuery.js","../../../../../shared/structures/esm/dist/src/billing/STCredit.js","../../../../../shared/structures/esm/dist/src/billing/STInvoice.js","../../../../../shared/structures/esm/dist/src/billing/STBillingStatus.js","../../../../../shared/structures/esm/dist/src/billing/STPackageBundle.js","../../../../../shared/structures/esm/dist/src/admin/Admin.js","../../../../../shared/structures/esm/dist/src/admin/MemberSummary.js","../../../../../shared/structures/esm/dist/src/admin/OrganizationSummary.js","../../../../../shared/structures/esm/dist/src/admin/StripePayoutExport.js","../../../../../shared/structures/esm/dist/src/Graph.js","../../../../../shared/structures/esm/dist/src/email/EmailAddressSettings.js","../../../../../shared/structures/esm/dist/src/filters/ExcelExportRequest.js","../../../../../shared/structures/esm/dist/src/helpers/EventPermissionChecker.js","../../../../../shared/structures/esm/dist/src/helpers/TagHelper.js","../../../../../shared/structures/esm/dist/src/AuditLogRenderer.js","../../../../../shared/structures/esm/dist/src/AuditLog.js","../../../../../shared/structures/esm/dist/src/helpers/uuidToName.js","../../../../../shared/structures/esm/dist/src/circular-dependencies/AuditLogReplacementDependencies.js","../../../../../shared/structures/esm/dist/src/circular-dependencies/ExampleReplacementsDependencies.js","../../../../../shared/structures/esm/dist/index.js","../../../../../node_modules/@simonbackx/simple-networking/dist/src/RequestBag.js","../../../../../node_modules/@simonbackx/simple-networking/dist/src/Request.js","../../../../../node_modules/@simonbackx/simple-networking/dist/src/Server.js","../../../../shared/i18n/I18n.ts","../../../../../node_modules/@vue/shared/dist/shared.esm-bundler.js","../../../../../node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js","../../../../../node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js","../../../../../node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js","../../../../../node_modules/@simonbackx/vue-app-navigation/dist/index.js","../../../../../shared/locales/esm/dist/index.js","../../../../shared/i18n/I18nController.ts","../../../../shared/i18n/LocalizedDomains.ts","../../../../shared/networking/src/NetworkManager.ts","../../../../shared/networking/src/ContextPermissions.ts","../../../../shared/networking/src/ManagedToken.ts","../../../../shared/networking/src/Storage.ts","../../../../shared/networking/src/SessionContext.ts","../../../../shared/networking/src/SessionManager.ts","../../../../shared/networking/src/LoginHelper.ts","../../../../shared/networking/src/OrganizationManager.ts","../../../../shared/networking/src/PlatformManager.ts","../../../../shared/networking/src/hooks/useRequestOwner.ts","../../../../shared/networking/src/MemberManager.ts","../../../../shared/components/src/ViewportHelper.ts","../../../../shared/components/src/errors/ErrorBox.ts","../../../../../node_modules/@simonbackx/vue-app-navigation/dist/classes.js","../../../../shared/components/src/errors/STErrorBox.vue","../../../../shared/components/src/errors/STErrorsDefault.vue","../../../../shared/components/src/errors/STErrorsInput.vue","../../../../shared/components/src/errors/Validator.ts","../../../../shared/components/src/errors/useErrors.ts","../../../../shared/components/src/errors/useValidation.ts","../../../../shared/components/src/editor/EmailStyler.ts","../../../../shared/components/src/EventBus.ts","../../../../shared/components/src/hooks/useKeyDown.ts","../../../../shared/components/src/hooks/useArrowUpDown.ts","../../../../shared/components/src/hooks/useContext.ts","../../../../shared/components/src/hooks/useAuth.ts","../../../../shared/components/src/hooks/useBackForward.ts","../../../../shared/components/src/hooks/useCountry.ts","../../../../shared/components/src/hooks/useDeviceWidth.ts","../../../../shared/components/src/hooks/useDraggableArray.ts","../../../../shared/components/src/hooks/useEmitPatch.ts","../../../../shared/components/src/hooks/usePatchableArray.ts","../../../../shared/components/src/hooks/useEmitPatchArray.ts","../../../../shared/components/src/hooks/useOrganization.ts","../../../../shared/components/src/hooks/usePlatform.ts","../../../../shared/components/src/hooks/useFeatureFlag.ts","../../../../shared/components/src/hooks/useGlobalEventListener.ts","../../../../shared/components/src/hooks/useInterval.ts","../../../../shared/components/src/hooks/useIsIOS.ts","../../../../shared/components/src/hooks/useIsMobile.ts","../../../../shared/components/src/hooks/usePatch.ts","../../../../shared/components/src/hooks/usePatchArray.ts","../../../../shared/components/src/hooks/usePatchMoveUpDown.ts","../../../../shared/components/src/hooks/useSetupStepTranslations.ts","../../../../shared/components/src/hooks/useUser.ts","../../../../shared/components/src/hooks/useUninheritedPermissions.ts","../../../../shared/components/src/composables/useCount.ts","../../../../shared/components/src/composables/useSetupStepReviewDescription.ts","../../../../shared/components/src/composables/useVisibilityChange.ts","../../../../shared/components/src/hooks/useNow.ts","../../../../shared/components/src/hooks/useLoginMethods.ts","../../../../shared/components/src/fetchers/useMembersObjectFetcher.ts","../../../../shared/excel-export/src/SelectableColumn.ts","../../../../shared/excel-export/src/SelectableSheet.ts","../../../../shared/excel-export/src/SelectableWorkbook.ts","../../../../shared/excel-export/src/ExcelExportView.vue","../../../../shared/components/src/fetchers/useOrganizationsObjectFetcher.ts","../../../../shared/components/src/fetchers/usePaymentsObjectFetcher.ts","../../../../shared/components/src/fetchers/useEventsObjectFetcher.ts","../../../../shared/components/src/fetchers/useEventNotificationsObjectFetcher.ts","../../../../shared/components/src/fetchers/useAuditLogsObjectFetcher.ts","../../../../shared/components/src/containers/JumpToContainer.vue","../../../../shared/components/src/overlays/CenteredMessage.ts","../../../../shared/components/src/overlays/Toast.ts","../../../../shared/components/src/inputs/StepperInput.vue","../../../../shared/components/src/inputs/Checkbox.vue","../../../../shared/components/src/overlays/ContextMenuItemView.vue","../../../../shared/components/src/overlays/ContextMenuLine.vue","../../../../shared/components/src/overlays/ContextMenuView.vue","../../../../shared/components/src/overlays/GeneralContextMenuView.vue","../../../../shared/components/src/overlays/ModalStackEventBus.ts","../../../../shared/components/src/overlays/ContextMenu.ts","../../../../shared/components/src/groups/hooks/useDataPermissionSettings.ts","../../../../shared/components/src/groups/hooks/useExternalOrganization.ts","../../../../shared/components/src/context/AccountSwitcher.vue","../../../../shared/components/src/context/appContext.ts","../../../../shared/assets/images/illustrations/laptop-key.svg","../../../../shared/components/src/context/OrganizationAvatar.vue","../../../../shared/components/src/context/PlatformAvatar.vue","../../../../shared/components/src/containers/InheritComponent.vue","../../../../shared/components/src/MetaLogo.vue","../../../../shared/components/src/context/OrganizationLogo.vue","../../../../shared/components/src/context/PlatformLogo.vue","../../../../shared/components/src/inputs/Radio.vue","../../../../../node_modules/sortablejs/modular/sortable.esm.js","../../../../../node_modules/sortablejs-vue3/dist/sortablejs-vue3.es.js","../../../../shared/components/src/layout/STList.vue","../../../../shared/components/src/layout/STListItem.vue","../../../../shared/components/src/navigation/BackButton.vue","../../../../shared/components/src/navigation/STNavigationBar.vue","../../../../shared/components/src/containers/TabBarItem.ts","../../../../shared/components/src/containers/TabBarDropdownView.vue","../../../../shared/components/src/containers/TabBarController.vue","../../../../shared/components/src/navigation/STToolbar.vue","../../../../shared/components/src/filters/UIFilterEditor.vue","../../../../shared/components/src/tables/classes/Column.ts","../../../../shared/components/src/tables/classes/TableAction.ts","../../../../shared/components/src/tables/classes/ObjectFetcher.ts","../../../../shared/components/src/tables/classes/TableObjectFetcher.ts","../../../../shared/components/src/tables/classes/InfiniteObjectFetcher.ts","../../../../shared/components/src/tables/ColumnSelectorContextMenu.vue","../../../../shared/components/src/tables/ColumnSortingContextMenu.vue","../../../../shared/components/src/tables/TableActionsContextMenu.vue","../../../../shared/components/src/tables/ModernTableView.vue","../../../../shared/components/src/Spinner.vue","../../../../shared/components/src/tables/InfiniteObjectFetcherEnd.vue","../../../../shared/components/src/tables/usePositionableSheet.ts","../../../../shared/components/src/containers/LoadingBox.vue","../../../../shared/components/src/containers/LoadingBoxTransition.vue","../../../../shared/components/src/containers/PromiseView.vue","../../../../shared/components/src/containers/AsyncComponent.ts","../../../../shared/components/src/context/hooks/useContextOptions.ts","../../../../shared/components/src/context/OrganizationAppSelector.vue","../../../../shared/components/src/context/OrganizationSwitcher.vue","../../../../shared/components/src/context/VersionFooter.vue","../../../../shared/components/src/groups/hooks/useFinancialSupportSettings.ts","../../../../shared/components/src/groups/hooks/useRegistrationPeriods.ts","../../../../shared/components/src/groups/components/GroupOptionMenuView.vue","../../../../shared/components/src/groups/components/ReduceablePriceInput.vue","../../../../shared/components/src/groups/components/GroupOptionView.vue","../../../../shared/components/src/groups/components/GroupOptionMenuBox.vue","../../../../shared/components/src/groups/components/GroupPriceBox.vue","../../../../shared/components/src/groups/components/GroupPriceView.vue","../../../../shared/components/src/groups/EditGroupView.vue","../../../../shared/components/src/directives/LongPress.ts","../../../../shared/components/src/inputs/Dropdown.vue","../../../../shared/components/src/overlays/DateSelectionView.vue","../../../../shared/components/src/inputs/DateSelection.vue","../../../../shared/components/src/filters/DateUIFilterView.vue","../../../../shared/components/src/filters/UIFilter.ts","../../../../shared/components/src/filters/DateUIFilter.ts","../../../../shared/components/src/filters/components/GroupUIFilterList.vue","../../../../shared/components/src/filters/GroupUIFilterView.vue","../../../../shared/components/src/filters/UnknownUIFilterView.vue","../../../../shared/components/src/filters/UnknownUIFilter.ts","../../../../shared/components/src/filters/GroupUIFilter.ts","../../../../shared/components/src/filters/MultipleChoiceUIFilterView.vue","../../../../shared/components/src/filters/MultipleChoiceUIFilter.ts","../../../../shared/components/src/inputs/NumberInput.vue","../../../../shared/components/src/inputs/PriceInput.vue","../../../../shared/components/src/inputs/STInputBox.vue","../../../../shared/components/src/inputs/TimeMinutesInput.vue","../../../../shared/components/src/filters/NumberUIFilterView.vue","../../../../shared/components/src/filters/NumberUIFilter.ts","../../../../shared/components/src/filters/StringUIFilterView.vue","../../../../shared/components/src/filters/StringUIFilter.ts","../../../../shared/components/src/filters/filterBuilders.ts","../../../../shared/components/src/icons/ProgressRing.vue","../../../../shared/components/src/containers/AuthenticatedView.vue","../../../../shared/components/src/containers/ContextProvider.vue","../../../../shared/components/src/views/ImageComponent.vue","../../../../shared/components/src/containers/CoverImageContainer.vue","../../../../shared/components/src/containers/CustomHooksContainer.vue","../../../../shared/components/src/containers/ExternalOrganizationContainer.vue","../../../../shared/components/src/inputs/hooks/useResizeObserver.ts","../../../../shared/components/src/inputs/ScrollableSegmentedControl.vue","../../../../shared/components/src/events/components/EventRow.vue","../../../../shared/components/src/events/composables/useEventPermissions.ts","../../../../shared/components/src/inputs/MultipleChoiceInput.vue","../../../../shared/components/src/inputs/DefaultAgeGroupIdsInput.vue","../../../../shared/components/src/inputs/GroupsInput.vue","../../../../shared/components/src/members/SearchOrganizationView.vue","../../../../shared/components/src/views/DeleteView.vue","../../../../shared/components/src/events/EditEventView.vue","../../../../shared/assets/images/illustrations/flag.svg","../../../../shared/assets/images/illustrations/list.svg","../../../../shared/assets/images/illustrations/email-template.svg","../../../../../node_modules/orderedmap/dist/index.js","../../../../../node_modules/prosemirror-model/dist/index.js","../../../../../node_modules/prosemirror-transform/dist/index.js","../../../../../node_modules/prosemirror-state/dist/index.js","../../../../../node_modules/@tiptap/pm/node_modules/prosemirror-view/node_modules/prosemirror-transform/dist/index.js","../../../../../node_modules/@tiptap/pm/node_modules/prosemirror-view/dist/index.js","../../../../../node_modules/w3c-keyname/index.js","../../../../../node_modules/prosemirror-keymap/dist/index.js","../../../../../node_modules/@tiptap/pm/node_modules/prosemirror-transform/dist/index.js","../../../../../node_modules/prosemirror-commands/dist/index.js","../../../../../node_modules/prosemirror-schema-list/dist/index.js","../../../../../node_modules/@tiptap/core/dist/index.js","../../../../../node_modules/@tiptap/extension-image/dist/index.js","../../../../../node_modules/linkifyjs/dist/linkify.es.js","../../../../../node_modules/@tiptap/extension-link/dist/index.js","../../../../../node_modules/@tiptap/extension-typography/dist/index.js","../../../../../node_modules/@tiptap/extension-underline/dist/index.js","../../../../../node_modules/@tiptap/extension-blockquote/dist/index.js","../../../../../node_modules/@tiptap/extension-bold/dist/index.js","../../../../../node_modules/@tiptap/extension-bullet-list/dist/index.js","../../../../../node_modules/@tiptap/extension-code/dist/index.js","../../../../../node_modules/@tiptap/extension-code-block/dist/index.js","../../../../../node_modules/@tiptap/extension-document/dist/index.js","../../../../../node_modules/prosemirror-dropcursor/dist/index.js","../../../../../node_modules/@tiptap/extension-dropcursor/dist/index.js","../../../../../node_modules/prosemirror-view/dist/index.js","../../../../../node_modules/prosemirror-gapcursor/dist/index.js","../../../../../node_modules/@tiptap/extension-gapcursor/dist/index.js","../../../../../node_modules/@tiptap/extension-hard-break/dist/index.js","../../../../../node_modules/@tiptap/extension-heading/dist/index.js","../../../../../node_modules/rope-sequence/dist/index.js","../../../../../node_modules/prosemirror-history/dist/index.js","../../../../../node_modules/@tiptap/extension-history/dist/index.js","../../../../../node_modules/@tiptap/extension-horizontal-rule/dist/index.js","../../../../../node_modules/@tiptap/extension-italic/dist/index.js","../../../../../node_modules/@tiptap/extension-list-item/dist/index.js","../../../../../node_modules/@tiptap/extension-ordered-list/dist/index.js","../../../../../node_modules/@tiptap/extension-paragraph/dist/index.js","../../../../../node_modules/@tiptap/extension-strike/dist/index.js","../../../../../node_modules/@tiptap/extension-text/dist/index.js","../../../../../node_modules/@tiptap/starter-kit/dist/index.js","../../../../../node_modules/@tiptap/vue-3/dist/index.js","../../../../shared/components/src/navigation/LoadingButton.vue","../../../../shared/components/src/inputs/UploadButton.vue","../../../../shared/components/src/navigation/STButtonToolbar.vue","../../../../shared/components/src/editor/EditorDescriptiveText.ts","../../../../shared/components/src/editor/EditorSmartButton.ts","../../../../shared/components/src/editor/EditorSmartVariable.ts","../../../../shared/components/src/overlays/Tooltip.vue","../../../../shared/components/src/directives/Tooltip.ts","../../../../shared/components/src/editor/TextStyleButtonsView.vue","../../../../shared/components/src/editor/EditorView.vue","../../../../shared/components/src/email/EditEmailView.vue","../../../../shared/components/src/email/EmailSettingsView.vue","../../../../shared/components/src/email/EmailView.vue","../../../../shared/components/src/email/EditEmailTemplateView.vue","../../../../shared/components/src/email/EditEmailTemplatesView.vue","../../../../shared/components/src/events/components/EventInfoTable.vue","../../../../shared/assets/images/illustrations/tent.svg","../../../../shared/components/src/types/NavigationActions.ts","../../../../shared/components/src/members/classes/ViewStepsManager.ts","../../../../../shared/object-differ/esm/dist/src/ObjectDiffer.js","../../../../shared/components/src/events/event-notifications/EditEventNotificationRecordCategoryView.vue","../../../../shared/components/src/events/OriginalEventNotificationAnswersView.vue","../../../../shared/components/src/events/EventNotificationView.vue","../../../../shared/components/src/events/composables/useEventNotification.ts","../../../../shared/components/src/events/event-notifications/classes/EventNotificationViewModel.ts","../../../../shared/components/src/events/event-notifications/EditEventNotificationGeneralView.vue","../../../../shared/components/src/events/event-notifications/steps/GeneralStep.ts","../../../../shared/components/src/events/event-notifications/steps/RecordCategoryStep.ts","../../../../shared/components/src/events/event-notifications/getEventNotificationSteps.ts","../../../../shared/components/src/events/components/EventNotificationRow.vue","../../../../shared/components/src/events/EventOverview.vue","../../../../shared/components/src/events/ManageEventsView.vue","../../../../shared/components/src/directives/Copyable.ts","../../../../shared/components/src/payments/PaymentView.vue","../../../../shared/components/src/payments/AsyncPaymentView.vue","../../../../shared/components/src/payments/BalanceItemRow.vue","../../../../shared/components/src/payments/BalancePriceBreakdown.vue","../../../../shared/assets/images/partners/icons/bancontact.svg","../../../../shared/assets/images/partners/icons/ideal.svg","../../../../shared/components/src/payments/components/PaymentRow.vue","../../../../shared/components/src/payments/EditBalanceItemView.vue","../../../../shared/components/src/inputs/IBANInput.vue","../../../../shared/components/src/navigation/SaveView.vue","../../../../shared/components/src/payments/SelectBalanceItemsList.vue","../../../../shared/components/src/payments/EditPaymentView.vue","../../../../shared/components/src/payments/GroupedBalanceList.vue","../../../../shared/components/src/payments/ReceivableBalanceList.vue","../../../../shared/components/src/payments/ReceivableBalanceBox.vue","../../../../shared/components/src/audit-logs/SafeHtmlView.vue","../../../../shared/components/src/audit-logs/components/RenderTextComponent.ts","../../../../shared/components/src/audit-logs/components/PatchListText.vue","../../../../shared/components/src/audit-logs/components/AuditLogRow.vue","../../../../shared/components/src/audit-logs/AuditLogsView.vue","../../../../shared/components/src/members/PlatformFamilyManager.ts","../../../../shared/components/src/members/components/ResponsibilityIcon.vue","../../../../shared/components/src/members/components/edit/EditMemberResponsibilitiesBox.vue","../../../../shared/components/src/members/classes/RegistrationActionBuilder.ts","../../../../shared/components/src/members/classes/getSelectableWorkbook.ts","../../../../shared/components/src/members/classes/MemberActionBuilder.ts","../../../../shared/components/src/members/composables/useEditMember.ts","../../../../shared/components/src/members/components/view/ViewMemberAccountsBox.vue","../../../../shared/components/src/members/checkout/FreeContributionView.vue","../../../../shared/components/src/members/checkout/PaymentSelectionView.vue","../../../../shared/components/src/members/checkout/RegistrationSuccessView.vue","../../../../shared/components/src/members/components/group/RegisterItemCheckboxRow.vue","../../../../shared/components/src/members/ChooseFamilyMembersForGroupView.vue","../../../../shared/components/src/members/components/group/BalanceItemCartItemRow.vue","../../../../shared/components/src/members/components/group/GroupIcon.vue","../../../../shared/components/src/members/components/group/GroupIconWithWaitingList.vue","../../../../shared/components/src/members/components/group/DeleteRegistrationRow.vue","../../../../shared/components/src/members/components/MemberIcon.vue","../../../../shared/components/src/members/components/group/RegisterItemRow.vue","../../../../shared/components/src/members/SearchOrganizationMembersForGroupView.vue","../../../../shared/components/src/members/ChooseOrganizationMembersForGroupView.vue","../../../../shared/components/src/members/classes/MemberStepManager.ts","../../../../shared/components/src/members/components/edit/EditMemberDataPermissionsBox.vue","../../../../shared/components/src/members/classes/steps/MemberDataPermissionStep.ts","../../../../shared/components/src/members/hooks/useIsPropertyRequired.ts","../../../../shared/components/src/inputs/PhoneInput.vue","../../../../shared/components/src/members/components/edit/EditEmergencyContactView.vue","../../../../shared/components/src/members/components/edit/EditEmergencyContactsBox.vue","../../../../shared/components/src/members/classes/steps/MemberEmergencyContactsStep.ts","../../../../shared/components/src/members/components/edit/EditMemberFinancialSupportBox.vue","../../../../shared/components/src/members/classes/steps/MemberFinancialSupportStep.ts","../../../../shared/components/src/members/classes/steps/MemberGeneralStep.ts","../../../../shared/components/src/inputs/EmailInput.vue","../../../../shared/components/src/inputs/NRNInput.vue","../../../../shared/components/src/inputs/AddressInput.vue","../../../../shared/components/src/inputs/SelectionAddressInput.vue","../../../../shared/components/src/members/hooks/useEditMember.ts","../../../../shared/components/src/members/hooks/useAddMember.ts","../../../../shared/components/src/members/components/edit/EditParentView.vue","../../../../shared/components/src/members/components/edit/EditMemberParentsBox.vue","../../../../shared/components/src/members/classes/steps/MemberParentsStep.ts","../../../../shared/components/src/inputs/FileInput.vue","../../../../shared/components/src/inputs/ImageInput.vue","../../../../shared/components/src/inputs/RecordAnswerInput.vue","../../../../shared/components/src/records/components/FillRecordCategoryBox.vue","../../../../shared/components/src/members/components/edit/EditMemberRecordCategoryBox.vue","../../../../shared/components/src/members/classes/steps/MemberRecordCategoryStep.ts","../../../../shared/components/src/inputs/UitpasNumberInput.vue","../../../../shared/components/src/members/components/edit/EditMemberUitpasBox.vue","../../../../shared/components/src/members/classes/steps/MemberUitpasStep.ts","../../../../shared/components/src/members/classes/steps/index.ts","../../../../shared/components/src/members/RegisterItemView.vue","../../../../shared/components/src/members/classes/steps/RegisterItemStep.ts","../../../../shared/components/src/navigation/STFloatingFooter.vue","../../../../shared/components/src/views/PayconiqBannerView.vue","../../../../shared/components/src/views/PayconiqButtonView.vue","../../../../shared/assets/images/partners/scan-apps-belgium.svg","../../../../shared/assets/images/partners/scan-apps-nl.svg","../../../../shared/assets/images/partners/kbc/app.svg","../../../../shared/assets/images/partners/ing/app.svg","../../../../shared/assets/images/partners/belfius/app.svg","../../../../shared/assets/images/partners/bnp/app.png","../../../../shared/assets/images/partners/argenta/app.png","../../../../shared/assets/images/partners/hello-bank/app.png","../../../../shared/components/src/views/TransferPaymentView.vue","../../../../shared/components/src/views/PaymentHandler.ts","../../../../shared/components/src/members/checkout/steps/FreeContributionStep.ts","../../../../shared/components/src/members/checkout/PaymentCustomerView.vue","../../../../shared/components/src/members/checkout/steps/PaymentCustomerStep.ts","../../../../shared/components/src/members/checkout/steps/PaymentSelectionStep.ts","../../../../shared/components/src/members/checkout/startCheckout.ts","../../../../shared/components/src/members/checkout/useCheckoutRegisterItem.ts","../../../../shared/components/src/members/components/view/ViewMemberFamilyBox.vue","../../../../shared/components/src/members/components/view/ViewMemberGeneralBox.vue","../../../../shared/components/src/members/components/view/ViewMemberNotesBox.vue","../../../../shared/components/src/members/components/view/ViewMemberParentBox.vue","../../../../shared/components/src/records/components/RecordCategoryAnswersBox.vue","../../../../shared/components/src/records/components/ViewRecordCategoryAnswersBox.vue","../../../../shared/components/src/members/components/view/ViewMemberRecordCategoryBox.vue","../../../../shared/components/src/members/components/view/ViewMemberRecordCategoriesBox.vue","../../../../shared/components/src/members/components/view/ViewMemberRegistrationRow.vue","../../../../shared/components/src/members/components/view/ViewMemberRegistrationsBox.vue","../../../../shared/components/src/members/components/view/ViewMemberSecurityCodeBox.vue","../../../../shared/components/src/members/components/detail/MemberDetailWithButton.vue","../../../../shared/components/src/members/components/view/ViewMemberUnverifiedBox.vue","../../../../shared/components/src/members/components/view/ViewMemberWarningsBox.vue","../../../../shared/components/src/members/components/view/ViewMemberResponsibilityRow.vue","../../../../shared/components/src/members/components/view/ViewMemberResponsibilitiesBox.vue","../../../../shared/components/src/members/tabs/MemberDetailsTab.vue","../../../../shared/components/src/members/tabs/MemberPaymentsTab.vue","../../../../shared/components/src/members/components/platform-membership/SelectPlatformMembershipView.vue","../../../../shared/components/src/members/tabs/MemberPlatformMembershipTab.vue","../../../../shared/components/src/members/MemberSegmentedView.vue","../../../../shared/components/src/organizations/components/OrganizationSelect.vue","../../../../shared/components/src/views/ChargeView.vue","../../../../shared/components/src/members/ChargeMembersView.vue","../../../../shared/components/src/members/MembersTableView.vue","../../../../shared/assets/images/illustrations/communication.svg","../../../../shared/assets/images/illustrations/email.svg","../../../../shared/components/src/inputs/CodeInput.vue","../../../../shared/components/src/members/MemberStepView.vue","../../../../shared/components/src/members/components/group/RegisterMemberGroupRow.vue","../../../../shared/components/src/members/ChooseGroupForMemberView.vue","../../../../shared/components/src/inputs/BirthDayInput.vue","../../../../shared/components/src/inputs/RadioGroup.vue","../../../../shared/components/src/inputs/TrackingYearInput.vue","../../../../shared/components/src/members/components/edit/EditMemberGeneralBox.vue","../../../../shared/components/src/members/components/edit/EditMemberNotesBox.vue","../../../../shared/components/src/members/components/edit/EditMemberAllBox.vue","../../../../shared/components/src/members/components/MemberCountSpan.vue","../../../../shared/components/src/transitions/TransitionFade.vue","../../../../shared/components/src/filters/PropertyFilterInput.vue","../../../../shared/components/src/filters/PropertyFilterView.vue","../../../../shared/components/src/ReviewCheckbox.vue","../../../../shared/components/src/organizations/components/CompanyInputBox.vue","../../../../shared/components/src/organizations/components/EditCompanyView.vue","../../../../shared/components/src/organizations/GeneralSettingsView.vue","../../../../shared/components/src/quick-actions/QuickActionsBox.vue","../../../../shared/assets/images/illustrations/cart.svg","../../../../shared/assets/images/illustrations/email-warning.svg","../../../../shared/assets/images/illustrations/missing-data.svg","../../../../shared/assets/images/illustrations/outstanding-amount.svg","../../../../shared/components/src/quick-actions/hooks/useRegistrationQuickActions.ts","../../../../shared/components/src/setupSteps/SetupStepRow.vue","../../../../shared/components/src/setupSteps/SetupStepRows.vue","../../../../shared/components/src/icons/Logo.vue","../../../../shared/components/src/navigation/STNavigationTitle.vue","../../../../shared/assets/images/illustrations/clock.svg","../../../../shared/assets/images/illustrations/health-data.svg","../../../../shared/assets/images/illustrations/sync.svg","../../../../shared/components/src/overlays/CenteredMessageView.vue","../../../../shared/components/src/overlays/InputSheet.vue","../../../../shared/components/src/overlays/ToastView.vue","../../../../shared/components/src/overlays/ToastBox.vue","../../../../shared/components/src/inputs/AgeInput.vue","../../../../shared/components/src/inputs/CheckboxListItem.vue","../../../../shared/components/src/inputs/CompanyNumberInput.vue","../../../../shared/components/src/inputs/PasswordStrength.vue","../../../../shared/components/src/inputs/PermyriadInput.vue","../../../../shared/components/src/inputs/PrefixInput.vue","../../../../shared/components/src/inputs/SegmentedControl.vue","../../../../shared/components/src/inputs/TimeInput.vue","../../../../shared/components/src/inputs/UrlInput.vue","../../../../shared/components/src/inputs/VATNumberInput.vue","../../../../../node_modules/@tiptap/extension-placeholder/dist/index.js","../../../../shared/components/src/ColorHelper.ts","../../../../shared/components/src/editor/EditorWarningBox.ts","../../../../shared/components/src/inputs/WYSIWYGTextInput.vue","../../../../shared/components/src/inputs/TagIdsInput.vue","../../../../shared/components/src/inputs/GroupIdsInput.vue","../../../../shared/components/src/GroupAvatar.vue","../../../../shared/components/src/steps/StepsHeader.vue","../../../../shared/components/src/steps/Steps.vue","../../../../shared/components/src/useReview.ts","../../../../shared/components/src/icons/STGradientBackground.vue","../../../../shared/assets/images/partners/icons/google.svg","../../../../shared/components/src/views/AddDiscountCodeBox.vue","../../../../shared/components/src/views/CartItemRow.vue","../../../../shared/components/src/views/FieldBox.vue","../../../../shared/components/src/views/OptionMenuBox.vue","../../../../shared/components/src/views/SeatSelectionBox.vue","../../../../shared/components/src/views/ChooseSeatsView.vue","../../../../shared/components/src/views/CartItemView.vue","../../../../shared/components/src/views/ProductBox.vue","../../../../shared/components/src/views/ProductGrid.vue","../../../../shared/components/src/views/CategoryBox.vue","../../../../shared/components/src/views/ChangePasswordView.vue","../../../../shared/components/src/records/FillRecordCategoryView.vue","../../../../shared/components/src/views/LogoEditor.vue","../../../../shared/components/src/views/ShowSeatsView.vue","../../../../shared/components/src/views/PaymentPendingView.vue","../../../../shared/assets/images/partners/payconiq/app.svg","../../../../shared/components/src/views/PaymentSelectionList.vue","../../../../shared/components/src/directives/ColorDirective.ts","../../../../shared/components/src/directives/FormatInputDirective.ts","../../../../shared/components/src/VueGlobalHelper.ts","../../../../../node_modules/chart.js/dist/chunks/helpers.segment.mjs","../../../../../node_modules/chart.js/dist/chart.mjs","../../../../shared/components/src/auth/ConfirmEmailView.vue","../../../../shared/components/src/auth/components/SignupPoliciesBox.vue","../../../../shared/components/src/auth/ForgotPasswordResetView.vue","../../../../shared/components/src/auth/ForgotPasswordView.vue","../../../../shared/components/src/auth/PlatformFooter.vue","../../../../shared/components/src/auth/LoginView.vue","../../../../shared/components/src/auth/NoPermissionsView.vue","../../../../shared/components/src/auth/RedirectView.vue","../../../../shared/components/src/records/RecordEditorSettings.ts","../../../../shared/components/src/records/components/RecordCategoryRow.vue","../../../../shared/components/src/records/components/EditRecordCategoriesBox.vue","../../../../shared/components/src/records/components/InheritedRecordsConfigurationBox.vue","../../../../shared/components/src/records/EditRecordChoiceView.vue","../../../../shared/components/src/records/components/PreviewRecordView.vue","../../../../shared/components/src/records/components/RecordChoiceRow.vue","../../../../shared/components/src/records/EditRecordView.vue","../../../../shared/assets/images/illustrations/text-input.svg","../../../../shared/assets/images/illustrations/textarea.svg","../../../../shared/assets/images/illustrations/checkbox.svg","../../../../shared/assets/images/illustrations/radio-input.svg","../../../../shared/assets/images/illustrations/multiple-choice-input.svg","../../../../shared/assets/images/illustrations/email-input.svg","../../../../shared/assets/images/illustrations/address-input.svg","../../../../shared/assets/images/illustrations/date-input.svg","../../../../shared/components/src/records/components/RecordRow.vue","../../../../shared/components/src/records/EditRecordCategoryView.vue","../../../webshop/src/classes/CheckoutManager.ts","../../../webshop/src/classes/WebshopManager.ts","../../src/classes/WhatsNewCount.ts","../../src/useGlobalRoutes.ts","../../src/views/login/OrganizationSelectionView.vue","../../src/getRootViews.ts","../../../../shared/assets/images/illustrations/calculator.svg","../../../../shared/assets/images/illustrations/check-transfer.svg","../../../../shared/assets/images/illustrations/creditcards.svg","../../../admin/src/views/finances/ChargeMembershipsView.vue","../../src/hooks/useCollapsed.ts","../../../admin/src/views/organizations/components/OrganizationUriInput.vue","../../../admin/src/views/organizations/tags/components/SelectOrganizationTagRow.vue","../../../admin/src/views/organizations/EditOrganizationView.vue","../../../../shared/assets/images/illustrations/edit-data.svg","../../../../shared/assets/images/illustrations/group.svg","../../../admin/src/views/organizations/components/ViewOrganizationRecordCategoriesBox.vue","../../../admin/src/views/organizations/OrganizationView.vue","../../../admin/src/views/organizations/ChargeOrganizationsView.vue","../../../admin/src/views/organizations/composables/useChargeOrganizationsPopup.ts","../../../admin/src/views/organizations/getSelectableWorkbook.ts","../../../admin/src/views/organizations/OrganizationsTableView.vue","../../../admin/src/views/organizations/OrganizationTagView.vue","../../../admin/src/views/organizations/tags/components/TagRow.vue","../../../admin/src/views/organizations/tags/EditOrganizationTagView.vue","../../../admin/src/views/organizations/tags/EditOrganizationTagsView.vue","../../../admin/src/views/organizations/OrganizationsMenu.vue","../../../admin/src/views/event-notifications/EventNotificationsTableView.vue","../../../admin/src/getRootViews.ts","../../../registration/src/views/cart/CartView.vue","../../../registration/src/views/events/EventView.vue","../../../registration/src/views/events/EventsOverview.vue","../../../../shared/assets/images/illustrations/magnifier.svg","../../../../shared/document-helper/index.ts","../../../registration/src/views/start/StartView.vue","../../../registration/src/getRootView.ts","../../src/App.vue","../../main.ts"],"sourcesContent":["import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n    byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n    return (byteToHex[arr[offset + 0]] +\n        byteToHex[arr[offset + 1]] +\n        byteToHex[arr[offset + 2]] +\n        byteToHex[arr[offset + 3]] +\n        '-' +\n        byteToHex[arr[offset + 4]] +\n        byteToHex[arr[offset + 5]] +\n        '-' +\n        byteToHex[arr[offset + 6]] +\n        byteToHex[arr[offset + 7]] +\n        '-' +\n        byteToHex[arr[offset + 8]] +\n        byteToHex[arr[offset + 9]] +\n        '-' +\n        byteToHex[arr[offset + 10]] +\n        byteToHex[arr[offset + 11]] +\n        byteToHex[arr[offset + 12]] +\n        byteToHex[arr[offset + 13]] +\n        byteToHex[arr[offset + 14]] +\n        byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n    const uuid = unsafeStringify(arr, offset);\n    if (!validate(uuid)) {\n        throw TypeError('Stringified UUID is invalid');\n    }\n    return uuid;\n}\nexport default stringify;\n","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n    if (!getRandomValues) {\n        if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n            throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n        }\n        getRandomValues = crypto.getRandomValues.bind(crypto);\n    }\n    return getRandomValues(rnds8);\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n    if (native.randomUUID && !buf && !options) {\n        return native.randomUUID();\n    }\n    options = options || {};\n    const rnds = options.random || (options.rng || rng)();\n    rnds[6] = (rnds[6] & 0x0f) | 0x40;\n    rnds[8] = (rnds[8] & 0x3f) | 0x80;\n    if (buf) {\n        offset = offset || 0;\n        for (let i = 0; i < 16; ++i) {\n            buf[offset + i] = rnds[i];\n        }\n        return buf;\n    }\n    return unsafeStringify(rnds);\n}\nexport default v4;\n","import { v4 as uuidv4 } from \"uuid\";\n// Error that is caused by a client and should be reported to the client\nexport class SimpleError extends Error {\n    constructor(error) {\n        var _a;\n        super(error.message);\n        this.code = error.code;\n        this.message = error.message;\n        this.human = error.human;\n        this.field = error.field;\n        this.statusCode = error.statusCode;\n        this.id = (_a = error.id) !== null && _a !== void 0 ? _a : this.generateID();\n        this.meta = error.meta;\n        if (Error.captureStackTrace) {\n            Error.captureStackTrace(this, SimpleError);\n        }\n    }\n    toString() {\n        return this.code + \": \" + this.message + (this.field ? \" at \" + this.field : \"\") + \" (\" + this.id + \")\";\n    }\n    /**\n     * Required to override the default toJSON behaviour of Error\n     */\n    toJSON() {\n        return this.encode({ version: 0 });\n    }\n    encode(context) {\n        return {\n            id: this.id,\n            code: this.code,\n            message: this.message,\n            human: this.human,\n            field: this.field,\n            meta: this.meta\n        };\n    }\n    static decode(data) {\n        var _a, _b, _c;\n        return new SimpleError({\n            id: data.field(\"id\").string,\n            code: data.field(\"code\").string,\n            message: data.field(\"message\").string,\n            human: (_a = data.optionalField(\"human\")) === null || _a === void 0 ? void 0 : _a.string,\n            field: (_b = data.optionalField(\"field\")) === null || _b === void 0 ? void 0 : _b.string,\n            meta: (_c = data.optionalField(\"meta\")) === null || _c === void 0 ? void 0 : _c.value\n        });\n    }\n    hasCode(code) {\n        return this.code === code;\n    }\n    getCode(code) {\n        if (this.hasCode(code)) {\n            return this;\n        }\n    }\n    hasFieldThatStartsWith(prefix) {\n        return !!this.field && this.field.startsWith(prefix);\n    }\n    doesMatchFields(fields) {\n        for (const field of fields) {\n            if (this.doesMatchField(field)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    doesMatchField(field) {\n        if (!this.field) {\n            return false;\n        }\n        return this.field.startsWith(field);\n    }\n    generateID() {\n        return uuidv4() + \"@\" + new Date().getTime();\n    }\n    addNamespace(field) {\n        this.field = this.field ? field + \".\" + this.field : field;\n    }\n    /// Returns a human description of all the errors\n    getHuman() {\n        var _a;\n        return (_a = this.human) !== null && _a !== void 0 ? _a : this.message;\n    }\n}\nexport function isSimpleError(e) {\n    return typeof e.id == \"string\" && typeof e.code == \"string\" && typeof e.message == \"string\" && e.encode && e.doesMatchFields && e.doesMatchField;\n}\n//# sourceMappingURL=SimpleError.js.map","import { isSimpleError, SimpleError } from './SimpleError';\nexport function isSimpleErrors(e) {\n    return e.errors && Array.isArray(e.errors) && e.errors.length > 0 && isSimpleError(e.errors[0]);\n}\n// Error that is caused by a client and should be reported to the client\nexport class SimpleErrors extends Error {\n    constructor(...errors) {\n        super(errors.map((e) => e.message).join(\"\\n\"));\n        this.errors = errors;\n    }\n    addError(error) {\n        if (isSimpleError(error)) {\n            this.errors.push(error);\n            this.message += \"\\n\" + error.toString();\n        }\n        else if (isSimpleErrors(error)) {\n            this.errors.push(...error.errors);\n            this.message += \"\\n\" + error.toString();\n        }\n        else {\n            throw new Error(\"Unsupported addError\");\n        }\n    }\n    unshiftError(error) {\n        if (isSimpleError(error)) {\n            this.errors.unshift(error);\n            this.message += \"\\n\" + error.toString();\n        }\n        else if (isSimpleErrors(error)) {\n            this.errors.unshift(...error.errors);\n            this.message += \"\\n\" + error.toString();\n        }\n        else {\n            throw new Error(\"Unsupported addError\");\n        }\n    }\n    get statusCode() {\n        var _a;\n        return (_a = this.errors.find((e) => e.statusCode !== undefined)) === null || _a === void 0 ? void 0 : _a.statusCode;\n    }\n    removeErrorAt(index) {\n        this.errors.splice(index, 1);\n    }\n    addNamespace(field) {\n        this.errors.forEach((e) => {\n            e.addNamespace(field);\n        });\n    }\n    /**\n     * @deprecated Renamed to hasCode\n     */\n    containsCode(code) {\n        return this.hasCode(code);\n    }\n    hasCode(code) {\n        return this.errors.findIndex((e) => e.hasCode(code)) !== -1;\n    }\n    getCode(code) {\n        return this.errors.find((e) => e.hasCode(code));\n    }\n    /**\n     * @deprecated Renamed to hasFieldThatStartsWith\n     */\n    containsFieldThatStartsWith(prefix) {\n        return this.hasFieldThatStartsWith(prefix);\n    }\n    hasFieldThatStartsWith(prefix) {\n        return this.errors.findIndex((e) => e.hasFieldThatStartsWith(prefix)) !== -1;\n    }\n    /**\n     * Required to override the default toJSON behaviour of Error\n     */\n    toJSON() {\n        return this.encode({ version: 0 });\n    }\n    encode(context) {\n        return {\n            errors: this.errors.map((e) => e.encode(context)),\n        };\n    }\n    static decode(data) {\n        return new SimpleErrors(...data.field(\"errors\").array(SimpleError));\n    }\n    throwIfNotEmpty() {\n        if (this.errors.length > 0) {\n            if (this.errors.length == 1) {\n                throw this.errors[0];\n            }\n            throw this;\n        }\n    }\n    get human() {\n        return this.getHuman();\n    }\n    /// Returns a human description of all the errors\n    getHuman() {\n        return this.errors\n            .filter((e) => !!e.getHuman())\n            .map((e) => e.getHuman())\n            .join(\"\\n\");\n    }\n}\n//# sourceMappingURL=SimpleErrors.js.map","import { SessionContext } from './SessionContext';\n\n// TODO: remove duplicate type definitions, but need to check if capacitor won't get loaded on the web...\ntype PermissionState = 'prompt' | 'prompt-with-rationale' | 'granted' | 'denied';\nexport interface PermissionStatus {\n    receive: PermissionState;\n}\n\nexport interface PluginListenerHandle {\n    remove: () => Promise<void>;\n}\n\ntype QRScannerPlugin = {\n    startScanning(): Promise<void>;\n    getTorch(): Promise<{ status: boolean }>;\n    toggleTorch(): Promise<{ status: boolean }>;\n    stopScanning(): Promise<void>;\n    checkPermissions(): Promise<PermissionStatus>;\n    requestPermissions(): Promise<PermissionStatus>;\n    addListener(\n        eventName: 'scannedQRCode',\n        listenerFunc: (result: { value: string }) => void,\n    ): Promise<PluginListenerHandle>;\n};\n\nexport type UpdateOptions = {\n    customText?: string;\n    visibleCheck?: 'spinner' | 'text';\n    visibleDownload?: boolean;\n    installAutomatically?: boolean;\n    checkTimeout?: number;\n    /**\n     * Download and install latest version again\n     */\n    force?: boolean;\n    channel?: string;\n};\n\nexport class AppManager {\n    static shared = new AppManager();\n\n    platform: 'android' | 'ios' | 'web' = 'web';\n\n    /// If needed: in the app we need to override XMLHttpRequest with native http requests to prevent CORS in some API's\n    overrideXMLHttpRequest?: any;\n\n    nativeVersion?: string;\n    nativeBuild?: string;\n\n    get isNative(): boolean {\n        return this.platform !== 'web';\n    }\n\n    setVersion({ version, build }: { version: string; build: string }) {\n        this.nativeVersion = version;\n        this.nativeBuild = build;\n    }\n\n    hapticWarning = () => {\n        if (window.navigator.vibrate) {\n            window.navigator.vibrate([100, 100, 100]);\n        }\n    };\n\n    hapticError = () => {\n        if (window.navigator.vibrate) {\n            window.navigator.vibrate([100, 100, 100]);\n        }\n    };\n\n    hapticTap = () => {\n        if (window.navigator.vibrate) {\n            window.navigator.vibrate(50);\n        }\n    };\n\n    hapticSuccess = () => {\n        if (window.navigator.vibrate) {\n            window.navigator.vibrate(100);\n        }\n    };\n\n    /**\n     * Mark a place in the app where an app review is appropriate.\n     */\n    markReviewMoment = ($context: SessionContext) => {\n        // No default implementation\n    };\n\n    checkUpdates: (options?: UpdateOptions) => Promise<void> = async () => {\n        // No default implementation\n    };\n\n    downloadFile: (data: Blob | File | URL, filename: string) => Promise<void>;\n\n    // Optional: if the current platform ahs a native scanner (see QRScannerPlugin in mobile frontend), this pluging will get instered here\n    QRScanner?: QRScannerPlugin;\n\n    getOS(): 'android' | 'iOS' | 'web' | 'macOS' | 'windows' | 'unknown' {\n        if (this.platform === 'ios') {\n            return 'iOS';\n        }\n\n        if (this.platform === 'android') {\n            return 'android';\n        }\n\n        const userAgent = navigator.userAgent || navigator.vendor;\n\n        if (/android/i.test(userAgent)) {\n            return 'android';\n        }\n\n        if (/Mac OS X 10_14|Mac OS X 10_13|Mac OS X 10_12|Mac OS X 10_11|Mac OS X 10_10|Mac OS X 10_9/.test(userAgent)) {\n            // Different sms protocol\n            return 'macOS';\n        }\n\n        // iOS detection from: http://stackoverflow.com/a/9039885/177710\n        if (/iPad|iPhone|iPod/.test(userAgent) && !(window as any).MSStream) {\n            return 'iOS';\n        }\n\n        // iPad on iOS 13 detection\n        if (navigator.userAgent.includes('Mac') && 'ontouchend' in document) {\n            return 'iOS';\n        }\n\n        if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) {\n            return 'macOS';\n        }\n\n        if (navigator.platform.toUpperCase().indexOf('WIN') >= 0) {\n            return 'windows';\n        }\n\n        if (navigator.platform.toUpperCase().indexOf('IPHONE') >= 0) {\n            return 'iOS';\n        }\n\n        if (navigator.platform.toUpperCase().indexOf('ANDROID') >= 0) {\n            return 'android';\n        }\n\n        return 'unknown';\n    }\n\n    constructor() {\n        this.downloadFile = async (data: Blob | File | URL, filename: string) => {\n            const saveAs = (await import('file-saver')).default.saveAs;\n            saveAs(data instanceof URL ? data.href : data, filename);\n        };\n    }\n}\n","export function isCloneable(object) {\n    if (typeof object !== 'object' || object === null) {\n        return false;\n    }\n    return !!object.clone;\n}\n/**\n * Use this method to encode an object (might be an encodeable implementation) into a decodable structure\n */\nexport function cloneObject(obj) {\n    if (isCloneable(obj)) {\n        return (obj).clone(); // paranthesis fix type checking for some reason?\n    }\n    if (Array.isArray(obj)) {\n        return (obj).map((e) => {\n            return cloneObject(e);\n        });\n    }\n    if (obj instanceof Map) {\n        // Transform into a normal object to conform to MapDecoders expected format\n        const encodedObj = new Map();\n        for (const [key, value] of obj) {\n            const k = cloneObject(key);\n            encodedObj.set(k, cloneObject(value));\n        }\n        return encodedObj;\n    }\n    if (obj instanceof Date) {\n        return new Date(obj);\n    }\n    if (typeof obj === 'object' && obj !== null) {\n        return Object.assign(Object.create(obj.constructor.prototype), obj);\n    }\n    // Singular value\n    return obj;\n}\n//# sourceMappingURL=Cloneable.js.map","export function hasId(val) {\n    return val.id !== undefined;\n}\nexport function getId(val) {\n    if (hasId(val)) {\n        return val.id;\n    }\n    return val;\n}\nexport function getOptionalId(val) {\n    if (hasId(val)) {\n        return val.id;\n    }\n    return val;\n}\n//# sourceMappingURL=Identifiable.js.map","import { SimpleError } from '@simonbackx/simple-errors';\nimport { cloneObject } from '../classes/Cloneable.js';\nimport { encodeObject } from '../classes/Encodeable.js';\nimport { getId } from '../classes/Identifiable.js';\nimport { isPatchable } from '../classes/Patchable.js';\nfunction isMove(val) {\n    return val.move !== undefined;\n}\nfunction isPut(val) {\n    return val.put !== undefined;\n}\nfunction isDelete(val) {\n    return val.delete !== undefined;\n}\nfunction isPatch(val) {\n    return val.patch !== undefined;\n}\n/**\n * Helps with synchronizing changes to an array. As long as every element in the array has a unique identifier.\n */\nexport class PatchableArray {\n    constructor(changes) {\n        this._isPatchableArray = true;\n        this.changes = changes !== null && changes !== void 0 ? changes : [];\n    }\n    clone() {\n        // Deep clone self\n        const cloned = new PatchableArray();\n        cloned.merge(this);\n        return cloned;\n    }\n    merge(other) {\n        // We need to clone the incoming changes, because otherwise we would keep the same reference\n        // to individual changes we might still change\n        for (const change of other.changes) {\n            this.changes.push(cloneObject(change));\n        }\n    }\n    patch(patch) {\n        if (Array.isArray(patch)) {\n            // Transform itself into a normal array. Override all existing patches\n            return patch.slice();\n        }\n        // Deep clone self\n        const cloned = this.clone();\n        for (const change of patch.changes) {\n            // Apply this change\n            if (isMove(change)) {\n                cloned.addMove(change.move, change.afterId);\n            }\n            else if (isPut(change)) {\n                cloned.addPut(change.put, change.afterId);\n            }\n            else if (isDelete(change)) {\n                cloned.addDelete(change.delete);\n            }\n            else if (isPatch(change)) {\n                cloned.addPatch(change.patch);\n            }\n            else {\n                throw new Error('Invalid change: ' + JSON.stringify(change));\n            }\n        }\n        return cloned;\n    }\n    addPut(value, after) {\n        this.changes.push({ afterId: after, put: value });\n    }\n    addMove(item, after) {\n        this.changes.push({ afterId: after, move: item });\n    }\n    hasChanges(item) {\n        for (const change of this.changes) {\n            if (isMove(change)) {\n                // ok\n            }\n            else if (isPut(change)) {\n                if (getId(change.put) == item) {\n                    return true;\n                }\n            }\n            else if (isDelete(change)) {\n                if (change.delete == item) {\n                    return true;\n                }\n            }\n            else if (isPatch(change)) {\n                if (getId(change.patch) == item) {\n                    return true;\n                }\n            }\n            else {\n                throw new Error('Invalid change: ' + JSON.stringify(change));\n            }\n        }\n        return false;\n    }\n    filter(item) {\n        const construct = this.constructor;\n        const n = new construct();\n        const newCurrentChanges = [];\n        for (const change of this.changes) {\n            if (isMove(change)) {\n                newCurrentChanges.push(change);\n            }\n            else if (isPut(change)) {\n                if (getId(change.put) == item) {\n                    n.changes.push(change);\n                }\n                else {\n                    newCurrentChanges.push(change);\n                }\n            }\n            else if (isDelete(change)) {\n                if (change.delete == item) {\n                    n.changes.push(change);\n                }\n                else {\n                    newCurrentChanges.push(change);\n                }\n            }\n            else if (isPatch(change)) {\n                if (getId(change.patch) == item) {\n                    n.changes.push(change);\n                }\n                else {\n                    newCurrentChanges.push(change);\n                }\n            }\n            else {\n                throw new Error('Invalid change: ' + JSON.stringify(change));\n            }\n        }\n        this.changes = newCurrentChanges;\n        return n;\n    }\n    addPatch(value) {\n        const id = getId(value);\n        const otherPut = this.changes.findIndex(e => isPut(e) && getId(e.put) == id);\n        if (otherPut !== -1) {\n            const other = this.changes[otherPut];\n            if (isPatchable(other.put)) {\n                this.changes.splice(otherPut, 1, {\n                    put: other.put.patch(value),\n                    afterId: other.afterId,\n                });\n            }\n            else {\n                this.changes.splice(otherPut, 1, {\n                    put: value,\n                    afterId: other.afterId,\n                });\n            }\n            return;\n        }\n        const otherPatch = this.changes.findIndex(e => isPatch(e) && getId(e.patch) == id);\n        if (otherPatch !== -1) {\n            const other = this.changes[otherPatch];\n            if (isPatchable(other.patch)) {\n                this.changes.splice(otherPatch, 1, {\n                    patch: other.patch.patch(value),\n                });\n            }\n            else {\n                this.changes.splice(otherPatch, 1, {\n                    patch: value,\n                });\n            }\n            return;\n        }\n        this.changes.push({ patch: value });\n    }\n    addDelete(id) {\n        // Remove all puts, patches and moves\n        const otherPut = this.changes.findIndex(e => isPut(e) && getId(e.put) == id);\n        if (otherPut !== -1) {\n            // if it had a put, remove the put but don't add a delete\n            this.changes.splice(otherPut, 1);\n            return;\n        }\n        else {\n            const otherPatch = this.changes.findIndex(e => isPatch(e) && getId(e.patch) == id);\n            if (otherPatch !== -1) {\n                this.changes.splice(otherPatch, 1);\n            }\n        }\n        this.changes.push({ delete: id });\n    }\n    /// Apply patch changes to a given array\n    applyTo(array) {\n        const newArray = array.slice(0);\n        for (const change of this.changes) {\n            // Apply this change\n            if (isMove(change)) {\n                // First do a delete of this value\n                const index = newArray.findIndex(e => getId(e) == change.move);\n                if (index != -1) {\n                    const value = newArray[index];\n                    newArray.splice(index, 1);\n                    // Insert it again\n                    // null = inserting at the beginning\n                    // not found = inserting at the end\n                    let afterIndex = -1;\n                    if (change.afterId !== null) {\n                        afterIndex = newArray.findIndex(e => getId(e) == change.afterId);\n                        if (afterIndex == -1) {\n                            afterIndex = newArray.length - 1;\n                        }\n                    }\n                    newArray.splice(afterIndex + 1, 0, value);\n                }\n                else {\n                    // maybe throw here?\n                    console.warn('Could not find element with id ' + change.move);\n                }\n            }\n            else if (isPut(change)) {\n                // null = inserting at the beginning\n                // not found = inserting at the end\n                let afterIndex = -1;\n                if (change.afterId !== null) {\n                    afterIndex = newArray.findIndex(e => getId(e) == change.afterId);\n                    if (afterIndex == -1) {\n                        afterIndex = newArray.length - 1;\n                    }\n                }\n                if (change.afterId === undefined) {\n                    afterIndex = newArray.length - 1;\n                }\n                newArray.splice(afterIndex + 1, 0, change.put);\n            }\n            else if (isDelete(change)) {\n                // First do a delete of this value\n                const index = newArray.findIndex(e => getId(e) == change.delete);\n                if (index != -1) {\n                    newArray.splice(index, 1);\n                }\n                else {\n                    console.warn('Could not find element with id ' + change.delete);\n                }\n            }\n            else if (isPatch(change)) {\n                // First do a delete of this value\n                const index = newArray.findIndex(e => getId(e) == getId(change.patch));\n                if (index != -1) {\n                    // Patch!\n                    const value = newArray[index];\n                    if (isPatchable(value)) {\n                        newArray.splice(index, 1, value.patch(change.patch));\n                    }\n                    else {\n                        newArray.splice(index, 1, change.patch);\n                    }\n                }\n            }\n            else {\n                throw new Error('Invalid change: ' + JSON.stringify(change));\n            }\n        }\n        return newArray;\n    }\n    encode(context) {\n        return {\n            _isPatch: true,\n            changes: this.changes.map((change) => {\n                if (isMove(change)) {\n                    // First do a delete of this value\n                    return {\n                        afterId: change.afterId,\n                        move: encodeObject(change.move, context),\n                    };\n                }\n                else if (isPut(change)) {\n                    // First do a delete of this value\n                    return {\n                        afterId: change.afterId,\n                        put: encodeObject(change.put, context),\n                    };\n                }\n                else if (isDelete(change)) {\n                    return {\n                        delete: change.delete,\n                    };\n                }\n                else if (isPatch(change)) {\n                    // First do a delete of this value\n                    return {\n                        patch: encodeObject(change.patch, context),\n                    };\n                }\n            }),\n        };\n    }\n    getPuts() {\n        return this.changes.filter(change => isPut(change));\n    }\n    getPatches() {\n        return this.changes.filter(change => isPatch(change)).map((p) => p.patch);\n    }\n    getDeletes() {\n        return this.changes.filter(change => isDelete(change)).map((p) => p.delete);\n    }\n    getMoves() {\n        return this.changes.filter(change => isMove(change));\n    }\n}\nexport class PatchableArrayItemDecoder {\n    constructor(putDecoder, patchDecoder, idDecoder) {\n        this.putDecoder = putDecoder;\n        this.patchDecoder = patchDecoder;\n        this.idDecoder = idDecoder;\n    }\n    decode(data) {\n        var _a;\n        const put = data.optionalField('put');\n        if (put !== undefined) {\n            // throw decoding errors from putDecoder and idDecoder\n            return {\n                put: put.decode(this.putDecoder),\n                afterId: (_a = data.undefinedField('afterId')) === null || _a === void 0 ? void 0 : _a.nullable(this.idDecoder),\n            };\n        }\n        const move = data.optionalField('move');\n        if (move !== undefined) {\n            return {\n                move: move.decode(this.idDecoder),\n                afterId: data.field('afterId').nullable(this.idDecoder),\n            };\n        }\n        const d = data.optionalField('delete');\n        if (d !== undefined) {\n            return {\n                delete: d.decode(this.idDecoder),\n            };\n        }\n        const patch = data.optionalField('patch');\n        if (patch !== undefined) {\n            return {\n                patch: patch.decode(this.patchDecoder),\n            };\n        }\n        throw new SimpleError({\n            code: 'invalid_field',\n            message: 'Expected put, move, patch or delete',\n            field: data.currentField,\n        });\n    }\n}\nexport class PatchableArrayDecoder {\n    constructor(putDecoder, patchDecoder, idDecoder) {\n        this.putDecoder = putDecoder;\n        this.patchDecoder = patchDecoder;\n        this.idDecoder = idDecoder;\n    }\n    decode(data) {\n        if (Array.isArray(data.value)) {\n            console.warn('Found legacy patchable array. Make sure to use the new patchable array encoding, as this will get removed and replaced with a PUT in future versions.');\n            // Legacy encode version\n            // This will remain supported for a period\n            // but is deprecated\n            return new PatchableArray(data.array(new PatchableArrayItemDecoder(this.putDecoder, this.patchDecoder, this.idDecoder)));\n        }\n        const changes = data.field('changes').array(new PatchableArrayItemDecoder(this.putDecoder, this.patchDecoder, this.idDecoder));\n        return new PatchableArray(changes);\n    }\n    isDefaultValue(value) {\n        return value instanceof PatchableArray && value.changes.length === 0;\n    }\n    getDefaultValue() {\n        return new PatchableArray();\n    }\n}\n//# sourceMappingURL=PatchableArray.js.map","import { SimpleError } from '@simonbackx/simple-errors';\nimport { cloneObject } from './Cloneable.js';\nimport { encodeObject, sortObjectKeysForEncoding } from './Encodeable.js';\nimport { getId, getOptionalId, hasId } from './Identifiable.js';\nimport { isPatchableArray, isPatchMap, patchObject } from './Patchable.js';\n/**\n * Uses the meta data of AutoEncoder to check if something is a patch or a put\n */\nexport class PatchOrPutDecoder {\n    constructor(put, patch) {\n        this.putDecoder = put;\n        this.patchDecoder = patch;\n    }\n    decode(data) {\n        var _a;\n        const isPatch = data.optionalField('_isPatch');\n        if ((_a = isPatch === null || isPatch === void 0 ? void 0 : isPatch.boolean) !== null && _a !== void 0 ? _a : false) {\n            return this.patchDecoder.decode(data);\n        }\n        return this.putDecoder.decode(data);\n    }\n}\nexport function deepSetArray(oldArr, newArray, options) {\n    if (oldArr === newArray) {\n        // Same reference: nothing to do\n        return;\n    }\n    const oldArray = oldArr.slice();\n    // Loop old array\n    // Keep array reference\n    // Delete deleted items\n    // Add new items\n    // Copy over changes from updated items\n    // Maintain new order\n    // Clear out old array\n    oldArr.splice(0, oldArr.length);\n    for (const newItem of newArray) {\n        if (isAutoEncoder(newItem)) {\n            const oldItem = oldArray.find(i => getOptionalId(i) === getOptionalId(newItem));\n            if (oldItem && isAutoEncoder(oldItem)) {\n                oldItem.deepSet(newItem);\n                oldArr.push(oldItem);\n            }\n            else {\n                oldArr.push(newItem);\n            }\n        }\n        else {\n            oldArr.push(newItem);\n        }\n    }\n    if (options === null || options === void 0 ? void 0 : options.keepMissing) {\n        // Readd old missing items\n        for (const oldItem of oldArray) {\n            const found = oldArr.find(i => getOptionalId(i) === getOptionalId(oldItem));\n            if (!found) {\n                oldArr.push(oldItem);\n            }\n        }\n    }\n}\nexport function coalesceUndefined(...values) {\n    // Return first non-undefined value\n    for (const value of values) {\n        if (value !== undefined) {\n            return value;\n        }\n    }\n    return undefined;\n}\nexport class Field {\n    getOptionalClone() {\n        const field = new Field();\n        field.optional = true;\n        field.nullable = this.nullable;\n        field.decoder = this.decoder;\n        field.version = this.version;\n        field.property = this.property;\n        field.field = this.field;\n        if (this.upgrade) {\n            const upg = this.upgrade;\n            field.upgrade = (oldValue) => {\n                if (oldValue !== undefined) {\n                    // Value is set, we need an upgrade\n                    return upg(oldValue);\n                }\n                else {\n                    // No value is set, we don't need an upgrade\n                    return undefined;\n                }\n            };\n        }\n        if (this.downgrade) {\n            const dwn = this.downgrade;\n            field.downgrade = (newValue) => {\n                if (newValue !== undefined) {\n                    // Value is set, we need an upgrade\n                    return dwn(newValue);\n                }\n                else {\n                    // No value is set, we don't need an upgrade\n                    return undefined;\n                }\n            };\n        }\n        if (this.upgradePatch) {\n            field.upgrade = this.upgradePatch;\n        }\n        if (this.downgradePatch) {\n            field.downgrade = this.downgradePatch;\n        }\n        field.upgradePatch = this.upgradePatch;\n        field.downgradePatch = this.downgradePatch;\n        field.patchDefaultValue = this.patchDefaultValue;\n        field.defaultValue = undefined; // do not copy default values. Patches never have default values, unless for patchable arrays\n        const aDecoder = this.decoder;\n        // Do we have a custom patch decoder? (this can be configured in the decoder)\n        if (aDecoder.patchType) {\n            field.upgrade = this.upgradePatch;\n            field.downgrade = this.downgradePatch;\n            const patchDecoder = aDecoder.patchType();\n            field.decoder = new PatchOrPutDecoder(aDecoder, patchDecoder);\n        }\n        if (aDecoder.patchDefaultValue) {\n            // e.g. for patchable arrays we always set a default value\n            field.defaultValue = () => {\n                return aDecoder.patchDefaultValue();\n            };\n        }\n        if (this.patchDefaultValue) {\n            field.defaultValue = this.patchDefaultValue;\n        }\n        return field;\n    }\n}\n/**\n * Create patchable auto encoder.\n * We are not able to add types here, gets too complex. But we'll add a convenience method with typings\n */\n/* export function createPatchableAutoEncoder(constructor: typeof AutoEncoder): typeof AutoEncoder {\n    return constructor as any;\n} */\n/*\nclass Dog extends AutoEncoder {\n    id: string;\n    name: string;\n}\n\nconst DogPatch = createPatchableAutoEncoder(Dog);\n\nconst p = DogPatch.create({id: \"test\"})\n\n*/\nexport function isAutoEncoder(obj) {\n    return obj instanceof AutoEncoder || (typeof obj === 'object' && obj !== null && obj._isAutoEncoder);\n}\nexport class AutoEncoder {\n    /// Create a patch for this instance (of reuse if already created)\n    static patchType() {\n        var _a;\n        if (this.cachedPatchType) {\n            return this.cachedPatchType;\n        }\n        // create a new class\n        class CreatedPatch extends AutoEncoder {\n        }\n        CreatedPatch.fields = [];\n        // A patchtype of a patchtype is always the same\n        // -> avoids infinite loop and allows recursive encoding\n        CreatedPatch.cachedPatchType = CreatedPatch;\n        this.cachedPatchType = CreatedPatch;\n        // Move over all fields\n        for (const field of ((_a = this.fields) !== null && _a !== void 0 ? _a : [])) {\n            CreatedPatch.fields.push(field.getOptionalClone());\n        }\n        CreatedPatch.isPatch = true;\n        return CreatedPatch;\n    }\n    constructor() {\n        this._isAutoEncoder = true;\n        if (!this.static.fields) {\n            this.static.fields = [];\n        }\n        for (const field of this.static.latestFields) {\n            if (field.defaultValue) {\n                this[field.property] = field.defaultValue();\n            }\n        }\n    }\n    isPatch() {\n        return this.static.isPatch;\n    }\n    isPut() {\n        return !this.static.isPatch;\n    }\n    static patch(object) {\n        return this.patchType().create(object);\n    }\n    patchOrPut(patch) {\n        if (patch.static.isPatch) {\n            this.set(this.patch(patch));\n            return;\n        }\n        this.set(patch);\n    }\n    /**\n     * Make a deep clone of this object\n     */\n    clone() {\n        const instance = new this.static();\n        for (const field of this.static.latestFields) {\n            const prop = field.property;\n            instance[prop] = cloneObject(this[prop]);\n        }\n        return instance;\n    }\n    patch(patch) {\n        const instance = new this.static();\n        for (const field of this.static.latestFields) {\n            const prop = field.property;\n            instance[prop] = patchObject(this[prop], patch[prop]);\n        }\n        return instance;\n    }\n    static sortFields() {\n        function compare(a, b) {\n            if (a.version < b.version) {\n                return -1;\n            }\n            if (a.version > b.version) {\n                return 1;\n            }\n            return 0;\n        }\n        this.fields.sort(compare);\n    }\n    static get latestFields() {\n        // We need to clear if we detect taht the _cachedLatestFields is defined on a superclass, but not on this class itself\n        if (!Object.hasOwnProperty.call(this, '_cachedLatestFields') && this._cachedLatestFields) {\n            this._cachedLatestFields = null; // Explicitly set to null to avoid confusion\n        }\n        if (this._cachedLatestFields && this._cachedLatestFields.totalFieldsCount === this.fields.length) {\n            return this._cachedLatestFields.fields;\n        }\n        const latestFields = {};\n        for (let i = this.fields.length - 1; i >= 0; i--) {\n            const field = this.fields[i];\n            if (!latestFields[field.property]) {\n                latestFields[field.property] = field;\n            }\n        }\n        const fields = Object.values(latestFields);\n        // Sort fields for stable encodings\n        fields.sort((a, b) => sortObjectKeysForEncoding(a.property, b.property));\n        this._cachedLatestFields = { fields, totalFieldsCount: this.fields.length };\n        return fields;\n    }\n    static fieldsForVersion(version) {\n        // We need to clear if we detect taht the _cachedLatestFields is defined on a superclass, but not on this class itself\n        if (!Object.hasOwnProperty.call(this, '_cachedFieldsForVersion') && this._cachedFieldsForVersion) {\n            this._cachedFieldsForVersion = new Map();\n        }\n        if (!this._cachedFieldsForVersion) {\n            this._cachedFieldsForVersion = new Map();\n        }\n        if (this._cachedFieldsForVersion.has(version)) {\n            return this._cachedFieldsForVersion.get(version);\n        }\n        const latestFields = {};\n        for (let i = this.fields.length - 1; i >= 0; i--) {\n            const field = this.fields[i];\n            if (field.version <= version && !latestFields[field.property]) {\n                latestFields[field.property] = field;\n            }\n        }\n        const fields = Object.values(latestFields);\n        // Sort fields for stable encodings\n        fields.sort((a, b) => sortObjectKeysForEncoding(a.property, b.property));\n        this._cachedFieldsForVersion.set(version, fields);\n        return fields;\n    }\n    static doesPropertyExist(property) {\n        for (const field of this.fields) {\n            if (field.property === property) {\n                return true;\n            }\n        }\n        return false;\n    }\n    /**\n     * Create a new one by providing the properties of the object\n     */\n    static create(object) {\n        const model = new this();\n        for (const key in object) {\n            // eslint-disable-next-line no-prototype-builtins\n            if (object.hasOwnProperty(key) && object[key] !== undefined && typeof object[key] !== 'function') {\n                // Also check this is an allowed field, else skip in favor of allowing downcasts without errors\n                if (this.doesPropertyExist(key)) {\n                    model[key] = object[key];\n                }\n            }\n        }\n        for (const field of this.latestFields) {\n            if (!field.optional) {\n                if (model[field.property] === undefined) {\n                    if (!this.isPatch) {\n                        if (field.nullable) {\n                            model[field.property] = null;\n                        }\n                        else if (field.decoder.getDefaultValue) {\n                            model[field.property] = field.decoder.getDefaultValue();\n                        }\n                    }\n                    if (model[field.property] === undefined) {\n                        throw new Error('Expected required property ' + field.property + ' when creating ' + this.name);\n                    }\n                }\n            }\n            else {\n                if (model[field.property] === undefined) {\n                    // Explicitly set to undefined\n                    model[field.property] = undefined;\n                }\n            }\n            if (!field.nullable) {\n                if (model[field.property] === null) {\n                    throw new Error('Expected non null property ' + field.property + ' when creating ' + this.name);\n                }\n            }\n        }\n        return model;\n    }\n    /**\n     * Create a new one by providing the properties of the object\n     */\n    set(object) {\n        for (const key in object) {\n            if (object.hasOwnProperty(key) && typeof object[key] !== 'function') {\n                if (this.static.doesPropertyExist(key)) {\n                    this[key] = object[key];\n                }\n            }\n        }\n    }\n    /**\n     * Create a new one by providing the properties of the object.\n     * Maintaining references to objects\n     */\n    deepSet(object) {\n        if (object === this) {\n            // Nothing to do (waste of resources)\n            return;\n        }\n        for (const key in object) {\n            if (object.hasOwnProperty(key) && typeof object[key] !== 'function') {\n                if (this.static.doesPropertyExist(key)) {\n                    if (object[key] === undefined) {\n                        // ignore\n                        continue;\n                    }\n                    if (isAutoEncoder(this[key]) && object[key] !== null && typeof object[key] === 'object') {\n                        this[key].deepSet(object[key]);\n                    }\n                    else if (Array.isArray(this[key]) && Array.isArray(object[key])) {\n                        deepSetArray(this[key], object[key]);\n                    }\n                    else {\n                        this[key] = object[key];\n                    }\n                }\n            }\n        }\n    }\n    get static() {\n        return this.constructor;\n    }\n    encode(context) {\n        if (hasId(this) && !this.static.isPatch && false) {\n            if (context.references === undefined) {\n                context.references = new Map();\n            }\n            let classReferences = context.references.get(this.static);\n            if (classReferences) {\n                // Dramatically reduce size of encoding when lots of relations are returned with the same id\n                const id = getId(this);\n                const existing = classReferences.get(id);\n                // We already returned this same object\n                if (existing) {\n                    // For optimizations we could skip this step, but for now we keep it\n                    if (existing === this) {\n                        return {\n                            _ref: id,\n                        };\n                    }\n                    else {\n                        const a = existing.encode({ version: context.version });\n                        const b = this.encode({ version: context.version });\n                        if (JSON.stringify(a) === JSON.stringify(b)) {\n                            return {\n                                _ref: id,\n                            };\n                        }\n                        console.warn('Same id, but different objects in the encode result. This should not happen and reduces the ability to use references in encoded data.', id);\n                    }\n                }\n            }\n            // Add self\n            if (!classReferences) {\n                classReferences = new Map();\n                context.references.set(this.static, classReferences);\n            }\n            const idField = this.static.latestFields.find(f => f.property === 'id');\n            if (idField) {\n                classReferences.set(getId(this), this);\n            }\n        }\n        const object = {};\n        const source = this.static.downgrade(context.version, this);\n        for (const field of this.static.fieldsForVersion(context.version)) {\n            if (source[field.property] === undefined) {\n                if (!field.optional) {\n                    throw new Error('Value for property ' + field.property + ' is not set, but is required!');\n                }\n                continue;\n            }\n            if (this.static.isPatch) {\n                // Don't send certain values to minimize data\n                if (isPatchableArray(source[field.property]) && source[field.property].changes.length === 0) {\n                    continue;\n                }\n                if (isPatchMap(source[field.property]) && source[field.property].size === 0) {\n                    continue;\n                }\n            }\n            if (AutoEncoder.skipDefaultValues && !this.static.isPatch) {\n                if (field.nullable && !field.optional && source[field.property] === null) {\n                    // Don't send null values - will be handled as null automatically on the receiving side\n                    continue;\n                }\n                if (!field.nullable && field.decoder.isDefaultValue && field.decoder.isDefaultValue(source[field.property])) {\n                    // Skip\n                    continue;\n                }\n            }\n            if (field.decoder && field.decoder.encode) {\n                object[field.field] = field.decoder.encode(source[field.property], context);\n            }\n            else {\n                object[field.field] = encodeObject(source[field.property], context);\n            }\n        }\n        // Add meta data\n        if (this.static.isPatch) {\n            object['_isPatch'] = this.static.isPatch;\n        }\n        return object;\n    }\n    static decode(data) {\n        var _a, _b, _c, _d;\n        const isRef = data.optionalField('_ref');\n        if (isRef) {\n            const idField = this.latestFields.find(f => f.property === 'id');\n            if (!idField) {\n                throw new SimpleError({\n                    code: 'invalid_data',\n                    message: 'No id field found in class ' + this.name,\n                    field: data.addToCurrentField('_ref'),\n                });\n            }\n            const stringOrNumber = isRef.decode(idField.decoder);\n            const classReferences = (_a = data.context.references) === null || _a === void 0 ? void 0 : _a.get(this);\n            if (!classReferences) {\n                throw new SimpleError({\n                    code: 'invalid_reference',\n                    message: 'Invalid usage of references: the _ref field can only be used when the same object is encoded earlier, but no reference found for ' + stringOrNumber,\n                    field: data.addToCurrentField('_ref'),\n                });\n            }\n            const reference = classReferences.get(stringOrNumber);\n            if (!reference) {\n                throw new SimpleError({\n                    code: 'invalid_reference',\n                    message: 'Reference not found with ID ' + stringOrNumber,\n                    field: data.addToCurrentField('_ref'),\n                });\n            }\n            return reference;\n        }\n        const model = new this();\n        const appliedProperties = {};\n        // Loop from newest version to older version\n        for (let i = this.fields.length - 1; i >= 0; i--) {\n            const field = this.fields[i];\n            if (field.version <= data.context.version && !appliedProperties[field.property]) {\n                const fieldData = data.undefinedField(field.field);\n                if (!fieldData && !field.optional && field.nullable) {\n                    // Special case because we are not using the Nullable Decoder directly\n                    model[field.property] = null;\n                }\n                else if (!fieldData && !field.optional && field.property !== 'id' && (model[field.property] !== undefined || field.decoder.getDefaultValue)) {\n                    // Property has not been set. Set it to the default value of the decoder\n                    if (field.decoder.getDefaultValue) {\n                        model[field.property] = coalesceUndefined(model[field.property], field.decoder.getDefaultValue());\n                    }\n                    else {\n                        // Already set\n                    }\n                }\n                else if (field.optional) {\n                    if (field.nullable) {\n                        // Set to null if set to null, set to undefined if not received\n                        model[field.property] = coalesceUndefined(fieldData === null || fieldData === void 0 ? void 0 : fieldData.nullable(field.decoder), model[field.property]);\n                    }\n                    else {\n                        // When null, still set the default values\n                        model[field.property] = (_d = (_c = (_b = data.optionalField(field.field)) === null || _b === void 0 ? void 0 : _b.decode(field.decoder)) !== null && _c !== void 0 ? _c : model[field.property]) !== null && _d !== void 0 ? _d : undefined;\n                    }\n                    /* if (!fieldData) {\n                        // Set to undefined or keep current default value\n                        model[field.property] = coalesceUndefined(model[field.property], undefined);\n                    }\n                    else {\n                        if (!this.isPatch) {\n                            // Optional fields always have a dedicated default value set\n                            if (field.nullable) {\n                                // Set to null if set to null, set to undefined if not received\n                                model[field.property] = coalesceUndefined(fieldData?.nullable(field.decoder), model[field.property]);\n                            }\n                            else {\n                                // When null, still set the default values\n                                model[field.property] = data.optionalField(field.field)?.decode(field.decoder) ?? model[field.property] ?? undefined;\n                            }\n                        }\n                        else {\n                            // Never use default values\n                            // Do use the default value from the object itself (will be an empty patchabel array or map)\n                            if (field.nullable) {\n                                model[field.property] = coalesceUndefined(fieldData?.nullable(field.decoder), model[field.property]);\n                            }\n                            else {\n                                // When null, still set the default values\n                                model[field.property] = data.optionalField(field.field)?.decode(field.decoder) ?? model[field.property] ?? undefined;\n                            }\n                        }\n                    } */\n                }\n                else {\n                    if (field.nullable) {\n                        model[field.property] = data.field(field.field).nullable(field.decoder);\n                    }\n                    else {\n                        model[field.property] = data.field(field.field).decode(field.decoder);\n                    }\n                }\n                appliedProperties[field.property] = true;\n            }\n        }\n        // We now have model with values equal to version data.context.version\n        // Run upgrade / downgrade migrations to convert changes in fields\n        this.upgrade(data.context.version, model);\n        if (!this.isPatch) {\n            if (data.context.references === undefined) {\n                data.context.references = new Map();\n            }\n            let classReferences = data.context.references.get(this);\n            if (!classReferences) {\n                classReferences = new Map();\n                data.context.references.set(this, classReferences);\n            }\n            if (classReferences && hasId(model)) {\n                classReferences.set(getId(model), model);\n            }\n        }\n        return model;\n    }\n    /**\n     * Upgrade property values coming from an older version\n     * @param from\n     * @param object\n     */\n    static upgrade(from, object) {\n        for (const field of this.fields) {\n            if (field.version > from) {\n                if (field.upgrade) {\n                    object[field.property] = field.upgrade.call(object, object[field.property]);\n                }\n            }\n        }\n    }\n    /**\n     * Downgrade property values to a new object\n     */\n    static downgrade(to, object) {\n        let didCopy = false;\n        const older = {};\n        for (let i = this.fields.length - 1; i >= 0; i--) {\n            const field = this.fields[i];\n            if (field.version > to) {\n                if (field.downgrade) {\n                    if (!didCopy) {\n                        didCopy = true;\n                        Object.assign(older, object);\n                    }\n                    older[field.property] = field.downgrade.call(object, older[field.property]);\n                }\n            }\n        }\n        if (!didCopy) {\n            return object;\n        }\n        return older;\n    }\n}\nAutoEncoder.isPatch = false;\nAutoEncoder.skipDefaultValues = false;\n//# sourceMappingURL=AutoEncoder.js.map","import { PatchableArray } from '../structs/PatchableArray.js';\nimport { isAutoEncoder } from './AutoEncoder.js';\nimport { cloneObject } from './Cloneable.js';\nexport function isPatchable(object) {\n    if (!object) {\n        return false;\n    }\n    return !!object.patch;\n}\nexport function patchContainsChanges(patch, model, context) {\n    const patched = model.patch(patch);\n    return JSON.stringify(patched.encode(context)) != JSON.stringify(model.encode(context));\n}\nexport class PatchMap extends Map {\n    constructor() {\n        super(...arguments);\n        this._isPatch = true;\n        this._isPatchMap = true;\n    }\n    applyTo(obj) {\n        if (isPatchMap(obj)) {\n            // Combine instead of normal logic\n            const clone = new PatchMap(obj);\n            for (const [key, value] of this.entries()) {\n                if (value === null) {\n                    clone.set(key, null);\n                    continue;\n                }\n                if (value === undefined) {\n                    continue;\n                }\n                const original = obj.get(key);\n                if (original === null) {\n                    // Has been deleted higher up\n                    if (isPatch(value)) {\n                        continue;\n                    }\n                    clone.set(key, value);\n                    continue;\n                }\n                if (original === undefined) {\n                    clone.set(key, value);\n                    continue;\n                }\n                clone.set(key, patchObject(original, value));\n            }\n            return clone;\n        }\n        const clone = new Map(obj);\n        for (const [key, value] of this.entries()) {\n            if (value === null) {\n                clone.delete(key);\n                continue;\n            }\n            if (value === undefined) {\n                continue;\n            }\n            const original = obj.get(key);\n            const patched = patchObject(original, value);\n            if (original === undefined && patched === undefined) {\n                // Don't copy it: this is an empty patch to an item that does not exist\n                continue;\n            }\n            clone.set(key, patched);\n        }\n        return clone;\n    }\n    clone() {\n        // Deep clone self\n        const clone = new PatchMap();\n        for (const [key, value] of this.entries()) {\n            clone.set(key, cloneObject(value));\n        }\n        return clone;\n    }\n}\nexport function isPatchMap(obj) {\n    return (obj instanceof PatchMap);\n}\nexport function isPatchableArray(obj) {\n    return (obj instanceof PatchableArray);\n}\nexport function isPatch(obj) {\n    if (isAutoEncoder(obj)) {\n        // Instance type could be different\n        return obj.isPatch();\n    }\n    if (isPatchMap(obj)) {\n        return true;\n    }\n    if (isPatchableArray(obj)) {\n        return true;\n    }\n    return false;\n}\nexport function isEmptyPatch(patch) {\n    if (patch === undefined) {\n        return true;\n    }\n    if (patch === null) {\n        return false;\n    }\n    if (Array.isArray(patch)) {\n        // Can override array\n        return false;\n    }\n    if (isPatchableArray(patch)) {\n        return patch.changes.length === 0;\n    }\n    if (isPatchMap(patch)) {\n        return patch.size === 0;\n    }\n    if (patch instanceof Map) {\n        return false;\n    }\n    if (typeof patch === 'object') {\n        if (Object.keys(patch).length === 0) {\n            return true;\n        }\n        return false;\n    }\n    return false;\n}\n/**\n * Use this method to encode an object (might be an encodeable implementation) into a decodable structure\n */\nexport function patchObject(obj, patch) {\n    if (patch === undefined) {\n        // When a property is set to undefined, we always ignore it, always. You can never set something to undefined.\n        // Use null instead.\n        return obj;\n    }\n    if (isPatchable(obj)) {\n        if (patch == null) {\n            return null;\n        }\n        else {\n            if (isAutoEncoder(patch) && patch.isPut()) {\n                // Instance type could be different\n                return patch;\n            }\n            else {\n                return obj.patch(patch);\n            }\n        }\n    }\n    else {\n        if (obj instanceof Map && isPatchMap(patch)) {\n            return patch.applyTo(obj);\n        }\n        else if (Array.isArray(obj)) {\n            // Check if patch is a patchable array\n            if (isPatchableArray(patch)) {\n                return patch.applyTo(obj);\n            }\n            else {\n                // What happens when an array field is set?\n                // This can only happen when the autocoder is not identifieable, but\n                // technically also in other cases if typescript doesn't check types\n                // we just take over the new values and 'remove' all old elements\n                return patch;\n            }\n        }\n        else {\n            if ((obj === undefined || obj === null) && isPatchableArray(patch)) {\n                // Patch on optional array: ignore if empty patch, else fake empty array patch\n                if (patch.changes.length === 0) {\n                    return obj;\n                }\n                const patched = patch.applyTo([]);\n                if (patched.length === 0) {\n                    // Nothing changed, keep it undefined or null\n                    return obj;\n                }\n                return patched;\n            }\n            else if ((obj === undefined || obj === null) && isPatchMap(patch)) {\n                // Patch on optional array: ignore if empty patch, else fake empty array patch\n                if (patch.size === 0) {\n                    return obj;\n                }\n                const patched = patch.applyTo(new Map());\n                if (patched.size === 0) {\n                    // Nothing changed, keep it undefined or null\n                    return obj;\n                }\n                return patched;\n            }\n            else {\n                return patch;\n            }\n        }\n    }\n}\n//# sourceMappingURL=Patchable.js.map","import { isPatchMap } from './Patchable.js';\nexport function isEncodeable(object) {\n    if (typeof object !== 'object' || object === null) {\n        return false;\n    }\n    return typeof object.encode === 'function';\n}\n/**\n * Use this method to encode an object (might be an encodeable implementation) into a decodable structure\n */\nexport function encodeObject(obj, context) {\n    if (isEncodeable(obj)) {\n        return obj.encode(context);\n    }\n    if (typeof obj === 'symbol') {\n        const key = Symbol.keyFor(obj);\n        if (key) {\n            return {\n                $symbol: key,\n            };\n        }\n    }\n    if (Array.isArray(obj)) {\n        return obj.map((e) => {\n            return encodeObject(e, context);\n        });\n    }\n    if (isPatchMap(obj)) {\n        // Transform into a normal object to conform to MapDecoders expected format\n        const encodedObj = {};\n        for (const [key, value] of obj) {\n            const k = encodeObject(key, context);\n            encodedObj[k] = encodeObject(value, context);\n        }\n        return {\n            // No need to sort the keys of patches\n            _isPatch: true,\n            changes: encodedObj,\n        };\n    }\n    if (obj instanceof Map) {\n        // Transform into a normal object to conform to MapDecoders expected format\n        const queue = [];\n        for (const [key, value] of obj) {\n            const k = encodeObject(key, context);\n            if (typeof k !== 'string' && typeof k !== 'number') {\n                throw new Error(`Map keys must be strings or numbers. Got ${k}`);\n            }\n            queue.push({ key: k.toString(), value: encodeObject(value, context) });\n        }\n        // Sort queue by key to have reliable encoding\n        const encodedObj = {};\n        queue.sort((a, b) => sortObjectKeysForEncoding(a.key, b.key));\n        for (const { key, value } of queue) {\n            encodedObj[key] = value;\n        }\n        if (obj._isPatch) {\n            return {\n                _isPatch: true,\n                changes: encodedObj,\n            };\n        }\n        return encodedObj;\n    }\n    if (obj === null || obj === undefined) {\n        return obj;\n    }\n    if (typeof obj === 'object') {\n        // Sort keys\n        const keys = Object.keys(obj).sort(sortObjectKeysForEncoding);\n        const encodedObj = {};\n        for (const key of keys) {\n            encodedObj[key] = encodeObject(obj[key], context);\n        }\n        return encodedObj;\n    }\n    // Failed to decode\n    return obj;\n}\nexport function sortObjectKeysForEncoding(a, b) {\n    // Always have a fixed order for certain keys, and follow with alphabetical order\n    // id, name, description, ...remaining\n    if (a === b) {\n        return 0;\n    }\n    if (a === 'id') {\n        return -1;\n    }\n    if (b === 'id') {\n        return 1;\n    }\n    if (a === 'name') {\n        return -1;\n    }\n    if (b === 'name') {\n        return 1;\n    }\n    if (a === 'description') {\n        return -1;\n    }\n    if (b === 'description') {\n        return 1;\n    }\n    return a.localeCompare(b);\n}\n//# sourceMappingURL=Encodeable.js.map","import { SimpleError } from '@simonbackx/simple-errors';\nclass StringOrNumberDecoder {\n    decode(data) {\n        if (typeof data.value === 'string') {\n            return data.value;\n        }\n        if (typeof data.value === 'number' && !Number.isNaN(data.value) && Number.isFinite(data.value)) {\n            return data.value;\n        }\n        throw new SimpleError({\n            code: 'invalid_field',\n            message: `Expected a string or number at ${data.currentField}`,\n            field: data.currentField,\n        });\n    }\n}\n// We export an instance to prevent creating a new instance every time we need to decode a number\nexport default new StringOrNumberDecoder();\n//# sourceMappingURL=StringOrNumberDecoder.js.map","import { SimpleError } from '@simonbackx/simple-errors';\nimport { PatchableArray, PatchableArrayDecoder } from './PatchableArray.js';\nimport StringOrNumberDecoder from './StringOrNumberDecoder.js';\nexport class ArrayDecoder {\n    constructor(decoder) {\n        this.decoder = decoder;\n    }\n    decode(data) {\n        if (Array.isArray(data.value)) {\n            return data.value\n                .map((v, index) => {\n                return data.clone({\n                    data: v,\n                    context: data.context,\n                    field: data.addToCurrentField(index),\n                }).decode(this.decoder);\n            });\n        }\n        throw new SimpleError({\n            code: 'invalid_field',\n            message: `Expected an array at ${data.currentField}`,\n            field: data.currentField,\n        });\n    }\n    patchType() {\n        const elementDecoder = this.decoder;\n        if (elementDecoder.patchType) {\n            const patchDecoder = elementDecoder.patchType();\n            // Check if we have a method called \"getIdentifier\"\n            let idFieldType;\n            if (elementDecoder.patchIdentifier) {\n                // Custom identifier (in case no automatic detection is possible)\n                idFieldType = elementDecoder.patchIdentifier();\n            }\n            else {\n                if (patchDecoder.prototype.getIdentifier) {\n                    // This autoencoder uses the getIdentifier method to define the id\n                    idFieldType = StringOrNumberDecoder;\n                }\n                else {\n                    const field = elementDecoder.fields.find(field => field.property == 'id');\n                    if (field) {\n                        idFieldType = field.decoder;\n                    }\n                }\n            }\n            if (idFieldType) {\n                return new PatchableArrayDecoder(elementDecoder, patchDecoder, idFieldType);\n            }\n            else {\n                // A non identifiable array -> we expect an optional array instead = default behaviour\n                // upgrade / downgrade kan stay the same as default\n                // We expect a normal array, of same type\n                return this;\n            }\n        }\n        // Upgrade / downgrades cannot work when pathcing, should be placed on instances\n        // field.upgrade = this.upgradePatch\n        // field.downgrade = this.downgradePatch\n        return new PatchableArrayDecoder(elementDecoder, elementDecoder, elementDecoder);\n    }\n    /**\n     * Patchable values of an array always create a default empty patchable array for convenience\n     */\n    patchDefaultValue() {\n        const elementDecoder = this.decoder;\n        if (elementDecoder.patchType) {\n            const patchDecoder = elementDecoder.patchType();\n            // Check if we have a method called \"getIdentifier\"\n            let idFieldType;\n            if (elementDecoder.patchIdentifier) {\n                // Custom identifier (in case no automatic detection is possible)\n                idFieldType = elementDecoder.patchIdentifier();\n            }\n            else {\n                if (patchDecoder.prototype.getIdentifier) {\n                    // This autoencoder uses the getIdentifier method to define the id\n                    idFieldType = StringOrNumberDecoder;\n                }\n                else {\n                    const field = elementDecoder.fields.find(field => field.property == 'id');\n                    if (field) {\n                        idFieldType = field.decoder;\n                    }\n                }\n            }\n            if (idFieldType) {\n                return new PatchableArray();\n            }\n            else {\n                // A non identifiable array -> we expect an optional array instead = default behaviour\n                // upgrade / downgrade kan stay the same as default\n                // We expect a normal array, of same type\n                return undefined;\n            }\n        }\n        return new PatchableArray();\n    }\n    isDefaultValue(value) {\n        return Array.isArray(value) && value.length === 0;\n    }\n    getDefaultValue() {\n        return [];\n    }\n}\n//# sourceMappingURL=ArrayDecoder.js.map","import { SimpleError } from '@simonbackx/simple-errors';\nclass BooleanDecoder {\n    decode(data) {\n        if (data.value === true || data.value === false) {\n            return data.value;\n        }\n        if (data.value === 'true') {\n            return true;\n        }\n        if (data.value === 'false') {\n            return false;\n        }\n        if (data.value === 1) {\n            return true;\n        }\n        if (data.value === 0) {\n            return false;\n        }\n        throw new SimpleError({\n            code: 'invalid_field',\n            message: `Expected a boolean at ${data.currentField}`,\n            field: data.currentField,\n        });\n    }\n}\n// We export an instance to prevent creating a new instance every time we need to decode a number\nexport default new BooleanDecoder();\n//# sourceMappingURL=BooleanDecoder.js.map","import { SimpleError } from '@simonbackx/simple-errors';\nexport class EnumDecoder {\n    constructor(e) {\n        this.enum = e;\n    }\n    decode(data) {\n        let str;\n        try {\n            str = data.string;\n            if (Object.values(this.enum).includes(str)) {\n                return str;\n            }\n        }\n        catch (e) {\n            try {\n                str = data.number;\n                if (Object.values(this.enum).includes(str)) {\n                    return str;\n                }\n            }\n            catch (e2) {\n                throw new SimpleError({\n                    code: 'invalid_field',\n                    message: `Expected a number or string for enum: ` + Object.values(this.enum).join(', '),\n                    field: data.currentField,\n                });\n            }\n        }\n        throw new SimpleError({\n            code: 'invalid_field',\n            message: 'Unknown enum value ' + str + ' expected ' + Object.values(this.enum).join(', '),\n            field: data.currentField,\n        });\n    }\n}\n//# sourceMappingURL=EnumDecoder.js.map","import { SimpleError } from '@simonbackx/simple-errors';\nclass IntegerDecoder {\n    decode(data) {\n        if (typeof data.value === 'number' && Number.isSafeInteger(data.value)) {\n            return data.value;\n        }\n        if (typeof data.value === 'string') {\n            const parsed = Number.parseInt(data.value);\n            if (!isNaN(parsed)) {\n                return parsed;\n            }\n        }\n        throw new SimpleError({\n            code: 'invalid_field',\n            message: `Expected an integer at ${data.currentField}`,\n            field: data.currentField,\n        });\n    }\n}\n// We export an instance to prevent creating a new instance every time we need to decode a number\nexport default new IntegerDecoder();\n//# sourceMappingURL=IntegerDecoder.js.map","export class NullableDecoder {\n    constructor(decoder) {\n        this.decoder = decoder;\n    }\n    decode(data) {\n        if (data.value === null) {\n            return null;\n        }\n        return data.decode(this.decoder);\n    }\n    isDefaultValue(value) {\n        return value === null;\n    }\n    getDefaultValue() {\n        return null;\n    }\n}\n//# sourceMappingURL=NullableDecoder.js.map","import { SimpleError } from '@simonbackx/simple-errors';\nclass NumberDecoder {\n    decode(data) {\n        if (typeof data.value === 'number' && !Number.isNaN(data.value) && Number.isFinite(data.value)) {\n            return data.value;\n        }\n        throw new SimpleError({\n            code: 'invalid_field',\n            message: `Expected a number at ${data.currentField}`,\n            field: data.currentField,\n        });\n    }\n}\n// We export an instance to prevent creating a new instance every time we need to decode a number\nexport default new NumberDecoder();\n//# sourceMappingURL=NumberDecoder.js.map","import { SimpleError } from '@simonbackx/simple-errors';\nclass StringDecoder {\n    decode(data) {\n        if (typeof data.value === 'string') {\n            return data.value;\n        }\n        throw new SimpleError({\n            code: 'invalid_field',\n            message: `Expected a string at ${data.currentField}`,\n            field: data.currentField,\n        });\n    }\n    isDefaultValue(value) {\n        return value === '';\n    }\n    getDefaultValue() {\n        return '';\n    }\n}\n// We export an instance to prevent creating a new instance every time we need to decode a number\nexport default new StringDecoder();\n//# sourceMappingURL=StringDecoder.js.map","import { SimpleError } from '@simonbackx/simple-errors';\nimport { ArrayDecoder } from '../structs/ArrayDecoder.js';\nimport BooleanDecoder from '../structs/BooleanDecoder.js';\nimport { EnumDecoder } from '../structs/EnumDecoder.js';\nimport IntegerDecoder from '../structs/IntegerDecoder.js';\nimport { NullableDecoder } from '../structs/NullableDecoder.js';\nimport NumberDecoder from '../structs/NumberDecoder.js';\nimport StringDecoder from '../structs/StringDecoder.js';\n/// Implementation of Data that reads an already existing tree of data.\nexport class ObjectData {\n    constructor(data, context, currentField = '') {\n        this.data = data;\n        this.currentField = currentField;\n        this.context = context;\n    }\n    addToCurrentField(field) {\n        if (this.currentField == '') {\n            return field + '';\n        }\n        return this.currentField + '.' + field;\n    }\n    get value() {\n        return this.data;\n    }\n    get string() {\n        return this.decode(StringDecoder);\n    }\n    get number() {\n        return this.decode(NumberDecoder);\n    }\n    get integer() {\n        return this.decode(IntegerDecoder);\n    }\n    get boolean() {\n        return this.decode(BooleanDecoder);\n    }\n    equals(value) {\n        if (this.data !== value) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Expected ' + value,\n                field: this.currentField,\n            });\n        }\n        return value;\n    }\n    /**\n     * Request an item at a given index. Expects a defined, non null value\n     * @param number index\n     */\n    index(number) {\n        if (Array.isArray(this.value)) {\n            if (!Number.isSafeInteger(number)) {\n                throw new SimpleError({\n                    code: 'invalid_index',\n                    message: `Invalid index`,\n                    field: this.currentField,\n                });\n            }\n            if (this.data[number] !== undefined) {\n                throw new SimpleError({\n                    code: 'invalid_field',\n                    message: `Expected value at ${this.addToCurrentField(number)}`,\n                    field: this.addToCurrentField(number),\n                });\n            }\n            return new ObjectData(this.data[number], this.context, this.addToCurrentField(number));\n        }\n        throw new SimpleError({\n            code: 'invalid_field',\n            message: `Expected an array${this.currentField ? ' at ' + this.currentField : ''}`,\n            field: this.currentField,\n        });\n    }\n    /**\n     * Expects an optional field that could be null. Always returns undefined if the field is null or undefined.\n     */\n    optionalField(field) {\n        if (this.data && this.data[field] !== undefined && this.data[field] !== null) {\n            return new ObjectData(this.data[field], this.context, this.addToCurrentField(field));\n        }\n    }\n    /**\n     * Expects an optional field that could be null. Returns Data if the field value is null or not undefined\n     */\n    undefinedField(field) {\n        if (this.data && this.data[field] !== undefined) {\n            return new ObjectData(this.data[field], this.context, this.addToCurrentField(field));\n        }\n    }\n    /**\n     * Expects an existing field that is defined and not null\n     */\n    field(field) {\n        if (this.data && this.data[field] !== undefined) {\n            return new ObjectData(this.data[field], this.context, this.addToCurrentField(field));\n        }\n        throw new SimpleError({\n            code: 'missing_field',\n            message: `Field ${field} is expected${this.currentField ? ' at ' + this.currentField : ''}`,\n            field: this.currentField,\n        });\n    }\n    array(decoder) {\n        return new ArrayDecoder(decoder).decode(this);\n    }\n    decode(decoder) {\n        return decoder.decode(this);\n    }\n    nullable(decoder) {\n        return new NullableDecoder(decoder).decode(this);\n    }\n    enum(e) {\n        return new EnumDecoder(e).decode(this);\n    }\n    clone(set) {\n        return new ObjectData(set.data, set.context, set.field);\n    }\n}\n//# sourceMappingURL=ObjectData.js.map","class AnyDecoder {\n    decode(data) {\n        return data.value;\n    }\n}\nexport default new AnyDecoder();\n//# sourceMappingURL=AnyDecoder.js.map","import { SimpleError } from '@simonbackx/simple-errors';\nimport { NullableDecoder } from './NullableDecoder.js';\nimport { PatchMap } from '../classes/Patchable.js';\nimport { PatchOrPutDecoder } from '../classes/AutoEncoder.js';\nexport class MapDecoder {\n    constructor(keyDecoder, valueDecoder) {\n        this.keyDecoder = keyDecoder;\n        this.valueDecoder = valueDecoder;\n    }\n    patchType() {\n        const elementDecoder = this.valueDecoder;\n        if (elementDecoder.patchType) {\n            const patchDecoder = elementDecoder.patchType();\n            return new PatchMapDecoder(this.keyDecoder, new NullableDecoder(new PatchOrPutDecoder(this.valueDecoder, patchDecoder)));\n        }\n        return new PatchMapDecoder(this.keyDecoder, new NullableDecoder(this.valueDecoder));\n    }\n    patchDefaultValue() {\n        return new PatchMap();\n    }\n    decode(data) {\n        if (typeof data.value === 'object' && data.value !== null) {\n            const map = new Map();\n            for (const key in data.value) {\n                const keyDecoded = data.clone({\n                    data: key,\n                    context: data.context,\n                    field: data.addToCurrentField(key),\n                }).decode(this.keyDecoder);\n                const valueDecoded = data.field(key).decode(this.valueDecoder);\n                map.set(keyDecoded, valueDecoded);\n            }\n            return map;\n        }\n        throw new SimpleError({\n            code: 'invalid_field',\n            message: `Expected an object at ${data.currentField}`,\n            field: data.currentField,\n        });\n    }\n    isDefaultValue(value) {\n        return value instanceof Map && value.size === 0;\n    }\n    getDefaultValue() {\n        return new Map();\n    }\n}\nexport class PatchMapDecoder {\n    constructor(keyDecoder, valueDecoder) {\n        this.keyDecoder = keyDecoder;\n        this.valueDecoder = valueDecoder;\n    }\n    decode(container) {\n        const data = container.field('changes');\n        if (typeof data.value === 'object' && data.value !== null) {\n            const map = new PatchMap();\n            for (const key in data.value) {\n                const keyDecoded = data.clone({\n                    data: key,\n                    context: data.context,\n                    field: data.addToCurrentField(key),\n                }).decode(this.keyDecoder);\n                const valueDecoded = data.field(key).decode(this.valueDecoder);\n                map.set(keyDecoded, valueDecoded);\n            }\n            return map;\n        }\n        throw new SimpleError({\n            code: 'invalid_field',\n            message: `Expected an object at ${data.currentField}`,\n            field: data.currentField,\n        });\n    }\n    isDefaultValue(value) {\n        return value instanceof PatchMap && value.size === 0;\n    }\n    getDefaultValue() {\n        return new PatchMap();\n    }\n}\n//# sourceMappingURL=MapDecoder.js.map","import { SimpleError } from '@simonbackx/simple-errors';\nclass EmailDecoderStatic {\n    decode(data) {\n        const str = data.string;\n        const regex = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n        if (!regex.test(str)) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Received an invalid email address',\n                human: 'Dit e-mailadres is ongeldig, kijk je het na?',\n                field: data.currentField,\n            });\n        }\n        return str;\n    }\n}\n// We export an instance to prevent creating a new instance every time we need to decode a number\nexport const EmailDecoder = new EmailDecoderStatic();\n//# sourceMappingURL=EmailDecoder.js.map","import { SimpleError } from '@simonbackx/simple-errors';\nexport class RecordDecoder {\n    constructor(keyDecoder, valueDecoder) {\n        this.keyDecoder = keyDecoder;\n        this.valueDecoder = valueDecoder;\n    }\n    decode(data) {\n        if (typeof data.value === 'object' && data.value !== null) {\n            const map = {};\n            for (const key in data.value) {\n                const keyDecoded = data.clone({\n                    data: key,\n                    context: data.context,\n                    field: data.addToCurrentField(key),\n                }).decode(this.keyDecoder);\n                const valueDecoded = data.field(key).decode(this.valueDecoder);\n                map[keyDecoded] = valueDecoded;\n            }\n            return map;\n        }\n        throw new SimpleError({\n            code: 'invalid_field',\n            message: `Expected an object at ${data.currentField}`,\n            field: data.currentField,\n        });\n    }\n}\n//# sourceMappingURL=RecordDecoder.js.map","import { SimpleError } from '@simonbackx/simple-errors';\nexport class SymbolDecoder {\n    constructor(decoder, e) {\n        this.decoder = decoder;\n        this.symbol = e;\n        const k = Symbol.keyFor(e);\n        if (!k) {\n            throw new Error('Symbol must be a registered symbol in order to be encodeable. Create a new symbol with Symbol.for(\"key\")');\n        }\n        this.key = k;\n    }\n    decode(data) {\n        const field = data.optionalField('$symbol');\n        if (!field) {\n            return this.decoder.decode(data);\n        }\n        const s = field.string;\n        if (s === this.key) {\n            return this.symbol;\n        }\n        throw new SimpleError({\n            code: 'invalid_field',\n            message: `Unknown symbol value '${s}', expected '${this.key}'`,\n            field: data.currentField,\n        });\n    }\n}\n//# sourceMappingURL=SymbolDecoder.js.map","import { Field } from '../classes/AutoEncoder.js';\nexport function field(settings) {\n    return (target /* future typeof Model */, key) => {\n        var _a, _b, _c, _d, _e, _f;\n        if (!target.constructor.fields) {\n            target.constructor.fields = [];\n            target.constructor.fields.createdFor = target.constructor;\n        }\n        else {\n            if (target.constructor.fields.createdFor && target.constructor.fields.createdFor !== target.constructor) {\n                // need to clone instead of creating a new reference\n                target.constructor.fields = target.constructor.fields.slice(0);\n                target.constructor.fields.createdFor = target.constructor;\n                target.constructor.cachedPatchType = undefined;\n            }\n        }\n        const field = new Field();\n        field.optional = (_a = settings.optional) !== null && _a !== void 0 ? _a : false;\n        field.nullable = (_b = settings.nullable) !== null && _b !== void 0 ? _b : false;\n        field.decoder = settings.decoder;\n        field.version = (_c = settings.version) !== null && _c !== void 0 ? _c : 0;\n        field.field = (_d = settings.field) !== null && _d !== void 0 ? _d : key;\n        field.upgrade = settings.upgrade;\n        field.downgrade = settings.downgrade;\n        field.upgradePatch = settings.upgradePatch;\n        field.downgradePatch = settings.downgradePatch;\n        field.defaultValue = settings.defaultValue;\n        field.patchDefaultValue = settings.patchDefaultValue;\n        field.property = key;\n        target.constructor.fields.push(field);\n        target.constructor.latestVersion = Math.max((_e = target.constructor.latestVersion) !== null && _e !== void 0 ? _e : 0, (_f = settings.version) !== null && _f !== void 0 ? _f : 0);\n        target.constructor.sortFields();\n    };\n}\n//# sourceMappingURL=Field.js.map","export var EncodeMedium;\n(function (EncodeMedium) {\n    /**\n     * The object will be sent over the network.\n     */\n    EncodeMedium[\"Network\"] = \"Network\";\n    /**\n     * The object will be stored in the database.\n     */\n    EncodeMedium[\"Database\"] = \"Database\";\n})(EncodeMedium || (EncodeMedium = {}));\n//# sourceMappingURL=EncodeContext.js.map","import { encodeObject } from '../classes/Encodeable.js';\n/**\n * When you need to store data for a long period, a VersionBox can be very usefull. It saves the version of the data in it's encoding.\n * During decoding, it reads the version and continues decoding the data using the provided version instead of the version in the context.\n */\nexport class VersionBox {\n    constructor(data) {\n        this.data = data;\n    }\n    encode(context) {\n        return {\n            data: encodeObject(this.data, context),\n            version: context.version,\n        };\n    }\n}\nexport class VersionBoxDecoder {\n    constructor(decoder) {\n        this.decoder = decoder;\n    }\n    decode(data) {\n        // Set the version of the decoding context of \"data\"\n        const context = data.field('data');\n        context.context.version = data.field('version').integer;\n        return new VersionBox(context.decode(this.decoder));\n    }\n}\n//# sourceMappingURL=VersionBox.js.map","class DateDecoder {\n    decode(data) {\n        return new Date(data.integer);\n    }\n}\nDate.prototype.encode = function (context) {\n    return this.getTime();\n};\n// We export an instance to prevent creating a new instance every time we need to decode a number\nexport default new DateDecoder();\n//# sourceMappingURL=DateDecoder.js.map","import { isSimpleError, isSimpleErrors, SimpleError } from '@simonbackx/simple-errors';\nexport class URLDecoder {\n    constructor(options) {\n        var _a, _b;\n        this.allowedProtocols = ['https:'];\n        this.allowPorts = false;\n        this.allowedProtocols = (_a = options === null || options === void 0 ? void 0 : options.allowedProtocols) !== null && _a !== void 0 ? _a : this.allowedProtocols;\n        this.allowPorts = (_b = options === null || options === void 0 ? void 0 : options.allowPorts) !== null && _b !== void 0 ? _b : this.allowPorts;\n    }\n    decode(data) {\n        const str = data.string;\n        try {\n            const parsed = new URL(str);\n            if (!this.allowedProtocols.includes(parsed.protocol)) {\n                throw new SimpleError({\n                    code: 'invalid_field',\n                    message: `Expected a valid URL at ${data.currentField} with protocol ${this.allowedProtocols.join(', ')}`,\n                    field: data.currentField,\n                });\n            }\n            if (!this.allowPorts && parsed.port !== '') {\n                throw new SimpleError({\n                    code: 'invalid_field',\n                    message: `Expected a valid URL without custom port at ${data.currentField}`,\n                    field: data.currentField,\n                });\n            }\n            if (parsed.username || parsed.password) {\n                throw new SimpleError({\n                    code: 'invalid_field',\n                    message: `Expected a valid URL without username:password at ${data.currentField}`,\n                    field: data.currentField,\n                });\n            }\n            return parsed;\n        }\n        catch (e) {\n            if (!isSimpleError(e) && !isSimpleErrors(e)) {\n                throw new SimpleError({\n                    code: 'invalid_field',\n                    message: `Expected a valid URL at ${data.currentField}`,\n                    field: data.currentField,\n                });\n            }\n            throw e;\n        }\n    }\n}\nURL.prototype.encode = function (context) {\n    return this.href;\n};\n//# sourceMappingURL=URLDecoder.js.map","// -------------------------------------------------------------\n//\n// WARNING: DO NOT EDIT THIS MANUALLY.\n// Use @field({decoder: any, ...NextVersion)} in your code.\n//\n// -------------------------------------------------------------\nexport const Version = 368;\n/**\n * Use this in development when making changes to fields.\n * On release, the version will get bumped and the usages of NextVersion will be replaced by that version.\n * Note: during developent all the saved fields with NextVersion will get cleared on the next release.\n */\nglobalThis.NextVersion = {\n    optional: true,\n    version: Version,\n    defaultValue() {\n        var _a;\n        return (_a = this.upgrade) !== null && _a !== void 0 ? _a : undefined;\n    },\n};\n//# sourceMappingURL=Version.js.map","/**\n * PermissionLevels are used to grant permissions to specific resources or system wide\n */\nexport var PermissionLevel;\n(function (PermissionLevel) {\n    /** No access */\n    PermissionLevel[\"None\"] = \"None\";\n    /** Read all data, but not allowed to write */\n    PermissionLevel[\"Read\"] = \"Read\";\n    /** Read, write, add, delete child data, but not allowed to modify settings */\n    PermissionLevel[\"Write\"] = \"Write\";\n    /** Full access */\n    PermissionLevel[\"Full\"] = \"Full\";\n})(PermissionLevel || (PermissionLevel = {}));\nexport function getPermissionLevelNumber(level) {\n    switch (level) {\n        case PermissionLevel.None: return 0;\n        case PermissionLevel.Read: return 1;\n        case PermissionLevel.Write: return 2;\n        case PermissionLevel.Full: return 3;\n        default: {\n            const l = level; // will throw compile error if new levels are added without editing this method\n            throw new Error('Unknown permission level ' + l);\n        }\n    }\n}\nexport function maximumPermissionlevel(...levels) {\n    let max = PermissionLevel.None;\n    for (const level of levels) {\n        if (getPermissionLevelNumber(level) > getPermissionLevelNumber(max)) {\n            max = level;\n        }\n    }\n    return max;\n}\nexport function minimumPermissionLevel(...levels) {\n    let min = levels[0];\n    for (const level of levels) {\n        if (getPermissionLevelNumber(level) < getPermissionLevelNumber(min)) {\n            min = level;\n        }\n    }\n    return min;\n}\nexport function getPermissionLevelName(level) {\n    switch (level) {\n        case PermissionLevel.None: return 'Geen basistoegang';\n        case PermissionLevel.Read: return 'Lezen';\n        case PermissionLevel.Write: return 'Bewerken';\n        case PermissionLevel.Full: return 'Volledige toegang';\n        default: {\n            const l = level; // will throw compile error if new levels are added without editing this method\n            throw new Error('Unknown permission level ' + l);\n        }\n    }\n}\n//# sourceMappingURL=PermissionLevel.js.map","import { PermissionLevel } from './PermissionLevel.js';\n/**\n * More granular access rights to specific things in the system\n */\nexport var AccessRight;\n(function (AccessRight) {\n    // Platform level permissions\n    /**\n     * Allows the user to log in as a full-access admin to a specific organization\n     */\n    AccessRight[\"PlatformLoginAs\"] = \"PlatformLoginAs\";\n    // Organization level permissions\n    AccessRight[\"OrganizationCreateWebshops\"] = \"OrganizationCreateWebshops\";\n    AccessRight[\"OrganizationManagePayments\"] = \"OrganizationManagePayments\";\n    AccessRight[\"OrganizationFinanceDirector\"] = \"OrganizationFinanceDirector\";\n    AccessRight[\"OrganizationCreateGroups\"] = \"OrganizationCreateGroups\";\n    AccessRight[\"EventWrite\"] = \"EventWrite\";\n    /** defines that this person can review event notification for this organization. You can limit which events by restricing the organizations the user has access to. */\n    AccessRight[\"OrganizationEventNotificationReviewer\"] = \"OrganizationEventNotificationReviewer\";\n    // Member data access rights\n    // Note: in order to read or write any data at all, a user first needs to have normal resource access to a group, category or organization\n    // So general data (name, birthday, gender, address, email, parents, emergency contacts) access can be controlled in that way (this doesn't have a separate access right).\n    AccessRight[\"MemberReadFinancialData\"] = \"MemberReadFinancialData\";\n    AccessRight[\"MemberWriteFinancialData\"] = \"MemberWriteFinancialData\";\n    /**\n     * Edit/view national registration number\n     */\n    AccessRight[\"MemberManageNRN\"] = \"MemberManageNRN\";\n    // Webshop level permissions\n    AccessRight[\"WebshopScanTickets\"] = \"WebshopScanTickets\";\n})(AccessRight || (AccessRight = {}));\nexport class AccessRightHelper {\n    static getName(right) {\n        switch (right) {\n            case AccessRight.PlatformLoginAs: return 'Inloggen als hoofdbeheerder';\n            case AccessRight.OrganizationFinanceDirector: return 'Toegang tot volledige boekhouding';\n            case AccessRight.OrganizationManagePayments: return 'Overschrijvingen beheren';\n            case AccessRight.OrganizationCreateWebshops: return 'Webshops maken';\n            case AccessRight.OrganizationCreateGroups: return 'Groepen maken';\n            case AccessRight.WebshopScanTickets: return 'Tickets scannen';\n            case AccessRight.EventWrite: return 'Activiteiten beheren';\n            case AccessRight.OrganizationEventNotificationReviewer: return 'Kampmeldingen goedkeuren';\n            // Member data\n            case AccessRight.MemberReadFinancialData: return 'Bekijk rekening leden';\n            case AccessRight.MemberWriteFinancialData: return 'Bewerk rekening leden';\n            case AccessRight.MemberManageNRN: return 'Rijksregisternummers';\n        }\n    }\n    static prohibitedOrganizationLevelAccessRights() {\n        return Object.values(AccessRight).filter(right => AccessRightHelper.autoGrantRightForLevel(right) === null);\n    }\n    static getNameShort(right) {\n        switch (right) {\n            case AccessRight.PlatformLoginAs: return 'Inloggen';\n            case AccessRight.OrganizationFinanceDirector: return 'Boekhouding';\n            case AccessRight.OrganizationManagePayments: return 'Overschrijvingen';\n            case AccessRight.OrganizationCreateWebshops: return 'Maken';\n            case AccessRight.OrganizationCreateGroups: return 'Maken';\n            case AccessRight.WebshopScanTickets: return 'Scannen';\n            case AccessRight.EventWrite: return 'Activiteiten';\n            case AccessRight.OrganizationEventNotificationReviewer: return 'Kampmeldingen';\n            // Member data\n            case AccessRight.MemberReadFinancialData: return 'Lidgeld bekijken';\n            case AccessRight.MemberWriteFinancialData: return 'Lidgeld bewerken';\n            case AccessRight.MemberManageNRN: return 'Rijksregisternummers';\n        }\n    }\n    static getDescription(right) {\n        switch (right) {\n            case AccessRight.PlatformLoginAs: return 'inloggen als hoofdbeheerder';\n            case AccessRight.OrganizationFinanceDirector: return 'volledige boekhouding';\n            case AccessRight.OrganizationManagePayments: return 'overschrijvingen';\n            case AccessRight.OrganizationCreateWebshops: return 'webshops maken';\n            case AccessRight.OrganizationCreateGroups: return 'groepen maken';\n            case AccessRight.WebshopScanTickets: return 'scannen van tickets';\n            case AccessRight.EventWrite: return 'activiteiten beheren';\n            case AccessRight.OrganizationEventNotificationReviewer: return 'kampmeldingen goedkeuren';\n            // Member data\n            case AccessRight.MemberReadFinancialData: return 'Openstaande bedragen bekijken';\n            case AccessRight.MemberWriteFinancialData: return 'Openstaande bedragen bewerken';\n            case AccessRight.MemberManageNRN: return 'Rijksregisternummers bekijken of bewerken van leden';\n        }\n    }\n    static getLongDescription(right) {\n        switch (right) {\n            case AccessRight.OrganizationFinanceDirector: return 'Beheerders met deze toegang krijgen toegang tot alle financiële gegevens van de organisatie, en kunnen overschrijvingen als betaald markeren.';\n            case AccessRight.OrganizationManagePayments: return 'Beheerders met deze toegang kunnen openstaande overschrijvingen bekijken en markeren als betaald.';\n            // Member data\n            case AccessRight.MemberReadFinancialData: return 'Bekijk hoeveel een lid precies heeft betaald of nog moet betalen, en bekijk of het lid recht heeft op een verlaagd tarief.';\n            case AccessRight.MemberWriteFinancialData: return 'Voeg openstaande bedragen toe of verwijder ze, en pas de betaalstatus van een lid aan.';\n            case AccessRight.EventWrite: return 'Maak nieuwe activiteiten aan, verwijder ze en wijzig ze.';\n            case AccessRight.MemberManageNRN: return 'Rijksregisternummers bekijken of bewerken van leden.';\n        }\n        return null;\n    }\n    /**\n     * If a user has a certain permission level, automatically grant the specific access right\n     * By default only full permissions gives all access rights, but you can tweak it:\n     * E.g., give webshop scan rights if you also have write access to that webshop\n     */\n    static autoGrantRightForLevel(right) {\n        switch (right) {\n            case AccessRight.WebshopScanTickets: return PermissionLevel.Write;\n            case AccessRight.OrganizationEventNotificationReviewer: return null; // Never granted to full-admins, unless given by the platform\n        }\n        return PermissionLevel.Full;\n    }\n    /**\n     * Automatically grant a user access rights if they have a certain right\n     */\n    static autoInheritFrom(right) {\n        switch (right) {\n            // Finance director also has manage payments permissions automatically\n            case AccessRight.OrganizationManagePayments: return [AccessRight.OrganizationFinanceDirector];\n            // Finance director also can view and edit member financial data\n            case AccessRight.MemberReadFinancialData: return [AccessRight.OrganizationFinanceDirector, AccessRight.MemberWriteFinancialData];\n            case AccessRight.MemberWriteFinancialData: return [AccessRight.OrganizationFinanceDirector];\n            // Event notification reviewers automatically have access to events\n            case AccessRight.EventWrite: return [AccessRight.OrganizationEventNotificationReviewer];\n        }\n        return [];\n    }\n}\n//# sourceMappingURL=AccessRight.js.map","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n  extendStatics = Object.setPrototypeOf ||\n      ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n      function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n  return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n  if (typeof b !== \"function\" && b !== null)\n      throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n  extendStatics(d, b);\n  function __() { this.constructor = d; }\n  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n  __assign = Object.assign || function __assign(t) {\n      for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n      }\n      return t;\n  }\n  return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n  var t = {};\n  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n      t[p] = s[p];\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n      for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n          if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n              t[p[i]] = s[p[i]];\n      }\n  return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n  if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n  return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n  return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n  function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n  var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n  var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n  var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n  var _, done = false;\n  for (var i = decorators.length - 1; i >= 0; i--) {\n      var context = {};\n      for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n      for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n      context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n      var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n      if (kind === \"accessor\") {\n          if (result === void 0) continue;\n          if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n          if (_ = accept(result.get)) descriptor.get = _;\n          if (_ = accept(result.set)) descriptor.set = _;\n          if (_ = accept(result.init)) initializers.unshift(_);\n      }\n      else if (_ = accept(result)) {\n          if (kind === \"field\") initializers.unshift(_);\n          else descriptor[key] = _;\n      }\n  }\n  if (target) Object.defineProperty(target, contextIn.name, descriptor);\n  done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n  var useValue = arguments.length > 2;\n  for (var i = 0; i < initializers.length; i++) {\n      value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n  }\n  return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n  return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n  if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n  return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n  if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n  return new (P || (P = Promise))(function (resolve, reject) {\n      function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n      function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n      function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n  });\n}\n\nexport function __generator(thisArg, body) {\n  var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n  return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n  function verb(n) { return function (v) { return step([n, v]); }; }\n  function step(op) {\n      if (f) throw new TypeError(\"Generator is already executing.\");\n      while (g && (g = 0, op[0] && (_ = 0)), _) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n              case 0: case 1: t = op; break;\n              case 4: _.label++; return { value: op[1], done: false };\n              case 5: _.label++; y = op[1]; op = [0]; continue;\n              case 7: op = _.ops.pop(); _.trys.pop(); continue;\n              default:\n                  if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n                  if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n                  if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n                  if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n                  if (t[2]) _.ops.pop();\n                  _.trys.pop(); continue;\n          }\n          op = body.call(thisArg, _);\n      } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n      if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n  }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  var desc = Object.getOwnPropertyDescriptor(m, k);\n  if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n  }\n  Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n  for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n  var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n  if (m) return m.call(o);\n  if (o && typeof o.length === \"number\") return {\n      next: function () {\n          if (o && i >= o.length) o = void 0;\n          return { value: o && o[i++], done: !o };\n      }\n  };\n  throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n  var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n  if (!m) return o;\n  var i = m.call(o), r, ar = [], e;\n  try {\n      while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n  }\n  catch (error) { e = { error: error }; }\n  finally {\n      try {\n          if (r && !r.done && (m = i[\"return\"])) m.call(i);\n      }\n      finally { if (e) throw e.error; }\n  }\n  return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n  for (var ar = [], i = 0; i < arguments.length; i++)\n      ar = ar.concat(__read(arguments[i]));\n  return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n  for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n  for (var r = Array(s), k = 0, i = 0; i < il; i++)\n      for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n          r[k] = a[j];\n  return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n      if (ar || !(i in from)) {\n          if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n          ar[i] = from[i];\n      }\n  }\n  return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n  return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var g = generator.apply(thisArg, _arguments || []), i, q = [];\n  return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n  function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n  function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n  function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n  function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n  function fulfill(value) { resume(\"next\", value); }\n  function reject(value) { resume(\"throw\", value); }\n  function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n  var i, p;\n  return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n  function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var m = o[Symbol.asyncIterator], i;\n  return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n  function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n  function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n  if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n  return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n  Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n  o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n  ownKeys = Object.getOwnPropertyNames || function (o) {\n    var ar = [];\n    for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n    return ar;\n  };\n  return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n  if (mod && mod.__esModule) return mod;\n  var result = {};\n  if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n  __setModuleDefault(result, mod);\n  return result;\n}\n\nexport function __importDefault(mod) {\n  return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n  return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n  if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n  return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n  if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n  return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n  if (value !== null && value !== void 0) {\n    if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n    var dispose, inner;\n    if (async) {\n      if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n      dispose = value[Symbol.asyncDispose];\n    }\n    if (dispose === void 0) {\n      if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n      dispose = value[Symbol.dispose];\n      if (async) inner = dispose;\n    }\n    if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n    if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n    env.stack.push({ value: value, dispose: dispose, async: async });\n  }\n  else if (async) {\n    env.stack.push({ async: true });\n  }\n  return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n  var e = new Error(message);\n  return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n  function fail(e) {\n    env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n    env.hasError = true;\n  }\n  var r, s = 0;\n  function next() {\n    while (r = env.stack.pop()) {\n      try {\n        if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n        if (r.dispose) {\n          var result = r.dispose.call(r.value);\n          if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n        }\n        else s |= 1;\n      }\n      catch (e) {\n        fail(e);\n      }\n    }\n    if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n    if (env.hasError) throw env.error;\n  }\n  return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n  if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n      return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n          return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n      });\n  }\n  return path;\n}\n\nexport default {\n  __extends,\n  __assign,\n  __rest,\n  __decorate,\n  __param,\n  __esDecorate,\n  __runInitializers,\n  __propKey,\n  __setFunctionName,\n  __metadata,\n  __awaiter,\n  __generator,\n  __createBinding,\n  __exportStar,\n  __values,\n  __read,\n  __spread,\n  __spreadArrays,\n  __spreadArray,\n  __await,\n  __asyncGenerator,\n  __asyncDelegator,\n  __asyncValues,\n  __makeTemplateObject,\n  __importStar,\n  __importDefault,\n  __classPrivateFieldGet,\n  __classPrivateFieldSet,\n  __classPrivateFieldIn,\n  __addDisposableResource,\n  __disposeResources,\n  __rewriteRelativeImportExtension,\n};\n","export class Colors {\n    static hexToHSL(hex) {\n        const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n        if (!result) {\n            if (STAMHOOFD.environment === 'development') {\n                console.error(`Invalid hex color: ${hex}`);\n            }\n            return {\n                h: 0,\n                s: 0,\n                l: 0,\n            };\n        }\n        let r = parseInt(result[1], 16);\n        let g = parseInt(result[2], 16);\n        let b = parseInt(result[3], 16);\n        r /= 255;\n        g /= 255;\n        b /= 255;\n        const max = Math.max(r, g, b), min = Math.min(r, g, b);\n        let h, s, l = (max + min) / 2;\n        if (max === min) {\n            h = s = 0; // achromatic\n        }\n        else {\n            const d = max - min;\n            s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n            switch (max) {\n                case r:\n                    h = (g - b) / d + (g < b ? 6 : 0);\n                    break;\n                case g:\n                    h = (b - r) / d + 2;\n                    break;\n                case b:\n                    h = (r - g) / d + 4;\n                    break;\n            }\n            h /= 6;\n        }\n        return {\n            h: h * 360,\n            s: s * 100,\n            l: l * 100,\n        };\n    }\n    /**\n     *\n     * @param h degree\n     * @param s percentage\n     * @param l percentage\n     */\n    static HSLToRGB(h, s, l) {\n        // Must be fractions of 1\n        s /= 100;\n        l /= 100;\n        const c = (1 - Math.abs(2 * l - 1)) * s, x = c * (1 - Math.abs((h / 60) % 2 - 1)), m = l - c / 2;\n        let r = 0, g = 0, b = 0;\n        if (0 <= h && h < 60) {\n            r = c;\n            g = x;\n            b = 0;\n        }\n        else if (60 <= h && h < 120) {\n            r = x;\n            g = c;\n            b = 0;\n        }\n        else if (120 <= h && h < 180) {\n            r = 0;\n            g = c;\n            b = x;\n        }\n        else if (180 <= h && h < 240) {\n            r = 0;\n            g = x;\n            b = c;\n        }\n        else if (240 <= h && h < 300) {\n            r = x;\n            g = 0;\n            b = c;\n        }\n        else if (300 <= h && h < 360) {\n            r = c;\n            g = 0;\n            b = x;\n        }\n        r = Math.round((r + m) * 255);\n        g = Math.round((g + m) * 255);\n        b = Math.round((b + m) * 255);\n        return {\n            r, g, b,\n        };\n    }\n    static hslToHex(color) {\n        let { h, s, l } = color;\n        l /= 100;\n        const a = s * Math.min(l, 1 - l) / 100;\n        const f = (n) => {\n            const k = (n + h / 30) % 12;\n            const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n            return Math.round(255 * color).toString(16).padStart(2, '0'); // convert to Hex and prefix \"0\" if needed\n        };\n        return `#${f(0)}${f(8)}${f(4)}`;\n    }\n    static hexToRGB(hex) {\n        if (hex.startsWith('#')) {\n            hex = hex.substring(1);\n        }\n        if (hex.length !== 6) {\n            throw new Error('Only six-digit hex colors are allowed.');\n        }\n        const aRgbHex = hex.match(/.{1,2}/g);\n        if (!aRgbHex || aRgbHex.length !== 3) {\n            throw new Error('Invalid hex color');\n        }\n        return {\n            r: parseInt(aRgbHex[0], 16),\n            g: parseInt(aRgbHex[1], 16),\n            b: parseInt(aRgbHex[2], 16),\n        };\n    }\n    static getContrastRatio(foreground, background) {\n        const L1 = this.getRelativeLuminance(background);\n        const L2 = this.getRelativeLuminance(foreground);\n        // https://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef\n        return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05);\n    }\n    static getRelativeLuminance(c) {\n        const color = {\n            r: c.r / 255,\n            g: c.g / 255,\n            b: c.b / 255,\n        };\n        // https://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n        const R = color.r <= 0.03928\n            ? color.r / 12.92\n            : Math.pow((color.r + 0.055) / 1.055, 2.4);\n        const G = color.g <= 0.03928\n            ? color.g / 12.92\n            : Math.pow((color.g + 0.055) / 1.055, 2.4);\n        const B = color.b <= 0.03928\n            ? color.b / 12.92\n            : Math.pow((color.b + 0.055) / 1.055, 2.4);\n        const L = 0.2126 * R + 0.7152 * G + 0.0722 * B;\n        return L;\n    }\n    static anyColorToRGB(color) {\n        if (typeof color === 'string') {\n            return this.hexToRGB(color);\n        }\n        if ('r' in color) {\n            return color;\n        }\n        return this.HSLToRGB(color.h, color.s, color.l);\n    }\n    static getContrastColor(color) {\n        try {\n            const rgb = this.anyColorToRGB(color);\n            const blackContrast = this.getAPCAContrast(rgb, { r: 0, g: 0, b: 0 });\n            const whiteContrast = this.getAPCAContrast(rgb, { r: 255, g: 255, b: 255 });\n            return blackContrast > whiteContrast ? '#000' : '#fff';\n        }\n        catch (e) {\n            console.error(e);\n            return '#fff';\n        }\n    }\n    // https://github.com/Myndex/SAPC-APCA#the-plain-english-steps-are\n    // Example:\n    // const contrast = getAPCAContrast(\"rgb(255, 255, 255)\", \"rgb(136, 136, 136)\");\n    // This returns `66.89346308821438` (66.893%)\n    // SAPC-APCA README says:\n    // > #888 vs #fff •  66.89346308821438\n    // 80% means 7:1 in WCAG 2.0\n    // 60% means 4.5:1 in WCAG 2.0\n    // Web UI: https://hail2u.net/pub/test/702.html\n    static linearize(val) {\n        return (val / 255.0) ** 2.4;\n    }\n    static clampLuminance(luminance) {\n        const blkThrs = 0.022;\n        const blkClmp = 1.414;\n        if (luminance > blkThrs) {\n            return luminance;\n        }\n        return Math.abs(blkThrs - luminance) ** blkClmp + luminance;\n    }\n    static getLuminance(color) {\n        const y = 0.2126729 * this.linearize(color.r)\n            + 0.7151522 * this.linearize(color.g)\n            + 0.072175 * this.linearize(color.b);\n        return this.clampLuminance(y);\n    }\n    static getContrast(background, foreground) {\n        const deltaYmin = 0.0005;\n        const scale = 1.14;\n        const backgroundLuminance = this.getLuminance(background);\n        const foregroundLuminance = this.getLuminance(foreground);\n        if (Math.abs(backgroundLuminance - foregroundLuminance) < deltaYmin) {\n            return 0.0;\n        }\n        if (backgroundLuminance > foregroundLuminance) {\n            return (backgroundLuminance ** 0.56 - foregroundLuminance ** 0.57) * scale;\n        }\n        if (backgroundLuminance < foregroundLuminance) {\n            return (backgroundLuminance ** 0.65 - foregroundLuminance ** 0.62) * scale;\n        }\n        return 0.0;\n    }\n    static scaleContrast(contrast) {\n        const loClip = 0.001;\n        const loConThresh = 0.035991;\n        const loConFactor = 27.7847239587675;\n        const loConOffset = 0.027;\n        const absContrast = Math.abs(contrast);\n        if (absContrast < loClip) {\n            return 0.0;\n        }\n        if (absContrast <= loConThresh) {\n            return contrast - contrast * loConFactor * loConOffset;\n        }\n        if (contrast > loConThresh) {\n            return contrast - loConOffset;\n        }\n        if (contrast < -loConThresh) {\n            return contrast + loConOffset;\n        }\n        return 0.0;\n    }\n    static getAPCAContrast(background, foreground) {\n        const contrast = this.getContrast(background, foreground);\n        const scaledContrast = this.scaleContrast(contrast);\n        return Math.abs(scaledContrast * 100);\n    }\n}\n//# sourceMappingURL=Colors.js.map","// these aren't really private, but nor are they really useful to document\n\n/**\n * @private\n */\nclass LuxonError extends Error {}\n\n/**\n * @private\n */\nexport class InvalidDateTimeError extends LuxonError {\n  constructor(reason) {\n    super(`Invalid DateTime: ${reason.toMessage()}`);\n  }\n}\n\n/**\n * @private\n */\nexport class InvalidIntervalError extends LuxonError {\n  constructor(reason) {\n    super(`Invalid Interval: ${reason.toMessage()}`);\n  }\n}\n\n/**\n * @private\n */\nexport class InvalidDurationError extends LuxonError {\n  constructor(reason) {\n    super(`Invalid Duration: ${reason.toMessage()}`);\n  }\n}\n\n/**\n * @private\n */\nexport class ConflictingSpecificationError extends LuxonError {}\n\n/**\n * @private\n */\nexport class InvalidUnitError extends LuxonError {\n  constructor(unit) {\n    super(`Invalid unit ${unit}`);\n  }\n}\n\n/**\n * @private\n */\nexport class InvalidArgumentError extends LuxonError {}\n\n/**\n * @private\n */\nexport class ZoneIsAbstractError extends LuxonError {\n  constructor() {\n    super(\"Zone is an abstract class\");\n  }\n}\n","/**\n * @private\n */\n\nconst n = \"numeric\",\n  s = \"short\",\n  l = \"long\";\n\nexport const DATE_SHORT = {\n  year: n,\n  month: n,\n  day: n,\n};\n\nexport const DATE_MED = {\n  year: n,\n  month: s,\n  day: n,\n};\n\nexport const DATE_MED_WITH_WEEKDAY = {\n  year: n,\n  month: s,\n  day: n,\n  weekday: s,\n};\n\nexport const DATE_FULL = {\n  year: n,\n  month: l,\n  day: n,\n};\n\nexport const DATE_HUGE = {\n  year: n,\n  month: l,\n  day: n,\n  weekday: l,\n};\n\nexport const TIME_SIMPLE = {\n  hour: n,\n  minute: n,\n};\n\nexport const TIME_WITH_SECONDS = {\n  hour: n,\n  minute: n,\n  second: n,\n};\n\nexport const TIME_WITH_SHORT_OFFSET = {\n  hour: n,\n  minute: n,\n  second: n,\n  timeZoneName: s,\n};\n\nexport const TIME_WITH_LONG_OFFSET = {\n  hour: n,\n  minute: n,\n  second: n,\n  timeZoneName: l,\n};\n\nexport const TIME_24_SIMPLE = {\n  hour: n,\n  minute: n,\n  hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SECONDS = {\n  hour: n,\n  minute: n,\n  second: n,\n  hourCycle: \"h23\",\n};\n\nexport const TIME_24_WITH_SHORT_OFFSET = {\n  hour: n,\n  minute: n,\n  second: n,\n  hourCycle: \"h23\",\n  timeZoneName: s,\n};\n\nexport const TIME_24_WITH_LONG_OFFSET = {\n  hour: n,\n  minute: n,\n  second: n,\n  hourCycle: \"h23\",\n  timeZoneName: l,\n};\n\nexport const DATETIME_SHORT = {\n  year: n,\n  month: n,\n  day: n,\n  hour: n,\n  minute: n,\n};\n\nexport const DATETIME_SHORT_WITH_SECONDS = {\n  year: n,\n  month: n,\n  day: n,\n  hour: n,\n  minute: n,\n  second: n,\n};\n\nexport const DATETIME_MED = {\n  year: n,\n  month: s,\n  day: n,\n  hour: n,\n  minute: n,\n};\n\nexport const DATETIME_MED_WITH_SECONDS = {\n  year: n,\n  month: s,\n  day: n,\n  hour: n,\n  minute: n,\n  second: n,\n};\n\nexport const DATETIME_MED_WITH_WEEKDAY = {\n  year: n,\n  month: s,\n  day: n,\n  weekday: s,\n  hour: n,\n  minute: n,\n};\n\nexport const DATETIME_FULL = {\n  year: n,\n  month: l,\n  day: n,\n  hour: n,\n  minute: n,\n  timeZoneName: s,\n};\n\nexport const DATETIME_FULL_WITH_SECONDS = {\n  year: n,\n  month: l,\n  day: n,\n  hour: n,\n  minute: n,\n  second: n,\n  timeZoneName: s,\n};\n\nexport const DATETIME_HUGE = {\n  year: n,\n  month: l,\n  day: n,\n  weekday: l,\n  hour: n,\n  minute: n,\n  timeZoneName: l,\n};\n\nexport const DATETIME_HUGE_WITH_SECONDS = {\n  year: n,\n  month: l,\n  day: n,\n  weekday: l,\n  hour: n,\n  minute: n,\n  second: n,\n  timeZoneName: l,\n};\n","import { ZoneIsAbstractError } from \"./errors.js\";\n\n/**\n * @interface\n */\nexport default class Zone {\n  /**\n   * The type of zone\n   * @abstract\n   * @type {string}\n   */\n  get type() {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * The name of this zone.\n   * @abstract\n   * @type {string}\n   */\n  get name() {\n    throw new ZoneIsAbstractError();\n  }\n\n  get ianaName() {\n    return this.name;\n  }\n\n  /**\n   * Returns whether the offset is known to be fixed for the whole year.\n   * @abstract\n   * @type {boolean}\n   */\n  get isUniversal() {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Returns the offset's common name (such as EST) at the specified timestamp\n   * @abstract\n   * @param {number} ts - Epoch milliseconds for which to get the name\n   * @param {Object} opts - Options to affect the format\n   * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n   * @param {string} opts.locale - What locale to return the offset name in.\n   * @return {string}\n   */\n  offsetName(ts, opts) {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Returns the offset's value as a string\n   * @abstract\n   * @param {number} ts - Epoch milliseconds for which to get the offset\n   * @param {string} format - What style of offset to return.\n   *                          Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n   * @return {string}\n   */\n  formatOffset(ts, format) {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Return the offset in minutes for this zone at the specified timestamp.\n   * @abstract\n   * @param {number} ts - Epoch milliseconds for which to compute the offset\n   * @return {number}\n   */\n  offset(ts) {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Return whether this Zone is equal to another zone\n   * @abstract\n   * @param {Zone} otherZone - the zone to compare\n   * @return {boolean}\n   */\n  equals(otherZone) {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Return whether this Zone is valid.\n   * @abstract\n   * @type {boolean}\n   */\n  get isValid() {\n    throw new ZoneIsAbstractError();\n  }\n}\n","import { formatOffset, parseZoneInfo } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * Represents the local zone for this JavaScript environment.\n * @implements {Zone}\n */\nexport default class SystemZone extends Zone {\n  /**\n   * Get a singleton instance of the local zone\n   * @return {SystemZone}\n   */\n  static get instance() {\n    if (singleton === null) {\n      singleton = new SystemZone();\n    }\n    return singleton;\n  }\n\n  /** @override **/\n  get type() {\n    return \"system\";\n  }\n\n  /** @override **/\n  get name() {\n    return new Intl.DateTimeFormat().resolvedOptions().timeZone;\n  }\n\n  /** @override **/\n  get isUniversal() {\n    return false;\n  }\n\n  /** @override **/\n  offsetName(ts, { format, locale }) {\n    return parseZoneInfo(ts, format, locale);\n  }\n\n  /** @override **/\n  formatOffset(ts, format) {\n    return formatOffset(this.offset(ts), format);\n  }\n\n  /** @override **/\n  offset(ts) {\n    return -new Date(ts).getTimezoneOffset();\n  }\n\n  /** @override **/\n  equals(otherZone) {\n    return otherZone.type === \"system\";\n  }\n\n  /** @override **/\n  get isValid() {\n    return true;\n  }\n}\n","import { formatOffset, parseZoneInfo, isUndefined, objToLocalTS } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet dtfCache = {};\nfunction makeDTF(zone) {\n  if (!dtfCache[zone]) {\n    dtfCache[zone] = new Intl.DateTimeFormat(\"en-US\", {\n      hour12: false,\n      timeZone: zone,\n      year: \"numeric\",\n      month: \"2-digit\",\n      day: \"2-digit\",\n      hour: \"2-digit\",\n      minute: \"2-digit\",\n      second: \"2-digit\",\n      era: \"short\",\n    });\n  }\n  return dtfCache[zone];\n}\n\nconst typeToPos = {\n  year: 0,\n  month: 1,\n  day: 2,\n  era: 3,\n  hour: 4,\n  minute: 5,\n  second: 6,\n};\n\nfunction hackyOffset(dtf, date) {\n  const formatted = dtf.format(date).replace(/\\u200E/g, \"\"),\n    parsed = /(\\d+)\\/(\\d+)\\/(\\d+) (AD|BC),? (\\d+):(\\d+):(\\d+)/.exec(formatted),\n    [, fMonth, fDay, fYear, fadOrBc, fHour, fMinute, fSecond] = parsed;\n  return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond];\n}\n\nfunction partsOffset(dtf, date) {\n  const formatted = dtf.formatToParts(date);\n  const filled = [];\n  for (let i = 0; i < formatted.length; i++) {\n    const { type, value } = formatted[i];\n    const pos = typeToPos[type];\n\n    if (type === \"era\") {\n      filled[pos] = value;\n    } else if (!isUndefined(pos)) {\n      filled[pos] = parseInt(value, 10);\n    }\n  }\n  return filled;\n}\n\nlet ianaZoneCache = {};\n/**\n * A zone identified by an IANA identifier, like America/New_York\n * @implements {Zone}\n */\nexport default class IANAZone extends Zone {\n  /**\n   * @param {string} name - Zone name\n   * @return {IANAZone}\n   */\n  static create(name) {\n    if (!ianaZoneCache[name]) {\n      ianaZoneCache[name] = new IANAZone(name);\n    }\n    return ianaZoneCache[name];\n  }\n\n  /**\n   * Reset local caches. Should only be necessary in testing scenarios.\n   * @return {void}\n   */\n  static resetCache() {\n    ianaZoneCache = {};\n    dtfCache = {};\n  }\n\n  /**\n   * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that.\n   * @param {string} s - The string to check validity on\n   * @example IANAZone.isValidSpecifier(\"America/New_York\") //=> true\n   * @example IANAZone.isValidSpecifier(\"Sport~~blorp\") //=> false\n   * @deprecated This method returns false for some valid IANA names. Use isValidZone instead.\n   * @return {boolean}\n   */\n  static isValidSpecifier(s) {\n    return this.isValidZone(s);\n  }\n\n  /**\n   * Returns whether the provided string identifies a real zone\n   * @param {string} zone - The string to check\n   * @example IANAZone.isValidZone(\"America/New_York\") //=> true\n   * @example IANAZone.isValidZone(\"Fantasia/Castle\") //=> false\n   * @example IANAZone.isValidZone(\"Sport~~blorp\") //=> false\n   * @return {boolean}\n   */\n  static isValidZone(zone) {\n    if (!zone) {\n      return false;\n    }\n    try {\n      new Intl.DateTimeFormat(\"en-US\", { timeZone: zone }).format();\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  constructor(name) {\n    super();\n    /** @private **/\n    this.zoneName = name;\n    /** @private **/\n    this.valid = IANAZone.isValidZone(name);\n  }\n\n  /** @override **/\n  get type() {\n    return \"iana\";\n  }\n\n  /** @override **/\n  get name() {\n    return this.zoneName;\n  }\n\n  /** @override **/\n  get isUniversal() {\n    return false;\n  }\n\n  /** @override **/\n  offsetName(ts, { format, locale }) {\n    return parseZoneInfo(ts, format, locale, this.name);\n  }\n\n  /** @override **/\n  formatOffset(ts, format) {\n    return formatOffset(this.offset(ts), format);\n  }\n\n  /** @override **/\n  offset(ts) {\n    const date = new Date(ts);\n\n    if (isNaN(date)) return NaN;\n\n    const dtf = makeDTF(this.name);\n    let [year, month, day, adOrBc, hour, minute, second] = dtf.formatToParts\n      ? partsOffset(dtf, date)\n      : hackyOffset(dtf, date);\n\n    if (adOrBc === \"BC\") {\n      year = -Math.abs(year) + 1;\n    }\n\n    // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat\n    const adjustedHour = hour === 24 ? 0 : hour;\n\n    const asUTC = objToLocalTS({\n      year,\n      month,\n      day,\n      hour: adjustedHour,\n      minute,\n      second,\n      millisecond: 0,\n    });\n\n    let asTS = +date;\n    const over = asTS % 1000;\n    asTS -= over >= 0 ? over : 1000 + over;\n    return (asUTC - asTS) / (60 * 1000);\n  }\n\n  /** @override **/\n  equals(otherZone) {\n    return otherZone.type === \"iana\" && otherZone.name === this.name;\n  }\n\n  /** @override **/\n  get isValid() {\n    return this.valid;\n  }\n}\n","import { hasLocaleWeekInfo, hasRelative, padStart, roundTo, validateWeekSettings } from \"./util.js\";\nimport * as English from \"./english.js\";\nimport Settings from \"../settings.js\";\nimport DateTime from \"../datetime.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n// todo - remap caching\n\nlet intlLFCache = {};\nfunction getCachedLF(locString, opts = {}) {\n  const key = JSON.stringify([locString, opts]);\n  let dtf = intlLFCache[key];\n  if (!dtf) {\n    dtf = new Intl.ListFormat(locString, opts);\n    intlLFCache[key] = dtf;\n  }\n  return dtf;\n}\n\nlet intlDTCache = {};\nfunction getCachedDTF(locString, opts = {}) {\n  const key = JSON.stringify([locString, opts]);\n  let dtf = intlDTCache[key];\n  if (!dtf) {\n    dtf = new Intl.DateTimeFormat(locString, opts);\n    intlDTCache[key] = dtf;\n  }\n  return dtf;\n}\n\nlet intlNumCache = {};\nfunction getCachedINF(locString, opts = {}) {\n  const key = JSON.stringify([locString, opts]);\n  let inf = intlNumCache[key];\n  if (!inf) {\n    inf = new Intl.NumberFormat(locString, opts);\n    intlNumCache[key] = inf;\n  }\n  return inf;\n}\n\nlet intlRelCache = {};\nfunction getCachedRTF(locString, opts = {}) {\n  const { base, ...cacheKeyOpts } = opts; // exclude `base` from the options\n  const key = JSON.stringify([locString, cacheKeyOpts]);\n  let inf = intlRelCache[key];\n  if (!inf) {\n    inf = new Intl.RelativeTimeFormat(locString, opts);\n    intlRelCache[key] = inf;\n  }\n  return inf;\n}\n\nlet sysLocaleCache = null;\nfunction systemLocale() {\n  if (sysLocaleCache) {\n    return sysLocaleCache;\n  } else {\n    sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale;\n    return sysLocaleCache;\n  }\n}\n\nlet weekInfoCache = {};\nfunction getCachedWeekInfo(locString) {\n  let data = weekInfoCache[locString];\n  if (!data) {\n    const locale = new Intl.Locale(locString);\n    // browsers currently implement this as a property, but spec says it should be a getter function\n    data = \"getWeekInfo\" in locale ? locale.getWeekInfo() : locale.weekInfo;\n    weekInfoCache[locString] = data;\n  }\n  return data;\n}\n\nfunction parseLocaleString(localeStr) {\n  // I really want to avoid writing a BCP 47 parser\n  // see, e.g. https://github.com/wooorm/bcp-47\n  // Instead, we'll do this:\n\n  // a) if the string has no -u extensions, just leave it alone\n  // b) if it does, use Intl to resolve everything\n  // c) if Intl fails, try again without the -u\n\n  // private subtags and unicode subtags have ordering requirements,\n  // and we're not properly parsing this, so just strip out the\n  // private ones if they exist.\n  const xIndex = localeStr.indexOf(\"-x-\");\n  if (xIndex !== -1) {\n    localeStr = localeStr.substring(0, xIndex);\n  }\n\n  const uIndex = localeStr.indexOf(\"-u-\");\n  if (uIndex === -1) {\n    return [localeStr];\n  } else {\n    let options;\n    let selectedStr;\n    try {\n      options = getCachedDTF(localeStr).resolvedOptions();\n      selectedStr = localeStr;\n    } catch (e) {\n      const smaller = localeStr.substring(0, uIndex);\n      options = getCachedDTF(smaller).resolvedOptions();\n      selectedStr = smaller;\n    }\n\n    const { numberingSystem, calendar } = options;\n    return [selectedStr, numberingSystem, calendar];\n  }\n}\n\nfunction intlConfigString(localeStr, numberingSystem, outputCalendar) {\n  if (outputCalendar || numberingSystem) {\n    if (!localeStr.includes(\"-u-\")) {\n      localeStr += \"-u\";\n    }\n\n    if (outputCalendar) {\n      localeStr += `-ca-${outputCalendar}`;\n    }\n\n    if (numberingSystem) {\n      localeStr += `-nu-${numberingSystem}`;\n    }\n    return localeStr;\n  } else {\n    return localeStr;\n  }\n}\n\nfunction mapMonths(f) {\n  const ms = [];\n  for (let i = 1; i <= 12; i++) {\n    const dt = DateTime.utc(2009, i, 1);\n    ms.push(f(dt));\n  }\n  return ms;\n}\n\nfunction mapWeekdays(f) {\n  const ms = [];\n  for (let i = 1; i <= 7; i++) {\n    const dt = DateTime.utc(2016, 11, 13 + i);\n    ms.push(f(dt));\n  }\n  return ms;\n}\n\nfunction listStuff(loc, length, englishFn, intlFn) {\n  const mode = loc.listingMode();\n\n  if (mode === \"error\") {\n    return null;\n  } else if (mode === \"en\") {\n    return englishFn(length);\n  } else {\n    return intlFn(length);\n  }\n}\n\nfunction supportsFastNumbers(loc) {\n  if (loc.numberingSystem && loc.numberingSystem !== \"latn\") {\n    return false;\n  } else {\n    return (\n      loc.numberingSystem === \"latn\" ||\n      !loc.locale ||\n      loc.locale.startsWith(\"en\") ||\n      new Intl.DateTimeFormat(loc.intl).resolvedOptions().numberingSystem === \"latn\"\n    );\n  }\n}\n\n/**\n * @private\n */\n\nclass PolyNumberFormatter {\n  constructor(intl, forceSimple, opts) {\n    this.padTo = opts.padTo || 0;\n    this.floor = opts.floor || false;\n\n    const { padTo, floor, ...otherOpts } = opts;\n\n    if (!forceSimple || Object.keys(otherOpts).length > 0) {\n      const intlOpts = { useGrouping: false, ...opts };\n      if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo;\n      this.inf = getCachedINF(intl, intlOpts);\n    }\n  }\n\n  format(i) {\n    if (this.inf) {\n      const fixed = this.floor ? Math.floor(i) : i;\n      return this.inf.format(fixed);\n    } else {\n      // to match the browser's numberformatter defaults\n      const fixed = this.floor ? Math.floor(i) : roundTo(i, 3);\n      return padStart(fixed, this.padTo);\n    }\n  }\n}\n\n/**\n * @private\n */\n\nclass PolyDateFormatter {\n  constructor(dt, intl, opts) {\n    this.opts = opts;\n    this.originalZone = undefined;\n\n    let z = undefined;\n    if (this.opts.timeZone) {\n      // Don't apply any workarounds if a timeZone is explicitly provided in opts\n      this.dt = dt;\n    } else if (dt.zone.type === \"fixed\") {\n      // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like.\n      // That is why fixed-offset TZ is set to that unless it is:\n      // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT.\n      // 2. Unsupported by the browser:\n      //    - some do not support Etc/\n      //    - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata\n      const gmtOffset = -1 * (dt.offset / 60);\n      const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`;\n      if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) {\n        z = offsetZ;\n        this.dt = dt;\n      } else {\n        // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so\n        // we manually apply the offset and substitute the zone as needed.\n        z = \"UTC\";\n        this.dt = dt.offset === 0 ? dt : dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n        this.originalZone = dt.zone;\n      }\n    } else if (dt.zone.type === \"system\") {\n      this.dt = dt;\n    } else if (dt.zone.type === \"iana\") {\n      this.dt = dt;\n      z = dt.zone.name;\n    } else {\n      // Custom zones can have any offset / offsetName so we just manually\n      // apply the offset and substitute the zone as needed.\n      z = \"UTC\";\n      this.dt = dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n      this.originalZone = dt.zone;\n    }\n\n    const intlOpts = { ...this.opts };\n    intlOpts.timeZone = intlOpts.timeZone || z;\n    this.dtf = getCachedDTF(intl, intlOpts);\n  }\n\n  format() {\n    if (this.originalZone) {\n      // If we have to substitute in the actual zone name, we have to use\n      // formatToParts so that the timezone can be replaced.\n      return this.formatToParts()\n        .map(({ value }) => value)\n        .join(\"\");\n    }\n    return this.dtf.format(this.dt.toJSDate());\n  }\n\n  formatToParts() {\n    const parts = this.dtf.formatToParts(this.dt.toJSDate());\n    if (this.originalZone) {\n      return parts.map((part) => {\n        if (part.type === \"timeZoneName\") {\n          const offsetName = this.originalZone.offsetName(this.dt.ts, {\n            locale: this.dt.locale,\n            format: this.opts.timeZoneName,\n          });\n          return {\n            ...part,\n            value: offsetName,\n          };\n        } else {\n          return part;\n        }\n      });\n    }\n    return parts;\n  }\n\n  resolvedOptions() {\n    return this.dtf.resolvedOptions();\n  }\n}\n\n/**\n * @private\n */\nclass PolyRelFormatter {\n  constructor(intl, isEnglish, opts) {\n    this.opts = { style: \"long\", ...opts };\n    if (!isEnglish && hasRelative()) {\n      this.rtf = getCachedRTF(intl, opts);\n    }\n  }\n\n  format(count, unit) {\n    if (this.rtf) {\n      return this.rtf.format(count, unit);\n    } else {\n      return English.formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== \"long\");\n    }\n  }\n\n  formatToParts(count, unit) {\n    if (this.rtf) {\n      return this.rtf.formatToParts(count, unit);\n    } else {\n      return [];\n    }\n  }\n}\n\nconst fallbackWeekSettings = {\n  firstDay: 1,\n  minimalDays: 4,\n  weekend: [6, 7],\n};\n\n/**\n * @private\n */\n\nexport default class Locale {\n  static fromOpts(opts) {\n    return Locale.create(\n      opts.locale,\n      opts.numberingSystem,\n      opts.outputCalendar,\n      opts.weekSettings,\n      opts.defaultToEN\n    );\n  }\n\n  static create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN = false) {\n    const specifiedLocale = locale || Settings.defaultLocale;\n    // the system locale is useful for human readable strings but annoying for parsing/formatting known formats\n    const localeR = specifiedLocale || (defaultToEN ? \"en-US\" : systemLocale());\n    const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem;\n    const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar;\n    const weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings;\n    return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale);\n  }\n\n  static resetCache() {\n    sysLocaleCache = null;\n    intlDTCache = {};\n    intlNumCache = {};\n    intlRelCache = {};\n  }\n\n  static fromObject({ locale, numberingSystem, outputCalendar, weekSettings } = {}) {\n    return Locale.create(locale, numberingSystem, outputCalendar, weekSettings);\n  }\n\n  constructor(locale, numbering, outputCalendar, weekSettings, specifiedLocale) {\n    const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale);\n\n    this.locale = parsedLocale;\n    this.numberingSystem = numbering || parsedNumberingSystem || null;\n    this.outputCalendar = outputCalendar || parsedOutputCalendar || null;\n    this.weekSettings = weekSettings;\n    this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar);\n\n    this.weekdaysCache = { format: {}, standalone: {} };\n    this.monthsCache = { format: {}, standalone: {} };\n    this.meridiemCache = null;\n    this.eraCache = {};\n\n    this.specifiedLocale = specifiedLocale;\n    this.fastNumbersCached = null;\n  }\n\n  get fastNumbers() {\n    if (this.fastNumbersCached == null) {\n      this.fastNumbersCached = supportsFastNumbers(this);\n    }\n\n    return this.fastNumbersCached;\n  }\n\n  listingMode() {\n    const isActuallyEn = this.isEnglish();\n    const hasNoWeirdness =\n      (this.numberingSystem === null || this.numberingSystem === \"latn\") &&\n      (this.outputCalendar === null || this.outputCalendar === \"gregory\");\n    return isActuallyEn && hasNoWeirdness ? \"en\" : \"intl\";\n  }\n\n  clone(alts) {\n    if (!alts || Object.getOwnPropertyNames(alts).length === 0) {\n      return this;\n    } else {\n      return Locale.create(\n        alts.locale || this.specifiedLocale,\n        alts.numberingSystem || this.numberingSystem,\n        alts.outputCalendar || this.outputCalendar,\n        validateWeekSettings(alts.weekSettings) || this.weekSettings,\n        alts.defaultToEN || false\n      );\n    }\n  }\n\n  redefaultToEN(alts = {}) {\n    return this.clone({ ...alts, defaultToEN: true });\n  }\n\n  redefaultToSystem(alts = {}) {\n    return this.clone({ ...alts, defaultToEN: false });\n  }\n\n  months(length, format = false) {\n    return listStuff(this, length, English.months, () => {\n      const intl = format ? { month: length, day: \"numeric\" } : { month: length },\n        formatStr = format ? \"format\" : \"standalone\";\n      if (!this.monthsCache[formatStr][length]) {\n        this.monthsCache[formatStr][length] = mapMonths((dt) => this.extract(dt, intl, \"month\"));\n      }\n      return this.monthsCache[formatStr][length];\n    });\n  }\n\n  weekdays(length, format = false) {\n    return listStuff(this, length, English.weekdays, () => {\n      const intl = format\n          ? { weekday: length, year: \"numeric\", month: \"long\", day: \"numeric\" }\n          : { weekday: length },\n        formatStr = format ? \"format\" : \"standalone\";\n      if (!this.weekdaysCache[formatStr][length]) {\n        this.weekdaysCache[formatStr][length] = mapWeekdays((dt) =>\n          this.extract(dt, intl, \"weekday\")\n        );\n      }\n      return this.weekdaysCache[formatStr][length];\n    });\n  }\n\n  meridiems() {\n    return listStuff(\n      this,\n      undefined,\n      () => English.meridiems,\n      () => {\n        // In theory there could be aribitrary day periods. We're gonna assume there are exactly two\n        // for AM and PM. This is probably wrong, but it's makes parsing way easier.\n        if (!this.meridiemCache) {\n          const intl = { hour: \"numeric\", hourCycle: \"h12\" };\n          this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(\n            (dt) => this.extract(dt, intl, \"dayperiod\")\n          );\n        }\n\n        return this.meridiemCache;\n      }\n    );\n  }\n\n  eras(length) {\n    return listStuff(this, length, English.eras, () => {\n      const intl = { era: length };\n\n      // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates\n      // to definitely enumerate them.\n      if (!this.eraCache[length]) {\n        this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map((dt) =>\n          this.extract(dt, intl, \"era\")\n        );\n      }\n\n      return this.eraCache[length];\n    });\n  }\n\n  extract(dt, intlOpts, field) {\n    const df = this.dtFormatter(dt, intlOpts),\n      results = df.formatToParts(),\n      matching = results.find((m) => m.type.toLowerCase() === field);\n    return matching ? matching.value : null;\n  }\n\n  numberFormatter(opts = {}) {\n    // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave)\n    // (in contrast, the rest of the condition is used heavily)\n    return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts);\n  }\n\n  dtFormatter(dt, intlOpts = {}) {\n    return new PolyDateFormatter(dt, this.intl, intlOpts);\n  }\n\n  relFormatter(opts = {}) {\n    return new PolyRelFormatter(this.intl, this.isEnglish(), opts);\n  }\n\n  listFormatter(opts = {}) {\n    return getCachedLF(this.intl, opts);\n  }\n\n  isEnglish() {\n    return (\n      this.locale === \"en\" ||\n      this.locale.toLowerCase() === \"en-us\" ||\n      new Intl.DateTimeFormat(this.intl).resolvedOptions().locale.startsWith(\"en-us\")\n    );\n  }\n\n  getWeekSettings() {\n    if (this.weekSettings) {\n      return this.weekSettings;\n    } else if (!hasLocaleWeekInfo()) {\n      return fallbackWeekSettings;\n    } else {\n      return getCachedWeekInfo(this.locale);\n    }\n  }\n\n  getStartOfWeek() {\n    return this.getWeekSettings().firstDay;\n  }\n\n  getMinDaysInFirstWeek() {\n    return this.getWeekSettings().minimalDays;\n  }\n\n  getWeekendDays() {\n    return this.getWeekSettings().weekend;\n  }\n\n  equals(other) {\n    return (\n      this.locale === other.locale &&\n      this.numberingSystem === other.numberingSystem &&\n      this.outputCalendar === other.outputCalendar\n    );\n  }\n}\n","import { formatOffset, signedOffset } from \"../impl/util.js\";\nimport Zone from \"../zone.js\";\n\nlet singleton = null;\n\n/**\n * A zone with a fixed offset (meaning no DST)\n * @implements {Zone}\n */\nexport default class FixedOffsetZone extends Zone {\n  /**\n   * Get a singleton instance of UTC\n   * @return {FixedOffsetZone}\n   */\n  static get utcInstance() {\n    if (singleton === null) {\n      singleton = new FixedOffsetZone(0);\n    }\n    return singleton;\n  }\n\n  /**\n   * Get an instance with a specified offset\n   * @param {number} offset - The offset in minutes\n   * @return {FixedOffsetZone}\n   */\n  static instance(offset) {\n    return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset);\n  }\n\n  /**\n   * Get an instance of FixedOffsetZone from a UTC offset string, like \"UTC+6\"\n   * @param {string} s - The offset string to parse\n   * @example FixedOffsetZone.parseSpecifier(\"UTC+6\")\n   * @example FixedOffsetZone.parseSpecifier(\"UTC+06\")\n   * @example FixedOffsetZone.parseSpecifier(\"UTC-6:00\")\n   * @return {FixedOffsetZone}\n   */\n  static parseSpecifier(s) {\n    if (s) {\n      const r = s.match(/^utc(?:([+-]\\d{1,2})(?::(\\d{2}))?)?$/i);\n      if (r) {\n        return new FixedOffsetZone(signedOffset(r[1], r[2]));\n      }\n    }\n    return null;\n  }\n\n  constructor(offset) {\n    super();\n    /** @private **/\n    this.fixed = offset;\n  }\n\n  /** @override **/\n  get type() {\n    return \"fixed\";\n  }\n\n  /** @override **/\n  get name() {\n    return this.fixed === 0 ? \"UTC\" : `UTC${formatOffset(this.fixed, \"narrow\")}`;\n  }\n\n  get ianaName() {\n    if (this.fixed === 0) {\n      return \"Etc/UTC\";\n    } else {\n      return `Etc/GMT${formatOffset(-this.fixed, \"narrow\")}`;\n    }\n  }\n\n  /** @override **/\n  offsetName() {\n    return this.name;\n  }\n\n  /** @override **/\n  formatOffset(ts, format) {\n    return formatOffset(this.fixed, format);\n  }\n\n  /** @override **/\n  get isUniversal() {\n    return true;\n  }\n\n  /** @override **/\n  offset() {\n    return this.fixed;\n  }\n\n  /** @override **/\n  equals(otherZone) {\n    return otherZone.type === \"fixed\" && otherZone.fixed === this.fixed;\n  }\n\n  /** @override **/\n  get isValid() {\n    return true;\n  }\n}\n","import Zone from \"../zone.js\";\n\n/**\n * A zone that failed to parse. You should never need to instantiate this.\n * @implements {Zone}\n */\nexport default class InvalidZone extends Zone {\n  constructor(zoneName) {\n    super();\n    /**  @private */\n    this.zoneName = zoneName;\n  }\n\n  /** @override **/\n  get type() {\n    return \"invalid\";\n  }\n\n  /** @override **/\n  get name() {\n    return this.zoneName;\n  }\n\n  /** @override **/\n  get isUniversal() {\n    return false;\n  }\n\n  /** @override **/\n  offsetName() {\n    return null;\n  }\n\n  /** @override **/\n  formatOffset() {\n    return \"\";\n  }\n\n  /** @override **/\n  offset() {\n    return NaN;\n  }\n\n  /** @override **/\n  equals() {\n    return false;\n  }\n\n  /** @override **/\n  get isValid() {\n    return false;\n  }\n}\n","/**\n * @private\n */\n\nimport Zone from \"../zone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport InvalidZone from \"../zones/invalidZone.js\";\n\nimport { isUndefined, isString, isNumber } from \"./util.js\";\nimport SystemZone from \"../zones/systemZone.js\";\n\nexport function normalizeZone(input, defaultZone) {\n  let offset;\n  if (isUndefined(input) || input === null) {\n    return defaultZone;\n  } else if (input instanceof Zone) {\n    return input;\n  } else if (isString(input)) {\n    const lowered = input.toLowerCase();\n    if (lowered === \"default\") return defaultZone;\n    else if (lowered === \"local\" || lowered === \"system\") return SystemZone.instance;\n    else if (lowered === \"utc\" || lowered === \"gmt\") return FixedOffsetZone.utcInstance;\n    else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input);\n  } else if (isNumber(input)) {\n    return FixedOffsetZone.instance(input);\n  } else if (typeof input === \"object\" && \"offset\" in input && typeof input.offset === \"function\") {\n    // This is dumb, but the instanceof check above doesn't seem to really work\n    // so we're duck checking it\n    return input;\n  } else {\n    return new InvalidZone(input);\n  }\n}\n","import SystemZone from \"./zones/systemZone.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport Locale from \"./impl/locale.js\";\n\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport { validateWeekSettings } from \"./impl/util.js\";\n\nlet now = () => Date.now(),\n  defaultZone = \"system\",\n  defaultLocale = null,\n  defaultNumberingSystem = null,\n  defaultOutputCalendar = null,\n  twoDigitCutoffYear = 60,\n  throwOnInvalid,\n  defaultWeekSettings = null;\n\n/**\n * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here.\n */\nexport default class Settings {\n  /**\n   * Get the callback for returning the current timestamp.\n   * @type {function}\n   */\n  static get now() {\n    return now;\n  }\n\n  /**\n   * Set the callback for returning the current timestamp.\n   * The function should return a number, which will be interpreted as an Epoch millisecond count\n   * @type {function}\n   * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future\n   * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time\n   */\n  static set now(n) {\n    now = n;\n  }\n\n  /**\n   * Set the default time zone to create DateTimes in. Does not affect existing instances.\n   * Use the value \"system\" to reset this value to the system's time zone.\n   * @type {string}\n   */\n  static set defaultZone(zone) {\n    defaultZone = zone;\n  }\n\n  /**\n   * Get the default time zone object currently used to create DateTimes. Does not affect existing instances.\n   * The default value is the system's time zone (the one set on the machine that runs this code).\n   * @type {Zone}\n   */\n  static get defaultZone() {\n    return normalizeZone(defaultZone, SystemZone.instance);\n  }\n\n  /**\n   * Get the default locale to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static get defaultLocale() {\n    return defaultLocale;\n  }\n\n  /**\n   * Set the default locale to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static set defaultLocale(locale) {\n    defaultLocale = locale;\n  }\n\n  /**\n   * Get the default numbering system to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static get defaultNumberingSystem() {\n    return defaultNumberingSystem;\n  }\n\n  /**\n   * Set the default numbering system to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static set defaultNumberingSystem(numberingSystem) {\n    defaultNumberingSystem = numberingSystem;\n  }\n\n  /**\n   * Get the default output calendar to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static get defaultOutputCalendar() {\n    return defaultOutputCalendar;\n  }\n\n  /**\n   * Set the default output calendar to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static set defaultOutputCalendar(outputCalendar) {\n    defaultOutputCalendar = outputCalendar;\n  }\n\n  /**\n   * @typedef {Object} WeekSettings\n   * @property {number} firstDay\n   * @property {number} minimalDays\n   * @property {number[]} weekend\n   */\n\n  /**\n   * @return {WeekSettings|null}\n   */\n  static get defaultWeekSettings() {\n    return defaultWeekSettings;\n  }\n\n  /**\n   * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and\n   * how many days are required in the first week of a year.\n   * Does not affect existing instances.\n   *\n   * @param {WeekSettings|null} weekSettings\n   */\n  static set defaultWeekSettings(weekSettings) {\n    defaultWeekSettings = validateWeekSettings(weekSettings);\n  }\n\n  /**\n   * Get the cutoff year after which a string encoding a year as two digits is interpreted to occur in the current century.\n   * @type {number}\n   */\n  static get twoDigitCutoffYear() {\n    return twoDigitCutoffYear;\n  }\n\n  /**\n   * Set the cutoff year after which a string encoding a year as two digits is interpreted to occur in the current century.\n   * @type {number}\n   * @example Settings.twoDigitCutoffYear = 0 // cut-off year is 0, so all 'yy' are interpreted as current century\n   * @example Settings.twoDigitCutoffYear = 50 // '49' -> 1949; '50' -> 2050\n   * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50\n   * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50\n   */\n  static set twoDigitCutoffYear(cutoffYear) {\n    twoDigitCutoffYear = cutoffYear % 100;\n  }\n\n  /**\n   * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n   * @type {boolean}\n   */\n  static get throwOnInvalid() {\n    return throwOnInvalid;\n  }\n\n  /**\n   * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n   * @type {boolean}\n   */\n  static set throwOnInvalid(t) {\n    throwOnInvalid = t;\n  }\n\n  /**\n   * Reset Luxon's global caches. Should only be necessary in testing scenarios.\n   * @return {void}\n   */\n  static resetCaches() {\n    Locale.resetCache();\n    IANAZone.resetCache();\n  }\n}\n","export default class Invalid {\n  constructor(reason, explanation) {\n    this.reason = reason;\n    this.explanation = explanation;\n  }\n\n  toMessage() {\n    if (this.explanation) {\n      return `${this.reason}: ${this.explanation}`;\n    } else {\n      return this.reason;\n    }\n  }\n}\n","import {\n  integerBetween,\n  isLeapYear,\n  timeObject,\n  daysInYear,\n  daysInMonth,\n  weeksInWeekYear,\n  isInteger,\n  isUndefined,\n} from \"./util.js\";\nimport Invalid from \"./invalid.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],\n  leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];\n\nfunction unitOutOfRange(unit, value) {\n  return new Invalid(\n    \"unit out of range\",\n    `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`\n  );\n}\n\nexport function dayOfWeek(year, month, day) {\n  const d = new Date(Date.UTC(year, month - 1, day));\n\n  if (year < 100 && year >= 0) {\n    d.setUTCFullYear(d.getUTCFullYear() - 1900);\n  }\n\n  const js = d.getUTCDay();\n\n  return js === 0 ? 7 : js;\n}\n\nfunction computeOrdinal(year, month, day) {\n  return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1];\n}\n\nfunction uncomputeOrdinal(year, ordinal) {\n  const table = isLeapYear(year) ? leapLadder : nonLeapLadder,\n    month0 = table.findIndex((i) => i < ordinal),\n    day = ordinal - table[month0];\n  return { month: month0 + 1, day };\n}\n\nexport function isoWeekdayToLocal(isoWeekday, startOfWeek) {\n  return ((isoWeekday - startOfWeek + 7) % 7) + 1;\n}\n\n/**\n * @private\n */\n\nexport function gregorianToWeek(gregObj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n  const { year, month, day } = gregObj,\n    ordinal = computeOrdinal(year, month, day),\n    weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek);\n\n  let weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7),\n    weekYear;\n\n  if (weekNumber < 1) {\n    weekYear = year - 1;\n    weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek);\n  } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) {\n    weekYear = year + 1;\n    weekNumber = 1;\n  } else {\n    weekYear = year;\n  }\n\n  return { weekYear, weekNumber, weekday, ...timeObject(gregObj) };\n}\n\nexport function weekToGregorian(weekData, minDaysInFirstWeek = 4, startOfWeek = 1) {\n  const { weekYear, weekNumber, weekday } = weekData,\n    weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek),\n    yearInDays = daysInYear(weekYear);\n\n  let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek,\n    year;\n\n  if (ordinal < 1) {\n    year = weekYear - 1;\n    ordinal += daysInYear(year);\n  } else if (ordinal > yearInDays) {\n    year = weekYear + 1;\n    ordinal -= daysInYear(weekYear);\n  } else {\n    year = weekYear;\n  }\n\n  const { month, day } = uncomputeOrdinal(year, ordinal);\n  return { year, month, day, ...timeObject(weekData) };\n}\n\nexport function gregorianToOrdinal(gregData) {\n  const { year, month, day } = gregData;\n  const ordinal = computeOrdinal(year, month, day);\n  return { year, ordinal, ...timeObject(gregData) };\n}\n\nexport function ordinalToGregorian(ordinalData) {\n  const { year, ordinal } = ordinalData;\n  const { month, day } = uncomputeOrdinal(year, ordinal);\n  return { year, month, day, ...timeObject(ordinalData) };\n}\n\n/**\n * Check if local week units like localWeekday are used in obj.\n * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties.\n * Modifies obj in-place!\n * @param obj the object values\n */\nexport function usesLocalWeekValues(obj, loc) {\n  const hasLocaleWeekData =\n    !isUndefined(obj.localWeekday) ||\n    !isUndefined(obj.localWeekNumber) ||\n    !isUndefined(obj.localWeekYear);\n  if (hasLocaleWeekData) {\n    const hasIsoWeekData =\n      !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear);\n\n    if (hasIsoWeekData) {\n      throw new ConflictingSpecificationError(\n        \"Cannot mix locale-based week fields with ISO-based week fields\"\n      );\n    }\n    if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday;\n    if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber;\n    if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear;\n    delete obj.localWeekday;\n    delete obj.localWeekNumber;\n    delete obj.localWeekYear;\n    return {\n      minDaysInFirstWeek: loc.getMinDaysInFirstWeek(),\n      startOfWeek: loc.getStartOfWeek(),\n    };\n  } else {\n    return { minDaysInFirstWeek: 4, startOfWeek: 1 };\n  }\n}\n\nexport function hasInvalidWeekData(obj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n  const validYear = isInteger(obj.weekYear),\n    validWeek = integerBetween(\n      obj.weekNumber,\n      1,\n      weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)\n    ),\n    validWeekday = integerBetween(obj.weekday, 1, 7);\n\n  if (!validYear) {\n    return unitOutOfRange(\"weekYear\", obj.weekYear);\n  } else if (!validWeek) {\n    return unitOutOfRange(\"week\", obj.weekNumber);\n  } else if (!validWeekday) {\n    return unitOutOfRange(\"weekday\", obj.weekday);\n  } else return false;\n}\n\nexport function hasInvalidOrdinalData(obj) {\n  const validYear = isInteger(obj.year),\n    validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year));\n\n  if (!validYear) {\n    return unitOutOfRange(\"year\", obj.year);\n  } else if (!validOrdinal) {\n    return unitOutOfRange(\"ordinal\", obj.ordinal);\n  } else return false;\n}\n\nexport function hasInvalidGregorianData(obj) {\n  const validYear = isInteger(obj.year),\n    validMonth = integerBetween(obj.month, 1, 12),\n    validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month));\n\n  if (!validYear) {\n    return unitOutOfRange(\"year\", obj.year);\n  } else if (!validMonth) {\n    return unitOutOfRange(\"month\", obj.month);\n  } else if (!validDay) {\n    return unitOutOfRange(\"day\", obj.day);\n  } else return false;\n}\n\nexport function hasInvalidTimeData(obj) {\n  const { hour, minute, second, millisecond } = obj;\n  const validHour =\n      integerBetween(hour, 0, 23) ||\n      (hour === 24 && minute === 0 && second === 0 && millisecond === 0),\n    validMinute = integerBetween(minute, 0, 59),\n    validSecond = integerBetween(second, 0, 59),\n    validMillisecond = integerBetween(millisecond, 0, 999);\n\n  if (!validHour) {\n    return unitOutOfRange(\"hour\", hour);\n  } else if (!validMinute) {\n    return unitOutOfRange(\"minute\", minute);\n  } else if (!validSecond) {\n    return unitOutOfRange(\"second\", second);\n  } else if (!validMillisecond) {\n    return unitOutOfRange(\"millisecond\", millisecond);\n  } else return false;\n}\n","/*\n  This is just a junk drawer, containing anything used across multiple classes.\n  Because Luxon is small(ish), this should stay small and we won't worry about splitting\n  it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area.\n*/\n\nimport { InvalidArgumentError } from \"../errors.js\";\nimport Settings from \"../settings.js\";\nimport { dayOfWeek, isoWeekdayToLocal } from \"./conversions.js\";\n\n/**\n * @private\n */\n\n// TYPES\n\nexport function isUndefined(o) {\n  return typeof o === \"undefined\";\n}\n\nexport function isNumber(o) {\n  return typeof o === \"number\";\n}\n\nexport function isInteger(o) {\n  return typeof o === \"number\" && o % 1 === 0;\n}\n\nexport function isString(o) {\n  return typeof o === \"string\";\n}\n\nexport function isDate(o) {\n  return Object.prototype.toString.call(o) === \"[object Date]\";\n}\n\n// CAPABILITIES\n\nexport function hasRelative() {\n  try {\n    return typeof Intl !== \"undefined\" && !!Intl.RelativeTimeFormat;\n  } catch (e) {\n    return false;\n  }\n}\n\nexport function hasLocaleWeekInfo() {\n  try {\n    return (\n      typeof Intl !== \"undefined\" &&\n      !!Intl.Locale &&\n      (\"weekInfo\" in Intl.Locale.prototype || \"getWeekInfo\" in Intl.Locale.prototype)\n    );\n  } catch (e) {\n    return false;\n  }\n}\n\n// OBJECTS AND ARRAYS\n\nexport function maybeArray(thing) {\n  return Array.isArray(thing) ? thing : [thing];\n}\n\nexport function bestBy(arr, by, compare) {\n  if (arr.length === 0) {\n    return undefined;\n  }\n  return arr.reduce((best, next) => {\n    const pair = [by(next), next];\n    if (!best) {\n      return pair;\n    } else if (compare(best[0], pair[0]) === best[0]) {\n      return best;\n    } else {\n      return pair;\n    }\n  }, null)[1];\n}\n\nexport function pick(obj, keys) {\n  return keys.reduce((a, k) => {\n    a[k] = obj[k];\n    return a;\n  }, {});\n}\n\nexport function hasOwnProperty(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nexport function validateWeekSettings(settings) {\n  if (settings == null) {\n    return null;\n  } else if (typeof settings !== \"object\") {\n    throw new InvalidArgumentError(\"Week settings must be an object\");\n  } else {\n    if (\n      !integerBetween(settings.firstDay, 1, 7) ||\n      !integerBetween(settings.minimalDays, 1, 7) ||\n      !Array.isArray(settings.weekend) ||\n      settings.weekend.some((v) => !integerBetween(v, 1, 7))\n    ) {\n      throw new InvalidArgumentError(\"Invalid week settings\");\n    }\n    return {\n      firstDay: settings.firstDay,\n      minimalDays: settings.minimalDays,\n      weekend: Array.from(settings.weekend),\n    };\n  }\n}\n\n// NUMBERS AND STRINGS\n\nexport function integerBetween(thing, bottom, top) {\n  return isInteger(thing) && thing >= bottom && thing <= top;\n}\n\n// x % n but takes the sign of n instead of x\nexport function floorMod(x, n) {\n  return x - n * Math.floor(x / n);\n}\n\nexport function padStart(input, n = 2) {\n  const isNeg = input < 0;\n  let padded;\n  if (isNeg) {\n    padded = \"-\" + (\"\" + -input).padStart(n, \"0\");\n  } else {\n    padded = (\"\" + input).padStart(n, \"0\");\n  }\n  return padded;\n}\n\nexport function parseInteger(string) {\n  if (isUndefined(string) || string === null || string === \"\") {\n    return undefined;\n  } else {\n    return parseInt(string, 10);\n  }\n}\n\nexport function parseFloating(string) {\n  if (isUndefined(string) || string === null || string === \"\") {\n    return undefined;\n  } else {\n    return parseFloat(string);\n  }\n}\n\nexport function parseMillis(fraction) {\n  // Return undefined (instead of 0) in these cases, where fraction is not set\n  if (isUndefined(fraction) || fraction === null || fraction === \"\") {\n    return undefined;\n  } else {\n    const f = parseFloat(\"0.\" + fraction) * 1000;\n    return Math.floor(f);\n  }\n}\n\nexport function roundTo(number, digits, towardZero = false) {\n  const factor = 10 ** digits,\n    rounder = towardZero ? Math.trunc : Math.round;\n  return rounder(number * factor) / factor;\n}\n\n// DATE BASICS\n\nexport function isLeapYear(year) {\n  return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\nexport function daysInYear(year) {\n  return isLeapYear(year) ? 366 : 365;\n}\n\nexport function daysInMonth(year, month) {\n  const modMonth = floorMod(month - 1, 12) + 1,\n    modYear = year + (month - modMonth) / 12;\n\n  if (modMonth === 2) {\n    return isLeapYear(modYear) ? 29 : 28;\n  } else {\n    return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1];\n  }\n}\n\n// convert a calendar object to a local timestamp (epoch, but with the offset baked in)\nexport function objToLocalTS(obj) {\n  let d = Date.UTC(\n    obj.year,\n    obj.month - 1,\n    obj.day,\n    obj.hour,\n    obj.minute,\n    obj.second,\n    obj.millisecond\n  );\n\n  // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that\n  if (obj.year < 100 && obj.year >= 0) {\n    d = new Date(d);\n    // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not\n    // so if obj.year is in 99, but obj.day makes it roll over into year 100,\n    // the calculations done by Date.UTC are using year 2000 - which is incorrect\n    d.setUTCFullYear(obj.year, obj.month - 1, obj.day);\n  }\n  return +d;\n}\n\n// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js\nfunction firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) {\n  const fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek);\n  return -fwdlw + minDaysInFirstWeek - 1;\n}\n\nexport function weeksInWeekYear(weekYear, minDaysInFirstWeek = 4, startOfWeek = 1) {\n  const weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek);\n  const weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek);\n  return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7;\n}\n\nexport function untruncateYear(year) {\n  if (year > 99) {\n    return year;\n  } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year;\n}\n\n// PARSING\n\nexport function parseZoneInfo(ts, offsetFormat, locale, timeZone = null) {\n  const date = new Date(ts),\n    intlOpts = {\n      hourCycle: \"h23\",\n      year: \"numeric\",\n      month: \"2-digit\",\n      day: \"2-digit\",\n      hour: \"2-digit\",\n      minute: \"2-digit\",\n    };\n\n  if (timeZone) {\n    intlOpts.timeZone = timeZone;\n  }\n\n  const modified = { timeZoneName: offsetFormat, ...intlOpts };\n\n  const parsed = new Intl.DateTimeFormat(locale, modified)\n    .formatToParts(date)\n    .find((m) => m.type.toLowerCase() === \"timezonename\");\n  return parsed ? parsed.value : null;\n}\n\n// signedOffset('-5', '30') -> -330\nexport function signedOffset(offHourStr, offMinuteStr) {\n  let offHour = parseInt(offHourStr, 10);\n\n  // don't || this because we want to preserve -0\n  if (Number.isNaN(offHour)) {\n    offHour = 0;\n  }\n\n  const offMin = parseInt(offMinuteStr, 10) || 0,\n    offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin;\n  return offHour * 60 + offMinSigned;\n}\n\n// COERCION\n\nexport function asNumber(value) {\n  const numericValue = Number(value);\n  if (typeof value === \"boolean\" || value === \"\" || Number.isNaN(numericValue))\n    throw new InvalidArgumentError(`Invalid unit value ${value}`);\n  return numericValue;\n}\n\nexport function normalizeObject(obj, normalizer) {\n  const normalized = {};\n  for (const u in obj) {\n    if (hasOwnProperty(obj, u)) {\n      const v = obj[u];\n      if (v === undefined || v === null) continue;\n      normalized[normalizer(u)] = asNumber(v);\n    }\n  }\n  return normalized;\n}\n\nexport function formatOffset(offset, format) {\n  const hours = Math.trunc(Math.abs(offset / 60)),\n    minutes = Math.trunc(Math.abs(offset % 60)),\n    sign = offset >= 0 ? \"+\" : \"-\";\n\n  switch (format) {\n    case \"short\":\n      return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`;\n    case \"narrow\":\n      return `${sign}${hours}${minutes > 0 ? `:${minutes}` : \"\"}`;\n    case \"techie\":\n      return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`;\n    default:\n      throw new RangeError(`Value format ${format} is out of range for property format`);\n  }\n}\n\nexport function timeObject(obj) {\n  return pick(obj, [\"hour\", \"minute\", \"second\", \"millisecond\"]);\n}\n","import * as Formats from \"./formats.js\";\nimport { pick } from \"./util.js\";\n\nfunction stringify(obj) {\n  return JSON.stringify(obj, Object.keys(obj).sort());\n}\n\n/**\n * @private\n */\n\nexport const monthsLong = [\n  \"January\",\n  \"February\",\n  \"March\",\n  \"April\",\n  \"May\",\n  \"June\",\n  \"July\",\n  \"August\",\n  \"September\",\n  \"October\",\n  \"November\",\n  \"December\",\n];\n\nexport const monthsShort = [\n  \"Jan\",\n  \"Feb\",\n  \"Mar\",\n  \"Apr\",\n  \"May\",\n  \"Jun\",\n  \"Jul\",\n  \"Aug\",\n  \"Sep\",\n  \"Oct\",\n  \"Nov\",\n  \"Dec\",\n];\n\nexport const monthsNarrow = [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"];\n\nexport function months(length) {\n  switch (length) {\n    case \"narrow\":\n      return [...monthsNarrow];\n    case \"short\":\n      return [...monthsShort];\n    case \"long\":\n      return [...monthsLong];\n    case \"numeric\":\n      return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"];\n    case \"2-digit\":\n      return [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"];\n    default:\n      return null;\n  }\n}\n\nexport const weekdaysLong = [\n  \"Monday\",\n  \"Tuesday\",\n  \"Wednesday\",\n  \"Thursday\",\n  \"Friday\",\n  \"Saturday\",\n  \"Sunday\",\n];\n\nexport const weekdaysShort = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\nexport const weekdaysNarrow = [\"M\", \"T\", \"W\", \"T\", \"F\", \"S\", \"S\"];\n\nexport function weekdays(length) {\n  switch (length) {\n    case \"narrow\":\n      return [...weekdaysNarrow];\n    case \"short\":\n      return [...weekdaysShort];\n    case \"long\":\n      return [...weekdaysLong];\n    case \"numeric\":\n      return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"];\n    default:\n      return null;\n  }\n}\n\nexport const meridiems = [\"AM\", \"PM\"];\n\nexport const erasLong = [\"Before Christ\", \"Anno Domini\"];\n\nexport const erasShort = [\"BC\", \"AD\"];\n\nexport const erasNarrow = [\"B\", \"A\"];\n\nexport function eras(length) {\n  switch (length) {\n    case \"narrow\":\n      return [...erasNarrow];\n    case \"short\":\n      return [...erasShort];\n    case \"long\":\n      return [...erasLong];\n    default:\n      return null;\n  }\n}\n\nexport function meridiemForDateTime(dt) {\n  return meridiems[dt.hour < 12 ? 0 : 1];\n}\n\nexport function weekdayForDateTime(dt, length) {\n  return weekdays(length)[dt.weekday - 1];\n}\n\nexport function monthForDateTime(dt, length) {\n  return months(length)[dt.month - 1];\n}\n\nexport function eraForDateTime(dt, length) {\n  return eras(length)[dt.year < 0 ? 0 : 1];\n}\n\nexport function formatRelativeTime(unit, count, numeric = \"always\", narrow = false) {\n  const units = {\n    years: [\"year\", \"yr.\"],\n    quarters: [\"quarter\", \"qtr.\"],\n    months: [\"month\", \"mo.\"],\n    weeks: [\"week\", \"wk.\"],\n    days: [\"day\", \"day\", \"days\"],\n    hours: [\"hour\", \"hr.\"],\n    minutes: [\"minute\", \"min.\"],\n    seconds: [\"second\", \"sec.\"],\n  };\n\n  const lastable = [\"hours\", \"minutes\", \"seconds\"].indexOf(unit) === -1;\n\n  if (numeric === \"auto\" && lastable) {\n    const isDay = unit === \"days\";\n    switch (count) {\n      case 1:\n        return isDay ? \"tomorrow\" : `next ${units[unit][0]}`;\n      case -1:\n        return isDay ? \"yesterday\" : `last ${units[unit][0]}`;\n      case 0:\n        return isDay ? \"today\" : `this ${units[unit][0]}`;\n      default: // fall through\n    }\n  }\n\n  const isInPast = Object.is(count, -0) || count < 0,\n    fmtValue = Math.abs(count),\n    singular = fmtValue === 1,\n    lilUnits = units[unit],\n    fmtUnit = narrow\n      ? singular\n        ? lilUnits[1]\n        : lilUnits[2] || lilUnits[1]\n      : singular\n      ? units[unit][0]\n      : unit;\n  return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`;\n}\n\nexport function formatString(knownFormat) {\n  // these all have the offsets removed because we don't have access to them\n  // without all the intl stuff this is backfilling\n  const filtered = pick(knownFormat, [\n      \"weekday\",\n      \"era\",\n      \"year\",\n      \"month\",\n      \"day\",\n      \"hour\",\n      \"minute\",\n      \"second\",\n      \"timeZoneName\",\n      \"hourCycle\",\n    ]),\n    key = stringify(filtered),\n    dateTimeHuge = \"EEEE, LLLL d, yyyy, h:mm a\";\n  switch (key) {\n    case stringify(Formats.DATE_SHORT):\n      return \"M/d/yyyy\";\n    case stringify(Formats.DATE_MED):\n      return \"LLL d, yyyy\";\n    case stringify(Formats.DATE_MED_WITH_WEEKDAY):\n      return \"EEE, LLL d, yyyy\";\n    case stringify(Formats.DATE_FULL):\n      return \"LLLL d, yyyy\";\n    case stringify(Formats.DATE_HUGE):\n      return \"EEEE, LLLL d, yyyy\";\n    case stringify(Formats.TIME_SIMPLE):\n      return \"h:mm a\";\n    case stringify(Formats.TIME_WITH_SECONDS):\n      return \"h:mm:ss a\";\n    case stringify(Formats.TIME_WITH_SHORT_OFFSET):\n      return \"h:mm a\";\n    case stringify(Formats.TIME_WITH_LONG_OFFSET):\n      return \"h:mm a\";\n    case stringify(Formats.TIME_24_SIMPLE):\n      return \"HH:mm\";\n    case stringify(Formats.TIME_24_WITH_SECONDS):\n      return \"HH:mm:ss\";\n    case stringify(Formats.TIME_24_WITH_SHORT_OFFSET):\n      return \"HH:mm\";\n    case stringify(Formats.TIME_24_WITH_LONG_OFFSET):\n      return \"HH:mm\";\n    case stringify(Formats.DATETIME_SHORT):\n      return \"M/d/yyyy, h:mm a\";\n    case stringify(Formats.DATETIME_MED):\n      return \"LLL d, yyyy, h:mm a\";\n    case stringify(Formats.DATETIME_FULL):\n      return \"LLLL d, yyyy, h:mm a\";\n    case stringify(Formats.DATETIME_HUGE):\n      return dateTimeHuge;\n    case stringify(Formats.DATETIME_SHORT_WITH_SECONDS):\n      return \"M/d/yyyy, h:mm:ss a\";\n    case stringify(Formats.DATETIME_MED_WITH_SECONDS):\n      return \"LLL d, yyyy, h:mm:ss a\";\n    case stringify(Formats.DATETIME_MED_WITH_WEEKDAY):\n      return \"EEE, d LLL yyyy, h:mm a\";\n    case stringify(Formats.DATETIME_FULL_WITH_SECONDS):\n      return \"LLLL d, yyyy, h:mm:ss a\";\n    case stringify(Formats.DATETIME_HUGE_WITH_SECONDS):\n      return \"EEEE, LLLL d, yyyy, h:mm:ss a\";\n    default:\n      return dateTimeHuge;\n  }\n}\n","import * as English from \"./english.js\";\nimport * as Formats from \"./formats.js\";\nimport { padStart } from \"./util.js\";\n\nfunction stringifyTokens(splits, tokenToString) {\n  let s = \"\";\n  for (const token of splits) {\n    if (token.literal) {\n      s += token.val;\n    } else {\n      s += tokenToString(token.val);\n    }\n  }\n  return s;\n}\n\nconst macroTokenToFormatOpts = {\n  D: Formats.DATE_SHORT,\n  DD: Formats.DATE_MED,\n  DDD: Formats.DATE_FULL,\n  DDDD: Formats.DATE_HUGE,\n  t: Formats.TIME_SIMPLE,\n  tt: Formats.TIME_WITH_SECONDS,\n  ttt: Formats.TIME_WITH_SHORT_OFFSET,\n  tttt: Formats.TIME_WITH_LONG_OFFSET,\n  T: Formats.TIME_24_SIMPLE,\n  TT: Formats.TIME_24_WITH_SECONDS,\n  TTT: Formats.TIME_24_WITH_SHORT_OFFSET,\n  TTTT: Formats.TIME_24_WITH_LONG_OFFSET,\n  f: Formats.DATETIME_SHORT,\n  ff: Formats.DATETIME_MED,\n  fff: Formats.DATETIME_FULL,\n  ffff: Formats.DATETIME_HUGE,\n  F: Formats.DATETIME_SHORT_WITH_SECONDS,\n  FF: Formats.DATETIME_MED_WITH_SECONDS,\n  FFF: Formats.DATETIME_FULL_WITH_SECONDS,\n  FFFF: Formats.DATETIME_HUGE_WITH_SECONDS,\n};\n\n/**\n * @private\n */\n\nexport default class Formatter {\n  static create(locale, opts = {}) {\n    return new Formatter(locale, opts);\n  }\n\n  static parseFormat(fmt) {\n    // white-space is always considered a literal in user-provided formats\n    // the \" \" token has a special meaning (see unitForToken)\n\n    let current = null,\n      currentFull = \"\",\n      bracketed = false;\n    const splits = [];\n    for (let i = 0; i < fmt.length; i++) {\n      const c = fmt.charAt(i);\n      if (c === \"'\") {\n        if (currentFull.length > 0) {\n          splits.push({ literal: bracketed || /^\\s+$/.test(currentFull), val: currentFull });\n        }\n        current = null;\n        currentFull = \"\";\n        bracketed = !bracketed;\n      } else if (bracketed) {\n        currentFull += c;\n      } else if (c === current) {\n        currentFull += c;\n      } else {\n        if (currentFull.length > 0) {\n          splits.push({ literal: /^\\s+$/.test(currentFull), val: currentFull });\n        }\n        currentFull = c;\n        current = c;\n      }\n    }\n\n    if (currentFull.length > 0) {\n      splits.push({ literal: bracketed || /^\\s+$/.test(currentFull), val: currentFull });\n    }\n\n    return splits;\n  }\n\n  static macroTokenToFormatOpts(token) {\n    return macroTokenToFormatOpts[token];\n  }\n\n  constructor(locale, formatOpts) {\n    this.opts = formatOpts;\n    this.loc = locale;\n    this.systemLoc = null;\n  }\n\n  formatWithSystemDefault(dt, opts) {\n    if (this.systemLoc === null) {\n      this.systemLoc = this.loc.redefaultToSystem();\n    }\n    const df = this.systemLoc.dtFormatter(dt, { ...this.opts, ...opts });\n    return df.format();\n  }\n\n  dtFormatter(dt, opts = {}) {\n    return this.loc.dtFormatter(dt, { ...this.opts, ...opts });\n  }\n\n  formatDateTime(dt, opts) {\n    return this.dtFormatter(dt, opts).format();\n  }\n\n  formatDateTimeParts(dt, opts) {\n    return this.dtFormatter(dt, opts).formatToParts();\n  }\n\n  formatInterval(interval, opts) {\n    const df = this.dtFormatter(interval.start, opts);\n    return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate());\n  }\n\n  resolvedOptions(dt, opts) {\n    return this.dtFormatter(dt, opts).resolvedOptions();\n  }\n\n  num(n, p = 0) {\n    // we get some perf out of doing this here, annoyingly\n    if (this.opts.forceSimple) {\n      return padStart(n, p);\n    }\n\n    const opts = { ...this.opts };\n\n    if (p > 0) {\n      opts.padTo = p;\n    }\n\n    return this.loc.numberFormatter(opts).format(n);\n  }\n\n  formatDateTimeFromString(dt, fmt) {\n    const knownEnglish = this.loc.listingMode() === \"en\",\n      useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== \"gregory\",\n      string = (opts, extract) => this.loc.extract(dt, opts, extract),\n      formatOffset = (opts) => {\n        if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) {\n          return \"Z\";\n        }\n\n        return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : \"\";\n      },\n      meridiem = () =>\n        knownEnglish\n          ? English.meridiemForDateTime(dt)\n          : string({ hour: \"numeric\", hourCycle: \"h12\" }, \"dayperiod\"),\n      month = (length, standalone) =>\n        knownEnglish\n          ? English.monthForDateTime(dt, length)\n          : string(standalone ? { month: length } : { month: length, day: \"numeric\" }, \"month\"),\n      weekday = (length, standalone) =>\n        knownEnglish\n          ? English.weekdayForDateTime(dt, length)\n          : string(\n              standalone ? { weekday: length } : { weekday: length, month: \"long\", day: \"numeric\" },\n              \"weekday\"\n            ),\n      maybeMacro = (token) => {\n        const formatOpts = Formatter.macroTokenToFormatOpts(token);\n        if (formatOpts) {\n          return this.formatWithSystemDefault(dt, formatOpts);\n        } else {\n          return token;\n        }\n      },\n      era = (length) =>\n        knownEnglish ? English.eraForDateTime(dt, length) : string({ era: length }, \"era\"),\n      tokenToString = (token) => {\n        // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols\n        switch (token) {\n          // ms\n          case \"S\":\n            return this.num(dt.millisecond);\n          case \"u\":\n          // falls through\n          case \"SSS\":\n            return this.num(dt.millisecond, 3);\n          // seconds\n          case \"s\":\n            return this.num(dt.second);\n          case \"ss\":\n            return this.num(dt.second, 2);\n          // fractional seconds\n          case \"uu\":\n            return this.num(Math.floor(dt.millisecond / 10), 2);\n          case \"uuu\":\n            return this.num(Math.floor(dt.millisecond / 100));\n          // minutes\n          case \"m\":\n            return this.num(dt.minute);\n          case \"mm\":\n            return this.num(dt.minute, 2);\n          // hours\n          case \"h\":\n            return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12);\n          case \"hh\":\n            return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2);\n          case \"H\":\n            return this.num(dt.hour);\n          case \"HH\":\n            return this.num(dt.hour, 2);\n          // offset\n          case \"Z\":\n            // like +6\n            return formatOffset({ format: \"narrow\", allowZ: this.opts.allowZ });\n          case \"ZZ\":\n            // like +06:00\n            return formatOffset({ format: \"short\", allowZ: this.opts.allowZ });\n          case \"ZZZ\":\n            // like +0600\n            return formatOffset({ format: \"techie\", allowZ: this.opts.allowZ });\n          case \"ZZZZ\":\n            // like EST\n            return dt.zone.offsetName(dt.ts, { format: \"short\", locale: this.loc.locale });\n          case \"ZZZZZ\":\n            // like Eastern Standard Time\n            return dt.zone.offsetName(dt.ts, { format: \"long\", locale: this.loc.locale });\n          // zone\n          case \"z\":\n            // like America/New_York\n            return dt.zoneName;\n          // meridiems\n          case \"a\":\n            return meridiem();\n          // dates\n          case \"d\":\n            return useDateTimeFormatter ? string({ day: \"numeric\" }, \"day\") : this.num(dt.day);\n          case \"dd\":\n            return useDateTimeFormatter ? string({ day: \"2-digit\" }, \"day\") : this.num(dt.day, 2);\n          // weekdays - standalone\n          case \"c\":\n            // like 1\n            return this.num(dt.weekday);\n          case \"ccc\":\n            // like 'Tues'\n            return weekday(\"short\", true);\n          case \"cccc\":\n            // like 'Tuesday'\n            return weekday(\"long\", true);\n          case \"ccccc\":\n            // like 'T'\n            return weekday(\"narrow\", true);\n          // weekdays - format\n          case \"E\":\n            // like 1\n            return this.num(dt.weekday);\n          case \"EEE\":\n            // like 'Tues'\n            return weekday(\"short\", false);\n          case \"EEEE\":\n            // like 'Tuesday'\n            return weekday(\"long\", false);\n          case \"EEEEE\":\n            // like 'T'\n            return weekday(\"narrow\", false);\n          // months - standalone\n          case \"L\":\n            // like 1\n            return useDateTimeFormatter\n              ? string({ month: \"numeric\", day: \"numeric\" }, \"month\")\n              : this.num(dt.month);\n          case \"LL\":\n            // like 01, doesn't seem to work\n            return useDateTimeFormatter\n              ? string({ month: \"2-digit\", day: \"numeric\" }, \"month\")\n              : this.num(dt.month, 2);\n          case \"LLL\":\n            // like Jan\n            return month(\"short\", true);\n          case \"LLLL\":\n            // like January\n            return month(\"long\", true);\n          case \"LLLLL\":\n            // like J\n            return month(\"narrow\", true);\n          // months - format\n          case \"M\":\n            // like 1\n            return useDateTimeFormatter\n              ? string({ month: \"numeric\" }, \"month\")\n              : this.num(dt.month);\n          case \"MM\":\n            // like 01\n            return useDateTimeFormatter\n              ? string({ month: \"2-digit\" }, \"month\")\n              : this.num(dt.month, 2);\n          case \"MMM\":\n            // like Jan\n            return month(\"short\", false);\n          case \"MMMM\":\n            // like January\n            return month(\"long\", false);\n          case \"MMMMM\":\n            // like J\n            return month(\"narrow\", false);\n          // years\n          case \"y\":\n            // like 2014\n            return useDateTimeFormatter ? string({ year: \"numeric\" }, \"year\") : this.num(dt.year);\n          case \"yy\":\n            // like 14\n            return useDateTimeFormatter\n              ? string({ year: \"2-digit\" }, \"year\")\n              : this.num(dt.year.toString().slice(-2), 2);\n          case \"yyyy\":\n            // like 0012\n            return useDateTimeFormatter\n              ? string({ year: \"numeric\" }, \"year\")\n              : this.num(dt.year, 4);\n          case \"yyyyyy\":\n            // like 000012\n            return useDateTimeFormatter\n              ? string({ year: \"numeric\" }, \"year\")\n              : this.num(dt.year, 6);\n          // eras\n          case \"G\":\n            // like AD\n            return era(\"short\");\n          case \"GG\":\n            // like Anno Domini\n            return era(\"long\");\n          case \"GGGGG\":\n            return era(\"narrow\");\n          case \"kk\":\n            return this.num(dt.weekYear.toString().slice(-2), 2);\n          case \"kkkk\":\n            return this.num(dt.weekYear, 4);\n          case \"W\":\n            return this.num(dt.weekNumber);\n          case \"WW\":\n            return this.num(dt.weekNumber, 2);\n          case \"n\":\n            return this.num(dt.localWeekNumber);\n          case \"nn\":\n            return this.num(dt.localWeekNumber, 2);\n          case \"ii\":\n            return this.num(dt.localWeekYear.toString().slice(-2), 2);\n          case \"iiii\":\n            return this.num(dt.localWeekYear, 4);\n          case \"o\":\n            return this.num(dt.ordinal);\n          case \"ooo\":\n            return this.num(dt.ordinal, 3);\n          case \"q\":\n            // like 1\n            return this.num(dt.quarter);\n          case \"qq\":\n            // like 01\n            return this.num(dt.quarter, 2);\n          case \"X\":\n            return this.num(Math.floor(dt.ts / 1000));\n          case \"x\":\n            return this.num(dt.ts);\n          default:\n            return maybeMacro(token);\n        }\n      };\n\n    return stringifyTokens(Formatter.parseFormat(fmt), tokenToString);\n  }\n\n  formatDurationFromString(dur, fmt) {\n    const tokenToField = (token) => {\n        switch (token[0]) {\n          case \"S\":\n            return \"millisecond\";\n          case \"s\":\n            return \"second\";\n          case \"m\":\n            return \"minute\";\n          case \"h\":\n            return \"hour\";\n          case \"d\":\n            return \"day\";\n          case \"w\":\n            return \"week\";\n          case \"M\":\n            return \"month\";\n          case \"y\":\n            return \"year\";\n          default:\n            return null;\n        }\n      },\n      tokenToString = (lildur) => (token) => {\n        const mapped = tokenToField(token);\n        if (mapped) {\n          return this.num(lildur.get(mapped), token.length);\n        } else {\n          return token;\n        }\n      },\n      tokens = Formatter.parseFormat(fmt),\n      realTokens = tokens.reduce(\n        (found, { literal, val }) => (literal ? found : found.concat(val)),\n        []\n      ),\n      collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter((t) => t));\n    return stringifyTokens(tokens, tokenToString(collapsed));\n  }\n}\n","import {\n  untruncateYear,\n  signedOffset,\n  parseInteger,\n  parseMillis,\n  isUndefined,\n  parseFloating,\n} from \"./util.js\";\nimport * as English from \"./english.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\n\n/*\n * This file handles parsing for well-specified formats. Here's how it works:\n * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match.\n * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object\n * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence.\n * Extractors can take a \"cursor\" representing the offset in the match to look at. This makes it easy to combine extractors.\n * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions.\n * Some extractions are super dumb and simpleParse and fromStrings help DRY them.\n */\n\nconst ianaRegex = /[A-Za-z_+-]{1,256}(?::?\\/[A-Za-z0-9_+-]{1,256}(?:\\/[A-Za-z0-9_+-]{1,256})?)?/;\n\nfunction combineRegexes(...regexes) {\n  const full = regexes.reduce((f, r) => f + r.source, \"\");\n  return RegExp(`^${full}$`);\n}\n\nfunction combineExtractors(...extractors) {\n  return (m) =>\n    extractors\n      .reduce(\n        ([mergedVals, mergedZone, cursor], ex) => {\n          const [val, zone, next] = ex(m, cursor);\n          return [{ ...mergedVals, ...val }, zone || mergedZone, next];\n        },\n        [{}, null, 1]\n      )\n      .slice(0, 2);\n}\n\nfunction parse(s, ...patterns) {\n  if (s == null) {\n    return [null, null];\n  }\n\n  for (const [regex, extractor] of patterns) {\n    const m = regex.exec(s);\n    if (m) {\n      return extractor(m);\n    }\n  }\n  return [null, null];\n}\n\nfunction simpleParse(...keys) {\n  return (match, cursor) => {\n    const ret = {};\n    let i;\n\n    for (i = 0; i < keys.length; i++) {\n      ret[keys[i]] = parseInteger(match[cursor + i]);\n    }\n    return [ret, null, cursor + i];\n  };\n}\n\n// ISO and SQL parsing\nconst offsetRegex = /(?:(Z)|([+-]\\d\\d)(?::?(\\d\\d))?)/;\nconst isoExtendedZone = `(?:${offsetRegex.source}?(?:\\\\[(${ianaRegex.source})\\\\])?)?`;\nconst isoTimeBaseRegex = /(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:[.,](\\d{1,30}))?)?)?/;\nconst isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`);\nconst isoTimeExtensionRegex = RegExp(`(?:T${isoTimeRegex.source})?`);\nconst isoYmdRegex = /([+-]\\d{6}|\\d{4})(?:-?(\\d\\d)(?:-?(\\d\\d))?)?/;\nconst isoWeekRegex = /(\\d{4})-?W(\\d\\d)(?:-?(\\d))?/;\nconst isoOrdinalRegex = /(\\d{4})-?(\\d{3})/;\nconst extractISOWeekData = simpleParse(\"weekYear\", \"weekNumber\", \"weekDay\");\nconst extractISOOrdinalData = simpleParse(\"year\", \"ordinal\");\nconst sqlYmdRegex = /(\\d{4})-(\\d\\d)-(\\d\\d)/; // dumbed-down version of the ISO one\nconst sqlTimeRegex = RegExp(\n  `${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`\n);\nconst sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`);\n\nfunction int(match, pos, fallback) {\n  const m = match[pos];\n  return isUndefined(m) ? fallback : parseInteger(m);\n}\n\nfunction extractISOYmd(match, cursor) {\n  const item = {\n    year: int(match, cursor),\n    month: int(match, cursor + 1, 1),\n    day: int(match, cursor + 2, 1),\n  };\n\n  return [item, null, cursor + 3];\n}\n\nfunction extractISOTime(match, cursor) {\n  const item = {\n    hours: int(match, cursor, 0),\n    minutes: int(match, cursor + 1, 0),\n    seconds: int(match, cursor + 2, 0),\n    milliseconds: parseMillis(match[cursor + 3]),\n  };\n\n  return [item, null, cursor + 4];\n}\n\nfunction extractISOOffset(match, cursor) {\n  const local = !match[cursor] && !match[cursor + 1],\n    fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]),\n    zone = local ? null : FixedOffsetZone.instance(fullOffset);\n  return [{}, zone, cursor + 3];\n}\n\nfunction extractIANAZone(match, cursor) {\n  const zone = match[cursor] ? IANAZone.create(match[cursor]) : null;\n  return [{}, zone, cursor + 1];\n}\n\n// ISO time parsing\n\nconst isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`);\n\n// ISO duration parsing\n\nconst isoDuration =\n  /^-?P(?:(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)Y)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)W)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)D)?(?:T(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)H)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20})(?:[.,](-?\\d{1,20}))?S)?)?)$/;\n\nfunction extractISODuration(match) {\n  const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] =\n    match;\n\n  const hasNegativePrefix = s[0] === \"-\";\n  const negativeSeconds = secondStr && secondStr[0] === \"-\";\n\n  const maybeNegate = (num, force = false) =>\n    num !== undefined && (force || (num && hasNegativePrefix)) ? -num : num;\n\n  return [\n    {\n      years: maybeNegate(parseFloating(yearStr)),\n      months: maybeNegate(parseFloating(monthStr)),\n      weeks: maybeNegate(parseFloating(weekStr)),\n      days: maybeNegate(parseFloating(dayStr)),\n      hours: maybeNegate(parseFloating(hourStr)),\n      minutes: maybeNegate(parseFloating(minuteStr)),\n      seconds: maybeNegate(parseFloating(secondStr), secondStr === \"-0\"),\n      milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds),\n    },\n  ];\n}\n\n// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York\n// and not just that we're in -240 *right now*. But since I don't think these are used that often\n// I'm just going to ignore that\nconst obsOffsets = {\n  GMT: 0,\n  EDT: -4 * 60,\n  EST: -5 * 60,\n  CDT: -5 * 60,\n  CST: -6 * 60,\n  MDT: -6 * 60,\n  MST: -7 * 60,\n  PDT: -7 * 60,\n  PST: -8 * 60,\n};\n\nfunction fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n  const result = {\n    year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr),\n    month: English.monthsShort.indexOf(monthStr) + 1,\n    day: parseInteger(dayStr),\n    hour: parseInteger(hourStr),\n    minute: parseInteger(minuteStr),\n  };\n\n  if (secondStr) result.second = parseInteger(secondStr);\n  if (weekdayStr) {\n    result.weekday =\n      weekdayStr.length > 3\n        ? English.weekdaysLong.indexOf(weekdayStr) + 1\n        : English.weekdaysShort.indexOf(weekdayStr) + 1;\n  }\n\n  return result;\n}\n\n// RFC 2822/5322\nconst rfc2822 =\n  /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\\d\\d)(\\d\\d)))$/;\n\nfunction extractRFC2822(match) {\n  const [\n      ,\n      weekdayStr,\n      dayStr,\n      monthStr,\n      yearStr,\n      hourStr,\n      minuteStr,\n      secondStr,\n      obsOffset,\n      milOffset,\n      offHourStr,\n      offMinuteStr,\n    ] = match,\n    result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n\n  let offset;\n  if (obsOffset) {\n    offset = obsOffsets[obsOffset];\n  } else if (milOffset) {\n    offset = 0;\n  } else {\n    offset = signedOffset(offHourStr, offMinuteStr);\n  }\n\n  return [result, new FixedOffsetZone(offset)];\n}\n\nfunction preprocessRFC2822(s) {\n  // Remove comments and folding whitespace and replace multiple-spaces with a single space\n  return s\n    .replace(/\\([^()]*\\)|[\\n\\t]/g, \" \")\n    .replace(/(\\s\\s+)/g, \" \")\n    .trim();\n}\n\n// http date\n\nconst rfc1123 =\n    /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\\d\\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{4}) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n  rfc850 =\n    /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\\d\\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n  ascii =\n    /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \\d|\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) (\\d{4})$/;\n\nfunction extractRFC1123Or850(match) {\n  const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match,\n    result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n  return [result, FixedOffsetZone.utcInstance];\n}\n\nfunction extractASCII(match) {\n  const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match,\n    result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n  return [result, FixedOffsetZone.utcInstance];\n}\n\nconst isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex);\nconst isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex);\nconst isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex);\nconst isoTimeCombinedRegex = combineRegexes(isoTimeRegex);\n\nconst extractISOYmdTimeAndOffset = combineExtractors(\n  extractISOYmd,\n  extractISOTime,\n  extractISOOffset,\n  extractIANAZone\n);\nconst extractISOWeekTimeAndOffset = combineExtractors(\n  extractISOWeekData,\n  extractISOTime,\n  extractISOOffset,\n  extractIANAZone\n);\nconst extractISOOrdinalDateAndTime = combineExtractors(\n  extractISOOrdinalData,\n  extractISOTime,\n  extractISOOffset,\n  extractIANAZone\n);\nconst extractISOTimeAndOffset = combineExtractors(\n  extractISOTime,\n  extractISOOffset,\n  extractIANAZone\n);\n\n/*\n * @private\n */\n\nexport function parseISODate(s) {\n  return parse(\n    s,\n    [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n    [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset],\n    [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime],\n    [isoTimeCombinedRegex, extractISOTimeAndOffset]\n  );\n}\n\nexport function parseRFC2822Date(s) {\n  return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]);\n}\n\nexport function parseHTTPDate(s) {\n  return parse(\n    s,\n    [rfc1123, extractRFC1123Or850],\n    [rfc850, extractRFC1123Or850],\n    [ascii, extractASCII]\n  );\n}\n\nexport function parseISODuration(s) {\n  return parse(s, [isoDuration, extractISODuration]);\n}\n\nconst extractISOTimeOnly = combineExtractors(extractISOTime);\n\nexport function parseISOTimeOnly(s) {\n  return parse(s, [isoTimeOnly, extractISOTimeOnly]);\n}\n\nconst sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex);\nconst sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex);\n\nconst extractISOTimeOffsetAndIANAZone = combineExtractors(\n  extractISOTime,\n  extractISOOffset,\n  extractIANAZone\n);\n\nexport function parseSQL(s) {\n  return parse(\n    s,\n    [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n    [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]\n  );\n}\n","import { InvalidArgumentError, InvalidDurationError, InvalidUnitError } from \"./errors.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Locale from \"./impl/locale.js\";\nimport { parseISODuration, parseISOTimeOnly } from \"./impl/regexParser.js\";\nimport {\n  asNumber,\n  hasOwnProperty,\n  isNumber,\n  isUndefined,\n  normalizeObject,\n  roundTo,\n} from \"./impl/util.js\";\nimport Settings from \"./settings.js\";\nimport DateTime from \"./datetime.js\";\n\nconst INVALID = \"Invalid Duration\";\n\n// unit conversion constants\nexport const lowOrderMatrix = {\n    weeks: {\n      days: 7,\n      hours: 7 * 24,\n      minutes: 7 * 24 * 60,\n      seconds: 7 * 24 * 60 * 60,\n      milliseconds: 7 * 24 * 60 * 60 * 1000,\n    },\n    days: {\n      hours: 24,\n      minutes: 24 * 60,\n      seconds: 24 * 60 * 60,\n      milliseconds: 24 * 60 * 60 * 1000,\n    },\n    hours: { minutes: 60, seconds: 60 * 60, milliseconds: 60 * 60 * 1000 },\n    minutes: { seconds: 60, milliseconds: 60 * 1000 },\n    seconds: { milliseconds: 1000 },\n  },\n  casualMatrix = {\n    years: {\n      quarters: 4,\n      months: 12,\n      weeks: 52,\n      days: 365,\n      hours: 365 * 24,\n      minutes: 365 * 24 * 60,\n      seconds: 365 * 24 * 60 * 60,\n      milliseconds: 365 * 24 * 60 * 60 * 1000,\n    },\n    quarters: {\n      months: 3,\n      weeks: 13,\n      days: 91,\n      hours: 91 * 24,\n      minutes: 91 * 24 * 60,\n      seconds: 91 * 24 * 60 * 60,\n      milliseconds: 91 * 24 * 60 * 60 * 1000,\n    },\n    months: {\n      weeks: 4,\n      days: 30,\n      hours: 30 * 24,\n      minutes: 30 * 24 * 60,\n      seconds: 30 * 24 * 60 * 60,\n      milliseconds: 30 * 24 * 60 * 60 * 1000,\n    },\n\n    ...lowOrderMatrix,\n  },\n  daysInYearAccurate = 146097.0 / 400,\n  daysInMonthAccurate = 146097.0 / 4800,\n  accurateMatrix = {\n    years: {\n      quarters: 4,\n      months: 12,\n      weeks: daysInYearAccurate / 7,\n      days: daysInYearAccurate,\n      hours: daysInYearAccurate * 24,\n      minutes: daysInYearAccurate * 24 * 60,\n      seconds: daysInYearAccurate * 24 * 60 * 60,\n      milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000,\n    },\n    quarters: {\n      months: 3,\n      weeks: daysInYearAccurate / 28,\n      days: daysInYearAccurate / 4,\n      hours: (daysInYearAccurate * 24) / 4,\n      minutes: (daysInYearAccurate * 24 * 60) / 4,\n      seconds: (daysInYearAccurate * 24 * 60 * 60) / 4,\n      milliseconds: (daysInYearAccurate * 24 * 60 * 60 * 1000) / 4,\n    },\n    months: {\n      weeks: daysInMonthAccurate / 7,\n      days: daysInMonthAccurate,\n      hours: daysInMonthAccurate * 24,\n      minutes: daysInMonthAccurate * 24 * 60,\n      seconds: daysInMonthAccurate * 24 * 60 * 60,\n      milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000,\n    },\n    ...lowOrderMatrix,\n  };\n\n// units ordered by size\nconst orderedUnits = [\n  \"years\",\n  \"quarters\",\n  \"months\",\n  \"weeks\",\n  \"days\",\n  \"hours\",\n  \"minutes\",\n  \"seconds\",\n  \"milliseconds\",\n];\n\nconst reverseUnits = orderedUnits.slice(0).reverse();\n\n// clone really means \"create another instance just like this one, but with these changes\"\nfunction clone(dur, alts, clear = false) {\n  // deep merge for vals\n  const conf = {\n    values: clear ? alts.values : { ...dur.values, ...(alts.values || {}) },\n    loc: dur.loc.clone(alts.loc),\n    conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy,\n    matrix: alts.matrix || dur.matrix,\n  };\n  return new Duration(conf);\n}\n\nfunction durationToMillis(matrix, vals) {\n  let sum = vals.milliseconds ?? 0;\n  for (const unit of reverseUnits.slice(1)) {\n    if (vals[unit]) {\n      sum += vals[unit] * matrix[unit][\"milliseconds\"];\n    }\n  }\n  return sum;\n}\n\n// NB: mutates parameters\nfunction normalizeValues(matrix, vals) {\n  // the logic below assumes the overall value of the duration is positive\n  // if this is not the case, factor is used to make it so\n  const factor = durationToMillis(matrix, vals) < 0 ? -1 : 1;\n\n  orderedUnits.reduceRight((previous, current) => {\n    if (!isUndefined(vals[current])) {\n      if (previous) {\n        const previousVal = vals[previous] * factor;\n        const conv = matrix[current][previous];\n\n        // if (previousVal < 0):\n        // lower order unit is negative (e.g. { years: 2, days: -2 })\n        // normalize this by reducing the higher order unit by the appropriate amount\n        // and increasing the lower order unit\n        // this can never make the higher order unit negative, because this function only operates\n        // on positive durations, so the amount of time represented by the lower order unit cannot\n        // be larger than the higher order unit\n        // else:\n        // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 })\n        // in this case we attempt to convert as much as possible from the lower order unit into\n        // the higher order one\n        //\n        // Math.floor takes care of both of these cases, rounding away from 0\n        // if previousVal < 0 it makes the absolute value larger\n        // if previousVal >= it makes the absolute value smaller\n        const rollUp = Math.floor(previousVal / conv);\n        vals[current] += rollUp * factor;\n        vals[previous] -= rollUp * conv * factor;\n      }\n      return current;\n    } else {\n      return previous;\n    }\n  }, null);\n\n  // try to convert any decimals into smaller units if possible\n  // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 }\n  orderedUnits.reduce((previous, current) => {\n    if (!isUndefined(vals[current])) {\n      if (previous) {\n        const fraction = vals[previous] % 1;\n        vals[previous] -= fraction;\n        vals[current] += fraction * matrix[previous][current];\n      }\n      return current;\n    } else {\n      return previous;\n    }\n  }, null);\n}\n\n// Remove all properties with a value of 0 from an object\nfunction removeZeroes(vals) {\n  const newVals = {};\n  for (const [key, value] of Object.entries(vals)) {\n    if (value !== 0) {\n      newVals[key] = value;\n    }\n  }\n  return newVals;\n}\n\n/**\n * A Duration object represents a period of time, like \"2 months\" or \"1 day, 1 hour\". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime.\n *\n * Here is a brief overview of commonly used methods and getters in Duration:\n *\n * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}.\n * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors.\n * * **Configuration** See  {@link Duration#locale} and {@link Duration#numberingSystem} accessors.\n * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}.\n * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON}\n *\n * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation.\n */\nexport default class Duration {\n  /**\n   * @private\n   */\n  constructor(config) {\n    const accurate = config.conversionAccuracy === \"longterm\" || false;\n    let matrix = accurate ? accurateMatrix : casualMatrix;\n\n    if (config.matrix) {\n      matrix = config.matrix;\n    }\n\n    /**\n     * @access private\n     */\n    this.values = config.values;\n    /**\n     * @access private\n     */\n    this.loc = config.loc || Locale.create();\n    /**\n     * @access private\n     */\n    this.conversionAccuracy = accurate ? \"longterm\" : \"casual\";\n    /**\n     * @access private\n     */\n    this.invalid = config.invalid || null;\n    /**\n     * @access private\n     */\n    this.matrix = matrix;\n    /**\n     * @access private\n     */\n    this.isLuxonDuration = true;\n  }\n\n  /**\n   * Create Duration from a number of milliseconds.\n   * @param {number} count of milliseconds\n   * @param {Object} opts - options for parsing\n   * @param {string} [opts.locale='en-US'] - the locale to use\n   * @param {string} opts.numberingSystem - the numbering system to use\n   * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n   * @return {Duration}\n   */\n  static fromMillis(count, opts) {\n    return Duration.fromObject({ milliseconds: count }, opts);\n  }\n\n  /**\n   * Create a Duration from a JavaScript object with keys like 'years' and 'hours'.\n   * If this object is empty then a zero milliseconds duration is returned.\n   * @param {Object} obj - the object to create the DateTime from\n   * @param {number} obj.years\n   * @param {number} obj.quarters\n   * @param {number} obj.months\n   * @param {number} obj.weeks\n   * @param {number} obj.days\n   * @param {number} obj.hours\n   * @param {number} obj.minutes\n   * @param {number} obj.seconds\n   * @param {number} obj.milliseconds\n   * @param {Object} [opts=[]] - options for creating this Duration\n   * @param {string} [opts.locale='en-US'] - the locale to use\n   * @param {string} opts.numberingSystem - the numbering system to use\n   * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n   * @param {string} [opts.matrix=Object] - the custom conversion system to use\n   * @return {Duration}\n   */\n  static fromObject(obj, opts = {}) {\n    if (obj == null || typeof obj !== \"object\") {\n      throw new InvalidArgumentError(\n        `Duration.fromObject: argument expected to be an object, got ${\n          obj === null ? \"null\" : typeof obj\n        }`\n      );\n    }\n\n    return new Duration({\n      values: normalizeObject(obj, Duration.normalizeUnit),\n      loc: Locale.fromObject(opts),\n      conversionAccuracy: opts.conversionAccuracy,\n      matrix: opts.matrix,\n    });\n  }\n\n  /**\n   * Create a Duration from DurationLike.\n   *\n   * @param {Object | number | Duration} durationLike\n   * One of:\n   * - object with keys like 'years' and 'hours'.\n   * - number representing milliseconds\n   * - Duration instance\n   * @return {Duration}\n   */\n  static fromDurationLike(durationLike) {\n    if (isNumber(durationLike)) {\n      return Duration.fromMillis(durationLike);\n    } else if (Duration.isDuration(durationLike)) {\n      return durationLike;\n    } else if (typeof durationLike === \"object\") {\n      return Duration.fromObject(durationLike);\n    } else {\n      throw new InvalidArgumentError(\n        `Unknown duration argument ${durationLike} of type ${typeof durationLike}`\n      );\n    }\n  }\n\n  /**\n   * Create a Duration from an ISO 8601 duration string.\n   * @param {string} text - text to parse\n   * @param {Object} opts - options for parsing\n   * @param {string} [opts.locale='en-US'] - the locale to use\n   * @param {string} opts.numberingSystem - the numbering system to use\n   * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n   * @param {string} [opts.matrix=Object] - the preset conversion system to use\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n   * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 }\n   * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 }\n   * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 }\n   * @return {Duration}\n   */\n  static fromISO(text, opts) {\n    const [parsed] = parseISODuration(text);\n    if (parsed) {\n      return Duration.fromObject(parsed, opts);\n    } else {\n      return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n    }\n  }\n\n  /**\n   * Create a Duration from an ISO 8601 time string.\n   * @param {string} text - text to parse\n   * @param {Object} opts - options for parsing\n   * @param {string} [opts.locale='en-US'] - the locale to use\n   * @param {string} opts.numberingSystem - the numbering system to use\n   * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n   * @param {string} [opts.matrix=Object] - the conversion system to use\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n   * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 }\n   * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n   * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n   * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n   * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n   * @return {Duration}\n   */\n  static fromISOTime(text, opts) {\n    const [parsed] = parseISOTimeOnly(text);\n    if (parsed) {\n      return Duration.fromObject(parsed, opts);\n    } else {\n      return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n    }\n  }\n\n  /**\n   * Create an invalid Duration.\n   * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent\n   * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n   * @return {Duration}\n   */\n  static invalid(reason, explanation = null) {\n    if (!reason) {\n      throw new InvalidArgumentError(\"need to specify a reason the Duration is invalid\");\n    }\n\n    const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n    if (Settings.throwOnInvalid) {\n      throw new InvalidDurationError(invalid);\n    } else {\n      return new Duration({ invalid });\n    }\n  }\n\n  /**\n   * @private\n   */\n  static normalizeUnit(unit) {\n    const normalized = {\n      year: \"years\",\n      years: \"years\",\n      quarter: \"quarters\",\n      quarters: \"quarters\",\n      month: \"months\",\n      months: \"months\",\n      week: \"weeks\",\n      weeks: \"weeks\",\n      day: \"days\",\n      days: \"days\",\n      hour: \"hours\",\n      hours: \"hours\",\n      minute: \"minutes\",\n      minutes: \"minutes\",\n      second: \"seconds\",\n      seconds: \"seconds\",\n      millisecond: \"milliseconds\",\n      milliseconds: \"milliseconds\",\n    }[unit ? unit.toLowerCase() : unit];\n\n    if (!normalized) throw new InvalidUnitError(unit);\n\n    return normalized;\n  }\n\n  /**\n   * Check if an object is a Duration. Works across context boundaries\n   * @param {object} o\n   * @return {boolean}\n   */\n  static isDuration(o) {\n    return (o && o.isLuxonDuration) || false;\n  }\n\n  /**\n   * Get  the locale of a Duration, such 'en-GB'\n   * @type {string}\n   */\n  get locale() {\n    return this.isValid ? this.loc.locale : null;\n  }\n\n  /**\n   * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration\n   *\n   * @type {string}\n   */\n  get numberingSystem() {\n    return this.isValid ? this.loc.numberingSystem : null;\n  }\n\n  /**\n   * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens:\n   * * `S` for milliseconds\n   * * `s` for seconds\n   * * `m` for minutes\n   * * `h` for hours\n   * * `d` for days\n   * * `w` for weeks\n   * * `M` for months\n   * * `y` for years\n   * Notes:\n   * * Add padding by repeating the token, e.g. \"yy\" pads the years to two digits, \"hhhh\" pads the hours out to four digits\n   * * Tokens can be escaped by wrapping with single quotes.\n   * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting.\n   * @param {string} fmt - the format string\n   * @param {Object} opts - options\n   * @param {boolean} [opts.floor=true] - floor numerical values\n   * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"y d s\") //=> \"1 6 2\"\n   * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"yy dd sss\") //=> \"01 06 002\"\n   * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"M S\") //=> \"12 518402000\"\n   * @return {string}\n   */\n  toFormat(fmt, opts = {}) {\n    // reverse-compat since 1.2; we always round down now, never up, and we do it by default\n    const fmtOpts = {\n      ...opts,\n      floor: opts.round !== false && opts.floor !== false,\n    };\n    return this.isValid\n      ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt)\n      : INVALID;\n  }\n\n  /**\n   * Returns a string representation of a Duration with all units included.\n   * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant.\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options\n   * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`.\n   * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor.\n   * @example\n   * ```js\n   * var dur = Duration.fromObject({ days: 1, hours: 5, minutes: 6 })\n   * dur.toHuman() //=> '1 day, 5 hours, 6 minutes'\n   * dur.toHuman({ listStyle: \"long\" }) //=> '1 day, 5 hours, and 6 minutes'\n   * dur.toHuman({ unitDisplay: \"short\" }) //=> '1 day, 5 hr, 6 min'\n   * ```\n   */\n  toHuman(opts = {}) {\n    if (!this.isValid) return INVALID;\n\n    const l = orderedUnits\n      .map((unit) => {\n        const val = this.values[unit];\n        if (isUndefined(val)) {\n          return null;\n        }\n        return this.loc\n          .numberFormatter({ style: \"unit\", unitDisplay: \"long\", ...opts, unit: unit.slice(0, -1) })\n          .format(val);\n      })\n      .filter((n) => n);\n\n    return this.loc\n      .listFormatter({ type: \"conjunction\", style: opts.listStyle || \"narrow\", ...opts })\n      .format(l);\n  }\n\n  /**\n   * Returns a JavaScript object with this Duration's values.\n   * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 }\n   * @return {Object}\n   */\n  toObject() {\n    if (!this.isValid) return {};\n    return { ...this.values };\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this Duration.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n   * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S'\n   * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S'\n   * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M'\n   * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M'\n   * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S'\n   * @return {string}\n   */\n  toISO() {\n    // we could use the formatter, but this is an easier way to get the minimum string\n    if (!this.isValid) return null;\n\n    let s = \"P\";\n    if (this.years !== 0) s += this.years + \"Y\";\n    if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + \"M\";\n    if (this.weeks !== 0) s += this.weeks + \"W\";\n    if (this.days !== 0) s += this.days + \"D\";\n    if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0)\n      s += \"T\";\n    if (this.hours !== 0) s += this.hours + \"H\";\n    if (this.minutes !== 0) s += this.minutes + \"M\";\n    if (this.seconds !== 0 || this.milliseconds !== 0)\n      // this will handle \"floating point madness\" by removing extra decimal places\n      // https://stackoverflow.com/questions/588004/is-floating-point-math-broken\n      s += roundTo(this.seconds + this.milliseconds / 1000, 3) + \"S\";\n    if (s === \"P\") s += \"T0S\";\n    return s;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day.\n   * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n   * @param {Object} opts - options\n   * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n   * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n   * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n   * @param {string} [opts.format='extended'] - choose between the basic and extended format\n   * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000'\n   * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00'\n   * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00'\n   * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000'\n   * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000'\n   * @return {string}\n   */\n  toISOTime(opts = {}) {\n    if (!this.isValid) return null;\n\n    const millis = this.toMillis();\n    if (millis < 0 || millis >= 86400000) return null;\n\n    opts = {\n      suppressMilliseconds: false,\n      suppressSeconds: false,\n      includePrefix: false,\n      format: \"extended\",\n      ...opts,\n      includeOffset: false,\n    };\n\n    const dateTime = DateTime.fromMillis(millis, { zone: \"UTC\" });\n    return dateTime.toISOTime(opts);\n  }\n\n  /**\n   * Returns an ISO 8601 representation of this Duration appropriate for use in JSON.\n   * @return {string}\n   */\n  toJSON() {\n    return this.toISO();\n  }\n\n  /**\n   * Returns an ISO 8601 representation of this Duration appropriate for use in debugging.\n   * @return {string}\n   */\n  toString() {\n    return this.toISO();\n  }\n\n  /**\n   * Returns a string representation of this Duration appropriate for the REPL.\n   * @return {string}\n   */\n  [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n    if (this.isValid) {\n      return `Duration { values: ${JSON.stringify(this.values)} }`;\n    } else {\n      return `Duration { Invalid, reason: ${this.invalidReason} }`;\n    }\n  }\n\n  /**\n   * Returns an milliseconds value of this Duration.\n   * @return {number}\n   */\n  toMillis() {\n    if (!this.isValid) return NaN;\n\n    return durationToMillis(this.matrix, this.values);\n  }\n\n  /**\n   * Returns an milliseconds value of this Duration. Alias of {@link toMillis}\n   * @return {number}\n   */\n  valueOf() {\n    return this.toMillis();\n  }\n\n  /**\n   * Make this Duration longer by the specified amount. Return a newly-constructed Duration.\n   * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n   * @return {Duration}\n   */\n  plus(duration) {\n    if (!this.isValid) return this;\n\n    const dur = Duration.fromDurationLike(duration),\n      result = {};\n\n    for (const k of orderedUnits) {\n      if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) {\n        result[k] = dur.get(k) + this.get(k);\n      }\n    }\n\n    return clone(this, { values: result }, true);\n  }\n\n  /**\n   * Make this Duration shorter by the specified amount. Return a newly-constructed Duration.\n   * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n   * @return {Duration}\n   */\n  minus(duration) {\n    if (!this.isValid) return this;\n\n    const dur = Duration.fromDurationLike(duration);\n    return this.plus(dur.negate());\n  }\n\n  /**\n   * Scale this Duration by the specified amount. Return a newly-constructed Duration.\n   * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number.\n   * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 }\n   * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === \"hours\" ? x * 2 : x) //=> { hours: 2, minutes: 30 }\n   * @return {Duration}\n   */\n  mapUnits(fn) {\n    if (!this.isValid) return this;\n    const result = {};\n    for (const k of Object.keys(this.values)) {\n      result[k] = asNumber(fn(this.values[k], k));\n    }\n    return clone(this, { values: result }, true);\n  }\n\n  /**\n   * Get the value of unit.\n   * @param {string} unit - a unit such as 'minute' or 'day'\n   * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2\n   * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0\n   * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3\n   * @return {number}\n   */\n  get(unit) {\n    return this[Duration.normalizeUnit(unit)];\n  }\n\n  /**\n   * \"Set\" the values of specified units. Return a newly-constructed Duration.\n   * @param {Object} values - a mapping of units to numbers\n   * @example dur.set({ years: 2017 })\n   * @example dur.set({ hours: 8, minutes: 30 })\n   * @return {Duration}\n   */\n  set(values) {\n    if (!this.isValid) return this;\n\n    const mixed = { ...this.values, ...normalizeObject(values, Duration.normalizeUnit) };\n    return clone(this, { values: mixed });\n  }\n\n  /**\n   * \"Set\" the locale and/or numberingSystem.  Returns a newly-constructed Duration.\n   * @example dur.reconfigure({ locale: 'en-GB' })\n   * @return {Duration}\n   */\n  reconfigure({ locale, numberingSystem, conversionAccuracy, matrix } = {}) {\n    const loc = this.loc.clone({ locale, numberingSystem });\n    const opts = { loc, matrix, conversionAccuracy };\n    return clone(this, opts);\n  }\n\n  /**\n   * Return the length of the duration in the specified unit.\n   * @param {string} unit - a unit such as 'minutes' or 'days'\n   * @example Duration.fromObject({years: 1}).as('days') //=> 365\n   * @example Duration.fromObject({years: 1}).as('months') //=> 12\n   * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5\n   * @return {number}\n   */\n  as(unit) {\n    return this.isValid ? this.shiftTo(unit).get(unit) : NaN;\n  }\n\n  /**\n   * Reduce this Duration to its canonical representation in its current units.\n   * Assuming the overall value of the Duration is positive, this means:\n   * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example)\n   * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise\n   *   the overall value would be negative, see third example)\n   * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example)\n   *\n   * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`.\n   * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 }\n   * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 }\n   * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 }\n   * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 }\n   * @return {Duration}\n   */\n  normalize() {\n    if (!this.isValid) return this;\n    const vals = this.toObject();\n    normalizeValues(this.matrix, vals);\n    return clone(this, { values: vals }, true);\n  }\n\n  /**\n   * Rescale units to its largest representation\n   * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 }\n   * @return {Duration}\n   */\n  rescale() {\n    if (!this.isValid) return this;\n    const vals = removeZeroes(this.normalize().shiftToAll().toObject());\n    return clone(this, { values: vals }, true);\n  }\n\n  /**\n   * Convert this Duration into its representation in a different set of units.\n   * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 }\n   * @return {Duration}\n   */\n  shiftTo(...units) {\n    if (!this.isValid) return this;\n\n    if (units.length === 0) {\n      return this;\n    }\n\n    units = units.map((u) => Duration.normalizeUnit(u));\n\n    const built = {},\n      accumulated = {},\n      vals = this.toObject();\n    let lastUnit;\n\n    for (const k of orderedUnits) {\n      if (units.indexOf(k) >= 0) {\n        lastUnit = k;\n\n        let own = 0;\n\n        // anything we haven't boiled down yet should get boiled to this unit\n        for (const ak in accumulated) {\n          own += this.matrix[ak][k] * accumulated[ak];\n          accumulated[ak] = 0;\n        }\n\n        // plus anything that's already in this unit\n        if (isNumber(vals[k])) {\n          own += vals[k];\n        }\n\n        // only keep the integer part for now in the hopes of putting any decimal part\n        // into a smaller unit later\n        const i = Math.trunc(own);\n        built[k] = i;\n        accumulated[k] = (own * 1000 - i * 1000) / 1000;\n\n        // otherwise, keep it in the wings to boil it later\n      } else if (isNumber(vals[k])) {\n        accumulated[k] = vals[k];\n      }\n    }\n\n    // anything leftover becomes the decimal for the last unit\n    // lastUnit must be defined since units is not empty\n    for (const key in accumulated) {\n      if (accumulated[key] !== 0) {\n        built[lastUnit] +=\n          key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key];\n      }\n    }\n\n    normalizeValues(this.matrix, built);\n    return clone(this, { values: built }, true);\n  }\n\n  /**\n   * Shift this Duration to all available units.\n   * Same as shiftTo(\"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", \"seconds\", \"milliseconds\")\n   * @return {Duration}\n   */\n  shiftToAll() {\n    if (!this.isValid) return this;\n    return this.shiftTo(\n      \"years\",\n      \"months\",\n      \"weeks\",\n      \"days\",\n      \"hours\",\n      \"minutes\",\n      \"seconds\",\n      \"milliseconds\"\n    );\n  }\n\n  /**\n   * Return the negative of this Duration.\n   * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 }\n   * @return {Duration}\n   */\n  negate() {\n    if (!this.isValid) return this;\n    const negated = {};\n    for (const k of Object.keys(this.values)) {\n      negated[k] = this.values[k] === 0 ? 0 : -this.values[k];\n    }\n    return clone(this, { values: negated }, true);\n  }\n\n  /**\n   * Get the years.\n   * @type {number}\n   */\n  get years() {\n    return this.isValid ? this.values.years || 0 : NaN;\n  }\n\n  /**\n   * Get the quarters.\n   * @type {number}\n   */\n  get quarters() {\n    return this.isValid ? this.values.quarters || 0 : NaN;\n  }\n\n  /**\n   * Get the months.\n   * @type {number}\n   */\n  get months() {\n    return this.isValid ? this.values.months || 0 : NaN;\n  }\n\n  /**\n   * Get the weeks\n   * @type {number}\n   */\n  get weeks() {\n    return this.isValid ? this.values.weeks || 0 : NaN;\n  }\n\n  /**\n   * Get the days.\n   * @type {number}\n   */\n  get days() {\n    return this.isValid ? this.values.days || 0 : NaN;\n  }\n\n  /**\n   * Get the hours.\n   * @type {number}\n   */\n  get hours() {\n    return this.isValid ? this.values.hours || 0 : NaN;\n  }\n\n  /**\n   * Get the minutes.\n   * @type {number}\n   */\n  get minutes() {\n    return this.isValid ? this.values.minutes || 0 : NaN;\n  }\n\n  /**\n   * Get the seconds.\n   * @return {number}\n   */\n  get seconds() {\n    return this.isValid ? this.values.seconds || 0 : NaN;\n  }\n\n  /**\n   * Get the milliseconds.\n   * @return {number}\n   */\n  get milliseconds() {\n    return this.isValid ? this.values.milliseconds || 0 : NaN;\n  }\n\n  /**\n   * Returns whether the Duration is invalid. Invalid durations are returned by diff operations\n   * on invalid DateTimes or Intervals.\n   * @return {boolean}\n   */\n  get isValid() {\n    return this.invalid === null;\n  }\n\n  /**\n   * Returns an error code if this Duration became invalid, or null if the Duration is valid\n   * @return {string}\n   */\n  get invalidReason() {\n    return this.invalid ? this.invalid.reason : null;\n  }\n\n  /**\n   * Returns an explanation of why this Duration became invalid, or null if the Duration is valid\n   * @type {string}\n   */\n  get invalidExplanation() {\n    return this.invalid ? this.invalid.explanation : null;\n  }\n\n  /**\n   * Equality check\n   * Two Durations are equal iff they have the same units and the same values for each unit.\n   * @param {Duration} other\n   * @return {boolean}\n   */\n  equals(other) {\n    if (!this.isValid || !other.isValid) {\n      return false;\n    }\n\n    if (!this.loc.equals(other.loc)) {\n      return false;\n    }\n\n    function eq(v1, v2) {\n      // Consider 0 and undefined as equal\n      if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0;\n      return v1 === v2;\n    }\n\n    for (const u of orderedUnits) {\n      if (!eq(this.values[u], other.values[u])) {\n        return false;\n      }\n    }\n    return true;\n  }\n}\n","import DateTime, { friendlyDateTime } from \"./datetime.js\";\nimport Duration from \"./duration.js\";\nimport Settings from \"./settings.js\";\nimport { InvalidArgumentError, InvalidIntervalError } from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport * as Formats from \"./impl/formats.js\";\n\nconst INVALID = \"Invalid Interval\";\n\n// checks if the start is equal to or before the end\nfunction validateStartEnd(start, end) {\n  if (!start || !start.isValid) {\n    return Interval.invalid(\"missing or invalid start\");\n  } else if (!end || !end.isValid) {\n    return Interval.invalid(\"missing or invalid end\");\n  } else if (end < start) {\n    return Interval.invalid(\n      \"end before start\",\n      `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`\n    );\n  } else {\n    return null;\n  }\n}\n\n/**\n * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them.\n *\n * Here is a brief overview of the most commonly used methods and getters in Interval:\n *\n * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}.\n * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end.\n * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}.\n * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}.\n * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs}\n * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}.\n */\nexport default class Interval {\n  /**\n   * @private\n   */\n  constructor(config) {\n    /**\n     * @access private\n     */\n    this.s = config.start;\n    /**\n     * @access private\n     */\n    this.e = config.end;\n    /**\n     * @access private\n     */\n    this.invalid = config.invalid || null;\n    /**\n     * @access private\n     */\n    this.isLuxonInterval = true;\n  }\n\n  /**\n   * Create an invalid Interval.\n   * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent\n   * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n   * @return {Interval}\n   */\n  static invalid(reason, explanation = null) {\n    if (!reason) {\n      throw new InvalidArgumentError(\"need to specify a reason the Interval is invalid\");\n    }\n\n    const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n    if (Settings.throwOnInvalid) {\n      throw new InvalidIntervalError(invalid);\n    } else {\n      return new Interval({ invalid });\n    }\n  }\n\n  /**\n   * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end.\n   * @param {DateTime|Date|Object} start\n   * @param {DateTime|Date|Object} end\n   * @return {Interval}\n   */\n  static fromDateTimes(start, end) {\n    const builtStart = friendlyDateTime(start),\n      builtEnd = friendlyDateTime(end);\n\n    const validateError = validateStartEnd(builtStart, builtEnd);\n\n    if (validateError == null) {\n      return new Interval({\n        start: builtStart,\n        end: builtEnd,\n      });\n    } else {\n      return validateError;\n    }\n  }\n\n  /**\n   * Create an Interval from a start DateTime and a Duration to extend to.\n   * @param {DateTime|Date|Object} start\n   * @param {Duration|Object|number} duration - the length of the Interval.\n   * @return {Interval}\n   */\n  static after(start, duration) {\n    const dur = Duration.fromDurationLike(duration),\n      dt = friendlyDateTime(start);\n    return Interval.fromDateTimes(dt, dt.plus(dur));\n  }\n\n  /**\n   * Create an Interval from an end DateTime and a Duration to extend backwards to.\n   * @param {DateTime|Date|Object} end\n   * @param {Duration|Object|number} duration - the length of the Interval.\n   * @return {Interval}\n   */\n  static before(end, duration) {\n    const dur = Duration.fromDurationLike(duration),\n      dt = friendlyDateTime(end);\n    return Interval.fromDateTimes(dt.minus(dur), dt);\n  }\n\n  /**\n   * Create an Interval from an ISO 8601 string.\n   * Accepts `<start>/<end>`, `<start>/<duration>`, and `<duration>/<end>` formats.\n   * @param {string} text - the ISO string to parse\n   * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO}\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n   * @return {Interval}\n   */\n  static fromISO(text, opts) {\n    const [s, e] = (text || \"\").split(\"/\", 2);\n    if (s && e) {\n      let start, startIsValid;\n      try {\n        start = DateTime.fromISO(s, opts);\n        startIsValid = start.isValid;\n      } catch (e) {\n        startIsValid = false;\n      }\n\n      let end, endIsValid;\n      try {\n        end = DateTime.fromISO(e, opts);\n        endIsValid = end.isValid;\n      } catch (e) {\n        endIsValid = false;\n      }\n\n      if (startIsValid && endIsValid) {\n        return Interval.fromDateTimes(start, end);\n      }\n\n      if (startIsValid) {\n        const dur = Duration.fromISO(e, opts);\n        if (dur.isValid) {\n          return Interval.after(start, dur);\n        }\n      } else if (endIsValid) {\n        const dur = Duration.fromISO(s, opts);\n        if (dur.isValid) {\n          return Interval.before(end, dur);\n        }\n      }\n    }\n    return Interval.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n  }\n\n  /**\n   * Check if an object is an Interval. Works across context boundaries\n   * @param {object} o\n   * @return {boolean}\n   */\n  static isInterval(o) {\n    return (o && o.isLuxonInterval) || false;\n  }\n\n  /**\n   * Returns the start of the Interval\n   * @type {DateTime}\n   */\n  get start() {\n    return this.isValid ? this.s : null;\n  }\n\n  /**\n   * Returns the end of the Interval\n   * @type {DateTime}\n   */\n  get end() {\n    return this.isValid ? this.e : null;\n  }\n\n  /**\n   * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'.\n   * @type {boolean}\n   */\n  get isValid() {\n    return this.invalidReason === null;\n  }\n\n  /**\n   * Returns an error code if this Interval is invalid, or null if the Interval is valid\n   * @type {string}\n   */\n  get invalidReason() {\n    return this.invalid ? this.invalid.reason : null;\n  }\n\n  /**\n   * Returns an explanation of why this Interval became invalid, or null if the Interval is valid\n   * @type {string}\n   */\n  get invalidExplanation() {\n    return this.invalid ? this.invalid.explanation : null;\n  }\n\n  /**\n   * Returns the length of the Interval in the specified unit.\n   * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in.\n   * @return {number}\n   */\n  length(unit = \"milliseconds\") {\n    return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN;\n  }\n\n  /**\n   * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part.\n   * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day'\n   * asks 'what dates are included in this interval?', not 'how many days long is this interval?'\n   * @param {string} [unit='milliseconds'] - the unit of time to count.\n   * @param {Object} opts - options\n   * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime\n   * @return {number}\n   */\n  count(unit = \"milliseconds\", opts) {\n    if (!this.isValid) return NaN;\n    const start = this.start.startOf(unit, opts);\n    let end;\n    if (opts?.useLocaleWeeks) {\n      end = this.end.reconfigure({ locale: start.locale });\n    } else {\n      end = this.end;\n    }\n    end = end.startOf(unit, opts);\n    return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf());\n  }\n\n  /**\n   * Returns whether this Interval's start and end are both in the same unit of time\n   * @param {string} unit - the unit of time to check sameness on\n   * @return {boolean}\n   */\n  hasSame(unit) {\n    return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false;\n  }\n\n  /**\n   * Return whether this Interval has the same start and end DateTimes.\n   * @return {boolean}\n   */\n  isEmpty() {\n    return this.s.valueOf() === this.e.valueOf();\n  }\n\n  /**\n   * Return whether this Interval's start is after the specified DateTime.\n   * @param {DateTime} dateTime\n   * @return {boolean}\n   */\n  isAfter(dateTime) {\n    if (!this.isValid) return false;\n    return this.s > dateTime;\n  }\n\n  /**\n   * Return whether this Interval's end is before the specified DateTime.\n   * @param {DateTime} dateTime\n   * @return {boolean}\n   */\n  isBefore(dateTime) {\n    if (!this.isValid) return false;\n    return this.e <= dateTime;\n  }\n\n  /**\n   * Return whether this Interval contains the specified DateTime.\n   * @param {DateTime} dateTime\n   * @return {boolean}\n   */\n  contains(dateTime) {\n    if (!this.isValid) return false;\n    return this.s <= dateTime && this.e > dateTime;\n  }\n\n  /**\n   * \"Sets\" the start and/or end dates. Returns a newly-constructed Interval.\n   * @param {Object} values - the values to set\n   * @param {DateTime} values.start - the starting DateTime\n   * @param {DateTime} values.end - the ending DateTime\n   * @return {Interval}\n   */\n  set({ start, end } = {}) {\n    if (!this.isValid) return this;\n    return Interval.fromDateTimes(start || this.s, end || this.e);\n  }\n\n  /**\n   * Split this Interval at each of the specified DateTimes\n   * @param {...DateTime} dateTimes - the unit of time to count.\n   * @return {Array}\n   */\n  splitAt(...dateTimes) {\n    if (!this.isValid) return [];\n    const sorted = dateTimes\n        .map(friendlyDateTime)\n        .filter((d) => this.contains(d))\n        .sort((a, b) => a.toMillis() - b.toMillis()),\n      results = [];\n    let { s } = this,\n      i = 0;\n\n    while (s < this.e) {\n      const added = sorted[i] || this.e,\n        next = +added > +this.e ? this.e : added;\n      results.push(Interval.fromDateTimes(s, next));\n      s = next;\n      i += 1;\n    }\n\n    return results;\n  }\n\n  /**\n   * Split this Interval into smaller Intervals, each of the specified length.\n   * Left over time is grouped into a smaller interval\n   * @param {Duration|Object|number} duration - The length of each resulting interval.\n   * @return {Array}\n   */\n  splitBy(duration) {\n    const dur = Duration.fromDurationLike(duration);\n\n    if (!this.isValid || !dur.isValid || dur.as(\"milliseconds\") === 0) {\n      return [];\n    }\n\n    let { s } = this,\n      idx = 1,\n      next;\n\n    const results = [];\n    while (s < this.e) {\n      const added = this.start.plus(dur.mapUnits((x) => x * idx));\n      next = +added > +this.e ? this.e : added;\n      results.push(Interval.fromDateTimes(s, next));\n      s = next;\n      idx += 1;\n    }\n\n    return results;\n  }\n\n  /**\n   * Split this Interval into the specified number of smaller intervals.\n   * @param {number} numberOfParts - The number of Intervals to divide the Interval into.\n   * @return {Array}\n   */\n  divideEqually(numberOfParts) {\n    if (!this.isValid) return [];\n    return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts);\n  }\n\n  /**\n   * Return whether this Interval overlaps with the specified Interval\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  overlaps(other) {\n    return this.e > other.s && this.s < other.e;\n  }\n\n  /**\n   * Return whether this Interval's end is adjacent to the specified Interval's start.\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  abutsStart(other) {\n    if (!this.isValid) return false;\n    return +this.e === +other.s;\n  }\n\n  /**\n   * Return whether this Interval's start is adjacent to the specified Interval's end.\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  abutsEnd(other) {\n    if (!this.isValid) return false;\n    return +other.e === +this.s;\n  }\n\n  /**\n   * Return whether this Interval engulfs the start and end of the specified Interval.\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  engulfs(other) {\n    if (!this.isValid) return false;\n    return this.s <= other.s && this.e >= other.e;\n  }\n\n  /**\n   * Return whether this Interval has the same start and end as the specified Interval.\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  equals(other) {\n    if (!this.isValid || !other.isValid) {\n      return false;\n    }\n\n    return this.s.equals(other.s) && this.e.equals(other.e);\n  }\n\n  /**\n   * Return an Interval representing the intersection of this Interval and the specified Interval.\n   * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals.\n   * Returns null if the intersection is empty, meaning, the intervals don't intersect.\n   * @param {Interval} other\n   * @return {Interval}\n   */\n  intersection(other) {\n    if (!this.isValid) return this;\n    const s = this.s > other.s ? this.s : other.s,\n      e = this.e < other.e ? this.e : other.e;\n\n    if (s >= e) {\n      return null;\n    } else {\n      return Interval.fromDateTimes(s, e);\n    }\n  }\n\n  /**\n   * Return an Interval representing the union of this Interval and the specified Interval.\n   * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals.\n   * @param {Interval} other\n   * @return {Interval}\n   */\n  union(other) {\n    if (!this.isValid) return this;\n    const s = this.s < other.s ? this.s : other.s,\n      e = this.e > other.e ? this.e : other.e;\n    return Interval.fromDateTimes(s, e);\n  }\n\n  /**\n   * Merge an array of Intervals into a equivalent minimal set of Intervals.\n   * Combines overlapping and adjacent Intervals.\n   * @param {Array} intervals\n   * @return {Array}\n   */\n  static merge(intervals) {\n    const [found, final] = intervals\n      .sort((a, b) => a.s - b.s)\n      .reduce(\n        ([sofar, current], item) => {\n          if (!current) {\n            return [sofar, item];\n          } else if (current.overlaps(item) || current.abutsStart(item)) {\n            return [sofar, current.union(item)];\n          } else {\n            return [sofar.concat([current]), item];\n          }\n        },\n        [[], null]\n      );\n    if (final) {\n      found.push(final);\n    }\n    return found;\n  }\n\n  /**\n   * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals.\n   * @param {Array} intervals\n   * @return {Array}\n   */\n  static xor(intervals) {\n    let start = null,\n      currentCount = 0;\n    const results = [],\n      ends = intervals.map((i) => [\n        { time: i.s, type: \"s\" },\n        { time: i.e, type: \"e\" },\n      ]),\n      flattened = Array.prototype.concat(...ends),\n      arr = flattened.sort((a, b) => a.time - b.time);\n\n    for (const i of arr) {\n      currentCount += i.type === \"s\" ? 1 : -1;\n\n      if (currentCount === 1) {\n        start = i.time;\n      } else {\n        if (start && +start !== +i.time) {\n          results.push(Interval.fromDateTimes(start, i.time));\n        }\n\n        start = null;\n      }\n    }\n\n    return Interval.merge(results);\n  }\n\n  /**\n   * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals.\n   * @param {...Interval} intervals\n   * @return {Array}\n   */\n  difference(...intervals) {\n    return Interval.xor([this].concat(intervals))\n      .map((i) => this.intersection(i))\n      .filter((i) => i && !i.isEmpty());\n  }\n\n  /**\n   * Returns a string representation of this Interval appropriate for debugging.\n   * @return {string}\n   */\n  toString() {\n    if (!this.isValid) return INVALID;\n    return `[${this.s.toISO()} – ${this.e.toISO()})`;\n  }\n\n  /**\n   * Returns a string representation of this Interval appropriate for the REPL.\n   * @return {string}\n   */\n  [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n    if (this.isValid) {\n      return `Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`;\n    } else {\n      return `Interval { Invalid, reason: ${this.invalidReason} }`;\n    }\n  }\n\n  /**\n   * Returns a localized string representing this Interval. Accepts the same options as the\n   * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as\n   * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method\n   * is browser-specific, but in general it will return an appropriate representation of the\n   * Interval in the assigned locale. Defaults to the system's locale if no locale has been\n   * specified.\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n   * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or\n   * Intl.DateTimeFormat constructor options.\n   * @param {Object} opts - Options to override the configuration of the start DateTime.\n   * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022\n   * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022\n   * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022\n   * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM\n   * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p\n   * @return {string}\n   */\n  toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n    return this.isValid\n      ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this)\n      : INVALID;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this Interval.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n   * @param {Object} opts - The same options as {@link DateTime#toISO}\n   * @return {string}\n   */\n  toISO(opts) {\n    if (!this.isValid) return INVALID;\n    return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of date of this Interval.\n   * The time components are ignored.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n   * @return {string}\n   */\n  toISODate() {\n    if (!this.isValid) return INVALID;\n    return `${this.s.toISODate()}/${this.e.toISODate()}`;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of time of this Interval.\n   * The date components are ignored.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n   * @param {Object} opts - The same options as {@link DateTime#toISO}\n   * @return {string}\n   */\n  toISOTime(opts) {\n    if (!this.isValid) return INVALID;\n    return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`;\n  }\n\n  /**\n   * Returns a string representation of this Interval formatted according to the specified format\n   * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible\n   * formatting tool.\n   * @param {string} dateFormat - The format string. This string formats the start and end time.\n   * See {@link DateTime#toFormat} for details.\n   * @param {Object} opts - Options.\n   * @param {string} [opts.separator =  ' – '] - A separator to place between the start and end\n   * representations.\n   * @return {string}\n   */\n  toFormat(dateFormat, { separator = \" – \" } = {}) {\n    if (!this.isValid) return INVALID;\n    return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`;\n  }\n\n  /**\n   * Return a Duration representing the time spanned by this interval.\n   * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration.\n   * @param {Object} opts - options that affect the creation of the Duration\n   * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 }\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 }\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 }\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 }\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 }\n   * @return {Duration}\n   */\n  toDuration(unit, opts) {\n    if (!this.isValid) {\n      return Duration.invalid(this.invalidReason);\n    }\n    return this.e.diff(this.s, unit, opts);\n  }\n\n  /**\n   * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes\n   * @param {function} mapFn\n   * @return {Interval}\n   * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC())\n   * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 }))\n   */\n  mapEndpoints(mapFn) {\n    return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e));\n  }\n}\n","import DateTime from \"./datetime.js\";\nimport Settings from \"./settings.js\";\nimport Locale from \"./impl/locale.js\";\nimport IANAZone from \"./zones/IANAZone.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\n\nimport { hasLocaleWeekInfo, hasRelative } from \"./impl/util.js\";\n\n/**\n * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment.\n */\nexport default class Info {\n  /**\n   * Return whether the specified zone contains a DST.\n   * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone.\n   * @return {boolean}\n   */\n  static hasDST(zone = Settings.defaultZone) {\n    const proto = DateTime.now().setZone(zone).set({ month: 12 });\n\n    return !zone.isUniversal && proto.offset !== proto.set({ month: 6 }).offset;\n  }\n\n  /**\n   * Return whether the specified zone is a valid IANA specifier.\n   * @param {string} zone - Zone to check\n   * @return {boolean}\n   */\n  static isValidIANAZone(zone) {\n    return IANAZone.isValidZone(zone);\n  }\n\n  /**\n   * Converts the input into a {@link Zone} instance.\n   *\n   * * If `input` is already a Zone instance, it is returned unchanged.\n   * * If `input` is a string containing a valid time zone name, a Zone instance\n   *   with that name is returned.\n   * * If `input` is a string that doesn't refer to a known time zone, a Zone\n   *   instance with {@link Zone#isValid} == false is returned.\n   * * If `input is a number, a Zone instance with the specified fixed offset\n   *   in minutes is returned.\n   * * If `input` is `null` or `undefined`, the default zone is returned.\n   * @param {string|Zone|number} [input] - the value to be converted\n   * @return {Zone}\n   */\n  static normalizeZone(input) {\n    return normalizeZone(input, Settings.defaultZone);\n  }\n\n  /**\n   * Get the weekday on which the week starts according to the given locale.\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @returns {number} the start of the week, 1 for Monday through 7 for Sunday\n   */\n  static getStartOfWeek({ locale = null, locObj = null } = {}) {\n    return (locObj || Locale.create(locale)).getStartOfWeek();\n  }\n\n  /**\n   * Get the minimum number of days necessary in a week before it is considered part of the next year according\n   * to the given locale.\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @returns {number}\n   */\n  static getMinimumDaysInFirstWeek({ locale = null, locObj = null } = {}) {\n    return (locObj || Locale.create(locale)).getMinDaysInFirstWeek();\n  }\n\n  /**\n   * Get the weekdays, which are considered the weekend according to the given locale\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday\n   */\n  static getWeekendWeekdays({ locale = null, locObj = null } = {}) {\n    // copy the array, because we cache it internally\n    return (locObj || Locale.create(locale)).getWeekendDays().slice();\n  }\n\n  /**\n   * Return an array of standalone month names.\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n   * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.numberingSystem=null] - the numbering system\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @param {string} [opts.outputCalendar='gregory'] - the calendar\n   * @example Info.months()[0] //=> 'January'\n   * @example Info.months('short')[0] //=> 'Jan'\n   * @example Info.months('numeric')[0] //=> '1'\n   * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.'\n   * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١'\n   * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I'\n   * @return {Array}\n   */\n  static months(\n    length = \"long\",\n    { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n  ) {\n    return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length);\n  }\n\n  /**\n   * Return an array of format month names.\n   * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that\n   * changes the string.\n   * See {@link Info#months}\n   * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.numberingSystem=null] - the numbering system\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @param {string} [opts.outputCalendar='gregory'] - the calendar\n   * @return {Array}\n   */\n  static monthsFormat(\n    length = \"long\",\n    { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n  ) {\n    return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true);\n  }\n\n  /**\n   * Return an array of standalone week names.\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n   * @param {string} [length='long'] - the length of the weekday representation, such as \"narrow\", \"short\", \"long\".\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.numberingSystem=null] - the numbering system\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @example Info.weekdays()[0] //=> 'Monday'\n   * @example Info.weekdays('short')[0] //=> 'Mon'\n   * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.'\n   * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين'\n   * @return {Array}\n   */\n  static weekdays(length = \"long\", { locale = null, numberingSystem = null, locObj = null } = {}) {\n    return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length);\n  }\n\n  /**\n   * Return an array of format week names.\n   * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that\n   * changes the string.\n   * See {@link Info#weekdays}\n   * @param {string} [length='long'] - the length of the month representation, such as \"narrow\", \"short\", \"long\".\n   * @param {Object} opts - options\n   * @param {string} [opts.locale=null] - the locale code\n   * @param {string} [opts.numberingSystem=null] - the numbering system\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @return {Array}\n   */\n  static weekdaysFormat(\n    length = \"long\",\n    { locale = null, numberingSystem = null, locObj = null } = {}\n  ) {\n    return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true);\n  }\n\n  /**\n   * Return an array of meridiems.\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @example Info.meridiems() //=> [ 'AM', 'PM' ]\n   * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ]\n   * @return {Array}\n   */\n  static meridiems({ locale = null } = {}) {\n    return Locale.create(locale).meridiems();\n  }\n\n  /**\n   * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian.\n   * @param {string} [length='short'] - the length of the era representation, such as \"short\" or \"long\".\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @example Info.eras() //=> [ 'BC', 'AD' ]\n   * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ]\n   * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ]\n   * @return {Array}\n   */\n  static eras(length = \"short\", { locale = null } = {}) {\n    return Locale.create(locale, null, \"gregory\").eras(length);\n  }\n\n  /**\n   * Return the set of available features in this environment.\n   * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case.\n   * Keys:\n   * * `relative`: whether this environment supports relative time formatting\n   * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale\n   * @example Info.features() //=> { relative: false, localeWeek: true }\n   * @return {Object}\n   */\n  static features() {\n    return { relative: hasRelative(), localeWeek: hasLocaleWeekInfo() };\n  }\n}\n","import Duration from \"../duration.js\";\n\nfunction dayDiff(earlier, later) {\n  const utcDayStart = (dt) => dt.toUTC(0, { keepLocalTime: true }).startOf(\"day\").valueOf(),\n    ms = utcDayStart(later) - utcDayStart(earlier);\n  return Math.floor(Duration.fromMillis(ms).as(\"days\"));\n}\n\nfunction highOrderDiffs(cursor, later, units) {\n  const differs = [\n    [\"years\", (a, b) => b.year - a.year],\n    [\"quarters\", (a, b) => b.quarter - a.quarter + (b.year - a.year) * 4],\n    [\"months\", (a, b) => b.month - a.month + (b.year - a.year) * 12],\n    [\n      \"weeks\",\n      (a, b) => {\n        const days = dayDiff(a, b);\n        return (days - (days % 7)) / 7;\n      },\n    ],\n    [\"days\", dayDiff],\n  ];\n\n  const results = {};\n  const earlier = cursor;\n  let lowestOrder, highWater;\n\n  /* This loop tries to diff using larger units first.\n     If we overshoot, we backtrack and try the next smaller unit.\n     \"cursor\" starts out at the earlier timestamp and moves closer and closer to \"later\"\n     as we use smaller and smaller units.\n     highWater keeps track of where we would be if we added one more of the smallest unit,\n     this is used later to potentially convert any difference smaller than the smallest higher order unit\n     into a fraction of that smallest higher order unit\n  */\n  for (const [unit, differ] of differs) {\n    if (units.indexOf(unit) >= 0) {\n      lowestOrder = unit;\n\n      results[unit] = differ(cursor, later);\n      highWater = earlier.plus(results);\n\n      if (highWater > later) {\n        // we overshot the end point, backtrack cursor by 1\n        results[unit]--;\n        cursor = earlier.plus(results);\n\n        // if we are still overshooting now, we need to backtrack again\n        // this happens in certain situations when diffing times in different zones,\n        // because this calculation ignores time zones\n        if (cursor > later) {\n          // keep the \"overshot by 1\" around as highWater\n          highWater = cursor;\n          // backtrack cursor by 1\n          results[unit]--;\n          cursor = earlier.plus(results);\n        }\n      } else {\n        cursor = highWater;\n      }\n    }\n  }\n\n  return [cursor, results, highWater, lowestOrder];\n}\n\nexport default function (earlier, later, units, opts) {\n  let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units);\n\n  const remainingMillis = later - cursor;\n\n  const lowerOrderUnits = units.filter(\n    (u) => [\"hours\", \"minutes\", \"seconds\", \"milliseconds\"].indexOf(u) >= 0\n  );\n\n  if (lowerOrderUnits.length === 0) {\n    if (highWater < later) {\n      highWater = cursor.plus({ [lowestOrder]: 1 });\n    }\n\n    if (highWater !== cursor) {\n      results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor);\n    }\n  }\n\n  const duration = Duration.fromObject(results, opts);\n\n  if (lowerOrderUnits.length > 0) {\n    return Duration.fromMillis(remainingMillis, opts)\n      .shiftTo(...lowerOrderUnits)\n      .plus(duration);\n  } else {\n    return duration;\n  }\n}\n","const numberingSystems = {\n  arab: \"[\\u0660-\\u0669]\",\n  arabext: \"[\\u06F0-\\u06F9]\",\n  bali: \"[\\u1B50-\\u1B59]\",\n  beng: \"[\\u09E6-\\u09EF]\",\n  deva: \"[\\u0966-\\u096F]\",\n  fullwide: \"[\\uFF10-\\uFF19]\",\n  gujr: \"[\\u0AE6-\\u0AEF]\",\n  hanidec: \"[〇|一|二|三|四|五|六|七|八|九]\",\n  khmr: \"[\\u17E0-\\u17E9]\",\n  knda: \"[\\u0CE6-\\u0CEF]\",\n  laoo: \"[\\u0ED0-\\u0ED9]\",\n  limb: \"[\\u1946-\\u194F]\",\n  mlym: \"[\\u0D66-\\u0D6F]\",\n  mong: \"[\\u1810-\\u1819]\",\n  mymr: \"[\\u1040-\\u1049]\",\n  orya: \"[\\u0B66-\\u0B6F]\",\n  tamldec: \"[\\u0BE6-\\u0BEF]\",\n  telu: \"[\\u0C66-\\u0C6F]\",\n  thai: \"[\\u0E50-\\u0E59]\",\n  tibt: \"[\\u0F20-\\u0F29]\",\n  latn: \"\\\\d\",\n};\n\nconst numberingSystemsUTF16 = {\n  arab: [1632, 1641],\n  arabext: [1776, 1785],\n  bali: [6992, 7001],\n  beng: [2534, 2543],\n  deva: [2406, 2415],\n  fullwide: [65296, 65303],\n  gujr: [2790, 2799],\n  khmr: [6112, 6121],\n  knda: [3302, 3311],\n  laoo: [3792, 3801],\n  limb: [6470, 6479],\n  mlym: [3430, 3439],\n  mong: [6160, 6169],\n  mymr: [4160, 4169],\n  orya: [2918, 2927],\n  tamldec: [3046, 3055],\n  telu: [3174, 3183],\n  thai: [3664, 3673],\n  tibt: [3872, 3881],\n};\n\nconst hanidecChars = numberingSystems.hanidec.replace(/[\\[|\\]]/g, \"\").split(\"\");\n\nexport function parseDigits(str) {\n  let value = parseInt(str, 10);\n  if (isNaN(value)) {\n    value = \"\";\n    for (let i = 0; i < str.length; i++) {\n      const code = str.charCodeAt(i);\n\n      if (str[i].search(numberingSystems.hanidec) !== -1) {\n        value += hanidecChars.indexOf(str[i]);\n      } else {\n        for (const key in numberingSystemsUTF16) {\n          const [min, max] = numberingSystemsUTF16[key];\n          if (code >= min && code <= max) {\n            value += code - min;\n          }\n        }\n      }\n    }\n    return parseInt(value, 10);\n  } else {\n    return value;\n  }\n}\n\nexport function digitRegex({ numberingSystem }, append = \"\") {\n  return new RegExp(`${numberingSystems[numberingSystem || \"latn\"]}${append}`);\n}\n","import { parseMillis, isUndefined, untruncateYear, signedOffset, hasOwnProperty } from \"./util.js\";\nimport Formatter from \"./formatter.js\";\nimport FixedOffsetZone from \"../zones/fixedOffsetZone.js\";\nimport IANAZone from \"../zones/IANAZone.js\";\nimport DateTime from \"../datetime.js\";\nimport { digitRegex, parseDigits } from \"./digits.js\";\nimport { ConflictingSpecificationError } from \"../errors.js\";\n\nconst MISSING_FTP = \"missing Intl.DateTimeFormat.formatToParts support\";\n\nfunction intUnit(regex, post = (i) => i) {\n  return { regex, deser: ([s]) => post(parseDigits(s)) };\n}\n\nconst NBSP = String.fromCharCode(160);\nconst spaceOrNBSP = `[ ${NBSP}]`;\nconst spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, \"g\");\n\nfunction fixListRegex(s) {\n  // make dots optional and also make them literal\n  // make space and non breakable space characters interchangeable\n  return s.replace(/\\./g, \"\\\\.?\").replace(spaceOrNBSPRegExp, spaceOrNBSP);\n}\n\nfunction stripInsensitivities(s) {\n  return s\n    .replace(/\\./g, \"\") // ignore dots that were made optional\n    .replace(spaceOrNBSPRegExp, \" \") // interchange space and nbsp\n    .toLowerCase();\n}\n\nfunction oneOf(strings, startIndex) {\n  if (strings === null) {\n    return null;\n  } else {\n    return {\n      regex: RegExp(strings.map(fixListRegex).join(\"|\")),\n      deser: ([s]) =>\n        strings.findIndex((i) => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex,\n    };\n  }\n}\n\nfunction offset(regex, groups) {\n  return { regex, deser: ([, h, m]) => signedOffset(h, m), groups };\n}\n\nfunction simple(regex) {\n  return { regex, deser: ([s]) => s };\n}\n\nfunction escapeToken(value) {\n  return value.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\n}\n\n/**\n * @param token\n * @param {Locale} loc\n */\nfunction unitForToken(token, loc) {\n  const one = digitRegex(loc),\n    two = digitRegex(loc, \"{2}\"),\n    three = digitRegex(loc, \"{3}\"),\n    four = digitRegex(loc, \"{4}\"),\n    six = digitRegex(loc, \"{6}\"),\n    oneOrTwo = digitRegex(loc, \"{1,2}\"),\n    oneToThree = digitRegex(loc, \"{1,3}\"),\n    oneToSix = digitRegex(loc, \"{1,6}\"),\n    oneToNine = digitRegex(loc, \"{1,9}\"),\n    twoToFour = digitRegex(loc, \"{2,4}\"),\n    fourToSix = digitRegex(loc, \"{4,6}\"),\n    literal = (t) => ({ regex: RegExp(escapeToken(t.val)), deser: ([s]) => s, literal: true }),\n    unitate = (t) => {\n      if (token.literal) {\n        return literal(t);\n      }\n      switch (t.val) {\n        // era\n        case \"G\":\n          return oneOf(loc.eras(\"short\"), 0);\n        case \"GG\":\n          return oneOf(loc.eras(\"long\"), 0);\n        // years\n        case \"y\":\n          return intUnit(oneToSix);\n        case \"yy\":\n          return intUnit(twoToFour, untruncateYear);\n        case \"yyyy\":\n          return intUnit(four);\n        case \"yyyyy\":\n          return intUnit(fourToSix);\n        case \"yyyyyy\":\n          return intUnit(six);\n        // months\n        case \"M\":\n          return intUnit(oneOrTwo);\n        case \"MM\":\n          return intUnit(two);\n        case \"MMM\":\n          return oneOf(loc.months(\"short\", true), 1);\n        case \"MMMM\":\n          return oneOf(loc.months(\"long\", true), 1);\n        case \"L\":\n          return intUnit(oneOrTwo);\n        case \"LL\":\n          return intUnit(two);\n        case \"LLL\":\n          return oneOf(loc.months(\"short\", false), 1);\n        case \"LLLL\":\n          return oneOf(loc.months(\"long\", false), 1);\n        // dates\n        case \"d\":\n          return intUnit(oneOrTwo);\n        case \"dd\":\n          return intUnit(two);\n        // ordinals\n        case \"o\":\n          return intUnit(oneToThree);\n        case \"ooo\":\n          return intUnit(three);\n        // time\n        case \"HH\":\n          return intUnit(two);\n        case \"H\":\n          return intUnit(oneOrTwo);\n        case \"hh\":\n          return intUnit(two);\n        case \"h\":\n          return intUnit(oneOrTwo);\n        case \"mm\":\n          return intUnit(two);\n        case \"m\":\n          return intUnit(oneOrTwo);\n        case \"q\":\n          return intUnit(oneOrTwo);\n        case \"qq\":\n          return intUnit(two);\n        case \"s\":\n          return intUnit(oneOrTwo);\n        case \"ss\":\n          return intUnit(two);\n        case \"S\":\n          return intUnit(oneToThree);\n        case \"SSS\":\n          return intUnit(three);\n        case \"u\":\n          return simple(oneToNine);\n        case \"uu\":\n          return simple(oneOrTwo);\n        case \"uuu\":\n          return intUnit(one);\n        // meridiem\n        case \"a\":\n          return oneOf(loc.meridiems(), 0);\n        // weekYear (k)\n        case \"kkkk\":\n          return intUnit(four);\n        case \"kk\":\n          return intUnit(twoToFour, untruncateYear);\n        // weekNumber (W)\n        case \"W\":\n          return intUnit(oneOrTwo);\n        case \"WW\":\n          return intUnit(two);\n        // weekdays\n        case \"E\":\n        case \"c\":\n          return intUnit(one);\n        case \"EEE\":\n          return oneOf(loc.weekdays(\"short\", false), 1);\n        case \"EEEE\":\n          return oneOf(loc.weekdays(\"long\", false), 1);\n        case \"ccc\":\n          return oneOf(loc.weekdays(\"short\", true), 1);\n        case \"cccc\":\n          return oneOf(loc.weekdays(\"long\", true), 1);\n        // offset/zone\n        case \"Z\":\n        case \"ZZ\":\n          return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2);\n        case \"ZZZ\":\n          return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2);\n        // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing\n        // because we don't have any way to figure out what they are\n        case \"z\":\n          return simple(/[a-z_+-/]{1,256}?/i);\n        // this special-case \"token\" represents a place where a macro-token expanded into a white-space literal\n        // in this case we accept any non-newline white-space\n        case \" \":\n          return simple(/[^\\S\\n\\r]/);\n        default:\n          return literal(t);\n      }\n    };\n\n  const unit = unitate(token) || {\n    invalidReason: MISSING_FTP,\n  };\n\n  unit.token = token;\n\n  return unit;\n}\n\nconst partTypeStyleToTokenVal = {\n  year: {\n    \"2-digit\": \"yy\",\n    numeric: \"yyyyy\",\n  },\n  month: {\n    numeric: \"M\",\n    \"2-digit\": \"MM\",\n    short: \"MMM\",\n    long: \"MMMM\",\n  },\n  day: {\n    numeric: \"d\",\n    \"2-digit\": \"dd\",\n  },\n  weekday: {\n    short: \"EEE\",\n    long: \"EEEE\",\n  },\n  dayperiod: \"a\",\n  dayPeriod: \"a\",\n  hour12: {\n    numeric: \"h\",\n    \"2-digit\": \"hh\",\n  },\n  hour24: {\n    numeric: \"H\",\n    \"2-digit\": \"HH\",\n  },\n  minute: {\n    numeric: \"m\",\n    \"2-digit\": \"mm\",\n  },\n  second: {\n    numeric: \"s\",\n    \"2-digit\": \"ss\",\n  },\n  timeZoneName: {\n    long: \"ZZZZZ\",\n    short: \"ZZZ\",\n  },\n};\n\nfunction tokenForPart(part, formatOpts, resolvedOpts) {\n  const { type, value } = part;\n\n  if (type === \"literal\") {\n    const isSpace = /^\\s+$/.test(value);\n    return {\n      literal: !isSpace,\n      val: isSpace ? \" \" : value,\n    };\n  }\n\n  const style = formatOpts[type];\n\n  // The user might have explicitly specified hour12 or hourCycle\n  // if so, respect their decision\n  // if not, refer back to the resolvedOpts, which are based on the locale\n  let actualType = type;\n  if (type === \"hour\") {\n    if (formatOpts.hour12 != null) {\n      actualType = formatOpts.hour12 ? \"hour12\" : \"hour24\";\n    } else if (formatOpts.hourCycle != null) {\n      if (formatOpts.hourCycle === \"h11\" || formatOpts.hourCycle === \"h12\") {\n        actualType = \"hour12\";\n      } else {\n        actualType = \"hour24\";\n      }\n    } else {\n      // tokens only differentiate between 24 hours or not,\n      // so we do not need to check hourCycle here, which is less supported anyways\n      actualType = resolvedOpts.hour12 ? \"hour12\" : \"hour24\";\n    }\n  }\n  let val = partTypeStyleToTokenVal[actualType];\n  if (typeof val === \"object\") {\n    val = val[style];\n  }\n\n  if (val) {\n    return {\n      literal: false,\n      val,\n    };\n  }\n\n  return undefined;\n}\n\nfunction buildRegex(units) {\n  const re = units.map((u) => u.regex).reduce((f, r) => `${f}(${r.source})`, \"\");\n  return [`^${re}$`, units];\n}\n\nfunction match(input, regex, handlers) {\n  const matches = input.match(regex);\n\n  if (matches) {\n    const all = {};\n    let matchIndex = 1;\n    for (const i in handlers) {\n      if (hasOwnProperty(handlers, i)) {\n        const h = handlers[i],\n          groups = h.groups ? h.groups + 1 : 1;\n        if (!h.literal && h.token) {\n          all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups));\n        }\n        matchIndex += groups;\n      }\n    }\n    return [matches, all];\n  } else {\n    return [matches, {}];\n  }\n}\n\nfunction dateTimeFromMatches(matches) {\n  const toField = (token) => {\n    switch (token) {\n      case \"S\":\n        return \"millisecond\";\n      case \"s\":\n        return \"second\";\n      case \"m\":\n        return \"minute\";\n      case \"h\":\n      case \"H\":\n        return \"hour\";\n      case \"d\":\n        return \"day\";\n      case \"o\":\n        return \"ordinal\";\n      case \"L\":\n      case \"M\":\n        return \"month\";\n      case \"y\":\n        return \"year\";\n      case \"E\":\n      case \"c\":\n        return \"weekday\";\n      case \"W\":\n        return \"weekNumber\";\n      case \"k\":\n        return \"weekYear\";\n      case \"q\":\n        return \"quarter\";\n      default:\n        return null;\n    }\n  };\n\n  let zone = null;\n  let specificOffset;\n  if (!isUndefined(matches.z)) {\n    zone = IANAZone.create(matches.z);\n  }\n\n  if (!isUndefined(matches.Z)) {\n    if (!zone) {\n      zone = new FixedOffsetZone(matches.Z);\n    }\n    specificOffset = matches.Z;\n  }\n\n  if (!isUndefined(matches.q)) {\n    matches.M = (matches.q - 1) * 3 + 1;\n  }\n\n  if (!isUndefined(matches.h)) {\n    if (matches.h < 12 && matches.a === 1) {\n      matches.h += 12;\n    } else if (matches.h === 12 && matches.a === 0) {\n      matches.h = 0;\n    }\n  }\n\n  if (matches.G === 0 && matches.y) {\n    matches.y = -matches.y;\n  }\n\n  if (!isUndefined(matches.u)) {\n    matches.S = parseMillis(matches.u);\n  }\n\n  const vals = Object.keys(matches).reduce((r, k) => {\n    const f = toField(k);\n    if (f) {\n      r[f] = matches[k];\n    }\n\n    return r;\n  }, {});\n\n  return [vals, zone, specificOffset];\n}\n\nlet dummyDateTimeCache = null;\n\nfunction getDummyDateTime() {\n  if (!dummyDateTimeCache) {\n    dummyDateTimeCache = DateTime.fromMillis(1555555555555);\n  }\n\n  return dummyDateTimeCache;\n}\n\nfunction maybeExpandMacroToken(token, locale) {\n  if (token.literal) {\n    return token;\n  }\n\n  const formatOpts = Formatter.macroTokenToFormatOpts(token.val);\n  const tokens = formatOptsToTokens(formatOpts, locale);\n\n  if (tokens == null || tokens.includes(undefined)) {\n    return token;\n  }\n\n  return tokens;\n}\n\nexport function expandMacroTokens(tokens, locale) {\n  return Array.prototype.concat(...tokens.map((t) => maybeExpandMacroToken(t, locale)));\n}\n\n/**\n * @private\n */\n\nexport function explainFromTokens(locale, input, format) {\n  const tokens = expandMacroTokens(Formatter.parseFormat(format), locale),\n    units = tokens.map((t) => unitForToken(t, locale)),\n    disqualifyingUnit = units.find((t) => t.invalidReason);\n\n  if (disqualifyingUnit) {\n    return { input, tokens, invalidReason: disqualifyingUnit.invalidReason };\n  } else {\n    const [regexString, handlers] = buildRegex(units),\n      regex = RegExp(regexString, \"i\"),\n      [rawMatches, matches] = match(input, regex, handlers),\n      [result, zone, specificOffset] = matches\n        ? dateTimeFromMatches(matches)\n        : [null, null, undefined];\n    if (hasOwnProperty(matches, \"a\") && hasOwnProperty(matches, \"H\")) {\n      throw new ConflictingSpecificationError(\n        \"Can't include meridiem when specifying 24-hour format\"\n      );\n    }\n    return { input, tokens, regex, rawMatches, matches, result, zone, specificOffset };\n  }\n}\n\nexport function parseFromTokens(locale, input, format) {\n  const { result, zone, specificOffset, invalidReason } = explainFromTokens(locale, input, format);\n  return [result, zone, specificOffset, invalidReason];\n}\n\nexport function formatOptsToTokens(formatOpts, locale) {\n  if (!formatOpts) {\n    return null;\n  }\n\n  const formatter = Formatter.create(locale, formatOpts);\n  const df = formatter.dtFormatter(getDummyDateTime());\n  const parts = df.formatToParts();\n  const resolvedOpts = df.resolvedOptions();\n  return parts.map((p) => tokenForPart(p, formatOpts, resolvedOpts));\n}\n","import Duration from \"./duration.js\";\nimport Interval from \"./interval.js\";\nimport Settings from \"./settings.js\";\nimport Info from \"./info.js\";\nimport Formatter from \"./impl/formatter.js\";\nimport FixedOffsetZone from \"./zones/fixedOffsetZone.js\";\nimport Locale from \"./impl/locale.js\";\nimport {\n  isUndefined,\n  maybeArray,\n  isDate,\n  isNumber,\n  bestBy,\n  daysInMonth,\n  daysInYear,\n  isLeapYear,\n  weeksInWeekYear,\n  normalizeObject,\n  roundTo,\n  objToLocalTS,\n  padStart,\n} from \"./impl/util.js\";\nimport { normalizeZone } from \"./impl/zoneUtil.js\";\nimport diff from \"./impl/diff.js\";\nimport { parseRFC2822Date, parseISODate, parseHTTPDate, parseSQL } from \"./impl/regexParser.js\";\nimport {\n  parseFromTokens,\n  explainFromTokens,\n  formatOptsToTokens,\n  expandMacroTokens,\n} from \"./impl/tokenParser.js\";\nimport {\n  gregorianToWeek,\n  weekToGregorian,\n  gregorianToOrdinal,\n  ordinalToGregorian,\n  hasInvalidGregorianData,\n  hasInvalidWeekData,\n  hasInvalidOrdinalData,\n  hasInvalidTimeData,\n  usesLocalWeekValues,\n  isoWeekdayToLocal,\n} from \"./impl/conversions.js\";\nimport * as Formats from \"./impl/formats.js\";\nimport {\n  InvalidArgumentError,\n  ConflictingSpecificationError,\n  InvalidUnitError,\n  InvalidDateTimeError,\n} from \"./errors.js\";\nimport Invalid from \"./impl/invalid.js\";\n\nconst INVALID = \"Invalid DateTime\";\nconst MAX_DATE = 8.64e15;\n\nfunction unsupportedZone(zone) {\n  return new Invalid(\"unsupported zone\", `the zone \"${zone.name}\" is not supported`);\n}\n\n// we cache week data on the DT object and this intermediates the cache\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedWeekData(dt) {\n  if (dt.weekData === null) {\n    dt.weekData = gregorianToWeek(dt.c);\n  }\n  return dt.weekData;\n}\n\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedLocalWeekData(dt) {\n  if (dt.localWeekData === null) {\n    dt.localWeekData = gregorianToWeek(\n      dt.c,\n      dt.loc.getMinDaysInFirstWeek(),\n      dt.loc.getStartOfWeek()\n    );\n  }\n  return dt.localWeekData;\n}\n\n// clone really means, \"make a new object with these modifications\". all \"setters\" really use this\n// to create a new object while only changing some of the properties\nfunction clone(inst, alts) {\n  const current = {\n    ts: inst.ts,\n    zone: inst.zone,\n    c: inst.c,\n    o: inst.o,\n    loc: inst.loc,\n    invalid: inst.invalid,\n  };\n  return new DateTime({ ...current, ...alts, old: current });\n}\n\n// find the right offset a given local time. The o input is our guess, which determines which\n// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST)\nfunction fixOffset(localTS, o, tz) {\n  // Our UTC time is just a guess because our offset is just a guess\n  let utcGuess = localTS - o * 60 * 1000;\n\n  // Test whether the zone matches the offset for this ts\n  const o2 = tz.offset(utcGuess);\n\n  // If so, offset didn't change and we're done\n  if (o === o2) {\n    return [utcGuess, o];\n  }\n\n  // If not, change the ts by the difference in the offset\n  utcGuess -= (o2 - o) * 60 * 1000;\n\n  // If that gives us the local time we want, we're done\n  const o3 = tz.offset(utcGuess);\n  if (o2 === o3) {\n    return [utcGuess, o2];\n  }\n\n  // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time\n  return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)];\n}\n\n// convert an epoch timestamp into a calendar object with the given offset\nfunction tsToObj(ts, offset) {\n  ts += offset * 60 * 1000;\n\n  const d = new Date(ts);\n\n  return {\n    year: d.getUTCFullYear(),\n    month: d.getUTCMonth() + 1,\n    day: d.getUTCDate(),\n    hour: d.getUTCHours(),\n    minute: d.getUTCMinutes(),\n    second: d.getUTCSeconds(),\n    millisecond: d.getUTCMilliseconds(),\n  };\n}\n\n// convert a calendar object to a epoch timestamp\nfunction objToTS(obj, offset, zone) {\n  return fixOffset(objToLocalTS(obj), offset, zone);\n}\n\n// create a new DT instance by adding a duration, adjusting for DSTs\nfunction adjustTime(inst, dur) {\n  const oPre = inst.o,\n    year = inst.c.year + Math.trunc(dur.years),\n    month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3,\n    c = {\n      ...inst.c,\n      year,\n      month,\n      day:\n        Math.min(inst.c.day, daysInMonth(year, month)) +\n        Math.trunc(dur.days) +\n        Math.trunc(dur.weeks) * 7,\n    },\n    millisToAdd = Duration.fromObject({\n      years: dur.years - Math.trunc(dur.years),\n      quarters: dur.quarters - Math.trunc(dur.quarters),\n      months: dur.months - Math.trunc(dur.months),\n      weeks: dur.weeks - Math.trunc(dur.weeks),\n      days: dur.days - Math.trunc(dur.days),\n      hours: dur.hours,\n      minutes: dur.minutes,\n      seconds: dur.seconds,\n      milliseconds: dur.milliseconds,\n    }).as(\"milliseconds\"),\n    localTS = objToLocalTS(c);\n\n  let [ts, o] = fixOffset(localTS, oPre, inst.zone);\n\n  if (millisToAdd !== 0) {\n    ts += millisToAdd;\n    // that could have changed the offset by going over a DST, but we want to keep the ts the same\n    o = inst.zone.offset(ts);\n  }\n\n  return { ts, o };\n}\n\n// helper useful in turning the results of parsing into real dates\n// by handling the zone options\nfunction parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) {\n  const { setZone, zone } = opts;\n  if ((parsed && Object.keys(parsed).length !== 0) || parsedZone) {\n    const interpretationZone = parsedZone || zone,\n      inst = DateTime.fromObject(parsed, {\n        ...opts,\n        zone: interpretationZone,\n        specificOffset,\n      });\n    return setZone ? inst : inst.setZone(zone);\n  } else {\n    return DateTime.invalid(\n      new Invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ${format}`)\n    );\n  }\n}\n\n// if you want to output a technical format (e.g. RFC 2822), this helper\n// helps handle the details\nfunction toTechFormat(dt, format, allowZ = true) {\n  return dt.isValid\n    ? Formatter.create(Locale.create(\"en-US\"), {\n        allowZ,\n        forceSimple: true,\n      }).formatDateTimeFromString(dt, format)\n    : null;\n}\n\nfunction toISODate(o, extended) {\n  const longFormat = o.c.year > 9999 || o.c.year < 0;\n  let c = \"\";\n  if (longFormat && o.c.year >= 0) c += \"+\";\n  c += padStart(o.c.year, longFormat ? 6 : 4);\n\n  if (extended) {\n    c += \"-\";\n    c += padStart(o.c.month);\n    c += \"-\";\n    c += padStart(o.c.day);\n  } else {\n    c += padStart(o.c.month);\n    c += padStart(o.c.day);\n  }\n  return c;\n}\n\nfunction toISOTime(\n  o,\n  extended,\n  suppressSeconds,\n  suppressMilliseconds,\n  includeOffset,\n  extendedZone\n) {\n  let c = padStart(o.c.hour);\n  if (extended) {\n    c += \":\";\n    c += padStart(o.c.minute);\n    if (o.c.millisecond !== 0 || o.c.second !== 0 || !suppressSeconds) {\n      c += \":\";\n    }\n  } else {\n    c += padStart(o.c.minute);\n  }\n\n  if (o.c.millisecond !== 0 || o.c.second !== 0 || !suppressSeconds) {\n    c += padStart(o.c.second);\n\n    if (o.c.millisecond !== 0 || !suppressMilliseconds) {\n      c += \".\";\n      c += padStart(o.c.millisecond, 3);\n    }\n  }\n\n  if (includeOffset) {\n    if (o.isOffsetFixed && o.offset === 0 && !extendedZone) {\n      c += \"Z\";\n    } else if (o.o < 0) {\n      c += \"-\";\n      c += padStart(Math.trunc(-o.o / 60));\n      c += \":\";\n      c += padStart(Math.trunc(-o.o % 60));\n    } else {\n      c += \"+\";\n      c += padStart(Math.trunc(o.o / 60));\n      c += \":\";\n      c += padStart(Math.trunc(o.o % 60));\n    }\n  }\n\n  if (extendedZone) {\n    c += \"[\" + o.zone.ianaName + \"]\";\n  }\n  return c;\n}\n\n// defaults for unspecified units in the supported calendars\nconst defaultUnitValues = {\n    month: 1,\n    day: 1,\n    hour: 0,\n    minute: 0,\n    second: 0,\n    millisecond: 0,\n  },\n  defaultWeekUnitValues = {\n    weekNumber: 1,\n    weekday: 1,\n    hour: 0,\n    minute: 0,\n    second: 0,\n    millisecond: 0,\n  },\n  defaultOrdinalUnitValues = {\n    ordinal: 1,\n    hour: 0,\n    minute: 0,\n    second: 0,\n    millisecond: 0,\n  };\n\n// Units in the supported calendars, sorted by bigness\nconst orderedUnits = [\"year\", \"month\", \"day\", \"hour\", \"minute\", \"second\", \"millisecond\"],\n  orderedWeekUnits = [\n    \"weekYear\",\n    \"weekNumber\",\n    \"weekday\",\n    \"hour\",\n    \"minute\",\n    \"second\",\n    \"millisecond\",\n  ],\n  orderedOrdinalUnits = [\"year\", \"ordinal\", \"hour\", \"minute\", \"second\", \"millisecond\"];\n\n// standardize case and plurality in units\nfunction normalizeUnit(unit) {\n  const normalized = {\n    year: \"year\",\n    years: \"year\",\n    month: \"month\",\n    months: \"month\",\n    day: \"day\",\n    days: \"day\",\n    hour: \"hour\",\n    hours: \"hour\",\n    minute: \"minute\",\n    minutes: \"minute\",\n    quarter: \"quarter\",\n    quarters: \"quarter\",\n    second: \"second\",\n    seconds: \"second\",\n    millisecond: \"millisecond\",\n    milliseconds: \"millisecond\",\n    weekday: \"weekday\",\n    weekdays: \"weekday\",\n    weeknumber: \"weekNumber\",\n    weeksnumber: \"weekNumber\",\n    weeknumbers: \"weekNumber\",\n    weekyear: \"weekYear\",\n    weekyears: \"weekYear\",\n    ordinal: \"ordinal\",\n  }[unit.toLowerCase()];\n\n  if (!normalized) throw new InvalidUnitError(unit);\n\n  return normalized;\n}\n\nfunction normalizeUnitWithLocalWeeks(unit) {\n  switch (unit.toLowerCase()) {\n    case \"localweekday\":\n    case \"localweekdays\":\n      return \"localWeekday\";\n    case \"localweeknumber\":\n    case \"localweeknumbers\":\n      return \"localWeekNumber\";\n    case \"localweekyear\":\n    case \"localweekyears\":\n      return \"localWeekYear\";\n    default:\n      return normalizeUnit(unit);\n  }\n}\n\n// this is a dumbed down version of fromObject() that runs about 60% faster\n// but doesn't do any validation, makes a bunch of assumptions about what units\n// are present, and so on.\nfunction quickDT(obj, opts) {\n  const zone = normalizeZone(opts.zone, Settings.defaultZone),\n    loc = Locale.fromObject(opts),\n    tsNow = Settings.now();\n\n  let ts, o;\n\n  // assume we have the higher-order units\n  if (!isUndefined(obj.year)) {\n    for (const u of orderedUnits) {\n      if (isUndefined(obj[u])) {\n        obj[u] = defaultUnitValues[u];\n      }\n    }\n\n    const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj);\n    if (invalid) {\n      return DateTime.invalid(invalid);\n    }\n\n    const offsetProvis = zone.offset(tsNow);\n    [ts, o] = objToTS(obj, offsetProvis, zone);\n  } else {\n    ts = tsNow;\n  }\n\n  return new DateTime({ ts, zone, loc, o });\n}\n\nfunction diffRelative(start, end, opts) {\n  const round = isUndefined(opts.round) ? true : opts.round,\n    format = (c, unit) => {\n      c = roundTo(c, round || opts.calendary ? 0 : 2, true);\n      const formatter = end.loc.clone(opts).relFormatter(opts);\n      return formatter.format(c, unit);\n    },\n    differ = (unit) => {\n      if (opts.calendary) {\n        if (!end.hasSame(start, unit)) {\n          return end.startOf(unit).diff(start.startOf(unit), unit).get(unit);\n        } else return 0;\n      } else {\n        return end.diff(start, unit).get(unit);\n      }\n    };\n\n  if (opts.unit) {\n    return format(differ(opts.unit), opts.unit);\n  }\n\n  for (const unit of opts.units) {\n    const count = differ(unit);\n    if (Math.abs(count) >= 1) {\n      return format(count, unit);\n    }\n  }\n  return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]);\n}\n\nfunction lastOpts(argList) {\n  let opts = {},\n    args;\n  if (argList.length > 0 && typeof argList[argList.length - 1] === \"object\") {\n    opts = argList[argList.length - 1];\n    args = Array.from(argList).slice(0, argList.length - 1);\n  } else {\n    args = Array.from(argList);\n  }\n  return [opts, args];\n}\n\n/**\n * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them.\n *\n * A DateTime comprises of:\n * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch.\n * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone).\n * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`.\n *\n * Here is a brief overview of the most commonly used functionality it provides:\n *\n * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}.\n * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month},\n * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors.\n * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors.\n * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors.\n * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}.\n * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}.\n *\n * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation.\n */\nexport default class DateTime {\n  /**\n   * @access private\n   */\n  constructor(config) {\n    const zone = config.zone || Settings.defaultZone;\n\n    let invalid =\n      config.invalid ||\n      (Number.isNaN(config.ts) ? new Invalid(\"invalid input\") : null) ||\n      (!zone.isValid ? unsupportedZone(zone) : null);\n    /**\n     * @access private\n     */\n    this.ts = isUndefined(config.ts) ? Settings.now() : config.ts;\n\n    let c = null,\n      o = null;\n    if (!invalid) {\n      const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone);\n\n      if (unchanged) {\n        [c, o] = [config.old.c, config.old.o];\n      } else {\n        const ot = zone.offset(this.ts);\n        c = tsToObj(this.ts, ot);\n        invalid = Number.isNaN(c.year) ? new Invalid(\"invalid input\") : null;\n        c = invalid ? null : c;\n        o = invalid ? null : ot;\n      }\n    }\n\n    /**\n     * @access private\n     */\n    this._zone = zone;\n    /**\n     * @access private\n     */\n    this.loc = config.loc || Locale.create();\n    /**\n     * @access private\n     */\n    this.invalid = invalid;\n    /**\n     * @access private\n     */\n    this.weekData = null;\n    /**\n     * @access private\n     */\n    this.localWeekData = null;\n    /**\n     * @access private\n     */\n    this.c = c;\n    /**\n     * @access private\n     */\n    this.o = o;\n    /**\n     * @access private\n     */\n    this.isLuxonDateTime = true;\n  }\n\n  // CONSTRUCT\n\n  /**\n   * Create a DateTime for the current instant, in the system's time zone.\n   *\n   * Use Settings to override these default values if needed.\n   * @example DateTime.now().toISO() //~> now in the ISO format\n   * @return {DateTime}\n   */\n  static now() {\n    return new DateTime({});\n  }\n\n  /**\n   * Create a local DateTime\n   * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used\n   * @param {number} [month=1] - The month, 1-indexed\n   * @param {number} [day=1] - The day of the month, 1-indexed\n   * @param {number} [hour=0] - The hour of the day, in 24-hour time\n   * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n   * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n   * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n   * @example DateTime.local()                                  //~> now\n   * @example DateTime.local({ zone: \"America/New_York\" })      //~> now, in US east coast time\n   * @example DateTime.local(2017)                              //~> 2017-01-01T00:00:00\n   * @example DateTime.local(2017, 3)                           //~> 2017-03-01T00:00:00\n   * @example DateTime.local(2017, 3, 12, { locale: \"fr\" })     //~> 2017-03-12T00:00:00, with a French locale\n   * @example DateTime.local(2017, 3, 12, 5)                    //~> 2017-03-12T05:00:00\n   * @example DateTime.local(2017, 3, 12, 5, { zone: \"utc\" })   //~> 2017-03-12T05:00:00, in UTC\n   * @example DateTime.local(2017, 3, 12, 5, 45)                //~> 2017-03-12T05:45:00\n   * @example DateTime.local(2017, 3, 12, 5, 45, 10)            //~> 2017-03-12T05:45:10\n   * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765)       //~> 2017-03-12T05:45:10.765\n   * @return {DateTime}\n   */\n  static local() {\n    const [opts, args] = lastOpts(arguments),\n      [year, month, day, hour, minute, second, millisecond] = args;\n    return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n  }\n\n  /**\n   * Create a DateTime in UTC\n   * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used\n   * @param {number} [month=1] - The month, 1-indexed\n   * @param {number} [day=1] - The day of the month\n   * @param {number} [hour=0] - The hour of the day, in 24-hour time\n   * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n   * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n   * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n   * @param {Object} options - configuration options for the DateTime\n   * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n   * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance\n   * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance\n   * @example DateTime.utc()                                              //~> now\n   * @example DateTime.utc(2017)                                          //~> 2017-01-01T00:00:00Z\n   * @example DateTime.utc(2017, 3)                                       //~> 2017-03-01T00:00:00Z\n   * @example DateTime.utc(2017, 3, 12)                                   //~> 2017-03-12T00:00:00Z\n   * @example DateTime.utc(2017, 3, 12, 5)                                //~> 2017-03-12T05:00:00Z\n   * @example DateTime.utc(2017, 3, 12, 5, 45)                            //~> 2017-03-12T05:45:00Z\n   * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: \"fr\" })          //~> 2017-03-12T05:45:00Z with a French locale\n   * @example DateTime.utc(2017, 3, 12, 5, 45, 10)                        //~> 2017-03-12T05:45:10Z\n   * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: \"fr\" }) //~> 2017-03-12T05:45:10.765Z with a French locale\n   * @return {DateTime}\n   */\n  static utc() {\n    const [opts, args] = lastOpts(arguments),\n      [year, month, day, hour, minute, second, millisecond] = args;\n\n    opts.zone = FixedOffsetZone.utcInstance;\n    return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n  }\n\n  /**\n   * Create a DateTime from a JavaScript Date object. Uses the default zone.\n   * @param {Date} date - a JavaScript Date object\n   * @param {Object} options - configuration options for the DateTime\n   * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n   * @return {DateTime}\n   */\n  static fromJSDate(date, options = {}) {\n    const ts = isDate(date) ? date.valueOf() : NaN;\n    if (Number.isNaN(ts)) {\n      return DateTime.invalid(\"invalid input\");\n    }\n\n    const zoneToUse = normalizeZone(options.zone, Settings.defaultZone);\n    if (!zoneToUse.isValid) {\n      return DateTime.invalid(unsupportedZone(zoneToUse));\n    }\n\n    return new DateTime({\n      ts: ts,\n      zone: zoneToUse,\n      loc: Locale.fromObject(options),\n    });\n  }\n\n  /**\n   * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n   * @param {number} milliseconds - a number of milliseconds since 1970 UTC\n   * @param {Object} options - configuration options for the DateTime\n   * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n   * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n   * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @return {DateTime}\n   */\n  static fromMillis(milliseconds, options = {}) {\n    if (!isNumber(milliseconds)) {\n      throw new InvalidArgumentError(\n        `fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`\n      );\n    } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) {\n      // this isn't perfect because because we can still end up out of range because of additional shifting, but it's a start\n      return DateTime.invalid(\"Timestamp out of range\");\n    } else {\n      return new DateTime({\n        ts: milliseconds,\n        zone: normalizeZone(options.zone, Settings.defaultZone),\n        loc: Locale.fromObject(options),\n      });\n    }\n  }\n\n  /**\n   * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n   * @param {number} seconds - a number of seconds since 1970 UTC\n   * @param {Object} options - configuration options for the DateTime\n   * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n   * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n   * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @return {DateTime}\n   */\n  static fromSeconds(seconds, options = {}) {\n    if (!isNumber(seconds)) {\n      throw new InvalidArgumentError(\"fromSeconds requires a numerical input\");\n    } else {\n      return new DateTime({\n        ts: seconds * 1000,\n        zone: normalizeZone(options.zone, Settings.defaultZone),\n        loc: Locale.fromObject(options),\n      });\n    }\n  }\n\n  /**\n   * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults.\n   * @param {Object} obj - the object to create the DateTime from\n   * @param {number} obj.year - a year, such as 1987\n   * @param {number} obj.month - a month, 1-12\n   * @param {number} obj.day - a day of the month, 1-31, depending on the month\n   * @param {number} obj.ordinal - day of the year, 1-365 or 366\n   * @param {number} obj.weekYear - an ISO week year\n   * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year\n   * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday\n   * @param {number} obj.localWeekYear - a week year, according to the locale\n   * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale\n   * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale\n   * @param {number} obj.hour - hour of the day, 0-23\n   * @param {number} obj.minute - minute of the hour, 0-59\n   * @param {number} obj.second - second of the minute, 0-59\n   * @param {number} obj.millisecond - millisecond of the second, 0-999\n   * @param {Object} opts - options for creating this DateTime\n   * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone()\n   * @param {string} [opts.locale='system\\'s locale'] - a locale to set on the resulting DateTime instance\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25'\n   * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01'\n   * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06\n   * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }),\n   * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' })\n   * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' })\n   * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13'\n   * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: \"en-US\" }).toISODate() //=> '2021-12-26'\n   * @return {DateTime}\n   */\n  static fromObject(obj, opts = {}) {\n    obj = obj || {};\n    const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone);\n    if (!zoneToUse.isValid) {\n      return DateTime.invalid(unsupportedZone(zoneToUse));\n    }\n\n    const loc = Locale.fromObject(opts);\n    const normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks);\n    const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, loc);\n\n    const tsNow = Settings.now(),\n      offsetProvis = !isUndefined(opts.specificOffset)\n        ? opts.specificOffset\n        : zoneToUse.offset(tsNow),\n      containsOrdinal = !isUndefined(normalized.ordinal),\n      containsGregorYear = !isUndefined(normalized.year),\n      containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n      containsGregor = containsGregorYear || containsGregorMD,\n      definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n    // cases:\n    // just a weekday -> this week's instance of that weekday, no worries\n    // (gregorian data or ordinal) + (weekYear or weekNumber) -> error\n    // (gregorian month or day) + ordinal -> error\n    // otherwise just use weeks or ordinals or gregorian, depending on what's specified\n\n    if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n      throw new ConflictingSpecificationError(\n        \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n      );\n    }\n\n    if (containsGregorMD && containsOrdinal) {\n      throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n    }\n\n    const useWeekData = definiteWeekDef || (normalized.weekday && !containsGregor);\n\n    // configure ourselves to deal with gregorian dates or week stuff\n    let units,\n      defaultValues,\n      objNow = tsToObj(tsNow, offsetProvis);\n    if (useWeekData) {\n      units = orderedWeekUnits;\n      defaultValues = defaultWeekUnitValues;\n      objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek);\n    } else if (containsOrdinal) {\n      units = orderedOrdinalUnits;\n      defaultValues = defaultOrdinalUnitValues;\n      objNow = gregorianToOrdinal(objNow);\n    } else {\n      units = orderedUnits;\n      defaultValues = defaultUnitValues;\n    }\n\n    // set default values for missing stuff\n    let foundFirst = false;\n    for (const u of units) {\n      const v = normalized[u];\n      if (!isUndefined(v)) {\n        foundFirst = true;\n      } else if (foundFirst) {\n        normalized[u] = defaultValues[u];\n      } else {\n        normalized[u] = objNow[u];\n      }\n    }\n\n    // make sure the values we have are in range\n    const higherOrderInvalid = useWeekData\n        ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek)\n        : containsOrdinal\n        ? hasInvalidOrdinalData(normalized)\n        : hasInvalidGregorianData(normalized),\n      invalid = higherOrderInvalid || hasInvalidTimeData(normalized);\n\n    if (invalid) {\n      return DateTime.invalid(invalid);\n    }\n\n    // compute the actual time\n    const gregorian = useWeekData\n        ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek)\n        : containsOrdinal\n        ? ordinalToGregorian(normalized)\n        : normalized,\n      [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse),\n      inst = new DateTime({\n        ts: tsFinal,\n        zone: zoneToUse,\n        o: offsetFinal,\n        loc,\n      });\n\n    // gregorian data + weekday serves only to validate\n    if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) {\n      return DateTime.invalid(\n        \"mismatched weekday\",\n        `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`\n      );\n    }\n\n    return inst;\n  }\n\n  /**\n   * Create a DateTime from an ISO 8601 string\n   * @param {string} text - the ISO string\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone\n   * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n   * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n   * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance\n   * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance\n   * @example DateTime.fromISO('2016-05-25T09:08:34.123')\n   * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00')\n   * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true})\n   * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'})\n   * @example DateTime.fromISO('2016-W05-4')\n   * @return {DateTime}\n   */\n  static fromISO(text, opts = {}) {\n    const [vals, parsedZone] = parseISODate(text);\n    return parseDataToDateTime(vals, parsedZone, opts, \"ISO 8601\", text);\n  }\n\n  /**\n   * Create a DateTime from an RFC 2822 string\n   * @param {string} text - the RFC 2822 string\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n   * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n   * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT')\n   * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600')\n   * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z')\n   * @return {DateTime}\n   */\n  static fromRFC2822(text, opts = {}) {\n    const [vals, parsedZone] = parseRFC2822Date(text);\n    return parseDataToDateTime(vals, parsedZone, opts, \"RFC 2822\", text);\n  }\n\n  /**\n   * Create a DateTime from an HTTP header date\n   * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n   * @param {string} text - the HTTP header date\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n   * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods.\n   * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT')\n   * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT')\n   * @example DateTime.fromHTTP('Sun Nov  6 08:49:37 1994')\n   * @return {DateTime}\n   */\n  static fromHTTP(text, opts = {}) {\n    const [vals, parsedZone] = parseHTTPDate(text);\n    return parseDataToDateTime(vals, parsedZone, opts, \"HTTP\", opts);\n  }\n\n  /**\n   * Create a DateTime from an input string and format string.\n   * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens).\n   * @param {string} text - the string to parse\n   * @param {string} fmt - the format the string is expected to be in (see the link below for the formats)\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n   * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n   * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n   * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @return {DateTime}\n   */\n  static fromFormat(text, fmt, opts = {}) {\n    if (isUndefined(text) || isUndefined(fmt)) {\n      throw new InvalidArgumentError(\"fromFormat requires an input string and a format\");\n    }\n\n    const { locale = null, numberingSystem = null } = opts,\n      localeToUse = Locale.fromOpts({\n        locale,\n        numberingSystem,\n        defaultToEN: true,\n      }),\n      [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt);\n    if (invalid) {\n      return DateTime.invalid(invalid);\n    } else {\n      return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset);\n    }\n  }\n\n  /**\n   * @deprecated use fromFormat instead\n   */\n  static fromString(text, fmt, opts = {}) {\n    return DateTime.fromFormat(text, fmt, opts);\n  }\n\n  /**\n   * Create a DateTime from a SQL date, time, or datetime\n   * Defaults to en-US if no locale has been specified, regardless of the system's locale\n   * @param {string} text - the string to parse\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n   * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n   * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n   * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @example DateTime.fromSQL('2017-05-15')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true })\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' })\n   * @example DateTime.fromSQL('09:12:34.342')\n   * @return {DateTime}\n   */\n  static fromSQL(text, opts = {}) {\n    const [vals, parsedZone] = parseSQL(text);\n    return parseDataToDateTime(vals, parsedZone, opts, \"SQL\", text);\n  }\n\n  /**\n   * Create an invalid DateTime.\n   * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent.\n   * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n   * @return {DateTime}\n   */\n  static invalid(reason, explanation = null) {\n    if (!reason) {\n      throw new InvalidArgumentError(\"need to specify a reason the DateTime is invalid\");\n    }\n\n    const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n    if (Settings.throwOnInvalid) {\n      throw new InvalidDateTimeError(invalid);\n    } else {\n      return new DateTime({ invalid });\n    }\n  }\n\n  /**\n   * Check if an object is an instance of DateTime. Works across context boundaries\n   * @param {object} o\n   * @return {boolean}\n   */\n  static isDateTime(o) {\n    return (o && o.isLuxonDateTime) || false;\n  }\n\n  /**\n   * Produce the format string for a set of options\n   * @param formatOpts\n   * @param localeOpts\n   * @returns {string}\n   */\n  static parseFormatForOpts(formatOpts, localeOpts = {}) {\n    const tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts));\n    return !tokenList ? null : tokenList.map((t) => (t ? t.val : null)).join(\"\");\n  }\n\n  /**\n   * Produce the the fully expanded format token for the locale\n   * Does NOT quote characters, so quoted tokens will not round trip correctly\n   * @param fmt\n   * @param localeOpts\n   * @returns {string}\n   */\n  static expandFormat(fmt, localeOpts = {}) {\n    const expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts));\n    return expanded.map((t) => t.val).join(\"\");\n  }\n\n  // INFO\n\n  /**\n   * Get the value of unit.\n   * @param {string} unit - a unit such as 'minute' or 'day'\n   * @example DateTime.local(2017, 7, 4).get('month'); //=> 7\n   * @example DateTime.local(2017, 7, 4).get('day'); //=> 4\n   * @return {number}\n   */\n  get(unit) {\n    return this[unit];\n  }\n\n  /**\n   * Returns whether the DateTime is valid. Invalid DateTimes occur when:\n   * * The DateTime was created from invalid calendar information, such as the 13th month or February 30\n   * * The DateTime was created by an operation on another invalid date\n   * @type {boolean}\n   */\n  get isValid() {\n    return this.invalid === null;\n  }\n\n  /**\n   * Returns an error code if this DateTime is invalid, or null if the DateTime is valid\n   * @type {string}\n   */\n  get invalidReason() {\n    return this.invalid ? this.invalid.reason : null;\n  }\n\n  /**\n   * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid\n   * @type {string}\n   */\n  get invalidExplanation() {\n    return this.invalid ? this.invalid.explanation : null;\n  }\n\n  /**\n   * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime\n   *\n   * @type {string}\n   */\n  get locale() {\n    return this.isValid ? this.loc.locale : null;\n  }\n\n  /**\n   * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime\n   *\n   * @type {string}\n   */\n  get numberingSystem() {\n    return this.isValid ? this.loc.numberingSystem : null;\n  }\n\n  /**\n   * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime\n   *\n   * @type {string}\n   */\n  get outputCalendar() {\n    return this.isValid ? this.loc.outputCalendar : null;\n  }\n\n  /**\n   * Get the time zone associated with this DateTime.\n   * @type {Zone}\n   */\n  get zone() {\n    return this._zone;\n  }\n\n  /**\n   * Get the name of the time zone.\n   * @type {string}\n   */\n  get zoneName() {\n    return this.isValid ? this.zone.name : null;\n  }\n\n  /**\n   * Get the year\n   * @example DateTime.local(2017, 5, 25).year //=> 2017\n   * @type {number}\n   */\n  get year() {\n    return this.isValid ? this.c.year : NaN;\n  }\n\n  /**\n   * Get the quarter\n   * @example DateTime.local(2017, 5, 25).quarter //=> 2\n   * @type {number}\n   */\n  get quarter() {\n    return this.isValid ? Math.ceil(this.c.month / 3) : NaN;\n  }\n\n  /**\n   * Get the month (1-12).\n   * @example DateTime.local(2017, 5, 25).month //=> 5\n   * @type {number}\n   */\n  get month() {\n    return this.isValid ? this.c.month : NaN;\n  }\n\n  /**\n   * Get the day of the month (1-30ish).\n   * @example DateTime.local(2017, 5, 25).day //=> 25\n   * @type {number}\n   */\n  get day() {\n    return this.isValid ? this.c.day : NaN;\n  }\n\n  /**\n   * Get the hour of the day (0-23).\n   * @example DateTime.local(2017, 5, 25, 9).hour //=> 9\n   * @type {number}\n   */\n  get hour() {\n    return this.isValid ? this.c.hour : NaN;\n  }\n\n  /**\n   * Get the minute of the hour (0-59).\n   * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30\n   * @type {number}\n   */\n  get minute() {\n    return this.isValid ? this.c.minute : NaN;\n  }\n\n  /**\n   * Get the second of the minute (0-59).\n   * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52\n   * @type {number}\n   */\n  get second() {\n    return this.isValid ? this.c.second : NaN;\n  }\n\n  /**\n   * Get the millisecond of the second (0-999).\n   * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654\n   * @type {number}\n   */\n  get millisecond() {\n    return this.isValid ? this.c.millisecond : NaN;\n  }\n\n  /**\n   * Get the week year\n   * @see https://en.wikipedia.org/wiki/ISO_week_date\n   * @example DateTime.local(2014, 12, 31).weekYear //=> 2015\n   * @type {number}\n   */\n  get weekYear() {\n    return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN;\n  }\n\n  /**\n   * Get the week number of the week year (1-52ish).\n   * @see https://en.wikipedia.org/wiki/ISO_week_date\n   * @example DateTime.local(2017, 5, 25).weekNumber //=> 21\n   * @type {number}\n   */\n  get weekNumber() {\n    return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN;\n  }\n\n  /**\n   * Get the day of the week.\n   * 1 is Monday and 7 is Sunday\n   * @see https://en.wikipedia.org/wiki/ISO_week_date\n   * @example DateTime.local(2014, 11, 31).weekday //=> 4\n   * @type {number}\n   */\n  get weekday() {\n    return this.isValid ? possiblyCachedWeekData(this).weekday : NaN;\n  }\n\n  /**\n   * Returns true if this date is on a weekend according to the locale, false otherwise\n   * @returns {boolean}\n   */\n  get isWeekend() {\n    return this.isValid && this.loc.getWeekendDays().includes(this.weekday);\n  }\n\n  /**\n   * Get the day of the week according to the locale.\n   * 1 is the first day of the week and 7 is the last day of the week.\n   * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1,\n   * @returns {number}\n   */\n  get localWeekday() {\n    return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN;\n  }\n\n  /**\n   * Get the week number of the week year according to the locale. Different locales assign week numbers differently,\n   * because the week can start on different days of the week (see localWeekday) and because a different number of days\n   * is required for a week to count as the first week of a year.\n   * @returns {number}\n   */\n  get localWeekNumber() {\n    return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN;\n  }\n\n  /**\n   * Get the week year according to the locale. Different locales assign week numbers (and therefor week years)\n   * differently, see localWeekNumber.\n   * @returns {number}\n   */\n  get localWeekYear() {\n    return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN;\n  }\n\n  /**\n   * Get the ordinal (meaning the day of the year)\n   * @example DateTime.local(2017, 5, 25).ordinal //=> 145\n   * @type {number|DateTime}\n   */\n  get ordinal() {\n    return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN;\n  }\n\n  /**\n   * Get the human readable short month name, such as 'Oct'.\n   * Defaults to the system's locale if no locale has been specified\n   * @example DateTime.local(2017, 10, 30).monthShort //=> Oct\n   * @type {string}\n   */\n  get monthShort() {\n    return this.isValid ? Info.months(\"short\", { locObj: this.loc })[this.month - 1] : null;\n  }\n\n  /**\n   * Get the human readable long month name, such as 'October'.\n   * Defaults to the system's locale if no locale has been specified\n   * @example DateTime.local(2017, 10, 30).monthLong //=> October\n   * @type {string}\n   */\n  get monthLong() {\n    return this.isValid ? Info.months(\"long\", { locObj: this.loc })[this.month - 1] : null;\n  }\n\n  /**\n   * Get the human readable short weekday, such as 'Mon'.\n   * Defaults to the system's locale if no locale has been specified\n   * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon\n   * @type {string}\n   */\n  get weekdayShort() {\n    return this.isValid ? Info.weekdays(\"short\", { locObj: this.loc })[this.weekday - 1] : null;\n  }\n\n  /**\n   * Get the human readable long weekday, such as 'Monday'.\n   * Defaults to the system's locale if no locale has been specified\n   * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday\n   * @type {string}\n   */\n  get weekdayLong() {\n    return this.isValid ? Info.weekdays(\"long\", { locObj: this.loc })[this.weekday - 1] : null;\n  }\n\n  /**\n   * Get the UTC offset of this DateTime in minutes\n   * @example DateTime.now().offset //=> -240\n   * @example DateTime.utc().offset //=> 0\n   * @type {number}\n   */\n  get offset() {\n    return this.isValid ? +this.o : NaN;\n  }\n\n  /**\n   * Get the short human name for the zone's current offset, for example \"EST\" or \"EDT\".\n   * Defaults to the system's locale if no locale has been specified\n   * @type {string}\n   */\n  get offsetNameShort() {\n    if (this.isValid) {\n      return this.zone.offsetName(this.ts, {\n        format: \"short\",\n        locale: this.locale,\n      });\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * Get the long human name for the zone's current offset, for example \"Eastern Standard Time\" or \"Eastern Daylight Time\".\n   * Defaults to the system's locale if no locale has been specified\n   * @type {string}\n   */\n  get offsetNameLong() {\n    if (this.isValid) {\n      return this.zone.offsetName(this.ts, {\n        format: \"long\",\n        locale: this.locale,\n      });\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * Get whether this zone's offset ever changes, as in a DST.\n   * @type {boolean}\n   */\n  get isOffsetFixed() {\n    return this.isValid ? this.zone.isUniversal : null;\n  }\n\n  /**\n   * Get whether the DateTime is in a DST.\n   * @type {boolean}\n   */\n  get isInDST() {\n    if (this.isOffsetFixed) {\n      return false;\n    } else {\n      return (\n        this.offset > this.set({ month: 1, day: 1 }).offset ||\n        this.offset > this.set({ month: 5 }).offset\n      );\n    }\n  }\n\n  /**\n   * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC\n   * in this DateTime's zone. During DST changes local time can be ambiguous, for example\n   * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`.\n   * This method will return both possible DateTimes if this DateTime's local time is ambiguous.\n   * @returns {DateTime[]}\n   */\n  getPossibleOffsets() {\n    if (!this.isValid || this.isOffsetFixed) {\n      return [this];\n    }\n    const dayMs = 86400000;\n    const minuteMs = 60000;\n    const localTS = objToLocalTS(this.c);\n    const oEarlier = this.zone.offset(localTS - dayMs);\n    const oLater = this.zone.offset(localTS + dayMs);\n\n    const o1 = this.zone.offset(localTS - oEarlier * minuteMs);\n    const o2 = this.zone.offset(localTS - oLater * minuteMs);\n    if (o1 === o2) {\n      return [this];\n    }\n    const ts1 = localTS - o1 * minuteMs;\n    const ts2 = localTS - o2 * minuteMs;\n    const c1 = tsToObj(ts1, o1);\n    const c2 = tsToObj(ts2, o2);\n    if (\n      c1.hour === c2.hour &&\n      c1.minute === c2.minute &&\n      c1.second === c2.second &&\n      c1.millisecond === c2.millisecond\n    ) {\n      return [clone(this, { ts: ts1 }), clone(this, { ts: ts2 })];\n    }\n    return [this];\n  }\n\n  /**\n   * Returns true if this DateTime is in a leap year, false otherwise\n   * @example DateTime.local(2016).isInLeapYear //=> true\n   * @example DateTime.local(2013).isInLeapYear //=> false\n   * @type {boolean}\n   */\n  get isInLeapYear() {\n    return isLeapYear(this.year);\n  }\n\n  /**\n   * Returns the number of days in this DateTime's month\n   * @example DateTime.local(2016, 2).daysInMonth //=> 29\n   * @example DateTime.local(2016, 3).daysInMonth //=> 31\n   * @type {number}\n   */\n  get daysInMonth() {\n    return daysInMonth(this.year, this.month);\n  }\n\n  /**\n   * Returns the number of days in this DateTime's year\n   * @example DateTime.local(2016).daysInYear //=> 366\n   * @example DateTime.local(2013).daysInYear //=> 365\n   * @type {number}\n   */\n  get daysInYear() {\n    return this.isValid ? daysInYear(this.year) : NaN;\n  }\n\n  /**\n   * Returns the number of weeks in this DateTime's year\n   * @see https://en.wikipedia.org/wiki/ISO_week_date\n   * @example DateTime.local(2004).weeksInWeekYear //=> 53\n   * @example DateTime.local(2013).weeksInWeekYear //=> 52\n   * @type {number}\n   */\n  get weeksInWeekYear() {\n    return this.isValid ? weeksInWeekYear(this.weekYear) : NaN;\n  }\n\n  /**\n   * Returns the number of weeks in this DateTime's local week year\n   * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52\n   * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53\n   * @type {number}\n   */\n  get weeksInLocalWeekYear() {\n    return this.isValid\n      ? weeksInWeekYear(\n          this.localWeekYear,\n          this.loc.getMinDaysInFirstWeek(),\n          this.loc.getStartOfWeek()\n        )\n      : NaN;\n  }\n\n  /**\n   * Returns the resolved Intl options for this DateTime.\n   * This is useful in understanding the behavior of formatting methods\n   * @param {Object} opts - the same options as toLocaleString\n   * @return {Object}\n   */\n  resolvedLocaleOptions(opts = {}) {\n    const { locale, numberingSystem, calendar } = Formatter.create(\n      this.loc.clone(opts),\n      opts\n    ).resolvedOptions(this);\n    return { locale, numberingSystem, outputCalendar: calendar };\n  }\n\n  // TRANSFORM\n\n  /**\n   * \"Set\" the DateTime's zone to UTC. Returns a newly-constructed DateTime.\n   *\n   * Equivalent to {@link DateTime#setZone}('utc')\n   * @param {number} [offset=0] - optionally, an offset from UTC in minutes\n   * @param {Object} [opts={}] - options to pass to `setZone()`\n   * @return {DateTime}\n   */\n  toUTC(offset = 0, opts = {}) {\n    return this.setZone(FixedOffsetZone.instance(offset), opts);\n  }\n\n  /**\n   * \"Set\" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime.\n   *\n   * Equivalent to `setZone('local')`\n   * @return {DateTime}\n   */\n  toLocal() {\n    return this.setZone(Settings.defaultZone);\n  }\n\n  /**\n   * \"Set\" the DateTime's zone to specified zone. Returns a newly-constructed DateTime.\n   *\n   * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones.\n   * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class.\n   * @param {Object} opts - options\n   * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this.\n   * @return {DateTime}\n   */\n  setZone(zone, { keepLocalTime = false, keepCalendarTime = false } = {}) {\n    zone = normalizeZone(zone, Settings.defaultZone);\n    if (zone.equals(this.zone)) {\n      return this;\n    } else if (!zone.isValid) {\n      return DateTime.invalid(unsupportedZone(zone));\n    } else {\n      let newTS = this.ts;\n      if (keepLocalTime || keepCalendarTime) {\n        const offsetGuess = zone.offset(this.ts);\n        const asObj = this.toObject();\n        [newTS] = objToTS(asObj, offsetGuess, zone);\n      }\n      return clone(this, { ts: newTS, zone });\n    }\n  }\n\n  /**\n   * \"Set\" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime.\n   * @param {Object} properties - the properties to set\n   * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' })\n   * @return {DateTime}\n   */\n  reconfigure({ locale, numberingSystem, outputCalendar } = {}) {\n    const loc = this.loc.clone({ locale, numberingSystem, outputCalendar });\n    return clone(this, { loc });\n  }\n\n  /**\n   * \"Set\" the locale. Returns a newly-constructed DateTime.\n   * Just a convenient alias for reconfigure({ locale })\n   * @example DateTime.local(2017, 5, 25).setLocale('en-GB')\n   * @return {DateTime}\n   */\n  setLocale(locale) {\n    return this.reconfigure({ locale });\n  }\n\n  /**\n   * \"Set\" the values of specified units. Returns a newly-constructed DateTime.\n   * You can only set units with this method; for \"setting\" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}.\n   *\n   * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`.\n   * They cannot be mixed with ISO-week units like `weekday`.\n   * @param {Object} values - a mapping of units to numbers\n   * @example dt.set({ year: 2017 })\n   * @example dt.set({ hour: 8, minute: 30 })\n   * @example dt.set({ weekday: 5 })\n   * @example dt.set({ year: 2005, ordinal: 234 })\n   * @return {DateTime}\n   */\n  set(values) {\n    if (!this.isValid) return this;\n\n    const normalized = normalizeObject(values, normalizeUnitWithLocalWeeks);\n    const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, this.loc);\n\n    const settingWeekStuff =\n        !isUndefined(normalized.weekYear) ||\n        !isUndefined(normalized.weekNumber) ||\n        !isUndefined(normalized.weekday),\n      containsOrdinal = !isUndefined(normalized.ordinal),\n      containsGregorYear = !isUndefined(normalized.year),\n      containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n      containsGregor = containsGregorYear || containsGregorMD,\n      definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n    if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n      throw new ConflictingSpecificationError(\n        \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n      );\n    }\n\n    if (containsGregorMD && containsOrdinal) {\n      throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n    }\n\n    let mixed;\n    if (settingWeekStuff) {\n      mixed = weekToGregorian(\n        { ...gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), ...normalized },\n        minDaysInFirstWeek,\n        startOfWeek\n      );\n    } else if (!isUndefined(normalized.ordinal)) {\n      mixed = ordinalToGregorian({ ...gregorianToOrdinal(this.c), ...normalized });\n    } else {\n      mixed = { ...this.toObject(), ...normalized };\n\n      // if we didn't set the day but we ended up on an overflow date,\n      // use the last day of the right month\n      if (isUndefined(normalized.day)) {\n        mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day);\n      }\n    }\n\n    const [ts, o] = objToTS(mixed, this.o, this.zone);\n    return clone(this, { ts, o });\n  }\n\n  /**\n   * Add a period of time to this DateTime and return the resulting DateTime\n   *\n   * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between.\n   * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n   * @example DateTime.now().plus(123) //~> in 123 milliseconds\n   * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes\n   * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow\n   * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday\n   * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min\n   * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min\n   * @return {DateTime}\n   */\n  plus(duration) {\n    if (!this.isValid) return this;\n    const dur = Duration.fromDurationLike(duration);\n    return clone(this, adjustTime(this, dur));\n  }\n\n  /**\n   * Subtract a period of time to this DateTime and return the resulting DateTime\n   * See {@link DateTime#plus}\n   * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n   @return {DateTime}\n   */\n  minus(duration) {\n    if (!this.isValid) return this;\n    const dur = Duration.fromDurationLike(duration).negate();\n    return clone(this, adjustTime(this, dur));\n  }\n\n  /**\n   * \"Set\" this DateTime to the beginning of a unit of time.\n   * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n   * @param {Object} opts - options\n   * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n   * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01'\n   * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01'\n   * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays\n   * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00'\n   * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00'\n   * @return {DateTime}\n   */\n  startOf(unit, { useLocaleWeeks = false } = {}) {\n    if (!this.isValid) return this;\n\n    const o = {},\n      normalizedUnit = Duration.normalizeUnit(unit);\n    switch (normalizedUnit) {\n      case \"years\":\n        o.month = 1;\n      // falls through\n      case \"quarters\":\n      case \"months\":\n        o.day = 1;\n      // falls through\n      case \"weeks\":\n      case \"days\":\n        o.hour = 0;\n      // falls through\n      case \"hours\":\n        o.minute = 0;\n      // falls through\n      case \"minutes\":\n        o.second = 0;\n      // falls through\n      case \"seconds\":\n        o.millisecond = 0;\n        break;\n      case \"milliseconds\":\n        break;\n      // no default, invalid units throw in normalizeUnit()\n    }\n\n    if (normalizedUnit === \"weeks\") {\n      if (useLocaleWeeks) {\n        const startOfWeek = this.loc.getStartOfWeek();\n        const { weekday } = this;\n        if (weekday < startOfWeek) {\n          o.weekNumber = this.weekNumber - 1;\n        }\n        o.weekday = startOfWeek;\n      } else {\n        o.weekday = 1;\n      }\n    }\n\n    if (normalizedUnit === \"quarters\") {\n      const q = Math.ceil(this.month / 3);\n      o.month = (q - 1) * 3 + 1;\n    }\n\n    return this.set(o);\n  }\n\n  /**\n   * \"Set\" this DateTime to the end (meaning the last millisecond) of a unit of time\n   * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n   * @param {Object} opts - options\n   * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n   * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00'\n   * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00'\n   * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays\n   * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00'\n   * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00'\n   * @return {DateTime}\n   */\n  endOf(unit, opts) {\n    return this.isValid\n      ? this.plus({ [unit]: 1 })\n          .startOf(unit, opts)\n          .minus(1)\n      : this;\n  }\n\n  // OUTPUT\n\n  /**\n   * Returns a string representation of this DateTime formatted according to the specified format string.\n   * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens).\n   * Defaults to en-US if no locale has been specified, regardless of the system's locale.\n   * @param {string} fmt - the format string\n   * @param {Object} opts - opts to override the configuration options on this DateTime\n   * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22'\n   * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22'\n   * @example DateTime.now().toFormat('yyyy LLL dd', { locale: \"fr\" }) //=> '2017 avr. 22'\n   * @example DateTime.now().toFormat(\"HH 'hours and' mm 'minutes'\") //=> '20 hours and 55 minutes'\n   * @return {string}\n   */\n  toFormat(fmt, opts = {}) {\n    return this.isValid\n      ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt)\n      : INVALID;\n  }\n\n  /**\n   * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`.\n   * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation\n   * of the DateTime in the assigned locale.\n   * Defaults to the system's locale if no locale has been specified\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n   * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options\n   * @param {Object} opts - opts to override the configuration options on this DateTime\n   * @example DateTime.now().toLocaleString(); //=> 4/20/2017\n   * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017'\n   * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017'\n   * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022'\n   * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM'\n   * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM'\n   * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20'\n   * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM'\n   * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32'\n   * @return {string}\n   */\n  toLocaleString(formatOpts = Formats.DATE_SHORT, opts = {}) {\n    return this.isValid\n      ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this)\n      : INVALID;\n  }\n\n  /**\n   * Returns an array of format \"parts\", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output.\n   * Defaults to the system's locale if no locale has been specified\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts\n   * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`.\n   * @example DateTime.now().toLocaleParts(); //=> [\n   *                                   //=>   { type: 'day', value: '25' },\n   *                                   //=>   { type: 'literal', value: '/' },\n   *                                   //=>   { type: 'month', value: '05' },\n   *                                   //=>   { type: 'literal', value: '/' },\n   *                                   //=>   { type: 'year', value: '1982' }\n   *                                   //=> ]\n   */\n  toLocaleParts(opts = {}) {\n    return this.isValid\n      ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this)\n      : [];\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this DateTime\n   * @param {Object} opts - options\n   * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n   * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n   * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n   * @param {boolean} [opts.extendedZone=false] - add the time zone format extension\n   * @param {string} [opts.format='extended'] - choose between the basic and extended format\n   * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z'\n   * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00'\n   * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335'\n   * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400'\n   * @return {string}\n   */\n  toISO({\n    format = \"extended\",\n    suppressSeconds = false,\n    suppressMilliseconds = false,\n    includeOffset = true,\n    extendedZone = false,\n  } = {}) {\n    if (!this.isValid) {\n      return null;\n    }\n\n    const ext = format === \"extended\";\n\n    let c = toISODate(this, ext);\n    c += \"T\";\n    c += toISOTime(this, ext, suppressSeconds, suppressMilliseconds, includeOffset, extendedZone);\n    return c;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this DateTime's date component\n   * @param {Object} opts - options\n   * @param {string} [opts.format='extended'] - choose between the basic and extended format\n   * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25'\n   * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525'\n   * @return {string}\n   */\n  toISODate({ format = \"extended\" } = {}) {\n    if (!this.isValid) {\n      return null;\n    }\n\n    return toISODate(this, format === \"extended\");\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this DateTime's week date\n   * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2'\n   * @return {string}\n   */\n  toISOWeekDate() {\n    return toTechFormat(this, \"kkkk-'W'WW-c\");\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this DateTime's time component\n   * @param {Object} opts - options\n   * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n   * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n   * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n   * @param {boolean} [opts.extendedZone=true] - add the time zone format extension\n   * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n   * @param {string} [opts.format='extended'] - choose between the basic and extended format\n   * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z'\n   * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z'\n   * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z'\n   * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z'\n   * @return {string}\n   */\n  toISOTime({\n    suppressMilliseconds = false,\n    suppressSeconds = false,\n    includeOffset = true,\n    includePrefix = false,\n    extendedZone = false,\n    format = \"extended\",\n  } = {}) {\n    if (!this.isValid) {\n      return null;\n    }\n\n    let c = includePrefix ? \"T\" : \"\";\n    return (\n      c +\n      toISOTime(\n        this,\n        format === \"extended\",\n        suppressSeconds,\n        suppressMilliseconds,\n        includeOffset,\n        extendedZone\n      )\n    );\n  }\n\n  /**\n   * Returns an RFC 2822-compatible string representation of this DateTime\n   * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000'\n   * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400'\n   * @return {string}\n   */\n  toRFC2822() {\n    return toTechFormat(this, \"EEE, dd LLL yyyy HH:mm:ss ZZZ\", false);\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT.\n   * Specifically, the string conforms to RFC 1123.\n   * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n   * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT'\n   * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT'\n   * @return {string}\n   */\n  toHTTP() {\n    return toTechFormat(this.toUTC(), \"EEE, dd LLL yyyy HH:mm:ss 'GMT'\");\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for use in SQL Date\n   * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13'\n   * @return {string}\n   */\n  toSQLDate() {\n    if (!this.isValid) {\n      return null;\n    }\n    return toISODate(this, true);\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for use in SQL Time\n   * @param {Object} opts - options\n   * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n   * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n   * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n   * @example DateTime.utc().toSQL() //=> '05:15:16.345'\n   * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00'\n   * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345'\n   * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York'\n   * @return {string}\n   */\n  toSQLTime({ includeOffset = true, includeZone = false, includeOffsetSpace = true } = {}) {\n    let fmt = \"HH:mm:ss.SSS\";\n\n    if (includeZone || includeOffset) {\n      if (includeOffsetSpace) {\n        fmt += \" \";\n      }\n      if (includeZone) {\n        fmt += \"z\";\n      } else if (includeOffset) {\n        fmt += \"ZZ\";\n      }\n    }\n\n    return toTechFormat(this, fmt, true);\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for use in SQL DateTime\n   * @param {Object} opts - options\n   * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n   * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n   * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n   * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z'\n   * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00'\n   * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000'\n   * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York'\n   * @return {string}\n   */\n  toSQL(opts = {}) {\n    if (!this.isValid) {\n      return null;\n    }\n\n    return `${this.toSQLDate()} ${this.toSQLTime(opts)}`;\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for debugging\n   * @return {string}\n   */\n  toString() {\n    return this.isValid ? this.toISO() : INVALID;\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for the REPL.\n   * @return {string}\n   */\n  [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n    if (this.isValid) {\n      return `DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`;\n    } else {\n      return `DateTime { Invalid, reason: ${this.invalidReason} }`;\n    }\n  }\n\n  /**\n   * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis}\n   * @return {number}\n   */\n  valueOf() {\n    return this.toMillis();\n  }\n\n  /**\n   * Returns the epoch milliseconds of this DateTime.\n   * @return {number}\n   */\n  toMillis() {\n    return this.isValid ? this.ts : NaN;\n  }\n\n  /**\n   * Returns the epoch seconds of this DateTime.\n   * @return {number}\n   */\n  toSeconds() {\n    return this.isValid ? this.ts / 1000 : NaN;\n  }\n\n  /**\n   * Returns the epoch seconds (as a whole number) of this DateTime.\n   * @return {number}\n   */\n  toUnixInteger() {\n    return this.isValid ? Math.floor(this.ts / 1000) : NaN;\n  }\n\n  /**\n   * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON.\n   * @return {string}\n   */\n  toJSON() {\n    return this.toISO();\n  }\n\n  /**\n   * Returns a BSON serializable equivalent to this DateTime.\n   * @return {Date}\n   */\n  toBSON() {\n    return this.toJSDate();\n  }\n\n  /**\n   * Returns a JavaScript object with this DateTime's year, month, day, and so on.\n   * @param opts - options for generating the object\n   * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output\n   * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 }\n   * @return {Object}\n   */\n  toObject(opts = {}) {\n    if (!this.isValid) return {};\n\n    const base = { ...this.c };\n\n    if (opts.includeConfig) {\n      base.outputCalendar = this.outputCalendar;\n      base.numberingSystem = this.loc.numberingSystem;\n      base.locale = this.loc.locale;\n    }\n    return base;\n  }\n\n  /**\n   * Returns a JavaScript Date equivalent to this DateTime.\n   * @return {Date}\n   */\n  toJSDate() {\n    return new Date(this.isValid ? this.ts : NaN);\n  }\n\n  // COMPARE\n\n  /**\n   * Return the difference between two DateTimes as a Duration.\n   * @param {DateTime} otherDateTime - the DateTime to compare this one to\n   * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration.\n   * @param {Object} opts - options that affect the creation of the Duration\n   * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n   * @example\n   * var i1 = DateTime.fromISO('1982-05-25T09:45'),\n   *     i2 = DateTime.fromISO('1983-10-14T10:30');\n   * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 }\n   * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 }\n   * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 }\n   * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 }\n   * @return {Duration}\n   */\n  diff(otherDateTime, unit = \"milliseconds\", opts = {}) {\n    if (!this.isValid || !otherDateTime.isValid) {\n      return Duration.invalid(\"created by diffing an invalid DateTime\");\n    }\n\n    const durOpts = { locale: this.locale, numberingSystem: this.numberingSystem, ...opts };\n\n    const units = maybeArray(unit).map(Duration.normalizeUnit),\n      otherIsLater = otherDateTime.valueOf() > this.valueOf(),\n      earlier = otherIsLater ? this : otherDateTime,\n      later = otherIsLater ? otherDateTime : this,\n      diffed = diff(earlier, later, units, durOpts);\n\n    return otherIsLater ? diffed.negate() : diffed;\n  }\n\n  /**\n   * Return the difference between this DateTime and right now.\n   * See {@link DateTime#diff}\n   * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration\n   * @param {Object} opts - options that affect the creation of the Duration\n   * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n   * @return {Duration}\n   */\n  diffNow(unit = \"milliseconds\", opts = {}) {\n    return this.diff(DateTime.now(), unit, opts);\n  }\n\n  /**\n   * Return an Interval spanning between this DateTime and another DateTime\n   * @param {DateTime} otherDateTime - the other end point of the Interval\n   * @return {Interval}\n   */\n  until(otherDateTime) {\n    return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this;\n  }\n\n  /**\n   * Return whether this DateTime is in the same unit of time as another DateTime.\n   * Higher-order units must also be identical for this function to return `true`.\n   * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed.\n   * @param {DateTime} otherDateTime - the other DateTime\n   * @param {string} unit - the unit of time to check sameness on\n   * @param {Object} opts - options\n   * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used\n   * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day\n   * @return {boolean}\n   */\n  hasSame(otherDateTime, unit, opts) {\n    if (!this.isValid) return false;\n\n    const inputMs = otherDateTime.valueOf();\n    const adjustedToZone = this.setZone(otherDateTime.zone, { keepLocalTime: true });\n    return (\n      adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts)\n    );\n  }\n\n  /**\n   * Equality check\n   * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid.\n   * To compare just the millisecond values, use `+dt1 === +dt2`.\n   * @param {DateTime} other - the other DateTime\n   * @return {boolean}\n   */\n  equals(other) {\n    return (\n      this.isValid &&\n      other.isValid &&\n      this.valueOf() === other.valueOf() &&\n      this.zone.equals(other.zone) &&\n      this.loc.equals(other.loc)\n    );\n  }\n\n  /**\n   * Returns a string representation of a this time relative to now, such as \"in two days\". Can only internationalize if your\n   * platform supports Intl.RelativeTimeFormat. Rounds down by default.\n   * @param {Object} options - options that affect the output\n   * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n   * @param {string} [options.style=\"long\"] - the style of units, must be \"long\", \"short\", or \"narrow\"\n   * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of \"years\", \"quarters\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", or \"seconds\"\n   * @param {boolean} [options.round=true] - whether to round the numbers in the output.\n   * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding.\n   * @param {string} options.locale - override the locale of this DateTime\n   * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n   * @example DateTime.now().plus({ days: 1 }).toRelative() //=> \"in 1 day\"\n   * @example DateTime.now().setLocale(\"es\").toRelative({ days: 1 }) //=> \"dentro de 1 día\"\n   * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: \"fr\" }) //=> \"dans 23 heures\"\n   * @example DateTime.now().minus({ days: 2 }).toRelative() //=> \"2 days ago\"\n   * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: \"hours\" }) //=> \"48 hours ago\"\n   * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> \"1.5 days ago\"\n   */\n  toRelative(options = {}) {\n    if (!this.isValid) return null;\n    const base = options.base || DateTime.fromObject({}, { zone: this.zone }),\n      padding = options.padding ? (this < base ? -options.padding : options.padding) : 0;\n    let units = [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"];\n    let unit = options.unit;\n    if (Array.isArray(options.unit)) {\n      units = options.unit;\n      unit = undefined;\n    }\n    return diffRelative(base, this.plus(padding), {\n      ...options,\n      numeric: \"always\",\n      units,\n      unit,\n    });\n  }\n\n  /**\n   * Returns a string representation of this date relative to today, such as \"yesterday\" or \"next month\".\n   * Only internationalizes on platforms that supports Intl.RelativeTimeFormat.\n   * @param {Object} options - options that affect the output\n   * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n   * @param {string} options.locale - override the locale of this DateTime\n   * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of \"years\", \"quarters\", \"months\", \"weeks\", or \"days\"\n   * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n   * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> \"tomorrow\"\n   * @example DateTime.now().setLocale(\"es\").plus({ days: 1 }).toRelative() //=> \"\"mañana\"\n   * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: \"fr\" }) //=> \"demain\"\n   * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> \"2 days ago\"\n   */\n  toRelativeCalendar(options = {}) {\n    if (!this.isValid) return null;\n\n    return diffRelative(options.base || DateTime.fromObject({}, { zone: this.zone }), this, {\n      ...options,\n      numeric: \"auto\",\n      units: [\"years\", \"months\", \"days\"],\n      calendary: true,\n    });\n  }\n\n  /**\n   * Return the min of several date times\n   * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum\n   * @return {DateTime} the min DateTime, or undefined if called with no argument\n   */\n  static min(...dateTimes) {\n    if (!dateTimes.every(DateTime.isDateTime)) {\n      throw new InvalidArgumentError(\"min requires all arguments be DateTimes\");\n    }\n    return bestBy(dateTimes, (i) => i.valueOf(), Math.min);\n  }\n\n  /**\n   * Return the max of several date times\n   * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum\n   * @return {DateTime} the max DateTime, or undefined if called with no argument\n   */\n  static max(...dateTimes) {\n    if (!dateTimes.every(DateTime.isDateTime)) {\n      throw new InvalidArgumentError(\"max requires all arguments be DateTimes\");\n    }\n    return bestBy(dateTimes, (i) => i.valueOf(), Math.max);\n  }\n\n  // MISC\n\n  /**\n   * Explain how a string would be parsed by fromFormat()\n   * @param {string} text - the string to parse\n   * @param {string} fmt - the format the string is expected to be in (see description)\n   * @param {Object} options - options taken by fromFormat()\n   * @return {Object}\n   */\n  static fromFormatExplain(text, fmt, options = {}) {\n    const { locale = null, numberingSystem = null } = options,\n      localeToUse = Locale.fromOpts({\n        locale,\n        numberingSystem,\n        defaultToEN: true,\n      });\n    return explainFromTokens(localeToUse, text, fmt);\n  }\n\n  /**\n   * @deprecated use fromFormatExplain instead\n   */\n  static fromStringExplain(text, fmt, options = {}) {\n    return DateTime.fromFormatExplain(text, fmt, options);\n  }\n\n  // FORMAT PRESETS\n\n  /**\n   * {@link DateTime#toLocaleString} format like 10/14/1983\n   * @type {Object}\n   */\n  static get DATE_SHORT() {\n    return Formats.DATE_SHORT;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Oct 14, 1983'\n   * @type {Object}\n   */\n  static get DATE_MED() {\n    return Formats.DATE_MED;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983'\n   * @type {Object}\n   */\n  static get DATE_MED_WITH_WEEKDAY() {\n    return Formats.DATE_MED_WITH_WEEKDAY;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'October 14, 1983'\n   * @type {Object}\n   */\n  static get DATE_FULL() {\n    return Formats.DATE_FULL;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983'\n   * @type {Object}\n   */\n  static get DATE_HUGE() {\n    return Formats.DATE_HUGE;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get TIME_SIMPLE() {\n    return Formats.TIME_SIMPLE;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get TIME_WITH_SECONDS() {\n    return Formats.TIME_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get TIME_WITH_SHORT_OFFSET() {\n    return Formats.TIME_WITH_SHORT_OFFSET;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get TIME_WITH_LONG_OFFSET() {\n    return Formats.TIME_WITH_LONG_OFFSET;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30', always 24-hour.\n   * @type {Object}\n   */\n  static get TIME_24_SIMPLE() {\n    return Formats.TIME_24_SIMPLE;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour.\n   * @type {Object}\n   */\n  static get TIME_24_WITH_SECONDS() {\n    return Formats.TIME_24_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour.\n   * @type {Object}\n   */\n  static get TIME_24_WITH_SHORT_OFFSET() {\n    return Formats.TIME_24_WITH_SHORT_OFFSET;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour.\n   * @type {Object}\n   */\n  static get TIME_24_WITH_LONG_OFFSET() {\n    return Formats.TIME_24_WITH_LONG_OFFSET;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_SHORT() {\n    return Formats.DATETIME_SHORT;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_SHORT_WITH_SECONDS() {\n    return Formats.DATETIME_SHORT_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_MED() {\n    return Formats.DATETIME_MED;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_MED_WITH_SECONDS() {\n    return Formats.DATETIME_MED_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_MED_WITH_WEEKDAY() {\n    return Formats.DATETIME_MED_WITH_WEEKDAY;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_FULL() {\n    return Formats.DATETIME_FULL;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_FULL_WITH_SECONDS() {\n    return Formats.DATETIME_FULL_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_HUGE() {\n    return Formats.DATETIME_HUGE;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_HUGE_WITH_SECONDS() {\n    return Formats.DATETIME_HUGE_WITH_SECONDS;\n  }\n}\n\n/**\n * @private\n */\nexport function friendlyDateTime(dateTimeish) {\n  if (DateTime.isDateTime(dateTimeish)) {\n    return dateTimeish;\n  } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) {\n    return DateTime.fromJSDate(dateTimeish);\n  } else if (dateTimeish && typeof dateTimeish === \"object\") {\n    return DateTime.fromObject(dateTimeish);\n  } else {\n    throw new InvalidArgumentError(\n      `Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`\n    );\n  }\n}\n","export class Sorter {\n    static byID(a, b) {\n        if (a.id < b.id) {\n            return -1;\n        }\n        if (a.id > b.id) {\n            return 1;\n        }\n        return 0;\n    }\n    static byStringProperty(a, b, field) {\n        return this.byStringValue(a[field], b[field]);\n    }\n    static byNumberProperty(a, b, field) {\n        return this.byNumberValue(a[field], b[field]);\n    }\n    /**\n     * Sort strings ASC order\n     */\n    static byStringValue(a, b) {\n        const af = a.toLowerCase();\n        const bf = b.toLowerCase();\n        if (af > bf) {\n            return 1;\n        }\n        if (af < bf) {\n            return -1;\n        }\n        return 0;\n    }\n    static byBooleanValue(a, b) {\n        if (a === b) {\n            return 0;\n        }\n        if (a && !b) {\n            return -1;\n        }\n        return 1;\n    }\n    static byEnumValue(a, b, enumObject) {\n        return Object.values(enumObject).indexOf(a) - Object.values(enumObject).indexOf(b);\n    }\n    /**\n     * Sort from large to small - DESC\n     */\n    static byNumberValue(a, b) {\n        if (a === b) {\n            return 0;\n        }\n        if (a > b) {\n            return -1;\n        }\n        return 1;\n    }\n    /**\n     * Sort from new to old - DESC\n     */\n    static byDateValue(a, b) {\n        if (a.getTime() === b.getTime()) {\n            return 0;\n        }\n        if (a > b) {\n            return -1;\n        }\n        return 1;\n    }\n    /**\n     * Return the first non zero value from a list, or zero if all values are zero\n     */\n    static stack(...sortResults) {\n        while (sortResults.length > 0) {\n            const f = sortResults.shift();\n            if (f !== 0) {\n                return f;\n            }\n        }\n        return 0;\n    }\n    static getMostOccuringElement(array) {\n        const counts = new Map();\n        for (const element of array) {\n            const count = counts.get(element);\n            if (count) {\n                counts.set(element, count + 1);\n            }\n            else {\n                counts.set(element, 1);\n            }\n        }\n        let maxCount = 0;\n        let mostOccuringElement;\n        for (const [element, count] of counts) {\n            if (count > maxCount) {\n                maxCount = count;\n                mostOccuringElement = element;\n            }\n        }\n        return mostOccuringElement;\n    }\n}\n//# sourceMappingURL=Sorter.js.map","import { DateTime } from 'luxon';\nimport { Sorter } from './Sorter';\nexport class Formatter {\n    static removeAccents(name) {\n        name = name.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n        return name;\n    }\n    static emailSenderName(name) {\n        return this.removeAccents(name).replace(/[^A-Za-z0-9-_]+/g, ' ').trim();\n    }\n    static slug(name) {\n        return this.removeAccents(name).toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+/, '').replace(/-+$/, '');\n    }\n    static slugEmail(name) {\n        return this.removeAccents(name).toLowerCase().replace(/[^a-z0-9_]+/g, '-').replace(/^-+/, '').replace(/-+$/, '');\n    }\n    static fileSlug(name) {\n        return this.removeAccents(name).replace(/[^A-Za-z0-9-]+/g, ' ').trim();\n    }\n    static removeDuplicateSpaces(name) {\n        return name.replace(/\\s+/, ' ');\n    }\n    static spaceString(str, spaceLength = 4, spaceChar = '\\u00A0') {\n        // Insert a non breaking space every 4 characters without a regex\n        let result = '';\n        for (let i = 0; i < str.length; i++) {\n            if (i % spaceLength === 0 && i > 0) {\n                result += spaceChar;\n            }\n            result += str[i];\n        }\n        return result;\n    }\n    static stringToNumber(str, maxInt = 256) {\n        let hash = 0;\n        for (let i = 0; i < str.length; i++) {\n            const char = str.charCodeAt(i);\n            hash = (hash << 5) - hash + char;\n        }\n        return Math.abs(hash) % maxInt;\n    }\n    /**\n     * 1 = january\n     */\n    static month(index) {\n        if (typeof index === 'object') {\n            const datetime = DateTime.fromJSDate(index).setZone(this.timezone);\n            index = datetime.month;\n        }\n        const monthNames = ['januari', 'februari', 'maart', 'april', 'mei', 'juni',\n            'juli', 'augustus', 'september', 'oktober', 'november', 'december',\n        ];\n        return monthNames[index - 1];\n    }\n    /**\n     * 1-31\n     */\n    static day(date) {\n        const datetime = DateTime.fromJSDate(date).setZone(this.timezone);\n        return datetime.day.toFixed(0);\n    }\n    static weekDay(date) {\n        if (!date) {\n            // Crash protection in case undefined get passed\n            return '?';\n        }\n        const monthNames = ['maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag', 'zondag'];\n        const datetime = DateTime.fromJSDate(date).setZone(this.timezone);\n        return monthNames[datetime.weekday - 1];\n    }\n    /**\n     * 1 januari (2020). Year only in different year and in the future, if withYear is null (default)\n     */\n    static date(date, withYear = null) {\n        if (!date) {\n            // Crash protection in case undefined get passed\n            return '?';\n        }\n        const currentYear = DateTime.now().setZone(this.timezone).year;\n        const datetime = DateTime.fromJSDate(date).setZone(this.timezone);\n        const year = datetime.year;\n        return datetime.day + ' ' + this.month(datetime.month) + (currentYear !== year || withYear === true || date < new Date() ? (' ' + year) : '');\n    }\n    /**\n     * 5 = 5 dagen\n     * 7 = 1 week\n     * 8 = 8 dagen\n     * ...\n     */\n    static days(days) {\n        const weeks = days / 7;\n        const dividable = days % 7;\n        if (weeks > 0 && dividable === 0) {\n            if (weeks === 1) {\n                return '1 week';\n            }\n            return weeks + ' weken';\n        }\n        if (days === 1) {\n            return '1 dag';\n        }\n        return `${days} dagen`;\n    }\n    static relativeTime(date, options) {\n        const now = Date.now();\n        let diff = now - date.getTime();\n        const days = Math.floor(diff / (60 * 1000 * 60 * 24));\n        diff = diff % (60 * 1000 * 60 * 24);\n        const hours = Math.floor(diff / (60 * 1000 * 60));\n        diff = diff % (60 * 1000 * 60);\n        const minutes = Math.floor(diff / (60 * 1000));\n        if (days > 0) {\n            if ((options === null || options === void 0 ? void 0 : options.days) === false || (options === null || options === void 0 ? void 0 : options.hours) === false) {\n                return this.dateTime(date, true, true);\n            }\n            if (days === 1) {\n                return 'één dag geleden';\n            }\n            return days + ' dagen geleden';\n        }\n        if (hours > 0) {\n            if ((options === null || options === void 0 ? void 0 : options.hours) === false) {\n                return this.dateTime(date, true, true);\n            }\n            if (hours === 1) {\n                return 'één uur geleden';\n            }\n            return hours + ' uur geleden';\n        }\n        if (minutes > 0) {\n            if (minutes === 1) {\n                return 'één minuut geleden';\n            }\n            return minutes + ' minuten geleden';\n        }\n        const seconds = Math.floor(diff / 1000);\n        if (seconds > 0) {\n            if (seconds === 1) {\n                return 'één seconde geleden';\n            }\n            return seconds + ' seconden geleden';\n        }\n        return 'zojuist';\n    }\n    /**\n     * januari 2020\n     */\n    static dateWithoutDay(date, options) {\n        var _a;\n        if (!date) {\n            // Crash protection in case undefined get passed\n            return '?';\n        }\n        const datetime = DateTime.fromJSDate(date).setZone((_a = options === null || options === void 0 ? void 0 : options.timezone) !== null && _a !== void 0 ? _a : this.timezone);\n        const year = datetime.year;\n        return this.month(datetime.month) + ' ' + year;\n    }\n    /**\n     * 2020\n     */\n    static year(date) {\n        if (!date) {\n            // Crash protection in case undefined get passed\n            return 0;\n        }\n        const datetime = DateTime.fromJSDate(date).setZone(this.timezone);\n        return datetime.year;\n    }\n    // 1 - 12\n    static monthNumber(date) {\n        if (!date) {\n            // Crash protection in case undefined get passed\n            return 0;\n        }\n        const datetime = DateTime.fromJSDate(date).setZone(this.timezone);\n        return datetime.month;\n    }\n    /**\n     * maandag, 1 januari (2020). Year only in different year\n     */\n    static dateWithDay(date, withYear = false) {\n        if (!date) {\n            // Crash protection in case undefined get passed\n            return '?';\n        }\n        return this.weekDay(date) + ', ' + this.date(date, withYear);\n    }\n    /**\n     * maandag, 1 januari (2020) om XX:XX. Year only in different year\n     */\n    static dateTimeWithDay(date, hideZero = false, withYear = false) {\n        if (!date) {\n            // Crash protection in case undefined get passed\n            return '?';\n        }\n        return this.weekDay(date) + ', ' + this.dateTime(date, hideZero, withYear);\n    }\n    /**\n     * 01/01/2020\n     */\n    static dateNumber(date, withYear = true) {\n        if (!date) {\n            // Crash protection in case undefined get passed\n            return '?';\n        }\n        const datetime = DateTime.fromJSDate(date).setZone(this.timezone);\n        return (datetime.day + '').padStart(2, '0') + '/' + (datetime.month + '').padStart(2, '0') + (withYear ? '/' + datetime.year : '');\n    }\n    /**\n     * 2020-01-31\n     */\n    static dateIso(date) {\n        if (!date) {\n            // Crash protection in case undefined get passed\n            return '?';\n        }\n        const datetime = DateTime.fromJSDate(date).setZone(this.timezone);\n        const year = datetime.year;\n        return year + '-' + (datetime.month + '').padStart(2, '0') + '-' + (datetime.day + '').padStart(2, '0');\n    }\n    /**\n     * 2020-01-31 00:00:00\n     */\n    static dateTimeIso(date, timezone) {\n        if (!date) {\n            // Crash protection in case undefined get passed\n            return '?';\n        }\n        const datetime = DateTime.fromJSDate(date).setZone(timezone !== null && timezone !== void 0 ? timezone : this.timezone);\n        const year = datetime.year;\n        return year + '-' + (datetime.month + '').padStart(2, '0') + '-' + (datetime.day + '').padStart(2, '0') + ' ' + (datetime.hour + '').padStart(2, '0') + ':' + (datetime.minute + '').padStart(2, '0') + ':' + (datetime.second + '').padStart(2, '0');\n    }\n    static startDate(startDate, includeDay = false, withYear = false, includeTime = null) {\n        if ((Formatter.time(startDate) === '0:00' && includeTime === null) || includeTime === false) {\n            if (includeDay) {\n                return Formatter.dateWithDay(startDate, withYear);\n            }\n            return Formatter.date(startDate, withYear);\n        }\n        if (includeDay) {\n            return Formatter.dateTimeWithDay(startDate, withYear);\n        }\n        return Formatter.dateTime(startDate, withYear);\n    }\n    static endDate(endDate, includeDay = false, withYear = false, includeTime = null) {\n        if ((Formatter.time(endDate) === '23:59' && includeTime === null) || includeTime === false) {\n            if (includeDay) {\n                return Formatter.dateWithDay(endDate, withYear);\n            }\n            return Formatter.date(endDate, withYear);\n        }\n        if (includeDay) {\n            return Formatter.dateTimeWithDay(endDate, withYear);\n        }\n        return Formatter.dateTime(endDate, false, withYear);\n    }\n    static dateRange(startDate, endDate, join = ' - ', includeTime = null) {\n        if (Formatter.dateIso(startDate) === Formatter.dateIso(endDate)) {\n            if (Formatter.time(startDate) === Formatter.time(endDate) || includeTime === false) {\n                return Formatter.dateWithDay(startDate) + (includeTime !== false ? (', ' + Formatter.time(startDate)) : '');\n            }\n            if (Formatter.time(startDate) === '0:00' && Formatter.time(endDate) === '23:59') {\n                return Formatter.dateWithDay(startDate);\n            }\n            return Formatter.dateWithDay(startDate) + ', ' + Formatter.time(startDate) + join + Formatter.time(endDate);\n        }\n        // If start in evening and end on the next morning: only mention date once\n        const differentYear = startDate < new Date() || Formatter.year(startDate) !== Formatter.year(endDate) || Formatter.year(startDate) !== Formatter.year(new Date());\n        if (Formatter.dateIso(startDate) === Formatter.dateIso(new Date(endDate.getTime() - 24 * 60 * 60 * 1000)) && Formatter.timeIso(endDate) <= '07:00' && Formatter.timeIso(startDate) >= '12:00') {\n            return Formatter.dateWithDay(startDate, differentYear) + (includeTime !== false ? (', ' + Formatter.time(startDate) + join + Formatter.time(endDate)) : '');\n        }\n        if (Formatter.monthNumber(startDate) === Formatter.monthNumber(endDate) && Formatter.year(startDate) === Formatter.year(endDate)) {\n            // Only repeat number\n            if (includeTime === false || (Formatter.time(startDate) === '0:00' && Formatter.time(endDate) === '23:59')) {\n                const currentYear = DateTime.now().setZone(this.timezone).year;\n                const startDatetime = DateTime.fromJSDate(startDate).setZone(this.timezone);\n                const endDatetime = DateTime.fromJSDate(endDate).setZone(this.timezone);\n                const year = startDatetime.year;\n                return startDatetime.day + join + endDatetime.day + ' ' + this.month(startDatetime.month) + (currentYear !== year || startDate < new Date() ? (' ' + year) : '');\n            }\n        }\n        return Formatter.startDate(startDate, false, differentYear, includeTime) + join + Formatter.endDate(endDate, false, differentYear, includeTime);\n    }\n    /**\n     * 12:00\n     */\n    static time(date, timeZone = this.timezone) {\n        if (!date) {\n            // Crash protection in case undefined get passed\n            return '?';\n        }\n        const datetime = DateTime.fromJSDate(date).setZone(timeZone);\n        return datetime.hour + ':' + (datetime.minute + '').padStart(2, '0');\n    }\n    static luxon(date = new Date()) {\n        return DateTime.fromJSDate(date).setZone(this.timezone);\n    }\n    /**\n     * 12:00\n     */\n    static timeIso(date) {\n        if (!date) {\n            // Crash protection in case undefined get passed\n            return '?';\n        }\n        const datetime = DateTime.fromJSDate(date).setZone(this.timezone);\n        return (datetime.hour + '').padStart(2, '0') + ':' + (datetime.minute + '').padStart(2, '0');\n    }\n    static uniqueArray(array) {\n        function onlyUnique(value, index, self) {\n            return self.indexOf(value) === index;\n        }\n        return array.filter(onlyUnique);\n    }\n    /**\n     * 1 januari (2020) om 12:00. Year only in different year\n     */\n    static dateTime(date, hideZero = false, withYear = false) {\n        if (!date) {\n            // Crash protection in case undefined get passed\n            return '?';\n        }\n        if (hideZero && this.time(date) === '0:00') {\n            return this.date(date, withYear);\n        }\n        return this.date(date, withYear) + ' om ' + this.time(date);\n    }\n    static integer(value) {\n        const formatted = new Intl.NumberFormat('nl-BE').format(Math.abs(value));\n        const v = (value < 0 ? '- ' : '') + formatted;\n        return v;\n    }\n    static float(value) {\n        const formatted = new Intl.NumberFormat('nl-BE', { maximumFractionDigits: 2 }).format(Math.abs(value));\n        const v = (value < 0 ? '- ' : '') + formatted;\n        return v;\n    }\n    static percentage(value) {\n        const formatted = new Intl.NumberFormat('nl-BE').format(Math.abs(value / 100));\n        const v = (value < 0 ? '- ' : '') + formatted;\n        return v + '%';\n    }\n    static price(value, removeZeroDecimals = true) {\n        const formatted = new Intl.NumberFormat('nl-BE', {\n            style: 'currency',\n            currency: 'EUR',\n        }).format(Math.abs(value) / 100);\n        const v = (value < 0 ? '- ' : '') + formatted.replace(new RegExp('EUR', 'ig'), '€');\n        if (removeZeroDecimals && (v.endsWith(',00') || v.endsWith('.00'))) {\n            return v.substring(0, v.length - 3);\n        }\n        return v;\n    }\n    static priceChange(value) {\n        if (value >= 0) {\n            return '+ ' + this.price(value);\n        }\n        return this.price(value);\n    }\n    static capitalizeFirstLetter(string) {\n        return string.charAt(0).toUpperCase() + string.slice(1);\n    }\n    static capitalizeWords(string) {\n        return string.split(' ').map(s => this.capitalizeFirstLetter(s)).join(' ');\n    }\n    static fileSize(bytes) {\n        if (bytes < 1000) {\n            return bytes + ' bytes';\n        }\n        if (bytes < 1000 * 1000) {\n            return Math.round(bytes / 1000) + ' kB';\n        }\n        if (bytes < 1000 * 1000 * 1000) {\n            return Math.round(bytes / 1000 / 100) / 10 + ' MB';\n        }\n        return Math.round(bytes / 1000 / 1000 / 10) / 100 + ' GB';\n    }\n    static minutesPadded(minutes) {\n        const h = Math.floor(minutes / 60);\n        const m = minutes - h * 60;\n        return (h + '').padStart(2, '0') + ':' + (m + '').padStart(2, '0');\n    }\n    static timeIndex(minutes) {\n        const h = Math.floor(minutes / 60);\n        const m = minutes - h * 60;\n        return (h + '').padStart(2, '0') + (m + '').padStart(2, '0');\n    }\n    static minutes(minutes) {\n        const h = Math.floor(minutes / 60);\n        const m = minutes - h * 60;\n        return h + ':' + (m + '').padStart(2, '0');\n    }\n    static escapeHtml(unsafe) {\n        if (!unsafe) {\n            return '';\n        }\n        return unsafe\n            .replace(/&/g, '&amp;')\n            .replace(/</g, '&lt;')\n            .replace(/>/g, '&gt;')\n            .replace(/\"/g, '&quot;')\n            .replace(/'/g, '&#039;');\n    }\n    static joinLast(array, separator, lastSeparator) {\n        array = array.slice();\n        const last = array.pop();\n        if (last === undefined) {\n            return '';\n        }\n        if (array.length === 0) {\n            return last + '';\n        }\n        return array.join(separator) + lastSeparator + last;\n    }\n    static ordinalNumber(number) {\n        if (number === 1) {\n            return 'eerste';\n        }\n        if (number === 2) {\n            return 'tweede';\n        }\n        if (number === 3) {\n            return 'derde';\n        }\n        return number + 'e';\n    }\n    static pluralText(num, singular, plural) {\n        if (num === 1) {\n            return 'één ' + singular;\n        }\n        return this.float(num) + ' ' + plural;\n    }\n    static groupNamesByFamily(names) {\n        const n = names.slice().sort((a, b) => Sorter.stack(a.lastName.localeCompare(b.lastName), a.firstName.localeCompare(b.firstName)));\n        const firstNames = this.uniqueArray(n.map(n => n.firstName));\n        const lastNames = this.uniqueArray(n.map(n => n.lastName));\n        return this.joinLast(firstNames, ', ', ' en ') + (lastNames.length > 0 ? (' ' + lastNames.join('-')) : '');\n    }\n    static firstLetters(str, maxLength) {\n        if (!str) {\n            return '';\n        }\n        if (maxLength === 1) {\n            return str.substr(0, 1).toLocaleUpperCase();\n        }\n        const splitted = Formatter.slug(str).split('-');\n        return splitted.slice(0, maxLength).map(s => s.substr(0, 1).toLocaleUpperCase()).join('');\n    }\n    static injectPattern(value, parts) {\n        let result = '';\n        for (const part of parts) {\n            if (typeof part === 'string') {\n                result += part;\n                continue;\n            }\n            result += value.substring(0, part.length);\n            value = value.substring(part.length);\n            if (value.length === 0) {\n                break;\n            }\n        }\n        return result;\n    }\n}\nFormatter.timezone = 'Europe/Brussels';\n//# sourceMappingURL=Formatter.js.map","import { Formatter } from './Formatter';\nexport class DataValidator {\n    static isEmailValid(str) {\n        const blockList = ['gmail.be', 'gmail.nl', 'hotmail.c', 'hotmail.co', 'gmail.co', 'gmail.c', 'gmail.co', 'gmal.com', 'glail.com', 'gmail.col', 'gamil.com', 'gmail.con', 'icloud.be'];\n        const regex = /^[a-zA-Z0-9.!#$%&*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/;\n        if (!regex.test(str)) {\n            return false;\n        }\n        for (const l of blockList) {\n            if (str.endsWith('@' + l)) {\n                return false;\n            }\n        }\n        return true;\n    }\n    static isUitpasNumberValid(str) {\n        return this.UITPAS_NUMBER_REGEX.test(str);\n    }\n    static isUuid(value) {\n        if (typeof value !== 'string') {\n            return false;\n        }\n        return value.length === 36 && value[8] === '-' && value[13] === '-' && value[18] === '-' && value[23] === '-';\n    }\n    static isUitpasNumberKansenTarief(str) {\n        const isValid = this.isUitpasNumberValid(str);\n        if (!isValid) {\n            return false;\n        }\n        const char = str[str.length - 2];\n        return char === '1';\n    }\n    static verifyBelgianNationalNumber(text) {\n        const trimmed = text.replace(/[^0-9]+/g, ''); // keep A-Z for validation\n        if (trimmed.length !== 11) {\n            return false;\n        }\n        const toCheck = parseInt(trimmed.substring(0, trimmed.length - 2));\n        const checksum = parseInt(trimmed.substring(trimmed.length - 2));\n        // we calculate the expected checksum. again\n        const realChecksum = 97 - (toCheck % 97); // Dates before 2000\n        const realChecksum2 = 97 - ((2000000000 + toCheck) % 97); // Dates after 2000\n        if (STAMHOOFD.environment === 'development') {\n            return true;\n        }\n        if (checksum === realChecksum || checksum === realChecksum2) {\n            // Check birth day via doesMatchBelgianNationalNumber\n            return true;\n        }\n        return false;\n    }\n    static doesMatchBelgianNationalNumber(text, birthDay) {\n        if (!birthDay) {\n            return true;\n        }\n        // Check if year, month and day matches\n        const generated = this.generateBelgianNationalNumber(birthDay);\n        if (this.formatBelgianNationalNumber(text).startsWith(generated)) {\n            return true;\n        }\n        return false;\n    }\n    static cleanBelgianNationalNumber(text) {\n        return text.replace(/[^0-9]+/g, '');\n    }\n    static getBelgianNationalNumberInputFormatter() {\n        return {\n            cleaner: (value) => {\n                return this.cleanBelgianNationalNumber(value);\n            },\n            formatter: (value) => {\n                return this.formatBelgianNationalNumber(value);\n            },\n        };\n    }\n    static formatBelgianNationalNumber(text) {\n        const trimmed = this.cleanBelgianNationalNumber(text);\n        // JJ.MM.DD-XXX.XX\n        return Formatter.injectPattern(trimmed, [\n            { length: 2 },\n            '.',\n            { length: 2 },\n            '.',\n            { length: 2 },\n            '-',\n            { length: 3 },\n            '.',\n            { length: 2 },\n        ]);\n    }\n    static generateBelgianNationalNumber(date) {\n        // JJ.MM.DD-\n        const year = Formatter.year(date).toFixed();\n        const month = Formatter.monthNumber(date).toFixed();\n        const day = Formatter.day(date);\n        return year.substring(2) + '.' + month.padStart(2, '0') + '.' + day.padStart(2, '0') + '-';\n    }\n}\nDataValidator.UITPAS_NUMBER_REGEX = /^\\d{10,13}$/;\n//# sourceMappingURL=DataValidator.js.map","export function sleep(ms) {\n    return new Promise(resolve => setTimeout(() => resolve(undefined), ms));\n}\n//# sourceMappingURL=Sleep.js.map","import { Formatter } from './Formatter';\nexport class StringCompare {\n    /**\n     * Return the search score = percentage (floating point) that matches.\n     * Returns zero if no match is found or if minimum percentage is not met\n     */\n    static contains(haystack, needle) {\n        haystack = haystack.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').toLowerCase().replace(/\\s+/, ' ').trim();\n        needle = needle.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').toLowerCase().replace(/\\s+/, ' ').trim();\n        return haystack.includes(needle);\n    }\n    /**\n     * Return the search score = percentage (floating point) that matches.\n     * Returns zero if no match is found or if minimum percentage is not met\n     */\n    static searchScore(haystack, needle, minimumPercentage = 10, minimumChars = 2) {\n        if (haystack.length === 0) {\n            return 0;\n        }\n        haystack = haystack.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').toLowerCase().replace(/\\s+/, ' ').trim();\n        needle = needle.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').toLowerCase().replace(/\\s+/, ' ').trim();\n        const overlap = this.compare(needle, haystack);\n        if ((minimumChars === null || overlap > minimumChars) && (minimumPercentage === null || overlap >= haystack.length * minimumPercentage / 100)) {\n            return overlap;\n        }\n        return 0;\n    }\n    /**\n     * Return the amount of characters that are equal (allowing to detect typo's)\n     */\n    static compare(left, right, allowSplit = true) {\n        if (left.length === 0 || right.length === 0) {\n            return 0;\n        }\n        const firstLeft = left[0];\n        const firstRight = right[0];\n        if (firstLeft === firstRight) {\n            return 1 + this.compare(left.substr(1), right.substr(1), true);\n        }\n        if (allowSplit) {\n            return Math.max(this.compare(left, right.substr(1), false), this.compare(right, left.substr(1), false), this.compare(left.substr(1), right.substr(1), false), this.compare(right.substr(1), left.substr(1), false));\n        }\n        // no split allowed -> continue to remove right side\n        return this.compare(left, right.substr(1), false);\n    }\n    static matchCount(original, compareWith) {\n        // remove special chars + lowercase\n        original = original.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').toLowerCase().replace(/\\s+/, ' ').trim();\n        compareWith = compareWith.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').toLowerCase().replace(/\\s+/, ' ').trim();\n        return this.compare(original, compareWith);\n    }\n    static typoCount(original, compareWith) {\n        // remove special chars + lowercase\n        original = original.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').toLowerCase().replace(/\\s+/, ' ').trim();\n        compareWith = compareWith.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').toLowerCase().replace(/\\s+/, ' ').trim();\n        return Math.max(original.length, compareWith.length) - this.compare(original, compareWith);\n    }\n    /**\n     * Return true if the user typed in full caps (sigh)\n     */\n    static isFullCaps(str) {\n        const fn = Formatter.removeAccents(str);\n        if (fn.toUpperCase() === fn) {\n            return true;\n        }\n        return false;\n    }\n}\n//# sourceMappingURL=StringCompare.js.map","export const throttle = (func, limit) => {\n    let lastFunc;\n    let lastRan;\n    return function () {\n        const context = this;\n        // eslint-disable-next-line prefer-rest-params\n        const args = arguments;\n        if (lastRan) {\n            clearTimeout(lastFunc);\n        }\n        lastRan = Date.now();\n        lastFunc = setTimeout(function () {\n            if (Date.now() - lastRan >= limit) {\n                func.apply(context, args);\n                lastRan = Date.now();\n            }\n        }, limit - (Date.now() - lastRan));\n    };\n};\n//# sourceMappingURL=Throttle.js.map","import { EnumDecoder } from '@simonbackx/simple-encoding';\n// The Country enum is also defined in environment.d.ts - they should remain in sync to avoid compilation errors\nexport var Country;\n(function (Country) {\n    Country[\"Belgium\"] = \"BE\";\n    Country[\"Netherlands\"] = \"NL\";\n    Country[\"Luxembourg\"] = \"LU\";\n    Country[\"France\"] = \"FR\";\n    Country[\"Germany\"] = \"DE\";\n    Country[\"Sweden\"] = \"SE\";\n    Country[\"UnitedKingdom\"] = \"GB\";\n    Country[\"Switzerland\"] = \"CH\";\n    Country[\"Afghanistan\"] = \"AF\";\n    Country[\"CzechRepublic\"] = \"CZ\";\n    Country[\"UnitedStates\"] = \"US\";\n    Country[\"Austria\"] = \"AT\";\n    Country[\"Portugal\"] = \"PT\";\n    Country[\"Other\"] = \"OTHER\";\n})(Country || (Country = {}));\nexport function countryToCode({ country, defaultCountryCode }) {\n    if (country === Country.Other) {\n        return defaultCountryCode;\n    }\n    return country;\n}\n// We export an instance to prevent creating a new instance every time we need to decode a number\nexport const CountryDecoder = new EnumDecoder(Country);\nexport class CountryHelper {\n    static getName(country) {\n        switch (country) {\n            case Country.Belgium: return 'België';\n            case Country.Netherlands: return 'Nederland';\n            case Country.Luxembourg: return 'Luxemburg';\n            case Country.France: return 'Frankrijk';\n            case Country.Germany: return 'Duitsland';\n            case Country.Sweden: return 'Zweden';\n            case Country.UnitedKingdom: return 'Verenigd Koninkrijk';\n            case Country.Switzerland: return 'Zwitserland';\n            case Country.Afghanistan: return 'Afghanistan';\n            case Country.CzechRepublic: return 'Tsjechië';\n            case Country.UnitedStates: return 'Verenigde Staten';\n            case Country.Austria: return 'Oostenrijk';\n            case Country.Portugal: return 'Portugal';\n            case Country.Other: return 'Ander land';\n        }\n    }\n    static getList() {\n        return Object.values(Country).map((country) => {\n            return {\n                text: this.getName(country),\n                value: country,\n            };\n        });\n    }\n}\n//# sourceMappingURL=CountryDecoder.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, field, ObjectData, StringDecoder } from '@simonbackx/simple-encoding';\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { Formatter, StringCompare } from '@stamhoofd/utility';\nimport { Country, CountryDecoder, CountryHelper } from './CountryDecoder.js';\nexport class Address extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.street = '';\n        this.number = '';\n        this.postalCode = '';\n        this.city = '';\n    }\n    get id() {\n        return this.toString();\n    }\n    static patchIdentifier() {\n        return StringDecoder;\n    }\n    toString() {\n        return this.street + ' ' + this.number + ', ' + this.postalCode + ' ' + this.city + ', ' + CountryHelper.getName(this.country);\n    }\n    shortString() {\n        return this.street + ' ' + this.number + ', ' + this.city;\n    }\n    getDiffName() {\n        return this.shortString();\n    }\n    anonymousString(currentCountry) {\n        if (this.country == currentCountry) {\n            return this.street + ', ' + this.city;\n        }\n        return this.street + ', ' + this.city + ' (' + CountryHelper.getName(this.country) + ')';\n    }\n    /**\n     * @deprecated\n     * Use .create({}) instead\n     */\n    static createDefault(country = $getCountry()) {\n        return Address.create({\n            street: '',\n            number: '',\n            postalCode: '',\n            city: '',\n            country,\n        });\n    }\n    /**\n     * Call this to clean up capitals in all the available data\n     */\n    cleanData() {\n        if (StringCompare.isFullCaps(this.street)) {\n            this.street = Formatter.capitalizeWords(this.street.toLowerCase());\n        }\n        if (StringCompare.isFullCaps(this.city)) {\n            this.city = Formatter.capitalizeWords(this.city.toLowerCase());\n        }\n        this.number = this.number.trim();\n        this.street = Formatter.capitalizeFirstLetter(this.street.trim());\n        this.city = Formatter.capitalizeFirstLetter(this.city.trim());\n        this.postalCode = this.postalCode.trim().toLocaleUpperCase();\n    }\n    static createFromFields(addressLine1, postalCode, city, country) {\n        const { street, number } = Address.splitAddressLine(addressLine1);\n        if (postalCode.length == 0) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Empty postalcode',\n                human: 'Vul de postcode in',\n            });\n        }\n        if (city.length == 0) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Empty city',\n                human: 'Vul de gemeente in',\n            });\n        }\n        let c;\n        try {\n            c = CountryDecoder.decode(new ObjectData(country, { version: 0 }));\n        }\n        catch (e) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Invalid country',\n                human: 'Selecteer een land',\n                field: 'country',\n            });\n        }\n        city = city.trim();\n        if (city.match(/[0-9]/)) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Invalid city',\n                human: 'De gemeente mag geen cijfers bevatten.',\n                field: 'city',\n            });\n        }\n        if (c === Country.Belgium) {\n            postalCode = postalCode.trim();\n            if (postalCode.length !== 4 || !postalCode.match(/^[0-9]+$/)) {\n                throw new SimpleError({\n                    code: 'invalid_field',\n                    message: 'Invalid postalCode',\n                    human: 'Ongeldige postcode. Een postcode moet uit 4 cijfers bestaan.',\n                    field: 'postalCode',\n                });\n            }\n        }\n        if (c === Country.Netherlands) {\n            postalCode = postalCode.trim();\n            const firstFour = postalCode.substring(0, 4);\n            const remaining = postalCode.substring(4).trim().toLocaleUpperCase();\n            if (firstFour.length !== 4 || !firstFour.match(/^[0-9]+$/) || remaining.length !== 2 || !remaining.match(/^[A-Z]+$/)) {\n                throw new SimpleError({\n                    code: 'invalid_field',\n                    message: 'Invalid postalCode',\n                    human: 'Ongeldige postcode. Een postcode moet beginnen met 4 cijfers en eindigen op 2 letters, bv. 9000 AB',\n                    field: 'postalCode',\n                });\n            }\n            postalCode = firstFour + ' ' + remaining;\n        }\n        const address = Address.create({\n            street,\n            number,\n            postalCode: postalCode,\n            city: city,\n            country: c,\n        });\n        address.cleanData();\n        return address;\n    }\n    static splitAddressLine(addressLine1) {\n        if (addressLine1.length == 0) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Empty address line 1',\n                human: 'Vul de straat en huisnummer in',\n            });\n        }\n        if (addressLine1.includes(',')) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Empty address line 1',\n                human: 'De straat bevat een komma. Verwijder die uit het adres en kijk na of het wel correct werd ingevuld.',\n            });\n        }\n        if (addressLine1.length > 500) {\n            // Helps with DoS attacks on the Regex\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Empty address line 1',\n                human: 'Het adres is te lang. Controleer of het correct werd ingevuld.',\n            });\n        }\n        // Get position of last letter\n        const match = /^\\s*([^0-9\\s][^0-9]+?)[\\s,]+([0-9].*?)\\s*$/.exec(addressLine1);\n        if (!match) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Missing number in address line 1',\n                human: 'Het huisnummer ontbreekt in het opgegeven adres',\n            });\n        }\n        const number = match[2];\n        const street = match[1];\n        return {\n            number,\n            street,\n        };\n    }\n    throwIfIncomplete() {\n        if (this.street.trim().length == 0) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Empty street',\n                human: 'De straat is verplicht',\n            });\n        }\n        if (this.number.trim().length == 0) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Empty number',\n                human: 'Het huisnummer is verplicht',\n            });\n        }\n        if (this.postalCode.trim().length == 0) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Empty postal code',\n                human: 'De postcode is verplicht',\n            });\n        }\n        if (this.city.trim().length == 0) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Empty city',\n                human: 'De gemeente is verplicht',\n            });\n        }\n        if (this.country == null) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Empty country',\n                human: 'Het land is verplicht',\n            });\n        }\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], Address.prototype, \"street\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Address.prototype, \"number\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Address.prototype, \"postalCode\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Address.prototype, \"city\", void 0);\n__decorate([\n    field({ decoder: CountryDecoder, defaultValue: () => $getCountry() })\n], Address.prototype, \"country\", void 0);\nexport class ValidatedAddress extends Address {\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], ValidatedAddress.prototype, \"cityId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], ValidatedAddress.prototype, \"parentCityId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], ValidatedAddress.prototype, \"provinceId\", void 0);\n//# sourceMappingURL=Address.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { CountryDecoder } from './CountryDecoder.js';\nexport class Province extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], Province.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Province.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: CountryDecoder })\n], Province.prototype, \"country\", void 0);\n//# sourceMappingURL=Province.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { CountryDecoder } from './CountryDecoder.js';\nimport { Province } from './Province.js';\nexport class City extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.parentCityId = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], City.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], City.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: Province })\n], City.prototype, \"province\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], City.prototype, \"parentCityId\", void 0);\n__decorate([\n    field({ decoder: CountryDecoder })\n], City.prototype, \"country\", void 0);\n//# sourceMappingURL=City.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Address } from './Address.js';\nexport class Premise extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.description = '';\n        this.premiseTypeIds = [];\n        this.address = Address.createDefault();\n    }\n    static createDefault(country) {\n        return Premise.create({ address: Address.createDefault(country) });\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], Premise.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 323 })\n], Premise.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 323 })\n], Premise.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder) })\n], Premise.prototype, \"premiseTypeIds\", void 0);\n__decorate([\n    field({ decoder: Address })\n], Premise.prototype, \"address\", void 0);\n//# sourceMappingURL=Premise.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, field } from '@simonbackx/simple-encoding';\nimport { City } from './City.js';\nimport { CountryDecoder } from './CountryDecoder.js';\nimport { Province } from './Province.js';\nexport class SearchRegions extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.cities = [];\n        this.provinces = [];\n        this.countries = [];\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(City) })\n], SearchRegions.prototype, \"cities\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Province) })\n], SearchRegions.prototype, \"provinces\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(CountryDecoder) })\n], SearchRegions.prototype, \"countries\", void 0);\n//# sourceMappingURL=SearchRegions.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Address } from './addresses/Address.js';\nexport class Company extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Legal name of the organization (optional)\n         */\n        this.name = '';\n        this.VATNumber = null;\n        this.companyNumber = null;\n        this.address = null;\n        this.administrationEmail = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, optional: true, defaultValue: () => uuidv4() })\n], Company.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Company.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], Company.prototype, \"VATNumber\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], Company.prototype, \"companyNumber\", void 0);\n__decorate([\n    field({ decoder: Address, nullable: true })\n], Company.prototype, \"address\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, optional: true })\n], Company.prototype, \"administrationEmail\", void 0);\n//# sourceMappingURL=Company.js.map","export default {\n    'parent': 'ouder',\n    'parents': 'ouders',\n    'address': 'adres',\n    'address.street': 'straat',\n    'address.number': 'huisnummer',\n    'address.postalCode': 'postcode',\n    'address.city': 'gemeente',\n    'address.country': 'land',\n    'email': 'e-mailadres',\n    'emails': 'e-mailadressen',\n    'phone': 'GSM-nummer',\n    'firstName': 'voornaam',\n    'lastName': 'achternaam',\n    'nationalRegisterNumber': 'rijksregisternummer',\n    'birthDay': 'geboortedatum',\n    'dataPermissions': 'toestemming gegevensverwerking',\n    'notes': 'notities',\n    'name': 'naam',\n    'description': 'omschrijving',\n    'isLocationRequired': 'locatie verplicht',\n    'membershipType': 'aansluitingstype',\n    'membershipTypes': 'aansluitingen en verzekeringen',\n    'period': 'werkjaar',\n    'periods': 'werkjaren',\n    'responsibility': 'functie',\n    'responsibilities': 'functies',\n    'recordsConfiguration': 'persoonsgegevens',\n    'defaultAgeGroups': 'standaard leeftijdsgroepen',\n    'defaultAgeGroup': 'standaard leeftijdsgroep',\n    'eventTypes': 'soorten activiteiten',\n    'eventType': 'soort activiteit',\n    'horizontalLogo': 'horizontaal logo',\n    'squareLogo': 'vierkant logo',\n    'logoDocuments': 'logo op documenten',\n    'color': 'huisstijlkleur',\n    'price': 'prijs',\n    'price.price': 'prijs',\n    'price.reducedPrice': 'verlaagd tarief',\n    'prices': 'prijzen',\n    'minimumMembers': 'minimum aantal',\n    'locked': 'vergrendeld',\n    'on': 'aan',\n    'off': 'uit',\n    'uitpasNumber': 'uitpasnummer',\n    'alwaysEnabledAndRequired': 'altijd ingeschakeld en verplicht',\n    'alwaysEnabledAndOptional': 'altijd ingeschakeld en optioneel',\n    'sometimesEnabledAndOptional': 'soms ingeschakeld en optioneel',\n    'alwaysEnabledAndSometimesRequired': 'altijd ingeschakeld en soms verplicht',\n    'sometimesEnabledAndRequired': 'soms ingeschakeld en verplicht',\n    'sometimesEnabledAndSometimesRequired': 'soms ingeschakeld en soms verplicht',\n    'emergencyContact': 'noodcontactpersoon',\n    'emergencyContacts': 'noodcontactpersonen',\n    'roles': 'externe beheerdersrollen',\n    'role': 'externe beheerdersrol',\n    'location': 'locatie',\n    'securityCode': 'beveiligingscode',\n    'defaultEmailId': 'standaard e-mailadres',\n    'allowRegistrationsByOrganization': 'inschrijvingen door groep toelaten',\n    'title': 'titel',\n    'requiresFinancialSupport': 'financiële ondersteuning',\n    'alternativeEmail': 'alternatief e-mailadres',\n    'alternativeEmails': 'alternatieve e-mailadressen',\n    'default': 'standaard',\n    'paymentConfiguration': 'betaalinstellingen',\n    'registrationPaymentConfiguration': 'betaalinstellingen voor inschrijvingen',\n    'paymentMethod': 'betaalmethode',\n    'paymentMethods': 'betaalmethoden',\n    'premiseTypeId': 'type lokaal',\n    'premises': 'lokalen',\n    'premise': 'lokaal',\n    'group': 'groep',\n    'defaultAgeGroupId': 'standaard leeftijdsgroep',\n    'inheritedResponsibilityRoles': 'ingebouwde functies',\n    'resource': 'toegang tot',\n    'level': 'toegangsniveau',\n    'accessRight': 'toegangsrecht',\n    'permissions': 'rechten',\n    'permission': 'recht',\n    'None': 'geen rechten',\n    'Read': 'lezen',\n    'Write': 'bewerken',\n    'Full': 'volledige toegang',\n    'WebshopScanTickets': 'tickets scannen',\n    'EventWrite': 'activiteiten bewerken',\n    'MemberManageNRN': 'rijksregisternummers beheren',\n    'MemberWriteFinancialData': 'financiële gegevens bewerken',\n    'MemberReadFinancialData': 'financiële gegevens lezen',\n    'OrganizationCreateGroups': 'groepen aanmaken',\n    'OrganizationFinanceDirector': 'toegang tot volledige boekhouding',\n    'OrganizationManagePayments': 'overschrijvingen beheren',\n    'PlatformLoginAs': 'inloggen als hoofdbeheerder',\n    'inheritedRecordCategory': 'ingebouwde gegevens',\n    'inheritedRecordCategories': 'ingebouwde gegevens',\n    'freeContribution': 'vrije bijdrage',\n    'amount': 'bedrag',\n    'organizationTagId': 'regio',\n    'richText': 'tekst',\n    'checkbox': 'aankruisvakje',\n    'recordCategories': 'vragenlijsten',\n    'recordCategory': 'vragenlijst',\n    'record': 'vraag',\n    'records': 'vragen',\n    'required': 'verplicht',\n    'Text': 'tekstveld',\n    'childCategories': 'categorieën',\n    'defaultEnabled': 'standaard ingeschakeld',\n    'paymentMethodSettings': 'betaalinstellingen',\n    'paymentMethodSetting': 'betaalinstelling',\n    'optionMenus': \"keuzemenu's\",\n    'optionMenu': 'keuzemenu',\n    'options': 'keuzes',\n    'option': 'keuze',\n    'allowAmount': 'meerdere stuks',\n    'recordAnswers': 'gegevens',\n    'recordAnswer': 'gegeven',\n    'nationalRegisterNumberOptOut': 'geen Belgische nationaliteit',\n    'unchecked': 'niet aangevinkt',\n    'checked': 'aangevinkt',\n    'groupId': 'inschrijvingsgroep',\n    'groupIds': 'inschrijvingsgroepen',\n    'registrations': 'inschrijvingen',\n    'registration': 'inschrijving',\n    'waitingList': 'wachtlijst',\n    'registrationPeriods': 'werkjaren',\n    'registrationPeriod': 'werkjaar',\n    'categories': 'categorieën',\n    'category': 'categorie',\n    'categoryIds': 'categorieën',\n    'setupSteps.steps': 'vlagmoment',\n    'setupSteps': 'vlagmoment',\n    'reviewedBy': 'nagekeken door',\n    'reviewedAt': 'nagekeken op',\n    'steps': 'stappen',\n    'products': 'artikels',\n    'product': 'artikel',\n    'transferSettings': 'overschrijvingsinstellingen',\n    'iban': 'IBAN',\n    'stock': 'voorraad',\n    'usedStock': 'aantal verkocht',\n    'untitled': 'naamloos',\n    'prices.untitled': 'standaard prijs',\n    'phoneEnabled': 'GSM-nummer vragen',\n    'notificationEmail': 'Meldingen naar e-mailadres',\n    'cart.items': 'bestelde artikels',\n    'cart.item': 'besteld artikel',\n    'cart': 'winkelmandje',\n    'administrationFee': 'administratiekost',\n    'totalPrice': 'totaalprijs',\n    'customer': 'besteller',\n    'memberNumber': 'lidnummer',\n    'number': 'nummer',\n    'paidAt': 'betaald op',\n    'startDate': 'startdatum',\n    'endDate': 'einddatum',\n    'ibanName': 'naam op bankkaart',\n    'organizationCount': 'aantal groepen',\n    'fieldAnswers': 'antwoorden',\n    'fieldAnswer': 'antwoord',\n    'updatesEnabled': 'automatisch wijzigen',\n    'html': 'inhoud',\n    'password': 'wachtwoord',\n    'emailVerified': 'e-mailadres geverifieerd',\n    'linkedMember': 'gekoppeld lid',\n    'permissions.organizationPermissions': 'groepsrechten',\n    'balanceNotificationSettings': 'betaalherinneringen',\n    'balanceNotificationSettings.organizationContactsFilter.meta.responsibilityIds.$in': 'Betaalherinnering naar verenigingen: functies',\n    'reviewTimes.times': 'laatst nagekeken',\n    'reviewTime.details': 'algemene gegevens',\n    'reviewTime.parents': 'ouders',\n    'reviewTime.emergencyContacts': 'noodcontactpersonen',\n    'reviewTime.records': 'persoonsgegevens',\n    'reviewTime.uitpasNumber': 'UiTPAS-nummer',\n    'reviewTimes': 'laatst nagekeken',\n    'updatedAt': 'laatst gewijzigd op',\n};\n//# sourceMappingURL=audit-log-words.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, EnumDecoder, field, NumberDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { DataValidator } from '@stamhoofd/utility';\nimport wordDictionary from './data/audit-log-words.js';\n/**\n * The audit log dependes on a lot of other structures. To avoid creating circular dependencies\n * We inject them afterwards since these dependencies are only used at runtime\n */\nexport const AuditLogReplacementDependencies = {\n    enumHelpers: [],\n    uuidToName: (() => null),\n};\nexport var AuditLogReplacementType;\n(function (AuditLogReplacementType) {\n    // Base\n    AuditLogReplacementType[\"Key\"] = \"Key\";\n    AuditLogReplacementType[\"Array\"] = \"Array\";\n    AuditLogReplacementType[\"Uuid\"] = \"Uuid\";\n    AuditLogReplacementType[\"Color\"] = \"Color\";\n    AuditLogReplacementType[\"Image\"] = \"Image\";\n    AuditLogReplacementType[\"File\"] = \"File\";\n    AuditLogReplacementType[\"Html\"] = \"Html\";\n    AuditLogReplacementType[\"LongText\"] = \"LongText\";\n    // Objects\n    AuditLogReplacementType[\"Member\"] = \"Member\";\n    AuditLogReplacementType[\"User\"] = \"User\";\n    AuditLogReplacementType[\"Organization\"] = \"Organization\";\n    AuditLogReplacementType[\"Group\"] = \"Group\";\n    AuditLogReplacementType[\"Event\"] = \"Event\";\n    AuditLogReplacementType[\"RegistrationPeriod\"] = \"RegistrationPeriod\";\n    AuditLogReplacementType[\"StripeAccount\"] = \"StripeAccount\";\n    AuditLogReplacementType[\"Webshop\"] = \"Webshop\";\n    AuditLogReplacementType[\"Order\"] = \"Order\";\n    AuditLogReplacementType[\"Payment\"] = \"Payment\";\n    AuditLogReplacementType[\"PlatformMembershipType\"] = \"PlatformMembershipType\";\n    AuditLogReplacementType[\"MemberResponsibility\"] = \"MemberResponsibility\";\n    AuditLogReplacementType[\"DocumentTemplate\"] = \"DocumentTemplate\";\n    AuditLogReplacementType[\"Email\"] = \"Email\";\n    AuditLogReplacementType[\"EmailAddress\"] = \"EmailAddress\";\n    AuditLogReplacementType[\"EmailTemplate\"] = \"EmailTemplate\";\n})(AuditLogReplacementType || (AuditLogReplacementType = {}));\nexport class AuditLogReplacement extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.value = '';\n        this.description = '';\n        this.values = [];\n    }\n    flatten() {\n        if (this.type === AuditLogReplacementType.Array) {\n            const cleanedValues = [];\n            for (const v of this.values.flatMap(v => v.flatten())) {\n                if (v.type === AuditLogReplacementType.Key) {\n                    const last = cleanedValues[cleanedValues.length - 1];\n                    if (last && last.type === AuditLogReplacementType.Key) {\n                        if (last.value) {\n                            last.value += '.';\n                        }\n                        last.value += v.value;\n                        continue;\n                    }\n                }\n                cleanedValues.push(v.clone());\n            }\n            return cleanedValues;\n        }\n        return [this];\n    }\n    prepend(add) {\n        if (!add) {\n            return this;\n        }\n        return AuditLogReplacement.array([...add.flatten(), this]);\n    }\n    append(add) {\n        if (!add) {\n            return this;\n        }\n        return AuditLogReplacement.array([this, ...add.flatten()]);\n    }\n    static join(...values) {\n        return AuditLogReplacement.array(values);\n    }\n    static array(values) {\n        const v = AuditLogReplacement.create({ values: values.flatMap(v => { var _a; return (_a = v === null || v === void 0 ? void 0 : v.flatten()) !== null && _a !== void 0 ? _a : []; }), type: AuditLogReplacementType.Array }).flatten();\n        if (v.length === 1) {\n            return v[0];\n        }\n        return AuditLogReplacement.create({ values: v, type: AuditLogReplacementType.Array });\n    }\n    static key(str) {\n        if (!str) {\n            return AuditLogReplacement.empty();\n        }\n        return AuditLogReplacement.create({ value: str, type: AuditLogReplacementType.Key });\n    }\n    static empty() {\n        return AuditLogReplacement.array([]);\n    }\n    static uuid(id) {\n        return AuditLogReplacement.create({\n            id,\n            value: AuditLogReplacementDependencies.uuidToName(id) || '',\n            type: AuditLogReplacementType.Uuid,\n        });\n    }\n    static string(str) {\n        return AuditLogReplacement.create({ value: str });\n    }\n    static html(str, title) {\n        return AuditLogReplacement.create({ value: str, type: AuditLogReplacementType.Html, description: title });\n    }\n    static longText(str, title) {\n        return AuditLogReplacement.create({ value: str, type: AuditLogReplacementType.LongText, description: title });\n    }\n    toString() {\n        if (this.type === AuditLogReplacementType.Key || this.type === AuditLogReplacementType.EmailTemplate) {\n            return getAuditLogPatchKeyName(this.value);\n        }\n        if (this.type === AuditLogReplacementType.Uuid || (this.id && !this.value && DataValidator.isUuid(this.id))) {\n            if (this.id && !this.value) {\n                const name = AuditLogReplacementDependencies.uuidToName(this.id);\n                if (name) {\n                    return name;\n                }\n                return '';\n            }\n        }\n        if (this.type === AuditLogReplacementType.Array) {\n            return this.values.map(v => v.toString()).filter(v => !!v).join(' → ');\n        }\n        if (this.type === AuditLogReplacementType.Html) {\n            return this.description || 'Bekijk inhoud';\n        }\n        if (this.type === AuditLogReplacementType.LongText) {\n            return this.description || 'Bekijk inhoud';\n        }\n        if (this.type === AuditLogReplacementType.Image) {\n            return 'Afbeelding';\n        }\n        if (this.type === AuditLogReplacementType.File) {\n            return 'Bestand';\n        }\n        return this.value;\n    }\n    toKey() {\n        if (this.type === AuditLogReplacementType.Array) {\n            return this.values.map(v => v.toKey()).filter(v => !!v).join('.');\n        }\n        return this.value;\n    }\n    lastValue() {\n        if (this.type === AuditLogReplacementType.Array && this.values.length > 0) {\n            return this.values[this.values.length - 1].lastValue();\n        }\n        if (this.type === AuditLogReplacementType.Key) {\n            return this.value.split('.').pop() || '';\n        }\n        return this.value;\n    }\n}\n__decorate([\n    field({ field: 'v', decoder: StringDecoder, optional: true })\n], AuditLogReplacement.prototype, \"value\", void 0);\n__decorate([\n    field({ field: 'd', decoder: StringDecoder, optional: true })\n], AuditLogReplacement.prototype, \"description\", void 0);\n__decorate([\n    field({ field: 'a', decoder: new ArrayDecoder(AuditLogReplacement), optional: true })\n], AuditLogReplacement.prototype, \"values\", void 0);\n__decorate([\n    field({ field: 'i', decoder: StringDecoder, optional: true })\n], AuditLogReplacement.prototype, \"id\", void 0);\n__decorate([\n    field({ field: 't', decoder: new EnumDecoder(AuditLogReplacementType), optional: true })\n], AuditLogReplacement.prototype, \"type\", void 0);\n__decorate([\n    field({ field: 'c', decoder: NumberDecoder, optional: true })\n], AuditLogReplacement.prototype, \"count\", void 0);\nexport function getAuditLogPatchKeyName(key) {\n    // Strip prefixes\n    const stripPrefixes = ['settings.', 'meta.', 'privateMeta.', 'privateConfig.', 'config.', 'privateSettings.', 'details.', 'data.'];\n    for (const prefix of stripPrefixes) {\n        if (key.startsWith(prefix)) {\n            key = key.substring(prefix.length);\n        }\n    }\n    if (wordDictionary[key]) {\n        return wordDictionary[key];\n    }\n    // Check first letter is a capital letter\n    if (key.length > 1 && key[0] === key[0].toUpperCase()) {\n        for (const helper of AuditLogReplacementDependencies.enumHelpers) {\n            try {\n                const result = helper(key);\n                if (result && result !== key) {\n                    return result;\n                }\n            }\n            catch (e) {\n                console.error(e);\n            }\n        }\n    }\n    if (key.includes('.')) {\n        const splitted = key.split('.');\n        if (splitted.length > 2) {\n            const firstTwoWords = splitted.slice(0, 2).join('.');\n            if (firstTwoWords !== getAuditLogPatchKeyName(firstTwoWords)) {\n                return `${getAuditLogPatchKeyName(firstTwoWords)} → ${getAuditLogPatchKeyName(splitted.slice(2).join('.'))}`;\n            }\n        }\n        const firstWord = splitted[0];\n        const remaining = splitted.slice(1).join('.');\n        return `${getAuditLogPatchKeyName(firstWord)} → ${getAuditLogPatchKeyName(remaining)}`;\n    }\n    if (key.length > 2 && key.endsWith('Id')) {\n        // Strip id and try again\n        return getAuditLogPatchKeyName(key.substring(0, key.length - 2));\n    }\n    // Replace camel case with spaces\n    key = key.replace(/([a-z])([A-Z])/g, '$1 $2');\n    // Replace _ case with spaces\n    key = key.replace(/_+/g, ' ').trim();\n    return key;\n}\n//# sourceMappingURL=AuditLogReplacement.js.map","import { SimpleError } from '@simonbackx/simple-errors';\nexport var SortItemDirection;\n(function (SortItemDirection) {\n    SortItemDirection[\"ASC\"] = \"ASC\";\n    SortItemDirection[\"DESC\"] = \"DESC\";\n})(SortItemDirection || (SortItemDirection = {}));\nexport function encodeSortList(sort) {\n    return sort.map(s => `${s.key} ${s.order}`).join(',');\n}\nexport class SortListDecoder {\n    static decode(data) {\n        const str = data.string.trim();\n        if (str === '') {\n            return [];\n        }\n        const splitted = str.split(',');\n        const list = [];\n        for (const [index, part] of splitted.entries()) {\n            const sub = part.trim().split(' ');\n            if (sub.length > 2 || sub.length === 0) {\n                throw new SimpleError({\n                    code: 'invalid_field',\n                    message: `Invalid sort list at ${data.currentField}`,\n                    field: data.currentField,\n                });\n            }\n            const direction = sub.length === 1\n                ? SortItemDirection.ASC\n                : data.clone({\n                    data: sub[1],\n                    context: data.context,\n                    field: data.addToCurrentField(index),\n                }).enum(SortItemDirection);\n            const key = sub[0].trim();\n            list.push({\n                key,\n                order: direction,\n            });\n        }\n        return list;\n    }\n}\n//# sourceMappingURL=SortList.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, DateDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { encodeSortList, SortListDecoder } from './SortList.js';\nexport class StamhoofdFilterJSONDecoder {\n    static encode(filter, context) {\n        return JSON.stringify(StamhoofdFilterDecoder.encode(filter, context));\n    }\n    static decode(data) {\n        const str = data.string;\n        try {\n            const decoded = JSON.parse(str);\n            return StamhoofdFilterDecoder.decode(data.clone({ data: decoded, field: data.currentField, context: data.context }));\n        }\n        catch (e) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: `Expected JSON at ${data.currentField}`,\n                field: data.currentField,\n            });\n        }\n    }\n}\nexport class StamhoofdFilterDecoder {\n    static encode(filter, context) {\n        // We need to convert all Date objects to something recornizable so we can decode them as Dates too\n        // We'll use magic objects for this: { $: '$date', value: unixtimeinms }\n        if (filter instanceof Date) {\n            return { $: '$date', value: filter.encode(context) };\n        }\n        if (filter === null) {\n            return null;\n        }\n        if (Array.isArray(filter)) {\n            return filter.map(f => this.encode(f, context));\n        }\n        if (typeof filter === 'object') {\n            // Loop and replace all keys\n            const c = {};\n            for (const [key, value] of Object.entries(filter)) {\n                c[key] = this.encode(value, context);\n            }\n            return c;\n        }\n        return filter;\n    }\n    static decode(data) {\n        const value = data.value;\n        if (value === null) {\n            return null;\n        }\n        if (Array.isArray(value)) {\n            return value.map((v, index) => this.decode(data.clone({\n                data: v,\n                field: data.addToCurrentField(index),\n                context: data.context,\n            })));\n        }\n        if (typeof value === 'object') {\n            // Check if it's a date\n            if ('$' in value && value.$ === '$date' && 'value' in value) {\n                return DateDecoder.decode(data.clone({\n                    data: value.value,\n                    field: data.addToCurrentField('value'),\n                    context: data.context,\n                }));\n            }\n            // Loop and replace all keys\n            const c = {};\n            for (const [key, v] of Object.entries(value)) {\n                c[key] = this.decode(data.clone({\n                    data: v,\n                    field: data.addToCurrentField(key),\n                    context: data.context,\n                }));\n            }\n            return c;\n        }\n        if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n            return value;\n        }\n        throw new SimpleError({\n            code: 'invalid_field',\n            message: `Invalid filter at ${data.currentField}`,\n            field: data.currentField,\n        });\n    }\n}\nexport class CountResponse extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: IntegerDecoder })\n], CountResponse.prototype, \"count\", void 0);\nexport class CountFilteredRequest {\n    constructor(data) {\n        var _a, _b;\n        this.filter = (_a = data.filter) !== null && _a !== void 0 ? _a : null;\n        this.search = (_b = data.search) !== null && _b !== void 0 ? _b : null;\n    }\n    static decode(data) {\n        var _a, _b;\n        return new CountFilteredRequest({\n            filter: (_a = data.optionalField('filter')) === null || _a === void 0 ? void 0 : _a.nullable(StamhoofdFilterJSONDecoder),\n            search: (_b = data.optionalField('search')) === null || _b === void 0 ? void 0 : _b.nullable(StringDecoder),\n        });\n    }\n    encode(context) {\n        var _a;\n        return {\n            filter: this.filter ? StamhoofdFilterJSONDecoder.encode(this.filter, context) : undefined,\n            search: (_a = this.search) !== null && _a !== void 0 ? _a : undefined,\n        };\n    }\n}\nexport class LimitedFilteredRequest {\n    constructor(data) {\n        var _a, _b, _c, _d;\n        this.filter = (_a = data.filter) !== null && _a !== void 0 ? _a : null;\n        this.pageFilter = (_b = data.pageFilter) !== null && _b !== void 0 ? _b : null;\n        this.sort = (_c = data.sort) !== null && _c !== void 0 ? _c : [];\n        this.limit = data.limit;\n        this.search = (_d = data.search) !== null && _d !== void 0 ? _d : null;\n    }\n    static decode(data) {\n        var _a, _b, _c;\n        return new LimitedFilteredRequest({\n            filter: (_a = data.optionalField('filter')) === null || _a === void 0 ? void 0 : _a.nullable(StamhoofdFilterJSONDecoder),\n            pageFilter: (_b = data.optionalField('pageFilter')) === null || _b === void 0 ? void 0 : _b.nullable(StamhoofdFilterJSONDecoder),\n            sort: data.field('sort').decode(SortListDecoder),\n            limit: data.field('limit').integer,\n            search: (_c = data.optionalField('search')) === null || _c === void 0 ? void 0 : _c.nullable(StringDecoder),\n        });\n    }\n    encode(context) {\n        var _a;\n        return {\n            filter: this.filter ? StamhoofdFilterJSONDecoder.encode(this.filter, context) : undefined,\n            pageFilter: this.pageFilter ? StamhoofdFilterJSONDecoder.encode(this.pageFilter, context) : undefined,\n            sort: encodeSortList(this.sort),\n            limit: this.limit,\n            search: (_a = this.search) !== null && _a !== void 0 ? _a : undefined,\n        };\n    }\n}\n//# sourceMappingURL=FilteredRequest.js.map","import { Version } from '../Version.js';\nimport { StamhoofdFilterDecoder } from './FilteredRequest.js';\nimport { SortItemDirection } from './SortList.js';\nexport const FilterWrapperMarker = Symbol('FilterWrapperMarker');\nexport function isEmptyFilter(filter) {\n    if (filter === null) {\n        return true;\n    }\n    if (typeof filter === 'object' && filter !== null) {\n        return Object.keys(filter).length === 0;\n    }\n    if (Array.isArray(filter)) {\n        return filter.length === 0;\n    }\n    return false;\n}\nexport function mergeFilters(filters, type = '$and') {\n    const filteredFilters = filters.filter(f => !isEmptyFilter(f)).flatMap(f => Array.isArray(f) ? (type === '$and' ? f : [{ $and: f }]) : [f]);\n    if (filteredFilters.length === 0) {\n        return null;\n    }\n    if (filteredFilters.length === 1) {\n        return filteredFilters[0];\n    }\n    return {\n        [type]: filteredFilters,\n    };\n}\nexport function assertSort(list, assert) {\n    var _a, _b, _c;\n    for (const a of assert) {\n        if (list.find(l => l.key === a.key)) {\n            continue;\n        }\n        // Always add id as an extra sort key for sorters that are not unique\n        list = [...list, { key: a.key, order: (_c = (_a = a.order) !== null && _a !== void 0 ? _a : (_b = list[0]) === null || _b === void 0 ? void 0 : _b.order) !== null && _c !== void 0 ? _c : SortItemDirection.ASC }];\n    }\n    return list;\n}\nexport function isEqualFilter(a, b) {\n    if (a === null) {\n        return b === null;\n    }\n    if (b === null) {\n        return false;\n    }\n    return JSON.stringify(StamhoofdFilterDecoder.encode(a, { version: Version })) === JSON.stringify(StamhoofdFilterDecoder.encode(b, { version: Version }));\n}\nexport function wrapFilter(filter, wrap) {\n    // Replace the FilterWrapperMarker symbol in wrap with filter\n    if (wrap === FilterWrapperMarker) {\n        return filter;\n    }\n    if (Array.isArray(wrap)) {\n        return wrap.map(w => wrapFilter(filter, w));\n    }\n    if (typeof wrap === 'object' && wrap !== null) {\n        const o = {};\n        for (const key in wrap) {\n            o[key] = wrapFilter(filter, wrap[key]);\n        }\n        return o;\n    }\n    return wrap;\n}\n/**\n * Essentially, this checks if filter and wrap are the same, but ignoring comparison if wrap is FilterWrapperMarker\n * If multiple FilterWrapperMarker are used, their value should be the same - otherwise undefined is returned\n * Returns the filter at FilterWrapperMarker if it is found\n * If no FilterWrapperMarker is found, the filter is returned if it is the same as wrap\n */\nexport function unwrapFilter(filter, wrap) {\n    // Replace the FilterWrapperMarker symbol in wrap with filter\n    if (wrap === FilterWrapperMarker) {\n        return {\n            match: true,\n            markerValue: filter,\n        };\n    }\n    if (Array.isArray(wrap)) {\n        if (!Array.isArray(filter)) {\n            return {\n                match: false,\n            };\n        }\n        if (filter.length !== wrap.length) {\n            return {\n                match: false,\n            };\n        }\n        const remaining = filter.slice();\n        let pendingMarkerValue = undefined;\n        // Order should not matter in an Array\n        for (const item of wrap) {\n            // Check if we find a match\n            if (item === FilterWrapperMarker) {\n                // Usage like this is dangerous and unpredictable\n                console.warn('FilterWrapperMarker in array is not supported as this requires checking in any possible permutation of the array.');\n                return {\n                    match: false,\n                };\n            }\n            let found = false;\n            for (let i = 0; i < remaining.length; i++) {\n                const same = unwrapFilter(remaining[i], item);\n                if (same.match && !same.leftOver) {\n                    if (same.markerValue) {\n                        if (pendingMarkerValue !== undefined) {\n                            // Check if equal\n                            const { match, leftOver } = unwrapFilter(pendingMarkerValue, same.markerValue);\n                            if (!match || leftOver) {\n                                // Pattern did match, but multiple marker values with different values\n                                return {\n                                    match: false,\n                                };\n                            }\n                        }\n                        pendingMarkerValue = same.markerValue;\n                    }\n                    remaining.splice(i, 1);\n                    found = true;\n                    break;\n                }\n            }\n            if (!found) {\n                return {\n                    match: false,\n                };\n            }\n        }\n        if (remaining.length > 0) {\n            return {\n                match: false,\n            };\n        }\n        return {\n            match: true,\n            markerValue: pendingMarkerValue,\n        };\n    }\n    if (wrap instanceof Date) {\n        if (filter instanceof Date) {\n            return {\n                match: filter.getTime() === wrap.getTime(),\n            };\n        }\n        return {\n            match: false,\n        };\n    }\n    if (typeof wrap === 'object' && wrap !== null) {\n        if (typeof filter !== 'object' || filter === null) {\n            // Not the same\n            return {\n                match: false,\n            };\n        }\n        let pendingMarkerValue = undefined;\n        for (const key in wrap) {\n            const filterValue = (filter)[key];\n            if (filterValue === undefined) {\n                // Required key not found\n                return {\n                    match: false,\n                };\n            }\n            const wrapValue = wrap[key];\n            const same = unwrapFilter(filterValue, wrapValue);\n            if (!same.match || same.leftOver) {\n                // Not matching\n                return {\n                    match: false,\n                };\n            }\n            // We have a match\n            if (same.markerValue) {\n                if (pendingMarkerValue !== undefined) {\n                    // Check if equal\n                    const { match, leftOver } = unwrapFilter(pendingMarkerValue, same.markerValue);\n                    if (!match || leftOver) {\n                        // Pattern did match, but multiple marker values with different values\n                        return {\n                            match: false,\n                        };\n                    }\n                }\n                pendingMarkerValue = same.markerValue;\n            }\n        }\n        // We have a match\n        const leftOverKeys = Object.keys(filter).filter(k => !(k in wrap));\n        const leftOver = {};\n        for (const key of leftOverKeys) {\n            leftOver[key] = filter[key];\n        }\n        return {\n            match: true,\n            markerValue: pendingMarkerValue,\n            leftOver: leftOverKeys.length ? leftOver : undefined,\n        };\n    }\n    // Only scalar values at this point\n    // No marker found\n    if (filter == wrap) {\n        return {\n            match: true,\n            // No marker value\n        };\n    }\n    return {\n        match: false,\n    };\n}\nexport function unwrapFilterByPath(filter, keyPath) {\n    if (keyPath.length === 0) {\n        return filter;\n    }\n    const first = keyPath[0];\n    if (typeof first === 'number') {\n        if (!Array.isArray(filter)) {\n            return null;\n        }\n        if (first >= filter.length) {\n            return null;\n        }\n        return unwrapFilterByPath(filter[first], keyPath.slice(1));\n    }\n    if (!(typeof filter === 'object')) {\n        return null;\n    }\n    if (filter === null) {\n        return null;\n    }\n    if (first in filter) {\n        return unwrapFilterByPath(filter[first], keyPath.slice(1));\n    }\n    return null;\n}\n//# sourceMappingURL=StamhoofdFilter.js.map","import { cloneObject } from '@simonbackx/simple-encoding';\nimport { AuditLogReplacement } from '../AuditLogReplacement.js';\nimport { StamhoofdFilterDecoder } from './FilteredRequest.js';\nimport { isEmptyFilter } from './StamhoofdFilter.js';\nexport class PropertyFilter {\n    constructor(enabledWhen, requiredWhen) {\n        /**\n         * Enabled when...\n         * null = always enabled\n         */\n        this.enabledWhen = null;\n        /**\n         * If enabled, whether it is required\n         * null = always skippable\n         * empty filter = always required\n         */\n        this.requiredWhen = null;\n        this.enabledWhen = enabledWhen;\n        this.requiredWhen = requiredWhen;\n    }\n    static createDefault() {\n        return new PropertyFilter(null, {});\n    }\n    isEnabled(object) {\n        if (this.enabledWhen === null) {\n            return true;\n        }\n        return object.doesMatchFilter(this.enabledWhen);\n    }\n    get isAlwaysEnabledAndRequired() {\n        return this.enabledWhen === null && isEmptyFilter(this.requiredWhen) && this.requiredWhen !== null;\n    }\n    isRequired(object) {\n        if (this.requiredWhen === null) {\n            return false;\n        }\n        return object.doesMatchFilter(this.requiredWhen);\n    }\n    encode(context) {\n        return {\n            enabledWhen: StamhoofdFilterDecoder.encode(this.enabledWhen, context),\n            requiredWhen: StamhoofdFilterDecoder.encode(this.requiredWhen, context),\n        };\n    }\n    static decode(data) {\n        if (data.context.version < 251) {\n            console.error('PropertyFilter: legacy filter detected - this is not implemented yet. Possible data loss.');\n            return PropertyFilter.createDefault();\n        }\n        return new PropertyFilter(data.field('enabledWhen').nullable(StamhoofdFilterDecoder), data.field('requiredWhen').nullable(StamhoofdFilterDecoder));\n    }\n    clone() {\n        return new PropertyFilter(cloneObject(this.enabledWhen), cloneObject(this.requiredWhen));\n    }\n    getDiffValue() {\n        if (this.isAlwaysEnabledAndRequired) {\n            return AuditLogReplacement.key('alwaysEnabledAndRequired');\n        }\n        if (this.enabledWhen === null && this.requiredWhen === null) {\n            return AuditLogReplacement.key('alwaysEnabledAndOptional');\n        }\n        if (this.enabledWhen !== null && this.requiredWhen === null) {\n            return AuditLogReplacement.key('sometimesEnabledAndOptional');\n        }\n        if (this.enabledWhen === null && this.requiredWhen !== null) {\n            return AuditLogReplacement.key('alwaysEnabledAndSometimesRequired');\n        }\n        if (this.enabledWhen !== null && isEmptyFilter(this.requiredWhen)) {\n            return AuditLogReplacement.key('sometimesEnabledAndRequired');\n        }\n        return AuditLogReplacement.key('sometimesEnabledAndSometimesRequired');\n    }\n}\n//# sourceMappingURL=PropertyFilter.js.map","export var GroupType;\n(function (GroupType) {\n    /**\n     * registration as a member at an organization - for a specific age group (most of the time)\n     */\n    GroupType[\"Membership\"] = \"Membership\";\n    /**\n     * Waiting list of any other group\n     */\n    GroupType[\"WaitingList\"] = \"WaitingList\";\n    /**\n     * Activity\n     */\n    GroupType[\"EventRegistration\"] = \"EventRegistration\";\n    // idea: EventPreRegistration = \"EventPreRegistration\", // let know in advance that you want to join\n    // idea: EventAttendance = \"EventAttendance\", // attendance list for an event, by admins only\n})(GroupType || (GroupType = {}));\n//# sourceMappingURL=GroupType.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, EnumDecoder, field, IntegerDecoder } from '@simonbackx/simple-encoding';\nexport var ResolutionFit;\n(function (ResolutionFit) {\n    ResolutionFit[\"Contain\"] = \"contain\";\n    ResolutionFit[\"Cover\"] = \"cover\";\n    ResolutionFit[\"Fill\"] = \"fill\";\n    ResolutionFit[\"Inside\"] = \"inside\";\n    ResolutionFit[\"Outside\"] = \"outside\";\n})(ResolutionFit || (ResolutionFit = {}));\nexport class ResolutionRequest extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.width = null;\n        this.height = null;\n        this.fit = ResolutionFit.Inside;\n    }\n}\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], ResolutionRequest.prototype, \"width\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], ResolutionRequest.prototype, \"height\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(ResolutionFit) })\n], ResolutionRequest.prototype, \"fit\", void 0);\n//# sourceMappingURL=ResolutionRequest.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, EnumDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { v4 as uuidv4 } from 'uuid';\nimport { ResolutionRequest } from '../../files/ResolutionRequest.js';\nimport { PropertyFilter } from '../../filters/PropertyFilter.js';\nimport { getPermissionLevelNumber, PermissionLevel } from '../../PermissionLevel.js';\nexport var RecordType;\n(function (RecordType) {\n    /**\n     * Show a checkbox to the user so they can check the value on/off\n     * It is possible to add a textarea as soon as the checkbox is selected if the extra property is set.\n     */\n    RecordType[\"Checkbox\"] = \"Checkbox\";\n    /**\n     * Select one (or none if not required)\n     */\n    RecordType[\"ChooseOne\"] = \"ChooseOne\";\n    /**\n     * Select one, zero or more from a menu\n     * The way this is shown will differ depending on the minimum or maximum setting. e.g. when exactly one\n     * item should be selected, we could show it with a dropdown menu\n     */\n    RecordType[\"MultipleChoice\"] = \"MultipleChoice\";\n    /**\n     * Small text input\n     */\n    RecordType[\"Text\"] = \"Text\";\n    /**\n     * Big text input\n     */\n    RecordType[\"Textarea\"] = \"Textarea\";\n    /**\n     * Address input\n     */\n    RecordType[\"Address\"] = \"Address\";\n    RecordType[\"Phone\"] = \"Phone\";\n    RecordType[\"Email\"] = \"Email\";\n    RecordType[\"Date\"] = \"Date\";\n    RecordType[\"Price\"] = \"Price\";\n    RecordType[\"Image\"] = \"Image\";\n    RecordType[\"File\"] = \"File\";\n    RecordType[\"Integer\"] = \"Integer\";\n})(RecordType || (RecordType = {}));\nexport var FileType;\n(function (FileType) {\n    FileType[\"PDF\"] = \"PDF\";\n    FileType[\"Word\"] = \"Word\";\n    FileType[\"Excel\"] = \"Excel\";\n})(FileType || (FileType = {}));\nexport function getRecordTypeName(type) {\n    var _a, _b;\n    const all = [\n        {\n            value: RecordType.Text,\n            name: 'Tekstveld (één lijn)',\n        },\n        {\n            value: RecordType.Textarea,\n            name: 'Tekstveld (meerdere lijnen)',\n        },\n        {\n            value: RecordType.Address,\n            name: 'Adres',\n        },\n        {\n            value: RecordType.Email,\n            name: 'E-mailadres',\n        },\n        {\n            value: RecordType.Phone,\n            name: 'Telefoonnummer',\n        },\n        {\n            value: RecordType.Date,\n            name: 'Datum',\n        },\n        {\n            value: RecordType.Checkbox,\n            name: 'Aankruisvakje',\n        },\n        {\n            value: RecordType.ChooseOne,\n            name: 'Keuzemenu (kies één)',\n        },\n        {\n            value: RecordType.MultipleChoice,\n            name: 'Keuzemenu (kies meerdere)',\n        },\n        {\n            value: RecordType.File,\n            name: 'Bestand',\n        },\n    ];\n    return (_b = (_a = all.find(t => t.value === type)) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : 'Onbekend';\n}\nexport var RecordWarningType;\n(function (RecordWarningType) {\n    RecordWarningType[\"Info\"] = \"Info\";\n    RecordWarningType[\"Warning\"] = \"Warning\";\n    RecordWarningType[\"Error\"] = \"Error\";\n})(RecordWarningType || (RecordWarningType = {}));\nexport class RecordWarning extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.text = '';\n        this.type = RecordWarningType.Info;\n        /**\n         * Show a warning if the associated value is falsy\n         */\n        this.inverted = false;\n    }\n    static get sort() {\n        return (warning1, warning2) => {\n            const priority1 = warning1.type;\n            const priority2 = warning2.type;\n            if ((priority1 === RecordWarningType.Error && priority2 === RecordWarningType.Warning)\n                || (priority1 === RecordWarningType.Warning && priority2 === RecordWarningType.Info)\n                || (priority1 === RecordWarningType.Error && priority2 === RecordWarningType.Info)) {\n                return -1;\n            }\n            else if ((priority1 === RecordWarningType.Info && priority2 === RecordWarningType.Warning)\n                || (priority1 === RecordWarningType.Warning && priority2 === RecordWarningType.Error)\n                || (priority1 === RecordWarningType.Info && priority2 === RecordWarningType.Error)) {\n                return 1;\n            }\n            else {\n                return 0;\n            }\n        };\n    }\n    get icon() {\n        switch (this.type) {\n            case RecordWarningType.Error: return ' exclamation-two red';\n            case RecordWarningType.Warning: return ' exclamation yellow';\n            case RecordWarningType.Info: return ' info-text';\n        }\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], RecordWarning.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], RecordWarning.prototype, \"text\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(RecordWarningType) })\n], RecordWarning.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], RecordWarning.prototype, \"inverted\", void 0);\nexport class RecordChoice extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.description = '';\n        /**\n         * Show a warning if selected (or not selected if inverted)\n         */\n        this.warning = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], RecordChoice.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], RecordChoice.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 118 })\n], RecordChoice.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: RecordWarning, version: 122, nullable: true })\n], RecordChoice.prototype, \"warning\", void 0);\nexport class BaseRecordSettings extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Short name (used mainly for displaying the information)\n         */\n        this.name = '';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], BaseRecordSettings.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], BaseRecordSettings.prototype, \"name\", void 0);\nexport class RecordSettings extends BaseRecordSettings {\n    constructor() {\n        super(...arguments);\n        /**\n         * When used with checkbox: checkbox needs to get checked (e.g accept terms, confirm age...)\n         * Multiple choice: minimum one selection required\n         * Text: required input\n         */\n        this.required = true;\n        /**\n         * Whether you need permission to collect this information\n         */\n        this.sensitive = false;\n        /**\n         * Only used for checkboxes\n         */\n        this.askComments = false;\n        this.type = RecordType.Text;\n        /**\n         * In case of multiple choice: the values you can choose from with optional additional information\n         */\n        this.choices = [];\n        /**\n         * Label used for input (depending on the type)\n         * Checkbox: text next to checkbox\n         * Text inputs: label field above the input\n         * If empty: name is used\n         */\n        this.label = '';\n        /**\n         * Text underneath the label in case of a checkbox.\n         * For other types: below the input\n         */\n        this.description = '';\n        /// In case of textboxes or comments for checked checkboxes\n        this.inputPlaceholder = '';\n        /// Text below the input field for comments (if any)\n        this.commentsDescription = '';\n        /**\n         * Show a warning if selected / entered (or not selected/entered if inverted)\n         */\n        this.warning = null;\n        this.externalPermissionLevel = PermissionLevel.Write;\n        this.filter = null;\n    }\n    getDiffValue() {\n        const type = getRecordTypeName(this.type);\n        if (this.required) {\n            return 'Verplicht ' + type;\n        }\n        return type;\n    }\n    validate(answers, requiredCategory = true) {\n        const answer = answers.get(this.id);\n        if (!requiredCategory && (!answer || answer.isEmpty)) {\n            // Okay to skip\n            return;\n        }\n        if (this.required && !answer) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Dit veld is verplicht',\n                field: this.id,\n            });\n        }\n        if (answer) {\n            answer.validate();\n        }\n    }\n    checkPermissionForUserManager(level) {\n        return getPermissionLevelNumber(this.externalPermissionLevel) >= getPermissionLevelNumber(level);\n    }\n    get excelColumns() {\n        if (this.type === RecordType.Address) {\n            return [\n                this.name + ' - Straat en nummer',\n                this.name + ' - Postcode',\n                this.name + ' - Gemeente',\n                this.name + ' - Land',\n            ];\n        }\n        return [this.name];\n    }\n    isEnabled(filterValue, options) {\n        var _a;\n        if (options === null || options === void 0 ? void 0 : options.level) {\n            const level = options === null || options === void 0 ? void 0 : options.level;\n            if (!this.checkPermissionForUserManager(level)) {\n                return false;\n            }\n        }\n        if (options === null || options === void 0 ? void 0 : options.additionalFilter) {\n            if (!options.additionalFilter(this)) {\n                return false;\n            }\n        }\n        if (this.filter && !((_a = this.filter) === null || _a === void 0 ? void 0 : _a.isEnabled(filterValue))) {\n            return false;\n        }\n        return !!filterValue.isRecordEnabled(this);\n    }\n    duplicate() {\n        const c = this.clone();\n        c.id = uuidv4();\n        return c;\n    }\n}\n__decorate([\n    field({ decoder: BooleanDecoder })\n], RecordSettings.prototype, \"required\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 123 })\n], RecordSettings.prototype, \"sensitive\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 119 })\n], RecordSettings.prototype, \"askComments\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(RecordType) })\n], RecordSettings.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RecordChoice) })\n], RecordSettings.prototype, \"choices\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], RecordSettings.prototype, \"label\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], RecordSettings.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], RecordSettings.prototype, \"inputPlaceholder\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 120 })\n], RecordSettings.prototype, \"commentsDescription\", void 0);\n__decorate([\n    field({ decoder: RecordWarning, version: 122, nullable: true })\n], RecordSettings.prototype, \"warning\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(ResolutionRequest), optional: true })\n], RecordSettings.prototype, \"resolutions\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(FileType), nullable: true, optional: true })\n], RecordSettings.prototype, \"fileType\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(PermissionLevel), version: 356 })\n], RecordSettings.prototype, \"externalPermissionLevel\", void 0);\n__decorate([\n    field({ decoder: PropertyFilter, version: 365, nullable: true, optional: true })\n], RecordSettings.prototype, \"filter\", void 0);\n//# sourceMappingURL=RecordSettings.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, field, PatchMap, StringDecoder } from '@simonbackx/simple-encoding';\nimport { isSimpleError, isSimpleErrors, SimpleErrors } from '@simonbackx/simple-errors';\nimport { v4 as uuidv4 } from 'uuid';\nimport { PropertyFilter } from '../../filters/PropertyFilter.js';\nimport { getPermissionLevelNumber } from '../../PermissionLevel.js';\nimport { RecordSettings } from './RecordSettings.js';\nexport class RecordCategory extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.description = '';\n        /**\n         * Sometimes a category needs to be in the list but not enabled.\n         * E.g. when decendants can enable it optionally and share the data\n         */\n        this.defaultEnabled = true;\n        /**\n         * A category can either have childCategories or records, but never both. Records are ignored as soon as the category has at least one child category.\n         * Currently we only support 2 categories deep\n         */\n        this.childCategories = [];\n        this.records = [];\n        this.filter = null;\n    }\n    get containsSensitiveData() {\n        return !!this.getAllRecords().find(r => r.sensitive);\n    }\n    getAllRecords() {\n        if (this.childCategories.length > 0) {\n            return [...this.childCategories.flatMap(c => c.getAllRecords()), ...this.records];\n        }\n        return this.records;\n    }\n    getAllFilteredRecords(filterValue, options) {\n        if (this.childCategories.length > 0) {\n            return [\n                ...this.filterChildCategories(filterValue).flatMap(c => c.getAllFilteredRecords(filterValue, options)),\n                ...this.filterRecords(filterValue, options),\n            ];\n        }\n        return this.filterRecords(filterValue, options);\n    }\n    filterRecords(filterValue, options) {\n        return this.records.filter(r => r.isEnabled(filterValue, options));\n    }\n    validate(value) {\n        // check if everything has been answered already + check out of date\n        const requiredCategory = this.isRequired(value);\n        // Check all the properties in this category and check their last review times\n        const errors = new SimpleErrors();\n        for (const record of this.getAllFilteredRecords(value)) {\n            try {\n                record.validate(value.getRecordAnswers(), requiredCategory);\n            }\n            catch (e) {\n                if (isSimpleErrors(e) || isSimpleError(e)) {\n                    errors.addError(e);\n                }\n                else {\n                    throw e;\n                }\n            }\n        }\n        errors.throwIfNotEmpty();\n    }\n    isComplete(value, outdatedTime = null) {\n        // check if everything has been answered already + check out of date\n        const records = this.getAllFilteredRecords(value);\n        // Check all the properties in this category and check their last review times\n        for (const record of records) {\n            const answer = value.getRecordAnswers().get(record.id);\n            if (!answer) {\n                // This was never answered\n                return false;\n            }\n            if (outdatedTime !== null) {\n                if (answer.isOutdated(outdatedTime)) {\n                    // This answer is outdated\n                    return false;\n                }\n            }\n            try {\n                answer.validate();\n            }\n            catch (e) {\n                // This answer is not valid anymore\n                return false;\n            }\n        }\n        return true;\n    }\n    getTotalRecords(value) {\n        return this.getAllFilteredRecords(value).length;\n    }\n    getTotalCompleteRecords(value) {\n        // check if everything has been answered already + check out of date\n        const records = this.getAllFilteredRecords(value);\n        let count = 0;\n        // Check all the properties in this category and check their last review times\n        for (const record of records) {\n            const answer = value.getRecordAnswers().get(record.id);\n            if (!answer) {\n                // This was never answered\n                continue;\n            }\n            try {\n                answer.validate();\n                count += 1;\n            }\n            catch (e) {\n                // This answer is not valid anymore\n            }\n        }\n        return count;\n    }\n    isEnabled(filterValue, ignoreFilter = false, filterOptions) {\n        if (!ignoreFilter) {\n            if (!this.defaultEnabled) {\n                return false;\n            }\n            if (this.filter && !this.filter.isEnabled(filterValue)) {\n                return false;\n            }\n        }\n        if (this.childCategories.length > 0) {\n            if (this.filterChildCategories(filterValue, filterOptions).length > 0) {\n                return true;\n            }\n        }\n        if (this.filterRecords(filterValue, filterOptions).length > 0) {\n            return true;\n        }\n        return false;\n    }\n    checkPermissionForUserManager(level) {\n        const levelNumber = getPermissionLevelNumber(level);\n        const hasPermission = this.records.some(r => getPermissionLevelNumber(r.externalPermissionLevel) >= levelNumber);\n        if (hasPermission) {\n            return true;\n        }\n        if (this.childCategories.length) {\n            return this.childCategories.some(c => c.checkPermissionForUserManager(level));\n        }\n        return false;\n    }\n    isRequired(filterValue) {\n        if (!this.filter || this.filter.isRequired(filterValue)) {\n            return true;\n        }\n        return false;\n    }\n    static filterCategories(categories, filterValue, filterOptions) {\n        return categories.filter((category) => {\n            return category.isEnabled(filterValue, false, filterOptions);\n        });\n    }\n    filterChildCategories(filterValue, filterOptions) {\n        return RecordCategory.filterCategories(this.childCategories, filterValue, filterOptions);\n    }\n    /**\n     * Flatten all categories and child categories into a single array\n     */\n    static flattenCategories(categories, filterValue, options) {\n        return RecordCategory.filterCategories(categories, filterValue, options).flatMap((cat) => {\n            // Make a (not deep!) clone\n            const cat2 = RecordCategory.create(cat);\n            cat2.childCategories = [];\n            cat2.records = cat2.filterRecords(filterValue, options);\n            if (cat.childCategories.length > 0) {\n                // Make a (not deep!) clone\n                return [\n                    ...(cat2.records.length > 0 ? [cat2] : []),\n                    ...this.flattenCategories(cat.childCategories, filterValue, options).map((c) => {\n                        // Make a (not deep!) clone\n                        const cc = RecordCategory.create(c);\n                        cc.name = cat.name + ' → ' + c.name;\n                        return cc;\n                    }),\n                ];\n            }\n            return (cat2.records.length > 0 ? [cat2] : []);\n        });\n    }\n    /**\n     * Get a flat array with record categories whose records match the filter\n     */\n    static flattenCategoriesWith(categories, filter) {\n        return categories.flatMap((cat) => {\n            // Make a (not deep!) clone\n            const cat2 = RecordCategory.create(cat);\n            const updatedRecords = cat.records.filter((r) => {\n                return filter(r);\n            });\n            cat2.records = updatedRecords;\n            if (cat.childCategories.length > 0) {\n                // Make a (not deep!) clone\n                cat2.childCategories = [];\n                return [\n                    ...(cat2.records.length > 0 ? [cat2] : []),\n                    ...this.flattenCategoriesWith(cat.childCategories, filter).map((c) => {\n                        // Make a (not deep!) clone\n                        const cc = RecordCategory.create(c);\n                        cc.name = cat.name + ' → ' + c.name;\n                        return cc;\n                    }),\n                ];\n            }\n            return cat2.records.length > 0 ? [cat2] : [];\n        });\n    }\n    /**\n     * Remove (child) categories that don't have a record that matches the filter\n     */\n    static filterRecordsWith(categories, filter) {\n        return categories.flatMap((cat) => {\n            // Make a (not deep!) clone\n            const cat2 = RecordCategory.create(cat);\n            const updatedRecords = cat.records.filter((r) => {\n                return filter(r);\n            });\n            cat2.records = updatedRecords;\n            cat2.childCategories = this.filterRecordsWith(cat.childCategories, filter);\n            return cat2.records.length > 0 || cat2.childCategories.length > 0 ? [cat2] : [];\n        });\n    }\n    static validate(categories, filterValue) {\n        const filteredCategories = RecordCategory.filterCategories(categories, filterValue);\n        const errors = new SimpleErrors();\n        // Delete all records that are not in the list\n        for (const category of filteredCategories) {\n            try {\n                category.validate(filterValue);\n            }\n            catch (e) {\n                if (isSimpleErrors(e) || isSimpleError(e)) {\n                    errors.addError(e);\n                }\n                else {\n                    throw e;\n                }\n            }\n        }\n        errors.throwIfNotEmpty();\n    }\n    static removeOldAnswers(categories, filterValue, filterOptions) {\n        const answers = filterValue.getRecordAnswers();\n        const filteredCategories = RecordCategory.filterCategories(categories, filterValue, filterOptions);\n        const records = filteredCategories.flatMap(c => c.getAllFilteredRecords(filterValue, filterOptions));\n        const patch = new PatchMap();\n        // Remove all answers not in the list\n        for (const [id, _] of answers) {\n            if (!records.find(r => r.id === id)) {\n                patch.set(id, null);\n            }\n        }\n        return filterValue.patchRecordAnswers(patch);\n    }\n    duplicate() {\n        const c = this.clone();\n        c.id = uuidv4();\n        c.childCategories = this.childCategories.map(c => c.duplicate());\n        c.records = this.records.map(r => r.duplicate());\n        return c;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], RecordCategory.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], RecordCategory.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], RecordCategory.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 255 })\n], RecordCategory.prototype, \"defaultEnabled\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RecordCategory) })\n], RecordCategory.prototype, \"childCategories\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RecordSettings) })\n], RecordCategory.prototype, \"records\", void 0);\n__decorate([\n    field({ decoder: PropertyFilter, version: 126, nullable: true, optional: true })\n], RecordCategory.prototype, \"filter\", void 0);\n//# sourceMappingURL=RecordCategory.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, field, IntegerDecoder, MapDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { PropertyFilter } from '../filters/PropertyFilter.js';\nimport { GroupType } from '../GroupType.js';\nimport { RecordCategory } from './records/RecordCategory.js';\nexport var AskRequirement;\n(function (AskRequirement) {\n    AskRequirement[\"NotAsked\"] = \"NotAsked\";\n    AskRequirement[\"Optional\"] = \"Optional\";\n    AskRequirement[\"Required\"] = \"Required\";\n})(AskRequirement || (AskRequirement = {}));\nexport class FreeContributionSettings extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.description = '';\n        this.amounts = [500, 1500, 3000];\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], FreeContributionSettings.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(IntegerDecoder) })\n], FreeContributionSettings.prototype, \"amounts\", void 0);\nexport class FinancialSupportSettings extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * E.g. 'financial support'\n         */\n        this.title = FinancialSupportSettings.defaultTitle;\n        /**\n         * E.g. 'We provide financial support for families in financial difficulties. You can ask for this by checking this checkbox'\n         */\n        this.description = FinancialSupportSettings.defaultDescription;\n        /**\n         * E.g. 'My family is in need of financial support'\n         */\n        this.checkboxLabel = FinancialSupportSettings.defaultCheckboxLabel;\n        /**\n         * E.g. 'SOMkort'\n        */\n        this.priceName = FinancialSupportSettings.defaultPriceName;\n        /**\n         * E.g. 'Uses financial support'\n         */\n        this.warningText = FinancialSupportSettings.defaultWarningText;\n        /**\n         * Whether a member can self assign financial support.\n         * If false a member who chooses financial support cannot self subscribe.\n         */\n        this.preventSelfAssignment = false;\n        /**\n         * The text that a member sees if he cannot inscribe with financial support.\n         */\n        this.preventSelfAssignmentText = null;\n    }\n    static get defaultDescription() {\n        return 'We doen ons best om de kostprijs van onze activiteiten zo laag mogelijk te houden. Daarnaast voorzien we middelen om gezinnen die dat nodig hebben te ondersteunen. Om de drempel zo laag mogelijk te houden, voorzien we een discrete checkbox waarmee je kan aangeven dat je ondersteuning nodig hebt. We gaan hier uiterst discreet mee om.';\n    }\n    static get defaultTitle() {\n        return 'Financiële ondersteuning';\n    }\n    static get defaultPriceName() {\n        return 'Verlaagd tarief';\n    }\n    static get defaultCheckboxLabel() {\n        return 'Mijn gezin heeft nood aan financiële ondersteuning en ik wil dit discreet kenbaar maken';\n    }\n    static get defaultWarningText() {\n        return 'Gebruikt financiële ondersteuning';\n    }\n    static get defaultPreventSelfAssignmentText() {\n        return 'Er is goedkeuring nodig om in te schrijven met financiële ondersteuning. Gelieve de groep te contacteren.';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], FinancialSupportSettings.prototype, \"title\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], FinancialSupportSettings.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], FinancialSupportSettings.prototype, \"checkboxLabel\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 289 })\n], FinancialSupportSettings.prototype, \"priceName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], FinancialSupportSettings.prototype, \"warningText\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, optional: true, version: 319 })\n], FinancialSupportSettings.prototype, \"preventSelfAssignment\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 319 })\n], FinancialSupportSettings.prototype, \"preventSelfAssignmentText\", void 0);\nexport class DataPermissionsSettings extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * E.g. 'financial support'\n         */\n        this.title = DataPermissionsSettings.defaultTitle;\n        /**\n         * E.g. 'We provide financial support for families in financial difficulties. You can ask for this by checking this checkbox'\n         */\n        this.description = DataPermissionsSettings.defaultDescription;\n        /**\n         * E.g. 'My family is in need of financial support'\n         */\n        this.checkboxLabel = DataPermissionsSettings.defaultCheckboxLabel;\n        /**\n         * Warning that is shown if the checkbox is not checked\n         * E.g. 'Without this information the group will not be able to offer a reduced price if you are eligible for financial support.'\n         */\n        this.checkboxWarning = null;\n        /**\n         * Warning for administrators\n         * E.g. 'Uses financial support'\n         */\n        this.warningText = DataPermissionsSettings.defaultWarningText;\n    }\n    static get defaultDescription() {\n        return '';\n    }\n    static get defaultTitle() {\n        return 'Toestemming verzamelen gevoelige gegevens';\n    }\n    static get defaultCheckboxLabel() {\n        return 'Ik geef toestemming om gevoelige gegevens te verzamelen en te verwerken. Hoe we met deze gegevens omgaan staat vermeld in ons privacybeleid.';\n    }\n    static get defaultWarningText() {\n        return 'Geen toestemming om gevoelige gegevens te verzamelen';\n    }\n    static get defaultCheckboxWarning() {\n        return '';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], DataPermissionsSettings.prototype, \"title\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], DataPermissionsSettings.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], DataPermissionsSettings.prototype, \"checkboxLabel\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 333 })\n], DataPermissionsSettings.prototype, \"checkboxWarning\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], DataPermissionsSettings.prototype, \"warningText\", void 0);\nexport class OrganizationRecordsConfiguration extends AutoEncoder {\n    constructor() {\n        // New record configurations\n        super(...arguments);\n        /**\n         * If the organizations provides support for families in financial difficulties\n         */\n        this.financialSupport = false;\n        /**\n         * Ask permissions to collect data\n         */\n        this.dataPermission = false;\n        this.emailAddress = null;\n        this.phone = null;\n        this.gender = null;\n        this.birthDay = null;\n        this.address = null;\n        this.parents = null;\n        this.emergencyContacts = null;\n        this.uitpasNumber = null;\n        this.nationalRegisterNumber = null;\n        this.recordCategories = [];\n        /**\n         * Defines if optional record categories in the parent are enabled, and when they are enabled (using a filter)\n         */\n        this.inheritedRecordCategories = new Map();\n        // General configurations\n        this.freeContribution = null;\n    }\n    static build(options) {\n        var _a, _b, _c;\n        // If not a default-age-group: disable enabled record categories in platform\n        const platformConfig = options.platform.config.recordsConfiguration.clone();\n        if ((!options.group || !options.group.defaultAgeGroupId) && !options.forceDefaultAgeGroup) {\n            for (const c of platformConfig.recordCategories) {\n                c.defaultEnabled = false;\n            }\n        }\n        let organizationConfig = null;\n        let defaultGroupConfig = null;\n        let groupConfig = null;\n        if (options.organization) {\n            organizationConfig = options.organization.meta.recordsConfiguration.clone();\n            if (options.group && options.group.type !== GroupType.Membership) {\n                // Specifically delete all the record categories, as those are only enabled for normal memberships\n                for (const c of organizationConfig.recordCategories) {\n                    c.defaultEnabled = false;\n                }\n            }\n            if (options.group && options.group.type === GroupType.WaitingList) {\n                // All fields are disabled by default, but can be enabled in the settings of the group\n                // We still keep all the record categories (defaultEnabled already has been set to false)\n                // so they can be enabled again in the group\n                organizationConfig = OrganizationRecordsConfiguration.create({\n                    recordCategories: organizationConfig.recordCategories,\n                });\n            }\n        }\n        // Group config\n        if (options.group && options.includeGroup) {\n            groupConfig = options.group.settings.recordsConfiguration.clone();\n        }\n        if (options.group && ((_a = options.group) === null || _a === void 0 ? void 0 : _a.defaultAgeGroupId)) {\n            const defaultAgeGroupId = options.group.defaultAgeGroupId;\n            defaultGroupConfig = (_c = (_b = options.platform.config.defaultAgeGroups.find(g => g.id === defaultAgeGroupId)) === null || _b === void 0 ? void 0 : _b.recordsConfiguration.clone()) !== null && _c !== void 0 ? _c : null;\n        }\n        return this.mergeChildren(...([platformConfig, defaultGroupConfig, organizationConfig, groupConfig].filter(f => f !== null)));\n    }\n    static mergeChildren(...configs) {\n        if (configs.length === 0) {\n            throw new Error('At least one configuration is required');\n        }\n        if (configs.length === 1) {\n            return configs[0];\n        }\n        const first = configs[0];\n        const second = configs[1];\n        return this.mergeChildren(this.mergeChild(first, second), ...configs.slice(2));\n    }\n    /**\n     * Note: best to not use this visually\n     */\n    static mergeChild(parent, child) {\n        const clone = child.clone();\n        if (parent.financialSupport !== false) {\n            clone.financialSupport = parent.financialSupport;\n        }\n        if (parent.dataPermission !== false) {\n            clone.dataPermission = parent.dataPermission;\n        }\n        if (parent.uitpasNumber !== null) {\n            clone.uitpasNumber = parent.uitpasNumber;\n        }\n        if (parent.nationalRegisterNumber !== null) {\n            clone.nationalRegisterNumber = parent.nationalRegisterNumber;\n        }\n        if (parent.emailAddress !== null) {\n            clone.emailAddress = parent.emailAddress;\n        }\n        if (parent.phone !== null) {\n            clone.phone = parent.phone;\n        }\n        if (parent.gender !== null) {\n            clone.gender = parent.gender;\n        }\n        if (parent.birthDay !== null) {\n            clone.birthDay = parent.birthDay;\n        }\n        if (parent.address !== null) {\n            clone.address = parent.address;\n        }\n        if (parent.parents !== null) {\n            clone.parents = parent.parents;\n        }\n        if (parent.emergencyContacts !== null) {\n            clone.emergencyContacts = parent.emergencyContacts;\n        }\n        if (parent.freeContribution !== null) {\n            clone.freeContribution = parent.freeContribution;\n        }\n        clone.recordCategories = [...parent.recordCategories.map((r) => {\n                const c = r.clone();\n                if (r.defaultEnabled) {\n                    return c;\n                }\n                const inheritedFilter = child.inheritedRecordCategories.get(r.id);\n                if (inheritedFilter !== undefined) {\n                    c.filter = inheritedFilter;\n                    c.defaultEnabled = true;\n                }\n                return c;\n            }), ...clone.recordCategories];\n        // Nothing inherited yet\n        clone.inheritedRecordCategories = new Map();\n        return clone;\n    }\n}\n__decorate([\n    field({ decoder: FinancialSupportSettings, nullable: true, version: 117 }),\n    field({\n        decoder: BooleanDecoder,\n        version: 320,\n        upgrade: (old) => {\n            return !!old;\n        },\n    })\n], OrganizationRecordsConfiguration.prototype, \"financialSupport\", void 0);\n__decorate([\n    field({ decoder: DataPermissionsSettings, nullable: true, version: 117 }),\n    field({\n        decoder: BooleanDecoder,\n        version: 320,\n        upgrade: (old) => {\n            return !!old;\n        },\n    })\n], OrganizationRecordsConfiguration.prototype, \"dataPermission\", void 0);\n__decorate([\n    field({ decoder: PropertyFilter, nullable: true, version: 124 })\n], OrganizationRecordsConfiguration.prototype, \"emailAddress\", void 0);\n__decorate([\n    field({ decoder: PropertyFilter, nullable: true, version: 125 })\n], OrganizationRecordsConfiguration.prototype, \"phone\", void 0);\n__decorate([\n    field({ decoder: PropertyFilter, nullable: true, version: 125 })\n], OrganizationRecordsConfiguration.prototype, \"gender\", void 0);\n__decorate([\n    field({ decoder: PropertyFilter, nullable: true, version: 125 })\n], OrganizationRecordsConfiguration.prototype, \"birthDay\", void 0);\n__decorate([\n    field({ decoder: PropertyFilter, nullable: true, version: 125 })\n], OrganizationRecordsConfiguration.prototype, \"address\", void 0);\n__decorate([\n    field({ decoder: PropertyFilter, nullable: true, version: 125 })\n], OrganizationRecordsConfiguration.prototype, \"parents\", void 0);\n__decorate([\n    field({ decoder: PropertyFilter, nullable: true, version: 125 })\n], OrganizationRecordsConfiguration.prototype, \"emergencyContacts\", void 0);\n__decorate([\n    field({ decoder: PropertyFilter, nullable: true, version: 306 })\n], OrganizationRecordsConfiguration.prototype, \"uitpasNumber\", void 0);\n__decorate([\n    field({ decoder: PropertyFilter, nullable: true, version: 348 })\n], OrganizationRecordsConfiguration.prototype, \"nationalRegisterNumber\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RecordCategory), version: 117 })\n], OrganizationRecordsConfiguration.prototype, \"recordCategories\", void 0);\n__decorate([\n    field({ decoder: new MapDecoder(StringDecoder, PropertyFilter), version: 254 })\n], OrganizationRecordsConfiguration.prototype, \"inheritedRecordCategories\", void 0);\n__decorate([\n    field({ decoder: FreeContributionSettings, nullable: true, version: 92 })\n], OrganizationRecordsConfiguration.prototype, \"freeContribution\", void 0);\n//# sourceMappingURL=OrganizationRecordsConfiguration.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, IntegerDecoder, StringDecoder, field } from '@simonbackx/simple-encoding';\nimport { Formatter } from '@stamhoofd/utility';\nimport { v4 as uuidv4 } from 'uuid';\nimport { OrganizationRecordsConfiguration } from './members/OrganizationRecordsConfiguration.js';\nexport class DefaultAgeGroup extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.names = [''];\n        this.description = '';\n        this.minAge = null;\n        this.maxAge = null;\n        /**\n         * Members registered in this age group, will be assigned to this membership type by default\n         */\n        this.defaultMembershipTypeId = null;\n        this.minimumRequiredMembers = 0;\n        /**\n         * Limit this default age group to specific organizations\n         */\n        this.organizationTagIds = null;\n    }\n    get name() {\n        return Formatter.joinLast(this.names, ', ', ' of ');\n    }\n    isEnabledForTags(tags) {\n        const organizationTags = this.organizationTagIds;\n        if (organizationTags === null) {\n            return true;\n        }\n        return (tags === null || tags === void 0 ? void 0 : tags.find(tagId => organizationTags.includes(tagId))) !== undefined;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], DefaultAgeGroup.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder) })\n], DefaultAgeGroup.prototype, \"names\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], DefaultAgeGroup.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], DefaultAgeGroup.prototype, \"minAge\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], DefaultAgeGroup.prototype, \"maxAge\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 269 })\n], DefaultAgeGroup.prototype, \"defaultMembershipTypeId\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 337 })\n], DefaultAgeGroup.prototype, \"minimumRequiredMembers\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), nullable: true, version: 358 })\n], DefaultAgeGroup.prototype, \"organizationTagIds\", void 0);\n__decorate([\n    field({\n        decoder: OrganizationRecordsConfiguration,\n        version: 293,\n        defaultValue: () => OrganizationRecordsConfiguration.create({}),\n    })\n], DefaultAgeGroup.prototype, \"recordsConfiguration\", void 0);\n//# sourceMappingURL=DefaultAgeGroup.js.map","import { EncodeMedium } from '@simonbackx/simple-encoding';\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { AuditLogReplacement, AuditLogReplacementType } from '../AuditLogReplacement.js';\nexport class File {\n    constructor(data) {\n        var _a, _b, _c, _d;\n        /// private or not?\n        this.isPrivate = false;\n        /// signed url if it is a private file\n        /// only filled if you have access to this file and when it has a valid signature\n        this.signedUrl = null;\n        /**\n         * A signature that proves that this file was generated by the server and is trusted. Without a valid signature,\n         * the backend won't return a signedUrl for accessing the file.\n         */\n        this.signature = null;\n        this.id = data.id;\n        this.server = data.server;\n        this.path = data.path;\n        this.size = data.size;\n        this.name = (_a = data.name) !== null && _a !== void 0 ? _a : null;\n        this.isPrivate = (_b = data.isPrivate) !== null && _b !== void 0 ? _b : false;\n        this.signedUrl = (_c = data.signedUrl) !== null && _c !== void 0 ? _c : null;\n        this.signature = (_d = data.signature) !== null && _d !== void 0 ? _d : null;\n    }\n    getDiffValue() {\n        var _a;\n        return AuditLogReplacement.create({\n            id: this.getPublicPath(),\n            value: (_a = this.name) !== null && _a !== void 0 ? _a : undefined,\n            type: AuditLogReplacementType.File,\n        });\n    }\n    get signPayload() {\n        return 'id: ' + this.id + '\\n'\n            + 'server: ' + this.server + '\\n'\n            + 'path: ' + this.path + '\\n'\n            + 'size: ' + this.size.toFixed(0) + '\\n'\n            + 'name: ' + this.name + '\\n'\n            + 'isPrivate: ' + (this.isPrivate ? 'true' : 'false');\n    }\n    static get signingEnabled() {\n        return !!File.signFile;\n    }\n    async sign() {\n        if (!File.signFile) {\n            return false;\n        }\n        await File.signFile(this);\n        return true;\n    }\n    async verify() {\n        if (!this.signature) {\n            return false;\n        }\n        if (!File.verifyFile) {\n            return false;\n        }\n        return await File.verifyFile(this);\n    }\n    async withSignedUrl() {\n        if (!this.signature || !this.isPrivate) {\n            return null;\n        }\n        if (!File.getWithSignedUrl) {\n            return null;\n        }\n        if (!await this.verify()) {\n            // Never generate a signed url for an untrusted file\n            return null;\n        }\n        return await File.getWithSignedUrl(this);\n    }\n    static decode(data) {\n        var _a, _b, _c, _d, _e, _f, _g, _h;\n        const file = new File({\n            id: data.field('id').string,\n            server: data.field('server').string,\n            path: data.field('path').string,\n            size: data.field('size').integer,\n            name: (_b = (_a = data.optionalField('name')) === null || _a === void 0 ? void 0 : _a.string) !== null && _b !== void 0 ? _b : null,\n            isPrivate: (_d = (_c = data.optionalField('isPrivate')) === null || _c === void 0 ? void 0 : _c.boolean) !== null && _d !== void 0 ? _d : false,\n            signedUrl: (_f = (_e = data.optionalField('signedUrl')) === null || _e === void 0 ? void 0 : _e.string) !== null && _f !== void 0 ? _f : null,\n            signature: (_h = (_g = data.optionalField('signature')) === null || _g === void 0 ? void 0 : _g.string) !== null && _h !== void 0 ? _h : null,\n        });\n        if (data.context.medium === EncodeMedium.Database || !file.isPrivate || !file.signature) {\n            // Clear signed url that we read from the database - these won't be valid any longer\n            file.signedUrl = null;\n        }\n        if (file.isPrivate && this.signingEnabled && (!data.context.medium || data.context.medium === EncodeMedium.Network)) {\n            // A signature is required\n            // Because of the sync nature of decoding, we cannot verify it here, but we need to do so when using the file\n            if (!file.signature) {\n                throw new SimpleError({\n                    code: 'missing_signature',\n                    message: 'Missing signature for private file',\n                });\n            }\n        }\n        return file;\n    }\n    encode(context) {\n        return {\n            id: this.id,\n            server: this.server,\n            path: this.path,\n            size: this.size,\n            name: this.name,\n            isPrivate: this.isPrivate,\n            signedUrl: this.isPrivate && this.signedUrl ? this.signedUrl : undefined,\n            signature: this.isPrivate ? this.signature : undefined,\n        };\n    }\n    getPublicPath() {\n        if (this.signedUrl && this.isPrivate) {\n            return this.signedUrl;\n        }\n        return this.server + '/' + this.path;\n    }\n}\n/**\n * When using public/private keys inside the check functions, you can also only implement the check method\n * to verify signatures received from the backend.\n */\nFile.verifyFile = null;\nFile.signFile = null;\nFile.getWithSignedUrl = null;\n//# sourceMappingURL=File.js.map","import { File } from './File.js';\nexport class Resolution {\n    constructor(data) {\n        this.file = data.file;\n        this.width = data.width;\n        this.height = data.height;\n    }\n    static decode(data) {\n        return new Resolution({\n            file: data.field('file').decode(File),\n            width: data.field('width').integer,\n            height: data.field('height').integer,\n        });\n    }\n    encode(context) {\n        return {\n            file: this.file.encode(context),\n            width: this.width,\n            height: this.height,\n        };\n    }\n}\n//# sourceMappingURL=Resolution.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { AuditLogReplacement, AuditLogReplacementType } from '../AuditLogReplacement.js';\nimport { File } from './File.js';\nimport { Resolution } from './Resolution.js';\nexport class Image extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.resolutions = [];\n    }\n    getDiffValue() {\n        var _a;\n        return AuditLogReplacement.create({\n            id: this.getPathForSize(undefined, undefined),\n            value: (_a = this.source.name) !== null && _a !== void 0 ? _a : undefined,\n            type: AuditLogReplacementType.Image,\n        });\n    }\n    getPublicPath() {\n        if (this.resolutions.length > 0) {\n            return this.resolutions[0].file.getPublicPath();\n        }\n        return this.source.getPublicPath();\n    }\n    getPathForSize(width, height) {\n        if (this.resolutions.length == 0) {\n            return this.getPublicPath();\n        }\n        const resolution = this.getResolutionForSize(width, height);\n        return resolution.file.getPublicPath();\n    }\n    getResolutionForSize(width, height) {\n        var _a;\n        let bestResolution;\n        const ratio = (_a = ((typeof window !== 'undefined') ? (window.devicePixelRatio ? window.devicePixelRatio : 1) : 1)) !== null && _a !== void 0 ? _a : 1;\n        if (ratio >= 2 && width) {\n            width = ratio * width;\n        }\n        if (ratio >= 2 && height) {\n            height = ratio * height;\n        }\n        // Search resolution bigger than width x height, but smaller than any other resolution that is bigger\n        for (const resolution of this.resolutions) {\n            if ((bestResolution === undefined || ((!width || resolution.width <= bestResolution.width) && (!height || resolution.height <= bestResolution.height)))\n                && (!width || resolution.width >= width)\n                && (!height || resolution.height >= height)) {\n                bestResolution = resolution;\n            }\n        }\n        if (bestResolution) {\n            return bestResolution;\n        }\n        // Get biggest resolution possible of we don't find anything bigger\n        for (const resolution of this.resolutions) {\n            if (bestResolution === undefined || (resolution.width >= bestResolution.width && resolution.height >= bestResolution.height)) {\n                bestResolution = resolution;\n            }\n        }\n        if (bestResolution) {\n            return bestResolution;\n        }\n        throw new Error('No resolution found. Please first check if the image has resolutions');\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], Image.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: File })\n], Image.prototype, \"source\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Resolution) })\n], Image.prototype, \"resolutions\", void 0);\n//# sourceMappingURL=Image.js.map","export var GroupGenderType;\n(function (GroupGenderType) {\n    GroupGenderType[\"Mixed\"] = \"Mixed\";\n    GroupGenderType[\"OnlyMale\"] = \"OnlyMale\";\n    GroupGenderType[\"OnlyFemale\"] = \"OnlyFemale\";\n})(GroupGenderType || (GroupGenderType = {}));\n//# sourceMappingURL=GroupGenderType.js.map","/**\n * More granular access rights to specific things in the system\n */\nexport var PermissionsResourceType;\n(function (PermissionsResourceType) {\n    PermissionsResourceType[\"Webshops\"] = \"Webshops\";\n    PermissionsResourceType[\"Groups\"] = \"Groups\";\n    PermissionsResourceType[\"GroupCategories\"] = \"GroupCategories\";\n    PermissionsResourceType[\"OrganizationTags\"] = \"OrganizationTags\";\n    PermissionsResourceType[\"RecordCategories\"] = \"RecordCategory\";\n})(PermissionsResourceType || (PermissionsResourceType = {}));\nexport function getPermissionResourceTypeName(type, plural = true) {\n    switch (type) {\n        case PermissionsResourceType.Webshops: return plural ? 'webshops' : 'webshop';\n        case PermissionsResourceType.Groups: return plural ? 'inschrijvingsgroepen' : 'inschrijvingsgroep';\n        case PermissionsResourceType.GroupCategories: return plural ? 'categorieën' : 'categorie';\n        case PermissionsResourceType.OrganizationTags: return plural ? 'tags' : 'tag';\n        case PermissionsResourceType.RecordCategories: return plural ? 'vragenlijsten' : 'vragenlijst';\n    }\n}\n//# sourceMappingURL=PermissionsResourceType.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, field, StringDecoder, EnumDecoder, ArrayDecoder, PatchMap } from '@simonbackx/simple-encoding';\nimport { AccessRight, AccessRightHelper } from './AccessRight.js';\nimport { PermissionLevel, getPermissionLevelNumber } from './PermissionLevel.js';\nimport { getPermissionResourceTypeName } from './PermissionsResourceType.js';\nimport { Formatter } from '@stamhoofd/utility';\n/**\n * More granular access rights to specific things in the system\n */\nexport class ResourcePermissions extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * This is a cache so we can display the role description without fetching all resources\n         */\n        this.resourceName = '';\n        /**\n         * Setting it to full gives all possible permissions for the resource\n         * Read/Write depends on resource\n         */\n        this.level = PermissionLevel.None;\n        /**\n         * More granular permissions related to this resource\n         */\n        this.accessRights = [];\n    }\n    getDiffName() {\n        return this.resourceName;\n    }\n    hasAccess(level) {\n        return getPermissionLevelNumber(this.level) >= getPermissionLevelNumber(level);\n    }\n    hasAccessRight(right) {\n        const gl = AccessRightHelper.autoGrantRightForLevel(right);\n        return (gl && this.hasAccess(gl)) || this.accessRights.includes(right);\n    }\n    createInsertPatch(type, resourceId, roleOrPermissions) {\n        const patch = roleOrPermissions.static.patch({});\n        // First check if we need to insert the type\n        if (roleOrPermissions.resources.get(type)) {\n            // We need to patch\n            const p = new PatchMap();\n            p.set(resourceId, this);\n            patch.resources.set(type, p);\n        }\n        else {\n            // No resources with this type yet\n            const p = new Map();\n            p.set(resourceId, this);\n            patch.resources.set(type, p);\n        }\n        return patch;\n    }\n    merge(other) {\n        const p = new ResourcePermissions();\n        p.level = this.level;\n        p.accessRights = this.accessRights.slice();\n        if (getPermissionLevelNumber(other.level) > getPermissionLevelNumber(p.level)) {\n            p.level = other.level;\n        }\n        for (const right of other.accessRights) {\n            if (!p.accessRights.includes(right)) {\n                p.accessRights.push(right);\n            }\n        }\n        return p;\n    }\n    removeAccessRights(rights) {\n        this.accessRights = this.accessRights.filter(r => !rights.includes(r));\n    }\n    get isEmpty() {\n        return this.level === PermissionLevel.None && this.accessRights.length === 0;\n    }\n    static getMapDescription(map) {\n        var _a;\n        const stack = [];\n        const resourceDescription = (resource) => {\n            const accessRights = resource.accessRights.map(a => AccessRightHelper.getDescription(a));\n            if (resource.level === PermissionLevel.None) {\n                return Formatter.joinLast(accessRights, ', ', ' en ');\n            }\n            let prefix = 'lezen';\n            if (resource.level === PermissionLevel.Write) {\n                prefix = 'bewerken';\n            }\n            else if (resource.level === PermissionLevel.Full) {\n                prefix = 'volledige toegang';\n            }\n            return prefix + (accessRights.length > 0 ? ' met ' + Formatter.joinLast(accessRights, ', ', ' en ') : '');\n        };\n        for (const [type, resources] of map) {\n            const all = resources.get('');\n            let allDescription = null;\n            if (all && !all.isEmpty) {\n                const accessRights = all.accessRights.map(a => AccessRightHelper.getDescription(a));\n                if (all.level === PermissionLevel.None) {\n                    stack.push('alle ' + getPermissionResourceTypeName(type, true) + ': ' + Formatter.joinLast(accessRights, ', ', ' en '));\n                }\n                let prefix = 'alle ';\n                let suffix = ' lezen';\n                if (all.level === PermissionLevel.Write) {\n                    suffix = ' bewerken';\n                }\n                else if (all.level === PermissionLevel.Full) {\n                    prefix = 'volledige toegang tot alle ';\n                    suffix = '';\n                }\n                stack.push(prefix + getPermissionResourceTypeName(type, true) + suffix + (accessRights.length > 0 ? ' met ' + Formatter.joinLast(accessRights, ', ', ' en ') : ''));\n                allDescription = resourceDescription(all);\n            }\n            const countsPer = new Map();\n            for (const resource of resources.values()) {\n                if (!resource.isEmpty) {\n                    const description = resourceDescription(resource);\n                    if (description === allDescription) {\n                        continue;\n                    }\n                    if (!countsPer.has(description)) {\n                        countsPer.set(description, { count: 0, firstName: (_a = resource.resourceName) !== null && _a !== void 0 ? _a : null });\n                    }\n                    countsPer.get(description).count += 1;\n                }\n            }\n            for (const [description, { count, firstName }] of countsPer) {\n                stack.push((count === 1 && firstName ? firstName : (count + ' ' + getPermissionResourceTypeName(type, count > 1))) + ' (' + description + ')');\n            }\n        }\n        return stack;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, field: 'n' })\n], ResourcePermissions.prototype, \"resourceName\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(PermissionLevel), field: 'l' })\n], ResourcePermissions.prototype, \"level\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(new EnumDecoder(AccessRight)), field: 'r' })\n], ResourcePermissions.prototype, \"accessRights\", void 0);\n//# sourceMappingURL=ResourcePermissions.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, EnumDecoder, MapDecoder, StringDecoder, field } from '@simonbackx/simple-encoding';\nimport { Formatter } from '@stamhoofd/utility';\nimport { v4 as uuidv4 } from 'uuid';\nimport { AccessRight, AccessRightHelper } from './AccessRight.js';\nimport { PermissionLevel, getPermissionLevelNumber } from './PermissionLevel.js';\nimport { PermissionsResourceType } from './PermissionsResourceType.js';\nimport { ResourcePermissions } from './ResourcePermissions.js';\nexport class PermissionRole extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], PermissionRole.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], PermissionRole.prototype, \"name\", void 0);\nexport class PermissionRoleDetailed extends PermissionRole {\n    constructor() {\n        super(...arguments);\n        /**\n         * Generic access to all resources\n         */\n        this.level = PermissionLevel.None;\n        this.accessRights = [];\n        this.resources = new Map();\n        /**\n         * @deprecated\n         * Required for migration\n         */\n        this.legacyManagePayments = false;\n        /**\n         * @deprecated\n         * Required for migration\n         */\n        this.legacyFinanceDirector = false;\n        /**\n         * @deprecated\n         * Required for migration\n         */\n        this.legacyCreateWebshops = false;\n    }\n    getDiffValue() {\n        return this.getDescription();\n    }\n    getDescription() {\n        const stack = [];\n        if (this.level === PermissionLevel.Read) {\n            stack.push('alles lezen');\n        }\n        if (this.level === PermissionLevel.Write) {\n            stack.push('alles bewerken');\n        }\n        if (this.level === PermissionLevel.Full) {\n            stack.push('volledige toegang');\n        }\n        for (const right of this.accessRights) {\n            stack.push(AccessRightHelper.getDescription(right));\n        }\n        stack.push(...ResourcePermissions.getMapDescription(this.resources));\n        if (stack.length === 0) {\n            return 'geen rechten';\n        }\n        return Formatter.capitalizeFirstLetter(Formatter.joinLast(stack, ', ', ' en '));\n    }\n    hasAccess(level) {\n        return getPermissionLevelNumber(this.level) >= getPermissionLevelNumber(level);\n    }\n    hasAccessRight(right) {\n        const gl = AccessRightHelper.autoGrantRightForLevel(right);\n        if ((gl && this.hasAccess(gl)) || this.accessRights.includes(right)) {\n            return true;\n        }\n        const autoInherit = AccessRightHelper.autoInheritFrom(right);\n        for (const r of autoInherit) {\n            if (this.hasAccessRight(r)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    getResourcePermissions(type, id) {\n        const resource = this.resources.get(type);\n        if (!resource) {\n            return null;\n        }\n        const rInstance = resource.get(id);\n        const allInstance = resource.get('');\n        if (!rInstance) {\n            if (allInstance) {\n                return allInstance;\n            }\n            return null;\n        }\n        if (allInstance) {\n            return rInstance.merge(allInstance);\n        }\n        return rInstance;\n    }\n    getMergedResourcePermissions(type, id) {\n        var _a;\n        let base = this.getResourcePermissions(type, id);\n        if (getPermissionLevelNumber(this.level) > getPermissionLevelNumber((_a = base === null || base === void 0 ? void 0 : base.level) !== null && _a !== void 0 ? _a : PermissionLevel.None)) {\n            if (!base) {\n                base = ResourcePermissions.create({ level: this.level });\n            }\n            base.level = this.level;\n        }\n        return base;\n    }\n    hasResourceAccess(type, id, level) {\n        var _a, _b;\n        if (this.hasAccess(level)) {\n            return true;\n        }\n        return (_b = (_a = this.getResourcePermissions(type, id)) === null || _a === void 0 ? void 0 : _a.hasAccess(level)) !== null && _b !== void 0 ? _b : false;\n    }\n    hasResourceAccessRight(type, id, right) {\n        var _a, _b;\n        if (this.hasAccessRight(right)) {\n            return true;\n        }\n        return (_b = (_a = this.getResourcePermissions(type, id)) === null || _a === void 0 ? void 0 : _a.hasAccessRight(right)) !== null && _b !== void 0 ? _b : false;\n    }\n    hasAccessRightForSomeResourceOfType(type, right) {\n        if (this.hasAccessRight(right)) {\n            return true;\n        }\n        const resource = this.resources.get(type);\n        if (!resource) {\n            return false;\n        }\n        for (const r of resource.values()) {\n            if (r.hasAccessRight(right)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    add(other) {\n        if (getPermissionLevelNumber(this.level) < getPermissionLevelNumber(other.level)) {\n            this.level = other.level;\n        }\n        for (const right of other.accessRights) {\n            if (!this.accessRights.includes(right)) {\n                this.accessRights.push(right);\n            }\n        }\n        for (const [type, r] of other.resources) {\n            for (const [id, resource] of r) {\n                if (!this.resources.has(type)) {\n                    this.resources.set(type, new Map());\n                }\n                const current = this.resources.get(type).get(id);\n                if (!current) {\n                    this.resources.get(type).set(id, resource);\n                }\n                else {\n                    this.resources.get(type).set(id, current.merge(resource));\n                }\n            }\n        }\n    }\n    get isEmpty() {\n        let resourcesEmpty = true;\n        for (const resource of this.resources.values()) {\n            for (const r of resource.values()) {\n                if (!r.isEmpty) {\n                    resourcesEmpty = false;\n                    break;\n                }\n            }\n        }\n        return this.level === PermissionLevel.None && this.accessRights.length === 0 && resourcesEmpty;\n    }\n    removeAccessRights(rights) {\n        this.accessRights = this.accessRights.filter(r => !rights.includes(r));\n        for (const resource of this.resources.values()) {\n            for (const r of resource.values()) {\n                r.removeAccessRights(rights);\n            }\n        }\n    }\n}\n__decorate([\n    field({ decoder: new EnumDecoder(PermissionLevel), version: 201 })\n], PermissionRoleDetailed.prototype, \"level\", void 0);\n__decorate([\n    field({\n        decoder: new ArrayDecoder(new EnumDecoder(AccessRight)),\n        version: 246,\n        upgrade: function () {\n            const base = [];\n            if (this.legacyManagePayments) {\n                base.push(AccessRight.OrganizationManagePayments);\n            }\n            if (this.legacyFinanceDirector) {\n                base.push(AccessRight.OrganizationFinanceDirector);\n            }\n            if (this.legacyCreateWebshops) {\n                base.push(AccessRight.OrganizationCreateWebshops);\n            }\n            return base;\n        },\n    })\n], PermissionRoleDetailed.prototype, \"accessRights\", void 0);\n__decorate([\n    field({\n        decoder: new MapDecoder(new EnumDecoder(PermissionsResourceType), new MapDecoder(\n        // ID\n        StringDecoder, ResourcePermissions)),\n        version: 248,\n    })\n], PermissionRoleDetailed.prototype, \"resources\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, field: 'managePayments', optional: true })\n], PermissionRoleDetailed.prototype, \"legacyManagePayments\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 199, field: 'financeDirector', optional: true })\n], PermissionRoleDetailed.prototype, \"legacyFinanceDirector\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, field: 'createWebshops', optional: true })\n], PermissionRoleDetailed.prototype, \"legacyCreateWebshops\", void 0);\nexport class PermissionRoleForResponsibility extends PermissionRoleDetailed {\n    constructor() {\n        super(...arguments);\n        this.responsibilityGroupId = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], PermissionRoleForResponsibility.prototype, \"responsibilityId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], PermissionRoleForResponsibility.prototype, \"responsibilityGroupId\", void 0);\n//# sourceMappingURL=PermissionRole.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, field } from '@simonbackx/simple-encoding';\nimport { PermissionLevel, getPermissionLevelNumber } from './PermissionLevel.js';\nimport { PermissionRole } from './PermissionRole.js';\n/**\n * @deprecated\n * Use resource types\n * Give access to a given resouce based by the roles of a user\n */\nexport class PermissionsByRole extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.read = [];\n        this.write = [];\n        this.full = [];\n    }\n    /**\n     * Whetever a given user has access to the members in this group.\n     */\n    getRolePermissionLevel(role) {\n        for (const r of this.full) {\n            if (r.id === role.id) {\n                return PermissionLevel.Full;\n            }\n        }\n        for (const r of this.write) {\n            if (r.id === role.id) {\n                return PermissionLevel.Write;\n            }\n        }\n        for (const r of this.read) {\n            if (r.id === role.id) {\n                return PermissionLevel.Read;\n            }\n        }\n        return PermissionLevel.None;\n    }\n    roleHasAccess(role, level = PermissionLevel.Read) {\n        return getPermissionLevelNumber(this.getRolePermissionLevel(role)) >= getPermissionLevelNumber(level);\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(PermissionRole) })\n], PermissionsByRole.prototype, \"read\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(PermissionRole) })\n], PermissionsByRole.prototype, \"write\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(PermissionRole) })\n], PermissionsByRole.prototype, \"full\", void 0);\n//# sourceMappingURL=PermissionsByRole.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { PermissionsByRole } from './PermissionsByRole.js';\nexport class GroupPrivateSettings extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.defaultEmailId = null;\n        this.permissions = PermissionsByRole.create({});\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 10 })\n], GroupPrivateSettings.prototype, \"defaultEmailId\", void 0);\n__decorate([\n    field({ decoder: PermissionsByRole, version: 60, optional: true })\n], GroupPrivateSettings.prototype, \"permissions\", void 0);\nexport const GroupPrivateSettingsPatch = GroupPrivateSettings.patchType();\n//# sourceMappingURL=GroupPrivateSettings.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, DateDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nexport class OldGroupPrice extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.price = 0;\n        this.reducedPrice = null;\n    }\n}\n__decorate([\n    field({ decoder: IntegerDecoder })\n], OldGroupPrice.prototype, \"price\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], OldGroupPrice.prototype, \"reducedPrice\", void 0);\n/**\n * A group can have multiple prices, stored in an array. The pricing with the highest date or index is applied.\n */\nexport class OldGroupPrices extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.startDate = null;\n        /**\n         * Whether the array count is per member of the same family (true) or only the same member (false)\n         */\n        this.sameMemberOnlyDiscount = false;\n        /**\n         * Count members in same category or only for the same group?\n         */\n        this.onlySameGroup = false;\n        /**\n         * The array contains prices: for first member, second member... If more members are present in a family (or member itself), the last price is used\n         */\n        this.prices = [OldGroupPrice.create({})];\n        /**\n         * @deprecated\n         */\n        this.price = 0;\n        /**\n         * @deprecated\n         */\n        this.reducedPrice = null;\n        /**\n         * @deprecated\n         * Second member in the family\n         */\n        this.familyPrice = null;\n        /**\n         * @deprecated\n         * Third or later member\n         */\n        this.extraFamilyPrice = null;\n    }\n    getPriceFor(reduced, alreadyRegisteredCount = 0) {\n        var _a;\n        if (this.prices.length == 0 || alreadyRegisteredCount < 0) {\n            return 0;\n        }\n        const price = this.prices[Math.min(this.prices.length - 1, alreadyRegisteredCount)];\n        if (reduced) {\n            return (_a = price.reducedPrice) !== null && _a !== void 0 ? _a : price.price;\n        }\n        return price.price;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, version: 2, defaultValue: () => uuidv4() })\n], OldGroupPrices.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], OldGroupPrices.prototype, \"startDate\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, upgrade: () => false, version: 99 })\n], OldGroupPrices.prototype, \"sameMemberOnlyDiscount\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, upgrade: () => false, version: 99 })\n], OldGroupPrices.prototype, \"onlySameGroup\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(OldGroupPrice), version: 98, upgrade: function () {\n            const arr = [\n                OldGroupPrice.create({\n                    price: this.price,\n                    reducedPrice: this.reducedPrice,\n                }),\n            ];\n            if (this.familyPrice !== null) {\n                arr.push(OldGroupPrice.create({\n                    price: this.familyPrice,\n                    reducedPrice: (this.reducedPrice !== null && this.familyPrice < this.reducedPrice) ? null : this.reducedPrice,\n                }));\n                if (this.extraFamilyPrice !== null) {\n                    arr.push(OldGroupPrice.create({\n                        price: this.extraFamilyPrice,\n                        reducedPrice: (this.reducedPrice !== null && this.extraFamilyPrice < this.reducedPrice) ? null : this.reducedPrice,\n                    }));\n                }\n            }\n            return arr;\n        } })\n], OldGroupPrices.prototype, \"prices\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], OldGroupPrices.prototype, \"price\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], OldGroupPrices.prototype, \"reducedPrice\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 22 })\n], OldGroupPrices.prototype, \"familyPrice\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 22 })\n], OldGroupPrices.prototype, \"extraFamilyPrice\", void 0);\n//# sourceMappingURL=OldGroupPrices.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, BooleanDecoder, DateDecoder, StringDecoder, field } from '@simonbackx/simple-encoding';\nimport { Formatter } from '@stamhoofd/utility';\nimport { v4 as uuidv4 } from 'uuid';\nexport class RegistrationPeriodBase extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.startDate = new Date();\n        this.endDate = new Date();\n        this.locked = false;\n        this.previousPeriodId = null;\n    }\n    get name() {\n        return 'Werkjaar ' + Formatter.year(this.startDate) + ' - ' + Formatter.year(this.endDate);\n    }\n    get nameShort() {\n        return Formatter.year(this.startDate) + ' - ' + Formatter.year(this.endDate);\n    }\n    getDiffValue() {\n        return this.name;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], RegistrationPeriodBase.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], RegistrationPeriodBase.prototype, \"startDate\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], RegistrationPeriodBase.prototype, \"endDate\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, optional: true })\n], RegistrationPeriodBase.prototype, \"locked\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 354 })\n], RegistrationPeriodBase.prototype, \"previousPeriodId\", void 0);\n//# sourceMappingURL=RegistrationPeriodBase.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nexport class StockReservation extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.amount = 0;\n        this.children = [];\n    }\n    static getAmount(type, id, list) {\n        let amount = 0;\n        for (const reservation of list) {\n            if (reservation.objectType === type && (id === null || reservation.objectId === id)) {\n                amount += reservation.amount;\n            }\n        }\n        return amount;\n    }\n    static filter(type, id, list) {\n        return list.filter(r => r.objectType === type && r.objectId === id).flatMap(r => r.children);\n    }\n    static add(base, add) {\n        const existingIndex = base.findIndex(r => r.objectType === add.objectType && r.objectId === add.objectId);\n        if (existingIndex !== -1) {\n            const existing = base[existingIndex];\n            existing.amount += add.amount;\n            existing.children = StockReservation.added(existing.children, add.children);\n            if (existing.amount == 0 && existing.children.length === 0) {\n                // NOTE: the amount should be zero.\n                // if it is negative, we still have to keep it, because it can be needed during a calculation\n                base.splice(existingIndex, 1);\n                return;\n            }\n        }\n        else {\n            base.push(add.clone());\n        }\n    }\n    invert() {\n        this.amount = -this.amount;\n        for (const child of this.children) {\n            child.invert();\n        }\n    }\n    static remove(base, remove) {\n        const c = remove.clone();\n        c.invert();\n        return this.add(base, c);\n    }\n    static added(base, add) {\n        const newReservations = [];\n        for (const r of base) {\n            // We do this because it is possible that base contains errors or duplicates\n            this.add(newReservations, r);\n        }\n        for (const r of add) {\n            this.add(newReservations, r);\n        }\n        return newReservations;\n    }\n    static removed(base, remove) {\n        const newReservations = [];\n        for (const r of base) {\n            // We do this because it is possible that base contains errors or duplicates\n            this.add(newReservations, r);\n        }\n        for (const r of remove) {\n            this.remove(newReservations, r);\n        }\n        return newReservations;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, field: 'id' })\n], StockReservation.prototype, \"objectId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, field: 't' })\n], StockReservation.prototype, \"objectType\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, field: 'a' })\n], StockReservation.prototype, \"amount\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StockReservation), field: 'c' })\n], StockReservation.prototype, \"children\", void 0);\n//# sourceMappingURL=StockReservation.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, DateDecoder, EnumDecoder, field, IntegerDecoder, MapDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { Formatter } from '@stamhoofd/utility';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Group } from './Group.js';\nimport { GroupGenderType } from './GroupGenderType.js';\nimport { OldGroupPrices } from './OldGroupPrices.js';\nimport { RegistrationPeriodBase } from './RegistrationPeriodBase.js';\nimport { StockReservation } from './StockReservation.js';\nimport { Image } from './files/Image.js';\nimport { OrganizationRecordsConfiguration } from './members/OrganizationRecordsConfiguration.js';\nimport { RecordCategory } from './members/records/RecordCategory.js';\nexport class ReduceablePrice extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.price = 0;\n        this.reducedPrice = null;\n    }\n    getPrice(isReduced) {\n        if (this.reducedPrice === null) {\n            return this.price;\n        }\n        return isReduced ? this.reducedPrice : this.price;\n    }\n    forMember(member) {\n        return this.getPrice(member.patchedMember.details.shouldApplyReducedPrice);\n    }\n}\n__decorate([\n    field({ decoder: IntegerDecoder })\n], ReduceablePrice.prototype, \"price\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], ReduceablePrice.prototype, \"reducedPrice\", void 0);\nexport class GroupPrice extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = 'Standaardtarief';\n        this.price = ReduceablePrice.create({});\n        this.hidden = false;\n        /**\n         * Total stock, excluding already sold items into account\n         */\n        this.stock = null;\n        /**\n         * @deprecated removed\n         */\n        this._usedStock = 0;\n        /**\n         * @deprecated removed\n         */\n        this._reserved = 0;\n    }\n    getUsedStock(group) {\n        const groupStockReservations = group.stockReservations;\n        return StockReservation.getAmount('GroupPrice', this.id, groupStockReservations);\n    }\n    /**\n     * Can be negative is we are editing items, positive if other items in the cart cause stock changes\n     */\n    getPendingStock(item) {\n        const stock = item.getCartPendingStockReservations(); // this is positive if it will be used\n        return StockReservation.getAmount('GroupPrice', this.id, StockReservation.filter('Group', item.group.id, stock));\n    }\n    isSoldOut(item) {\n        if (this.stock === null) {\n            return false;\n        }\n        if (item instanceof Group) {\n            return this.getUsedStock(item) >= this.stock;\n        }\n        return this.getUsedStock(item.group) + this.getPendingStock(item) >= this.stock;\n    }\n    getRemainingStock(item) {\n        if (this.stock === null) {\n            return null;\n        }\n        if (item instanceof Group) {\n            return Math.max(0, this.stock - this.getUsedStock(item));\n        }\n        return Math.max(0, this.stock - this.getPendingStock(item) - this.getUsedStock(item.group));\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], GroupPrice.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], GroupPrice.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: ReduceablePrice })\n], GroupPrice.prototype, \"price\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 290 })\n], GroupPrice.prototype, \"hidden\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 290 })\n], GroupPrice.prototype, \"stock\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, optional: true, field: 'usedStock' })\n], GroupPrice.prototype, \"_usedStock\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, optional: true, field: 'reserved' })\n], GroupPrice.prototype, \"_reserved\", void 0);\nexport class GroupOption extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.hidden = false;\n        /**\n         * Price added (can be negative) is always in cents, to avoid floating point errors\n         */\n        this.price = ReduceablePrice.create({});\n        /**\n         * Maximum per registration (if > 1, you can choose an amount for this option)\n         * If null = infinite\n         */\n        this.allowAmount = false;\n        /**\n         * Maximum per registration (in case allowAmount is true)\n         * If null = infinite\n         */\n        this.maximum = null;\n        /**\n         * Total stock, excluding already sold items into account\n         */\n        this.stock = null;\n        /**\n         * @deprecated removed\n         */\n        this._usedStock = 0;\n        /**\n         * @deprecated removed\n         */\n        this._reserved = 0;\n    }\n    getUsedStock(group) {\n        const groupStockReservations = group.stockReservations;\n        return StockReservation.getAmount('GroupOption', this.id, groupStockReservations);\n    }\n    /**\n     * Can be negative is we are editing items, positive if other items in the cart cause stock changes\n     */\n    getPendingStock(item) {\n        const stock = item.getCartPendingStockReservations(); // this is positive if it will be used\n        return StockReservation.getAmount('GroupOption', this.id, StockReservation.filter('Group', item.group.id, stock));\n    }\n    isSoldOut(item) {\n        if (this.stock === null) {\n            return false;\n        }\n        if (item instanceof Group) {\n            return this.getUsedStock(item) >= this.stock;\n        }\n        return this.getUsedStock(item.group) + this.getPendingStock(item) >= this.stock;\n    }\n    getRemainingStock(item) {\n        if (this.stock === null) {\n            return null;\n        }\n        if (item instanceof Group) {\n            return Math.max(0, this.stock - this.getUsedStock(item));\n        }\n        return Math.max(0, this.stock - this.getPendingStock(item) - this.getUsedStock(item.group));\n    }\n    getMaximumSelection(item) {\n        if (this.maximum === null) {\n            return this.getRemainingStock(item);\n        }\n        const remaining = this.getRemainingStock(item);\n        if (remaining === null) {\n            return this.maximum;\n        }\n        return Math.min(this.maximum, remaining);\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], GroupOption.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], GroupOption.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 290 })\n], GroupOption.prototype, \"hidden\", void 0);\n__decorate([\n    field({ decoder: ReduceablePrice })\n], GroupOption.prototype, \"price\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], GroupOption.prototype, \"allowAmount\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], GroupOption.prototype, \"maximum\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 290 })\n], GroupOption.prototype, \"stock\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, optional: true, field: 'usedStock' })\n], GroupOption.prototype, \"_usedStock\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, optional: true, field: 'reserved' })\n], GroupOption.prototype, \"_reserved\", void 0);\nexport class GroupOptionMenu extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.description = '';\n        this.multipleChoice = false;\n        this.options = [\n            GroupOption.create({}),\n        ];\n    }\n    get hidden() {\n        return this.options.length > 0 && this.options.every(o => o.hidden);\n    }\n    getFilteredOptions(options) {\n        return this.options.filter((p) => {\n            if (p.hidden && !(options === null || options === void 0 ? void 0 : options.admin)) {\n                return false;\n            }\n            return true;\n        });\n    }\n    getDefaultOption(options) {\n        if ((options === null || options === void 0 ? void 0 : options.admin) || this.hidden) {\n            return this.options[0];\n        }\n        return this.options.filter(o => !o.hidden)[0];\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], GroupOptionMenu.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], GroupOptionMenu.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], GroupOptionMenu.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], GroupOptionMenu.prototype, \"multipleChoice\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(GroupOption) })\n], GroupOptionMenu.prototype, \"options\", void 0);\nexport var WaitingListType;\n(function (WaitingListType) {\n    WaitingListType[\"None\"] = \"None\";\n    WaitingListType[\"PreRegistrations\"] = \"PreRegistrations\";\n    WaitingListType[\"ExistingMembersFirst\"] = \"ExistingMembersFirst\";\n    WaitingListType[\"All\"] = \"All\";\n})(WaitingListType || (WaitingListType = {}));\nexport class CycleInformation extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.startDate = null;\n        this.endDate = null;\n        this.registeredMembers = 0;\n        /**\n         * Amount of members that is reserved (e.g in payment process, or a member on the waiting list that is invited)\n         */\n        this.reservedMembers = 0;\n        /**\n         * Amount of members on the waiting list\n         */\n        this.waitingListSize = 0;\n    }\n}\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], CycleInformation.prototype, \"startDate\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], CycleInformation.prototype, \"endDate\", void 0);\n__decorate([\n    field({\n        decoder: IntegerDecoder,\n        nullable: true,\n    })\n], CycleInformation.prototype, \"registeredMembers\", void 0);\n__decorate([\n    field({\n        decoder: IntegerDecoder,\n        nullable: true,\n        version: 139,\n    })\n], CycleInformation.prototype, \"reservedMembers\", void 0);\n__decorate([\n    field({\n        decoder: IntegerDecoder,\n        nullable: true,\n        version: 139,\n    })\n], CycleInformation.prototype, \"waitingListSize\", void 0);\nexport class GroupDefaultEventTime extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.dayOfWeek = 1; // 1 = monday, 7 = sunday\n        this.startTime = 0; // minutes since midnight\n        this.endTime = 0; // minutes since midnight\n    }\n}\n__decorate([\n    field({ decoder: IntegerDecoder })\n], GroupDefaultEventTime.prototype, \"dayOfWeek\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], GroupDefaultEventTime.prototype, \"startTime\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], GroupDefaultEventTime.prototype, \"endTime\", void 0);\nexport class GroupSettings extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.description = '';\n        this.eventId = null;\n        /**\n         * Cached value so we know what period this group is in, to calculate the age requirements,\n         * and to display the time period in the UI\n         */\n        this.period = null;\n        this.prices = [GroupPrice.create({})];\n        this.optionMenus = [];\n        /**\n         * Note: these are saved in the registration, not the member.\n         * Do not confuse with the member's record categories in recordsConfiguration\n         */\n        this.recordCategories = [];\n        /**\n         * Date when the online registrations open automatically (note: the group should be open for this to work)\n         */\n        this.registrationStartDate = null;\n        /**\n         * Date when the online registrations close automatically\n         */\n        this.registrationEndDate = null;\n        /**\n         * Experimental feature to suggest when to create new activities in the calendar.\n         */\n        this.defaultEventTime = null;\n        this.genderType = GroupGenderType.Mixed;\n        /**\n         * Number of days on trial for new members\n         */\n        this.trialDays = 0;\n        this.minAge = null;\n        this.maxAge = null;\n        this.waitingListType = WaitingListType.None;\n        /**\n         * Only used for waitingListType = PreRegistrations\n         */\n        this.preRegistrationsDate = null;\n        this.maxMembers = null;\n        /**\n         * @deprecated\n         * Use waitinglist instead to determine if a waiting list is enabled\n         */\n        this.waitingListIfFull = true;\n        /**\n         * @deprecated\n         * If maxMembers is not null, this will get filled in by the backend\n         */\n        this.registeredMembers = 0;\n        /**\n         * @deprecated\n         * Amount of members that is reserved (e.g in payment process, or a member on the waiting list that is invited)\n         */\n        this.reservedMembers = 0;\n        /**\n         * @deprecated\n         * Amount of members on the waiting list\n         */\n        this.waitingListSize = null;\n        /**\n         * Of er voorrang moet gegeven worden aan broers en/of zussen als er wachtlijsten of voorinschrijvingen zijn\n         */\n        this.priorityForFamily = true;\n        this.coverPhoto = null;\n        this.squarePhoto = null;\n        /**\n         * @deprecated\n         */\n        this.oldPrices = [];\n        /**\n         * @deprecated\n         */\n        this.images = [];\n        /**\n         * @deprecated\n         */\n        this.location = '';\n        /**\n         * Require that the member is already registered for one of these groups before allowing to register for this group.\n         * If it is empty, then it is not enforced\n         */\n        this.requireGroupIds = [];\n        /**\n         * Require that the member is already registered for one of these groups before allowing to register for this group.\n         * If it is empty, then it is not enforced\n         */\n        this.requireDefaultAgeGroupIds = [];\n        /**\n         * The member should have a platform membership for the provided date before being able to register\n         */\n        this.requirePlatformMembershipOn = null;\n        /**\n         * The member should have a platform membership on the date of the registration before being able to register\n         */\n        this.requirePlatformMembershipOnRegistrationDate = false;\n        /**\n         * The member should have a valid registration (type = GroupType.Membership) for one of these organization ids\n         *\n         * If empty and requireOrganizationTags empty: new members without registrations can also register\n         */\n        this.requireOrganizationIds = [];\n        /**\n         * The member should have a valid registration (type = GroupType.Membership) for one of these organization tags\n         *\n         * If empty AND requireOrganizationIds empty: new members without registrations can also register\n         */\n        this.requireOrganizationTags = [];\n        /**\n         * Allow other organizations to register members in this group\n         * This would create a payment between the organizations instead, so that often requires invoicing\n         */\n        this.allowRegistrationsByOrganization = false;\n        /**\n         * @deprecated\n         * Require that the member is already registered for one of these groups before allowing to register for this group.\n         * If it is empty, then it is not enforced\n         */\n        this.requirePreviousGroupIds = [];\n        /**\n         * @deprecated\n         */\n        this.preventPreviousGroupIds = [];\n        /**\n         * @deprecated\n         * Information about previous cycles\n         */\n        this.cycleSettings = new Map();\n        this.startDate = new Date();\n        this.endDate = new Date();\n        /**\n         * @deprecated\n         * Dispay start and end date times\n         */\n        this.displayStartEndTime = false;\n    }\n    getUsedStock(group) {\n        const groupStockReservations = group.stockReservations;\n        return StockReservation.getAmount('GroupPrice', null, groupStockReservations);\n    }\n    /**\n     * Can be negative is we are editing items, positive if other items in the cart cause stock changes\n     */\n    getPendingStock(item) {\n        const stock = item.getCartPendingStockReservations(); // this is positive if it will be used\n        return StockReservation.getAmount('Group', item.group.id, stock);\n    }\n    isSoldOut(item) {\n        if (this.maxMembers === null) {\n            return false;\n        }\n        if (item instanceof Group) {\n            return this.getUsedStock(item) >= this.maxMembers;\n        }\n        return this.getUsedStock(item.group) + this.getPendingStock(item) >= this.maxMembers;\n    }\n    getRemainingStock(item) {\n        if (this.maxMembers === null) {\n            return null;\n        }\n        if (item instanceof Group) {\n            return Math.max(0, this.maxMembers - this.getUsedStock(item));\n        }\n        return Math.max(0, this.maxMembers - this.getPendingStock(item) - this.getUsedStock(item.group));\n    }\n    get isFull() {\n        var _a;\n        return this.maxMembers !== null && this.registeredMembers !== null && (this.registeredMembers + ((_a = this.reservedMembers) !== null && _a !== void 0 ? _a : 0)) >= this.maxMembers;\n    }\n    get availableMembers() {\n        var _a;\n        if (this.maxMembers === null) {\n            return null;\n        }\n        if (this.registeredMembers === null) {\n            return null;\n        }\n        return this.maxMembers - this.registeredMembers - ((_a = this.reservedMembers) !== null && _a !== void 0 ? _a : 0);\n    }\n    /**\n     * @deprecated\n     */\n    getGroupPrices(date) {\n        let foundPrice = undefined;\n        // Determine price\n        for (const price of this.oldPrices) {\n            if (!price.startDate || price.startDate <= date) {\n                foundPrice = price;\n            }\n        }\n        return foundPrice;\n    }\n    get maxYear() {\n        if (this.minAge === null) {\n            return null;\n        }\n        return (this.startDate.getFullYear() - this.minAge);\n    }\n    get minYear() {\n        if (this.maxAge === null) {\n            return null;\n        }\n        return (this.startDate.getFullYear() - this.maxAge);\n    }\n    get forAdults() {\n        return ((this.minAge && this.minAge >= 18) || (this.maxAge && this.maxAge > 18));\n    }\n    getAgeGenderDescription({ includeAge = false, includeGender = false } = {}) {\n        let who = '';\n        if (includeAge && this.minYear && this.maxYear) {\n            if (includeGender && this.genderType === GroupGenderType.OnlyMale) {\n                if (this.forAdults) {\n                    who += 'mannen geboren in';\n                }\n                else {\n                    who += 'jongens geboren in';\n                }\n            }\n            else if (includeGender && this.genderType === GroupGenderType.OnlyFemale) {\n                if (this.forAdults) {\n                    who += 'vrouwen geboren in';\n                }\n                else {\n                    who += 'meisjes geboren in';\n                }\n            }\n            else {\n                who += 'geboren in';\n            }\n            who += ' ' + (this.minYear) + ' - ' + (this.maxYear);\n        }\n        else if (includeAge && this.maxYear) {\n            if (includeGender && this.genderType === GroupGenderType.OnlyMale) {\n                if (this.forAdults) {\n                    who += 'mannen geboren in of voor';\n                }\n                else {\n                    who += 'jongens geboren in of voor';\n                }\n            }\n            else if (includeGender && this.genderType === GroupGenderType.OnlyFemale) {\n                if (this.forAdults) {\n                    who += 'vrouwen geboren in of voor';\n                }\n                else {\n                    who += 'meisjes geboren in of voor';\n                }\n            }\n            else {\n                who += 'geboren in of voor';\n            }\n            who += ' ' + (this.maxYear);\n        }\n        else if (includeAge && this.minYear) {\n            if (includeGender && this.genderType === GroupGenderType.OnlyMale) {\n                if (this.forAdults) {\n                    who += 'mannen geboren in of na';\n                }\n                else {\n                    who += 'jongens geboren in of na';\n                }\n            }\n            else if (includeGender && this.genderType === GroupGenderType.OnlyFemale) {\n                if (this.forAdults) {\n                    who += 'vrouwen geboren in of na';\n                }\n                else {\n                    who += 'meisjes geboren in of na';\n                }\n            }\n            else {\n                who += 'geboren in of na';\n            }\n            who += ' ' + (this.minYear);\n        }\n        else if (includeGender) {\n            if (this.genderType === GroupGenderType.OnlyMale) {\n                if (this.forAdults) {\n                    who += 'mannen';\n                }\n                else {\n                    who += 'jongens';\n                }\n            }\n            else if (this.genderType === GroupGenderType.OnlyFemale) {\n                if (this.forAdults) {\n                    who += 'vrouwen';\n                }\n                else {\n                    who += 'meisjes';\n                }\n            }\n        }\n        if (!who) {\n            return null;\n        }\n        return who;\n    }\n    getMemberCount({ waitingList }) {\n        if (waitingList) {\n            return this.waitingListSize;\n        }\n        return this.registeredMembers;\n    }\n    getShortCode(maxLength) {\n        return Formatter.firstLetters(this.name, maxLength);\n    }\n    getFilteredPrices(options) {\n        return this.prices.filter((p) => {\n            if (p.hidden && !(options === null || options === void 0 ? void 0 : options.admin)) {\n                return false;\n            }\n            return true;\n        });\n    }\n    getFilteredOptionMenus(options) {\n        return this.optionMenus.filter((p) => {\n            return p.getFilteredOptions(options).length > 0;\n        });\n    }\n    get isFree() {\n        return !this.prices.find(p => p.price.price > 0) && !this.optionMenus.find(o => o.options.find(p => p.price.price > 0));\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], GroupSettings.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], GroupSettings.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 350, nullable: true })\n], GroupSettings.prototype, \"eventId\", void 0);\n__decorate([\n    field({ decoder: RegistrationPeriodBase, nullable: true, version: 329 })\n], GroupSettings.prototype, \"period\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(GroupPrice), version: 285, upgrade: () => { return []; } }) // Upgrade uses empty array to prevent generating random ids every time\n], GroupSettings.prototype, \"prices\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(GroupOptionMenu), version: 285 })\n], GroupSettings.prototype, \"optionMenus\", void 0);\n__decorate([\n    field({\n        decoder: OrganizationRecordsConfiguration,\n        version: 291,\n        defaultValue: () => OrganizationRecordsConfiguration.create({}),\n    })\n], GroupSettings.prototype, \"recordsConfiguration\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RecordCategory), version: 338 })\n], GroupSettings.prototype, \"recordCategories\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: false, version: 73, upgrade: function () { return this.startDate; } }),\n    field({ decoder: DateDecoder, nullable: true, version: 192, downgrade: function () { var _a; return (_a = this.registrationStartDate) !== null && _a !== void 0 ? _a : this.startDate; } })\n], GroupSettings.prototype, \"registrationStartDate\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: false, version: 73, upgrade: function () { return this.endDate; } }),\n    field({ decoder: DateDecoder, nullable: true, version: 192, downgrade: function () { var _a; return (_a = this.registrationEndDate) !== null && _a !== void 0 ? _a : this.endDate; } })\n], GroupSettings.prototype, \"registrationEndDate\", void 0);\n__decorate([\n    field({ decoder: GroupDefaultEventTime, nullable: true, version: 283 })\n], GroupSettings.prototype, \"defaultEventTime\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(GroupGenderType) })\n], GroupSettings.prototype, \"genderType\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 353 })\n], GroupSettings.prototype, \"trialDays\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, field: 'maxBirthYear' }),\n    field({ decoder: IntegerDecoder, nullable: true, version: 12, upgrade: (year) => {\n            if (year === null) {\n                return null;\n            }\n            return 2020 - year;\n        } })\n], GroupSettings.prototype, \"minAge\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, field: 'minBirthYear' }),\n    field({\n        decoder: IntegerDecoder, nullable: true, version: 12, upgrade: (year) => {\n            if (year === null) {\n                return null;\n            }\n            return 2020 - year;\n        },\n    })\n], GroupSettings.prototype, \"maxAge\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(WaitingListType), version: 16 })\n], GroupSettings.prototype, \"waitingListType\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 16 })\n], GroupSettings.prototype, \"preRegistrationsDate\", void 0);\n__decorate([\n    field({\n        decoder: IntegerDecoder, nullable: true, version: 16,\n    }),\n    field({\n        decoder: IntegerDecoder,\n        nullable: true,\n        version: 74,\n        upgrade: function (old) {\n            // Clear value if waiting list type is none\n            if (this.waitingListType !== WaitingListType.None) {\n                return old;\n            }\n            return null;\n        },\n    })\n], GroupSettings.prototype, \"maxMembers\", void 0);\n__decorate([\n    field({\n        decoder: BooleanDecoder, version: 79,\n    })\n], GroupSettings.prototype, \"waitingListIfFull\", void 0);\n__decorate([\n    field({\n        decoder: IntegerDecoder,\n        nullable: true,\n        version: 77,\n    })\n], GroupSettings.prototype, \"registeredMembers\", void 0);\n__decorate([\n    field({\n        decoder: IntegerDecoder,\n        nullable: true,\n        version: 139,\n    })\n], GroupSettings.prototype, \"reservedMembers\", void 0);\n__decorate([\n    field({\n        decoder: IntegerDecoder,\n        nullable: true,\n        version: 139,\n        optional: true,\n    })\n], GroupSettings.prototype, \"waitingListSize\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 16 })\n], GroupSettings.prototype, \"priorityForFamily\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true, version: 65 })\n], GroupSettings.prototype, \"coverPhoto\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true, version: 66 })\n], GroupSettings.prototype, \"squarePhoto\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(OldGroupPrices), field: 'prices' }),\n    field({ decoder: new ArrayDecoder(OldGroupPrices), field: 'oldPrices', optional: true, version: 284 })\n], GroupSettings.prototype, \"oldPrices\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Image), version: 58, optional: true })\n], GroupSettings.prototype, \"images\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 76, optional: true })\n], GroupSettings.prototype, \"location\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), version: 83 })\n], GroupSettings.prototype, \"requireGroupIds\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), version: 297 })\n], GroupSettings.prototype, \"requireDefaultAgeGroupIds\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 297 })\n], GroupSettings.prototype, \"requirePlatformMembershipOn\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 358 })\n], GroupSettings.prototype, \"requirePlatformMembershipOnRegistrationDate\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), version: 297 })\n], GroupSettings.prototype, \"requireOrganizationIds\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), version: 297 })\n], GroupSettings.prototype, \"requireOrganizationTags\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 303 })\n], GroupSettings.prototype, \"allowRegistrationsByOrganization\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), version: 100, optional: true })\n], GroupSettings.prototype, \"requirePreviousGroupIds\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), version: 102, optional: true })\n], GroupSettings.prototype, \"preventPreviousGroupIds\", void 0);\n__decorate([\n    field({ decoder: new MapDecoder(IntegerDecoder, CycleInformation), version: 193, optional: true })\n], GroupSettings.prototype, \"cycleSettings\", void 0);\n__decorate([\n    field({ decoder: DateDecoder }),\n    field({ decoder: DateDecoder, version: 33, upgrade: (d) => {\n            const d2 = new Date(d);\n            d2.setUTCHours(-2, 0, 0, 0); // brussels time\n            return d2;\n        }, optional: true })\n], GroupSettings.prototype, \"startDate\", void 0);\n__decorate([\n    field({ decoder: DateDecoder }),\n    field({ decoder: DateDecoder, version: 33, upgrade: (d) => {\n            const d2 = new Date(d);\n            d2.setUTCHours(23 - 2, 59, 0, 0); // brussels time\n            return d2;\n        }, optional: true })\n], GroupSettings.prototype, \"endDate\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 78, optional: true })\n], GroupSettings.prototype, \"displayStartEndTime\", void 0);\nexport const GroupSettingsPatch = GroupSettings.patchType();\n//# sourceMappingURL=GroupSettings.js.map","export var Gender;\n(function (Gender) {\n    Gender[\"Male\"] = \"Male\";\n    Gender[\"Female\"] = \"Female\";\n    Gender[\"Other\"] = \"Other\";\n})(Gender || (Gender = {}));\nexport function getGenderName(gender) {\n    switch (gender) {\n        case Gender.Male:\n            return 'Man';\n        case Gender.Female:\n            return 'Vrouw';\n        case Gender.Other:\n            return 'Andere';\n    }\n}\n//# sourceMappingURL=Gender.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, DateDecoder, EnumDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { GroupGenderType } from './GroupGenderType.js';\nimport { GroupPrivateSettings } from './GroupPrivateSettings.js';\nimport { GroupSettings, WaitingListType } from './GroupSettings.js';\nimport { GroupType } from './GroupType.js';\nimport { Gender } from './members/Gender.js';\nimport { PermissionLevel } from './PermissionLevel.js';\nimport { PermissionsResourceType } from './PermissionsResourceType.js';\nimport { StockReservation } from './StockReservation.js';\nexport var GroupStatus;\n(function (GroupStatus) {\n    GroupStatus[\"Open\"] = \"Open\";\n    GroupStatus[\"Closed\"] = \"Closed\";\n    /**\n     * @deprecated\n     */\n    GroupStatus[\"Archived\"] = \"Archived\";\n})(GroupStatus || (GroupStatus = {}));\nexport function getGroupStatusName(status) {\n    switch (status) {\n        case GroupStatus.Open:\n            return 'Geopend';\n        case GroupStatus.Closed:\n            return 'Gesloten';\n        case GroupStatus.Archived:\n            return 'Gearhiveerd';\n    }\n}\nexport class Group extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.type = GroupType.Membership;\n        this.organizationId = '';\n        this.periodId = '';\n        this.defaultAgeGroupId = null;\n        this.waitingList = null;\n        this.stockReservations = [];\n        /**\n         * @deprecated\n         */\n        this.cycle = 0;\n        this.settings = GroupSettings.create({});\n        this.createdAt = new Date();\n        this.deletedAt = null;\n        /**\n         * Only set when you have access to this information\n         */\n        this.privateSettings = null;\n        /**\n         * Manually close a group\n         */\n        this.status = GroupStatus.Open;\n        // Permission checking cache:\n        this.event = null;\n    }\n    getDiffName() {\n        return this.settings.name;\n    }\n    static defaultSort(a, b) {\n        if (a.settings.maxAge && !b.settings.maxAge) {\n            return -1;\n        }\n        if (b.settings.maxAge && !a.settings.maxAge) {\n            return 1;\n        }\n        if (!b.settings.maxAge && !a.settings.maxAge) {\n            // name\n            return Group.nameSort(a, b);\n        }\n        if (a.settings.maxAge > b.settings.maxAge) {\n            return 1;\n        }\n        if (a.settings.maxAge < b.settings.maxAge) {\n            return -1;\n        }\n        return Group.nameSort(a, b);\n    }\n    static nameSort(a, b) {\n        if (a.settings.name.toLowerCase() < b.settings.name.toLowerCase()) {\n            return -1;\n        }\n        if (a.settings.name.toLowerCase() > b.settings.name.toLowerCase()) {\n            return 1;\n        }\n        return 0;\n    }\n    getMemberCount({ waitingList } = {}) {\n        return this.settings.getMemberCount({ waitingList });\n    }\n    /**\n     * Return the pre registration date only if is is active right now\n     */\n    get activePreRegistrationDate() {\n        if (!this.settings.registrationStartDate) {\n            // Registration start date is a requirement for pre registrations\n            return null;\n        }\n        if (this.settings.registrationStartDate < new Date() || this.settings.waitingListType !== WaitingListType.PreRegistrations) {\n            // Start date is in the past: registrations are open\n            return null;\n        }\n        return this.settings.preRegistrationsDate;\n    }\n    /**\n     * Closed now, but will open in the future\n     */\n    get notYetOpen() {\n        if (!this.settings.registrationStartDate) {\n            return false;\n        }\n        const now = new Date();\n        const preRegistrationDate = this.activePreRegistrationDate;\n        if (this.settings.registrationStartDate > now && (!preRegistrationDate || preRegistrationDate > now)) {\n            // Start date or pre registration date are in the future\n            return true;\n        }\n        return false;\n    }\n    /**\n     * No registrations and waiting list registrations are possible if closed\n     */\n    get closed() {\n        if (this.status !== GroupStatus.Open) {\n            return true;\n        }\n        if (this.notYetOpen) {\n            // Start date or pre registration date are in the future\n            return true;\n        }\n        const now = new Date();\n        if (this.settings.registrationEndDate && this.settings.registrationEndDate < now) {\n            return true;\n        }\n        return false;\n    }\n    /**\n     * Returns all parent and grandparents of this group\n     */\n    getParentCategories(all, recursive = true) {\n        const map = new Map();\n        const parents = all.filter(g => g.groupIds.includes(this.id));\n        for (const parent of parents) {\n            map.set(parent.id, parent);\n            if (recursive) {\n                const hisParents = parent.getParentCategories(all);\n                for (const pp of hisParents) {\n                    map.set(pp.id, pp);\n                }\n            }\n        }\n        return [...map.values()];\n    }\n    hasAccess(permissions, allCategories, permissionLevel = PermissionLevel.Read) {\n        if (!permissions) {\n            return false;\n        }\n        if (permissions.hasResourceAccess(PermissionsResourceType.Groups, this.id, permissionLevel)) {\n            return true;\n        }\n        // Check parent categories\n        const parentCategories = this.getParentCategories(allCategories);\n        for (const category of parentCategories) {\n            if (permissions.hasResourceAccess(PermissionsResourceType.GroupCategories, category.id, permissionLevel)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    isPublic(allCategories) {\n        for (const parent of this.getParentCategories(allCategories)) {\n            if (!parent.settings.public) {\n                return false;\n            }\n        }\n        return true;\n    }\n    hasReadAccess(permissions, allCategories) {\n        return this.hasAccess(permissions, allCategories, PermissionLevel.Read);\n    }\n    hasWriteAccess(permissions, allCategories) {\n        return this.hasAccess(permissions, allCategories, PermissionLevel.Write);\n    }\n    hasFullAccess(permissions, allCategories) {\n        return this.hasAccess(permissions, allCategories, PermissionLevel.Full);\n    }\n    get squareImage() {\n        var _a;\n        return (_a = this.settings.squarePhoto) !== null && _a !== void 0 ? _a : this.settings.coverPhoto;\n    }\n    getRecommendedFilter(recommendOrganizationId) {\n        const filter = [];\n        if (this.settings.minAge !== null) {\n            filter.push({\n                age: {\n                    $gt: this.settings.minAge - 1,\n                },\n            });\n        }\n        if (this.settings.maxAge !== null) {\n            filter.push({\n                age: {\n                    $lt: this.settings.maxAge + 1,\n                },\n            });\n        }\n        if (this.settings.genderType === GroupGenderType.OnlyMale) {\n            filter.push({\n                gender: Gender.Male,\n            });\n        }\n        if (this.settings.genderType === GroupGenderType.OnlyFemale) {\n            filter.push({\n                gender: Gender.Male,\n            });\n        }\n        if (this.settings.requireGroupIds.length) {\n            filter.push({\n                registrations: {\n                    $elemMatch: {\n                        groupId: {\n                            $in: this.settings.requireGroupIds,\n                        },\n                    },\n                },\n            });\n        }\n        if (this.settings.requireDefaultAgeGroupIds.length) {\n            filter.push({\n                registrations: {\n                    $elemMatch: {\n                        periodId: this.periodId,\n                        group: {\n                            defaultAgeGroupId: {\n                                $in: this.settings.requireDefaultAgeGroupIds,\n                            },\n                        },\n                    },\n                },\n            });\n        }\n        else {\n            if (this.settings.requirePlatformMembershipOn !== null) {\n                const requirePlatformMembershipOn = this.settings.requirePlatformMembershipOn;\n                filter.push({\n                    platformMemberships: {\n                        $elemMatch: {\n                            startDate: {\n                                $lte: requirePlatformMembershipOn,\n                            },\n                            endDate: {\n                                $gt: requirePlatformMembershipOn,\n                            },\n                        },\n                    },\n                });\n            }\n            if (this.settings.requirePlatformMembershipOnRegistrationDate !== null) {\n                filter.push({\n                    platformMemberships: {\n                        $elemMatch: {\n                            startDate: {\n                                $lte: { $: '$now' },\n                            },\n                            endDate: {\n                                $gt: { $: '$now' },\n                            },\n                        },\n                    },\n                });\n            }\n        }\n        if (recommendOrganizationId && (!this.settings.requireOrganizationIds.length || this.settings.requireOrganizationIds.includes(recommendOrganizationId))) {\n            filter.push({\n                registrations: {\n                    $elemMatch: {\n                        periodId: this.periodId,\n                        organizationId: recommendOrganizationId,\n                    },\n                },\n            });\n        }\n        else if (this.settings.requireOrganizationIds.length) {\n            filter.push({\n                registrations: {\n                    $elemMatch: {\n                        periodId: this.periodId,\n                        organizationId: {\n                            $in: this.settings.requireOrganizationIds,\n                        },\n                    },\n                },\n            });\n        }\n        if (this.settings.requireOrganizationTags.length) {\n            filter.push({\n                registrations: {\n                    $elemMatch: {\n                        periodId: this.periodId,\n                        organization: {\n                            tags: {\n                                $in: this.settings.requireOrganizationTags,\n                            },\n                        },\n                    },\n                },\n            });\n        }\n        return filter;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], Group.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(GroupType), version: 286 })\n], Group.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 250 })\n], Group.prototype, \"organizationId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 265 })\n], Group.prototype, \"periodId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 267 })\n], Group.prototype, \"defaultAgeGroupId\", void 0);\n__decorate([\n    field({ decoder: Group, nullable: true, version: 292 })\n], Group.prototype, \"waitingList\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StockReservation), version: 298 })\n], Group.prototype, \"stockReservations\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], Group.prototype, \"cycle\", void 0);\n__decorate([\n    field({ decoder: GroupSettings })\n], Group.prototype, \"settings\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, version: 187 })\n], Group.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 187 })\n], Group.prototype, \"deletedAt\", void 0);\n__decorate([\n    field({ decoder: GroupPrivateSettings, nullable: true, version: 10 })\n], Group.prototype, \"privateSettings\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(GroupStatus), version: 192 })\n], Group.prototype, \"status\", void 0);\n//# sourceMappingURL=Group.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, EmailDecoder, field, RecordDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { Formatter } from '@stamhoofd/utility';\nimport { v4 as uuidv4 } from 'uuid';\nexport class EmailInformation extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.markedAsSpam = false;\n        this.hardBounce = false;\n        this.unsubscribedMarketing = false;\n        this.unsubscribedAll = false;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], EmailInformation.prototype, \"email\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], EmailInformation.prototype, \"markedAsSpam\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], EmailInformation.prototype, \"hardBounce\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], EmailInformation.prototype, \"unsubscribedMarketing\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], EmailInformation.prototype, \"unsubscribedAll\", void 0);\nexport class Replacement extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.value = '';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], Replacement.prototype, \"token\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Replacement.prototype, \"value\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], Replacement.prototype, \"html\", void 0);\nexport class Recipient extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.firstName = null;\n        this.lastName = null;\n        this.replacements = [];\n        this.headers = null;\n        /**\n         * Set this to create a replacement called signInUrl, which will auto sign in/sign up the user\n         * Note: the e-mail is matched with the user id, if it doesn't match, the sign-in button will contain a simple (non smart) url\n         */\n        this.userId = null;\n        /// For reference and filtering\n        /**\n         * @deprecated\n         * Use types instead\n         */\n        this.type = null;\n        /// For reference and filtering\n        this.types = [];\n    }\n    getDefaultReplacements() {\n        var _a, _b;\n        return [\n            Replacement.create({\n                token: 'firstName',\n                value: (_a = this.firstName) !== null && _a !== void 0 ? _a : '',\n            }),\n            Replacement.create({\n                token: 'lastName',\n                value: (_b = this.lastName) !== null && _b !== void 0 ? _b : '',\n            }),\n            Replacement.create({\n                token: 'email',\n                value: this.email,\n            }),\n            Replacement.create({\n                token: 'greeting',\n                value: this.firstName ? `Dag ${this.firstName},` : 'Hallo!',\n            }),\n        ];\n    }\n    merge(recipient) {\n        var _a;\n        this.firstName = this.firstName !== null && this.firstName.length > 0 ? this.firstName : recipient.firstName;\n        this.lastName = this.lastName !== null && this.lastName.length > 0 ? this.lastName : recipient.lastName;\n        for (const replacement of recipient.replacements) {\n            const existing = this.replacements.find(r => r.token == replacement.token);\n            if (!existing) {\n                this.replacements.push(replacement);\n            }\n            else {\n                if (existing.value.length == 0) {\n                    existing.value = replacement.value;\n                }\n            }\n        }\n        this.userId = (_a = this.userId) !== null && _a !== void 0 ? _a : recipient.userId;\n        this.types = Formatter.uniqueArray(this.types.concat(recipient.types));\n    }\n    /**\n     * Remove duplicate replacements, keeping the last added replacements\n     */\n    removeDuplicates() {\n        const replacements = [];\n        for (const replacement of this.replacements.slice().reverse()) {\n            if (!replacements.find(r => r.token === replacement.token)) {\n                replacements.unshift(replacement);\n            }\n        }\n        this.replacements = replacements;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], Recipient.prototype, \"firstName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 112 })\n], Recipient.prototype, \"lastName\", void 0);\n__decorate([\n    field({ decoder: EmailDecoder })\n], Recipient.prototype, \"email\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Replacement) })\n], Recipient.prototype, \"replacements\", void 0);\n__decorate([\n    field({ decoder: new RecordDecoder(StringDecoder, StringDecoder), version: 209, nullable: true })\n], Recipient.prototype, \"headers\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 80 })\n], Recipient.prototype, \"userId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 96 })\n], Recipient.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), optional: true })\n], Recipient.prototype, \"types\", void 0);\nexport class EmailAttachment extends AutoEncoder {\n    get bytes() {\n        // Calculates bytes of base64 string\n        return Math.ceil((this.content.length / 4) * 3) - (this.content.endsWith('==') ? 2 : this.content.endsWith('=') ? 1 : 0);\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], EmailAttachment.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EmailAttachment.prototype, \"filename\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EmailAttachment.prototype, \"contentType\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EmailAttachment.prototype, \"content\", void 0);\nexport class EmailRequest extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.text = null;\n        this.html = null;\n        this.attachments = [];\n        this.defaultReplacements = [];\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], EmailRequest.prototype, \"emailId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EmailRequest.prototype, \"subject\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Recipient) })\n], EmailRequest.prototype, \"recipients\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], EmailRequest.prototype, \"text\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], EmailRequest.prototype, \"html\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(EmailAttachment), version: 11 })\n], EmailRequest.prototype, \"attachments\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Replacement), version: 220 })\n], EmailRequest.prototype, \"defaultReplacements\", void 0);\n//# sourceMappingURL=EmailRequest.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, DateDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { RecordCategory } from './members/records/RecordCategory.js';\nexport class EventNotificationDeadline extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Events within this start and end date will need to be accepted before the deadline.\n         */\n        this.startDate = new Date();\n        this.endDate = new Date();\n        this.deadline = new Date();\n        /**\n         * If set, will automatically add a 'quick' action in the 'Start' tab of the dashboard.\n         * e.g. \"Dien je kampmeldingen voor paaskampen ten laatse in voor 1 maart\"\n         */\n        this.reminderText = null;\n        this.reminderTitle = null;\n        /**\n         * Show reminder from this date until the deadline.\n         */\n        this.reminderFrom = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, optional: true, defaultValue: () => uuidv4() })\n], EventNotificationDeadline.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], EventNotificationDeadline.prototype, \"startDate\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], EventNotificationDeadline.prototype, \"endDate\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], EventNotificationDeadline.prototype, \"deadline\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], EventNotificationDeadline.prototype, \"reminderText\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 367 })\n], EventNotificationDeadline.prototype, \"reminderTitle\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], EventNotificationDeadline.prototype, \"reminderFrom\", void 0);\nexport class EventNotificationType extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.eventTypeIds = [];\n        /**\n         * Title of this notification. E.g. \"Kampmelding\"\n         */\n        this.title = '';\n        /**\n         * Explanation about what this is.\n         */\n        this.description = '';\n        /**\n         * Button text to fill in this form. E.g. \"Kampmelding indienen\"\n         */\n        this.buttonTitle = '';\n        /**\n         * Descriptive text below the button to fill in the form. E.g. \"Het indienen van een kampmelding is verplicht voor kampen.\"\n         */\n        this.buttonDescription = '';\n        /**\n         * List of deadlines\n         */\n        this.deadlines = [];\n        /**\n         * Questions to anwer. You can create multiple record categories to simulate multiple steps in the process.\n         *\n         * These are optional and can be an empty array.\n         */\n        this.recordCategories = [];\n        /**\n         * Who will receive email notifications apart from submitter and creator.\n         */\n        this.contactResponsibilityIds = [];\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, optional: true, defaultValue: () => uuidv4() })\n], EventNotificationType.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder) })\n], EventNotificationType.prototype, \"eventTypeIds\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EventNotificationType.prototype, \"title\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EventNotificationType.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EventNotificationType.prototype, \"buttonTitle\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EventNotificationType.prototype, \"buttonDescription\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(EventNotificationDeadline) })\n], EventNotificationType.prototype, \"deadlines\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RecordCategory) })\n], EventNotificationType.prototype, \"recordCategories\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), version: 365 })\n], EventNotificationType.prototype, \"contactResponsibilityIds\", void 0);\n//# sourceMappingURL=EventNotificationType.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';\n// Note: this should extend LoginProviderType\nexport var LoginMethod;\n(function (LoginMethod) {\n    LoginMethod[\"Password\"] = \"Password\";\n    LoginMethod[\"SSO\"] = \"SSO\";\n    LoginMethod[\"Google\"] = \"Google\";\n})(LoginMethod || (LoginMethod = {}));\n/**\n * This config is public and should not contain any secrets. Use OpenIDClientConfiguration for private data\n */\nexport class LoginMethodConfig extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Full name of this login method. e.g. 'Sign in with Google'\n         */\n        this.loginButtonText = null;\n        /**\n         * Full name of this login method. e.g. 'Sign in with Google'\n         */\n        this.fullName = null;\n        /**\n         * Full name of this login method. e.g. 'Google'\n         */\n        this.shortName = null;\n        /**\n         * Limit this method to email addresses ending on these domains.\n         * When this is empty, all domains are allowed.\n        */\n        this.allowlist = [];\n        /**\n         * Disallow this method for email addresses ending on these domains\n         */\n        this.blocklist = [];\n    }\n    isEnabledForEmail(email) {\n        // Validate that the user is allowed to use this method\n        const emailDomain = email.split('@')[1].toLowerCase();\n        if (!emailDomain) {\n            return false;\n        }\n        for (const blocked of this.blocklist) {\n            if (emailDomain === blocked.toLowerCase()) {\n                return false;\n            }\n        }\n        if (this.allowlist.length > 0) {\n            for (const allowed of this.allowlist) {\n                if (emailDomain === allowed.toLowerCase()) {\n                    return true;\n                }\n            }\n            return false;\n        }\n        return true;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], LoginMethodConfig.prototype, \"loginButtonText\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], LoginMethodConfig.prototype, \"fullName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], LoginMethodConfig.prototype, \"shortName\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder) })\n], LoginMethodConfig.prototype, \"allowlist\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder) })\n], LoginMethodConfig.prototype, \"blocklist\", void 0);\n//# sourceMappingURL=LoginMethod.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, EnumDecoder, IntegerDecoder, StringDecoder, field } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { PermissionRoleForResponsibility } from './PermissionRole.js';\nimport { ResourcePermissions } from './ResourcePermissions.js';\nimport { PermissionLevel } from './PermissionLevel.js';\nimport { PermissionsResourceType } from './PermissionsResourceType.js';\nexport class MemberResponsibility extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.description = '';\n        this.minimumMembers = null;\n        this.maximumMembers = null;\n        /**\n         * Whether this is a national responsibility or not\n         */\n        this.organizationBased = true;\n        /**\n         * Limit this responsibility to specific organizations\n         */\n        this.organizationTagIds = null;\n        /**\n         * Whether this responsibility should be assigned to a specific group (or more) of a specific organization\n         */\n        this.defaultAgeGroupIds = null;\n        /**\n         * Automatically grant the following permissions\n         */\n        this.permissions = null;\n        /**\n         * Automatically grant limited permissions to the group associated with this responsibility\n         */\n        this.groupPermissionLevel = PermissionLevel.None;\n    }\n    get isGroupBased() {\n        return this.defaultAgeGroupIds !== null;\n    }\n    createDefaultPermissions(group) {\n        var _a;\n        return PermissionRoleForResponsibility.create({\n            name: this.name + (group ? ` van ${group.settings.name}` : ''),\n            responsibilityId: this.id,\n            responsibilityGroupId: (_a = group === null || group === void 0 ? void 0 : group.id) !== null && _a !== void 0 ? _a : null,\n        });\n    }\n    getPermissions(groupId) {\n        var _a, _b;\n        const r = (_b = (_a = this.permissions) === null || _a === void 0 ? void 0 : _a.clone()) !== null && _b !== void 0 ? _b : PermissionRoleForResponsibility.create({\n            id: this.id,\n            name: this.name,\n            level: PermissionLevel.None,\n            responsibilityId: this.id,\n            responsibilityGroupId: groupId,\n            resources: new Map(),\n        });\n        r.name = this.name;\n        r.id = this.id + (groupId ? '-' + groupId : '');\n        r.responsibilityId = this.id;\n        r.responsibilityGroupId = groupId;\n        if (groupId && this.groupPermissionLevel !== PermissionLevel.None) {\n            const map = new Map();\n            map.set(groupId, ResourcePermissions.create({ level: this.groupPermissionLevel }));\n            r.resources.set(PermissionsResourceType.Groups, map);\n        }\n        return r;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], MemberResponsibility.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], MemberResponsibility.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], MemberResponsibility.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], MemberResponsibility.prototype, \"minimumMembers\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], MemberResponsibility.prototype, \"maximumMembers\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, optional: true })\n], MemberResponsibility.prototype, \"organizationBased\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), nullable: true, version: 273 })\n], MemberResponsibility.prototype, \"organizationTagIds\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), nullable: true, version: 273 })\n], MemberResponsibility.prototype, \"defaultAgeGroupIds\", void 0);\n__decorate([\n    field({ decoder: PermissionRoleForResponsibility, nullable: true, version: 279 })\n], MemberResponsibility.prototype, \"permissions\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(PermissionLevel), version: 279 })\n], MemberResponsibility.prototype, \"groupPermissionLevel\", void 0);\nexport class PlatformResponsibility extends MemberResponsibility {\n}\n//# sourceMappingURL=MemberResponsibility.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, BooleanDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nexport class OrganizationEmail extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Name of this person / group\n         */\n        this.name = null;\n        /**\n         * Whether this e-mail might get used as a global default one when we could not find a different one\n         */\n        this.default = false;\n        /**\n         * Only usable by users with full permissions\n         */\n        this.restricted = false;\n    }\n    getDiffName() {\n        if (this.name) {\n            return this.name + ' <' + this.email + '>';\n        }\n        return this.email;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], OrganizationEmail.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], OrganizationEmail.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], OrganizationEmail.prototype, \"email\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], OrganizationEmail.prototype, \"default\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], OrganizationEmail.prototype, \"restricted\", void 0);\n//# sourceMappingURL=OrganizationEmail.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, field } from '@simonbackx/simple-encoding';\nimport { RecordCategory } from './members/records/RecordCategory.js';\nexport class OrganizationLevelRecordsConfiguration extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.recordCategories = [];\n    }\n    getEnabledCategories(organization) {\n        return this.recordCategories.filter(category => category.isEnabled(organization));\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(RecordCategory) })\n], OrganizationLevelRecordsConfiguration.prototype, \"recordCategories\", void 0);\n//# sourceMappingURL=OrganizationLevelRecordsConfiguration.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { AccessRight } from './AccessRight.js';\nimport { Group } from './Group.js';\nimport { PermissionRole } from './PermissionRole.js';\nimport { PermissionsByRole } from './PermissionsByRole.js';\nimport { PermissionsResourceType } from './PermissionsResourceType.js';\n/**\n * Give access to a given resouce based by the roles of a user\n */\nexport class GroupCategoryPermissions extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * @deprecated\n         * Can create new groups in this category or subcategories\n         */\n        this.create = [];\n        /**\n         * @deprecated\n         * Permissions automatically for all groups in this category\n         */\n        this.groupPermissions = PermissionsByRole.create({});\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(PermissionRole) })\n], GroupCategoryPermissions.prototype, \"create\", void 0);\n__decorate([\n    field({ decoder: PermissionsByRole, version: 203, optional: true })\n], GroupCategoryPermissions.prototype, \"groupPermissions\", void 0);\nexport class GroupCategorySettings extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        /**\n         * Small text below the category title\n         */\n        this.description = '';\n        this.public = true;\n        this.maximumRegistrations = null;\n        /**\n         * @deprecated\n         */\n        this.permissions = GroupCategoryPermissions.create({});\n        /**\n         * Whether the category can be deleted / moved by non admins.\n         */\n        this.locked = false;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], GroupCategorySettings.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], GroupCategorySettings.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], GroupCategorySettings.prototype, \"public\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 59 })\n], GroupCategorySettings.prototype, \"maximumRegistrations\", void 0);\n__decorate([\n    field({ decoder: GroupCategoryPermissions, version: 61 })\n], GroupCategorySettings.prototype, \"permissions\", void 0);\n__decorate([\n    field({\n        decoder: BooleanDecoder, version: 330,\n    })\n], GroupCategorySettings.prototype, \"locked\", void 0);\nexport class GroupCategory extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.settings = GroupCategorySettings.create({});\n        /**\n         * We only save the ID of groups because these are stored separately. To prevent that a group will be deleted when we simply move the group to a different category\n         */\n        this.groupIds = [];\n        /**\n         * Child category IDS\n         * We use ID's to allow more flexible changes in the future\n         */\n        this.categoryIds = [];\n    }\n    /**\n     * Returns all parent and grandparents of this group\n     */\n    getParentCategories(all) {\n        const map = new Map();\n        // Avoid recursive loop: can never call getParentCategories on itself again\n        const filteredAll = all.filter(g => g.id !== this.id);\n        const parents = filteredAll.filter(g => g.categoryIds.includes(this.id));\n        for (const parent of parents) {\n            map.set(parent.id, parent);\n            const hisParents = parent.getParentCategories(filteredAll);\n            for (const pp of hisParents) {\n                map.set(pp.id, pp);\n            }\n        }\n        return [...map.values()];\n    }\n    isPublic(allCategories) {\n        if (!this.settings.public) {\n            return false;\n        }\n        for (const parent of this.getParentCategories(allCategories)) {\n            if (!parent.settings.public) {\n                return false;\n            }\n        }\n        return true;\n    }\n    canEdit(permissions) {\n        if (permissions === null || permissions === void 0 ? void 0 : permissions.hasFullAccess()) {\n            return true;\n        }\n        return false;\n    }\n    canCreate(permissions, categories = []) {\n        if (!permissions) {\n            return false;\n        }\n        if (permissions.hasResourceAccessRight(PermissionsResourceType.GroupCategories, this.id, AccessRight.OrganizationCreateGroups)) {\n            return true;\n        }\n        const parents = this.getParentCategories(categories);\n        for (const parent of parents) {\n            if (permissions.hasResourceAccessRight(PermissionsResourceType.GroupCategories, parent.id, AccessRight.OrganizationCreateGroups)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    getDiffName() {\n        return this.settings.name;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], GroupCategory.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: GroupCategorySettings })\n], GroupCategory.prototype, \"settings\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder) })\n], GroupCategory.prototype, \"groupIds\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder) })\n], GroupCategory.prototype, \"categoryIds\", void 0);\nexport class GroupCategoryTree extends GroupCategory {\n    constructor() {\n        super(...arguments);\n        this.groups = [];\n        this.categories = [];\n    }\n    get depth() {\n        if (this.groups.length > 0) {\n            return 0;\n        }\n        if (this.categories.length == 0) {\n            return 0;\n        }\n        return Math.max(...this.categories.map(c => c.depth)) + 1;\n    }\n    getAllGroups() {\n        return [...this.groups, ...this.categories.flatMap(c => c.getAllGroups())];\n    }\n    getAllCategories() {\n        return [...this.categories, ...this.categories.flatMap(c => c.getAllCategories())];\n    }\n    getMemberCount({ waitingList } = {}) {\n        if (this.getAllGroups().length == 0) {\n            return null;\n        }\n        let count = 0;\n        for (const group of this.getAllGroups()) {\n            const c = group.getMemberCount({ waitingList });\n            if (c === null) {\n                return null;\n            }\n            count += c;\n        }\n        return count;\n    }\n    static build(root, organizationPeriod, options = {}) {\n        var _a, _b, _c, _d;\n        const categories = organizationPeriod.settings.categories;\n        const groups = (_a = options === null || options === void 0 ? void 0 : options.groups) !== null && _a !== void 0 ? _a : organizationPeriod.groups;\n        const permissions = (_b = options.permissions) !== null && _b !== void 0 ? _b : null;\n        const maxDepth = (_c = options.maxDepth) !== null && _c !== void 0 ? _c : null;\n        const smartCombine = (_d = options.smartCombine) !== null && _d !== void 0 ? _d : false;\n        return GroupCategoryTree.create({\n            ...root,\n            categories: root.categoryIds.flatMap((id) => {\n                const f = categories.find(c => c.id === id);\n                if (f) {\n                    const t = GroupCategoryTree.build(f, organizationPeriod, {\n                        ...options,\n                        maxDepth: maxDepth !== null ? maxDepth - 1 : null,\n                    });\n                    if (t.categories.length == 0 && t.groups.length == 0 && (smartCombine || (permissions !== null && !permissions.hasResourceAccessRight(PermissionsResourceType.GroupCategories, t.id, AccessRight.OrganizationCreateGroups)))) {\n                        // Hide empty categories where we cannot create new groups or when smart combine is enabled\n                        return [];\n                    }\n                    // if (smartCombine && !t.categories.find(c => c.categories.length || c.groups.length > 1)) {\n                    //     // If all categories only have groups and no more than 1 group, combine them all\n                    //     t.groups = t.getAllGroups()\n                    //     t.categories = []\n                    // }\n                    if (maxDepth !== null && t.depth >= maxDepth && t.categories.length > 0) {\n                        const categories = [];\n                        for (const cat of t.categories) {\n                            if (smartCombine && cat.groups.length === 0 && cat.categories.length === 0) {\n                                continue;\n                            }\n                            // Clone reference\n                            cat.settings = GroupCategorySettings.create(cat.settings);\n                            cat.settings.name = t.settings.name + ' - ' + cat.settings.name;\n                            cat.settings.public = t.settings.public && cat.settings.public;\n                            categories.push(cat);\n                        }\n                        // Concat here\n                        return categories;\n                    }\n                    return [t];\n                }\n                return [];\n            }),\n            groups: root.groupIds.flatMap((id) => {\n                const g = groups.find(c => c.id === id);\n                if (g) {\n                    // Hide groups we don't have permissions for\n                    if (permissions && (!g.hasReadAccess(permissions, categories))) {\n                        return [];\n                    }\n                    return [g];\n                }\n                return [];\n            }),\n        });\n    }\n    /**\n     * Filter groups\n     */\n    filter(keep) {\n        const categories = this.categories.flatMap((category) => {\n            const filtered = category.filter(keep);\n            if (filtered.groups.length == 0 && filtered.categories.length == 0) {\n                return [];\n            }\n            return [filtered];\n        });\n        const groups = this.groups.filter(keep);\n        return GroupCategoryTree.create(Object.assign({}, this, {\n            categories,\n            groups,\n        }));\n    }\n    /**\n     * Remove empty categories and non-public categories\n     * @param admin Whether not-public categories should be visible\n     */\n    filterForDisplay(admin = false, useActivities = true, smartCombine = false) {\n        const categories = this.categories.flatMap((category) => {\n            if (!admin && !category.settings.public) {\n                return [];\n            }\n            const filtered = category.filterForDisplay(admin, useActivities);\n            if (smartCombine && filtered.groups.length == 0 && filtered.categories.length == 0) {\n                return [];\n            }\n            return [filtered];\n        });\n        return GroupCategoryTree.create(Object.assign({}, this, {\n            categories: (useActivities || categories.length == 0) ? categories : [categories[0]],\n        }));\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(Group) })\n], GroupCategoryTree.prototype, \"groups\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(GroupCategoryTree) })\n], GroupCategoryTree.prototype, \"categories\", void 0);\n//# sourceMappingURL=GroupCategory.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, DateDecoder, StringDecoder, field } from '@simonbackx/simple-encoding';\nexport class SetupStepReview extends AutoEncoder {\n    getDiffValue() {\n        return this.userName;\n    }\n}\n__decorate([\n    field({ decoder: DateDecoder })\n], SetupStepReview.prototype, \"date\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], SetupStepReview.prototype, \"userName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], SetupStepReview.prototype, \"userId\", void 0);\n//# sourceMappingURL=SetupStepReview.js.map","export var SetupStepType;\n(function (SetupStepType) {\n    SetupStepType[\"Responsibilities\"] = \"Functions\";\n    SetupStepType[\"Companies\"] = \"Companies\";\n    SetupStepType[\"Groups\"] = \"Groups\";\n    SetupStepType[\"Premises\"] = \"Premises\";\n    SetupStepType[\"Emails\"] = \"Emails\";\n    SetupStepType[\"Payment\"] = \"Payment\";\n    SetupStepType[\"Registrations\"] = \"Registrations\";\n})(SetupStepType || (SetupStepType = {}));\nexport function getSetupStepName(step) {\n    switch (step) {\n        case SetupStepType.Responsibilities:\n            return 'functies';\n        case SetupStepType.Companies:\n            return 'facturatiegegevens';\n        case SetupStepType.Groups:\n            return 'leeftijdsgroepen';\n        case SetupStepType.Premises:\n            return 'lokalen';\n        case SetupStepType.Emails:\n            return 'e-mailadressen';\n        case SetupStepType.Payment:\n            return 'betaalinstellingen';\n        case SetupStepType.Registrations:\n            return 'inschrijvingen';\n    }\n}\n//# sourceMappingURL=SetupStepType.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, DateDecoder, EnumDecoder, MapDecoder, NumberDecoder, field } from '@simonbackx/simple-encoding';\nimport { Formatter } from '@stamhoofd/utility';\nimport { SetupStepReview } from './SetupStepReview.js';\nimport { SetupStepType } from './SetupStepType.js';\nexport const minimumRegistrationCount = 1;\nexport class SetupStep extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * @deprecated\n         * Removed\n         */\n        this.__reviewedAt = null;\n        /**\n         * When the item was marked as reviewed.\n         */\n        this.review = null;\n        /**\n         * When the finished and total steps last have been updated.\n         */\n        this.updatedAt = new Date();\n        this.finishedSteps = 0;\n        this.totalSteps = 1;\n    }\n    transformForDiff() {\n        if (this.isDone) {\n            if (this.review) {\n                return 'Voltooid en nagekeken op ' + Formatter.dateNumber(this.review.date);\n            }\n            return 'Voltooid';\n        }\n        return this.finishedSteps + '/' + this.totalSteps;\n    }\n    get isDone() {\n        return this.finishedSteps >= this.totalSteps;\n    }\n    get isReviewed() {\n        return this.review !== null;\n    }\n    get isComplete() {\n        return this.isDone && this.isReviewed;\n    }\n    get progress() {\n        if (!this.totalSteps)\n            return 1;\n        return this.finishedSteps / this.totalSteps;\n    }\n    get priority() {\n        const isDone = this.isDone;\n        const isReviewed = this.isReviewed;\n        if (isDone && isReviewed) {\n            return 0;\n        }\n        if (isDone && !isReviewed) {\n            return 1;\n        }\n        if (!isDone && isReviewed) {\n            return 2;\n        }\n        return 3;\n    }\n    markReviewed({ userId, userName }) {\n        const now = new Date();\n        if (this.review === null) {\n            this.review = SetupStepReview.create({\n                date: now,\n                userName,\n                userId,\n            });\n        }\n    }\n    resetReviewed() {\n        this.review = null;\n    }\n    update(finishedSteps, totalSteps) {\n        if (finishedSteps === this.finishedSteps && totalSteps === this.totalSteps) {\n            return;\n        }\n        const now = new Date();\n        if (totalSteps === 0) {\n            finishedSteps = 1;\n            totalSteps = 1;\n        }\n        this.finishedSteps = finishedSteps;\n        this.totalSteps = totalSteps;\n        this.updatedAt = now;\n        if (this.finishedSteps < this.totalSteps && this.review) {\n            this.resetReviewed();\n        }\n    }\n}\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, field: 'reviewedAt', optional: true })\n], SetupStep.prototype, \"__reviewedAt\", void 0);\n__decorate([\n    field({ decoder: SetupStepReview, nullable: true, version: 326 })\n], SetupStep.prototype, \"review\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], SetupStep.prototype, \"updatedAt\", void 0);\n__decorate([\n    field({ decoder: NumberDecoder })\n], SetupStep.prototype, \"finishedSteps\", void 0);\n__decorate([\n    field({ decoder: NumberDecoder })\n], SetupStep.prototype, \"totalSteps\", void 0);\nexport class SetupSteps extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.steps = new Map();\n    }\n    get(type) {\n        return this.steps.get(type);\n    }\n    getAll() {\n        const result = [];\n        for (const value of Object.values(SetupStepType)) {\n            const step = this.steps.get(value);\n            if (step) {\n                result.push({ type: value, step });\n            }\n        }\n        return result;\n    }\n    isEmpty() {\n        return this.steps.size === 0;\n    }\n    areAllComplete() {\n        return Array.from(this.steps.values()).every(s => s.isComplete);\n    }\n    getStepsToDoOverview() {\n        const result = [];\n        for (const value of Object.values(SetupStepType)) {\n            const step = this.steps.get(value);\n            if (step) {\n                // filter out steps that are done and reviewed\n                if (step.isDone && step.isReviewed) {\n                    continue;\n                }\n                result.push({ type: value, step });\n            }\n        }\n        return result;\n    }\n    getProgress() {\n        const total = this.steps.size;\n        const completed = Array.from(this.steps.values()).filter(s => s.isComplete).length;\n        return { completed, total };\n    }\n    markReviewed(stepType, by) {\n        const step = this.steps.get(stepType);\n        if (step) {\n            step.markReviewed(by);\n        }\n    }\n    resetReviewed(stepType) {\n        const step = this.steps.get(stepType);\n        if (step) {\n            step.resetReviewed();\n        }\n    }\n    update(stepType, { finishedSteps, totalSteps }) {\n        const step = this.steps.get(stepType);\n        if (step) {\n            step.update(finishedSteps, totalSteps);\n        }\n        else {\n            if (totalSteps === 0) {\n                this.steps.set(stepType, SetupStep.create({ finishedSteps: 1, totalSteps: 1 }));\n            }\n            else {\n                this.steps.set(stepType, SetupStep.create({ finishedSteps, totalSteps }));\n            }\n        }\n    }\n    remove(stepType) {\n        return this.steps.delete(stepType);\n    }\n}\n__decorate([\n    field({ decoder: new MapDecoder(new EnumDecoder(SetupStepType), SetupStep), version: 324 })\n], SetupSteps.prototype, \"steps\", void 0);\n//# sourceMappingURL=SetupSteps.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, StringDecoder, field } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Group, GroupStatus } from './Group.js';\nimport { GroupCategory, GroupCategorySettings, GroupCategoryTree } from './GroupCategory.js';\nimport { GroupType } from './GroupType.js';\nimport { RegistrationPeriodBase } from './RegistrationPeriodBase.js';\nimport { SetupSteps } from './SetupSteps.js';\nexport class RegistrationPeriodSettings extends AutoEncoder {\n}\nexport class RegistrationPeriod extends RegistrationPeriodBase {\n    constructor() {\n        super(...arguments);\n        this.settings = RegistrationPeriodSettings.create({});\n    }\n}\n__decorate([\n    field({ decoder: RegistrationPeriodSettings })\n], RegistrationPeriod.prototype, \"settings\", void 0);\nexport class OrganizationRegistrationPeriodSettings extends AutoEncoder {\n    constructor() {\n        var _a, _b;\n        super(...arguments);\n        /**\n         * All the available categories\n         */\n        this.categories = [GroupCategory.create({ id: 'root' })]; // we use ID root here because this ID needs to stay the same since it won't be saved\n        /**\n         * We use one invisible root category to simplify the difference between non-root and root category\n         */\n        this.rootCategoryId = (_b = (_a = this.categories[0]) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : '';\n    }\n    get rootCategory() {\n        return this.categories.find(c => c.id === this.rootCategoryId);\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(GroupCategory) })\n], OrganizationRegistrationPeriodSettings.prototype, \"categories\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], OrganizationRegistrationPeriodSettings.prototype, \"rootCategoryId\", void 0);\nexport class OrganizationRegistrationPeriod extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.settings = OrganizationRegistrationPeriodSettings.create({});\n        this.groups = [];\n        this.setupSteps = SetupSteps.create({});\n    }\n    getDiffName() {\n        return this.period.name;\n    }\n    getDiffValue() {\n        return this.period.name;\n    }\n    /**\n     * Get all groups that are in a category\n     */\n    get availableCategories() {\n        return this.adminCategoryTree.getAllCategories();\n    }\n    /**\n     * (todo) Contains the fully build hierarchy without the need for ID lookups. Try not to use this tree when modifying it.\n     */\n    get categoryTree() {\n        return this.getCategoryTree();\n    }\n    get publicCategoryTree() {\n        return this.getCategoryTree({ smartCombine: true });\n    }\n    get adminCategoryTree() {\n        return this.getCategoryTree({ admin: true });\n    }\n    get waitingLists() {\n        return this.groups.filter(g => g.type === GroupType.WaitingList);\n    }\n    get rootCategory() {\n        return this.settings.categories.find(c => c.id === this.settings.rootCategoryId);\n    }\n    /**\n     * Contains the fully build hierarchy without the need for ID lookups. Try not to use this tree when modifying it.\n     *\n     * For registration members perspective, try to use options.admin instead of options.permissions.\n     * options.permissions is only used if you want to hide groups and empty categories that you don't have permissions for.\n     */\n    getCategoryTree(options) {\n        var _a, _b, _c;\n        const root = this.rootCategory;\n        if (root) {\n            let tree = GroupCategoryTree.build(root, this, {\n                groups: (options === null || options === void 0 ? void 0 : options.filterGroups) ? this.groups.filter(options.filterGroups) : undefined,\n                permissions: options === null || options === void 0 ? void 0 : options.permissions,\n                maxDepth: options === null || options === void 0 ? void 0 : options.maxDepth,\n                smartCombine: options === null || options === void 0 ? void 0 : options.smartCombine,\n            });\n            if (!(options === null || options === void 0 ? void 0 : options.permissions)) {\n                // Hide non public items\n                tree = tree.filterForDisplay((_a = options === null || options === void 0 ? void 0 : options.admin) !== null && _a !== void 0 ? _a : false, ((_c = (_b = options === null || options === void 0 ? void 0 : options.organization) === null || _b === void 0 ? void 0 : _b.meta.packages.useActivities) !== null && _c !== void 0 ? _c : true) || (options === null || options === void 0 ? void 0 : options.admin), options === null || options === void 0 ? void 0 : options.smartCombine);\n            }\n            if (tree.categories.length == 0 && tree.groups.length > 0) {\n                tree.settings.name = 'Inschrijvingsgroepen';\n                return GroupCategoryTree.create({\n                    settings: GroupCategorySettings.create({\n                        name: '',\n                    }),\n                    categories: [tree],\n                });\n            }\n            const usedGroups = tree.getAllGroups();\n            const unusedGroups = this.groups.filter(g => !usedGroups.includes(g));\n            if (unusedGroups.length > 0) {\n                console.warn('Unused groups found in category tree');\n            }\n            return tree;\n        }\n        // Broken setup here\n        console.warn('Root category ID is missing in categories. Migration might be needed');\n        return GroupCategoryTree.create({});\n    }\n    isCategoryDeactivated(organization, category) {\n        if (organization.meta.packages.useActivities) {\n            return false;\n        }\n        const cleanedTree = this.getCategoryTree({ maxDepth: 1 });\n        if (cleanedTree.categories.find(c => c.id === category.id)) {\n            return false;\n        }\n        return true;\n    }\n    duplicate(newPeriod) {\n        // Create new groups + map old to new groups\n        const groupMap = new Map();\n        const categoryMap = new Map();\n        const newOrganizationPeriod = OrganizationRegistrationPeriod.create({\n            period: newPeriod,\n        });\n        const yearDifference = newPeriod.startDate.getFullYear() - this.period.startDate.getFullYear();\n        for (const group of this.groups) {\n            const newGroup = Group.create({\n                ...group,\n                id: undefined,\n                periodId: newPeriod.id,\n                settings: group.settings.clone(),\n            });\n            // Increase all dates with exactly one year\n            if (newGroup.settings.registrationStartDate) {\n                newGroup.settings.registrationStartDate.setFullYear(newGroup.settings.registrationStartDate.getFullYear() + yearDifference);\n            }\n            if (newGroup.settings.registrationEndDate) {\n                newGroup.settings.registrationEndDate.setFullYear(newGroup.settings.registrationEndDate.getFullYear() + yearDifference);\n            }\n            // Force close\n            newGroup.status = GroupStatus.Closed;\n            groupMap.set(group.id, newGroup.id);\n            newOrganizationPeriod.groups.push(newGroup);\n        }\n        for (const category of this.settings.categories) {\n            const newCategory = category.clone();\n            newCategory.id = uuidv4();\n            newCategory.groupIds = category.groupIds.map(groupId => groupMap.get(groupId)).filter(id => id);\n            categoryMap.set(category.id, newCategory.id);\n            newOrganizationPeriod.settings.categories.push(newCategory);\n        }\n        // Update category ids\n        for (const category of newOrganizationPeriod.settings.categories) {\n            category.categoryIds = category.categoryIds.map(categoryId => categoryMap.get(categoryId)).filter(id => id);\n        }\n        // Update root category id\n        newOrganizationPeriod.settings.rootCategoryId = categoryMap.get(this.settings.rootCategoryId);\n        return newOrganizationPeriod;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], OrganizationRegistrationPeriod.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: RegistrationPeriod })\n], OrganizationRegistrationPeriod.prototype, \"period\", void 0);\n__decorate([\n    field({ decoder: OrganizationRegistrationPeriodSettings })\n], OrganizationRegistrationPeriod.prototype, \"settings\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Group) })\n], OrganizationRegistrationPeriod.prototype, \"groups\", void 0);\n__decorate([\n    field({ decoder: SetupSteps, version: 324 })\n], OrganizationRegistrationPeriod.prototype, \"setupSteps\", void 0);\nexport class RegistrationPeriodList extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.organizationPeriods = [];\n        this.periods = [];\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(OrganizationRegistrationPeriod) })\n], RegistrationPeriodList.prototype, \"organizationPeriods\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RegistrationPeriod) })\n], RegistrationPeriodList.prototype, \"periods\", void 0);\n//# sourceMappingURL=RegistrationPeriod.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nexport class RichText extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.html = '';\n        this.text = '';\n    }\n    toString() {\n        return this.text;\n    }\n    getDiffValue() {\n        return this.text;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], RichText.prototype, \"html\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], RichText.prototype, \"text\", void 0);\n//# sourceMappingURL=RichText.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, DateDecoder, EnumDecoder, field, IntegerDecoder, MapDecoder, NumberDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Colors, Formatter } from '@stamhoofd/utility';\nimport { DefaultAgeGroup } from './DefaultAgeGroup.js';\nimport { Replacement } from './endpoints/EmailRequest.js';\nimport { EventNotificationType } from './EventNotificationType.js';\nimport { Image } from './files/Image.js';\nimport { ReduceablePrice } from './GroupSettings.js';\nimport { LoginMethod, LoginMethodConfig } from './LoginMethod.js';\nimport { MemberResponsibility } from './MemberResponsibility.js';\nimport { DataPermissionsSettings, FinancialSupportSettings, OrganizationRecordsConfiguration } from './members/OrganizationRecordsConfiguration.js';\nimport { OrganizationEmail } from './OrganizationEmail.js';\nimport { OrganizationLevelRecordsConfiguration } from './OrganizationLevelRecordsConfiguration.js';\nimport { PermissionRoleDetailed } from './PermissionRole.js';\nimport { RegistrationPeriod } from './RegistrationPeriod.js';\nimport { RichText } from './RichText.js';\nexport class PlatformPrivateConfig extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.roles = [];\n        this.emails = [];\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(PermissionRoleDetailed) })\n], PlatformPrivateConfig.prototype, \"roles\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(OrganizationEmail), version: 272 })\n], PlatformPrivateConfig.prototype, \"emails\", void 0);\nexport var OrganizationTagType;\n(function (OrganizationTagType) {\n    OrganizationTagType[\"Tag\"] = \"Tag\";\n    OrganizationTagType[\"Verbond\"] = \"Verbond\";\n    OrganizationTagType[\"Gewest\"] = \"Gewest\";\n    OrganizationTagType[\"Gouw\"] = \"Gouw\";\n})(OrganizationTagType || (OrganizationTagType = {}));\nexport function getOrganizationTagTypeName(type) {\n    switch (type) {\n        case OrganizationTagType.Tag:\n            return 'tag';\n        case OrganizationTagType.Verbond:\n            return 'verbond';\n        case OrganizationTagType.Gewest:\n            return 'gewest';\n        case OrganizationTagType.Gouw:\n            return 'gouw';\n    }\n}\nexport function getOrganizationTagTypePluralName(type) {\n    switch (type) {\n        case OrganizationTagType.Tag:\n            return 'tags';\n        case OrganizationTagType.Verbond:\n            return 'verbonden';\n        case OrganizationTagType.Gewest:\n            return 'gewesten';\n        case OrganizationTagType.Gouw:\n            return 'gouwen';\n    }\n}\nexport class OrganizationTag extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.description = '';\n        this.organizationCount = 0;\n        this.childTags = [];\n    }\n    get type() {\n        if (this.name.startsWith('Verbond ')) {\n            return OrganizationTagType.Verbond;\n        }\n        if (this.name.startsWith('Gewest ')) {\n            return OrganizationTagType.Gewest;\n        }\n        return OrganizationTagType.Tag;\n    }\n    getChildType(allTags) {\n        if (this.childTags.length === 0) {\n            return OrganizationTagType.Tag;\n        }\n        const childTag = allTags.find(t => t.id === this.childTags[0]);\n        if (!childTag) {\n            return OrganizationTagType.Tag;\n        }\n        return childTag.type;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], OrganizationTag.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], OrganizationTag.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 341 })\n], OrganizationTag.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 341 })\n], OrganizationTag.prototype, \"organizationCount\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), version: 341 })\n], OrganizationTag.prototype, \"childTags\", void 0);\nexport class PlatformPremiseType extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.description = '';\n        /**\n         * Maximum number of premises allowed for this premise type\n         */\n        this.max = null;\n        /**\n        * Minimum number of premises allowed for this premise type\n        */\n        this.min = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], PlatformPremiseType.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], PlatformPremiseType.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 319 })\n], PlatformPremiseType.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 319 })\n], PlatformPremiseType.prototype, \"max\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 319 })\n], PlatformPremiseType.prototype, \"min\", void 0);\nexport class PlatformMembershipTypeConfigPrice extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.startDate = null;\n        /**\n         *@deprecated\n         */\n        this._price = 0;\n        // key = tag id or an empty string for the default reducable price\n        this.prices = new Map([['', ReduceablePrice.create({ price: 0 })]]);\n        /**\n         * If you set this, it will be possible to choose a custom start and end date within the startDate - endDate period\n         */\n        this.pricePerDay = 0;\n    }\n    getBasePrice(tagIds, shouldApplyReducedPrice) {\n        let result = null;\n        for (const tagId of tagIds.concat([''])) {\n            const price = this.prices.get(tagId);\n            if (!price)\n                continue;\n            const priceForMember = price.getPrice(shouldApplyReducedPrice);\n            if (result === null || priceForMember < result) {\n                result = priceForMember;\n            }\n        }\n        return result !== null && result !== void 0 ? result : 0;\n    }\n    calculatePrice(tagIds, shouldApplyReducedPrice, days) {\n        const basePrice = this.getBasePrice(tagIds, shouldApplyReducedPrice);\n        return this.pricePerDay * days + basePrice;\n    }\n    get name() {\n        if (this.startDate) {\n            return 'prijzen vanaf ' + Formatter.date(this.startDate);\n        }\n        return 'standaardprijzen';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], PlatformMembershipTypeConfigPrice.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], PlatformMembershipTypeConfigPrice.prototype, \"startDate\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, field: 'price', optional: true })\n], PlatformMembershipTypeConfigPrice.prototype, \"_price\", void 0);\n__decorate([\n    field({ decoder: new MapDecoder(StringDecoder, ReduceablePrice), version: 329 })\n], PlatformMembershipTypeConfigPrice.prototype, \"prices\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], PlatformMembershipTypeConfigPrice.prototype, \"pricePerDay\", void 0);\nexport class PlatformMembershipTypeConfig extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.startDate = new Date();\n        this.endDate = new Date();\n        this.expireDate = null;\n        this.amountFree = 0;\n        this.trialDays = 0;\n        this.prices = [PlatformMembershipTypeConfigPrice.create({})];\n    }\n    getPriceConfigForDate(date) {\n        if (date === undefined) {\n            throw new Error('Date is required');\n        }\n        const sorted = this.prices.slice().sort((a, b) => { var _a, _b; return ((_a = a.startDate) !== null && _a !== void 0 ? _a : new Date(0)).getTime() - ((_b = b.startDate) !== null && _b !== void 0 ? _b : new Date(0)).getTime(); });\n        let result = sorted[0];\n        for (const priceConfig of sorted) {\n            if (priceConfig.startDate === null || date >= priceConfig.startDate) {\n                result = priceConfig;\n            }\n        }\n        return result;\n    }\n    getPrice(date, tagIds, shouldApplyReducedPrice) {\n        return this.getPriceConfigForDate(date).getBasePrice(tagIds, shouldApplyReducedPrice);\n    }\n    get name() {\n        return Formatter.dateRange(this.startDate, this.endDate);\n    }\n}\n__decorate([\n    field({ decoder: DateDecoder })\n], PlatformMembershipTypeConfig.prototype, \"startDate\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], PlatformMembershipTypeConfig.prototype, \"endDate\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], PlatformMembershipTypeConfig.prototype, \"expireDate\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], PlatformMembershipTypeConfig.prototype, \"amountFree\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 354 })\n], PlatformMembershipTypeConfig.prototype, \"trialDays\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(PlatformMembershipTypeConfigPrice) })\n], PlatformMembershipTypeConfig.prototype, \"prices\", void 0);\nexport var PlatformMembershipTypeBehaviour;\n(function (PlatformMembershipTypeBehaviour) {\n    /**\n     * A membership that is valid for a certain period\n     */\n    PlatformMembershipTypeBehaviour[\"Period\"] = \"Period\";\n    /**\n     * A membership that is valid for a certain number of days\n     */\n    PlatformMembershipTypeBehaviour[\"Days\"] = \"Days\";\n})(PlatformMembershipTypeBehaviour || (PlatformMembershipTypeBehaviour = {}));\nexport class PlatformMembershipType extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.description = '';\n        this.behaviour = PlatformMembershipTypeBehaviour.Period;\n        /**\n         * Settings per period\n         */\n        this.periods = new Map();\n        /**\n         * Only allow organizations with these tags to use this membership type\n         */\n        this.requiredTagIds = null;\n        /**\n         * Only allow groups with these default age groups to use this membership type\n         */\n        this.requiredDefaultAgeGroupIds = null;\n    }\n    getPrice(periodId, date, tagIds, isReduced) {\n        const period = this.periods.get(periodId);\n        if (!period) {\n            return null;\n        }\n        return period.getPrice(date, tagIds, isReduced);\n    }\n    isEnabled(tagIds, defaultAgeGroupIds) {\n        return this.isEnabledForDefaultAgeGroup(defaultAgeGroupIds) && this.isEnabledForTags(tagIds);\n    }\n    isEnabledForDefaultAgeGroup(defaultAgeGroupIds) {\n        const requiredDefaultAgeGroupIds = this.requiredDefaultAgeGroupIds;\n        if (requiredDefaultAgeGroupIds === null) {\n            return true;\n        }\n        return defaultAgeGroupIds.find(id => requiredDefaultAgeGroupIds.includes(id)) !== undefined;\n    }\n    isEnabledForTags(tags) {\n        const requiredTags = this.requiredTagIds;\n        if (requiredTags === null) {\n            return true;\n        }\n        return tags.find(tagId => requiredTags.includes(tagId)) !== undefined;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], PlatformMembershipType.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], PlatformMembershipType.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], PlatformMembershipType.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(PlatformMembershipTypeBehaviour) })\n], PlatformMembershipType.prototype, \"behaviour\", void 0);\n__decorate([\n    field({ decoder: new MapDecoder(StringDecoder, PlatformMembershipTypeConfig) })\n], PlatformMembershipType.prototype, \"periods\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), nullable: true })\n], PlatformMembershipType.prototype, \"requiredTagIds\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), nullable: true })\n], PlatformMembershipType.prototype, \"requiredDefaultAgeGroupIds\", void 0);\nexport class PlatformEventType extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.description = '';\n        /**\n         * Maximum amount that each organization can have this type\n         */\n        this.maximum = null;\n        /**\n         * Maximum number of days allowed for this event type\n         */\n        this.maximumDays = null;\n        /**\n         * Minimum number of days allowed for this event type\n         */\n        this.minimumDays = null;\n        this.isLocationRequired = false;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], PlatformEventType.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], PlatformEventType.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], PlatformEventType.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], PlatformEventType.prototype, \"maximum\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 288 })\n], PlatformEventType.prototype, \"maximumDays\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 288 })\n], PlatformEventType.prototype, \"minimumDays\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 334 })\n], PlatformEventType.prototype, \"isLocationRequired\", void 0);\nexport class PlatformPolicy extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.url = '';\n        this.enableAtSignup = true;\n        this.checkbox = true;\n        this.richText = RichText.create({});\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], PlatformPolicy.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], PlatformPolicy.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], PlatformPolicy.prototype, \"url\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 327 })\n], PlatformPolicy.prototype, \"enableAtSignup\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 327 })\n], PlatformPolicy.prototype, \"checkbox\", void 0);\n__decorate([\n    field({ decoder: RichText, version: 327 })\n], PlatformPolicy.prototype, \"richText\", void 0);\nexport class PrivacySettings extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.policies = [];\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(PlatformPolicy) })\n], PrivacySettings.prototype, \"policies\", void 0);\nexport class PlatformConfig extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = 'Stamhoofd';\n        this.featureFlags = [];\n        /**\n         * Cotnains the text and settings for when financial support is enabled - not whether it is enabled\n         */\n        this.financialSupport = null;\n        /**\n         * Contains the text and settings for when data permissions are enabled - not whether it is enabled\n         */\n        this.dataPermission = null;\n        this.recordsConfiguration = OrganizationRecordsConfiguration.create({});\n        this.organizationLevelRecordsConfiguration = OrganizationLevelRecordsConfiguration.create({});\n        this.tags = [];\n        this.premiseTypes = [];\n        this.defaultAgeGroups = [];\n        this.responsibilities = [];\n        this.membershipTypes = [];\n        this.eventTypes = [];\n        this.eventNotificationTypes = [];\n        this.coverPhoto = null;\n        this.coverBottomLeftOverlayImage = null;\n        this.coverBottomLeftOverlayWidth = 150;\n        this.footerText = RichText.create({});\n        this.shopFooterText = RichText.create({});\n        this.color = null;\n        this.horizontalLogoDark = null;\n        this.squareLogoDark = null;\n        this.horizontalLogo = null;\n        this.squareLogo = null;\n        this.logoDocuments = null;\n        this.expandLogo = false;\n        this.privacy = PrivacySettings.create({});\n        this.loginMethods = new Map([[\n                LoginMethod.Password,\n                LoginMethodConfig.create({}),\n            ]]);\n    }\n    getEmailReplacements(platform, isPreviewing = false) {\n        var _a, _b, _c, _d;\n        const base = [\n            Replacement.create({\n                token: 'primaryColor',\n                value: this.color ? this.color : '#0053ff',\n            }),\n            Replacement.create({\n                token: 'primaryColorContrast',\n                value: this.color ? Colors.getContrastColor(this.color) : '#fff',\n            }),\n        ];\n        const fromAddress = ((_b = (_a = platform.privateConfig) === null || _a === void 0 ? void 0 : _a.emails) === null || _b === void 0 ? void 0 : _b.find(e => e.default)) || ((_c = platform.privateConfig) === null || _c === void 0 ? void 0 : _c.emails[0]);\n        if (fromAddress) {\n            base.push(Replacement.create({\n                token: 'fromAddress',\n                value: fromAddress.email,\n            }));\n            base.push(Replacement.create({\n                token: 'fromName',\n                value: (_d = fromAddress.name) !== null && _d !== void 0 ? _d : this.name,\n            }));\n        }\n        else {\n            base.push(Replacement.create({\n                token: 'fromName',\n                value: this.name,\n            }));\n        }\n        if (!isPreviewing) {\n            // Add organizationName fallback\n            base.push(Replacement.create({\n                token: 'organizationName',\n                value: this.name,\n            }));\n        }\n        return base;\n    }\n    getEnabledPlatformMembershipTypes(tagIds, defaultAgeGroupIds) {\n        return this.membershipTypes.filter(type => type.isEnabled(tagIds, defaultAgeGroupIds));\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, version: 326 })\n], PlatformConfig.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), version: 348 })\n], PlatformConfig.prototype, \"featureFlags\", void 0);\n__decorate([\n    field({ decoder: FinancialSupportSettings, nullable: true, version: 320 })\n], PlatformConfig.prototype, \"financialSupport\", void 0);\n__decorate([\n    field({ decoder: DataPermissionsSettings, nullable: true, version: 320 })\n], PlatformConfig.prototype, \"dataPermission\", void 0);\n__decorate([\n    field({ decoder: OrganizationRecordsConfiguration, version: 253 })\n], PlatformConfig.prototype, \"recordsConfiguration\", void 0);\n__decorate([\n    field({ decoder: OrganizationLevelRecordsConfiguration, version: 358 })\n], PlatformConfig.prototype, \"organizationLevelRecordsConfiguration\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(OrganizationTag), version: 260 })\n], PlatformConfig.prototype, \"tags\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(PlatformPremiseType), version: 319 })\n], PlatformConfig.prototype, \"premiseTypes\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(DefaultAgeGroup), version: 261 })\n], PlatformConfig.prototype, \"defaultAgeGroups\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(MemberResponsibility), version: 262 })\n], PlatformConfig.prototype, \"responsibilities\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(PlatformMembershipType), version: 268 })\n], PlatformConfig.prototype, \"membershipTypes\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(PlatformEventType), version: 287 })\n], PlatformConfig.prototype, \"eventTypes\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(EventNotificationType), version: 362 })\n], PlatformConfig.prototype, \"eventNotificationTypes\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true, version: 310 })\n], PlatformConfig.prototype, \"coverPhoto\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true, version: 332 })\n], PlatformConfig.prototype, \"coverBottomLeftOverlayImage\", void 0);\n__decorate([\n    field({ decoder: NumberDecoder, version: 332 })\n], PlatformConfig.prototype, \"coverBottomLeftOverlayWidth\", void 0);\n__decorate([\n    field({ decoder: RichText, version: 332 })\n], PlatformConfig.prototype, \"footerText\", void 0);\n__decorate([\n    field({ decoder: RichText, version: 342 })\n], PlatformConfig.prototype, \"shopFooterText\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 310 })\n], PlatformConfig.prototype, \"color\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true, version: 310 })\n], PlatformConfig.prototype, \"horizontalLogoDark\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true, version: 310 })\n], PlatformConfig.prototype, \"squareLogoDark\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true, version: 310 })\n], PlatformConfig.prototype, \"horizontalLogo\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true, version: 310 })\n], PlatformConfig.prototype, \"squareLogo\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true, version: 348 })\n], PlatformConfig.prototype, \"logoDocuments\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, optional: true, version: 310 })\n], PlatformConfig.prototype, \"expandLogo\", void 0);\n__decorate([\n    field({ decoder: PrivacySettings, version: 327 })\n], PlatformConfig.prototype, \"privacy\", void 0);\n__decorate([\n    field({ decoder: new MapDecoder(new EnumDecoder(LoginMethod), LoginMethodConfig), version: 361 })\n], PlatformConfig.prototype, \"loginMethods\", void 0);\nexport class Platform extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.config = PlatformConfig.create({});\n        this.privateConfig = null;\n        this.period = RegistrationPeriod.create({});\n        /**\n         * The organization that represents the platform for collection of platform memberships payments\n         */\n        this.membershipOrganizationId = null;\n    }\n    /**\n     * If you don't have permissions, privateConfig will be null, so there won't be any roles either\n     */\n    getRoles() {\n        var _a, _b;\n        return (_b = (_a = this.privateConfig) === null || _a === void 0 ? void 0 : _a.roles) !== null && _b !== void 0 ? _b : [];\n    }\n    static get shared() {\n        if (!Platform.instance) {\n            Platform.instance = Platform.create({});\n        }\n        return Platform.instance;\n    }\n    static get optionalShared() {\n        return Platform.instance;\n    }\n    static clearShared() {\n        Platform.instance = null;\n    }\n    setShared() {\n        Platform.instance = this;\n    }\n}\nPlatform.instance = null;\n__decorate([\n    field({ decoder: PlatformConfig })\n], Platform.prototype, \"config\", void 0);\n__decorate([\n    field({ decoder: PlatformPrivateConfig, nullable: true })\n], Platform.prototype, \"privateConfig\", void 0);\n__decorate([\n    field({ decoder: RegistrationPeriod })\n], Platform.prototype, \"period\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 324 })\n], Platform.prototype, \"membershipOrganizationId\", void 0);\n//# sourceMappingURL=Platform.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, DateDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { Formatter } from '@stamhoofd/utility';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Address } from './addresses/Address.js';\nimport { Image } from './files/Image.js';\nimport { Group } from './Group.js';\nimport { Platform } from './Platform.js';\nimport { RichText } from './RichText.js';\nexport class EventLocation extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.address = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], EventLocation.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: Address, nullable: true })\n], EventLocation.prototype, \"address\", void 0);\n/**\n * In case we need to cache the name, to properly display information without having to fetch loads of data\n */\nexport class NamedObject extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.id = '';\n        this.name = '';\n        this.description = '';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], NamedObject.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], NamedObject.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], NamedObject.prototype, \"description\", void 0);\nexport class EventMeta extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Contains the name of the organization for displaying the event\n         */\n        this.organizationCache = null;\n        this.description = RichText.create({});\n        this.visible = true;\n        this.location = null;\n        /**\n         * A valid membership is required for one of these default age groups\n         *\n         * null = no restriction\n         */\n        this.defaultAgeGroupIds = null;\n        /**\n         * A valid membership is required for one of these specific groups\n         * (only if organizationId is set)\n         *\n         * null = no restriction\n         */\n        this.groups = null;\n        /**\n         * A valid membership is required for an organization with one of these tags\n         *\n         * null = no restriction (unless organizationId is set)\n         */\n        this.organizationTagIds = null;\n        this.coverPhoto = null;\n    }\n}\n__decorate([\n    field({ decoder: NamedObject, nullable: true, version: 311 })\n], EventMeta.prototype, \"organizationCache\", void 0);\n__decorate([\n    field({ decoder: RichText })\n], EventMeta.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], EventMeta.prototype, \"visible\", void 0);\n__decorate([\n    field({ decoder: EventLocation, nullable: true })\n], EventMeta.prototype, \"location\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), nullable: true })\n], EventMeta.prototype, \"defaultAgeGroupIds\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(NamedObject), nullable: true, version: 302 })\n], EventMeta.prototype, \"groups\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), nullable: true })\n], EventMeta.prototype, \"organizationTagIds\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true })\n], EventMeta.prototype, \"coverPhoto\", void 0);\nexport class Event extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.typeId = '';\n        this.organizationId = null;\n        this.startDate = new Date();\n        this.endDate = new Date();\n        this.meta = EventMeta.create({});\n        this.group = null;\n        this.createdAt = new Date();\n        this.updatedAt = new Date();\n    }\n    get dateRange() {\n        return Formatter.dateRange(this.startDate, this.endDate);\n    }\n    static group(events) {\n        const queue = [];\n        const currentYear = Formatter.year(new Date());\n        for (const event of events) {\n            const year = Formatter.year(event.startDate);\n            const title = Formatter.month(event.startDate) + (year !== currentYear ? ` ${year}` : '');\n            const group = queue[queue.length - 1];\n            if (group && group.title === title) {\n                group.events.push(event);\n            }\n            else {\n                queue.push({ title, events: [event] });\n            }\n        }\n        return queue;\n    }\n    get eventNotificationTypes() {\n        return Platform.shared.config.eventNotificationTypes.filter(t => t.eventTypeIds.includes(this.typeId));\n    }\n    static decode(...args) {\n        const result = super.decode.call(this, ...args);\n        // Create circular reference for permission checking in the frontend\n        if (result.group) {\n            result.group.event = result;\n        }\n        return result;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], Event.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Event.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Event.prototype, \"typeId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], Event.prototype, \"organizationId\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], Event.prototype, \"startDate\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], Event.prototype, \"endDate\", void 0);\n__decorate([\n    field({ decoder: EventMeta })\n], Event.prototype, \"meta\", void 0);\n__decorate([\n    field({ decoder: Group, nullable: true })\n], Event.prototype, \"group\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], Event.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], Event.prototype, \"updatedAt\", void 0);\n//# sourceMappingURL=Event.js.map","import { StringCompare } from '@stamhoofd/utility';\nfunction filterDefinitionsToSelector(definitions) {\n    return (key) => {\n        return definitions[key];\n    };\n}\nfunction $andInMemoryFilterCompiler(filter, filters) {\n    const runners = compileInMemoryFilter(filter, filters);\n    return (object) => {\n        for (const runner of runners) {\n            if (!runner(object)) {\n                return false;\n            }\n        }\n        return true;\n    };\n}\nfunction $orInMemoryFilterCompiler(filter, filters) {\n    const runners = compileInMemoryFilter(filter, filters);\n    return (object) => {\n        for (const runner of runners) {\n            if (runner(object)) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\nfunction $notInMemoryFilterCompiler(filter, filters) {\n    const andRunner = $andInMemoryFilterCompiler(filter, filters);\n    return (object) => {\n        return !andRunner(object);\n    };\n}\nfunction $lessThanInMemoryFilterCompiler(filter) {\n    return (val) => {\n        const a = normalizeValue(guardFilterCompareValue(val));\n        const b = normalizeValue(guardFilterCompareValue(filter));\n        if (a === null || b === null) {\n            return a !== null && b === null;\n        }\n        return a < b;\n    };\n}\nfunction $greaterThanInMemoryFilterCompiler(filter) {\n    return (val) => {\n        const a = normalizeValue(guardFilterCompareValue(val));\n        const b = normalizeValue(guardFilterCompareValue(filter));\n        if (a === null || b === null) {\n            return a === null && b !== null;\n        }\n        return a > b;\n    };\n}\nfunction $equalsInMemoryFilterCompiler(filter) {\n    return (val) => {\n        const b = normalizeValue(guardFilterCompareValue(filter));\n        if (Array.isArray(val)) {\n            // To match backend logic where these things are required for optimizations\n            // + also match MongoDB behavior\n            for (const v of val) {\n                const a = normalizeValue(guardFilterCompareValue(v));\n                if (a === b) {\n                    return true;\n                }\n            }\n            return false;\n        }\n        const a = normalizeValue(guardFilterCompareValue(val));\n        return a === b;\n    };\n}\nfunction invertFilterCompiler(compiler) {\n    return (filter, compilers) => {\n        const runner = compiler(filter, compilers);\n        return (val) => {\n            return !runner(val);\n        };\n    };\n}\nfunction $containsInMemoryFilterCompiler(filter) {\n    return (val) => {\n        const a = normalizeValue(guardFilterCompareValue(val));\n        const needle = normalizeValue(guardFilterCompareValue(filter));\n        if (typeof a !== 'string' || typeof needle !== 'string') {\n            return false;\n        }\n        return StringCompare.contains(a, needle);\n    };\n}\nfunction $inInMemoryFilterCompiler(filter) {\n    return (val) => {\n        if (val === undefined) {\n            // Using $in on a property that does not exist should always return false\n            return false;\n        }\n        if (!Array.isArray(filter)) {\n            throw new Error('Invalid filter: expected array as value for $in filter');\n        }\n        if (Array.isArray(val)) {\n            // To match backend logic (JSON_OVERLAPS in MySQL) where these things are required for optimizations\n            // + also match MongoDB behavior\n            for (const v of val) {\n                const a = normalizeValue(guardFilterCompareValue(v));\n                for (const element of filter) {\n                    const b = normalizeValue(guardFilterCompareValue(element));\n                    if (a === b) {\n                        return true;\n                    }\n                }\n            }\n            return false;\n        }\n        const a = normalizeValue(guardFilterCompareValue(val));\n        for (const element of filter) {\n            const b = normalizeValue(guardFilterCompareValue(element));\n            if (a === b) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\nfunction $elemMatchInMemoryFilterCompiler(filter, compilers) {\n    const runner = $andInMemoryFilterCompiler(filter, compilers);\n    return (val) => {\n        if (val === undefined) {\n            // Using $elemMatch on a property that does not exist should always return false\n            return false;\n        }\n        if (!Array.isArray(val)) {\n            throw new Error('Invalid filter: expected array as value for $elemMatch filter');\n        }\n        for (const o of val) {\n            // Check if individual item matches the filter\n            if (runner(o)) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\nfunction $lengthInMemoryFilterCompiler(filter, compilers) {\n    const runner = $andInMemoryFilterCompiler(filter, compilers);\n    return (val) => {\n        if (typeof val === 'string' || Array.isArray(val)) {\n            return runner(val.length);\n        }\n        throw new Error('Invalid filter: expected string or array as value for $length filter');\n    };\n}\nfunction objectPathValue(object, path) {\n    if (path.length === 0) {\n        return object;\n    }\n    const nextSearched = path[0];\n    if (object instanceof Map) {\n        if (object.has(nextSearched)) {\n            return objectPathValue(object.get(nextSearched), path.slice(1));\n        }\n        return undefined;\n    }\n    if (typeof object !== 'object' || object === null) {\n        return undefined;\n    }\n    if (nextSearched in object) {\n        return objectPathValue(object[nextSearched], path.slice(1));\n    }\n}\nfunction guardFilterCompareValue(val) {\n    if (val instanceof Date) {\n        return val;\n    }\n    if (typeof val === 'string') {\n        return val;\n    }\n    if (typeof val === 'number') {\n        return val;\n    }\n    if (typeof val === 'boolean') {\n        return val;\n    }\n    if (val === null) {\n        return null;\n    }\n    if (typeof val === 'object' && '$' in val) {\n        if (val['$'] === '$now') {\n            return val;\n        }\n    }\n    throw new Error('Invalid compare value. Expected a string, number, boolean, date or null.');\n}\nfunction normalizeValue(val) {\n    if (val instanceof Date) {\n        return val.getTime();\n    }\n    if (typeof val === 'string') {\n        return val.toLocaleLowerCase();\n    }\n    if (typeof val === 'boolean') {\n        return val === true ? 1 : 0;\n    }\n    if (val === null) {\n        return null;\n    }\n    if (typeof val === 'object' && '$' in val) {\n        const specialValue = val['$'];\n        switch (specialValue) {\n            case '$now':\n                return normalizeValue(new Date());\n            default:\n                throw new Error('Unsupported magic value ' + specialValue);\n        }\n    }\n    return val;\n}\nfunction wrapPlainFilter(filter) {\n    if (typeof filter === 'string' || typeof filter === 'number' || typeof filter === 'boolean' || filter === null || filter === undefined || filter instanceof Date) {\n        return {\n            $eq: filter,\n        };\n    }\n    return filter;\n}\nexport function createInMemoryFilterCompiler(path, overrideFilterDefinitions) {\n    const splitted = Array.isArray(path) ? path : path.split('.');\n    return (filter, compilers) => {\n        const runner = $andInMemoryFilterCompiler(filter, overrideFilterDefinitions ? (typeof overrideFilterDefinitions === 'function' ? overrideFilterDefinitions : filterDefinitionsToSelector(overrideFilterDefinitions)) : compilers);\n        return (object) => {\n            const value = objectPathValue(object, splitted);\n            if (value === undefined) {\n                // Cannot filter on property that does not exists\n                // (no need to continue here on the filters as these will throw on an undefined value)\n                return false;\n            }\n            return runner(value);\n        };\n    };\n}\nexport function createInMemoryWildcardCompilerSelector(overrideFilterDefinitions) {\n    return (key) => {\n        // Every key will match on this compiler\n        return createInMemoryFilterCompiler(key, overrideFilterDefinitions);\n    };\n}\nexport function createInMemoryFilterCompilerFromCompositePath(paths, separator = ' ') {\n    const splittedPaths = paths.map(path => path.split('.'));\n    return (filter, compilers) => {\n        const runner = $andInMemoryFilterCompiler(filter, compilers);\n        return (object) => {\n            const value = splittedPaths.map(splitted => objectPathValue(object, splitted)).join(separator);\n            return runner(value);\n        };\n    };\n}\nexport const baseInMemoryFilterCompilers = {\n    $and: $andInMemoryFilterCompiler,\n    $or: $orInMemoryFilterCompiler,\n    $not: $notInMemoryFilterCompiler,\n    $eq: $equalsInMemoryFilterCompiler,\n    $neq: invertFilterCompiler($equalsInMemoryFilterCompiler),\n    $lt: $lessThanInMemoryFilterCompiler,\n    $gt: $greaterThanInMemoryFilterCompiler,\n    $lte: invertFilterCompiler($greaterThanInMemoryFilterCompiler),\n    $gte: invertFilterCompiler($lessThanInMemoryFilterCompiler),\n    $in: $inInMemoryFilterCompiler,\n    $elemMatch: $elemMatchInMemoryFilterCompiler,\n    $contains: $containsInMemoryFilterCompiler,\n    $length: $lengthInMemoryFilterCompiler,\n};\nfunction compileInMemoryFilter(filter, getCompilerForFilter) {\n    if (filter === undefined) {\n        return [];\n    }\n    const runners = [];\n    for (const f2 of (Array.isArray(filter) ? filter : [filter])) {\n        const f = wrapPlainFilter(f2);\n        for (const key of Object.keys(f)) {\n            const subFilter = f[key];\n            const filterCompiler = getCompilerForFilter(key, subFilter);\n            if (!filterCompiler) {\n                throw new Error('Unsupported filter ' + key);\n            }\n            const s = filterCompiler(subFilter, getCompilerForFilter);\n            if (s === undefined || s === null) {\n                throw new Error('Unsupported filter value for ' + key);\n            }\n            runners.push(s);\n        }\n    }\n    return runners;\n}\nexport const compileToInMemoryFilter = (filter, filters) => {\n    if (filter === null) {\n        return () => true;\n    }\n    return $andInMemoryFilterCompiler(filter, filterDefinitionsToSelector(filters));\n};\n//# sourceMappingURL=InMemoryFilter.js.map","import { baseInMemoryFilterCompilers, createInMemoryFilterCompiler, createInMemoryWildcardCompilerSelector } from './InMemoryFilter.js';\nexport const recordAnswerItemFilterCompilers = {\n    ...baseInMemoryFilterCompilers,\n    selected: createInMemoryFilterCompiler('selected'),\n    selectedChoice: createInMemoryFilterCompiler('selectedChoice', {\n        ...baseInMemoryFilterCompilers,\n        id: createInMemoryFilterCompiler('id'),\n    }),\n    selectedChoices: createInMemoryFilterCompiler('selectedChoices', {\n        ...baseInMemoryFilterCompilers,\n        id: createInMemoryFilterCompiler('id'),\n    }),\n};\nexport const recordAnswersFilterCompilers = {\n    recordAnswers: createInMemoryFilterCompiler('recordAnswers', createInMemoryWildcardCompilerSelector(recordAnswerItemFilterCompilers)),\n};\nexport const memberWithRegistrationsBlobInMemoryFilterCompilers = {\n    ...baseInMemoryFilterCompilers,\n    age: createInMemoryFilterCompiler('details.defaultAge'),\n    gender: createInMemoryFilterCompiler('details.gender'),\n    birthDay: createInMemoryFilterCompiler('details.birthDay'),\n    recordAnswers: createInMemoryFilterCompiler('details.recordAnswers', createInMemoryWildcardCompilerSelector(recordAnswerItemFilterCompilers)),\n};\nexport const registrationInMemoryFilterCompilers = {\n    ...baseInMemoryFilterCompilers,\n};\nexport const registerItemInMemoryFilterCompilers = {\n    ...baseInMemoryFilterCompilers,\n    member: createInMemoryFilterCompiler('member.patchedMember', memberWithRegistrationsBlobInMemoryFilterCompilers),\n    groupPrice: createInMemoryFilterCompiler('groupPrice', {\n        ...baseInMemoryFilterCompilers,\n        id: createInMemoryFilterCompiler('id'),\n    }),\n    options: createInMemoryFilterCompiler('options', {\n        ...baseInMemoryFilterCompilers,\n        option: createInMemoryFilterCompiler('option', {\n            ...baseInMemoryFilterCompilers,\n            id: createInMemoryFilterCompiler('id'),\n        }),\n        optionMenu: createInMemoryFilterCompiler('optionMenu', {\n            ...baseInMemoryFilterCompilers,\n            id: createInMemoryFilterCompiler('id'),\n        }),\n        amount: createInMemoryFilterCompiler('amount'),\n    }),\n    ...recordAnswersFilterCompilers,\n};\nexport const documentInMemoryFilterCompilers = {\n    ...baseInMemoryFilterCompilers,\n};\nexport const checkoutInMemoryFilterCompilers = {\n    ...baseInMemoryFilterCompilers,\n};\nexport const receivableBalanceObjectContactInMemoryFilterCompilers = {\n    ...baseInMemoryFilterCompilers,\n    meta: createInMemoryFilterCompiler('meta', {\n        ...baseInMemoryFilterCompilers,\n        responsibilityIds: createInMemoryFilterCompiler('responsibilityIds'),\n    }),\n};\nexport const organizationItemInMemoryFilterCompilers = {\n    ...baseInMemoryFilterCompilers,\n    tags: createInMemoryFilterCompiler('meta.tags'),\n};\nexport const eventNotificationsInMemoryFilterCompilers = {\n    ...baseInMemoryFilterCompilers,\n    ...recordAnswersFilterCompilers,\n};\n//# sourceMappingURL=inMemoryFilterDefinitions.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, DateDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { isSimpleError, SimpleError } from '@simonbackx/simple-errors';\nimport { DataValidator, Formatter, StringCompare } from '@stamhoofd/utility';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Address } from '../../addresses/Address.js';\nimport { CountryHelper } from '../../addresses/CountryDecoder.js';\nimport { Image } from '../../files/Image.js';\nimport { RecordChoice, RecordSettings, RecordType, RecordWarning, RecordWarningType } from './RecordSettings.js';\nimport { File } from '../../files/File.js';\nimport { AuditLogReplacement, AuditLogReplacementType } from '../../AuditLogReplacement.js';\nexport class RecordAnswer extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Date that this was changed. To determine merge order\n         */\n        this.date = new Date();\n        /**\n         * Date that this answer was last reviewed by the author\n         * -> when editing by the organization, don't set this date\n         */\n        this.reviewedAt = null;\n    }\n    isOutdated(timeoutMs) {\n        if (!this.reviewedAt) {\n            return true;\n        }\n        if (this.reviewedAt.getTime() < new Date().getTime() - timeoutMs) {\n            return true;\n        }\n        return false;\n    }\n    markReviewed() {\n        this.reviewedAt = new Date();\n    }\n    get stringValue() {\n        return 'Onbekend';\n    }\n    get objectValue() {\n        return this.stringValue;\n    }\n    /**\n     * Include both the setting and the value\n     */\n    get descriptionValue() {\n        return this.settings.name + ': ' + this.stringValue;\n    }\n    get excelColumns() {\n        return this.settings.excelColumns;\n    }\n    get excelValues() {\n        return [{\n                value: this.stringValue,\n                format: null,\n            }];\n    }\n    getWarnings() {\n        if (!this.isEmpty) {\n            try {\n                this.validate();\n            }\n            catch (e) {\n                if (isSimpleError(e)) {\n                    return [\n                        RecordWarning.create({\n                            id: 'validation-warning-' + this.id,\n                            text: e.getHuman(),\n                            type: RecordWarningType.Error,\n                        }),\n                    ];\n                }\n                // ignore\n            }\n        }\n        return [];\n    }\n    validate() {\n        // valid by default\n    }\n    /**\n     * Return true when it is not the default value as a general rule\n     * E.g. checkbox by default not checked -> empty if not checked\n     */\n    get isEmpty() {\n        return false;\n    }\n    matchQuery(query) {\n        return StringCompare.contains(this.stringValue, query);\n    }\n    isReviewedAfter(answer) {\n        if (this.reviewedAt && answer.reviewedAt) {\n            return this.reviewedAt > answer.reviewedAt;\n        }\n        if (this.reviewedAt && !answer.reviewedAt) {\n            return true;\n        }\n        if (!this.reviewedAt && answer.reviewedAt) {\n            return false;\n        }\n        // Both null\n        return false;\n    }\n    static createDefaultAnswer(settings) {\n        const type = RecordAnswerDecoder.getClassForType(settings.type);\n        return type.create({\n            settings,\n        });\n    }\n    getDiffName() {\n        return this.settings.name;\n    }\n    getDiffValue() {\n        var _a;\n        if (this.settings.type === RecordType.Textarea) {\n            return AuditLogReplacement.create({\n                value: (_a = this.stringValue) !== null && _a !== void 0 ? _a : undefined,\n                type: AuditLogReplacementType.LongText,\n            });\n        }\n        return this.stringValue;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], RecordAnswer.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: RecordSettings })\n], RecordAnswer.prototype, \"settings\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, version: 128 })\n], RecordAnswer.prototype, \"date\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], RecordAnswer.prototype, \"reviewedAt\", void 0);\nexport class RecordAnswerDecoderStatic {\n    decode(data) {\n        const settings = data.field('settings').decode(RecordSettings);\n        const type = settings.type;\n        return data.decode(this.getClassForType(type));\n    }\n    getClassForType(type) {\n        switch (type) {\n            case RecordType.Checkbox: return RecordCheckboxAnswer;\n            case RecordType.Text:\n            case RecordType.Phone:\n            case RecordType.Email:\n            case RecordType.Textarea:\n                return RecordTextAnswer;\n            case RecordType.MultipleChoice: return RecordMultipleChoiceAnswer;\n            case RecordType.ChooseOne: return RecordChooseOneAnswer;\n            case RecordType.Address: return RecordAddressAnswer;\n            case RecordType.Date: return RecordDateAnswer;\n            case RecordType.Price: return RecordPriceAnswer;\n            case RecordType.Image: return RecordImageAnswer;\n            case RecordType.Integer: return RecordIntegerAnswer;\n            case RecordType.File: return RecordFileAnswer;\n        }\n    }\n}\nexport const RecordAnswerDecoder = new RecordAnswerDecoderStatic();\nexport class RecordTextAnswer extends RecordAnswer {\n    constructor() {\n        super(...arguments);\n        this.value = null;\n    }\n    get stringValue() {\n        var _a;\n        return (_a = this.value) !== null && _a !== void 0 ? _a : '/';\n    }\n    get objectValue() {\n        return this.value;\n    }\n    getWarnings() {\n        const base = super.getWarnings();\n        if (!this.settings.warning) {\n            return base;\n        }\n        if (this.settings.warning.inverted) {\n            return this.value === null || this.value.length === 0 ? [this.settings.warning, ...base] : base;\n        }\n        return this.value !== null && this.value.length > 0 ? [this.settings.warning, ...base] : base;\n    }\n    validate() {\n        if (this.settings.required && (this.value === null || this.value.length === 0)) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Dit veld is verplicht',\n                field: 'input',\n            });\n        }\n        if (this.value && this.settings.name.toLocaleLowerCase().includes('rijksregisternummer')) {\n            if (!DataValidator.verifyBelgianNationalNumber(this.value)) {\n                throw new SimpleError({\n                    code: 'invalid_field',\n                    message: \"'\" + (this.value) + \"' is geen geldig rijksregisternummer. Je kan dit nummer vinden op de achterkant van de identiteitskaart, in de vorm van JJ.MM.DD-XXX.XX. Kijk na op typefouten.\",\n                    field: 'input',\n                });\n            }\n            // Auto format the number\n            this.value = DataValidator.formatBelgianNationalNumber(this.value);\n        }\n    }\n    get isEmpty() {\n        return (this.value === null || this.value.length === 0);\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], RecordTextAnswer.prototype, \"value\", void 0);\nexport class RecordCheckboxAnswer extends RecordAnswer {\n    constructor() {\n        super(...arguments);\n        this.selected = false;\n    }\n    getWarnings() {\n        const base = super.getWarnings();\n        if (!this.settings.warning) {\n            return base;\n        }\n        if (this.settings.warning.inverted) {\n            return !this.selected ? [this.settings.warning, ...base] : base;\n        }\n        return this.selected ? [this.settings.warning, ...base] : base;\n    }\n    get stringValue() {\n        return this.selected ? 'Aangevinkt' : 'Niet aangevinkt';\n    }\n    get objectValue() {\n        return this.selected;\n    }\n    get excelValues() {\n        return [{\n                value: this.selected ? (this.comments ? this.comments : 'Ja') : 'Nee',\n                format: null,\n            }];\n    }\n    validate() {\n        if (this.settings.required && !this.selected) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Dit is verplicht',\n                field: 'input',\n            });\n        }\n    }\n    get isEmpty() {\n        return !this.selected;\n    }\n}\n__decorate([\n    field({ decoder: BooleanDecoder })\n], RecordCheckboxAnswer.prototype, \"selected\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], RecordCheckboxAnswer.prototype, \"comments\", void 0);\nexport class RecordMultipleChoiceAnswer extends RecordAnswer {\n    constructor() {\n        super(...arguments);\n        this.selectedChoices = [];\n    }\n    get stringValue() {\n        return this.selectedChoices.map(c => c.name).join(', ');\n    }\n    get objectValue() {\n        return this.selectedChoices.map(c => c.id);\n    }\n    getWarnings() {\n        const base = super.getWarnings();\n        if (this.selectedChoices.length === 0) {\n            return base;\n        }\n        const warnings = base;\n        for (const choice of this.selectedChoices) {\n            if (choice.warning && !choice.warning.inverted) {\n                warnings.push(choice.warning);\n            }\n        }\n        for (const choice of this.settings.choices) {\n            if (choice.warning && choice.warning.inverted) {\n                if (!this.selectedChoices.find(s => s.id === choice.id)) {\n                    warnings.push(choice.warning);\n                }\n            }\n        }\n        return warnings;\n    }\n    validate() {\n        if (this.settings.required && this.selectedChoices.length === 0) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Duid minstens één keuze aan',\n                field: 'input',\n            });\n        }\n    }\n    get isEmpty() {\n        return this.selectedChoices.length === 0;\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(RecordChoice) })\n], RecordMultipleChoiceAnswer.prototype, \"selectedChoices\", void 0);\nexport class RecordChooseOneAnswer extends RecordAnswer {\n    constructor() {\n        super(...arguments);\n        this.selectedChoice = null;\n    }\n    get stringValue() {\n        var _a, _b;\n        return (_b = (_a = this.selectedChoice) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : '/';\n    }\n    get objectValue() {\n        var _a, _b;\n        return (_b = (_a = this.selectedChoice) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : null;\n    }\n    getWarnings() {\n        const base = super.getWarnings();\n        if (this.selectedChoice === null) {\n            // TODO: show warning if inverted\n            return base;\n        }\n        const warnings = base;\n        if (this.selectedChoice.warning && !this.selectedChoice.warning.inverted) {\n            warnings.push(this.selectedChoice.warning);\n        }\n        for (const choice of this.settings.choices) {\n            if (choice.warning && choice.warning.inverted) {\n                if (this.selectedChoice.id !== choice.id) {\n                    warnings.push(choice.warning);\n                }\n            }\n        }\n        return warnings;\n    }\n    validate() {\n        if (this.settings.required && this.selectedChoice === null) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Duid een keuze aan',\n                field: 'input',\n            });\n        }\n    }\n    get isEmpty() {\n        return this.selectedChoice === null;\n    }\n}\n__decorate([\n    field({ decoder: RecordChoice, nullable: true })\n], RecordChooseOneAnswer.prototype, \"selectedChoice\", void 0);\nexport class RecordAddressAnswer extends RecordAnswer {\n    constructor() {\n        super(...arguments);\n        this.address = null;\n    }\n    get stringValue() {\n        var _a, _b;\n        return (_b = (_a = this.address) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : '/';\n    }\n    get objectValue() {\n        var _a, _b;\n        return (_b = (_a = this.address) === null || _a === void 0 ? void 0 : _a.encode({ version: 0 })) !== null && _b !== void 0 ? _b : null;\n    }\n    validate() {\n        if (this.settings.required && this.address === null) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Verplicht in te vullen',\n                field: 'input',\n            });\n        }\n    }\n    get excelValues() {\n        var _a, _b, _c, _d;\n        return [\n            {\n                value: this.address ? `${this.address.street} ${this.address.number}` : '/',\n                format: null,\n            },\n            {\n                value: (_b = (_a = this.address) === null || _a === void 0 ? void 0 : _a.postalCode) !== null && _b !== void 0 ? _b : '/',\n                format: null,\n            },\n            {\n                value: (_d = (_c = this.address) === null || _c === void 0 ? void 0 : _c.city) !== null && _d !== void 0 ? _d : '/',\n                format: null,\n            },\n            {\n                value: this.address ? CountryHelper.getName(this.address.country) : '/',\n                format: null,\n            },\n        ];\n    }\n    get isEmpty() {\n        return this.address === null;\n    }\n}\n__decorate([\n    field({ decoder: Address, nullable: true })\n], RecordAddressAnswer.prototype, \"address\", void 0);\nexport class RecordDateAnswer extends RecordAnswer {\n    constructor() {\n        super(...arguments);\n        this.dateValue = null;\n    }\n    get stringValue() {\n        return this.dateValue ? Formatter.dateNumber(this.dateValue, true) : '/';\n    }\n    get objectValue() {\n        return this.dateValue;\n    }\n    validate() {\n        if (this.settings.required && this.dateValue === null) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Verplicht in te vullen',\n                field: 'input',\n            });\n        }\n    }\n    get isEmpty() {\n        return this.dateValue === null;\n    }\n}\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], RecordDateAnswer.prototype, \"dateValue\", void 0);\nexport class RecordIntegerAnswer extends RecordAnswer {\n    constructor() {\n        super(...arguments);\n        this.value = null;\n    }\n    get stringValue() {\n        return this.value !== null ? this.value.toString() : '/';\n    }\n    get objectValue() {\n        return this.value;\n    }\n    getWarnings() {\n        const base = super.getWarnings();\n        if (!this.settings.warning) {\n            return base;\n        }\n        if (this.settings.warning.inverted) {\n            return this.value === null || this.value === 0 ? [this.settings.warning, ...base] : base;\n        }\n        return this.value !== null && this.value !== 0 ? [this.settings.warning, ...base] : base;\n    }\n    validate() {\n        if (this.settings.required && (this.value === null)) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Dit veld is verplicht',\n                field: 'input',\n            });\n        }\n    }\n    get isEmpty() {\n        return (this.value === null);\n    }\n}\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], RecordIntegerAnswer.prototype, \"value\", void 0);\nexport class RecordPriceAnswer extends RecordIntegerAnswer {\n    get stringValue() {\n        return this.value !== null ? Formatter.price(this.value) : '/';\n    }\n}\nexport class RecordImageAnswer extends RecordAnswer {\n    constructor() {\n        super(...arguments);\n        this.image = null;\n    }\n    get stringValue() {\n        var _a, _b;\n        return (_b = (_a = this.image) === null || _a === void 0 ? void 0 : _a.getPublicPath()) !== null && _b !== void 0 ? _b : '/';\n    }\n    get objectValue() {\n        var _a, _b;\n        return (_b = (_a = this.image) === null || _a === void 0 ? void 0 : _a.encode({ version: 0 })) !== null && _b !== void 0 ? _b : null;\n    }\n    validate() {\n        if (this.settings.required && this.image === null) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Verplicht in te vullen',\n                field: 'input',\n            });\n        }\n    }\n    get isEmpty() {\n        return this.image === null;\n    }\n    transformForDiff() {\n        return this.image;\n    }\n}\n__decorate([\n    field({ decoder: Image, nullable: true })\n], RecordImageAnswer.prototype, \"image\", void 0);\nexport class RecordFileAnswer extends RecordAnswer {\n    constructor() {\n        super(...arguments);\n        this.file = null;\n    }\n    get stringValue() {\n        var _a, _b;\n        return (_b = (_a = this.file) === null || _a === void 0 ? void 0 : _a.getPublicPath()) !== null && _b !== void 0 ? _b : '/';\n    }\n    get objectValue() {\n        var _a, _b;\n        return (_b = (_a = this.file) === null || _a === void 0 ? void 0 : _a.encode({ version: 0 })) !== null && _b !== void 0 ? _b : null;\n    }\n    validate() {\n        if (this.settings.required && this.file === null) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Verplicht in te vullen',\n                field: 'input',\n            });\n        }\n    }\n    get isEmpty() {\n        return this.file === null;\n    }\n    transformForDiff() {\n        return this.file;\n    }\n}\n__decorate([\n    field({ decoder: File, nullable: true })\n], RecordFileAnswer.prototype, \"file\", void 0);\n//# sourceMappingURL=RecordAnswer.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, DateDecoder, EnumDecoder, field, IntegerDecoder, MapDecoder, NumberDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { NamedObject } from './Event.js';\nimport { baseInMemoryFilterCompilers, compileToInMemoryFilter, createInMemoryFilterCompiler } from './filters/InMemoryFilter.js';\nimport { documentInMemoryFilterCompilers } from './filters/inMemoryFilterDefinitions.js';\nimport { RecordAnswerDecoder } from './members/records/RecordAnswer.js';\nimport { RecordCategory } from './members/records/RecordCategory.js';\nexport var DocumentStatus;\n(function (DocumentStatus) {\n    DocumentStatus[\"Draft\"] = \"Draft\";\n    DocumentStatus[\"MissingData\"] = \"MissingData\";\n    DocumentStatus[\"Published\"] = \"Published\";\n    DocumentStatus[\"Deleted\"] = \"Deleted\";\n})(DocumentStatus || (DocumentStatus = {}));\nexport class DocumentStatusHelper {\n    static getName(status) {\n        switch (status) {\n            case DocumentStatus.Draft: return 'Klad';\n            case DocumentStatus.MissingData: return 'Onvolledig';\n            case DocumentStatus.Published: return 'Gepubliceerd';\n            case DocumentStatus.Deleted: return 'Verwijderd';\n        }\n    }\n    static getColor(status) {\n        switch (status) {\n            case DocumentStatus.Draft: return 'info';\n            case DocumentStatus.MissingData: return 'tertiary';\n            case DocumentStatus.Published: return 'secundary';\n            case DocumentStatus.Deleted: return 'error';\n        }\n    }\n}\nexport class DocumentSettings extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.maxAge = null;\n        this.minPrice = null;\n        this.minPricePaid = null;\n        /**\n         * Fields defined by the template that can be set.\n         */\n        this.fieldAnswers = new Map();\n        /**\n         * Defines where to automatically find the answer for a given question\n         */\n        this.linkedFields = new Map();\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, version: 178 })\n], DocumentSettings.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], DocumentSettings.prototype, \"maxAge\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], DocumentSettings.prototype, \"minPrice\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 348 })\n], DocumentSettings.prototype, \"minPricePaid\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RecordAnswerDecoder) }),\n    field({\n        decoder: new MapDecoder(StringDecoder, RecordAnswerDecoder),\n        version: 252,\n        upgrade: (old) => {\n            const map = new Map();\n            for (const answer of old) {\n                map.set(answer.settings.id, answer);\n            }\n            return map;\n        },\n    })\n], DocumentSettings.prototype, \"fieldAnswers\", void 0);\n__decorate([\n    field({ decoder: new MapDecoder(StringDecoder, new ArrayDecoder(StringDecoder)) })\n], DocumentSettings.prototype, \"linkedFields\", void 0);\nexport class DocumentTemplateDefinition extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.type = null;\n        this.name = '';\n        this.fieldCategories = [];\n        /**\n         * Questions filled out for each selected group / cycle combination\n         */\n        this.groupFieldCategories = [];\n        /**\n         * Questions that are different for each document. They can be linked to specific fields of members later on for automatic linking.\n         */\n        this.documentFieldCategories = [];\n        this.defaultMaxAge = null;\n        this.defaultMinPrice = null;\n        this.defaultMinPricePaid = null;\n        this.allowChangingMaxAge = false;\n        this.allowChangingMinPrice = false;\n        this.allowChangingMinPricePaid = false;\n        this.exportFieldCategories = [];\n        this.xmlExport = null;\n        this.xmlExportDescription = null;\n    }\n    transformForDiff() {\n        // Exclude from all diffs\n        return null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 194, upgrade: () => 'fiscal' })\n], DocumentTemplateDefinition.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], DocumentTemplateDefinition.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RecordCategory) })\n], DocumentTemplateDefinition.prototype, \"fieldCategories\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RecordCategory) })\n], DocumentTemplateDefinition.prototype, \"groupFieldCategories\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RecordCategory) })\n], DocumentTemplateDefinition.prototype, \"documentFieldCategories\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], DocumentTemplateDefinition.prototype, \"defaultMaxAge\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], DocumentTemplateDefinition.prototype, \"defaultMinPrice\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 348 })\n], DocumentTemplateDefinition.prototype, \"defaultMinPricePaid\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 347 })\n], DocumentTemplateDefinition.prototype, \"allowChangingMaxAge\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 347 })\n], DocumentTemplateDefinition.prototype, \"allowChangingMinPrice\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 348 })\n], DocumentTemplateDefinition.prototype, \"allowChangingMinPricePaid\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RecordCategory), version: 179 })\n], DocumentTemplateDefinition.prototype, \"exportFieldCategories\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 179 })\n], DocumentTemplateDefinition.prototype, \"xmlExport\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 179 })\n], DocumentTemplateDefinition.prototype, \"xmlExportDescription\", void 0);\nexport class DocumentTemplateGroup extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * @deprecated\n         */\n        this.cycle = 0;\n        /**\n         * Answers for groupFieldCategories for this group\n         */\n        this.fieldAnswers = new Map();\n    }\n    getDiffName() {\n        return this.group.name;\n    }\n    isRecordEnabled(_record) {\n        return true;\n    }\n    doesMatchFilter(filter) {\n        return true;\n    }\n    getRecordAnswers() {\n        return this.fieldAnswers;\n    }\n    patchRecordAnswers(patch) {\n        return this.patch({\n            fieldAnswers: patch,\n        });\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, field: 'groupId' }),\n    field({ decoder: NamedObject, version: 344, upgrade: (old) => NamedObject.create({ id: old, name: 'Onbekend' }) })\n], DocumentTemplateGroup.prototype, \"group\", void 0);\n__decorate([\n    field({ decoder: NumberDecoder })\n], DocumentTemplateGroup.prototype, \"cycle\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RecordAnswerDecoder) }),\n    field({\n        decoder: new MapDecoder(StringDecoder, RecordAnswerDecoder),\n        version: 252,\n        upgrade: (old) => {\n            const map = new Map();\n            for (const answer of old) {\n                map.set(answer.settings.id, answer);\n            }\n            return map;\n        },\n    })\n], DocumentTemplateGroup.prototype, \"fieldAnswers\", void 0);\nexport class DocumentPrivateSettings extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.templateDefinition = DocumentTemplateDefinition.create({});\n        /**\n         * Groups for which the members will receive the document\n         */\n        this.groups = [];\n        this.customHtml = false;\n    }\n}\n__decorate([\n    field({ decoder: DocumentTemplateDefinition })\n], DocumentPrivateSettings.prototype, \"templateDefinition\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(DocumentTemplateGroup) })\n], DocumentPrivateSettings.prototype, \"groups\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 343 })\n], DocumentPrivateSettings.prototype, \"customHtml\", void 0);\nexport class DocumentTemplatePrivate extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.status = DocumentStatus.Draft;\n        this.updatesEnabled = true;\n        this.html = '';\n        this.settings = DocumentSettings.create({});\n        this.privateSettings = DocumentPrivateSettings.create({});\n        this.createdAt = new Date();\n        this.updatedAt = new Date();\n    }\n    isRecordEnabled(_record) {\n        return true;\n    }\n    getRecordAnswers() {\n        return this.settings.fieldAnswers;\n    }\n    patchRecordAnswers(patch) {\n        return this.patch({\n            settings: DocumentSettings.patch({\n                fieldAnswers: patch,\n            }),\n        });\n    }\n    doesMatchFilter(filter) {\n        try {\n            const recordAnswerFilters = {\n                ...baseInMemoryFilterCompilers,\n            };\n            for (const a of this.settings.fieldAnswers.values()) {\n                recordAnswerFilters[a.settings.id] = createInMemoryFilterCompiler([a.settings.id, 'objectValue']);\n            }\n            const defs = {\n                ...documentInMemoryFilterCompilers,\n                fieldAnswers: createInMemoryFilterCompiler('settings.fieldAnswers', recordAnswerFilters),\n            };\n            const compiledFilter = compileToInMemoryFilter(filter, defs);\n            return compiledFilter(this);\n        }\n        catch (e) {\n            console.error('Error while compiling filter', e, filter);\n        }\n        return false;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], DocumentTemplatePrivate.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(DocumentStatus) })\n], DocumentTemplatePrivate.prototype, \"status\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], DocumentTemplatePrivate.prototype, \"updatesEnabled\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], DocumentTemplatePrivate.prototype, \"html\", void 0);\n__decorate([\n    field({ decoder: DocumentSettings })\n], DocumentTemplatePrivate.prototype, \"settings\", void 0);\n__decorate([\n    field({ decoder: DocumentPrivateSettings })\n], DocumentTemplatePrivate.prototype, \"privateSettings\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], DocumentTemplatePrivate.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], DocumentTemplatePrivate.prototype, \"updatedAt\", void 0);\n/**\n * Data stored with a document\n */\nexport class DocumentData extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.description = '';\n        /**\n         * Contains a snapshot of all the answers\n         */\n        this.fieldAnswers = new Map();\n    }\n    matchQuery(query) {\n        for (const answer of this.fieldAnswers.values()) {\n            if (answer.matchQuery(query)) {\n                return true;\n            }\n        }\n        return false;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], DocumentData.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], DocumentData.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RecordAnswerDecoder) }),\n    field({\n        decoder: new MapDecoder(StringDecoder, RecordAnswerDecoder),\n        version: 252,\n        upgrade: (old) => {\n            const map = new Map();\n            for (const answer of old) {\n                map.set(answer.settings.id, answer);\n            }\n            return map;\n        },\n    })\n], DocumentData.prototype, \"fieldAnswers\", void 0);\nexport class Document extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.number = null;\n        this.status = DocumentStatus.Draft;\n        this.data = DocumentData.create({});\n        this.createdAt = new Date();\n        this.updatedAt = new Date();\n        this.memberId = null;\n        this.registrationId = null;\n    }\n    matchQuery(query) {\n        return this.data.matchQuery(query);\n    }\n    isRecordEnabled(_record) {\n        return true;\n    }\n    getRecordAnswers() {\n        return this.data.fieldAnswers;\n    }\n    patchRecordAnswers(patch) {\n        return this.patch({\n            data: DocumentData.patch({\n                fieldAnswers: patch,\n            }),\n        });\n    }\n    doesMatchFilter(filter) {\n        try {\n            const compiledFilter = compileToInMemoryFilter(filter, documentInMemoryFilterCompilers);\n            return compiledFilter(this);\n        }\n        catch (e) {\n            console.error('Error while compiling filter', e, filter);\n        }\n        return false;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], Document.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: NumberDecoder, nullable: true, version: 179 })\n], Document.prototype, \"number\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(DocumentStatus) })\n], Document.prototype, \"status\", void 0);\n__decorate([\n    field({ decoder: DocumentData })\n], Document.prototype, \"data\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], Document.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], Document.prototype, \"updatedAt\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], Document.prototype, \"memberId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], Document.prototype, \"registrationId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Document.prototype, \"templateId\", void 0);\n//# sourceMappingURL=Document.js.map","export var EventNotificationStatus;\n(function (EventNotificationStatus) {\n    EventNotificationStatus[\"Draft\"] = \"Draft\";\n    EventNotificationStatus[\"Pending\"] = \"Pending\";\n    EventNotificationStatus[\"Accepted\"] = \"Accepted\";\n    EventNotificationStatus[\"PartiallyAccepted\"] = \"PartiallyAccepted\";\n    EventNotificationStatus[\"Rejected\"] = \"Rejected\";\n})(EventNotificationStatus || (EventNotificationStatus = {}));\nexport class EventNotificationStatusHelper {\n    static getName(status) {\n        switch (status) {\n            case EventNotificationStatus.Draft:\n                return $t('3771b48b-2385-47ac-b948-9f7ff6d1988e');\n            case EventNotificationStatus.Pending:\n                return $t('62bee5f8-3532-4eee-8281-ff6df193d190');\n            case EventNotificationStatus.Accepted:\n                return $t('372e7507-9f34-4360-bb44-25e324ff36c6');\n            case EventNotificationStatus.PartiallyAccepted:\n                return $t('voorlopig goedgekeurd');\n            case EventNotificationStatus.Rejected:\n                return $t('1ff072f8-6913-4b85-a1e4-4e4ecc1a1bf4');\n        }\n    }\n}\n//# sourceMappingURL=EventNotificationStatus.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, BooleanDecoder, DateDecoder, EnumDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Country } from '../addresses/CountryDecoder.js';\nexport var STPackageType;\n(function (STPackageType) {\n    // Members without activities (not available in frontend anymore)\n    STPackageType[\"LegacyMembers\"] = \"LegacyMembers\";\n    // Full members package\n    STPackageType[\"Members\"] = \"Members\";\n    // Webshop package (max 10 webshops)\n    STPackageType[\"Webshops\"] = \"Webshops\";\n    // One webshop package (max 1 webshop)\n    STPackageType[\"SingleWebshop\"] = \"SingleWebshop\";\n    STPackageType[\"TrialMembers\"] = \"TrialMembers\";\n    STPackageType[\"TrialWebshops\"] = \"TrialWebshops\";\n})(STPackageType || (STPackageType = {}));\nexport class STPackageTypeHelper {\n    static getName(type) {\n        switch (type) {\n            case STPackageType.LegacyMembers: return 'Ledenadministratie (oud gratis pakket)';\n            case STPackageType.Members: {\n                return 'Ledenadministratie, per lid';\n            }\n            case STPackageType.Webshops: {\n                return 'Webshop module. Maximaal 10 webshops';\n            }\n            case STPackageType.SingleWebshop: {\n                return 'Webshop module voor één webshop';\n            }\n            case STPackageType.TrialMembers: return 'Demo ledenadministratie';\n            case STPackageType.TrialWebshops: return 'Demo webshops';\n        }\n    }\n}\nexport var STPricingType;\n(function (STPricingType) {\n    STPricingType[\"Fixed\"] = \"Fixed\";\n    /**\n     * Package is renewable per year\n     * Package can get extended initially to a specific date\n     */\n    STPricingType[\"PerYear\"] = \"PerYear\";\n    /**\n     * Price is per member, per year\n     */\n    STPricingType[\"PerMember\"] = \"PerMember\";\n})(STPricingType || (STPricingType = {}));\nexport class STPackageMeta extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.pricingType = STPricingType.Fixed;\n        this.unitPrice = 0;\n        /// Contains the (paid) invoiced amount\n        this.paidAmount = 0;\n        /// Contains the (paid) invoiced price. Used for statistics and reporting\n        this.paidPrice = 0;\n        /**\n         * Minimum amount that will needs to get invoiced. Only used for first invoice\n         */\n        this.minimumAmount = 1;\n        /**\n         * Only used if applicable\n         */\n        this.autorenew = true;\n        /**\n         * Only used if applicable\n         */\n        this.allowRenew = false;\n        /// If a top up is done, and the payment fails, set the date here\n        /// + increase the payment failed count.\n        /// After x days this will disable all functions if it keeps failing\n        this.firstFailedPayment = null;\n        this.paymentFailedCount = 0;\n        this.canDeactivate = false;\n    }\n    get name() {\n        return STPackageTypeHelper.getName(this.type);\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], STPackageMeta.prototype, \"didRenewId\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(STPackageType) })\n], STPackageMeta.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(STPricingType) })\n], STPackageMeta.prototype, \"pricingType\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], STPackageMeta.prototype, \"unitPrice\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], STPackageMeta.prototype, \"paidAmount\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], STPackageMeta.prototype, \"paidPrice\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], STPackageMeta.prototype, \"minimumAmount\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], STPackageMeta.prototype, \"autorenew\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], STPackageMeta.prototype, \"allowRenew\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], STPackageMeta.prototype, \"firstFailedPayment\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], STPackageMeta.prototype, \"paymentFailedCount\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], STPackageMeta.prototype, \"startDate\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], STPackageMeta.prototype, \"canDeactivate\", void 0);\n/**\n * A package contains a price agreement for a given period that might be renewable\n */\nexport class STPackage extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.createdAt = new Date();\n        this.updatedAt = new Date();\n        /**\n         * validAt is null if the initial needed payment is missing. The package can be ignore\n         * It contains the date when the package was validated and added correctly.\n         */\n        this.validAt = null;\n        this.validUntil = null;\n        /// Disable / delete this package after this date (also no renew allowed). Can't keep using the currently saved pricing\n        this.removeAt = null;\n    }\n    shouldHintRenew() {\n        if (!this.meta.allowRenew || this.validUntil === null) {\n            return false;\n        }\n        if (this.meta.startDate > new Date()) {\n            // Not yet activated\n            return false;\n        }\n        // Allow renew 6 months in advance\n        const allowAfter = new Date(this.validUntil);\n        allowAfter.setDate(allowAfter.getDate() - 31 * 6);\n        if (allowAfter < new Date()) {\n            return true;\n        }\n        return false;\n    }\n    get status() {\n        return STPackageStatus.create({\n            startDate: this.meta.startDate,\n            validUntil: this.validUntil,\n            removeAt: this.removeAt,\n            firstFailedPayment: this.meta.firstFailedPayment,\n        });\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], STPackage.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: STPackageMeta })\n], STPackage.prototype, \"meta\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], STPackage.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], STPackage.prototype, \"updatedAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], STPackage.prototype, \"validAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], STPackage.prototype, \"validUntil\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], STPackage.prototype, \"removeAt\", void 0);\nexport class STPackageStatus extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.validUntil = null;\n        /// Disable / delete this package after this date (also no renew allowed). Can't keep using the currently saved pricing\n        this.removeAt = null;\n        this.firstFailedPayment = null;\n    }\n    get isActive() {\n        const d = new Date();\n        /// Active if it starts within 10 seconds (fixes time differences between server and clients)\n        if (this.startDate && this.startDate > new Date(d.getTime() + 10 * 1000)) {\n            return false;\n        }\n        if (this.removeAt && this.removeAt < d) {\n            return false;\n        }\n        if (this.validUntil && this.validUntil < d) {\n            return false;\n        }\n        // Deactivate module if payment failed, and not reactivated after 4 weeks\n        const expire = new Date();\n        expire.setDate(expire.getDate() - 28);\n        if (this.firstFailedPayment && this.firstFailedPayment < expire) {\n            return false;\n        }\n        return true;\n    }\n    /**\n     * Purchased the package, the package is not yet removed, but it is expired or not paid after 4 weeks following a failed payment\n     */\n    get wasActive() {\n        if (this.isActive) {\n            return false;\n        }\n        const d = new Date();\n        /// Active if it starts within 10 seconds (fixes time differences between server and clients)\n        if (this.startDate && this.startDate > new Date(d.getTime() + 10 * 1000)) {\n            return false;\n        }\n        // if (this.removeAt && this.removeAt < d) {\n        //     return false\n        // }\n        if (this.validUntil && this.validUntil < d) {\n            // Passed!\n            return true;\n        }\n        // Deactivate module if payment failed, and not reactivated after 4 weeks\n        const expire = new Date();\n        expire.setDate(expire.getDate() - 28);\n        if (this.firstFailedPayment && this.firstFailedPayment < expire) {\n            // did not pay!\n            return true;\n        }\n        return false;\n    }\n    get deactivateDate() {\n        const dates = [];\n        if (this.removeAt !== null) {\n            dates.push(this.removeAt);\n        }\n        if (this.validUntil !== null) {\n            dates.push(this.validUntil);\n        }\n        if (this.firstFailedPayment !== null) {\n            const expire = new Date(this.firstFailedPayment);\n            expire.setDate(expire.getDate() + 28);\n            dates.push(expire);\n        }\n        if (dates.length === 0) {\n            return null;\n        }\n        return new Date(Math.min(...dates.map(d => d.getTime())));\n    }\n    merge(status) {\n        if (status.startDate < this.startDate) {\n            this.startDate = status.startDate;\n            // TODO: fix behaviour with gaps if we allow that in the future\n        }\n        if (status.validUntil === null) {\n            this.validUntil = null;\n        }\n        else if (this.validUntil !== null) {\n            if (status.validUntil > this.validUntil) {\n                this.validUntil = status.validUntil;\n            }\n        }\n        if (status.removeAt === null) {\n            this.removeAt = null;\n        }\n        else if (this.removeAt !== null) {\n            if (status.removeAt > this.removeAt) {\n                this.removeAt = status.removeAt;\n            }\n        }\n        if (this.firstFailedPayment === null) {\n            this.firstFailedPayment = status.firstFailedPayment;\n        }\n        else if (status.firstFailedPayment !== null) {\n            if (status.firstFailedPayment < this.firstFailedPayment) {\n                this.firstFailedPayment = status.firstFailedPayment;\n            }\n        }\n    }\n}\n__decorate([\n    field({ decoder: DateDecoder })\n], STPackageStatus.prototype, \"startDate\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], STPackageStatus.prototype, \"validUntil\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], STPackageStatus.prototype, \"removeAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], STPackageStatus.prototype, \"firstFailedPayment\", void 0);\nexport function calculateVATPercentage(address, VATNumber) {\n    // Determine VAT rate\n    let VATRate = 0;\n    if (address.country === Country.Belgium) {\n        VATRate = 21;\n    }\n    else {\n        if (VATNumber && VATNumber.substr(0, 2).toUpperCase() !== 'BE') {\n            VATRate = 0;\n        }\n        else {\n            // Apply VAT rate of the home country for consumers in the EU\n            switch (address.country) {\n                case Country.Netherlands:\n                    VATRate = 21;\n                    break;\n                case Country.Luxembourg:\n                    VATRate = 17;\n                    break;\n                case Country.France:\n                    VATRate = 20;\n                    break;\n                case Country.Germany:\n                    VATRate = 19;\n                    break;\n                default: {\n                    throw new SimpleError({\n                        code: 'country_not_supported',\n                        message: 'Non-business sales to your country are not yet supported. Please enter a valid VAT number.',\n                    });\n                }\n            }\n        }\n    }\n    return VATRate;\n}\n//# sourceMappingURL=STPackage.js.map","export var OrganizationGenderType;\n(function (OrganizationGenderType) {\n    OrganizationGenderType[\"Mixed\"] = \"Mixed\";\n    OrganizationGenderType[\"Separated\"] = \"Separated\";\n    OrganizationGenderType[\"OnlyMale\"] = \"OnlyMale\";\n    OrganizationGenderType[\"OnlyFemale\"] = \"OnlyFemale\";\n})(OrganizationGenderType || (OrganizationGenderType = {}));\n//# sourceMappingURL=OrganizationGenderType.js.map","export var UmbrellaOrganization;\n(function (UmbrellaOrganization) {\n    UmbrellaOrganization[\"ChiroNationaal\"] = \"ChiroNationaal\";\n    UmbrellaOrganization[\"ScoutsEnGidsenVlaanderen\"] = \"ScoutsEnGidsenVlaanderen\";\n    UmbrellaOrganization[\"KSA\"] = \"KSA\";\n    UmbrellaOrganization[\"KLJ\"] = \"KLJ\";\n    UmbrellaOrganization[\"FOS\"] = \"FOSOpenScouting\";\n    UmbrellaOrganization[\"JeugdRodeKruis\"] = \"JeugdRodeKruis\";\n    UmbrellaOrganization[\"JNM\"] = \"JNM\";\n    UmbrellaOrganization[\"Other\"] = \"Other\";\n})(UmbrellaOrganization || (UmbrellaOrganization = {}));\nexport class UmbrellaOrganizationHelper {\n    static getName(umbrellaOrganization) {\n        switch (umbrellaOrganization) {\n            case UmbrellaOrganization.ChiroNationaal: return 'Chirojeugd Vlaanderen';\n            case UmbrellaOrganization.ScoutsEnGidsenVlaanderen: return 'Scouts & Gidsen Vlaanderen';\n            case UmbrellaOrganization.KSA: return 'KSA';\n            case UmbrellaOrganization.KLJ: return 'KLJ';\n            case UmbrellaOrganization.FOS: return 'FOS Open Scouting';\n            case UmbrellaOrganization.JeugdRodeKruis: return 'Jeugd Rode Kruis';\n            case UmbrellaOrganization.JNM: return 'JNM';\n            case UmbrellaOrganization.Other: return 'Andere / geen';\n        }\n    }\n    static getList() {\n        const list = Object.values(UmbrellaOrganization);\n        const ob = [];\n        for (const item of list) {\n            ob.push({\n                name: this.getName(item),\n                value: item,\n            });\n        }\n        return ob;\n    }\n}\n//# sourceMappingURL=UmbrellaOrganization.js.map","import { GroupCategory, GroupCategorySettings } from './GroupCategory.js';\nimport { UmbrellaOrganization } from './UmbrellaOrganization.js';\nexport var OrganizationType;\n(function (OrganizationType) {\n    OrganizationType[\"Youth\"] = \"Youth\";\n    OrganizationType[\"Football\"] = \"Football\";\n    OrganizationType[\"Tennis\"] = \"Tennis\";\n    OrganizationType[\"Golf\"] = \"Golf\";\n    OrganizationType[\"Athletics\"] = \"Athletics\";\n    OrganizationType[\"Badminton\"] = \"Badminton\";\n    OrganizationType[\"Hockey\"] = \"Hockey\";\n    OrganizationType[\"Cycling\"] = \"Cycling\";\n    OrganizationType[\"Swimming\"] = \"Swimming\";\n    OrganizationType[\"Dance\"] = \"Dance\";\n    OrganizationType[\"Volleyball\"] = \"Volleyball\";\n    OrganizationType[\"Basketball\"] = \"Basketball\";\n    OrganizationType[\"Judo\"] = \"Judo\";\n    OrganizationType[\"Sport\"] = \"Sport\";\n    OrganizationType[\"School\"] = \"School\";\n    OrganizationType[\"Student\"] = \"Student\";\n    OrganizationType[\"HorseRiding\"] = \"HorseRiding\";\n    OrganizationType[\"Neighborhood\"] = \"Neighborhood\";\n    OrganizationType[\"Nature\"] = \"Nature\";\n    OrganizationType[\"Music\"] = \"Music\";\n    OrganizationType[\"Professional\"] = \"Professional\";\n    OrganizationType[\"Art\"] = \"Art\";\n    OrganizationType[\"Culture\"] = \"Culture\";\n    OrganizationType[\"LGBTQ\"] = \"LGBTQ\";\n    OrganizationType[\"Politics\"] = \"Politics\";\n    OrganizationType[\"Union\"] = \"Union\";\n    OrganizationType[\"Other\"] = \"Other\";\n})(OrganizationType || (OrganizationType = {}));\nexport class OrganizationTypeHelper {\n    static getName(type) {\n        var _a, _b;\n        const l = this.getList();\n        return (_b = (_a = l.find(v => v.value === type)) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : type.toString();\n    }\n    static getList() {\n        return [\n            {\n                value: OrganizationType.Youth,\n                name: 'Jeugdbeweging',\n            },\n            {\n                value: OrganizationType.Football,\n                name: 'Voetbal',\n            },\n            {\n                value: OrganizationType.Tennis,\n                name: 'Tennis',\n            },\n            {\n                value: OrganizationType.Golf,\n                name: 'Golf',\n            },\n            {\n                value: OrganizationType.Athletics,\n                name: 'Atletiek',\n            },\n            {\n                value: OrganizationType.Badminton,\n                name: 'Badminton',\n            },\n            {\n                value: OrganizationType.Hockey,\n                name: 'Hockey',\n            },\n            {\n                value: OrganizationType.Cycling,\n                name: 'Wielrennen',\n            },\n            {\n                value: OrganizationType.Swimming,\n                name: 'Zwemmen',\n            },\n            {\n                value: OrganizationType.Dance,\n                name: 'Dans',\n            },\n            {\n                value: OrganizationType.Volleyball,\n                name: 'Volleybal',\n            },\n            {\n                value: OrganizationType.Basketball,\n                name: 'Basketbal',\n            },\n            {\n                value: OrganizationType.Judo,\n                name: 'Vechtkunst',\n            },\n            {\n                value: OrganizationType.Sport,\n                name: 'Andere sport',\n            },\n            {\n                value: OrganizationType.Student,\n                name: 'Studentenvereniging',\n            },\n            {\n                value: OrganizationType.HorseRiding,\n                name: 'Paardensport',\n            },\n            {\n                value: OrganizationType.Neighborhood,\n                name: 'Buurtvereniging',\n            },\n            {\n                value: OrganizationType.Nature,\n                name: 'Natuurvereniging',\n            },\n            {\n                value: OrganizationType.Music,\n                name: 'Muziekvereniging',\n            },\n            {\n                value: OrganizationType.Professional,\n                name: 'Beroepsvereniging',\n            },\n            {\n                value: OrganizationType.Art,\n                name: 'Kunstvereniging',\n            },\n            {\n                value: OrganizationType.Culture,\n                name: 'Cultuur',\n            },\n            {\n                value: OrganizationType.LGBTQ,\n                name: 'LGBTQ+',\n            },\n            {\n                value: OrganizationType.Politics,\n                name: 'Politiek',\n            },\n            {\n                value: OrganizationType.Union,\n                name: 'Vakbond',\n            },\n            {\n                value: OrganizationType.School,\n                name: 'School',\n            },\n            {\n                value: OrganizationType.Other,\n                name: 'Andere',\n            },\n        ];\n    }\n    static getCategory(type) {\n        switch (type) {\n            case OrganizationType.Youth:\n            case OrganizationType.Student:\n                return 'Jeugd';\n            case OrganizationType.Sport:\n            case OrganizationType.Football:\n            case OrganizationType.Tennis:\n            case OrganizationType.Golf:\n            case OrganizationType.Athletics:\n            case OrganizationType.Badminton:\n            case OrganizationType.Hockey:\n            case OrganizationType.Cycling:\n            case OrganizationType.Swimming:\n            case OrganizationType.Dance:\n            case OrganizationType.Volleyball:\n            case OrganizationType.Basketball:\n            case OrganizationType.Judo:\n            case OrganizationType.HorseRiding:\n                return 'Sport';\n            case OrganizationType.Culture:\n            case OrganizationType.Art:\n            case OrganizationType.Music:\n                return 'Cultuur';\n            case OrganizationType.Other:\n            case OrganizationType.LGBTQ:\n            case OrganizationType.Politics:\n            case OrganizationType.Union:\n            case OrganizationType.Nature:\n            case OrganizationType.Professional:\n            case OrganizationType.Neighborhood:\n            case OrganizationType.School:\n                return 'Overige';\n        }\n    }\n    /**\n     * Return default group categories BEFORE the update with activities!\n     * @param type\n     * @param umbrella\n     */\n    static getDefaultGroupCategoriesWithoutActivities(type, umbrella) {\n        if (type === OrganizationType.Youth) {\n            if (umbrella === UmbrellaOrganization.ScoutsEnGidsenVlaanderen) {\n                return [\n                    GroupCategory.create({\n                        settings: GroupCategorySettings.create({\n                            name: 'Takken',\n                            maximumRegistrations: 1,\n                        }),\n                    }),\n                ];\n            }\n            if (umbrella === UmbrellaOrganization.ChiroNationaal) {\n                return [\n                    GroupCategory.create({\n                        settings: GroupCategorySettings.create({\n                            name: 'Afdelingen',\n                            maximumRegistrations: 1,\n                        }),\n                    }),\n                ];\n            }\n            return [\n                GroupCategory.create({\n                    settings: GroupCategorySettings.create({\n                        name: 'Leeftijdsgroepen',\n                        maximumRegistrations: 1,\n                    }),\n                }),\n            ];\n        }\n        if (type === OrganizationType.Dance) {\n            return [\n                GroupCategory.create({\n                    settings: GroupCategorySettings.create({\n                        name: 'Danslessen',\n                        maximumRegistrations: 1,\n                    }),\n                }),\n            ];\n        }\n        if (this.getCategory(type) == 'Sport') {\n            return [\n                GroupCategory.create({\n                    settings: GroupCategorySettings.create({\n                        name: 'Leeftijdsgroepen',\n                        maximumRegistrations: 1,\n                    }),\n                }),\n            ];\n        }\n        // Feel free to add more customizations here\n        return [\n            // Always need one minimum\n            GroupCategory.create({\n                settings: GroupCategorySettings.create({\n                    name: 'Leeftijdsgroepen',\n                    maximumRegistrations: 1,\n                }),\n            }),\n        ];\n    }\n    /**\n     * Return default group categories for a given type and umbrella (optional), without the root category\n     * @param type\n     * @param umbrella\n     */\n    static getDefaultGroupCategories(type, umbrella) {\n        if (type === OrganizationType.Youth) {\n            if (umbrella === UmbrellaOrganization.ScoutsEnGidsenVlaanderen) {\n                const activities = [\n                    GroupCategory.create({\n                        settings: GroupCategorySettings.create({\n                            name: 'Weekends',\n                        }),\n                    }),\n                    GroupCategory.create({\n                        settings: GroupCategorySettings.create({\n                            name: 'Kampen',\n                        }),\n                    }),\n                ];\n                return [\n                    GroupCategory.create({\n                        settings: GroupCategorySettings.create({\n                            name: 'Takken',\n                            maximumRegistrations: 1,\n                        }),\n                    }),\n                    GroupCategory.create({\n                        settings: GroupCategorySettings.create({\n                            name: 'Activiteiten',\n                        }),\n                        categoryIds: activities.map(c => c.id),\n                    }),\n                    ...activities,\n                ];\n            }\n            if (umbrella === UmbrellaOrganization.ChiroNationaal) {\n                const activities = [\n                    GroupCategory.create({\n                        settings: GroupCategorySettings.create({\n                            name: 'Weekends',\n                        }),\n                    }),\n                    GroupCategory.create({\n                        settings: GroupCategorySettings.create({\n                            name: 'Kampen',\n                        }),\n                    }),\n                ];\n                return [\n                    GroupCategory.create({\n                        settings: GroupCategorySettings.create({\n                            name: 'Afdelingen',\n                            maximumRegistrations: 1,\n                        }),\n                    }),\n                    GroupCategory.create({\n                        settings: GroupCategorySettings.create({\n                            name: 'Activiteiten',\n                        }),\n                        categoryIds: activities.map(c => c.id),\n                    }),\n                    ...activities,\n                ];\n            }\n            // Feel free to add more customizations here\n            const activities = [\n                GroupCategory.create({\n                    settings: GroupCategorySettings.create({\n                        name: 'Weekends',\n                    }),\n                }),\n                GroupCategory.create({\n                    settings: GroupCategorySettings.create({\n                        name: 'Kampen',\n                    }),\n                }),\n            ];\n            return [\n                GroupCategory.create({\n                    settings: GroupCategorySettings.create({\n                        name: 'Leeftijdsgroepen',\n                        maximumRegistrations: 1,\n                    }),\n                }),\n                GroupCategory.create({\n                    settings: GroupCategorySettings.create({\n                        name: 'Activiteiten',\n                    }),\n                    categoryIds: activities.map(c => c.id),\n                }),\n                ...activities,\n            ];\n        }\n        if (type === OrganizationType.Dance) {\n            return [\n                GroupCategory.create({\n                    settings: GroupCategorySettings.create({\n                        name: 'Danslessen',\n                    }),\n                }),\n                GroupCategory.create({\n                    settings: GroupCategorySettings.create({\n                        name: 'Activiteiten',\n                    }),\n                }),\n            ];\n        }\n        if (this.getCategory(type) == 'Sport') {\n            return [\n                GroupCategory.create({\n                    settings: GroupCategorySettings.create({\n                        name: 'Leeftijdsgroepen',\n                        maximumRegistrations: 1,\n                    }),\n                }),\n                GroupCategory.create({\n                    settings: GroupCategorySettings.create({\n                        name: 'Activiteiten',\n                    }),\n                }),\n            ];\n        }\n        // Feel free to add more customizations here\n        return [];\n    }\n}\n//# sourceMappingURL=OrganizationType.js.map","/**\n * Types of payment:\n * - Payment (default) = positive amount or zero\n * - Refund = negative amount\n * - Chargeback = negative amount due to reversed payment\n * - Reallocation = zero payment due to automatic reallocation (pay an amount of an open balance using a negative or canceled balance)\n */\nexport var PaymentType;\n(function (PaymentType) {\n    /**\n     * payment for some items - positive amount or zero\n     * can contain both positive and negative items\n     */\n    PaymentType[\"Payment\"] = \"Payment\";\n    /**\n     * negative amount to refund earlier items\n     * -> created by the creditor\n     * can only contain negative items\n     */\n    PaymentType[\"Refund\"] = \"Refund\";\n    /**\n     * negative amount due to reversed payment\n     * -> created by the debtor without permission of the creditor\n     * can only contain negative items\n     */\n    PaymentType[\"Chargeback\"] = \"Chargeback\";\n    /**\n     * funds are automatically moved to offset balances without any net change in the overall payment amount\n     * Contains both negative and positive items\n     */\n    PaymentType[\"Reallocation\"] = \"Reallocation\";\n})(PaymentType || (PaymentType = {}));\nexport class PaymentTypeHelper {\n    static getName(type) {\n        switch (type) {\n            case PaymentType.Payment: return 'betaling';\n            case PaymentType.Refund: return 'terugbetaling';\n            case PaymentType.Chargeback: return 'terugvordering';\n            case PaymentType.Reallocation: return 'saldoverrekening';\n        }\n    }\n    static getIcon(type) {\n        switch (type) {\n            case PaymentType.Payment: return 'card';\n            case PaymentType.Refund: return 'undo';\n            case PaymentType.Chargeback: return 'declined';\n            case PaymentType.Reallocation: return 'wand';\n        }\n    }\n}\n//# sourceMappingURL=PaymentType.js.map","import { Formatter } from '@stamhoofd/utility';\nimport { PaymentType, PaymentTypeHelper } from './PaymentType.js';\nexport var PaymentMethod;\n(function (PaymentMethod) {\n    PaymentMethod[\"Unknown\"] = \"Unknown\";\n    PaymentMethod[\"PointOfSale\"] = \"PointOfSale\";\n    PaymentMethod[\"Transfer\"] = \"Transfer\";\n    PaymentMethod[\"DirectDebit\"] = \"DirectDebit\";\n    PaymentMethod[\"Bancontact\"] = \"Bancontact\";\n    PaymentMethod[\"iDEAL\"] = \"iDEAL\";\n    PaymentMethod[\"Payconiq\"] = \"Payconiq\";\n    PaymentMethod[\"CreditCard\"] = \"CreditCard\";\n})(PaymentMethod || (PaymentMethod = {}));\nexport var PaymentMethodV150;\n(function (PaymentMethodV150) {\n    PaymentMethodV150[\"Unknown\"] = \"Unknown\";\n    PaymentMethodV150[\"Transfer\"] = \"Transfer\";\n    PaymentMethodV150[\"DirectDebit\"] = \"DirectDebit\";\n    PaymentMethodV150[\"Bancontact\"] = \"Bancontact\";\n    PaymentMethodV150[\"iDEAL\"] = \"iDEAL\";\n    PaymentMethodV150[\"Payconiq\"] = \"Payconiq\";\n    PaymentMethodV150[\"CreditCard\"] = \"CreditCard\";\n})(PaymentMethodV150 || (PaymentMethodV150 = {}));\nexport function downgradePaymentMethodV150(newerValue) {\n    if (newerValue === PaymentMethod.PointOfSale) {\n        return PaymentMethodV150.Transfer;\n    }\n    return newerValue;\n}\nexport function downgradePaymentMethodArrayV150(newerValue) {\n    return newerValue.map(v => downgradePaymentMethodV150(v));\n}\nexport class PaymentMethodHelper {\n    static getName(method, context = null) {\n        switch (method) {\n            case PaymentMethod.Unknown: return 'onbekende betaalmethode';\n            case PaymentMethod.PointOfSale: {\n                switch (context) {\n                    case 'takeout': return 'bij afhalen';\n                    case 'delivery': return 'bij levering';\n                    case 'Takeout': return 'bij afhalen';\n                    case 'Delivery': return 'bij levering';\n                    case 'OnSite': return 'ter plaatse';\n                    default: return 'ter plaatse';\n                }\n            }\n            case PaymentMethod.Transfer: return 'overschrijving';\n            case PaymentMethod.DirectDebit: return 'domiciliëring';\n            case PaymentMethod.Bancontact: return 'Bancontact';\n            case PaymentMethod.iDEAL: return 'iDEAL';\n            case PaymentMethod.CreditCard: return 'kredietkaart';\n            case PaymentMethod.Payconiq: return 'Payconiq by Bancontact';\n        }\n    }\n    static getPaymentName(method, type) {\n        if (type === PaymentType.Payment) {\n            switch (method) {\n                case PaymentMethod.Unknown: return 'onbekende betaling';\n                case PaymentMethod.PointOfSale: {\n                    return 'betaling ter plaatse';\n                }\n                case PaymentMethod.Transfer: return 'overschrijving';\n                case PaymentMethod.DirectDebit: return 'domiciliëring';\n                case PaymentMethod.Bancontact: return 'Bancontact betaling';\n                case PaymentMethod.iDEAL: return 'iDEAL betaling';\n                case PaymentMethod.CreditCard: return 'kredietkaart betaling';\n                case PaymentMethod.Payconiq: return 'Payconiq betaling';\n            }\n        }\n        if (type === PaymentType.Refund) {\n            return 'terugbetaling via ' + PaymentMethodHelper.getName(method);\n        }\n        if (type === PaymentType.Chargeback) {\n            return 'terugvordering van ' + PaymentMethodHelper.getName(method);\n        }\n        return PaymentTypeHelper.getName(type);\n    }\n    static getPluralName(method) {\n        switch (method) {\n            case PaymentMethod.Unknown: return 'onbekende betaalmethodes';\n            case PaymentMethod.PointOfSale: {\n                return 'betalingen ter plaatse';\n            }\n            case PaymentMethod.Transfer: return 'overschrijvingen';\n            case PaymentMethod.DirectDebit: return 'domiciliëringen';\n            case PaymentMethod.Bancontact: return 'Bancontact';\n            case PaymentMethod.iDEAL: return 'iDEAL';\n            case PaymentMethod.CreditCard: return 'kredietkaart';\n            case PaymentMethod.Payconiq: return 'Payconiq';\n        }\n    }\n    static getNameCapitalized(method, context = null) {\n        if (method === PaymentMethod.iDEAL) {\n            return PaymentMethodHelper.getName(method, context);\n        }\n        return Formatter.capitalizeFirstLetter(PaymentMethodHelper.getName(method, context));\n    }\n    static getPluralNameCapitalized(method) {\n        if (method === PaymentMethod.iDEAL) {\n            return PaymentMethodHelper.getPluralName(method);\n        }\n        return Formatter.capitalizeFirstLetter(PaymentMethodHelper.getPluralName(method));\n    }\n}\n//# sourceMappingURL=PaymentMethod.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, EnumDecoder, StringDecoder, field } from '@simonbackx/simple-encoding';\nimport { Country } from '../addresses/CountryDecoder.js';\nexport var TransferDescriptionType;\n(function (TransferDescriptionType) {\n    TransferDescriptionType[\"Structured\"] = \"Structured\";\n    TransferDescriptionType[\"Reference\"] = \"Reference\";\n    TransferDescriptionType[\"Fixed\"] = \"Fixed\";\n})(TransferDescriptionType || (TransferDescriptionType = {}));\nfunction replaceReplacements(str, replacements) {\n    for (const key in replacements) {\n        str = str.replace('{{' + key + '}}', replacements[key]);\n    }\n    return str;\n}\nexport class TransferSettings extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.type = TransferDescriptionType.Structured;\n        this.prefix = null;\n        this.iban = null;\n        this.creditor = null;\n        this.infoDescription = '';\n    }\n    fillMissing(settings) {\n        const duplicate = this.clone();\n        if (!this.iban) {\n            duplicate.iban = settings.iban;\n        }\n        if (!this.creditor) {\n            duplicate.creditor = settings.creditor;\n        }\n        return duplicate;\n    }\n    toString() {\n        if (this.creditor && this.creditor.length > 0) {\n            return this.creditor + ', ' + this.iban;\n        }\n        return this.iban;\n    }\n    generateDescription(reference, country, replacements = {}) {\n        var _a;\n        if (this.type === TransferDescriptionType.Structured) {\n            if (country === Country.Belgium) {\n                return TransferSettings.generateOGM(replacements);\n            }\n            return TransferSettings.generateOGMNL(replacements);\n        }\n        if (this.type === TransferDescriptionType.Reference) {\n            return replaceReplacements(this.prefix ? (this.prefix + ' ') : '', replacements) + reference;\n        }\n        return replaceReplacements((_a = this.prefix) !== null && _a !== void 0 ? _a : '', replacements);\n    }\n    static generateOGMNL(_ = {}) {\n        /**\n         * Reference: https://www.betaalvereniging.nl/betalingsverkeer/giraal-betalingsverkeer/betalingskenmerken/\n         * Check: https://rudhar.com/cgi-bin/chkdigit.cgi\n         * Lengte: 16 cijfers\n         * Eerste cijfer = controlegetal\n         * Controlegetal wordt berekend door alle cijfers te vermenigvuldigen met een gewicht en vervolgens de modulus van 11 te nemen,\n         * het controlegetal is 11 min die modulus\n         */\n        const length = 15; // allowed values: 15, 12, 11, 10, 9, 8, 7\n        const needsLengthIdentification = length < 15;\n        const L = needsLengthIdentification ? (length % 10) : '';\n        // WARNING: lengths other than 15 are not yet supported because it is not clear whether L needs to be used in the calculation of C or not\n        const weights = [2, 4, 8, 5, 10, 9, 7, 3, 6, 1]; // repeat if needed (in reverse order!)\n        // Warning: we'll reverse the order of the numbers afterwards!\n        const numbers = [];\n        for (let index = 0; index < length; index++) {\n            numbers.push(Math.floor(Math.random() * 10));\n        }\n        const sum = numbers.reduce((sum, num, index) => {\n            const weight = weights[index % (weights.length)];\n            return sum + num * weight;\n        }, 0);\n        let C = 11 - (sum % 11);\n        // Transform to 1 number following the specs\n        if (C === 11) {\n            C = 0;\n        }\n        if (C === 10) {\n            C = 1;\n        }\n        return C + '' + L + (numbers.reverse().map(n => n + '')).join('');\n    }\n    static generateOGM(replacements = {}) {\n        /**\n         * De eerste tien cijfers zijn bijvoorbeeld een klantennummer of een factuurnummer.\n         * De laatste twee cijfers vormen het controlegetal dat verkregen wordt door van de\n         * voorgaande tien cijfers de rest bij Euclidische deling door 97 te berekenen (modulo 97).\n         * Voor en achter de cijfers worden drie plussen (+++) of sterretjes (***) gezet.\n         *\n         * Uitzondering: Indien de rest 0 bedraagt, dan wordt als controlegetal 97 gebruikt.[1]\n         */\n        let firstChars = Math.round(Math.random() * 9999999999);\n        console.log(' first chars to', firstChars);\n        if (replacements.prefix && replacements.prefix.length > 0) {\n            // Change first characters\n            const number = parseInt(replacements.prefix);\n            if (!isNaN(number) && number !== 0) {\n                const paddedFirst = (firstChars + '').padStart(10, '0');\n                if (replacements.prefix.length === 4) {\n                    // Add in the middle, not at the start\n                    firstChars = parseInt((paddedFirst.substring(0, 3) + number.toFixed(0).padStart(4, '0') + paddedFirst.substring(3)).padStart(10, '0').substring(0, 10));\n                }\n                else {\n                    firstChars = parseInt((number + paddedFirst).padStart(10, '0').substring(0, 10));\n                }\n                console.log('Changed first chars to', firstChars);\n            }\n        }\n        let modulo = firstChars % 97;\n        if (modulo === 0) {\n            modulo = 97;\n        }\n        const str = (firstChars + '').padStart(10, '0') + (modulo + '').padStart(2, '0');\n        return '+++' + str.substr(0, 3) + '/' + str.substr(3, 4) + '/' + str.substr(3 + 4) + '+++';\n    }\n    static structureOGM(str) {\n        if (str.length !== 12) {\n            return str;\n        }\n        return '+++' + str.substr(0, 3) + '/' + str.substr(3, 4) + '/' + str.substr(3 + 4) + '+++';\n    }\n}\n__decorate([\n    field({ decoder: new EnumDecoder(TransferDescriptionType) })\n], TransferSettings.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], TransferSettings.prototype, \"prefix\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], TransferSettings.prototype, \"iban\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], TransferSettings.prototype, \"creditor\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 340 })\n], TransferSettings.prototype, \"infoDescription\", void 0);\n//# sourceMappingURL=TransferSettings.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, EnumDecoder, field, IntegerDecoder, MapDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { PaymentMethod } from './PaymentMethod.js';\nimport { TransferSettings } from './webshops/TransferSettings.js';\nexport class PayconiqAccount extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.merchantId = null;\n        this.profileId = null;\n        this.name = null;\n        this.iban = null;\n        this.callbackUrl = null;\n    }\n    getDiffName() {\n        var _a;\n        if (this.name && this.iban) {\n            return `${this.name} (${this.iban})`;\n        }\n        if (this.name) {\n            return this.name + ' (Payconiq)';\n        }\n        if (this.iban) {\n            return this.iban + ' (Payconiq)';\n        }\n        return `Payconiq Account (${(_a = this.merchantId) !== null && _a !== void 0 ? _a : this.id})`;\n    }\n    getDiffValue() {\n        // Don't list properties\n        return '';\n    }\n    static get placeholderApiKey() {\n        return '••••';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], PayconiqAccount.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], PayconiqAccount.prototype, \"apiKey\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], PayconiqAccount.prototype, \"merchantId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], PayconiqAccount.prototype, \"profileId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], PayconiqAccount.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], PayconiqAccount.prototype, \"iban\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], PayconiqAccount.prototype, \"callbackUrl\", void 0);\n/**\n * Should remain private\n */\nexport class PrivatePaymentConfiguration extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Warning: internal id is used instead of the stripe id\n         */\n        this.stripeAccountId = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 174 })\n], PrivatePaymentConfiguration.prototype, \"stripeAccountId\", void 0);\nexport class AdministrationFeeSettings extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * In pertenthousand ‱\n         * 10 = 0,1% discount\n         * 1 = 0,01% discount\n         */\n        this.percentage = 0;\n        /**\n         * In cents\n         */\n        this.fixed = 0;\n        this.zeroIfZero = true;\n    }\n    calculate(price) {\n        if (price <= 0 && this.zeroIfZero) {\n            return 0;\n        }\n        return Math.round(price * this.percentage / 10000) + this.fixed;\n    }\n    isEqual(other) {\n        return this.percentage === other.percentage && this.fixed === other.fixed && this.zeroIfZero === other.zeroIfZero;\n    }\n    isZero() {\n        return this.percentage === 0 && this.fixed === 0;\n    }\n}\n__decorate([\n    field({ decoder: IntegerDecoder })\n], AdministrationFeeSettings.prototype, \"percentage\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], AdministrationFeeSettings.prototype, \"fixed\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 228 })\n], AdministrationFeeSettings.prototype, \"zeroIfZero\", void 0);\nexport class PaymentMethodSettings extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        // Note: these settings are public - don't store sensitive information here\n        this.minimumAmount = 0;\n        /**\n         * Only show warning if amount is higher than this\n         */\n        this.warningAmount = null;\n        this.warningText = '';\n        /**\n         * Disable this payment method for private users\n         */\n        this.companiesOnly = false;\n    }\n}\n__decorate([\n    field({ decoder: IntegerDecoder })\n], PaymentMethodSettings.prototype, \"minimumAmount\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], PaymentMethodSettings.prototype, \"warningAmount\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], PaymentMethodSettings.prototype, \"warningText\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], PaymentMethodSettings.prototype, \"companiesOnly\", void 0);\nexport class PaymentConfiguration extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.transferSettings = TransferSettings.create({});\n        this.paymentMethods = [];\n        this.administrationFee = AdministrationFeeSettings.create({});\n        this.paymentMethodSettings = new Map();\n    }\n    getAvailablePaymentMethods(data) {\n        return this.paymentMethods.filter((method) => {\n            const settings = this.paymentMethodSettings.get(method);\n            if (!settings) {\n                // No special settings, always available\n                return true;\n            }\n            if (data.amount < settings.minimumAmount) {\n                return false;\n            }\n            if (settings.companiesOnly && (!data.customer || !data.customer.company)) {\n                return false;\n            }\n            return true;\n        });\n    }\n}\n__decorate([\n    field({ decoder: TransferSettings })\n], PaymentConfiguration.prototype, \"transferSettings\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(new EnumDecoder(PaymentMethod)) })\n], PaymentConfiguration.prototype, \"paymentMethods\", void 0);\n__decorate([\n    field({ decoder: AdministrationFeeSettings })\n], PaymentConfiguration.prototype, \"administrationFee\", void 0);\n__decorate([\n    field({ decoder: new MapDecoder(new EnumDecoder(PaymentMethod), PaymentMethodSettings), version: 340 })\n], PaymentConfiguration.prototype, \"paymentMethodSettings\", void 0);\n//# sourceMappingURL=PaymentConfiguration.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, DateDecoder, EnumDecoder, field, IntegerDecoder, MapDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { Colors } from '@stamhoofd/utility';\nimport { Address } from './addresses/Address.js';\nimport { STPackageStatus, STPackageType } from './billing/STPackage.js';\nimport { Company } from './Company.js';\nimport { Replacement } from './endpoints/EmailRequest.js';\nimport { File } from './files/File.js';\nimport { Image } from './files/Image.js';\nimport { GroupCategory } from './GroupCategory.js';\nimport { OrganizationRecordsConfiguration } from './members/OrganizationRecordsConfiguration.js';\nimport { OldGroupPrices } from './OldGroupPrices.js';\nimport { OrganizationGenderType } from './OrganizationGenderType.js';\nimport { OrganizationType } from './OrganizationType.js';\nimport { PaymentConfiguration } from './PaymentConfiguration.js';\nimport { PaymentMethod } from './PaymentMethod.js';\nimport { UmbrellaOrganization } from './UmbrellaOrganization.js';\nimport { TransferSettings } from './webshops/TransferSettings.js';\nexport class OrganizationPackages extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.packages = new Map();\n    }\n    isActive(type) {\n        if (STAMHOOFD.userMode === 'platform') {\n            return true;\n        }\n        const status = this.packages.get(type);\n        if (!status) {\n            return false;\n        }\n        if (!status.isActive) {\n            return false;\n        }\n        return true;\n    }\n    /**\n     * Return amount of ms this package has been active for\n     */\n    getActiveTime(type) {\n        const status = this.packages.get(type);\n        if (!status) {\n            return null;\n        }\n        if (!status.isActive) {\n            return null;\n        }\n        return Math.max(0, Date.now() - status.startDate.getTime());\n    }\n    wasActive(type) {\n        const status = this.packages.get(type);\n        if (!status) {\n            return false;\n        }\n        if (!status.wasActive) {\n            return false;\n        }\n        return true;\n    }\n    /**\n     * Return amount of ms this package has been active for\n     */\n    getDeactivatedTime(type) {\n        const status = this.packages.get(type);\n        if (!status) {\n            return null;\n        }\n        if (!status.wasActive) {\n            return null;\n        }\n        const deactivateDate = status.deactivateDate;\n        if (deactivateDate === null) {\n            return null;\n        }\n        return Math.max(0, Date.now() - deactivateDate.getTime());\n    }\n    get useMembers() {\n        return this.isActive(STPackageType.Members) || this.isActive(STPackageType.LegacyMembers) || this.isActive(STPackageType.TrialMembers);\n    }\n    set useMembers(_) {\n        console.warn('Deprected set on useMembers');\n    }\n    get canStartMembersTrial() {\n        return !this.useMembers && !this.wasActive(STPackageType.Members);\n    }\n    get isMembersTrial() {\n        return !this.isActive(STPackageType.Members) && !this.isActive(STPackageType.LegacyMembers) && this.isActive(STPackageType.TrialMembers);\n    }\n    get isActivitiesTrial() {\n        return !this.isActive(STPackageType.Members) && this.isActive(STPackageType.LegacyMembers) && this.isActive(STPackageType.TrialMembers);\n    }\n    get isWebshopsTrial() {\n        return !this.isActive(STPackageType.Webshops) && !this.isActive(STPackageType.SingleWebshop) && this.isActive(STPackageType.TrialWebshops);\n    }\n    get canStartWebshopsTrial() {\n        return !this.useWebshops && !this.wasActive(STPackageType.Webshops) && !this.wasActive(STPackageType.SingleWebshop);\n    }\n    get useWebshops() {\n        return this.webshopLimit > 0;\n    }\n    set useWebshops(_) {\n        console.warn('Deprected set on useWebshops');\n    }\n    get webshopLimit() {\n        if (this.isActive(STPackageType.Webshops)) {\n            return 10;\n        }\n        if (this.isActive(STPackageType.SingleWebshop)) {\n            return 1;\n        }\n        if (this.isActive(STPackageType.TrialWebshops)) {\n            return 10;\n        }\n        return 0;\n    }\n    get disableActivities() {\n        return !this.useActivities;\n    }\n    get useActivities() {\n        return this.isActive(STPackageType.Members) || this.isActive(STPackageType.TrialMembers);\n    }\n    get isPaid() {\n        return this.isActive(STPackageType.Members) || this.isActive(STPackageType.LegacyMembers) || this.isActive(STPackageType.Webshops) || this.isActive(STPackageType.SingleWebshop);\n    }\n    get wasPaid() {\n        return this.wasActive(STPackageType.Members) || this.wasActive(STPackageType.LegacyMembers) || this.wasActive(STPackageType.Webshops) || this.wasActive(STPackageType.SingleWebshop);\n    }\n}\n__decorate([\n    field({ decoder: new MapDecoder(new EnumDecoder(STPackageType), STPackageStatus) })\n], OrganizationPackages.prototype, \"packages\", void 0);\n/**\n * @deprecated\n */\nexport class OrganizationModules extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.useMembers = false;\n        this.useWebshops = false;\n        /**\n         * We use inverse property here because this can only be used in combination with useMembers == true\n         */\n        this.disableActivities = false;\n    }\n    get useActivities() {\n        return this.useMembers && !this.disableActivities;\n    }\n}\n__decorate([\n    field({ decoder: BooleanDecoder })\n], OrganizationModules.prototype, \"useMembers\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], OrganizationModules.prototype, \"useWebshops\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 63 })\n], OrganizationModules.prototype, \"disableActivities\", void 0);\nexport class OrganizationMetaData extends AutoEncoder {\n    constructor() {\n        var _a, _b;\n        super(...arguments);\n        /**\n         * Last time the organization signed the terms. Null means the creation date of the organization.\n         */\n        this.lastSignedTerms = null;\n        this.type = OrganizationType.Other;\n        /**\n         * Contains the ids of the tags\n         */\n        this.tags = [];\n        /**\n         * Show beta features in this organization\n         */\n        this.enableBetaFeatures = false;\n        /**\n         * @deprecated Only used for migrations\n         */\n        this.modulesOld = OrganizationModules.create({});\n        this.packages = OrganizationPackages.create({});\n        this.umbrellaOrganization = null;\n        /**\n         * Set either file or url for the privacy policy. If both are set, the url has priority\n         */\n        this.privacyPolicyFile = null;\n        this.privacyPolicyUrl = null;\n        /**\n         * Logo used in a horizontal environment (e.g. menu bar)\n         */\n        this.horizontalLogo = null;\n        /**\n         * Logo to display (small)\n         */\n        this.squareLogo = null;\n        this.expandLogo = false;\n        this.horizontalLogoDark = null;\n        this.squareLogoDark = null;\n        this.color = null;\n        // Everything below should move to registrations meta data\n        /**\n         * @deprecated\n         */\n        this.expectedMemberCount = 0;\n        /**\n         * @deprecated\n         */\n        this.genderType = OrganizationGenderType.Mixed;\n        /**\n         * @deprecated\n         */\n        this.defaultStartDate = new Date();\n        /**\n         * @deprecated\n         */\n        this.defaultEndDate = new Date();\n        /**\n         * @deprecated\n         */\n        this.defaultPrices = [];\n        /**\n         * @deprecated\n         * Use registrationPaymentConfiguration.transferSettings instead\n         */\n        this.oldTransferSettings = TransferSettings.create({});\n        /**\n         * @deprecated\n         * Use registrationPaymentConfiguration.paymentMethods instead\n         */\n        this.oldPaymentMethods = [PaymentMethod.Transfer];\n        this.registrationPaymentConfiguration = PaymentConfiguration.create({ paymentMethods: [PaymentMethod.PointOfSale] });\n        /**\n         * @deprecated Moved to companies\n         */\n        this.companyName = null;\n        /**\n         * @deprecated Moved to companies\n         */\n        this.VATNumber = null;\n        /**\n         * @deprecated Moved to companies\n         */\n        this.companyNumber = null;\n        /**\n         * @deprecated Moved to companies\n         */\n        this.companyAddress = null;\n        this.companies = [];\n        /**\n         * @deprecated\n         * Use OrganizationRegistrationPeriod instead\n         *\n         * All the available categories\n         */\n        this.categories = [GroupCategory.create({ id: 'root' })]; // we use ID root here because this ID needs to stay the same since it won't be saved\n        /**\n         * @deprecated\n         * Use OrganizationRegistrationPeriod instead\n         *\n         * We use one invisible root category to simplify the difference between non-root and root category\n         */\n        this.rootCategoryId = (_b = (_a = this.categories[0]) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : '';\n    }\n    get didAcceptLatestTerms() {\n        return this.lastSignedTerms !== null && this.lastSignedTerms >= new Date(2022, 0, 20, 0, 0, 0, 0);\n    }\n    get didAcceptEndToEndEncryptionRemoval() {\n        return this.lastSignedTerms !== null && this.lastSignedTerms >= new Date(2022, 0, 20, 0, 0, 0, 0);\n    }\n    /**\n     * @deprecated\n     * Use packages\n     */\n    get modules() {\n        return this.packages;\n    }\n    set modules(_) {\n        console.error('Deprecated set on modules');\n    }\n    /**\n     * @deprecated\n     * Use registrationPaymentConfiguration.paymentMethods instead\n     */\n    get paymentMethods() {\n        return this.registrationPaymentConfiguration.paymentMethods;\n    }\n    /**\n     * @deprecated\n     * Use registrationPaymentConfiguration.paymentMethods instead\n     */\n    get transferSettings() {\n        return this.registrationPaymentConfiguration.transferSettings;\n    }\n    /**\n     * @deprecated\n     * Use OrganizationRegistrationPeriod instead\n     *\n     * (todo) Contains the fully build hierarchy without the need for ID lookups. Try not to use this tree when modifying it.\n     */\n    get rootCategory() {\n        return this.categories.find(c => c.id === this.rootCategoryId);\n    }\n    getEmailReplacements(organization) {\n        var _a, _b, _c, _d;\n        const base = [\n            Replacement.create({\n                token: 'organizationName',\n                value: organization.name,\n            }),\n        ];\n        const fromAddress = ((_b = (_a = organization.privateMeta) === null || _a === void 0 ? void 0 : _a.emails) === null || _b === void 0 ? void 0 : _b.find(e => e.default)) || ((_c = organization.privateMeta) === null || _c === void 0 ? void 0 : _c.emails[0]);\n        if (fromAddress) {\n            base.push(Replacement.create({\n                token: 'fromAddress',\n                value: fromAddress.email,\n            }));\n            base.push(Replacement.create({\n                token: 'fromName',\n                value: (_d = fromAddress.name) !== null && _d !== void 0 ? _d : organization.name,\n            }));\n        }\n        else {\n            base.push(Replacement.create({\n                token: 'fromName',\n                value: organization.name,\n            }));\n        }\n        if (this.color) {\n            base.push(Replacement.create({\n                token: 'primaryColor',\n                value: this.color ? this.color : '#0053ff',\n            }), Replacement.create({\n                token: 'primaryColorContrast',\n                value: this.color ? Colors.getContrastColor(this.color) : '#fff',\n            }));\n        }\n        return base;\n    }\n    /**\n     * True if at least one id matches\n     */\n    matchTags(ids) {\n        for (const id of ids) {\n            if (this.tags.includes(id)) {\n                return true;\n            }\n        }\n        return false;\n    }\n}\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 147 })\n], OrganizationMetaData.prototype, \"lastSignedTerms\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(OrganizationType) })\n], OrganizationMetaData.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), version: 260 })\n], OrganizationMetaData.prototype, \"tags\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 108 })\n], OrganizationMetaData.prototype, \"enableBetaFeatures\", void 0);\n__decorate([\n    field({ decoder: OrganizationModules, version: 48, upgrade: () => OrganizationModules.create({ useMembers: true, useWebshops: true }), field: 'modules' })\n], OrganizationMetaData.prototype, \"modulesOld\", void 0);\n__decorate([\n    field({ decoder: OrganizationPackages, version: 87 })\n], OrganizationMetaData.prototype, \"packages\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(UmbrellaOrganization), nullable: true })\n], OrganizationMetaData.prototype, \"umbrellaOrganization\", void 0);\n__decorate([\n    field({ decoder: File, nullable: true, version: 25 })\n], OrganizationMetaData.prototype, \"privacyPolicyFile\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 25 })\n], OrganizationMetaData.prototype, \"privacyPolicyUrl\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true, version: 11 })\n], OrganizationMetaData.prototype, \"horizontalLogo\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true, version: 11 })\n], OrganizationMetaData.prototype, \"squareLogo\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, optional: true })\n], OrganizationMetaData.prototype, \"expandLogo\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true, version: 185 })\n], OrganizationMetaData.prototype, \"horizontalLogoDark\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true, version: 185 })\n], OrganizationMetaData.prototype, \"squareLogoDark\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 21 })\n], OrganizationMetaData.prototype, \"color\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, optional: true })\n], OrganizationMetaData.prototype, \"expectedMemberCount\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(OrganizationGenderType), optional: true })\n], OrganizationMetaData.prototype, \"genderType\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, optional: true })\n], OrganizationMetaData.prototype, \"defaultStartDate\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, optional: true })\n], OrganizationMetaData.prototype, \"defaultEndDate\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(OldGroupPrices), optional: true })\n], OrganizationMetaData.prototype, \"defaultPrices\", void 0);\n__decorate([\n    field({\n        decoder: TransferSettings,\n        version: 50,\n        field: 'transferSettings',\n        optional: true, // We no longer expect this from the backend, so it can get removed in a future version\n    }),\n    field({\n        decoder: TransferSettings,\n        version: 208,\n        field: 'oldTransferSettings',\n        optional: true, // We no longer expect this from the backend, so it can get removed in a future version\n        downgrade: function () {\n            return this.transferSettings;\n        },\n    })\n], OrganizationMetaData.prototype, \"oldTransferSettings\", void 0);\n__decorate([\n    field({\n        decoder: new ArrayDecoder(new EnumDecoder(PaymentMethod)),\n        version: 151,\n        field: 'paymentMethods',\n        optional: true,\n    }),\n    field({\n        decoder: new ArrayDecoder(new EnumDecoder(PaymentMethod)),\n        version: 208,\n        field: 'oldPaymentMethods',\n        optional: true, // We no longer expect this from the backend, so it can get removed in a future version\n        downgrade: function () {\n            // This return value for old clients\n            return this.paymentMethods;\n        },\n    })\n], OrganizationMetaData.prototype, \"oldPaymentMethods\", void 0);\n__decorate([\n    field({\n        decoder: PaymentConfiguration,\n        version: 204,\n        upgrade: function () {\n            return PaymentConfiguration.create({\n                transferSettings: this.oldTransferSettings,\n                paymentMethods: this.oldPaymentMethods,\n            });\n        },\n    })\n], OrganizationMetaData.prototype, \"registrationPaymentConfiguration\", void 0);\n__decorate([\n    field({\n        decoder: OrganizationRecordsConfiguration,\n        version: 53,\n        defaultValue: () => OrganizationRecordsConfiguration.create({}),\n    })\n], OrganizationMetaData.prototype, \"recordsConfiguration\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 113, field: 'companyName', optional: true })\n], OrganizationMetaData.prototype, \"companyName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 113, field: 'VATNumber', optional: true })\n], OrganizationMetaData.prototype, \"VATNumber\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 113, field: 'companyNumber', optional: true })\n], OrganizationMetaData.prototype, \"companyNumber\", void 0);\n__decorate([\n    field({ decoder: Address, nullable: true, version: 113, field: 'companyAddress', optional: true })\n], OrganizationMetaData.prototype, \"companyAddress\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Company), upgrade: function () {\n            var _a;\n            return (this.companyName || this.VATNumber || this.companyNumber || this.companyAddress)\n                ? [\n                    Company.create({\n                        id: 'default', // required we have stable ids in upgrades\n                        name: (_a = this.companyName) !== null && _a !== void 0 ? _a : '',\n                        VATNumber: this.VATNumber,\n                        companyNumber: this.companyNumber,\n                        address: this.companyAddress,\n                    }),\n                ]\n                : [];\n        }, version: 322 })\n], OrganizationMetaData.prototype, \"companies\", void 0);\n__decorate([\n    field({\n        decoder: new ArrayDecoder(GroupCategory),\n        version: 57,\n    })\n], OrganizationMetaData.prototype, \"categories\", void 0);\n__decorate([\n    field({\n        decoder: StringDecoder,\n        version: 57,\n    })\n], OrganizationMetaData.prototype, \"rootCategoryId\", void 0);\n//# sourceMappingURL=OrganizationMetaData.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, BooleanDecoder, DateDecoder, EnumDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { SimpleErrors } from '@simonbackx/simple-errors';\nimport { v4 as uuidv4 } from 'uuid';\nexport var DNSRecordType;\n(function (DNSRecordType) {\n    DNSRecordType[\"CNAME\"] = \"CNAME\";\n    DNSRecordType[\"TXT\"] = \"TXT\";\n})(DNSRecordType || (DNSRecordType = {}));\nexport var DNSRecordStatus;\n(function (DNSRecordStatus) {\n    DNSRecordStatus[\"Pending\"] = \"Pending\";\n    DNSRecordStatus[\"Failed\"] = \"Failed\";\n    DNSRecordStatus[\"Valid\"] = \"Valid\";\n})(DNSRecordStatus || (DNSRecordStatus = {}));\nexport class DNSRecord extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.description = null;\n        this.status = DNSRecordStatus.Pending;\n        this.errors = null;\n        this.optional = false;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], DNSRecord.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(DNSRecordType) })\n], DNSRecord.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], DNSRecord.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], DNSRecord.prototype, \"value\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 368 })\n], DNSRecord.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(DNSRecordStatus) })\n], DNSRecord.prototype, \"status\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, defaultValue: () => new Date() })\n], DNSRecord.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: SimpleErrors, nullable: true, version: 7 })\n], DNSRecord.prototype, \"errors\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 368 })\n], DNSRecord.prototype, \"optional\", void 0);\n//# sourceMappingURL=DNSRecord.js.map","export var PaymentProvider;\n(function (PaymentProvider) {\n    PaymentProvider[\"Mollie\"] = \"Mollie\";\n    PaymentProvider[\"Payconiq\"] = \"Payconiq\";\n    PaymentProvider[\"Buckaroo\"] = \"Buckaroo\";\n    PaymentProvider[\"Stripe\"] = \"Stripe\";\n})(PaymentProvider || (PaymentProvider = {}));\n//# sourceMappingURL=PaymentProvider.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, DateDecoder, EnumDecoder, field, IntegerDecoder, MapDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { Premise } from './addresses/Premise.js';\nimport { DNSRecord } from './DNSRecord.js';\nimport { StamhoofdFilterDecoder } from './filters/FilteredRequest.js';\nimport { FilterWrapperMarker, unwrapFilter } from './filters/StamhoofdFilter.js';\nimport { MemberResponsibility } from './MemberResponsibility.js';\nimport { RecordAnswerDecoder } from './members/records/RecordAnswer.js';\nimport { OrganizationEmail } from './OrganizationEmail.js';\nimport { PayconiqAccount, PrivatePaymentConfiguration } from './PaymentConfiguration.js';\nimport { PaymentMethod } from './PaymentMethod.js';\nimport { PaymentProvider } from './PaymentProvider.js';\nimport { PermissionRoleDetailed, PermissionRoleForResponsibility } from './PermissionRole.js';\nexport class CreditItem extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Credits in cents\n         */\n        this.change = 0;\n        /**\n         * Credits in cents\n         */\n        this.date = new Date();\n    }\n    /**\n     * tmp fix\n     */\n    static patchIdentifier() {\n        return StringDecoder;\n    }\n}\n__decorate([\n    field({ decoder: IntegerDecoder })\n], CreditItem.prototype, \"change\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], CreditItem.prototype, \"date\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], CreditItem.prototype, \"description\", void 0);\nexport var MollieStatus;\n(function (MollieStatus) {\n    MollieStatus[\"NeedsData\"] = \"NeedsData\";\n    MollieStatus[\"InReview\"] = \"InReview\";\n    MollieStatus[\"Completed\"] = \"Completed\";\n})(MollieStatus || (MollieStatus = {}));\nexport var AcquisitionType;\n(function (AcquisitionType) {\n    AcquisitionType[\"Recommended\"] = \"Recommended\";\n    AcquisitionType[\"Seen\"] = \"Seen\";\n    AcquisitionType[\"SocialMedia\"] = \"SocialMedia\";\n    AcquisitionType[\"Search\"] = \"Search\";\n    AcquisitionType[\"Other\"] = \"Other\";\n})(AcquisitionType || (AcquisitionType = {}));\nexport var MollieProfileMode;\n(function (MollieProfileMode) {\n    MollieProfileMode[\"Test\"] = \"test\";\n    MollieProfileMode[\"Live\"] = \"live\";\n})(MollieProfileMode || (MollieProfileMode = {}));\nexport var MollieProfileStatus;\n(function (MollieProfileStatus) {\n    MollieProfileStatus[\"Unverified\"] = \"unverified\";\n    MollieProfileStatus[\"Verified\"] = \"verified\";\n    MollieProfileStatus[\"Blocked\"] = \"blocked\";\n})(MollieProfileStatus || (MollieProfileStatus = {}));\nexport class MollieProfile extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], MollieProfile.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(MollieProfileMode) })\n], MollieProfile.prototype, \"mode\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], MollieProfile.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], MollieProfile.prototype, \"website\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(MollieProfileStatus) })\n], MollieProfile.prototype, \"status\", void 0);\nexport class MollieOnboarding extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.canReceivePayments = false;\n        this.canReceiveSettlements = false;\n    }\n}\n__decorate([\n    field({ decoder: BooleanDecoder })\n], MollieOnboarding.prototype, \"canReceivePayments\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], MollieOnboarding.prototype, \"canReceiveSettlements\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(MollieStatus) })\n], MollieOnboarding.prototype, \"status\", void 0);\nexport class BuckarooSettings extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.key = '';\n        this.secret = '';\n        this.paymentMethods = [PaymentMethod.Bancontact, PaymentMethod.iDEAL, PaymentMethod.Payconiq];\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], BuckarooSettings.prototype, \"key\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], BuckarooSettings.prototype, \"secret\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(new EnumDecoder(PaymentMethod)) })\n], BuckarooSettings.prototype, \"paymentMethods\", void 0);\nexport class BalanceNotificationSettings extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.enabled = false;\n        this.emailId = null;\n        this.maximumReminderEmails = 3;\n        /**\n         * Minimum days between emails\n         */\n        this.minimumDaysBetween = 5;\n        /**\n         * Which contacts to use for balances from other organizations\n         */\n        this.organizationContactsFilter = {};\n    }\n    getOrganizationContactsFilterResponsibilityIds() {\n        var _a;\n        const f = (_a = this.organizationContactsFilter) !== null && _a !== void 0 ? _a : {};\n        const unwrapped = unwrapFilter(f, {\n            meta: {\n                responsibilityIds: {\n                    $in: FilterWrapperMarker,\n                },\n            },\n        });\n        if (Array.isArray(unwrapped.markerValue) && unwrapped.markerValue.length && unwrapped.markerValue.every(v => typeof v === 'string')) {\n            return unwrapped.markerValue;\n        }\n        return [];\n    }\n}\n__decorate([\n    field({ decoder: BooleanDecoder }),\n    field({ decoder: BooleanDecoder, version: 363, upgrade: () => (false) }) // Force reset to false\n], BalanceNotificationSettings.prototype, \"enabled\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], BalanceNotificationSettings.prototype, \"emailId\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 355 })\n], BalanceNotificationSettings.prototype, \"maximumReminderEmails\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 355 })\n], BalanceNotificationSettings.prototype, \"minimumDaysBetween\", void 0);\n__decorate([\n    field({ decoder: StamhoofdFilterDecoder, version: 363, nullable: true })\n], BalanceNotificationSettings.prototype, \"organizationContactsFilter\", void 0);\nexport class OrganizationPrivateMetaData extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * @deprecated\n         */\n        this.privateKey = null;\n        /**\n         * DNS records that need to be set in order to activate mail domain and registration domain\n         */\n        this.dnsRecords = [];\n        /**\n         * Register domain that is awaiting validation\n         */\n        this.pendingRegisterDomain = null;\n        /**\n         * Mail domain that is awaiting validation\n         */\n        this.pendingMailDomain = null;\n        /**\n         * The mail from domain that should be used (if validated).\n         * This domain should have the SPF record and MX records needed to handle bounces\n         */\n        this.mailFromDomain = null;\n        /**\n         * Mail domain that is used to send e-mails. You can't set this directly, the server will set this value as soon as the domain has been validated.\n         */\n        this.mailDomain = null;\n        this.mailDomainActive = false;\n        /**\n         * E-mail addresses that an organization can send from (or reply-to)\n         */\n        this.emails = [];\n        /**\n         * Balance reminder email settings\n         */\n        this.balanceNotificationSettings = BalanceNotificationSettings.create({});\n        /**\n         * @deprecated\n         * Credits in cents\n         */\n        this.credits = [];\n        // readonly\n        this.mollieOnboarding = null;\n        this.mollieProfile = null;\n        /**\n         * When set, Buckaroo has priority over Mollie as a payment provider\n         */\n        this.buckarooSettings = null;\n        this.registrationPaymentConfiguration = PrivatePaymentConfiguration.create({});\n        this.featureFlags = [];\n        /**\n         * Null = use environment default\n         */\n        this.useTestPayments = null;\n        // Only set for admins\n        this.payconiqAccounts = [];\n        this.acquisitionTypes = [];\n        this.roles = [];\n        this.responsibilities = [];\n        /**\n         * Link responsibility type ids to roles that should be auto-applied for users linked to members with those responsibilities\n         */\n        this.inheritedResponsibilityRoles = [];\n        this.billingContact = null;\n        /**\n         * @deprecated\n         * Moved to public meta data. Do not use.\n         */\n        this.VATNumber = null;\n        this.premises = [];\n        this.recordAnswers = new Map();\n    }\n    /**\n     * @deprecated\n     */\n    get registrationProviderConfiguration() {\n        return this.registrationPaymentConfiguration;\n    }\n    get payconiqApiKey() {\n        if (this.payconiqAccounts.length === 0) {\n            return null;\n        }\n        return this.payconiqAccounts[0].apiKey;\n    }\n    get actualTestPayments() {\n        if (this.useTestPayments !== null) {\n            return this.useTestPayments;\n        }\n        return STAMHOOFD.environment !== 'production';\n    }\n    getPaymentProviderFor(method, stripeAccountMeta) {\n        var _a;\n        if (method === PaymentMethod.Unknown || method === PaymentMethod.Transfer || method === PaymentMethod.PointOfSale) {\n            return null;\n        }\n        if (this.payconiqApiKey && method === PaymentMethod.Payconiq) {\n            return PaymentProvider.Payconiq;\n        }\n        if (stripeAccountMeta) {\n            if (stripeAccountMeta.paymentMethods.includes(method)) {\n                return PaymentProvider.Stripe;\n            }\n        }\n        // Is Buckaroo setup?\n        if (this.buckarooSettings !== null) {\n            if (this.buckarooSettings.paymentMethods.includes(method)) {\n                return PaymentProvider.Buckaroo;\n            }\n        }\n        if ((this.mollieOnboarding && (((_a = this.mollieOnboarding) === null || _a === void 0 ? void 0 : _a.canReceivePayments) || this.actualTestPayments)) && (method == PaymentMethod.Bancontact || method == PaymentMethod.iDEAL || method == PaymentMethod.CreditCard)) {\n            return PaymentProvider.Mollie;\n        }\n        return null;\n    }\n    get removedPrivateKeys() {\n        const c = this.clone();\n        for (const account of c.payconiqAccounts) {\n            account.apiKey = PayconiqAccount.placeholderApiKey;\n        }\n        return c;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, version: 149, nullable: true, optional: true })\n], OrganizationPrivateMetaData.prototype, \"privateKey\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(DNSRecord), version: 6 })\n], OrganizationPrivateMetaData.prototype, \"dnsRecords\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 84 })\n], OrganizationPrivateMetaData.prototype, \"pendingRegisterDomain\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 6 })\n], OrganizationPrivateMetaData.prototype, \"pendingMailDomain\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 84 })\n], OrganizationPrivateMetaData.prototype, \"mailFromDomain\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 6 })\n], OrganizationPrivateMetaData.prototype, \"mailDomain\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 8 })\n], OrganizationPrivateMetaData.prototype, \"mailDomainActive\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(OrganizationEmail), version: 9 })\n], OrganizationPrivateMetaData.prototype, \"emails\", void 0);\n__decorate([\n    field({ decoder: BalanceNotificationSettings, version: 355 })\n], OrganizationPrivateMetaData.prototype, \"balanceNotificationSettings\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(CreditItem), version: 23, optional: true })\n], OrganizationPrivateMetaData.prototype, \"credits\", void 0);\n__decorate([\n    field({ decoder: MollieOnboarding, nullable: true, version: 27 })\n], OrganizationPrivateMetaData.prototype, \"mollieOnboarding\", void 0);\n__decorate([\n    field({ decoder: MollieProfile, nullable: true, version: 200 })\n], OrganizationPrivateMetaData.prototype, \"mollieProfile\", void 0);\n__decorate([\n    field({ decoder: BuckarooSettings, nullable: true, version: 152 })\n], OrganizationPrivateMetaData.prototype, \"buckarooSettings\", void 0);\n__decorate([\n    field({ decoder: PrivatePaymentConfiguration, version: 176, field: 'registrationProviderConfiguration' }),\n    field({ decoder: PrivatePaymentConfiguration, version: 204 })\n], OrganizationPrivateMetaData.prototype, \"registrationPaymentConfiguration\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), version: 161 })\n], OrganizationPrivateMetaData.prototype, \"featureFlags\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, nullable: true, version: 154 })\n], OrganizationPrivateMetaData.prototype, \"useTestPayments\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 29, field: 'payconiqApiKey' }),\n    field({\n        decoder: new ArrayDecoder(PayconiqAccount),\n        version: 206,\n        upgrade: (oldValue) => {\n            if (oldValue === null) {\n                return [];\n            }\n            return [PayconiqAccount.create({ apiKey: oldValue })];\n        },\n        downgrade: (newValue) => {\n            if (newValue.length === 0) {\n                return null;\n            }\n            return newValue[0].apiKey;\n        },\n    })\n], OrganizationPrivateMetaData.prototype, \"payconiqAccounts\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(new EnumDecoder(AcquisitionType)), version: 56 })\n], OrganizationPrivateMetaData.prototype, \"acquisitionTypes\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(PermissionRoleDetailed), version: 60 })\n], OrganizationPrivateMetaData.prototype, \"roles\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(MemberResponsibility), version: 280 })\n], OrganizationPrivateMetaData.prototype, \"responsibilities\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(PermissionRoleForResponsibility), version: 280 })\n], OrganizationPrivateMetaData.prototype, \"inheritedResponsibilityRoles\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 88 })\n], OrganizationPrivateMetaData.prototype, \"billingContact\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 86, optional: true })\n], OrganizationPrivateMetaData.prototype, \"VATNumber\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Premise), version: 319 })\n], OrganizationPrivateMetaData.prototype, \"premises\", void 0);\n__decorate([\n    field({\n        decoder: new MapDecoder(StringDecoder, RecordAnswerDecoder),\n        version: 358,\n    })\n], OrganizationPrivateMetaData.prototype, \"recordAnswers\", void 0);\n//# sourceMappingURL=OrganizationPrivateMetaData.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nexport class Category extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.description = '';\n        this.enabled = true;\n        this.productIds = [];\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], Category.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Category.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Category.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], Category.prototype, \"enabled\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder) })\n], Category.prototype, \"productIds\", void 0);\n//# sourceMappingURL=Category.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, EnumDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nexport class SeatingSizeConfiguration {\n    constructor(config) {\n        this.seatWidth = 30;\n        this.seatHeight = 30;\n        this.seatXSpacing = 10;\n        this.seatYSpacing = 10;\n        Object.assign(this, config);\n    }\n}\nexport var SeatMarkings;\n(function (SeatMarkings) {\n    SeatMarkings[\"DisabledPerson\"] = \"dp\";\n})(SeatMarkings || (SeatMarkings = {}));\nexport var SeatType;\n(function (SeatType) {\n    SeatType[\"Seat\"] = \"s\";\n    SeatType[\"Space\"] = \"sp\";\n})(SeatType || (SeatType = {}));\n// Note: we don't use ids for seats and rows\n// 1. To make changes easier (human understandable if seats are moved added or removed)\n// 2. To avoid creating huge objects that take a lot of space in the database/network requests\nexport class SeatingPlanSeat extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Name of the seat.\n         * E.g. '1'\n         */\n        this.label = '';\n        /**\n         * Default block width = 2, which equals 1 seat -> allow to jump in halves\n         */\n        this.blockWidth = 2;\n        /**\n         * Grow factor (automatically increase width of seat)\n         */\n        this.grow = 0;\n        this.type = SeatType.Seat;\n        this.markings = [];\n        // Cached drawing position\n        this.x = 0;\n        this.y = 0;\n        this.width = 0;\n        this.height = 0;\n        // Unique id for rendering\n        this.uuid = uuidv4();\n    }\n    get isSpace() {\n        return this.type === SeatType.Space;\n    }\n    get isValidSeat() {\n        return this.type === SeatType.Seat && this.label !== '';\n    }\n    setPosition(x, y, width, height) {\n        this.x = x;\n        this.y = y;\n        this.width = width;\n        this.height = height;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, field: 'l' })\n], SeatingPlanSeat.prototype, \"label\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, field: 'c', optional: true, nullable: true })\n], SeatingPlanSeat.prototype, \"category\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, field: 'w', optional: true })\n], SeatingPlanSeat.prototype, \"blockWidth\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, field: 'g', optional: true })\n], SeatingPlanSeat.prototype, \"grow\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(SeatType), field: 't', optional: true })\n], SeatingPlanSeat.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(new EnumDecoder(SeatMarkings)), optional: true, field: 'm' })\n], SeatingPlanSeat.prototype, \"markings\", void 0);\nexport class SeatingPlanRow extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Name of the row\n         * E.g. 'A'\n         */\n        this.label = '';\n        this.seats = [];\n        // Cached drawing positions\n        this.x = 0;\n        this.y = 0;\n        this.height = 0;\n        this.width = 0;\n        // Unique id for rendering\n        this.uuid = uuidv4();\n    }\n    get seatCount() {\n        let count = 0;\n        for (const seat of this.seats) {\n            if (seat.isValidSeat) {\n                count += 1;\n            }\n        }\n        return count;\n    }\n    getWidth(config) {\n        if (this.seats.length === 0) {\n            return config.seatWidth;\n        }\n        let width = -config.seatXSpacing;\n        for (const seat of this.seats) {\n            width += config.seatWidth * seat.blockWidth / 2 + config.seatXSpacing + Math.floor(config.seatXSpacing * (seat.blockWidth - 2) / 2);\n        }\n        return width;\n    }\n    getGrow() {\n        let grow = 0;\n        for (const seat of this.seats) {\n            grow += seat.grow;\n        }\n        return grow;\n    }\n    setPosition(x, y, width, height) {\n        this.x = x;\n        this.y = y;\n        this.width = width;\n        this.height = height;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, field: 'l' })\n], SeatingPlanRow.prototype, \"label\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(SeatingPlanSeat), field: 's' })\n], SeatingPlanRow.prototype, \"seats\", void 0);\nexport class SeatingPlanSection extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Name of the section (optional if only section)\n         */\n        this.name = '';\n        this.rows = [];\n    }\n    get seatCount() {\n        let count = 0;\n        for (const row of this.rows) {\n            count += row.seatCount;\n        }\n        return count;\n    }\n    calculateMinimumWidth() {\n        let minWidth = 20;\n        for (const row of this.rows) {\n            for (const seat of row.seats) {\n                if (seat.isValidSeat) {\n                    // Check length\n                    const width = seat.label.length * 10;\n                    if (width > minWidth) {\n                        minWidth = width;\n                    }\n                }\n            }\n        }\n        return minWidth;\n    }\n    correctSizeConfig(config) {\n        const minWidth = this.calculateMinimumWidth();\n        if (config.seatWidth < minWidth) {\n            config.seatWidth = minWidth;\n        }\n        if (config.seatHeight < config.seatWidth) {\n            config.seatHeight = config.seatWidth;\n        }\n    }\n    calculateSize(config) {\n        const size = {\n            width: config.seatWidth * 10, // = minimum width\n            height: this.rows.length * config.seatHeight + config.seatYSpacing * (this.rows.length - 1),\n        };\n        for (const row of this.rows) {\n            size.width = Math.max(size.width, row.getWidth(config));\n        }\n        return size;\n    }\n    updatePositions(config) {\n        const size = this.calculateSize(config);\n        let y = 0;\n        for (const row of this.rows) {\n            const rowWidth = row.getWidth(config);\n            const rowGrow = row.getGrow();\n            const rowX = rowGrow > 0 ? 0 : (size.width / 2 - rowWidth / 2);\n            const rowY = y;\n            let x = rowX;\n            for (const seat of row.seats) {\n                const w = config.seatWidth * seat.blockWidth / 2 + Math.floor(config.seatXSpacing * (seat.blockWidth - 2) / 2) + (rowGrow > 0 ? Math.max(0, seat.grow * (size.width - rowWidth) / rowGrow) : 0);\n                seat.setPosition(x, y, w, config.seatHeight);\n                x += w + config.seatXSpacing;\n            }\n            y += config.seatHeight;\n            row.setPosition(rowX, rowY, rowGrow > 0 ? size.width : rowWidth, y - rowY);\n            // Add spacing\n            y += config.seatYSpacing;\n        }\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], SeatingPlanSection.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], SeatingPlanSection.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(SeatingPlanRow) })\n], SeatingPlanSection.prototype, \"rows\", void 0);\nexport class SeatingPlanCategory extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Name of the category\n         */\n        this.name = '';\n        /**\n         * Price added (can be negative) is always in cents, to avoid floating point errors\n         */\n        this.price = 0;\n        /**\n         * Only allow ordering by administrators\n         */\n        this.adminOnly = false;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], SeatingPlanCategory.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], SeatingPlanCategory.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], SeatingPlanCategory.prototype, \"price\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 218 })\n], SeatingPlanCategory.prototype, \"adminOnly\", void 0);\nexport class SeatingPlan extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Name of the venue\n         */\n        this.name = '';\n        this.requireOptimalReservation = true;\n        this.sections = [SeatingPlanSection.create({})];\n        this.categories = [];\n    }\n    get seatCount() {\n        let count = 0;\n        for (const section of this.sections) {\n            count += section.seatCount;\n        }\n        return count;\n    }\n    get adminSeatCount() {\n        let count = 0;\n        for (const section of this.sections) {\n            for (const row of section.rows) {\n                for (const seat of row.seats) {\n                    if (seat.isValidSeat) {\n                        const category = this.categories.find(c => c.id === seat.category);\n                        if (category && category.adminOnly) {\n                            count += 1;\n                        }\n                    }\n                }\n            }\n        }\n        return count;\n    }\n    isAdminSeat(s) {\n        const seat = this.getSeat(s);\n        if (!seat) {\n            return false;\n        }\n        const category = this.categories.find(c => c.id === seat.category);\n        if (category && category.adminOnly) {\n            return true;\n        }\n        return false;\n    }\n    getSeat(s) {\n        for (const section of this.sections) {\n            if (section.id === s.section) {\n                for (const row of section.rows) {\n                    if (row.label === s.row) {\n                        for (const seat of row.seats) {\n                            if (seat.label === s.seat && seat.isValidSeat) {\n                                return seat;\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        return null;\n    }\n    getCategoryName(seat) {\n        if (this.categories.length <= 1) {\n            return null;\n        }\n        const s = this.getSeat(seat);\n        if (s) {\n            const c = this.categories.find(c => c.id === s.category);\n            if (c && c.name) {\n                return c.name;\n            }\n        }\n        return null;\n    }\n    getCategoryColor(categoryId) {\n        var _a;\n        const colorIndexes = ['', 'var(--color-secundary)', 'var(--color-tertiary)', 'var(--color-warning)'];\n        const category = this.categories.findIndex(c => c.id === categoryId);\n        if (category) {\n            return (_a = colorIndexes[category]) !== null && _a !== void 0 ? _a : '';\n        }\n    }\n    getSeatColor(seat) {\n        if (!seat.isValidSeat) {\n            return '';\n        }\n        if (seat.category) {\n            return this.getCategoryColor(seat.category);\n        }\n        return '';\n    }\n    isValidSeat(s, reservedSeats, allowedSeats) {\n        for (const section of this.sections) {\n            if (section.id === s.section) {\n                for (const row of section.rows) {\n                    if (row.label === s.row) {\n                        for (const seat of row.seats) {\n                            if (seat.label === s.seat && seat.isValidSeat) {\n                                if (reservedSeats) {\n                                    // We count the elements, because it is possible a seat is reserved multiple times (due to a previous bug)\n                                    const isReservedCount = reservedSeats.filter(s2 => s2.equals(s)).length;\n                                    if (isReservedCount > 0) {\n                                        if (allowedSeats) {\n                                            const isAllowedCount = allowedSeats.filter(s2 => s2.equals(s)).length;\n                                            return isAllowedCount >= isReservedCount;\n                                        }\n                                        return false;\n                                    }\n                                }\n                                return true;\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        return false;\n    }\n    adjustSeatsForBetterFit(selectedSeats, reservedSeats, allowedSeats = [], asAdmin = false) {\n        // A seat is valid if it is next to a different reserved seat.\n        // If above is not true, then it can also be invalid if there is one seat between the next reserved seat\n        // Otherwise it is valid\n        // Algo steps:\n        // 1. Loop each row\n        // 2. Check if the seat is taken or a space\n        // 3. Count empty seats in a row\n        // If we find first selected seat, and empty seats count === 1, then mark that previous seat as 'should be reserved'\n        // If we find an empty space, and 'should be reserved' is set, then move the last selected seat to that space\n        // If we find a reserved seat of space, then reset 'should be reserved'\n        let adjustedSeats = [...selectedSeats];\n        let didChange = false;\n        for (const section of this.sections) {\n            for (const row of section.rows) {\n                let emptySeatStack = [];\n                let selectedSeatStack = [];\n                let leftSwapSeat = null;\n                let allowRightSwap = false; // Only allow to move seats to the right if the left seat is adjacent to a empty seat, not a reserved seat or hallway\n                for (const seat of [...row.seats, SeatingPlanSeat.create({ label: '', type: SeatType.Space })]) {\n                    const rSeat = ReservedSeat.create({\n                        section: section.id,\n                        row: row.label,\n                        seat: seat.label,\n                    });\n                    if (selectedSeats.find(s => s.equals(rSeat))) {\n                        if (emptySeatStack.length >= 1) {\n                            allowRightSwap = true;\n                        }\n                        if (emptySeatStack.length === 1) {\n                            // We have a 'should be reserved'\n                            leftSwapSeat = emptySeatStack[0];\n                        }\n                        emptySeatStack = [];\n                        selectedSeatStack.push(rSeat);\n                    }\n                    else if (!seat.isValidSeat || (reservedSeats.find(s => s.equals(rSeat)) && !allowedSeats.find(s => s.equals(rSeat))) || (!asAdmin && this.isAdminSeat(rSeat))) {\n                        if (allowRightSwap && emptySeatStack.length === 1 && selectedSeatStack.length) {\n                            const from = selectedSeatStack[0];\n                            const to = emptySeatStack[0];\n                            // Move the first selected seat to the empty seat\n                            adjustedSeats = adjustedSeats.map((s) => {\n                                if (s.equals(from)) {\n                                    return to;\n                                }\n                                return s;\n                            });\n                            didChange = true;\n                        }\n                        // Space or reserved\n                        emptySeatStack = [];\n                        selectedSeatStack = [];\n                        leftSwapSeat = null; // When we reach a selected seat that is next to a reserved seat, we don't want to swap it any longer\n                        allowRightSwap = false;\n                    }\n                    else {\n                        if (leftSwapSeat && selectedSeatStack.length) {\n                            const from = selectedSeatStack[selectedSeatStack.length - 1];\n                            const to = leftSwapSeat;\n                            // Move the last selected seat to the empty seat\n                            adjustedSeats = adjustedSeats.map((s) => {\n                                if (s.equals(from)) {\n                                    return to;\n                                }\n                                return s;\n                            });\n                            didChange = true;\n                            leftSwapSeat = null;\n                            emptySeatStack = [];\n                            selectedSeatStack = [];\n                        }\n                        emptySeatStack.push(rSeat);\n                    }\n                }\n            }\n        }\n        if (!didChange) {\n            return null;\n        }\n        return adjustedSeats;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], SeatingPlan.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], SeatingPlan.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 215 })\n], SeatingPlan.prototype, \"requireOptimalReservation\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(SeatingPlanSection) })\n], SeatingPlan.prototype, \"sections\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(SeatingPlanCategory), version: 214 })\n], SeatingPlan.prototype, \"categories\", void 0);\nfunction isNumeric(str) {\n    return /^\\d+$/.test(str);\n}\nexport class ReservedSeat extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Id of the section\n         */\n        this.section = '';\n        /**\n         * label of the row\n         */\n        this.row = '';\n        /**\n         * label of the seat\n         */\n        this.seat = '';\n    }\n    getName(webshop, product) {\n        if (!product.seatingPlanId) {\n            return [];\n        }\n        const seatingPlan = webshop.meta.seatingPlans.find(p => p.id === product.seatingPlanId);\n        if (!seatingPlan) {\n            return [];\n        }\n        const section = seatingPlan.sections.find(s => s.id === this.section);\n        const categoryName = seatingPlan.getCategoryName(this);\n        const suffix = categoryName ? [{ title: 'Categorie', value: categoryName }] : [];\n        if (seatingPlan.sections.length === 1 || !section || section.name.length === 0) {\n            // Don't mention the section\n            return [\n                {\n                    title: 'Rij',\n                    value: this.row,\n                },\n                {\n                    title: 'Zetel',\n                    value: this.seat,\n                },\n                ...suffix,\n            ];\n        }\n        return [\n            {\n                title: 'Zone',\n                value: section.name,\n            },\n            {\n                title: 'Rij',\n                value: this.row,\n            },\n            {\n                title: 'Zetel',\n                value: this.seat,\n            },\n            ...suffix,\n        ];\n    }\n    getNameString(webshop, product) {\n        if (!product.seatingPlanId) {\n            return '';\n        }\n        const seatingPlan = webshop.meta.seatingPlans.find(p => p.id === product.seatingPlanId);\n        if (!seatingPlan) {\n            return '';\n        }\n        const section = seatingPlan.sections.find(s => s.id === this.section);\n        if (seatingPlan.sections.length === 1 || !section) {\n            if (isNumeric(this.row) !== isNumeric(this.seat)) {\n                // Clean string\n                return this.row + this.seat;\n            }\n            return this.getName(webshop, product).map(p => p.title + ': ' + p.value).join(', ');\n        }\n        if (isNumeric(this.row) !== isNumeric(this.seat)) {\n            // Clean string\n            return section.name + ' ' + this.row + this.seat;\n        }\n        return this.getName(webshop, product).map(p => p.title + ': ' + p.value).join(', ');\n    }\n    getShortName(product) {\n        if (!product.seatingPlanId) {\n            return '';\n        }\n        if (isNumeric(this.row) !== isNumeric(this.seat)) {\n            // Clean string\n            return this.row + this.seat;\n        }\n        return 'R' + this.row + 'Z' + this.seat;\n    }\n    equals(reservedSeat) {\n        return this.section === reservedSeat.section && this.row === reservedSeat.row && this.seat === reservedSeat.seat;\n    }\n    static sort(a, b) {\n        if (a.section < b.section) {\n            return -1;\n        }\n        if (a.section > b.section) {\n            return 1;\n        }\n        if (a.row.padStart(10, '0') < b.row.padStart(10, '0')) {\n            return -1;\n        }\n        if (a.row.padStart(10, '0') > b.row.padStart(10, '0')) {\n            return 1;\n        }\n        if (a.seat.padStart(10, '0') < b.seat.padStart(10, '0')) {\n            return -1;\n        }\n        if (a.seat.padStart(10, '0') > b.seat.padStart(10, '0')) {\n            return 1;\n        }\n        return 0;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, field: 'se' })\n], ReservedSeat.prototype, \"section\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, field: 'r' })\n], ReservedSeat.prototype, \"row\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, field: 's' })\n], ReservedSeat.prototype, \"seat\", void 0);\nexport class CartReservedSeat extends ReservedSeat {\n    constructor() {\n        super(...arguments);\n        /**\n         * Additional price that was applied\n         */\n        this.price = 0;\n    }\n    calculatePrice(seatingPlan) {\n        const seat = seatingPlan.getSeat(this);\n        if (!seat) {\n            this.price = 0;\n            return this.price;\n        }\n        const category = seatingPlan.categories.find(c => c.id === seat.category);\n        if (!category) {\n            this.price = 0;\n            return this.price;\n        }\n        this.price = category.price;\n        return this.price;\n    }\n}\n__decorate([\n    field({ decoder: IntegerDecoder, field: 'p', optional: true })\n], CartReservedSeat.prototype, \"price\", void 0);\n//# sourceMappingURL=SeatingPlan.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, BooleanDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { v4 as uuidv4 } from 'uuid';\nexport class WebshopField extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.description = '';\n        this.placeholder = '';\n        this.required = true;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], WebshopField.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], WebshopField.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], WebshopField.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], WebshopField.prototype, \"placeholder\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 95 })\n], WebshopField.prototype, \"required\", void 0);\nexport class WebshopFieldAnswer extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.answer = '';\n    }\n    validate() {\n        if (this.field.required && this.answer.length === 0) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'This field is required',\n                human: 'Je moet dit veld verplicht invullen',\n                field: 'answer',\n            });\n        }\n    }\n}\n__decorate([\n    field({ decoder: WebshopField })\n], WebshopFieldAnswer.prototype, \"field\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], WebshopFieldAnswer.prototype, \"answer\", void 0);\n//# sourceMappingURL=WebshopField.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, DateDecoder, EnumDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { Formatter } from '@stamhoofd/utility';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Address } from '../addresses/Address.js';\nimport { Image } from '../files/Image.js';\nimport { ReservedSeat } from '../SeatingPlan.js';\nimport { WebshopField } from './WebshopField.js';\nexport class ProductPrice extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        /**\n         * Price is always in cents, to avoid floating point errors\n         */\n        this.price = 0;\n        // Optional: different price if you reach a given amount of pieces (options and prices shouldn't be the same)\n        this.discountPrice = null;\n        // Only used if discountPrice is not null\n        this.discountAmount = 2;\n        this.hidden = false;\n        /**\n         * Total stock, excluding already sold items into account\n         */\n        this.stock = null;\n        this.usedStock = 0;\n    }\n    get isSoldOut() {\n        if (this.stock === null) {\n            return false;\n        }\n        return this.usedStock >= this.stock;\n    }\n    get remainingStock() {\n        if (this.stock === null) {\n            return null;\n        }\n        return Math.max(0, this.stock - this.usedStock);\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], ProductPrice.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], ProductPrice.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], ProductPrice.prototype, \"price\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 93 })\n], ProductPrice.prototype, \"discountPrice\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 93 })\n], ProductPrice.prototype, \"discountAmount\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 219 })\n], ProductPrice.prototype, \"hidden\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 221 })\n], ProductPrice.prototype, \"stock\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 221 })\n], ProductPrice.prototype, \"usedStock\", void 0);\nexport class Option extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        /**\n         * Price added (can be negative) is always in cents, to avoid floating point errors\n         */\n        this.price = 0;\n        /**\n         * Total stock, excluding already sold items into account\n         */\n        this.stock = null;\n        this.usedStock = 0;\n    }\n    get isSoldOut() {\n        if (this.stock === null) {\n            return false;\n        }\n        return this.usedStock >= this.stock;\n    }\n    get remainingStock() {\n        if (this.stock === null) {\n            return null;\n        }\n        return Math.max(0, this.stock - this.usedStock);\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], Option.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Option.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], Option.prototype, \"price\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 221 })\n], Option.prototype, \"stock\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 221 })\n], Option.prototype, \"usedStock\", void 0);\nexport class OptionMenu extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.multipleChoice = false;\n        this.options = [\n            Option.create({}),\n        ];\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], OptionMenu.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], OptionMenu.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], OptionMenu.prototype, \"multipleChoice\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Option) })\n], OptionMenu.prototype, \"options\", void 0);\nexport var ProductType;\n(function (ProductType) {\n    ProductType[\"Product\"] = \"Product\";\n    ProductType[\"Person\"] = \"Person\";\n    ProductType[\"Ticket\"] = \"Ticket\";\n    ProductType[\"Voucher\"] = \"Voucher\";\n})(ProductType || (ProductType = {}));\n/**\n * This includes a location for a ticket (will be visible on the ticket)\n */\nexport class ProductLocation extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.address = null;\n        // TODO: coordinates here (only filled in by backend)\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], ProductLocation.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], ProductLocation.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: Address }),\n    field({ decoder: Address, nullable: true, version: 146, downgrade: (v) => {\n            if (!v) {\n                return Address.createDefault();\n            }\n            return v;\n        } })\n], ProductLocation.prototype, \"address\", void 0);\n/**\n * This includes a time for a ticket (will be visible on the ticket)\n */\nexport class ProductDateRange extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.startDate = new Date();\n        this.endDate = new Date();\n    }\n    toString() {\n        return Formatter.dateRange(this.startDate, this.endDate);\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], ProductDateRange.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], ProductDateRange.prototype, \"startDate\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], ProductDateRange.prototype, \"endDate\", void 0);\nexport class Product extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.description = '';\n        this.enabled = true;\n        this.hidden = false;\n        /**\n         * Allow to order multiple pieces of the same product combination\n         */\n        this.allowMultiple = true;\n        /**\n         * Only allow one piece per product combination\n         */\n        this.unique = false;\n        this.enableAfter = null;\n        this.disableAfter = null;\n        this.images = [];\n        this.customFields = [];\n        this.type = ProductType.Product;\n        this.location = null;\n        this.dateRange = null;\n        this.seatingPlanId = null;\n        this.reservedSeats = [];\n        /**\n         * WIP: not yet supported\n         * Set to true if you need to have a name for every ordered product. When this is true, you can't order this product mutliple times with the same name.\n         * + will validate the name better\n         */\n        this.askName = false;\n        /**\n         * Maximum amount per order\n         */\n        this.maxPerOrder = null;\n        /**\n         * Total stock, excluding already sold items into account\n         */\n        this.stock = null;\n        this.usedStock = 0;\n        this.optionMenus = [];\n    }\n    get isEnabled() {\n        return this.enabled && !this.hidden && (!this.enableAfter || this.enableAfter <= new Date()) && (!this.disableAfter || this.disableAfter >= new Date());\n    }\n    get enableInFuture() {\n        return this.enabled && !this.hidden && this.enableAfter !== null && this.enableAfter > new Date() && (!this.disableAfter || this.disableAfter >= new Date());\n    }\n    get isTicket() {\n        return this.type === ProductType.Ticket || this.type === ProductType.Voucher;\n    }\n    clearStock() {\n        this.usedStock = 0;\n        this.reservedSeats = [];\n    }\n    get isSoldOut() {\n        return this.remainingStockWithOptions === 0;\n    }\n    /**\n     * Only accounts for the stock of the product itself, not the stock of the options\n     */\n    get remainingStock() {\n        if (this.stock === null) {\n            return null;\n        }\n        return Math.max(0, this.stock - this.usedStock);\n    }\n    /**\n     * Accounts for options and prices too\n     */\n    get remainingStockWithOptions() {\n        const stocks = [];\n        if (this.remainingStock !== null) {\n            stocks.push(this.remainingStock);\n        }\n        let priceStocks = [];\n        for (const price of this.prices) {\n            if (price.remainingStock !== null) {\n                priceStocks.push(price.remainingStock);\n            }\n            else {\n                // Infinite stock for at least one price = no price stock\n                priceStocks = [];\n                break;\n            }\n        }\n        if (priceStocks.length) {\n            stocks.push(Math.max(...priceStocks));\n        }\n        for (const menu of this.optionMenus) {\n            if (!menu.multipleChoice) {\n                // Required to pick one\n                // We need to pick the maximum of the option stock\n                let menuStocks = [];\n                for (const option of menu.options) {\n                    if (option.remainingStock !== null) {\n                        menuStocks.push(option.remainingStock);\n                    }\n                    else {\n                        // Infinite stock for at least one option = no menu stock\n                        menuStocks = [];\n                        break;\n                    }\n                }\n                if (menuStocks.length) {\n                    stocks.push(Math.max(...menuStocks));\n                }\n            }\n        }\n        if (stocks.length === 0) {\n            return null;\n        }\n        return Math.min(...stocks);\n    }\n    getRemainingSeats(webshop, isAdmin) {\n        if (this.seatingPlanId === null) {\n            return null;\n        }\n        const seatingPlan = webshop.meta.seatingPlans.find(p => p.id === this.seatingPlanId);\n        if (!seatingPlan) {\n            return null;\n        }\n        if (isAdmin) {\n            return seatingPlan.seatCount - this.reservedSeats.length;\n        }\n        return seatingPlan.seatCount - seatingPlan.adminSeatCount - this.reservedSeats.filter(r => !seatingPlan.isAdminSeat(r)).length;\n    }\n    /**\n     * Whether it is not possibel to add multiple different items of this product to the cart, or whether this product supports multiple items in the cart.\n     * Controls whether cart is edited by default or updated when clicking it open in the webshop.\n     */\n    get isUnique() {\n        if (this.maxPerOrder === 1) {\n            return true;\n        }\n        // No choice options\n        if (this.optionMenus.length === 0 && this.prices.length <= 1 && this.customFields.length === 0) {\n            return true;\n        }\n        return false;\n    }\n    getRemainingStockText(stock) {\n        if (stock === 1) {\n            if (this.type === ProductType.Ticket) {\n                return 'één ticket';\n            }\n            if (this.type === ProductType.Person) {\n                return 'één persoon';\n            }\n            return 'één stuk';\n        }\n        if (this.type === ProductType.Ticket) {\n            return stock + ' tickets';\n        }\n        if (this.type === ProductType.Person) {\n            return stock + ' personen';\n        }\n        return stock + ' stuks';\n    }\n    get stockText() {\n        if (this.remainingStockWithOptions === null || this.remainingStockWithOptions > 25) {\n            return null;\n        }\n        if (this.remainingStockWithOptions === 0) {\n            return 'Uitverkocht';\n        }\n        return 'Nog ' + this.getRemainingStockText(this.remainingStockWithOptions);\n    }\n    get isEnabledTextLong() {\n        if (this.hidden) {\n            return 'Verborgen';\n        }\n        if (!this.enabled) {\n            return 'Onbeschikbaar';\n        }\n        if (this.enableInFuture && this.enableAfter) {\n            if (this.disableAfter) {\n                return 'Beschikbaar vanaf ' + Formatter.dateTime(this.enableAfter) + ' tot ' + Formatter.dateTime(this.disableAfter);\n            }\n            return 'Beschikbaar vanaf ' + Formatter.dateTime(this.enableAfter);\n        }\n        if (!this.isEnabled) {\n            return 'Onbeschikbaar';\n        }\n        if (this.disableAfter) {\n            return 'Beschikbaar tot ' + Formatter.dateTime(this.disableAfter);\n        }\n    }\n    get closesSoonText() {\n        if (!this.isEnabled) {\n            return null;\n        }\n        if (this.disableAfter) {\n            const diff = this.disableAfter.getTime() - new Date().getTime();\n            if (diff < 24 * 60 * 60 * 1000) {\n                return 'Beschikbaar tot ' + Formatter.time(this.disableAfter);\n            }\n        }\n        return null;\n    }\n    filteredPrices(options) {\n        if (options.admin) {\n            return this.prices;\n        }\n        return this.prices.filter(p => !p.hidden);\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], Product.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Product.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Product.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], Product.prototype, \"enabled\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 172 })\n], Product.prototype, \"hidden\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 173 })\n], Product.prototype, \"allowMultiple\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 173 })\n], Product.prototype, \"unique\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 172 })\n], Product.prototype, \"enableAfter\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 172 })\n], Product.prototype, \"disableAfter\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Image) })\n], Product.prototype, \"images\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(WebshopField), version: 94 })\n], Product.prototype, \"customFields\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(ProductType) })\n], Product.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: ProductLocation, nullable: true, version: 105 })\n], Product.prototype, \"location\", void 0);\n__decorate([\n    field({ decoder: ProductDateRange, nullable: true, version: 105 })\n], Product.prototype, \"dateRange\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 211 })\n], Product.prototype, \"seatingPlanId\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(ReservedSeat), nullable: true, version: 211 })\n], Product.prototype, \"reservedSeats\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, optional: true })\n], Product.prototype, \"askName\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 171 })\n], Product.prototype, \"maxPerOrder\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], Product.prototype, \"stock\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], Product.prototype, \"usedStock\", void 0);\n__decorate([\n    field({\n        decoder: new ArrayDecoder(ProductPrice),\n        defaultValue: () => [\n            ProductPrice.create({\n                name: '',\n                price: 0,\n            }),\n        ],\n    })\n], Product.prototype, \"prices\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(OptionMenu) })\n], Product.prototype, \"optionMenus\", void 0);\n//# sourceMappingURL=Product.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { File } from './files/File.js';\nexport class Policy extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        /**\n         * Set either file or url for the policy. If both are set, the url has priority\n         */\n        this.file = null;\n        this.url = null;\n    }\n    get calculatedUrl() {\n        var _a, _b;\n        if (this.url !== null) {\n            return this.url;\n        }\n        return (_b = (_a = this.file) === null || _a === void 0 ? void 0 : _a.getPublicPath()) !== null && _b !== void 0 ? _b : '';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], Policy.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Policy.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: File, nullable: true, version: 25 })\n], Policy.prototype, \"file\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 25 })\n], Policy.prototype, \"url\", void 0);\n//# sourceMappingURL=Policy.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Image } from './files/Image.js';\nexport class Sponsor extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.url = null;\n        this.name = '';\n        this.logo = null;\n        this.banner = null;\n        this.onTickets = false;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], Sponsor.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], Sponsor.prototype, \"url\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Sponsor.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true })\n], Sponsor.prototype, \"logo\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true, optional: true })\n], Sponsor.prototype, \"banner\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, optional: true })\n], Sponsor.prototype, \"onTickets\", void 0);\nexport class SponsorConfig extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.sponsors = [];\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(Sponsor) })\n], SponsorConfig.prototype, \"sponsors\", void 0);\n//# sourceMappingURL=SponsorConfig.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, EnumDecoder, IntegerDecoder, MapDecoder, StringDecoder, field } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Formatter } from '@stamhoofd/utility';\nexport var OptionSelectionRequirement;\n(function (OptionSelectionRequirement) {\n    OptionSelectionRequirement[\"Required\"] = \"Required\";\n    OptionSelectionRequirement[\"Optional\"] = \"Optional\";\n    OptionSelectionRequirement[\"Excluded\"] = \"Excluded\";\n})(OptionSelectionRequirement || (OptionSelectionRequirement = {}));\nexport class OptionSelectionRequirementHelper {\n    static getName(requirement) {\n        switch (requirement) {\n            case OptionSelectionRequirement.Required: return 'Enkel met';\n            case OptionSelectionRequirement.Optional: return 'Met of zonder';\n            case OptionSelectionRequirement.Excluded: return 'Enkel zonder';\n        }\n    }\n}\nexport class ProductSelector extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Empty array = doesn't matter\n         * Array set = required one of the product prices from the list\n         */\n        this.productPriceIds = [];\n        /**\n         * Options that are missing in the list get a default value\n         * depending whether the option menu is multiple choice or not.\n         *\n         * For multiple choice:\n         * - new options are optional\n         *\n         * For choose one:\n         * - new options are exluded unless all options are optional\n         */\n        this.optionIds = new Map();\n    }\n    getOptionRequirement(optionMenu, option) {\n        var _a;\n        const value = this.optionIds.get(option.id);\n        if (!value) {\n            if (optionMenu.multipleChoice) {\n                return OptionSelectionRequirement.Optional;\n            }\n            else {\n                for (const o of optionMenu.options) {\n                    if ((_a = this.optionIds.get(o.id)) !== null && _a !== void 0 ? _a : OptionSelectionRequirement.Optional !== OptionSelectionRequirement.Optional) {\n                        return OptionSelectionRequirement.Excluded;\n                    }\n                }\n                return OptionSelectionRequirement.Optional;\n            }\n        }\n        return value;\n    }\n    doesMatch(cartItem) {\n        if (cartItem.product.id !== this.productId) {\n            return false;\n        }\n        if (this.productPriceIds.includes(cartItem.productPrice.id)) {\n            return false;\n        }\n        for (const option of cartItem.options) {\n            const value = this.getOptionRequirement(option.optionMenu, option.option);\n            if (value === OptionSelectionRequirement.Excluded) {\n                return false;\n            }\n        }\n        for (const [id, requirement] of this.optionIds) {\n            if (requirement === OptionSelectionRequirement.Required) {\n                const found = cartItem.options.find(o => o.option.id === id);\n                if (!found) {\n                    return false;\n                }\n            }\n        }\n        return true;\n    }\n    getName(webshop, isAdmin = false) {\n        const product = webshop.products.find(p => p.id === this.productId);\n        if (!product) {\n            return {\n                name: 'Onbekend artikel',\n                footnote: '',\n            };\n        }\n        const allPrices = product.filteredPrices({ admin: isAdmin });\n        const productPrices = allPrices.filter(p => this.productPriceIds.includes(p.id));\n        let suffix = '';\n        if (allPrices.length > 1 && this.productPriceIds.length && productPrices.length < allPrices.length) {\n            suffix = productPrices.map(p => p.name).join(', ');\n        }\n        let footnote = '';\n        const excludedOptions = product.optionMenus.flatMap((menu) => {\n            return menu.options.filter(o => this.getOptionRequirement(menu, o) === OptionSelectionRequirement.Excluded);\n        });\n        const requiredOptions = product.optionMenus.flatMap((menu) => {\n            return menu.options.filter(o => this.getOptionRequirement(menu, o) === OptionSelectionRequirement.Required);\n        });\n        if (excludedOptions.length && requiredOptions.length === 0) {\n            footnote = 'Behalve voor keuzes met ' + Formatter.joinLast(excludedOptions.map(o => o.name), ', ', ' of ');\n        }\n        else if (excludedOptions.length === 0 && requiredOptions.length) {\n            footnote = 'Enkel indien gekozen voor ' + Formatter.joinLast(requiredOptions.map(o => o.name), ', ', ' en ');\n        }\n        else if (excludedOptions.length && requiredOptions.length) {\n            footnote = 'Enkel indien gekozen voor ' + Formatter.joinLast(requiredOptions.map(o => o.name), ', ', ' en ') + ' en niet gekozen voor ' + Formatter.joinLast(excludedOptions.map(o => o.name), ', ', ' of ');\n        }\n        return {\n            name: product.name + (suffix ? (' (' + suffix + ')') : ''),\n            footnote,\n        };\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], ProductSelector.prototype, \"productId\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder) })\n], ProductSelector.prototype, \"productPriceIds\", void 0);\n__decorate([\n    field({ decoder: new MapDecoder(StringDecoder, new EnumDecoder(OptionSelectionRequirement)) })\n], ProductSelector.prototype, \"optionIds\", void 0);\nexport class DiscountRequirement extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Minimum amount to trigger this requirement\n         */\n        this.amount = 1;\n    }\n    /**\n     * Requirements can match multiple times (for X + Y discount systems)\n     */\n    getMatchCount(checkout) {\n        if (this.amount === 0) {\n            return 0;\n        }\n        let amount = 0;\n        for (const item of checkout.cart.items) {\n            if (this.product.doesMatch(item)) {\n                amount += item.amount;\n            }\n        }\n        return Math.floor(amount / this.amount);\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], DiscountRequirement.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: ProductSelector })\n], DiscountRequirement.prototype, \"product\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], DiscountRequirement.prototype, \"amount\", void 0);\nexport class GeneralDiscount extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Fixed discount on order\n         */\n        this.fixedDiscount = 0;\n        /**\n         * Percentage discount on order, in pertenthousand 1 / 10 000\n         * 10 = 0,1% discount\n         * 1 = 0,01% discount\n         */\n        this.percentageDiscount = 0;\n    }\n    multiply(amount) {\n        return GeneralDiscount.create({\n            fixedDiscount: Math.round(this.fixedDiscount * amount),\n            percentageDiscount: Math.round(this.percentageDiscount * amount),\n        });\n    }\n}\n__decorate([\n    field({ decoder: IntegerDecoder })\n], GeneralDiscount.prototype, \"fixedDiscount\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], GeneralDiscount.prototype, \"percentageDiscount\", void 0);\nexport class ProductDiscount extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.discountPerPiece = 0;\n        /**\n         * Percentage discount on order, in pertenthousand 1 / 10 000\n         * 10 = 0,1% discount\n         * 1 = 0,01% discount\n         */\n        this.percentageDiscount = 0;\n    }\n    calculate(price) {\n        price = Math.min(price, Math.max(0, Math.round(price * (10000 - this.percentageDiscount) / 10000))); // Min is required to support negative prices: prices should never increase after applyign discounts\n        price = Math.min(price, Math.max(0, price - this.discountPerPiece)); // Min is required to support negative prices: prices should never increase after applyign discounts\n        return price;\n    }\n    applyTo(item) {\n        // Percentage discounts are always applied to the original price without other discounts\n        item.percentageDiscount = Math.min(10000, item.percentageDiscount + this.percentageDiscount);\n        item.fixedDiscount = item.fixedDiscount + this.discountPerPiece;\n    }\n    calculatePotential(item) {\n        const current = item;\n        const potential = item.clone();\n        this.applyTo(potential);\n        return current.discountedPrice - potential.discountedPrice;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], ProductDiscount.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], ProductDiscount.prototype, \"discountPerPiece\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], ProductDiscount.prototype, \"percentageDiscount\", void 0);\nexport var ProductDiscountRepeatBehaviour;\n(function (ProductDiscountRepeatBehaviour) {\n    ProductDiscountRepeatBehaviour[\"Once\"] = \"Once\";\n    ProductDiscountRepeatBehaviour[\"RepeatLast\"] = \"RepeatLast\";\n    ProductDiscountRepeatBehaviour[\"RepeatPattern\"] = \"RepeatPattern\";\n})(ProductDiscountRepeatBehaviour || (ProductDiscountRepeatBehaviour = {}));\nexport class ProductDiscountSettings extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.discounts = [ProductDiscount.create({})];\n        this.repeatBehaviour = ProductDiscountRepeatBehaviour.Once;\n        this.cartLabel = null;\n    }\n    getApplicableDiscounts(offset, amount) {\n        const d = this.discounts.slice();\n        if (this.repeatBehaviour === ProductDiscountRepeatBehaviour.RepeatLast) {\n            while (d.length < offset + amount) {\n                d.push(this.discounts[this.discounts.length - 1]);\n            }\n        }\n        else if (this.repeatBehaviour === ProductDiscountRepeatBehaviour.RepeatPattern) {\n            while (d.length < offset + amount) {\n                d.push(this.discounts[d.length % this.discounts.length]);\n            }\n        }\n        return d.slice(offset, offset + amount);\n    }\n    getTitle(webshop, isAdmin = false) {\n        const n = this.product.getName(webshop, isAdmin);\n        const titles = [n.name];\n        let descriptions = [];\n        const footnotes = [];\n        if (n.footnote) {\n            const index = '*'.repeat(footnotes.length + 1);\n            titles.push(index);\n            footnotes.push(index + ' ' + n.footnote);\n        }\n        if (this.cartLabel) {\n            descriptions.push(this.cartLabel);\n        }\n        else if (this.discounts.length === 1) {\n            const discount = this.discounts[0];\n            if (discount.percentageDiscount) {\n                if (discount.percentageDiscount >= 100 * 100) {\n                    if (this.repeatBehaviour !== ProductDiscountRepeatBehaviour.Once) {\n                        descriptions.push('Gratis');\n                    }\n                    else {\n                        descriptions.push('Eén stuk gratis');\n                    }\n                }\n                else {\n                    if (this.repeatBehaviour !== ProductDiscountRepeatBehaviour.Once) {\n                        descriptions.push(Formatter.percentage(discount.percentageDiscount) + ' korting');\n                    }\n                    else {\n                        descriptions.push('Eén keer ' + Formatter.percentage(discount.percentageDiscount) + ' korting');\n                    }\n                }\n            }\n            if (discount.discountPerPiece) {\n                if (this.repeatBehaviour !== ProductDiscountRepeatBehaviour.Once) {\n                    descriptions.push(Formatter.price(discount.discountPerPiece) + ' korting per stuk');\n                }\n                else {\n                    descriptions.push('Eén keer ' + Formatter.price(discount.discountPerPiece) + ' korting');\n                }\n            }\n        }\n        else {\n            let index = 0;\n            for (const discount of this.repeatBehaviour === ProductDiscountRepeatBehaviour.RepeatPattern ? [...this.discounts, ...this.discounts, ...this.discounts] : this.discounts) {\n                index += 1;\n                let s = Formatter.ordinalNumber(index) + ' stuk';\n                if (index === this.discounts.length) {\n                    if (this.repeatBehaviour === ProductDiscountRepeatBehaviour.RepeatLast) {\n                        if (descriptions.length > 0) {\n                            s = 'overige stuks';\n                        }\n                        else {\n                            s = 'vanaf ' + s;\n                        }\n                    }\n                }\n                if (discount.percentageDiscount) {\n                    if (discount.percentageDiscount >= 100 * 100) {\n                        descriptions.push(s + ' gratis');\n                    }\n                    else {\n                        descriptions.push(Formatter.percentage(discount.percentageDiscount) + ' korting op ' + s);\n                    }\n                }\n                if (discount.discountPerPiece) {\n                    descriptions.push(Formatter.price(discount.discountPerPiece) + ' korting op ' + s);\n                }\n            }\n            if (this.repeatBehaviour === ProductDiscountRepeatBehaviour.RepeatPattern) {\n                if (descriptions.length === 3 && this.discounts[this.discounts.length - 1].percentageDiscount === 100 * 100) {\n                    descriptions = [(this.discounts.length - 1) + ' + 1 gratis'];\n                }\n                else {\n                    descriptions.push('...');\n                }\n            }\n        }\n        if (descriptions.length === 0) {\n            descriptions.push('Geen korting');\n        }\n        return {\n            title: titles.join(' '),\n            description: Formatter.capitalizeFirstLetter(Formatter.joinLast(descriptions, ', ', ' en ')),\n            footnote: footnotes.join('\\n'),\n        };\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], ProductDiscountSettings.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: ProductSelector })\n], ProductDiscountSettings.prototype, \"product\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(ProductDiscount) })\n], ProductDiscountSettings.prototype, \"discounts\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(ProductDiscountRepeatBehaviour) })\n], ProductDiscountSettings.prototype, \"repeatBehaviour\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 238 })\n], ProductDiscountSettings.prototype, \"cartLabel\", void 0);\nexport class ProductDiscountTracker {\n    constructor(discount) {\n        this.usageCount = 0;\n        this.cartItemQueue = [];\n        this.discount = discount;\n    }\n    getNextDiscount(offset = 0) {\n        const d = this.discount.getApplicableDiscounts(this.usageCount + offset, 1);\n        if (d.length === 1) {\n            return d[0];\n        }\n        return null;\n    }\n    sortQueue() {\n        // Sort queue from highest price to lowest price\n        this.cartItemQueue.sort((a, b) => b.price.discountedPrice - a.price.discountedPrice);\n    }\n    apply() {\n        // Make sure we use the next one in the discount applicable discounts\n        this.sortQueue();\n        const item = this.cartItemQueue.shift();\n        if (item) {\n            const discount = this.getNextDiscount();\n            if (discount) {\n                const potential = discount.calculatePotential(item.price);\n                this.usageCount += 1;\n                discount.applyTo(item.price);\n                if (potential > 0 && !item.item.discounts.find(d => d.id === this.discount.id)) {\n                    item.item.discounts.push(this.discount);\n                }\n            }\n        }\n    }\n    addItemToQueue(cartItem) {\n        this.cartItemQueue.push(...cartItem.calculatedPrices.map((price) => {\n            return { price, item: cartItem };\n        }));\n    }\n    getPotentialDiscount() {\n        let offset = 0;\n        let potential = 0;\n        this.sortQueue();\n        for (const item of this.cartItemQueue) {\n            const d = this.getNextDiscount(offset);\n            if (d) {\n                potential += d.calculatePotential(item.price);\n            }\n            else {\n                break;\n            }\n            offset += 1;\n        }\n        return potential;\n    }\n}\nexport class Discount extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Empty list = no requirements\n         */\n        this.requirements = [];\n        /**\n         * If the requirements match x times, apply the discount x times\n         */\n        this.applyMultipleTimes = false;\n        this.orderDiscount = GeneralDiscount.create({});\n        this.productDiscounts = [];\n    }\n    getTitle(webshop, isAdmin = false) {\n        const titles = [];\n        const footnotes = [];\n        const descriptions = [];\n        if (this.orderDiscount.percentageDiscount) {\n            titles.push(Formatter.percentage(this.orderDiscount.percentageDiscount) + ' korting');\n        }\n        if (this.orderDiscount.fixedDiscount) {\n            titles.push(Formatter.price(this.orderDiscount.fixedDiscount) + ' korting');\n        }\n        for (const productDiscount of this.productDiscounts) {\n            const t = productDiscount.getTitle(webshop, isAdmin);\n            titles.push(t.description + ' op ' + t.title);\n            if (t.footnote) {\n                footnotes.push(t.footnote);\n            }\n        }\n        if (titles.length === 0) {\n            return {\n                title: 'Geen korting',\n                description: '',\n                footnote: '',\n            };\n        }\n        if (this.requirements.length) {\n            if (this.applyMultipleTimes) {\n                if (this.requirements.length > 1) {\n                    descriptions.push('Per bestelde combinatie van');\n                }\n                else {\n                    descriptions.push('Per besteld');\n                }\n            }\n            else {\n                descriptions.push('Bij bestellen van minstens');\n            }\n            const subdescriptions = [];\n            for (const requirement of this.requirements) {\n                const n = requirement.product.getName(webshop, isAdmin);\n                subdescriptions.push(requirement.amount + ' x ' + n.name);\n                if (n.footnote) {\n                    const index = '*'.repeat(footnotes.length + 1);\n                    subdescriptions[subdescriptions.length - 1] = subdescriptions[subdescriptions.length - 1] + index;\n                    footnotes.push(index + ' ' + n.footnote);\n                }\n            }\n            descriptions.push(Formatter.joinLast(subdescriptions, ', ', ' en '));\n        }\n        return {\n            title: titles.join(' '),\n            description: descriptions.join(' '),\n            footnote: footnotes.join('\\n'),\n        };\n    }\n    applyToCheckout(checkout) {\n        let matchCount = null;\n        if (this.requirements.length > 0) {\n            for (const requirement of this.requirements) {\n                const amount = requirement.getMatchCount(checkout);\n                if (amount === 0) {\n                    // Not applicable\n                    return [];\n                }\n                matchCount = matchCount === null ? amount : Math.min(amount, matchCount);\n            }\n        }\n        if (matchCount === null) {\n            matchCount = 1;\n        }\n        if (!this.applyMultipleTimes) {\n            matchCount = 1;\n        }\n        // Fixed part to the whole order\n        const multipliedOrderDiscount = this.orderDiscount.multiply(matchCount !== null && matchCount !== void 0 ? matchCount : 1);\n        checkout.fixedDiscount += multipliedOrderDiscount.fixedDiscount;\n        checkout.percentageDiscount = Math.min(10000, checkout.percentageDiscount + multipliedOrderDiscount.percentageDiscount);\n        const trackers = [];\n        // Per product\n        for (const discount of this.productDiscounts) {\n            for (let index = 0; index < matchCount; index++) {\n                const tracker = new ProductDiscountTracker(discount);\n                for (const item of checkout.cart.items) {\n                    if (discount.product.doesMatch(item)) {\n                        tracker.addItemToQueue(item);\n                        // item.applicableDiscounts.push(tracker);\n                    }\n                }\n                trackers.push(tracker);\n            }\n        }\n        return trackers;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], Discount.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(DiscountRequirement) })\n], Discount.prototype, \"requirements\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], Discount.prototype, \"applyMultipleTimes\", void 0);\n__decorate([\n    field({ decoder: GeneralDiscount })\n], Discount.prototype, \"orderDiscount\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(ProductDiscountSettings) })\n], Discount.prototype, \"productDiscounts\", void 0);\n//# sourceMappingURL=Discount.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, DateDecoder, EnumDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { Colors, Formatter } from '@stamhoofd/utility';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Address } from '../addresses/Address.js';\nimport { City } from '../addresses/City.js';\nimport { CountryDecoder } from '../addresses/CountryDecoder.js';\nimport { Province } from '../addresses/Province.js';\nimport { DNSRecord, DNSRecordType } from '../DNSRecord.js';\nimport { Replacement } from '../endpoints/EmailRequest.js';\nimport { Image } from '../files/Image.js';\nimport { RecordCategory } from '../members/records/RecordCategory.js';\nimport { PaymentConfiguration, PrivatePaymentConfiguration } from '../PaymentConfiguration.js';\nimport { PaymentMethod } from '../PaymentMethod.js';\nimport { PermissionsByRole } from '../PermissionsByRole.js';\nimport { Policy } from '../Policy.js';\nimport { RichText } from '../RichText.js';\nimport { SeatingPlan } from '../SeatingPlan.js';\nimport { SponsorConfig } from '../SponsorConfig.js';\nimport { Discount } from './Discount.js';\nimport { TransferSettings } from './TransferSettings.js';\nimport { WebshopField } from './WebshopField.js';\nexport var WebshopLayout;\n(function (WebshopLayout) {\n    WebshopLayout[\"Default\"] = \"Default\";\n    WebshopLayout[\"Split\"] = \"Split\";\n})(WebshopLayout || (WebshopLayout = {}));\nexport var DarkMode;\n(function (DarkMode) {\n    DarkMode[\"Off\"] = \"Off\";\n    DarkMode[\"On\"] = \"On\";\n    DarkMode[\"Auto\"] = \"Auto\";\n})(DarkMode || (DarkMode = {}));\nexport class WebshopTimeSlot extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Saved in minutes since midnight\n         */\n        this.startTime = 12 * 60;\n        /**\n         * Saved in minutes since midnight (so can also keep going after midnight to indicate an event that keeps going until e.g. 03:00)\n         */\n        this.endTime = 14 * 60;\n        this.maxOrders = null;\n        this.usedOrders = 0;\n        this.maxPersons = null;\n        this.usedPersons = 0;\n    }\n    get remainingOrders() {\n        if (this.maxOrders === null) {\n            return null;\n        }\n        return Math.max(0, this.maxOrders - this.usedOrders);\n    }\n    get remainingPersons() {\n        if (this.maxPersons === null) {\n            return null;\n        }\n        return Math.max(0, this.maxPersons - this.usedPersons);\n    }\n    /**\n     * In case maxPersons and maxOrders are used at the same time, try to transform it onto 1 number of remainign 'stock' for this timeslot,\n     * which will be visible for customers\n     */\n    get listedRemainingStock() {\n        const remainingOrders = this.remainingOrders;\n        const remainingPersons = this.remainingPersons;\n        if (remainingOrders === null && remainingPersons === null) {\n            return null;\n        }\n        if (remainingPersons === null) {\n            return remainingOrders;\n        }\n        if (remainingOrders === null) {\n            return remainingPersons;\n        }\n        if (remainingPersons === 0 || remainingOrders === 0) {\n            return 0;\n        }\n        // If we still have at least one remaining order, the remaining persons always is the number we need to show\n        return remainingPersons;\n    }\n    static sort(a, b) {\n        const aa = Formatter.dateIso(a.date) + ' ' + Formatter.minutesPadded(a.startTime) + ' ' + Formatter.minutesPadded(a.endTime);\n        const bb = Formatter.dateIso(b.date) + ' ' + Formatter.minutesPadded(b.startTime) + ' ' + Formatter.minutesPadded(b.endTime);\n        if (aa < bb) {\n            return -1;\n        }\n        if (aa > bb) {\n            return 1;\n        }\n        return 0;\n    }\n    /**\n     * Index for sorting on both start and end time\n     */\n    get timeIndex() {\n        return Formatter.timeIndex(this.startTime) + Formatter.timeIndex(this.endTime);\n    }\n    toString() {\n        return this.dateString() + ', ' + this.timeRangeString();\n    }\n    dateString() {\n        return Formatter.dateWithDay(this.date);\n    }\n    dateStringShort() {\n        return Formatter.date(this.date);\n    }\n    timeRangeString() {\n        return Formatter.minutes(this.startTime) + ' - ' + Formatter.minutes(this.endTime);\n    }\n    clearStock() {\n        this.usedOrders = 0;\n        this.usedPersons = 0;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], WebshopTimeSlot.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], WebshopTimeSlot.prototype, \"date\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], WebshopTimeSlot.prototype, \"startTime\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], WebshopTimeSlot.prototype, \"endTime\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 143 })\n], WebshopTimeSlot.prototype, \"maxOrders\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 143 })\n], WebshopTimeSlot.prototype, \"usedOrders\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 143 })\n], WebshopTimeSlot.prototype, \"maxPersons\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 143 })\n], WebshopTimeSlot.prototype, \"usedPersons\", void 0);\n/**\n * Configuration to keep track of available time slots. Can be a fixed number or an infinite amount of time slots\n */\nexport class WebshopTimeSlots extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.timeSlots = [];\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(WebshopTimeSlot) })\n], WebshopTimeSlots.prototype, \"timeSlots\", void 0);\nexport var CheckoutMethodType;\n(function (CheckoutMethodType) {\n    CheckoutMethodType[\"OnSite\"] = \"OnSite\";\n    CheckoutMethodType[\"Takeout\"] = \"Takeout\";\n    CheckoutMethodType[\"Delivery\"] = \"Delivery\";\n})(CheckoutMethodType || (CheckoutMethodType = {}));\nexport class CheckoutMethodTypeHelper {\n    static getName(type) {\n        switch (type) {\n            case CheckoutMethodType.OnSite:\n                return 'Ter plaatse consumeren';\n            case CheckoutMethodType.Takeout:\n                return 'Afhalen';\n            case CheckoutMethodType.Delivery:\n                return 'Leveren';\n        }\n    }\n}\nexport class CheckoutMethod extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.description = '';\n        this.timeSlots = WebshopTimeSlots.create({});\n    }\n    get typeName() {\n        return CheckoutMethodTypeHelper.getName(this.type);\n    }\n    clearStock() {\n        for (const slot of this.timeSlots.timeSlots) {\n            slot.clearStock();\n        }\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], CheckoutMethod.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(CheckoutMethodType) })\n], CheckoutMethod.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], CheckoutMethod.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], CheckoutMethod.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: WebshopTimeSlots })\n], CheckoutMethod.prototype, \"timeSlots\", void 0);\nexport class WebshopTakeoutMethod extends CheckoutMethod {\n    constructor() {\n        super(...arguments);\n        this.type = CheckoutMethodType.Takeout;\n    }\n}\n__decorate([\n    field({ decoder: new EnumDecoder(CheckoutMethodType), patchDefaultValue: () => CheckoutMethodType.Takeout }) // patchDefaultVAlue -> to include this value in all patches and make sure we can recognize the type of the patch\n], WebshopTakeoutMethod.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: Address })\n], WebshopTakeoutMethod.prototype, \"address\", void 0);\n/**\n * Choose a location and time to eat / consume the order\n */\nexport class WebshopOnSiteMethod extends CheckoutMethod {\n    constructor() {\n        super(...arguments);\n        // Indicate this field exists for all versions, but the downgrade should get executed\n        this.type = CheckoutMethodType.OnSite;\n    }\n}\n__decorate([\n    field({ decoder: new EnumDecoder(CheckoutMethodType) }),\n    field({\n        decoder: new EnumDecoder(CheckoutMethodType),\n        version: 105, downgrade: () => {\n            // Return takeout method for old clients\n            return CheckoutMethodType.Takeout;\n        },\n        patchDefaultValue: () => CheckoutMethodType.OnSite,\n    }) // patchDefaultVAlue -> to include this value in all patches and make sure we can recognize the type of the patch\n], WebshopOnSiteMethod.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: Address })\n], WebshopOnSiteMethod.prototype, \"address\", void 0);\n/**\n * If you want to have some sort of cost (e.g. delivery cost that is variable depending on the cart value)\n */\nexport class CheckoutMethodPrice extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.price = 0;\n        /**\n         * At what price of the cart the discount price should be used instead.\n         * If it is null, the discount price will never get used\n         */\n        this.minimumPrice = null;\n        this.discountPrice = 0;\n    }\n}\n__decorate([\n    field({ decoder: IntegerDecoder })\n], CheckoutMethodPrice.prototype, \"price\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], CheckoutMethodPrice.prototype, \"minimumPrice\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], CheckoutMethodPrice.prototype, \"discountPrice\", void 0);\nexport class WebshopDeliveryMethod extends CheckoutMethod {\n    constructor() {\n        super(...arguments);\n        this.type = CheckoutMethodType.Delivery;\n        this.price = CheckoutMethodPrice.create({});\n        this.cities = [];\n        this.provinces = [];\n        this.countries = [];\n    }\n}\n__decorate([\n    field({ decoder: new EnumDecoder(CheckoutMethodType), patchDefaultValue: () => CheckoutMethodType.Delivery }) // patchDefaultVAlue -> to include this value in all patches and make sure we can recognize the type of the patch\n], WebshopDeliveryMethod.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: CheckoutMethodPrice, version: 45 })\n], WebshopDeliveryMethod.prototype, \"price\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(City), version: 46 })\n], WebshopDeliveryMethod.prototype, \"cities\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Province), version: 46 })\n], WebshopDeliveryMethod.prototype, \"provinces\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(CountryDecoder), version: 46 })\n], WebshopDeliveryMethod.prototype, \"countries\", void 0);\nexport class AnyCheckoutMethodPatchDecoder {\n    static decode(data) {\n        const base = data.decode(CheckoutMethod.patchType());\n        if (base.type === CheckoutMethodType.Takeout) {\n            return WebshopTakeoutMethod.patchType().decode(data);\n        }\n        if (base.type === CheckoutMethodType.Delivery) {\n            return WebshopDeliveryMethod.patchType().decode(data);\n        }\n        if (base.type === CheckoutMethodType.OnSite) {\n            return WebshopOnSiteMethod.patchType().decode(data);\n        }\n        throw new SimpleError({\n            code: 'invalid_field',\n            message: 'Unsupported checkout type in patch. Make sure checkout type is always set when patching.',\n            field: data.addToCurrentField('type'),\n        });\n    }\n    static patchType() {\n        // We never allow patches on this type\n        return AnyCheckoutMethodPatchDecoder;\n    }\n}\nexport class AnyCheckoutMethodDecoder {\n    static decode(data) {\n        const base = data.decode(CheckoutMethod);\n        if (base.type === CheckoutMethodType.Takeout) {\n            return WebshopTakeoutMethod.decode(data);\n        }\n        if (base.type === CheckoutMethodType.Delivery) {\n            return WebshopDeliveryMethod.decode(data);\n        }\n        if (base.type === CheckoutMethodType.OnSite) {\n            return WebshopOnSiteMethod.decode(data);\n        }\n        throw new SimpleError({\n            code: 'invalid_field',\n            message: 'Unsupported checkout type',\n            field: data.addToCurrentField('type'),\n        });\n    }\n    static patchType() {\n        // We never allow patches on this type\n        return AnyCheckoutMethodPatchDecoder;\n    }\n    static patchIdentifier() {\n        // We never allow patches on this type\n        return StringDecoder;\n    }\n}\nexport var WebshopTicketType;\n(function (WebshopTicketType) {\n    WebshopTicketType[\"None\"] = \"None\";\n    /**\n     * Create a single ticket for every order. Used to scan the order on takeout\n     */\n    WebshopTicketType[\"SingleTicket\"] = \"SingleTicket\";\n    /**\n     * Create a single ticket for every product in an order\n     * + this disables the use of checkout methods\n     * + this enables the use of locations and times on products\n     */\n    WebshopTicketType[\"Tickets\"] = \"Tickets\";\n})(WebshopTicketType || (WebshopTicketType = {}));\nexport var WebshopStatus;\n(function (WebshopStatus) {\n    WebshopStatus[\"Open\"] = \"Open\";\n    WebshopStatus[\"Closed\"] = \"Closed\";\n    WebshopStatus[\"Archived\"] = \"Archived\";\n})(WebshopStatus || (WebshopStatus = {}));\nexport var WebshopNumberingType;\n(function (WebshopNumberingType) {\n    WebshopNumberingType[\"Continuous\"] = \"Continuous\";\n    WebshopNumberingType[\"Random\"] = \"Random\";\n})(WebshopNumberingType || (WebshopNumberingType = {}));\nexport var WebshopAuthType;\n(function (WebshopAuthType) {\n    WebshopAuthType[\"Disabled\"] = \"Disabled\";\n    WebshopAuthType[\"Required\"] = \"Required\";\n})(WebshopAuthType || (WebshopAuthType = {}));\nexport class WebshopMetaData extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.title = '';\n        this.description = RichText.create({});\n        this.ticketType = WebshopTicketType.None;\n        this.coverPhoto = null;\n        this.allowComments = false;\n        this.phoneEnabled = true;\n        this.allowDiscountCodeEntry = false;\n        this.recordCategories = [];\n        /**\n         * @deprecated\n         */\n        this.customFields = [];\n        this.checkoutMethods = [];\n        this.seatingPlans = [];\n        this.reduceBranding = false;\n        this.defaultDiscounts = [];\n        /**\n         * @deprecated\n         * Use paymentConfiguration.paymentMethods instead\n         */\n        this.oldPaymentMethods = [PaymentMethod.Transfer];\n        /**\n         * @deprecated\n         * Use paymentConfiguration.transferSettings instead\n         */\n        this.oldTransferSettings = TransferSettings.create({});\n        this.paymentConfiguration = PaymentConfiguration.create({});\n        this.policies = [];\n        this.sponsors = null;\n        this.availableUntil = null;\n        this.openAt = null;\n        /**\n         * Manually close a webshop\n         */\n        this.status = WebshopStatus.Open;\n        this.layout = WebshopLayout.Default;\n        this.darkMode = DarkMode.Off;\n        this.color = null;\n        this.horizontalLogo = null;\n        this.squareLogo = null;\n        this.horizontalLogoDark = null;\n        this.squareLogoDark = null;\n        this.useLogo = false;\n        this.expandLogo = false;\n        this.cartEnabled = true;\n        /**\n         * Whether the domain name has been validated and is active. Only used to know if this domain should get used emails and in the dashboard.\n         * This is to prevent invalid url's from being used in emails.\n         * Lookups for a given domain still work if not active\n         */\n        this.domainActive = false;\n        this.authType = WebshopAuthType.Disabled;\n    }\n    /**\n     * @deprecated\n     * Use paymentConfiguration.paymentMethods instead\n     */\n    get paymentMethods() {\n        return this.paymentConfiguration.paymentMethods;\n    }\n    /**\n     * @deprecated\n     * Use paymentConfiguration.paymentMethods instead\n     */\n    get transferSettings() {\n        return this.paymentConfiguration.transferSettings;\n    }\n    get hasTickets() {\n        return this.ticketType === WebshopTicketType.SingleTicket || this.ticketType === WebshopTicketType.Tickets;\n    }\n    get hasSingleTickets() {\n        return this.ticketType === WebshopTicketType.SingleTicket;\n    }\n    getEmailReplacements() {\n        // Do not return a replacement in case we don't have a color (= default to organization color)\n        if (!this.color) {\n            return [];\n        }\n        return [\n            Replacement.create({\n                token: 'primaryColor',\n                value: this.color,\n            }),\n            Replacement.create({\n                token: 'primaryColorContrast',\n                value: this.color ? Colors.getContrastColor(this.color) : '#fff',\n            }),\n        ];\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], WebshopMetaData.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], WebshopMetaData.prototype, \"title\", void 0);\n__decorate([\n    field({ decoder: StringDecoder }),\n    field({ decoder: RichText, version: 181, upgrade: data => RichText.create({ text: data }), downgrade: data => data.text, upgradePatch: data => RichText.patch({ text: data }), downgradePatch: data => data.text })\n], WebshopMetaData.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(WebshopTicketType), version: 105 })\n], WebshopMetaData.prototype, \"ticketType\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true })\n], WebshopMetaData.prototype, \"coverPhoto\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 94 })\n], WebshopMetaData.prototype, \"allowComments\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, optional: true })\n], WebshopMetaData.prototype, \"phoneEnabled\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 242 })\n], WebshopMetaData.prototype, \"allowDiscountCodeEntry\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RecordCategory), optional: true })\n], WebshopMetaData.prototype, \"recordCategories\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(WebshopField), version: 94 })\n], WebshopMetaData.prototype, \"customFields\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(AnyCheckoutMethodDecoder) })\n], WebshopMetaData.prototype, \"checkoutMethods\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(SeatingPlan), version: 211 })\n], WebshopMetaData.prototype, \"seatingPlans\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 233, optional: true })\n], WebshopMetaData.prototype, \"reduceBranding\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Discount), version: 235 })\n], WebshopMetaData.prototype, \"defaultDiscounts\", void 0);\n__decorate([\n    field({\n        decoder: new ArrayDecoder(new EnumDecoder(PaymentMethod)),\n        version: 151,\n        field: 'paymentMethods',\n        optional: true, // We no longer expect this from the backend, so it can get removed in a future version\n    }),\n    field({\n        decoder: new ArrayDecoder(new EnumDecoder(PaymentMethod)),\n        version: 208,\n        field: 'oldPaymentMethods',\n        optional: true, // We no longer expect this from the backend, so it can get removed in a future version\n        downgrade: function () {\n            // This return value for old clients\n            return this.paymentMethods;\n        },\n    })\n], WebshopMetaData.prototype, \"oldPaymentMethods\", void 0);\n__decorate([\n    field({\n        decoder: TransferSettings,\n        version: 49,\n        field: 'transferSettings',\n        optional: true, // We no longer expect this from the backend, so it can get removed in a future version\n    }),\n    field({\n        decoder: TransferSettings,\n        version: 208,\n        field: 'oldTransferSettings',\n        optional: true, // We no longer expect this from the backend, so it can get removed in a future version\n        downgrade: function () {\n            // This return value for old clients\n            return this.transferSettings;\n        },\n    })\n], WebshopMetaData.prototype, \"oldTransferSettings\", void 0);\n__decorate([\n    field({\n        decoder: PaymentConfiguration,\n        version: 205,\n        upgrade: function () {\n            return PaymentConfiguration.create({\n                transferSettings: this.oldTransferSettings,\n                paymentMethods: this.oldPaymentMethods,\n            });\n        },\n    })\n], WebshopMetaData.prototype, \"paymentConfiguration\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Policy), version: 116 })\n], WebshopMetaData.prototype, \"policies\", void 0);\n__decorate([\n    field({ decoder: SponsorConfig, version: 226, nullable: true })\n], WebshopMetaData.prototype, \"sponsors\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 43 })\n], WebshopMetaData.prototype, \"availableUntil\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 170 })\n], WebshopMetaData.prototype, \"openAt\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(WebshopStatus), version: 136 })\n], WebshopMetaData.prototype, \"status\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(WebshopLayout), version: 180 })\n], WebshopMetaData.prototype, \"layout\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(DarkMode), version: 182 })\n], WebshopMetaData.prototype, \"darkMode\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 183 })\n], WebshopMetaData.prototype, \"color\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true, version: 183 })\n], WebshopMetaData.prototype, \"horizontalLogo\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true, version: 183 })\n], WebshopMetaData.prototype, \"squareLogo\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true, version: 183 })\n], WebshopMetaData.prototype, \"horizontalLogoDark\", void 0);\n__decorate([\n    field({ decoder: Image, nullable: true, version: 183 })\n], WebshopMetaData.prototype, \"squareLogoDark\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 184 })\n], WebshopMetaData.prototype, \"useLogo\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, optional: true, version: 183 })\n], WebshopMetaData.prototype, \"expandLogo\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 180 })\n], WebshopMetaData.prototype, \"cartEnabled\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 135 })\n], WebshopMetaData.prototype, \"domainActive\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(WebshopAuthType), version: 188 })\n], WebshopMetaData.prototype, \"authType\", void 0);\nexport class WebshopPrivateMetaData extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Automatically has full access\n         */\n        this.authorId = '';\n        /**\n         * @deprecated\n         * Use role resources instead\n         */\n        this.permissions = PermissionsByRole.create({});\n        /**\n         * @deprecated\n         * Use role resources instead\n         */\n        this.scanPermissions = PermissionsByRole.create({});\n        this.startNumber = 1;\n        /**\n         * DNS records that need to be set in order to activate mail domain and registration domain\n         */\n        this.dnsRecords = [];\n        this.defaultEmailId = null;\n        this.notificationEmails = [];\n        this.numberingType = WebshopNumberingType.Continuous;\n        this.paymentConfiguration = PrivatePaymentConfiguration.create({});\n    }\n    static buildDNSRecords(domain) {\n        if (!STAMHOOFD.domains.webshopCname) {\n            throw new SimpleError({\n                code: 'invalid_configuration',\n                message: 'Missing configuration for webshop domain',\n                human: 'Momenteel kan je geen eigen webshop domeinnaam instellen. Probeer het later opnieuw.',\n                statusCode: 500,\n            });\n        }\n        return [\n            DNSRecord.create({\n                type: DNSRecordType.CNAME,\n                name: domain + '.',\n                value: STAMHOOFD.domains.webshopCname + '.',\n            }),\n        ];\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, version: 59 })\n], WebshopPrivateMetaData.prototype, \"authorId\", void 0);\n__decorate([\n    field({ decoder: PermissionsByRole, version: 60, optional: true })\n], WebshopPrivateMetaData.prototype, \"permissions\", void 0);\n__decorate([\n    field({ decoder: PermissionsByRole, version: 202, optional: true })\n], WebshopPrivateMetaData.prototype, \"scanPermissions\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, optional: true }) // Made optional because of multi-branch addition\n], WebshopPrivateMetaData.prototype, \"startNumber\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(DNSRecord), version: 135 })\n], WebshopPrivateMetaData.prototype, \"dnsRecords\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 145 })\n], WebshopPrivateMetaData.prototype, \"defaultEmailId\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), version: 163 })\n], WebshopPrivateMetaData.prototype, \"notificationEmails\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(WebshopNumberingType), optional: true })\n], WebshopPrivateMetaData.prototype, \"numberingType\", void 0);\n__decorate([\n    field({ decoder: PrivatePaymentConfiguration, version: 175, field: 'providerConfiguration' }),\n    field({ decoder: PrivatePaymentConfiguration, version: 205 })\n], WebshopPrivateMetaData.prototype, \"paymentConfiguration\", void 0);\nexport class WebshopServerMetaData extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.placeholder = '';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], WebshopServerMetaData.prototype, \"placeholder\", void 0);\n//# sourceMappingURL=WebshopMetaData.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, DateDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Category } from './Category.js';\nimport { Product } from './Product.js';\nimport { WebshopMetaData, WebshopPrivateMetaData, WebshopStatus } from './WebshopMetaData.js';\nexport class WebshopPreview extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Not writeable\n         */\n        this.uri = '';\n        /**\n         * Not writeable\n         */\n        this.legacyUri = null;\n        this.domain = null;\n        this.domainUri = null;\n        this.meta = WebshopMetaData.create({});\n        this.privateMeta = WebshopPrivateMetaData.create({});\n        this.createdAt = new Date();\n    }\n    get hasSingleTickets() {\n        return this.meta.hasSingleTickets;\n    }\n    get hasTickets() {\n        return this.meta.hasTickets;\n    }\n    getDefaultDomain(organization) {\n        var _a;\n        return ((_a = STAMHOOFD.domains.webshop[organization.address.country]) !== null && _a !== void 0 ? _a : STAMHOOFD.domains.webshop['']);\n    }\n    getDefaultUrl(organization) {\n        return this.getDefaultDomain(organization) + this.getDefaultSuffix();\n    }\n    getDomainUrl() {\n        return this.domain + this.getDomainSuffix();\n    }\n    getUrl(organization) {\n        if (this.domain && this.meta.domainActive) {\n            return this.getDomainUrl();\n        }\n        return this.getDefaultUrl(organization);\n    }\n    getLegacyUrl(organization) {\n        if (!STAMHOOFD.domains.legacyWebshop || this.legacyUri === null) {\n            return null;\n        }\n        return organization.uri + '.' + STAMHOOFD.domains.legacyWebshop + (this.legacyUri ? '/' + this.legacyUri : '');\n    }\n    getDomainSuffix() {\n        if (!this.domainUri) {\n            return '';\n        }\n        return '/' + this.domainUri;\n    }\n    getDefaultSuffix() {\n        if (!this.uri) {\n            return '';\n        }\n        return '/' + this.uri;\n    }\n    getUrlSuffix() {\n        if (this.domain) {\n            return this.getDomainSuffix();\n        }\n        return this.getDefaultSuffix();\n    }\n    isClosed(margin = 0) {\n        if (this.meta.status !== WebshopStatus.Open || (this.meta.availableUntil && this.meta.availableUntil.getTime() < new Date().getTime() + margin)) {\n            return true;\n        }\n        return false;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], WebshopPreview.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 134 })\n], WebshopPreview.prototype, \"uri\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 89, field: 'uri' }),\n    field({\n        decoder: StringDecoder,\n        nullable: true,\n        version: 134,\n        downgrade: function () {\n            var _a;\n            return (_a = this.legacyUri) !== null && _a !== void 0 ? _a : this.uri;\n        },\n    })\n], WebshopPreview.prototype, \"legacyUri\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 89 })\n], WebshopPreview.prototype, \"domain\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 89 })\n], WebshopPreview.prototype, \"domainUri\", void 0);\n__decorate([\n    field({ decoder: WebshopMetaData })\n], WebshopPreview.prototype, \"meta\", void 0);\n__decorate([\n    field({ decoder: WebshopPrivateMetaData, version: 62 })\n], WebshopPreview.prototype, \"privateMeta\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, version: 366 })\n], WebshopPreview.prototype, \"createdAt\", void 0);\nexport class Webshop extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Not writeable\n         */\n        this.uri = '';\n        /**\n         * Not writeable\n         */\n        this.legacyUri = null;\n        this.domain = null;\n        this.domainUri = null;\n        this.meta = WebshopMetaData.create({});\n        this.products = [];\n        this.categories = [];\n    }\n    get hasSingleTickets() {\n        return this.meta.hasSingleTickets;\n    }\n    get hasTickets() {\n        return this.meta.hasTickets;\n    }\n    /**\n     * Whether we need to show the text 'Free' in webshops (only if we have at least one non-free product)\n     */\n    get isAllFree() {\n        for (const product of this.products) {\n            for (const price of product.prices) {\n                if (price.price) {\n                    return false;\n                }\n            }\n            for (const menu of product.optionMenus) {\n                for (const option of menu.options) {\n                    if (option.price) {\n                        return false;\n                    }\n                }\n            }\n        }\n        for (const plan of this.meta.seatingPlans) {\n            for (const category of plan.categories) {\n                if (category.price) {\n                    return false;\n                }\n            }\n        }\n        if (this.meta.paymentConfiguration.administrationFee.fixed) {\n            return false;\n        }\n        return true;\n    }\n    get canEnableCart() {\n        if (this.products.length === 1 && !this.meta.allowDiscountCodeEntry) {\n            const product = this.products[0];\n            if (product.isUnique) {\n                return false;\n            }\n        }\n        return true;\n    }\n    get shouldEnableCart() {\n        if (!this.meta.cartEnabled) {\n            return false;\n        }\n        return this.canEnableCart;\n    }\n    getDefaultDomain(organization) {\n        var _a;\n        return ((_a = STAMHOOFD.domains.webshop[organization.address.country]) !== null && _a !== void 0 ? _a : STAMHOOFD.domains.webshop['']);\n    }\n    getDefaultUrl(organization) {\n        return this.getDefaultDomain(organization) + this.getDefaultSuffix();\n    }\n    getDomainUrl() {\n        return this.domain + this.getDomainSuffix();\n    }\n    getUrl(organization) {\n        if (this.domain && this.meta.domainActive) {\n            return this.getDomainUrl();\n        }\n        return this.getDefaultUrl(organization);\n    }\n    getLegacyUrl(organization) {\n        if (!STAMHOOFD.domains.legacyWebshop || this.legacyUri === null) {\n            return null;\n        }\n        return organization.uri + '.' + STAMHOOFD.domains.legacyWebshop + (this.legacyUri ? '/' + this.legacyUri : '');\n    }\n    getDomainSuffix() {\n        if (!this.domainUri) {\n            return '';\n        }\n        return '/' + this.domainUri;\n    }\n    getDefaultSuffix() {\n        if (!this.uri) {\n            return '';\n        }\n        return '/' + this.uri;\n    }\n    getUrlSuffix() {\n        if (this.domain) {\n            return this.getDomainSuffix();\n        }\n        return this.getDefaultSuffix();\n    }\n    buildDNSRecords() {\n        if (!this.domain) {\n            return [];\n        }\n        return WebshopPrivateMetaData.buildDNSRecords(this.domain);\n    }\n    isClosed(margin = 0) {\n        if (this.meta.status !== WebshopStatus.Open || (this.meta.availableUntil && this.meta.availableUntil.getTime() < new Date().getTime() + margin) || this.opensInTheFuture()) {\n            return true;\n        }\n        return false;\n    }\n    opensInTheFuture() {\n        if (this.meta.status !== WebshopStatus.Open) {\n            return false;\n        }\n        if (this.meta.openAt && this.meta.openAt.getTime() > new Date().getTime()) {\n            return true;\n        }\n        return false;\n    }\n    clearStock() {\n        for (const product of this.products) {\n            product.clearStock();\n        }\n        for (const method of this.meta.checkoutMethods) {\n            method.clearStock();\n        }\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], Webshop.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 134 })\n], Webshop.prototype, \"uri\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, field: 'uri' }),\n    field({\n        decoder: StringDecoder,\n        nullable: true,\n        version: 134,\n        downgrade: function () {\n            var _a;\n            return (_a = this.legacyUri) !== null && _a !== void 0 ? _a : this.uri;\n        },\n    })\n], Webshop.prototype, \"legacyUri\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], Webshop.prototype, \"domain\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], Webshop.prototype, \"domainUri\", void 0);\n__decorate([\n    field({ decoder: WebshopMetaData })\n], Webshop.prototype, \"meta\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Product) })\n], Webshop.prototype, \"products\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Category) })\n], Webshop.prototype, \"categories\", void 0);\nexport class PrivateWebshop extends Webshop {\n    constructor() {\n        super(...arguments);\n        this.privateMeta = WebshopPrivateMetaData.create({});\n    }\n}\n__decorate([\n    field({ decoder: WebshopPrivateMetaData })\n], PrivateWebshop.prototype, \"privateMeta\", void 0);\n//# sourceMappingURL=Webshop.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, DateDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Address } from './addresses/Address.js';\nimport { compileToInMemoryFilter } from './filters/InMemoryFilter.js';\nimport { organizationItemInMemoryFilterCompilers } from './filters/inMemoryFilterDefinitions.js';\nimport { Group } from './Group.js';\nimport { OrganizationMetaData } from './OrganizationMetaData.js';\nimport { OrganizationPrivateMetaData } from './OrganizationPrivateMetaData.js';\nimport { OrganizationRegistrationPeriod, RegistrationPeriod } from './RegistrationPeriod.js';\nimport { Webshop, WebshopPreview } from './webshops/Webshop.js';\nexport class BaseOrganization extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Name of the organization you are creating\n         */\n        this.name = '';\n        this.active = true;\n        this.website = null;\n        this.registerDomain = null;\n        this.uri = '';\n        this.address = Address.create({});\n        this.createdAt = new Date();\n    }\n    get resolvedRegisterDomain() {\n        var _a;\n        if (this.registerDomain) {\n            return this.registerDomain;\n        }\n        if (!STAMHOOFD.domains.registration) {\n            return null;\n        }\n        return this.uri + '.' + ((_a = STAMHOOFD.domains.registration[this.address.country]) !== null && _a !== void 0 ? _a : STAMHOOFD.domains.registration['']);\n    }\n    get registerUrl() {\n        const d = this.resolvedRegisterDomain;\n        if (!d) {\n            return 'https://' + STAMHOOFD.domains.dashboard + '/leden/' + this.uri;\n        }\n        return 'https://' + d;\n    }\n    get dashboardUrl() {\n        return 'https://' + STAMHOOFD.domains.dashboard + '/beheerders/' + this.uri;\n    }\n    get dashboardDomain() {\n        return STAMHOOFD.domains.dashboard;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], BaseOrganization.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], BaseOrganization.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 325 })\n], BaseOrganization.prototype, \"active\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 3, upgrade: () => null })\n], BaseOrganization.prototype, \"website\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 3, upgrade: () => null })\n], BaseOrganization.prototype, \"registerDomain\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 3, upgrade: () => '' })\n], BaseOrganization.prototype, \"uri\", void 0);\n__decorate([\n    field({ decoder: OrganizationMetaData, defaultValue: () => OrganizationMetaData.create({}) })\n], BaseOrganization.prototype, \"meta\", void 0);\n__decorate([\n    field({ decoder: Address })\n], BaseOrganization.prototype, \"address\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, version: 259 })\n], BaseOrganization.prototype, \"createdAt\", void 0);\nexport class Organization extends BaseOrganization {\n    constructor() {\n        super(...arguments);\n        /**\n         * @deprecated\n         * Please use period instead now\n         */\n        this.groups = [];\n        /**\n         * Only set for users with full access to the organization\n         */\n        this.privateMeta = null;\n        /**\n         * Only set for users with full access to the organization\n         */\n        this.webshops = [];\n        /**\n         * Only available for patching. Also available with lazy loading OrganizationAdmins\n         */\n        this.admins = null;\n    }\n    /**\n     * Get all groups that are in a category\n     */\n    get availableGroups() {\n        return this.period.categoryTree.getAllGroups();\n    }\n    getGroupsForPermissions(permissions) {\n        return this.getCategoryTree({ permissions }).getAllGroups();\n    }\n    get adminAvailableGroups() {\n        return this.period.adminCategoryTree.getAllGroups();\n    }\n    /**\n     * @deprecated\n     *\n     * Get all groups that are in a category\n     */\n    get availableCategories() {\n        return this.period.availableCategories;\n    }\n    /**\n     * @deprecated\n     */\n    get categoryTree() {\n        return this.period.categoryTree;\n    }\n    /**\n     * @deprecated\n     */\n    get publicCategoryTree() {\n        return this.period.publicCategoryTree;\n    }\n    /**\n     * @deprecated\n     */\n    get adminCategoryTree() {\n        return this.getCategoryTree({ admin: true });\n    }\n    isAcceptingNewMembers(admin) {\n        const allGroups = this.adminAvailableGroups; // we need to check admin groups because required groups could be restricted to internal groups\n        const groups = this.getCategoryTree({ admin }).getAllGroups();\n        for (const group of groups) {\n            if (group.closed) {\n                continue;\n            }\n            if (group.settings.requireGroupIds.length > 0 && group.settings.requireGroupIds.find(id => !!allGroups.find(g => g.id === id))) {\n                continue;\n            }\n            if (group.settings.availableMembers === 0 && !group.waitingList) {\n                continue;\n            }\n            return true;\n        }\n        return false;\n    }\n    isAcceptingExistingMembers(admin) {\n        const groups = this.getCategoryTree({ admin }).getAllGroups();\n        for (const group of groups) {\n            if (group.closed) {\n                continue;\n            }\n            if (group.settings.availableMembers === 0 && !group.waitingList) {\n                continue;\n            }\n            return true;\n        }\n        return false;\n    }\n    /**\n     * Contains the fully build hierarchy without the need for ID lookups. Try not to use this tree when modifying it.\n     *\n     * For registration members perspective, try to use options.admin instead of options.permissions.\n     * options.permissions is only used if you want to hide groups and empty categories that you don't have permissions for.\n     */\n    getCategoryTree(options) {\n        return this.period.getCategoryTree(options ? { ...options, organization: this } : { organization: this });\n    }\n    /**\n     * @deprecated\n     * (todo) Contains the fully build hierarchy without the need for ID lookups. Try not to use this tree when modifying it.\n     */\n    getCategoryTreeWithDepth(maxDepth) {\n        return this.getCategoryTree({ maxDepth });\n    }\n    isRecordEnabled(_record) {\n        return true;\n    }\n    getRecordAnswers() {\n        var _a, _b;\n        return (_b = (_a = this.privateMeta) === null || _a === void 0 ? void 0 : _a.recordAnswers) !== null && _b !== void 0 ? _b : new Map();\n    }\n    patchRecordAnswers(patch) {\n        return this.patch({\n            privateMeta: OrganizationPrivateMetaData.patch({\n                recordAnswers: patch,\n            }),\n        });\n    }\n    doesMatchFilter(filter) {\n        try {\n            const compiledFilter = compileToInMemoryFilter(filter, organizationItemInMemoryFilterCompilers);\n            const value = compiledFilter(this);\n            console.log('does match filter', filter, this, value);\n            return value;\n        }\n        catch (e) {\n            console.error('Error while compiling filter', e, filter);\n        }\n        return false;\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(Group), version: 2, upgrade: () => [], optional: true })\n], Organization.prototype, \"groups\", void 0);\n__decorate([\n    field({ decoder: OrganizationRegistrationPeriod, version: 264, defaultValue: () => OrganizationRegistrationPeriod.create({ period: RegistrationPeriod.create({}) }) })\n], Organization.prototype, \"period\", void 0);\n__decorate([\n    field({ decoder: OrganizationPrivateMetaData, nullable: true, version: 6 })\n], Organization.prototype, \"privateMeta\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(WebshopPreview), version: 38, upgrade: () => [] })\n], Organization.prototype, \"webshops\", void 0);\nexport class OrganizationWithWebshop extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: Organization })\n], OrganizationWithWebshop.prototype, \"organization\", void 0);\n__decorate([\n    field({ decoder: Webshop })\n], OrganizationWithWebshop.prototype, \"webshop\", void 0);\nexport class GetWebshopFromDomainResult extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * There is one specific webshop for the given domain.\n         */\n        this.webshop = null;\n        /**\n         * Multiple webshops possible. Show a selection page.\n         */\n        this.webshops = [];\n    }\n}\n__decorate([\n    field({ decoder: Organization })\n], GetWebshopFromDomainResult.prototype, \"organization\", void 0);\n__decorate([\n    field({ decoder: Webshop, nullable: true })\n], GetWebshopFromDomainResult.prototype, \"webshop\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(WebshopPreview), version: 137 })\n], GetWebshopFromDomainResult.prototype, \"webshops\", void 0);\nexport const OrganizationPatch = Organization.patchType();\n//# sourceMappingURL=Organization.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, DateDecoder, EnumDecoder, field, MapDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Event, NamedObject } from './Event.js';\nimport { EventNotificationStatus } from './EventNotificationStatus.js';\nimport { compileToInMemoryFilter } from './filters/InMemoryFilter.js';\nimport { eventNotificationsInMemoryFilterCompilers } from './filters/inMemoryFilterDefinitions.js';\nimport { RecordAnswerDecoder } from './members/records/RecordAnswer.js';\nimport { BaseOrganization } from './Organization.js';\nexport class EventNotification extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.periodId = '';\n        this.events = [];\n        this.startDate = new Date();\n        this.endDate = new Date();\n        this.status = EventNotificationStatus.Draft;\n        this.feedbackText = null;\n        this.recordAnswers = new Map();\n        this.acceptedRecordAnswers = new Map();\n        /**\n         * User who submitted the notification\n         */\n        this.submittedBy = null;\n        this.submittedAt = null;\n        /**\n         * User who created the notification\n         */\n        this.createdBy = null;\n        this.createdAt = new Date();\n        this.updatedAt = new Date();\n    }\n    isRecordEnabled(record) {\n        return true;\n    }\n    getRecordAnswers() {\n        return this.recordAnswers;\n    }\n    patchRecordAnswers(patch) {\n        return this.patch({\n            recordAnswers: patch,\n        });\n    }\n    doesMatchFilter(filter) {\n        try {\n            const compiledFilter = compileToInMemoryFilter(filter, eventNotificationsInMemoryFilterCompilers);\n            return compiledFilter(this);\n        }\n        catch (e) {\n            console.error('Error while compiling filter', e, filter);\n        }\n        return false;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, optional: true, defaultValue: () => uuidv4() })\n], EventNotification.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EventNotification.prototype, \"typeId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 365 })\n], EventNotification.prototype, \"periodId\", void 0);\n__decorate([\n    field({ decoder: BaseOrganization })\n], EventNotification.prototype, \"organization\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Event) })\n], EventNotification.prototype, \"events\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], EventNotification.prototype, \"startDate\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], EventNotification.prototype, \"endDate\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(EventNotificationStatus) })\n], EventNotification.prototype, \"status\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], EventNotification.prototype, \"feedbackText\", void 0);\n__decorate([\n    field({ decoder: new MapDecoder(StringDecoder, RecordAnswerDecoder) })\n], EventNotification.prototype, \"recordAnswers\", void 0);\n__decorate([\n    field({ decoder: new MapDecoder(StringDecoder, RecordAnswerDecoder), version: 368 })\n], EventNotification.prototype, \"acceptedRecordAnswers\", void 0);\n__decorate([\n    field({ decoder: NamedObject, nullable: true })\n], EventNotification.prototype, \"submittedBy\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 365 })\n], EventNotification.prototype, \"submittedAt\", void 0);\n__decorate([\n    field({ decoder: NamedObject, nullable: true })\n], EventNotification.prototype, \"createdBy\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], EventNotification.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], EventNotification.prototype, \"updatedAt\", void 0);\n//# sourceMappingURL=EventNotification.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nexport class GenericBalance extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.amountPaid = 0;\n        this.amountOpen = 0;\n        this.amountPending = 0;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], GenericBalance.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], GenericBalance.prototype, \"organizationId\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 354 })\n], GenericBalance.prototype, \"amountPaid\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, field: 'amount' }),\n    field({ decoder: IntegerDecoder, version: 354 })\n], GenericBalance.prototype, \"amountOpen\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], GenericBalance.prototype, \"amountPending\", void 0);\n//# sourceMappingURL=GenericBalance.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, BooleanDecoder, DateDecoder, IntegerDecoder, StringDecoder, field } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nexport class MemberPlatformMembership extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.startDate = new Date();\n        this.trialUntil = null;\n        this.endDate = new Date();\n        this.expireDate = null;\n        this.balanceItemId = null;\n        this.price = 0;\n        this.priceWithoutDiscount = 0;\n        this.freeAmount = 0;\n        this.generated = false;\n        this.createdAt = new Date();\n        this.updatedAt = new Date();\n        // prevent deleting or changing price if true\n        this.locked = false;\n    }\n    isActive(date = new Date()) {\n        return this.startDate <= date && this.endDate >= date;\n    }\n    get isTrial() {\n        return this.trialUntil !== null && (this.trialUntil > new Date() || this.endDate <= this.trialUntil);\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], MemberPlatformMembership.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], MemberPlatformMembership.prototype, \"memberId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], MemberPlatformMembership.prototype, \"membershipTypeId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], MemberPlatformMembership.prototype, \"organizationId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], MemberPlatformMembership.prototype, \"periodId\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], MemberPlatformMembership.prototype, \"startDate\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 354 })\n], MemberPlatformMembership.prototype, \"trialUntil\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], MemberPlatformMembership.prototype, \"endDate\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], MemberPlatformMembership.prototype, \"expireDate\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], MemberPlatformMembership.prototype, \"balanceItemId\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], MemberPlatformMembership.prototype, \"price\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], MemberPlatformMembership.prototype, \"priceWithoutDiscount\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 336 })\n], MemberPlatformMembership.prototype, \"freeAmount\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], MemberPlatformMembership.prototype, \"generated\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], MemberPlatformMembership.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], MemberPlatformMembership.prototype, \"updatedAt\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 364 })\n], MemberPlatformMembership.prototype, \"locked\", void 0);\n//# sourceMappingURL=MemberPlatformMembership.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, DateDecoder, StringDecoder, field } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Group } from '../Group.js';\nimport { AuditLogReplacement } from '../AuditLogReplacement.js';\nexport class MemberResponsibilityRecordBase extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.organizationId = null;\n        this.groupId = null;\n        this.startDate = new Date();\n        this.endDate = null;\n    }\n    get isActive() {\n        return this.startDate <= new Date() && (this.endDate === null || this.endDate > new Date());\n    }\n    getDiffName() {\n        return AuditLogReplacement.uuid(this.responsibilityId);\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], MemberResponsibilityRecordBase.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], MemberResponsibilityRecordBase.prototype, \"memberId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], MemberResponsibilityRecordBase.prototype, \"organizationId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], MemberResponsibilityRecordBase.prototype, \"groupId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], MemberResponsibilityRecordBase.prototype, \"responsibilityId\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], MemberResponsibilityRecordBase.prototype, \"startDate\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], MemberResponsibilityRecordBase.prototype, \"endDate\", void 0);\nexport class MemberResponsibilityRecord extends MemberResponsibilityRecordBase {\n    constructor() {\n        super(...arguments);\n        this.group = null;\n    }\n    getName(member, includeOrganization = true) {\n        let allResponsibilities = member.family.platform.config.responsibilities;\n        let suffix = (this.group ? ' van ' + this.group.settings.name : '');\n        if (this.organizationId) {\n            const organization = member.family.getOrganization(this.organizationId);\n            if (organization && organization.privateMeta) {\n                allResponsibilities = [...allResponsibilities, ...organization.privateMeta.responsibilities];\n            }\n            if (organization && includeOrganization) {\n                suffix += ' bij ' + organization.name;\n            }\n        }\n        const responsibility = allResponsibilities.find(r => r.id == this.responsibilityId);\n        return (responsibility ? responsibility.name : 'Verwijderde functie') + suffix;\n    }\n}\n__decorate([\n    field({ decoder: Group, nullable: true, version: 328 })\n], MemberResponsibilityRecord.prototype, \"group\", void 0);\n//# sourceMappingURL=MemberResponsibilityRecord.js.map","export const NationalRegisterNumberOptOut = Symbol.for('nationalRegisterNumberOptOut');\n//# sourceMappingURL=NationalRegisterNumberOptOut.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, EnumDecoder, field, MapDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { MemberResponsibilityRecordBase } from './members/MemberResponsibilityRecord.js';\nimport { getPermissionLevelNumber, PermissionLevel } from './PermissionLevel.js';\nimport { PermissionRole } from './PermissionRole.js';\nimport { PermissionsResourceType } from './PermissionsResourceType.js';\nimport { ResourcePermissions } from './ResourcePermissions.js';\nexport function getUnlistedResources(resourceType, permissions, listedResources) {\n    const resources = permissions.resources.get(resourceType);\n    if (!resources) {\n        return [];\n    }\n    const result = [];\n    for (const [id, resource] of resources) {\n        if (!listedResources.find(r => r.id === id)) {\n            result.push({ id, name: resource.resourceName, type: resourceType });\n        }\n    }\n    return result;\n}\nexport class Permissions extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Automatically have all permissions (e.g. when someone created a new group)\n         * Also allows creating new groups\n         */\n        this.level = PermissionLevel.None;\n        this.roles = [];\n        this.responsibilities = [];\n        /**\n         * Mostly for temporary access\n         */\n        this.resources = new Map();\n    }\n    static get full() {\n        return Permissions.create({\n            level: PermissionLevel.Full,\n        });\n    }\n    hasRole(role) {\n        return this.roles.find(r => r.id === role.id) !== undefined;\n    }\n    add(other) {\n        if (getPermissionLevelNumber(this.level) < getPermissionLevelNumber(other.level)) {\n            this.level = other.level;\n        }\n        for (const role of other.roles) {\n            if (!this.roles.find(r => r.id === role.id)) {\n                this.roles.push(role.clone());\n            }\n        }\n        for (const responsibility of other.responsibilities) {\n            if (!this.responsibilities.find(r => r.id === responsibility.id)) {\n                this.responsibilities.push(responsibility.clone());\n            }\n        }\n    }\n    get isEmpty() {\n        return this.level === PermissionLevel.None && this.roles.length === 0 && this.responsibilities.length === 0 && this.resources.size === 0;\n    }\n}\n__decorate([\n    field({ decoder: new EnumDecoder(PermissionLevel) })\n], Permissions.prototype, \"level\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(PermissionRole), version: 60 })\n], Permissions.prototype, \"roles\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(MemberResponsibilityRecordBase), version: 274 })\n], Permissions.prototype, \"responsibilities\", void 0);\n__decorate([\n    field({\n        decoder: new MapDecoder(new EnumDecoder(PermissionsResourceType), new MapDecoder(\n        // ID\n        StringDecoder, ResourcePermissions)),\n        version: 249,\n    })\n], Permissions.prototype, \"resources\", void 0);\n//# sourceMappingURL=Permissions.js.map","import { Formatter } from '@stamhoofd/utility';\nimport { AccessRightHelper } from './AccessRight.js';\nimport { getPermissionLevelNumber, PermissionLevel } from './PermissionLevel.js';\nimport { PermissionsResourceType } from './PermissionsResourceType.js';\nimport { ResourcePermissions } from './ResourcePermissions.js';\n/**\n * Identical to Permissions but with detailed roles, loaded from the organization or platform\n */\nexport class LoadedPermissions {\n    constructor(data) {\n        this.level = PermissionLevel.None;\n        this.resources = new Map();\n        this.accessRights = [];\n        Object.assign(this, data);\n    }\n    static create(data) {\n        return new LoadedPermissions(data);\n    }\n    static fromResource(permissions) {\n        return LoadedPermissions.create({\n            level: permissions.level,\n            resources: new Map(),\n            accessRights: [...permissions.accessRights],\n        });\n    }\n    clone() {\n        const permissions = LoadedPermissions.create({\n            level: this.level,\n            resources: new Map(),\n            accessRights: [...this.accessRights],\n        });\n        for (const [type, r] of this.resources) {\n            if (!permissions.resources.has(type)) {\n                permissions.resources.set(type, new Map());\n            }\n            for (const [id, resource] of r) {\n                permissions.resources.get(type).set(id, resource.clone());\n            }\n        }\n        return permissions;\n    }\n    static fromRole(role) {\n        const permissions = LoadedPermissions.create({\n            level: role.level,\n            resources: new Map(),\n            accessRights: [...role.accessRights],\n        });\n        for (const [type, r] of role.resources) {\n            if (!permissions.resources.has(type)) {\n                permissions.resources.set(type, new Map());\n            }\n            for (const [id, resource] of r) {\n                permissions.resources.get(type).set(id, LoadedPermissions.fromResource(resource));\n            }\n        }\n        return permissions;\n    }\n    static fromResponsibilityRecord(responsibilityRecord, inheritedResponsibilityRoles, allResponsibilites) {\n        const responsibility = allResponsibilites.find(r => r.id === responsibilityRecord.responsibilityId);\n        if (!responsibility) {\n            return LoadedPermissions.create({});\n        }\n        return this.fromResponsibility(responsibility, responsibilityRecord.groupId, inheritedResponsibilityRoles);\n    }\n    /**\n     * old name: buildRoleForResponsibility\n     */\n    static fromResponsibility(responsibility, groupId, inheritedResponsibilityRoles) {\n        const permissions = responsibility.permissions\n            ? this.fromRole(responsibility.permissions)\n            : LoadedPermissions.create({});\n        if (groupId && responsibility.groupPermissionLevel !== PermissionLevel.None) {\n            const map = new Map();\n            map.set(groupId, LoadedPermissions.create({ level: responsibility.groupPermissionLevel }));\n            permissions.resources.set(PermissionsResourceType.Groups, map);\n        }\n        const role = inheritedResponsibilityRoles.find(r => r.responsibilityId === responsibility.id && r.responsibilityGroupId === groupId);\n        if (role) {\n            permissions.add(LoadedPermissions.fromRole(role));\n        }\n        return permissions;\n    }\n    static from(permissions, allRoles, inheritedResponsibilityRoles, allResponsibilites) {\n        const loaded = LoadedPermissions.create({\n            level: permissions.level,\n            accessRights: [],\n            resources: new Map(),\n        });\n        for (const [type, r] of permissions.resources) {\n            if (!loaded.resources.has(type)) {\n                loaded.resources.set(type, new Map());\n            }\n            for (const [id, resource] of r) {\n                loaded.resources.get(type).set(id, LoadedPermissions.fromResource(resource));\n            }\n        }\n        for (const roleRecord of permissions.roles) {\n            const role = allRoles.find(a => a.id === roleRecord.id);\n            if (role) {\n                loaded.add(LoadedPermissions.fromRole(role));\n            }\n        }\n        for (const responsibilityRecord of permissions.responsibilities) {\n            if (responsibilityRecord.endDate !== null && responsibilityRecord.endDate < new Date()) {\n                continue;\n            }\n            if (responsibilityRecord.startDate > new Date()) {\n                continue;\n            }\n            const responsibility = allResponsibilites.find(r => r.id === responsibilityRecord.responsibilityId);\n            if (!responsibility) {\n                continue;\n            }\n            const r = this.fromResponsibility(responsibility, responsibilityRecord.groupId, inheritedResponsibilityRoles);\n            loaded.add(r);\n        }\n        return loaded;\n    }\n    getResourcePermissions(type, id) {\n        const resource = this.resources.get(type);\n        if (!resource) {\n            return null;\n        }\n        const rInstance = resource.get(id);\n        const allInstance = resource.get('');\n        if (!rInstance) {\n            if (allInstance) {\n                return allInstance;\n            }\n            return null;\n        }\n        if (allInstance) {\n            return rInstance.merge(allInstance);\n        }\n        return rInstance;\n    }\n    getMergedResourcePermissions(type, id) {\n        const clone = this.clone();\n        // Remove this type from resources\n        clone.resources.delete(type);\n        const r = this.getResourcePermissions(type, id);\n        if (r) {\n            clone.add(r);\n        }\n        return clone;\n    }\n    hasAccess(level) {\n        if (getPermissionLevelNumber(this.level) >= getPermissionLevelNumber(level)) {\n            // Someone with read / write access for the whole organization, also the same access for each group\n            return true;\n        }\n        return false;\n    }\n    hasResourceAccess(type, id, level) {\n        var _a, _b;\n        if (this.hasAccess(level)) {\n            return true;\n        }\n        if ((_b = (_a = this.getResourcePermissions(type, id)) === null || _a === void 0 ? void 0 : _a.hasAccess(level)) !== null && _b !== void 0 ? _b : false) {\n            return true;\n        }\n        return false;\n    }\n    hasResourceAccessRight(type, id, right) {\n        var _a, _b;\n        if (this.hasAccessRight(right)) {\n            return true;\n        }\n        if ((_b = (_a = this.getResourcePermissions(type, id)) === null || _a === void 0 ? void 0 : _a.hasAccessRight(right)) !== null && _b !== void 0 ? _b : false) {\n            return true;\n        }\n        const autoInherit = AccessRightHelper.autoInheritFrom(right);\n        for (const r of autoInherit) {\n            if (this.hasResourceAccessRight(type, id, r)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    hasAccessRightForAllResourcesOfType(type, right) {\n        return this.hasResourceAccessRight(type, '', right);\n    }\n    hasAccessRightForSomeResource(right) {\n        if (this.hasAccessRight(right)) {\n            return true;\n        }\n        for (const resource of this.resources.values()) {\n            if (resource) {\n                for (const r of resource.values()) {\n                    if (r.hasAccessRight(right)) {\n                        return true;\n                    }\n                }\n            }\n        }\n        return false;\n    }\n    hasAccessRightForSomeResourceOfType(type, right) {\n        if (this.hasAccessRight(right)) {\n            return true;\n        }\n        const resource = this.resources.get(type);\n        if (resource) {\n            for (const r of resource.values()) {\n                if (r.hasAccessRight(right)) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n    hasReadAccess() {\n        return this.hasAccess(PermissionLevel.Read);\n    }\n    hasWriteAccess() {\n        return this.hasAccess(PermissionLevel.Write);\n    }\n    hasFullAccess() {\n        return this.hasAccess(PermissionLevel.Full);\n    }\n    hasAccessRight(right) {\n        const gl = AccessRightHelper.autoGrantRightForLevel(right);\n        if ((gl && this.hasAccess(gl)) || this.accessRights.includes(right)) {\n            return true;\n        }\n        const autoInherit = AccessRightHelper.autoInheritFrom(right);\n        for (const r of autoInherit) {\n            if (this.hasAccessRight(r)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    add(other) {\n        if (getPermissionLevelNumber(other.level) > getPermissionLevelNumber(this.level)) {\n            this.level = other.level;\n        }\n        for (const right of other.accessRights) {\n            if (!this.accessRights.includes(right)) {\n                this.accessRights.push(right);\n            }\n        }\n        for (const [type, r] of other.resources) {\n            for (const [id, resource] of r) {\n                if (!this.resources.has(type)) {\n                    this.resources.set(type, new Map());\n                }\n                const current = this.resources.get(type).get(id);\n                if (!current) {\n                    this.resources.get(type).set(id, resource);\n                }\n                else {\n                    current.add(resource);\n                }\n            }\n        }\n    }\n    merge(other) {\n        const cloned = this.clone();\n        cloned.add(other);\n        return cloned;\n    }\n    removeAccessRights(rights) {\n        this.accessRights = this.accessRights.filter(r => !rights.includes(r));\n        for (const resource of this.resources.values()) {\n            for (const r of resource.values()) {\n                r.removeAccessRights(rights);\n            }\n        }\n    }\n    get isEmpty() {\n        if (this.accessRights.length || this.level !== PermissionLevel.None) {\n            return false;\n        }\n        for (const resource of this.resources.values()) {\n            for (const r of resource.values()) {\n                if (!r.isEmpty) {\n                    return false;\n                }\n            }\n        }\n        return true;\n    }\n    getDescription() {\n        const stack = [];\n        if (this.level === PermissionLevel.Read) {\n            stack.push('alles lezen');\n        }\n        if (this.level === PermissionLevel.Write) {\n            stack.push('alles bewerken');\n        }\n        if (this.level === PermissionLevel.Full) {\n            stack.push('volledige toegang');\n        }\n        for (const right of this.accessRights) {\n            stack.push(AccessRightHelper.getDescription(right));\n        }\n        stack.push(...ResourcePermissions.getMapDescription(this.resources));\n        if (stack.length === 0) {\n            return 'geen rechten';\n        }\n        return Formatter.capitalizeFirstLetter(Formatter.joinLast(stack, ', ', ' en '));\n    }\n}\n//# sourceMappingURL=LoadedPermissions.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, field, MapDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { AccessRightHelper } from './AccessRight.js';\nimport { LoadedPermissions } from './LoadedPermissions.js';\nimport { PermissionLevel } from './PermissionLevel.js';\nimport { Permissions } from './Permissions.js';\nimport { PermissionsResourceType } from './PermissionsResourceType.js';\nimport { Platform } from './Platform.js';\nexport class UserPermissions extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.globalPermissions = null;\n        this.organizationPermissions = new Map();\n    }\n    // Current list of groups\n    get platform() {\n        return this.forPlatform(Platform.shared);\n    }\n    forPlatform(platform) {\n        if (!this.globalPermissions) {\n            return null;\n        }\n        const platformRoles = platform.getRoles();\n        const base = LoadedPermissions.from(this.globalPermissions, platformRoles, [], platform.config.responsibilities);\n        if (base.hasFullAccess()) {\n            // Since the prohibited organization level access rights are not automatically\n            // inherited if you have full access, we'll need to add them manually for full platform admins\n            base.add(LoadedPermissions.create({\n                level: PermissionLevel.Full,\n                accessRights: [...AccessRightHelper.prohibitedOrganizationLevelAccessRights()],\n            }));\n        }\n        return base;\n    }\n    forOrganization(organization, platform) {\n        const base = LoadedPermissions.create({});\n        if (platform) {\n            const platformPermissions = this.forPlatform(platform);\n            if (platformPermissions) {\n                const tags = organization.meta.tags.length === 0 ? [''] : organization.meta.tags;\n                for (const tag of tags) {\n                    const rp = platformPermissions.getMergedResourcePermissions(PermissionsResourceType.OrganizationTags, tag);\n                    if (rp) {\n                        base.add(rp);\n                    }\n                }\n            }\n        }\n        const specific = this.forWithoutInherit(organization);\n        if (!specific) {\n            if (base.isEmpty) {\n                return null;\n            }\n            return base;\n        }\n        specific.add(base);\n        return specific;\n    }\n    forWithoutInherit(organization) {\n        var _a, _b, _c, _d, _e, _f, _g;\n        const permissions = (_a = this.organizationPermissions.get(organization.id)) !== null && _a !== void 0 ? _a : null;\n        if (!permissions) {\n            return null;\n        }\n        const organizationRoles = (_c = (_b = organization === null || organization === void 0 ? void 0 : organization.privateMeta) === null || _b === void 0 ? void 0 : _b.roles) !== null && _c !== void 0 ? _c : [];\n        const inheritedResponsibilityRoles = (_e = (_d = organization === null || organization === void 0 ? void 0 : organization.privateMeta) === null || _d === void 0 ? void 0 : _d.inheritedResponsibilityRoles) !== null && _e !== void 0 ? _e : [];\n        const allResponsibilities = [...Platform.shared.config.responsibilities, ...((_g = (_f = organization === null || organization === void 0 ? void 0 : organization.privateMeta) === null || _f === void 0 ? void 0 : _f.responsibilities) !== null && _g !== void 0 ? _g : [])];\n        // Clone all external data to avoid mutating them because of the removeAccessRights call\n        const result = LoadedPermissions.from(permissions.clone(), organizationRoles.map(r => r.clone()), inheritedResponsibilityRoles.map(r => r.clone()), allResponsibilities.map(r => r.clone()));\n        // Some access rights are not allowed to be used directly in the organization permissions\n        // they can only be passed from the platform permissions towards the organization permissions as access rights for tags (e.g. review event notifications)\n        // So these access rights need to be filtered out here\n        result.removeAccessRights(AccessRightHelper.prohibitedOrganizationLevelAccessRights());\n        return result;\n    }\n    convertPlatformPatch(patch) {\n        if (!this.globalPermissions) {\n            const clonedPatch = UserPermissions.patch({\n                globalPermissions: patch === null ? null : Permissions.create({}).patch(patch),\n            });\n            return clonedPatch;\n        }\n        return UserPermissions.patch({\n            globalPermissions: patch,\n        });\n    }\n    convertPatch(patch, organizationId) {\n        if (!this.organizationPermissions.get(organizationId)) {\n            const clonedPatch = UserPermissions.patch({});\n            const p = patch === null ? null : Permissions.create({}).patch(patch);\n            clonedPatch.organizationPermissions.set(organizationId, p);\n            return clonedPatch;\n        }\n        const clonedPatch = UserPermissions.patch({});\n        clonedPatch.organizationPermissions.set(organizationId, patch);\n        return clonedPatch;\n    }\n    clearEmptyPermissions() {\n        if (this.globalPermissions && this.globalPermissions.isEmpty) {\n            this.globalPermissions = null;\n        }\n        for (const [organizationId, permissions] of this.organizationPermissions) {\n            if (permissions.isEmpty) {\n                this.organizationPermissions.delete(organizationId);\n            }\n        }\n    }\n    get isEmpty() {\n        return this.globalPermissions === null && this.organizationPermissions.size === 0;\n    }\n    static limitedPatch(old, patch, organizationId) {\n        var _a, _b;\n        if (patch === null) {\n            return old;\n        }\n        if (patch.isPatch()) {\n            // Only allow to set the permissions for the organization in scope\n            if (patch.organizationPermissions.get(organizationId) !== undefined) {\n                const clonedPatch = UserPermissions.patch({});\n                clonedPatch.organizationPermissions.set(organizationId, patch.organizationPermissions.get(organizationId));\n                const updated = old ? old.patch(clonedPatch) : UserPermissions.create({}).patch(clonedPatch);\n                // Maintain responsibilities (not editable with a limited patch)\n                const n = updated.organizationPermissions.get(organizationId);\n                const o = (_a = old === null || old === void 0 ? void 0 : old.organizationPermissions.get(organizationId)) === null || _a === void 0 ? void 0 : _a.responsibilities;\n                if (n) {\n                    n.responsibilities = o !== null && o !== void 0 ? o : [];\n                }\n                else {\n                    if (o && o.length) {\n                        // Keep responsibilities\n                        const kept = Permissions.create({\n                            responsibilities: o,\n                        });\n                        updated.organizationPermissions.set(organizationId, kept);\n                    }\n                }\n                if (updated.isEmpty) {\n                    return null;\n                }\n                return updated;\n            }\n        }\n        else {\n            // Only allow to set the permissions for the organization in scope\n            if (patch.organizationPermissions.get(organizationId) !== undefined) {\n                const clonedPatch = UserPermissions.patch({});\n                clonedPatch.organizationPermissions.set(organizationId, patch.organizationPermissions.get(organizationId));\n                const updated = old ? old.patch(clonedPatch) : UserPermissions.create({}).patch(clonedPatch);\n                // Maintain responsibilities (not editable with a limited patch)\n                const n = updated.organizationPermissions.get(organizationId);\n                const o = (_b = old === null || old === void 0 ? void 0 : old.organizationPermissions.get(organizationId)) === null || _b === void 0 ? void 0 : _b.responsibilities;\n                if (n) {\n                    n.responsibilities = o !== null && o !== void 0 ? o : [];\n                }\n                else {\n                    if (o && o.length) {\n                        // Keep responsibilities\n                        const kept = Permissions.create({\n                            responsibilities: o,\n                        });\n                        updated.organizationPermissions.set(organizationId, kept);\n                    }\n                }\n                if (updated.isEmpty) {\n                    return null;\n                }\n                return updated;\n            }\n        }\n        return old;\n    }\n    static limitedAdd(old, add, organizationId) {\n        if (add.organizationPermissions.get(organizationId)) {\n            const cloned = old ? old.clone() : UserPermissions.create({});\n            const realAdd = add.organizationPermissions.get(organizationId);\n            const realOld = cloned ? cloned.organizationPermissions.get(organizationId) : null;\n            if (!realOld) {\n                cloned.organizationPermissions.set(organizationId, realAdd);\n                return cloned;\n            }\n            realOld.add(realAdd);\n            return cloned;\n        }\n        return old;\n    }\n    static add(old, add) {\n        const cloned = old ? old.clone() : UserPermissions.create({});\n        if (add.globalPermissions) {\n            if (cloned.globalPermissions) {\n                cloned.globalPermissions.add(add.globalPermissions);\n            }\n            else {\n                cloned.globalPermissions = add.globalPermissions;\n            }\n        }\n        for (const [organizationId, permissions] of add.organizationPermissions) {\n            if (cloned.organizationPermissions.get(organizationId)) {\n                cloned.organizationPermissions.get(organizationId).add(permissions);\n            }\n            else {\n                cloned.organizationPermissions.set(organizationId, permissions);\n            }\n        }\n        return cloned;\n    }\n}\n__decorate([\n    field({ decoder: Permissions, nullable: true })\n], UserPermissions.prototype, \"globalPermissions\", void 0);\n__decorate([\n    field({ decoder: new MapDecoder(StringDecoder, Permissions) })\n], UserPermissions.prototype, \"organizationPermissions\", void 0);\n//# sourceMappingURL=UserPermissions.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, BooleanDecoder, DateDecoder, EmailDecoder, EnumDecoder, field, MapDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Permissions } from './Permissions.js';\nimport { UserPermissions } from './UserPermissions.js';\n// Note: also update LoginMethod\nexport var LoginProviderType;\n(function (LoginProviderType) {\n    LoginProviderType[\"SSO\"] = \"SSO\";\n    LoginProviderType[\"Google\"] = \"Google\";\n})(LoginProviderType || (LoginProviderType = {}));\nexport class UserMeta extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * When signed in with SSO, this is the id of that user in the SSO system\n         */\n        this.loginProviderIds = new Map();\n    }\n}\n__decorate([\n    field({ decoder: new MapDecoder(new EnumDecoder(LoginProviderType), StringDecoder) })\n], UserMeta.prototype, \"loginProviderIds\", void 0);\nexport class User extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.organizationId = null;\n        this.memberId = null;\n        this.firstName = null;\n        this.lastName = null;\n        this.permissions = null;\n        /**\n         * Readonly\n         */\n        this.meta = null;\n        this.verified = false;\n        /**\n         * Readonly\n         */\n        this.hasAccount = false;\n        /**\n         * Readonly\n         */\n        this.hasPassword = false;\n    }\n    get name() {\n        if (!this.lastName) {\n            if (!this.firstName) {\n                return '';\n            }\n            return this.firstName;\n        }\n        return this.firstName + ' ' + this.lastName;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], User.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 245 })\n], User.prototype, \"organizationId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 281 })\n], User.prototype, \"memberId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 14 })\n], User.prototype, \"firstName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 14 })\n], User.prototype, \"lastName\", void 0);\n__decorate([\n    field({ decoder: EmailDecoder })\n], User.prototype, \"email\", void 0);\n__decorate([\n    field({ decoder: Permissions, nullable: true, version: 2, upgrade: () => null }),\n    field({\n        decoder: UserPermissions,\n        nullable: true,\n        version: 247,\n        upgrade: function (oldValue) {\n            if (!oldValue || !this.organizationId) {\n                return null;\n            }\n            const m = new Map();\n            m.set(this.organizationId, oldValue);\n            return UserPermissions.create({\n                globalPermissions: null,\n                organizationPermissions: m,\n            });\n        },\n    })\n], User.prototype, \"permissions\", void 0);\n__decorate([\n    field({ decoder: UserMeta, nullable: true, version: 191 })\n], User.prototype, \"meta\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 81 })\n], User.prototype, \"verified\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 162 })\n], User.prototype, \"hasAccount\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 360 })\n], User.prototype, \"hasPassword\", void 0);\nexport class NewUser extends User {\n    constructor() {\n        super(...arguments);\n        /**\n         * Will be empty in responses for now\n         */\n        this.password = '';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, version: 162 })\n], NewUser.prototype, \"password\", void 0);\nexport class ApiUser extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.organizationId = null;\n        this.name = null;\n        this.permissions = null;\n        this.createdAt = new Date();\n        this.expiresAt = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], ApiUser.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 245 })\n], ApiUser.prototype, \"organizationId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 14 })\n], ApiUser.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: Permissions, nullable: true, version: 2, upgrade: () => null }),\n    field({\n        decoder: UserPermissions,\n        nullable: true,\n        version: 247,\n        upgrade: function (oldValue) {\n            if (!oldValue || !this.organizationId) {\n                return null;\n            }\n            const m = new Map();\n            m.set(this.organizationId, oldValue);\n            return UserPermissions.create({\n                globalPermissions: null,\n                organizationPermissions: m,\n            });\n        },\n    })\n], ApiUser.prototype, \"permissions\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], ApiUser.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], ApiUser.prototype, \"expiresAt\", void 0);\nexport class ApiUserWithToken extends ApiUser {\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], ApiUserWithToken.prototype, \"token\", void 0);\n//# sourceMappingURL=User.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, EnumDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { LoginProviderType } from './User.js';\nexport class OpenIDClientConfiguration extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.issuer = '';\n        this.clientId = '';\n        this.clientSecret = '';\n        /**\n         * Best to set this to null to use working defaults\n         */\n        this.redirectUri = null;\n    }\n    static get placeholderClientSecret() {\n        return '••••';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], OpenIDClientConfiguration.prototype, \"issuer\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], OpenIDClientConfiguration.prototype, \"clientId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], OpenIDClientConfiguration.prototype, \"clientSecret\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, optional: true })\n], OpenIDClientConfiguration.prototype, \"redirectUri\", void 0);\nexport class OpenIDAuthTokenResponse extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], OpenIDAuthTokenResponse.prototype, \"ssoAuthToken\", void 0);\nexport class StartOpenIDFlowStruct extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.webshopId = null;\n        /**\n         * sso (= use one configured in organization), google, apple, ... (for now only sso supported)\n         */\n        this.provider = LoginProviderType.SSO;\n        this.prompt = null;\n        this.redirectUri = null;\n        /**\n         * Allows to connect an external SSO account to the currently logged in user.\n         * To use this, you'll need to request a one-time-usage auth token from /openid/auth-token\n         */\n        this.authToken = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, optional: true, nullable: true })\n], StartOpenIDFlowStruct.prototype, \"webshopId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], StartOpenIDFlowStruct.prototype, \"spaState\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(LoginProviderType) })\n], StartOpenIDFlowStruct.prototype, \"provider\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true, nullable: true })\n], StartOpenIDFlowStruct.prototype, \"prompt\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true, nullable: true })\n], StartOpenIDFlowStruct.prototype, \"redirectUri\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true, nullable: true })\n], StartOpenIDFlowStruct.prototype, \"authToken\", void 0);\n//# sourceMappingURL=OpenID.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { Address } from './addresses/Address.js';\nexport class OrganizationSimple extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.uri = '';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], OrganizationSimple.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 344 })\n], OrganizationSimple.prototype, \"uri\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], OrganizationSimple.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: Address })\n], OrganizationSimple.prototype, \"address\", void 0);\n//# sourceMappingURL=OrganizationSimple.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { Company } from './Company.js';\n/**\n * Who is paying / paid, and how can we contact them\n */\nexport class PaymentCustomer extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.firstName = null;\n        this.lastName = null;\n        this.email = null;\n        this.phone = null;\n        /**\n         * As soon as this is set, we can assume that the customer is a company\n         */\n        this.company = null;\n    }\n    get name() {\n        if (this.firstName && this.lastName) {\n            return `${this.firstName} ${this.lastName}`;\n        }\n        return this.firstName || this.lastName;\n    }\n    get dynamicName() {\n        if (this.company) {\n            return this.company.name || this.company.companyNumber || 'Onbekend bedrijf';\n        }\n        if (this.firstName && this.lastName) {\n            return `${this.firstName} ${this.lastName}`;\n        }\n        return this.firstName || this.lastName || this.email || this.phone || 'Onbekende klant';\n    }\n    get dynamicEmail() {\n        var _a;\n        return this.email || ((_a = this.company) === null || _a === void 0 ? void 0 : _a.administrationEmail) || null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], PaymentCustomer.prototype, \"firstName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], PaymentCustomer.prototype, \"lastName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], PaymentCustomer.prototype, \"email\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], PaymentCustomer.prototype, \"phone\", void 0);\n__decorate([\n    field({ decoder: Company, nullable: true })\n], PaymentCustomer.prototype, \"company\", void 0);\n//# sourceMappingURL=PaymentCustomer.js.map","import { Formatter } from '@stamhoofd/utility';\nexport var PaymentStatus;\n(function (PaymentStatus) {\n    PaymentStatus[\"Pending\"] = \"Pending\";\n    PaymentStatus[\"Failed\"] = \"Failed\";\n    PaymentStatus[\"Succeeded\"] = \"Succeeded\";\n    PaymentStatus[\"Created\"] = \"Created\";\n})(PaymentStatus || (PaymentStatus = {}));\nexport class PaymentStatusHelper {\n    static getName(method) {\n        switch (method) {\n            case PaymentStatus.Pending: return 'wacht op betaling';\n            case PaymentStatus.Created: return 'wacht op betaling';\n            case PaymentStatus.Succeeded: return 'ontvangen';\n            case PaymentStatus.Failed: return 'mislukt/geannuleerd';\n        }\n    }\n    static getNameCapitalized(method) {\n        return Formatter.capitalizeFirstLetter(PaymentStatusHelper.getName(method));\n    }\n}\n//# sourceMappingURL=PaymentStatus.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, field } from '@simonbackx/simple-encoding';\nimport { OpenIDClientConfiguration } from './OpenID.js';\nexport class PlatformServerConfig extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.ssoConfiguration = null;\n        this.googleConfiguration = null;\n    }\n}\n__decorate([\n    field({ decoder: OpenIDClientConfiguration, nullable: true, version: 360 })\n], PlatformServerConfig.prototype, \"ssoConfiguration\", void 0);\n__decorate([\n    field({ decoder: OpenIDClientConfiguration, nullable: true, version: 360 })\n], PlatformServerConfig.prototype, \"googleConfiguration\", void 0);\n//# sourceMappingURL=PlatformServerConfig.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, DateDecoder, EnumDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { Formatter } from '@stamhoofd/utility';\nimport { v4 as uuidv4 } from 'uuid';\nimport { PaymentCustomer } from '../PaymentCustomer.js';\nimport { downgradePaymentMethodV150, PaymentMethod, PaymentMethodHelper, PaymentMethodV150 } from '../PaymentMethod.js';\nimport { PaymentProvider } from '../PaymentProvider.js';\nimport { PaymentStatus } from '../PaymentStatus.js';\nimport { PaymentType, PaymentTypeHelper } from '../PaymentType.js';\nimport { TransferSettings } from '../webshops/TransferSettings.js';\nexport class Payment extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.type = PaymentType.Payment;\n        this.status = PaymentStatus.Created;\n        this.provider = null;\n        this.customer = null;\n        this.price = 0;\n        this.freeContribution = null;\n        // Transfer description if paid via transfer\n        this.transferDescription = null;\n        this.transferSettings = null;\n        this.paidAt = null;\n        this.createdAt = new Date();\n        this.updatedAt = new Date();\n        this.organizationId = null;\n        this.payingOrganizationId = null;\n    }\n    get isPending() {\n        return this.status !== PaymentStatus.Succeeded && this.status !== PaymentStatus.Failed;\n    }\n    get isOverDue() {\n        const daysToPay = 7;\n        return this.isPending && this.createdAt < new Date(new Date().getTime() - 1000 * 60 * 60 * 24 * daysToPay);\n    }\n    get isSucceeded() {\n        return this.status === PaymentStatus.Succeeded;\n    }\n    get isFailed() {\n        return this.status === PaymentStatus.Failed;\n    }\n    get canChangeStatus() {\n        return this.method === PaymentMethod.Transfer || this.method === PaymentMethod.PointOfSale || this.method === PaymentMethod.Unknown;\n    }\n    get title() {\n        if (this.method !== PaymentMethod.Unknown) {\n            if (this.type !== PaymentType.Payment) {\n                return 'Via ' + PaymentMethodHelper.getName(this.method);\n            }\n            return PaymentMethodHelper.getNameCapitalized(this.method);\n        }\n        return Formatter.capitalizeFirstLetter(PaymentTypeHelper.getName(this.type));\n    }\n    get theme() {\n        if (this.type === PaymentType.Reallocation) {\n            return 'theme-secundary';\n        }\n        if (this.type === PaymentType.Chargeback || this.type === PaymentType.Refund) {\n            return 'theme-error';\n        }\n    }\n    matchQuery(query) {\n        const lowerQuery = query.toLowerCase();\n        if (this.transferDescription && this.transferDescription.toLowerCase().includes(lowerQuery)) {\n            return true;\n        }\n        return false;\n    }\n    getHTMLTable() {\n        var _a, _b, _c, _d, _e, _f;\n        let str = `<table width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" class=\"email-data-table\"><tbody>`;\n        /**\n         * Replacement.create({\n                    token: \"priceToPay\",\n                    value: forcePayment?.status !== PaymentStatus.Succeeded ? Formatter.price(forcePayment?.price ?? 0) : \"\"\n                }),\n                Replacement.create({\n                    token: \"paymentMethod\",\n                    value: forcePayment?.method ? PaymentMethodHelper.getName(forcePayment.method) : PaymentMethodHelper.getName(this.data.paymentMethod)\n                }),\n                Replacement.create({\n                    token: \"transferDescription\",\n                    value: forcePayment?.status !== PaymentStatus.Succeeded && forcePayment?.method === PaymentMethod.Transfer ? (forcePayment?.transferDescription ?? \"\") : \"\"\n                }),\n                Replacement.create({\n                    token: \"transferBankAccount\",\n                    value: forcePayment?.status !== PaymentStatus.Succeeded && forcePayment?.method === PaymentMethod.Transfer ? ((webshop?.meta.transferSettings.iban ? webshop?.meta.transferSettings.iban : organization.meta.transferSettings.iban) ?? \"\") : \"\"\n                }),\n                Replacement.create({\n                    token: \"transferBankCreditor\",\n                    value: forcePayment?.status !== PaymentStatus.Succeeded && forcePayment?.method === PaymentMethod.Transfer ? ((webshop?.meta.transferSettings.creditor ? webshop?.meta.transferSettings.creditor : organization.meta.transferSettings.creditor) ?? organization.name) : \"\"\n                }),\n         */\n        const data = [\n            {\n                title: 'Betaalmethode',\n                value: this.method ? Formatter.capitalizeFirstLetter(PaymentMethodHelper.getName(this.method)) : '',\n            },\n            {\n                title: 'Te betalen',\n                value: this.status !== PaymentStatus.Succeeded ? Formatter.price((_a = this === null || this === void 0 ? void 0 : this.price) !== null && _a !== void 0 ? _a : 0) : Formatter.price(0),\n            },\n            ...(this.method === PaymentMethod.Transfer\n                ? [\n                    {\n                        title: 'Mededeling',\n                        value: (_b = this.transferDescription) !== null && _b !== void 0 ? _b : '',\n                    },\n                    {\n                        title: 'Rekeningnummer',\n                        value: (_d = (_c = this.transferSettings) === null || _c === void 0 ? void 0 : _c.iban) !== null && _d !== void 0 ? _d : '',\n                    },\n                    {\n                        title: 'Begunstigde',\n                        value: (_f = (_e = this.transferSettings) === null || _e === void 0 ? void 0 : _e.creditor) !== null && _f !== void 0 ? _f : '',\n                    },\n                ]\n                : []),\n        ];\n        for (const replacement of data) {\n            if (replacement.value.length == 0) {\n                continue;\n            }\n            str += `<tr><td><h4>${Formatter.escapeHtml(replacement.title)}</h4></td><td>${Formatter.escapeHtml(replacement.value)}</td></tr>`;\n        }\n        return str + '</tbody></table>';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], Payment.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(PaymentType), version: 353 })\n], Payment.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(PaymentMethodV150), nullable: true }),\n    field({\n        decoder: new EnumDecoder(PaymentMethod),\n        version: 151,\n        downgrade: downgradePaymentMethodV150,\n    })\n], Payment.prototype, \"method\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(PaymentStatus) })\n], Payment.prototype, \"status\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(PaymentProvider), nullable: true, version: 152 })\n], Payment.prototype, \"provider\", void 0);\n__decorate([\n    field({ decoder: PaymentCustomer, nullable: true, version: 321 })\n], Payment.prototype, \"customer\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], Payment.prototype, \"price\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 92 })\n], Payment.prototype, \"freeContribution\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], Payment.prototype, \"transferDescription\", void 0);\n__decorate([\n    field({ decoder: TransferSettings, nullable: true, version: 160 })\n], Payment.prototype, \"transferSettings\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], Payment.prototype, \"paidAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], Payment.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], Payment.prototype, \"updatedAt\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 324 })\n], Payment.prototype, \"organizationId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 344 })\n], Payment.prototype, \"payingOrganizationId\", void 0);\nexport class Settlement extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Fee for the payment provider for the individual payment\n         * Only set if it is witheld from the settlement/payout\n         */\n        this.fee = 0;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], Settlement.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Settlement.prototype, \"reference\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], Settlement.prototype, \"settledAt\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], Settlement.prototype, \"amount\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 195 })\n], Settlement.prototype, \"fee\", void 0);\nexport class PrivatePayment extends Payment {\n    constructor() {\n        super(...arguments);\n        this.settlement = null;\n        this.iban = null;\n        this.ibanName = null;\n        this.transferFee = 0;\n    }\n}\n__decorate([\n    field({ decoder: Settlement, nullable: true })\n], PrivatePayment.prototype, \"settlement\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 153 })\n], PrivatePayment.prototype, \"iban\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 153 })\n], PrivatePayment.prototype, \"ibanName\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 197 })\n], PrivatePayment.prototype, \"transferFee\", void 0);\n//# sourceMappingURL=Payment.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, DateDecoder, EnumDecoder, field, IntegerDecoder, MapDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Formatter, Sorter } from '@stamhoofd/utility';\nimport { Payment, PrivatePayment } from './members/Payment.js';\nexport var BalanceItemStatusV352;\n(function (BalanceItemStatusV352) {\n    BalanceItemStatusV352[\"Hidden\"] = \"Hidden\";\n    BalanceItemStatusV352[\"Pending\"] = \"Pending\";\n    BalanceItemStatusV352[\"Paid\"] = \"Paid\";\n})(BalanceItemStatusV352 || (BalanceItemStatusV352 = {}));\nexport var BalanceItemStatus;\n(function (BalanceItemStatus) {\n    /**\n     * The balance is not yet due, but it can be paid. As soon as it is paid, it will transform into 'Due' and automatic status changes can happen to connected resources.\n     */\n    BalanceItemStatus[\"Hidden\"] = \"Hidden\";\n    /**\n     * This means payment of the amount is a requirement.\n    */\n    BalanceItemStatus[\"Due\"] = \"Due\";\n    /**\n     * This means the balance is no longer due. If there is any paid amount, it is refundable.\n     * In case you don't want to refund the amount, you should change the status to 'Due' and change the amount to the amount that is not refundable.\n    */\n    BalanceItemStatus[\"Canceled\"] = \"Canceled\";\n})(BalanceItemStatus || (BalanceItemStatus = {}));\nexport var BalanceItemType;\n(function (BalanceItemType) {\n    BalanceItemType[\"Registration\"] = \"Registration\";\n    BalanceItemType[\"AdministrationFee\"] = \"AdministrationFee\";\n    BalanceItemType[\"FreeContribution\"] = \"FreeContribution\";\n    BalanceItemType[\"Order\"] = \"Order\";\n    BalanceItemType[\"Other\"] = \"Other\";\n    BalanceItemType[\"PlatformMembership\"] = \"PlatformMembership\";\n    BalanceItemType[\"CancellationFee\"] = \"CancellationFee\";\n})(BalanceItemType || (BalanceItemType = {}));\nexport function getBalanceItemStatusName(type) {\n    switch (type) {\n        case BalanceItemStatus.Hidden: return 'Verborgen';\n        case BalanceItemStatus.Due: return 'Verschuldigd';\n        case BalanceItemStatus.Canceled: return 'Geannuleerd';\n    }\n}\nexport function getBalanceItemTypeName(type) {\n    switch (type) {\n        case BalanceItemType.Registration: return 'Inschrijving';\n        case BalanceItemType.AdministrationFee: return 'Administratiekosten';\n        case BalanceItemType.FreeContribution: return 'Vrije bijdrage';\n        case BalanceItemType.Order: return 'Webshopbestelling';\n        case BalanceItemType.Other: return 'Andere';\n        case BalanceItemType.PlatformMembership: return 'Aansluiting';\n        case BalanceItemType.CancellationFee: return 'Annuleringskosten';\n    }\n}\nexport function getBalanceItemTypeIcon(type) {\n    switch (type) {\n        case BalanceItemType.Registration: return 'membership-filled';\n        case BalanceItemType.AdministrationFee: return 'calculator';\n        case BalanceItemType.FreeContribution: return 'gift';\n        case BalanceItemType.Order: return 'basket';\n        case BalanceItemType.Other: return 'box';\n        case BalanceItemType.PlatformMembership: return 'membership-filled';\n        case BalanceItemType.CancellationFee: return 'canceled';\n    }\n}\nexport var BalanceItemRelationType;\n(function (BalanceItemRelationType) {\n    BalanceItemRelationType[\"Webshop\"] = \"Webshop\";\n    BalanceItemRelationType[\"Group\"] = \"Group\";\n    BalanceItemRelationType[\"GroupPrice\"] = \"GroupPrice\";\n    BalanceItemRelationType[\"GroupOptionMenu\"] = \"GroupOptionMenu\";\n    BalanceItemRelationType[\"GroupOption\"] = \"GroupOption\";\n    BalanceItemRelationType[\"Member\"] = \"Member\";\n    BalanceItemRelationType[\"MembershipType\"] = \"MembershipType\";\n})(BalanceItemRelationType || (BalanceItemRelationType = {}));\nexport function getBalanceItemRelationTypeName(type) {\n    switch (type) {\n        case BalanceItemRelationType.Webshop: return 'Webshop';\n        case BalanceItemRelationType.Group: return 'Inschrijving';\n        case BalanceItemRelationType.GroupPrice: return 'Tarief';\n        case BalanceItemRelationType.GroupOptionMenu: return 'Keuzemenu';\n        case BalanceItemRelationType.GroupOption: return 'Keuze';\n        case BalanceItemRelationType.Member: return 'Lid';\n        case BalanceItemRelationType.MembershipType: return 'Aansluitingstype';\n    }\n}\nexport function getBalanceItemRelationTypeDescription(type) {\n    switch (type) {\n        case BalanceItemRelationType.Webshop: return 'Webshop geassocieerd aan dit item';\n        case BalanceItemRelationType.Group: return 'Naam van de groep of activiteit geassocieerd aan dit item';\n        case BalanceItemRelationType.GroupPrice: return 'Tarief dat gekozen werd voor de groep of activiteit';\n        case BalanceItemRelationType.GroupOptionMenu: return 'Naam van het keuzemenu waaruit gekozen werd';\n        case BalanceItemRelationType.GroupOption: return 'De gekozen optie van het keuzemenu waarvoor betaald werd. Als er meerdere keuzes gekozen werden, dan wordt er per keuze een apart item aangemaakt.';\n        case BalanceItemRelationType.Member: return 'Naam van het lid geassocieerd aan dit item';\n        case BalanceItemRelationType.MembershipType: return 'Naam van het aansluitingstype geassocieerd aan dit item';\n    }\n}\nexport function shouldAggregateOnRelationType(type, allRelations) {\n    switch (type) {\n        case BalanceItemRelationType.GroupPrice:\n            // Only aggregate on group price if it is not for a specific option (we'll combine all options in one group, regardless of the corresponding groupPrice)\n            return !allRelations.has(BalanceItemRelationType.GroupOption);\n        case BalanceItemRelationType.Member: return true;\n    }\n    return false;\n}\n/**\n * Helps you understand what a balance item is for. It can be for multiple things at the same time, e.g. when it is an option to buy a ticket, it is also a ticket.\n */\nexport class BalanceItemRelation extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], BalanceItemRelation.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], BalanceItemRelation.prototype, \"name\", void 0);\nexport function doBalanceItemRelationsMatch(a, b, allowedDifference = 0) {\n    if (allowedDifference === 0 && a.size !== b.size) {\n        return false;\n    }\n    if (a.size === 0 || b.size === 0) {\n        return false;\n    }\n    allowedDifference = Math.min(allowedDifference, a.size, b.size);\n    let differences = 0;\n    for (const [key, value] of a.entries()) {\n        const other = b.get(key);\n        if (!other || other.id !== value.id) {\n            differences++;\n            if (differences > allowedDifference) {\n                return false;\n            }\n        }\n    }\n    for (const [key] of b.entries()) {\n        const other = a.get(key);\n        if (other) {\n            // Already handled in previous loop\n            continue;\n        }\n        differences++;\n        if (differences > allowedDifference) {\n            return false;\n        }\n    }\n    return true;\n}\nexport class BalanceItem extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.type = BalanceItemType.Other;\n        this.relations = new Map();\n        this.description = '';\n        this.amount = 1;\n        this.unitPrice = 0; // unit price\n        this.pricePaid = 0;\n        this.pricePending = 0;\n        this.dueAt = null;\n        this.createdAt = new Date();\n        this.status = BalanceItemStatus.Due;\n        this.organizationId = '';\n        this.memberId = null;\n        this.userId = null;\n        this.registrationId = null;\n        this.payingOrganizationId = null;\n    }\n    get price() {\n        if (this.status === BalanceItemStatus.Hidden || this.status === BalanceItemStatus.Canceled) {\n            return 0;\n        }\n        return this.unitPrice * this.amount;\n    }\n    get priceOpen() {\n        if (this.status === BalanceItemStatus.Hidden || this.status === BalanceItemStatus.Canceled) {\n            return -this.pricePaid - this.pricePending;\n        }\n        return this.price - this.pricePaid - this.pricePending;\n    }\n    get isPaid() {\n        return this.pricePaid === this.price;\n    }\n    get isDue() {\n        if (this.status === BalanceItemStatus.Hidden || this.status === BalanceItemStatus.Canceled) {\n            if (this.priceOpen !== 0) {\n                // A paid amount remaining\n                return true;\n            }\n            return false;\n        }\n        return this.dueAt === null || this.dueAt <= BalanceItem.getDueOffset();\n    }\n    get isOverDue() {\n        return this.priceOpen > 0 && this.dueAt !== null && this.dueAt <= new Date();\n    }\n    static getDueOffset(from = new Date()) {\n        const d = new Date(from.getTime() + 1000 * 60 * 60 * 24 * 7); // Added to outstanding balance 7 days before due date\n        // Set time to midnight in Brussels timezone\n        const l = Formatter.luxon(d);\n        l.set({ hour: 0, minute: 0, second: 0, millisecond: 0 });\n        return l.toJSDate();\n    }\n    static getOutstandingBalance(items) {\n        // Get sum of balance payments\n        const totalPending = items.map(p => p.pricePending).reduce((t, total) => total + t, 0);\n        const totalPaid = items.map(p => p.pricePaid).reduce((t, total) => total + t, 0);\n        const totalPrice = items.map(p => p.price).reduce((t, total) => total + t, 0);\n        const totalOpen = items.map(p => p.priceOpen).reduce((t, total) => total + t, 0);\n        return {\n            /**\n             * @deprecated\n             */\n            totalPending, // Pending payment\n            /**\n             * @deprecated\n             */\n            totalOpen, // Not yet started\n            /**\n             * @deprecated\n             */\n            total: totalPending + totalOpen, // total not yet paid\n            price: totalPrice,\n            pricePending: totalPending,\n            priceOpen: totalOpen,\n            pricePaid: totalPaid,\n        };\n    }\n    static filterBalanceItems(items) {\n        return items.filter(i => BalanceItem.getOutstandingBalance([i]).priceOpen !== 0).sort((a, b) => {\n            var _a, _b;\n            return Sorter.stack(Sorter.byDateValue((_a = b.dueAt) !== null && _a !== void 0 ? _a : new Date(0), (_b = a.dueAt) !== null && _b !== void 0 ? _b : new Date(0)), Sorter.byDateValue(b.createdAt, a.createdAt));\n        });\n    }\n    get paymentShortDescription() {\n        var _a, _b, _c, _d;\n        // This doesn't list individual options\n        switch (this.type) {\n            case BalanceItemType.Registration: {\n                const option = this.relations.get(BalanceItemRelationType.GroupOption);\n                const group = ((_a = this.relations.get(BalanceItemRelationType.Group)) === null || _a === void 0 ? void 0 : _a.name) || 'Onbekende inschrijvingsgroep';\n                if (option) {\n                    return 'keuzeoptie voor ' + group;\n                }\n                return 'inschrijving voor ' + group;\n            }\n            case BalanceItemType.CancellationFee: {\n                const option = this.relations.get(BalanceItemRelationType.GroupOption);\n                const group = (_b = this.relations.get(BalanceItemRelationType.Group)) === null || _b === void 0 ? void 0 : _b.name;\n                if (group) {\n                    if (option) {\n                        return 'annuleringskost voor keuzeoptie bij ' + group;\n                    }\n                    return 'annuleringskost voor inschrijving bij ' + group;\n                }\n                return 'annuleringskost';\n            }\n            case BalanceItemType.AdministrationFee: return 'administratiekosten';\n            case BalanceItemType.FreeContribution: return 'vrije bijdrage';\n            case BalanceItemType.Order: return ((_c = this.relations.get(BalanceItemRelationType.Webshop)) === null || _c === void 0 ? void 0 : _c.name) || 'onbekende webshop';\n            case BalanceItemType.Other: return this.description;\n            case BalanceItemType.PlatformMembership: return 'aansluiting voor ' + ((_d = this.relations.get(BalanceItemRelationType.MembershipType)) === null || _d === void 0 ? void 0 : _d.name) || 'onbekend aansluitingstype';\n        }\n    }\n    /**\n     * To help split payments in categories: return a more detailed category than purely the type\n     */\n    get category() {\n        var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;\n        switch (this.type) {\n            case BalanceItemType.Registration: {\n                return (_b = (_a = this.relations.get(BalanceItemRelationType.Group)) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : 'onbekende inschrijvingsgroep';\n            }\n            case BalanceItemType.CancellationFee: return (_h = (_f = (_d = (_c = this.relations.get(BalanceItemRelationType.Group)) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : (_e = this.relations.get(BalanceItemRelationType.Webshop)) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : (_g = this.relations.get(BalanceItemRelationType.MembershipType)) === null || _g === void 0 ? void 0 : _g.name) !== null && _h !== void 0 ? _h : 'annuleringskosten';\n            case BalanceItemType.AdministrationFee: return 'administratiekosten';\n            case BalanceItemType.FreeContribution: return 'vrije bijdrage';\n            case BalanceItemType.Order: return (_k = (_j = this.relations.get(BalanceItemRelationType.Webshop)) === null || _j === void 0 ? void 0 : _j.name) !== null && _k !== void 0 ? _k : 'onbekende webshop';\n            case BalanceItemType.Other: return this.description;\n            case BalanceItemType.PlatformMembership: return (_m = (_l = this.relations.get(BalanceItemRelationType.MembershipType)) === null || _l === void 0 ? void 0 : _l.name) !== null && _m !== void 0 ? _m : 'aansluitingen';\n        }\n    }\n    get groupTitle() {\n        return this.itemTitle;\n    }\n    get groupDescription() {\n        var _a;\n        switch (this.type) {\n            case BalanceItemType.Registration: {\n                const option = this.relations.get(BalanceItemRelationType.GroupOption);\n                if (option) {\n                    const group = ((_a = this.relations.get(BalanceItemRelationType.Group)) === null || _a === void 0 ? void 0 : _a.name) || 'Onbekende inschrijvingsgroep';\n                    return 'Keuzeoptie ' + group;\n                }\n                break;\n            }\n            case BalanceItemType.CancellationFee: {\n                const list = [];\n                // List all relations\n                for (const [key, value] of this.relations.entries()) {\n                    if (shouldAggregateOnRelationType(key, this.relations)) {\n                        list.push(getBalanceItemRelationTypeName(key) + ': ' + value.name);\n                    }\n                }\n                return list.join('\\n');\n            }\n        }\n        return null;\n    }\n    get priceBreakown() {\n        const all = [\n            {\n                name: 'Reeds betaald',\n                price: this.pricePaid,\n            },\n            {\n                name: 'In verwerking',\n                price: this.pricePending,\n            },\n        ].filter(a => a.price !== 0);\n        if (all.length > 0) {\n            all.unshift({\n                name: 'Totaalprijs',\n                price: this.price,\n            });\n        }\n        return [\n            ...all,\n            {\n                name: this.priceOpen < 0 ? 'Terug te betalen' : 'Te betalen',\n                price: Math.abs(this.priceOpen),\n            },\n        ];\n    }\n    /**\n     * Unique identifier whithing a reporting group\n     */\n    get groupCode() {\n        if (this.type === BalanceItemType.Other) {\n            return 'type-' + this.type\n                + '-' + this.status\n                + '-unit-price-' + this.unitPrice\n                + '-description-' + this.description\n                + '-due-date-' + (this.dueAt ? Formatter.dateIso(this.dueAt) : 'null');\n        }\n        return 'type-' + this.type\n            + '-' + this.status\n            + '-unit-price-' + this.unitPrice\n            + '-due-date-' + (this.dueAt ? Formatter.dateIso(this.dueAt) : 'null')\n            + '-relations' + Array.from(this.relations.entries())\n            .filter(([key]) => !shouldAggregateOnRelationType(key, this.relations))\n            .map(([key, value]) => key + '-' + value.id)\n            .join('-');\n    }\n    /**\n     * When displayed as a single item\n     */\n    get itemTitle() {\n        var _a, _b, _c, _d, _e;\n        switch (this.type) {\n            case BalanceItemType.Registration: {\n                const option = this.relations.get(BalanceItemRelationType.GroupOption);\n                if (option) {\n                    const optionMenu = this.relations.get(BalanceItemRelationType.GroupOptionMenu);\n                    return ((_a = optionMenu === null || optionMenu === void 0 ? void 0 : optionMenu.name) !== null && _a !== void 0 ? _a : 'Onbekend') + ': ' + option.name;\n                }\n                const group = ((_b = this.relations.get(BalanceItemRelationType.Group)) === null || _b === void 0 ? void 0 : _b.name) || 'Onbekende inschrijvingsgroep';\n                const price = (_c = this.relations.get(BalanceItemRelationType.GroupPrice)) === null || _c === void 0 ? void 0 : _c.name;\n                return 'Inschrijving voor ' + group + (price && price !== 'Standaardtarief' ? ' (' + price + ')' : '');\n            }\n            case BalanceItemType.CancellationFee: return 'Annuleringskosten';\n            case BalanceItemType.AdministrationFee: return 'Administratiekosten';\n            case BalanceItemType.FreeContribution: return 'Vrije bijdrage';\n            case BalanceItemType.Order: return ((_d = this.relations.get(BalanceItemRelationType.Webshop)) === null || _d === void 0 ? void 0 : _d.name) || 'Onbekende webshop';\n            case BalanceItemType.Other: return this.description;\n            case BalanceItemType.PlatformMembership: return 'Aansluiting voor ' + ((_e = this.relations.get(BalanceItemRelationType.MembershipType)) === null || _e === void 0 ? void 0 : _e.name) || 'Onbekend aansluitingstype';\n        }\n    }\n    /**\n     * When displayed as a single item\n     */\n    get itemDescription() {\n        var _a;\n        switch (this.type) {\n            case BalanceItemType.Registration: {\n                const option = this.relations.get(BalanceItemRelationType.GroupOption);\n                let prefix = '';\n                if (option) {\n                    const group = ((_a = this.relations.get(BalanceItemRelationType.Group)) === null || _a === void 0 ? void 0 : _a.name) || 'Onbekende inschrijvingsgroep';\n                    prefix = 'Keuzeoptie ' + group;\n                }\n                const member = this.relations.get(BalanceItemRelationType.Member);\n                if (member) {\n                    return (prefix ? (prefix + '\\n') : '') + member.name;\n                }\n                return prefix;\n            }\n            case BalanceItemType.PlatformMembership: {\n                const member = this.relations.get(BalanceItemRelationType.Member);\n                if (member) {\n                    return member.name;\n                }\n                break;\n            }\n            case BalanceItemType.CancellationFee: {\n                const list = [];\n                // List all relations\n                for (const [key, value] of this.relations.entries()) {\n                    list.push(getBalanceItemRelationTypeName(key) + ': ' + value.name);\n                }\n                return list.join('\\n');\n            }\n        }\n        return null;\n    }\n    static getDetailsHTMLTable(items) {\n        var _a;\n        const grouped = GroupedBalanceItems.group(BalanceItem.filterBalanceItems(items));\n        if (grouped.length === 0) {\n            return '<p class=\"description\">Geen openstaand bedrag</p>';\n        }\n        let str = '';\n        str += `<table width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" class=\"email-data-table\"><tbody>`;\n        for (const item of grouped) {\n            let prefix = '';\n            let prefixClass = '';\n            const title = item.itemTitle;\n            let description = Formatter.escapeHtml((_a = item.itemDescription) !== null && _a !== void 0 ? _a : '');\n            let price = '';\n            if (item.dueAt) {\n                prefix = `Te betalen tegen ${Formatter.date(item.dueAt)}`;\n                if (item.isOverDue) {\n                    prefixClass = 'error';\n                }\n            }\n            else if (item.status === BalanceItemStatus.Canceled) {\n                prefix = 'Geannuleerd';\n                prefixClass = 'error';\n            }\n            else if (item.priceOpen < 0 && item.pricePaid > item.price && item.pricePaid > 0) {\n                prefix = 'Te veel betaald';\n            }\n            else if (item.priceOpen < 0) {\n                prefix = 'Terug te krijgen';\n            }\n            if (!item.isDue) {\n                price = `(${Formatter.price(item.priceOpen)})`;\n            }\n            else {\n                price = Formatter.price(item.priceOpen);\n            }\n            if (item.price === item.amount * item.unitPrice) {\n                if (description) {\n                    description += `\\n`;\n                }\n                description += `${Formatter.escapeHtml(Formatter.float(item.amount))} x ${Formatter.escapeHtml(Formatter.price(item.unitPrice))}`;\n            }\n            else {\n                if (description) {\n                    description += `\\n`;\n                }\n                description += `<span class=\"email-style-discount-old-price\">${Formatter.escapeHtml(Formatter.float(item.amount))} x ${Formatter.escapeHtml(Formatter.price(item.unitPrice))}</span><span class=\"email-style-discount-price\">${Formatter.escapeHtml(Formatter.price(item.price))}</span>`;\n            }\n            if (item.pricePaid !== 0 && item.pricePaid !== (item.amount * item.unitPrice)) {\n                if (description) {\n                    description += `\\n`;\n                }\n                description += `Betaald: ${Formatter.price(item.pricePaid)}`;\n            }\n            if (item.pricePending !== 0) {\n                if (description) {\n                    description += `\\n`;\n                }\n                description += `In verwerking: ${Formatter.price(item.pricePending)}`;\n            }\n            str += `<tr><td>${prefix ? `<p class=\"email-style-title-prefix-list${prefixClass ? ' ' + prefixClass : ''}\">${Formatter.escapeHtml(prefix)}</p>` : ''}<h4 class=\"email-style-title-list\">${Formatter.escapeHtml(title)}</h4>${description ? `<p class=\"email-style-description-small pre-wrap\">${description}</p>` : ''}</td><td>${Formatter.escapeHtml(price)}</td></tr>`;\n        }\n        return str + '</tbody></table>';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], BalanceItem.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(BalanceItemType), version: 307 })\n], BalanceItem.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: new MapDecoder(new EnumDecoder(BalanceItemRelationType), BalanceItemRelation), version: 307 })\n], BalanceItem.prototype, \"relations\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], BalanceItem.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 307 })\n], BalanceItem.prototype, \"amount\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, field: 'price' }),\n    field({ decoder: IntegerDecoder, field: 'unitPrice', version: 307 })\n], BalanceItem.prototype, \"unitPrice\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], BalanceItem.prototype, \"pricePaid\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 335 })\n], BalanceItem.prototype, \"pricePending\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 353 })\n], BalanceItem.prototype, \"dueAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], BalanceItem.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(BalanceItemStatusV352) }),\n    field({ decoder: new EnumDecoder(BalanceItemStatus), version: 353,\n        upgrade(old) {\n            switch (old) {\n                case BalanceItemStatusV352.Pending: return BalanceItemStatus.Due;\n                case BalanceItemStatusV352.Paid: return BalanceItemStatus.Due;\n            }\n            return old;\n        },\n        downgrade(newer) {\n            switch (newer) {\n                case BalanceItemStatus.Due: return BalanceItemStatusV352.Pending;\n                case BalanceItemStatus.Canceled: return BalanceItemStatusV352.Pending;\n            }\n            return newer;\n        },\n    })\n], BalanceItem.prototype, \"status\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], BalanceItem.prototype, \"organizationId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], BalanceItem.prototype, \"memberId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], BalanceItem.prototype, \"userId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], BalanceItem.prototype, \"registrationId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 353 })\n], BalanceItem.prototype, \"payingOrganizationId\", void 0);\nexport class BalanceItemPayment extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], BalanceItemPayment.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], BalanceItemPayment.prototype, \"price\", void 0);\nexport class BalanceItemPaymentWithPayment extends BalanceItemPayment {\n}\n__decorate([\n    field({ decoder: Payment })\n], BalanceItemPaymentWithPayment.prototype, \"payment\", void 0);\nexport class BalanceItemPaymentWithPrivatePayment extends BalanceItemPayment {\n}\n__decorate([\n    field({ decoder: PrivatePayment })\n], BalanceItemPaymentWithPrivatePayment.prototype, \"payment\", void 0);\nexport class BalanceItemWithPayments extends BalanceItem {\n    constructor() {\n        super(...arguments);\n        this.payments = [];\n    }\n    updatePricePaid() {\n        this.pricePaid = this.payments.reduce((total, payment) => total + (payment.payment.isSucceeded ? payment.price : 0), 0);\n    }\n    /**\n     * Return whether a payment has been initiated for this balance item\n     */\n    get hasPendingPayment() {\n        return !!this.payments.find(p => p.payment.isPending);\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(BalanceItemPaymentWithPayment) })\n], BalanceItemWithPayments.prototype, \"payments\", void 0);\nexport class BalanceItemWithPrivatePayments extends BalanceItemWithPayments {\n    constructor() {\n        super(...arguments);\n        this.payments = [];\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(BalanceItemPaymentWithPrivatePayment) })\n], BalanceItemWithPrivatePayments.prototype, \"payments\", void 0);\nexport class GroupedBalanceItems {\n    constructor() {\n        this.items = [];\n    }\n    get id() {\n        return this.items[0].groupCode;\n    }\n    add(item) {\n        this.items.push(item);\n    }\n    get balanceItem() {\n        return this.items[0];\n    }\n    /**\n     * Only shows amount open\n     */\n    get amount() {\n        return this.items.reduce((acc, item) => acc + item.amount, 0);\n    }\n    get status() {\n        return this.balanceItem.status;\n    }\n    /**\n     * Only shows outstanding price\n     */\n    get priceOpen() {\n        return this.items.reduce((acc, item) => acc + item.priceOpen, 0);\n    }\n    get price() {\n        return this.items.reduce((acc, item) => acc + item.price, 0);\n    }\n    get pricePending() {\n        return this.items.reduce((acc, item) => acc + item.pricePending, 0);\n    }\n    get pricePaid() {\n        return this.items.reduce((acc, item) => acc + item.pricePaid, 0);\n    }\n    get itemTitle() {\n        if (this.items.length === 1) {\n            // Return normal prefix\n            return this.items[0].itemTitle;\n        }\n        return this.items[0].groupTitle;\n    }\n    get itemDescription() {\n        if (this.items.length === 1) {\n            // Return normal prefix\n            return this.items[0].itemDescription;\n        }\n        return this.items[0].groupDescription;\n    }\n    get unitPrice() {\n        return this.items[0].unitPrice;\n    }\n    get dueAt() {\n        return this.items[0].dueAt;\n        ;\n    }\n    get isDue() {\n        return this.items[0].isDue;\n    }\n    get isOverDue() {\n        return this.items[0].isOverDue;\n    }\n    get type() {\n        return this.items[0].type;\n    }\n    static group(items) {\n        const map = new Map();\n        for (const item of items) {\n            const code = item.groupCode;\n            if (!map.has(code)) {\n                map.set(code, new GroupedBalanceItems());\n            }\n            map.get(code).add(item);\n        }\n        return Array.from(map.values()).filter(v => v.priceOpen !== 0);\n    }\n}\n//# sourceMappingURL=BalanceItem.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, DateDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { Formatter, StringCompare } from '@stamhoofd/utility';\nimport { v4 as uuidv4 } from 'uuid';\nexport class EmergencyContact extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.phone = null;\n        this.title = '';\n        this.createdAt = new Date();\n        /**\n         * Stores the timestamp the contact was last edited in the UI (not the same as edited in the database - this is used to find the most correct data in case of duplicates)\n         */\n        this.updatedAt = null;\n    }\n    /**\n     * Call this to clean up capitals in all the available data\n     */\n    cleanData() {\n        if (StringCompare.isFullCaps(this.name)) {\n            this.name = Formatter.capitalizeWords(this.name.toLowerCase());\n        }\n        if (StringCompare.isFullCaps(this.title)) {\n            this.title = this.title.toLowerCase();\n        }\n        this.name = Formatter.capitalizeFirstLetter(this.name.trim());\n        this.title = this.title.trim();\n        this.title = Formatter.capitalizeFirstLetter(this.title);\n    }\n    isEqual(other) {\n        this.cleanData();\n        other.cleanData();\n        return this.name === other.name && this.phone === other.phone && this.title === other.title;\n    }\n    merge(other) {\n        if (other.name.length > 0) {\n            this.name = other.name;\n        }\n        if (other.phone) {\n            this.phone = other.phone;\n        }\n        if (other.title) {\n            this.title = other.title;\n        }\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], EmergencyContact.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EmergencyContact.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], EmergencyContact.prototype, \"phone\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EmergencyContact.prototype, \"title\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, version: 367 })\n], EmergencyContact.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 367 })\n], EmergencyContact.prototype, \"updatedAt\", void 0);\n//# sourceMappingURL=EmergencyContact.js.map","export var ParentType;\n(function (ParentType) {\n    ParentType[\"Mother\"] = \"Mother\";\n    ParentType[\"Father\"] = \"Father\";\n    ParentType[\"Stepfather\"] = \"Stepfather\";\n    ParentType[\"Stepmother\"] = \"Stepmother\";\n    ParentType[\"FosterParent\"] = \"FosterParent\";\n    ParentType[\"Parent1\"] = \"Parent1\";\n    ParentType[\"Parent2\"] = \"Parent2\";\n    ParentType[\"Other\"] = \"Other\";\n})(ParentType || (ParentType = {}));\nexport class ParentTypeHelper {\n    static getName(type) {\n        switch (type) {\n            case ParentType.Mother:\n                return 'Mama';\n            case ParentType.Father:\n                return 'Papa';\n            case ParentType.Stepmother:\n                return 'Plusmama';\n            case ParentType.Stepfather:\n                return 'Pluspapa';\n            case ParentType.Parent1:\n                return 'Ouder 1';\n            case ParentType.Parent2:\n                return 'Ouder 2';\n            case ParentType.Other:\n                return 'Voogd';\n            case ParentType.FosterParent:\n                return 'Pleegouder';\n        }\n    }\n    static getPublicTypes() {\n        return [ParentType.Mother, ParentType.Father, ParentType.Stepmother, ParentType.Stepfather, ParentType.FosterParent, ParentType.Other];\n    }\n}\n//# sourceMappingURL=ParentType.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, DateDecoder, EnumDecoder, field, StringDecoder, SymbolDecoder } from '@simonbackx/simple-encoding';\nimport { DataValidator, Formatter, StringCompare } from '@stamhoofd/utility';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Address } from '../addresses/Address.js';\nimport { ParentType, ParentTypeHelper } from './ParentType.js';\nimport { NationalRegisterNumberOptOut } from './NationalRegisterNumberOptOut.js';\nexport class Parent extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.type = ParentType.Mother;\n        this.firstName = '';\n        this.lastName = '';\n        this.nationalRegisterNumber = null;\n        this.phone = null;\n        this.email = null;\n        this.alternativeEmails = [];\n        this.address = null;\n        this.createdAt = new Date();\n        /**\n         * Stores the timestamp the parent was last edited in the UI (not the same as edited in the database - this is used to find the most correct data in case of duplicates)\n         */\n        this.updatedAt = null;\n    }\n    get name() {\n        if (!this.firstName) {\n            return this.lastName;\n        }\n        if (!this.lastName) {\n            return this.firstName;\n        }\n        return this.firstName + ' ' + this.lastName;\n    }\n    getDiffName() {\n        return this.name + ` (${ParentTypeHelper.getName(this.type)})`;\n    }\n    matchQuery(query) {\n        if (StringCompare.typoCount(this.firstName, query) < 2\n            || StringCompare.typoCount(this.lastName, query) < 2\n            || StringCompare.typoCount(this.name, query) < 2) {\n            return true;\n        }\n        return false;\n    }\n    getEmails() {\n        const userEmails = [...this.alternativeEmails];\n        if (this.email) {\n            userEmails.unshift(this.email);\n        }\n        return userEmails;\n    }\n    hasEmail(email) {\n        const cleaned = email.toLowerCase().trim();\n        if (this.email === cleaned) {\n            return true;\n        }\n        return this.alternativeEmails.includes(cleaned);\n    }\n    /**\n     * Call this to clean up capitals in all the available data\n     */\n    cleanData() {\n        var _a;\n        if (StringCompare.isFullCaps(this.firstName)) {\n            this.firstName = Formatter.capitalizeWords(Formatter.removeDuplicateSpaces(this.firstName.toLowerCase()));\n        }\n        if (StringCompare.isFullCaps(this.lastName)) {\n            this.lastName = Formatter.capitalizeWords(Formatter.removeDuplicateSpaces(this.lastName.toLowerCase()));\n        }\n        if (this.email) {\n            this.email = this.email.toLowerCase().trim();\n            if (!DataValidator.isEmailValid(this.email)) {\n                this.email = null;\n            }\n        }\n        this.alternativeEmails = Formatter.uniqueArray(this.alternativeEmails.map(e => e.toLowerCase().trim()).filter((email) => {\n            if (this.email && email === this.email) {\n                return false;\n            }\n            if (!DataValidator.isEmailValid(email)) {\n                return false;\n            }\n            return true;\n        }));\n        if (this.phone) {\n            this.phone = Formatter.removeDuplicateSpaces(this.phone.trim());\n        }\n        this.firstName = Formatter.capitalizeFirstLetter(Formatter.removeDuplicateSpaces(this.firstName.trim()));\n        this.lastName = Formatter.removeDuplicateSpaces(this.lastName.trim());\n        if (this.lastName === this.lastName.toLocaleLowerCase()) {\n            // Add auto capitals\n            this.lastName = Formatter.capitalizeWords(this.lastName);\n        }\n        (_a = this.address) === null || _a === void 0 ? void 0 : _a.cleanData();\n    }\n    isEqual(other) {\n        var _a, _b;\n        this.cleanData();\n        other.cleanData();\n        return this.firstName === other.firstName && this.lastName === other.lastName && this.email === other.email && this.phone === other.phone && ((_a = this.address) === null || _a === void 0 ? void 0 : _a.toString()) === ((_b = other.address) === null || _b === void 0 ? void 0 : _b.toString());\n    }\n    /**\n     * Merge, giving other priority over this\n     */\n    merge(other) {\n        if (other.firstName.length > 0) {\n            this.firstName = other.firstName;\n        }\n        if (other.lastName.length > 0) {\n            this.lastName = other.lastName;\n        }\n        // note: do not change createdAt\n        if (other.updatedAt) {\n            this.updatedAt = other.updatedAt;\n        }\n        this.alternativeEmails = Formatter.uniqueArray([...other.getEmails(), ...this.getEmails()]);\n        if (other.email) {\n            this.email = other.email;\n        }\n        if (other.address) {\n            this.address = other.address;\n        }\n        if (other.phone) {\n            this.phone = other.phone;\n        }\n        if (other.type) {\n            if (other.type === ParentType.Parent1 || other.type === ParentType.Parent2) {\n                // Ignore if current type is also not one of those\n                if (this.type === ParentType.Parent1 || this.type === ParentType.Parent2) {\n                    this.type = other.type;\n                }\n            }\n            else {\n                this.type = other.type;\n            }\n        }\n        if (other.nationalRegisterNumber) {\n            this.nationalRegisterNumber = other.nationalRegisterNumber;\n        }\n        this.cleanData();\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], Parent.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(ParentType) })\n], Parent.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Parent.prototype, \"firstName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Parent.prototype, \"lastName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 348, nullable: true }),\n    field({\n        decoder: new SymbolDecoder(StringDecoder, NationalRegisterNumberOptOut),\n        version: 349,\n        nullable: true,\n        downgrade: (n) => n === NationalRegisterNumberOptOut ? null : n,\n    })\n], Parent.prototype, \"nationalRegisterNumber\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], Parent.prototype, \"phone\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, field: 'mail' }),\n    field({ decoder: StringDecoder, nullable: true, version: 5 })\n], Parent.prototype, \"email\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), version: 278 })\n], Parent.prototype, \"alternativeEmails\", void 0);\n__decorate([\n    field({ decoder: Address, nullable: true })\n], Parent.prototype, \"address\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, version: 367 })\n], Parent.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 367 })\n], Parent.prototype, \"updatedAt\", void 0);\n//# sourceMappingURL=Parent.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, DateDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { AuditLogReplacement } from '../AuditLogReplacement.js';\nimport { Formatter } from '@stamhoofd/utility';\n/**\n * Keep a timestamp of when certain information was reviewed of a member\n */\nexport class ReviewTime extends AutoEncoder {\n    getDiffName() {\n        return AuditLogReplacement.key('reviewTime.' + this.name);\n    }\n    getDiffValue() {\n        return AuditLogReplacement.string(Formatter.dateNumber(this.reviewedAt, true));\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], ReviewTime.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], ReviewTime.prototype, \"reviewedAt\", void 0);\nexport class ReviewTimes extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.times = [];\n    }\n    markReviewed(name, date) {\n        for (const time of this.times) {\n            if (time.name === name) {\n                if (date && date < time.reviewedAt) {\n                    // Can't decrease time\n                    return;\n                }\n                time.reviewedAt = date !== null && date !== void 0 ? date : new Date();\n                return;\n            }\n        }\n        this.times.push(ReviewTime.create({\n            name,\n            reviewedAt: date !== null && date !== void 0 ? date : new Date(),\n        }));\n    }\n    removeReview(name) {\n        this.times = this.times.filter(t => t.name !== name);\n    }\n    getLastReview(name) {\n        if (!name) {\n            if (this.times.length === 0) {\n                return;\n            }\n            return new Date(Math.min(...this.times.map(t => t.reviewedAt.getTime())));\n        }\n        for (const time of this.times) {\n            if (time.name === name) {\n                return time.reviewedAt;\n            }\n        }\n    }\n    merge(other) {\n        for (const time of other.times) {\n            this.markReviewed(time.name, time.reviewedAt);\n        }\n    }\n    isReviewed(name) {\n        const time = this.getLastReview(name);\n        if (!time) {\n            return false;\n        }\n        return true;\n    }\n    isOutdated(name, timeoutMs) {\n        const time = this.getLastReview(name);\n        if (!time) {\n            return true;\n        }\n        if (time.getTime() < new Date().getTime() - timeoutMs) {\n            return true;\n        }\n        return false;\n    }\n    clearAll() {\n        this.times = [];\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(ReviewTime) })\n], ReviewTimes.prototype, \"times\", void 0);\n//# sourceMappingURL=ReviewTime.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, DateDecoder, EnumDecoder, field, IntegerDecoder, MapDecoder, PatchableArray, StringDecoder, SymbolDecoder } from '@simonbackx/simple-encoding';\nimport { DataValidator, Formatter, Sorter, StringCompare } from '@stamhoofd/utility';\nimport { Address } from '../addresses/Address.js';\nimport { Replacement } from '../endpoints/EmailRequest.js';\nimport { AuditLogReplacement } from '../AuditLogReplacement.js';\nimport { GroupGenderType } from '../GroupGenderType.js';\nimport { EmergencyContact } from './EmergencyContact.js';\nimport { Gender } from './Gender.js';\nimport { NationalRegisterNumberOptOut } from './NationalRegisterNumberOptOut.js';\nimport { Parent } from './Parent.js';\nimport { RecordAnswerDecoder } from './records/RecordAnswer.js';\nimport { ReviewTimes } from './ReviewTime.js';\n/**\n * Keep track of date nad time of an edited boolean value\n */\nexport class BooleanStatus extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.value = false;\n        this.date = new Date();\n    }\n    isOutdated(timeoutMs) {\n        const time = this.date;\n        if (time.getTime() < new Date().getTime() - timeoutMs) {\n            return true;\n        }\n        return false;\n    }\n    getDiffValue() {\n        return this.value ? AuditLogReplacement.key('checked') : AuditLogReplacement.key('unchecked');\n    }\n}\n__decorate([\n    field({ decoder: BooleanDecoder })\n], BooleanStatus.prototype, \"value\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], BooleanStatus.prototype, \"date\", void 0);\n/**\n * This full model is always encrypted before sending it to the server. It is never processed on the server - only in encrypted form.\n * The public key of the member is stored in the member model, the private key is stored in the keychain for the 'owner' users. The organization has a copy that is encrypted with the organization's public key.\n * Validation needs to happen mostly client side - but malicious users can just send invalid data in the encrypted form. So validation happens a second time on the client side when an organitiona's admin decrypts the member data.\n */\nexport class MemberDetails extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.firstName = '';\n        this.lastName = '';\n        this.memberNumber = null;\n        /**\n         * Note: when this is set to 'NationalRegisterNumberOptOut' it means the user manually opted out - and doesn't have a national register number\n         */\n        this.nationalRegisterNumber = null;\n        /**\n         * Code needed to get access to this member when detecting duplicates. It is only visible for admins, otherwise it will be null.\n         *\n         * Set this value if you want to gain access to a member but receive the known_member_missing_rights error code\n         */\n        this.securityCode = null;\n        this.gender = Gender.Other;\n        this.phone = null;\n        this.email = null;\n        this.alternativeEmails = [];\n        this.unverifiedEmails = [];\n        this.unverifiedPhones = [];\n        this.unverifiedAddresses = [];\n        this.notes = null;\n        this.uitpasNumber = null;\n        this.birthDay = null;\n        this.trackingYear = null;\n        this.address = null;\n        this.parents = [];\n        this.emergencyContacts = [];\n        this.recordAnswers = new Map();\n        this.requiresFinancialSupport = null;\n        /**\n         * Gave permission to collect sensitive information\n         */\n        this.dataPermissions = null;\n        /**\n         * Last time the records were reviewed\n         */\n        this.reviewTimes = ReviewTimes.create({});\n    }\n    /**\n     * Call this to clean up capitals in all the available data\n     */\n    cleanData() {\n        var _a, _b, _c;\n        if (StringCompare.isFullCaps(this.firstName)) {\n            this.firstName = Formatter.capitalizeWords(Formatter.removeDuplicateSpaces(this.firstName.toLowerCase()));\n        }\n        if (StringCompare.isFullCaps(this.lastName)) {\n            this.lastName = Formatter.capitalizeWords(Formatter.removeDuplicateSpaces(this.lastName.toLowerCase()));\n        }\n        this.firstName = Formatter.capitalizeFirstLetter(Formatter.removeDuplicateSpaces(this.firstName.trim()));\n        this.lastName = Formatter.removeDuplicateSpaces(this.lastName.trim());\n        if (this.lastName === this.lastName.toLocaleLowerCase()) {\n            // Add auto capitals\n            this.lastName = Formatter.capitalizeWords(this.lastName);\n        }\n        for (const parent of this.parents) {\n            parent.cleanData();\n        }\n        (_a = this.address) === null || _a === void 0 ? void 0 : _a.cleanData();\n        for (const contact of this.emergencyContacts) {\n            contact.cleanData();\n        }\n        // Remove email address on member if it was set on a parent too\n        if (this.email !== null) {\n            this.email = this.email.toLowerCase().trim();\n            for (const parent of this.parents) {\n                if (parent.hasEmail(this.email)) {\n                    this.email = null;\n                    break;\n                }\n            }\n            if (!this.email || !DataValidator.isEmailValid(this.email)) {\n                this.email = null;\n            }\n        }\n        const filterUsedAndInvalidEmails = (emails, checkAlternative = true) => emails\n            .map(e => e.toLowerCase().trim())\n            .filter((email) => {\n            if (checkAlternative) {\n                if (this.hasEmail(email)) {\n                    return false;\n                }\n            }\n            else {\n                if (this.email && email === this.email) {\n                    return false;\n                }\n                for (const parent of this.parents) {\n                    if (parent.hasEmail(email)) {\n                        return false;\n                    }\n                }\n            }\n            if (!DataValidator.isEmailValid(email)) {\n                return false;\n            }\n            return true;\n        });\n        this.alternativeEmails = filterUsedAndInvalidEmails(this.alternativeEmails, false);\n        if (this.phone) {\n            const formattedPhone = Formatter.removeDuplicateSpaces(this.phone.trim());\n            if (formattedPhone !== this.phone) {\n                this.phone = formattedPhone;\n            }\n            for (const parent of this.parents) {\n                if (parent.phone === this.phone) {\n                    this.phone = null;\n                    break;\n                }\n            }\n        }\n        // #region unverified data\n        if (this.hasUnverifiedData) {\n            const lastReviewed = this.reviewTimes.getLastReview('parents') && this.reviewTimes.getLastReview('details');\n            if (lastReviewed && lastReviewed > new Date((new Date().getTime() - 1000 * 60 * 60 * 24))) {\n                // clear unverified data only if reviewed today\n                this.unverifiedAddresses = [];\n                this.unverifiedEmails = [];\n                this.unverifiedPhones = [];\n            }\n            else {\n                // #region filter used unverified addresses\n                const usedAddressIds = new Set();\n                if (this.unverifiedAddresses.length > 0) {\n                    const memberAddressId = (_b = this.address) === null || _b === void 0 ? void 0 : _b.id;\n                    const parentAddressIds = this.parents.filter(parent => parent.address).map(parent => parent.address.id);\n                    for (const unverifiedAddress of this.unverifiedAddresses) {\n                        unverifiedAddress.cleanData();\n                        const addressId = unverifiedAddress.id;\n                        const isUsed = addressId === memberAddressId || parentAddressIds.includes(addressId);\n                        if (isUsed) {\n                            usedAddressIds.add(addressId);\n                        }\n                    }\n                    if (usedAddressIds.size > 0) {\n                        this.unverifiedAddresses = this.unverifiedAddresses.filter(address => !usedAddressIds.has(address.id));\n                    }\n                }\n                // #endregion\n                // filter uncatetorized emails\n                this.unverifiedEmails = filterUsedAndInvalidEmails(this.unverifiedEmails);\n                // #region filter unverified phones\n                if (this.unverifiedPhones.length > 0) {\n                    const parentPhones = new Set();\n                    for (const parent of this.parents) {\n                        const parentPhone = parent.phone;\n                        if (parentPhone)\n                            parentPhones.add(parentPhone);\n                    }\n                    this.unverifiedPhones = this.unverifiedPhones\n                        .map(phone => Formatter.removeDuplicateSpaces(phone.trim()))\n                        .filter((unverifiedPhone) => {\n                        if (this.phone === unverifiedPhone)\n                            return false;\n                        if (parentPhones.has(unverifiedPhone))\n                            return false;\n                        return true;\n                    });\n                }\n                // #endregion\n            }\n        }\n        // #endregion\n        if (this.notes !== null) {\n            // cut long notes\n            if (this.notes.length > 1000) {\n                this.notes = this.notes.substring(0, 1000);\n            }\n            // remove empty notes\n            if (/^\\s*$/.test(this.notes)) {\n                this.notes = null;\n            }\n        }\n        // set requires financial support if uitpasNumber has 'kansentarief'\n        const hasFinancialSupport = !!((_c = this.requiresFinancialSupport) === null || _c === void 0 ? void 0 : _c.value);\n        if ((hasFinancialSupport === false) && this.uitpasNumber !== null && DataValidator.isUitpasNumberKansenTarief(this.uitpasNumber)) {\n            this.requiresFinancialSupport = BooleanStatus.create({ value: true });\n        }\n        if (this.trackingYear && this.birthDay) {\n            if (this.trackingYear === this.birthDay.getFullYear()) {\n                // tracking year is not needed\n                this.trackingYear = null;\n            }\n        }\n    }\n    isEqual(other) {\n        this.cleanData();\n        other.cleanData();\n        if (!this.firstName || !other.firstName) {\n            // Not possible to compare\n            return false;\n        }\n        if (!this.lastName || !other.lastName) {\n            // Not possible to compare\n            return false;\n        }\n        if (!this.birthDay || !other.birthDay) {\n            // Not possible to compare\n            return false;\n        }\n        if (this.firstName !== other.firstName) {\n            return false;\n        }\n        if (this.lastName !== other.lastName) {\n            return false;\n        }\n        if (this.birthDayFormatted !== other.birthDayFormatted) {\n            return false;\n        }\n        return true;\n    }\n    get name() {\n        if (!this.firstName) {\n            return this.lastName;\n        }\n        if (!this.lastName) {\n            return this.firstName;\n        }\n        return this.firstName + ' ' + this.lastName;\n    }\n    /// The age this member will become according to his tracking year or birth year, this year\n    trackedAgeForYear(year) {\n        if (this.trackingYear) {\n            return year - this.trackingYear;\n        }\n        if (!this.birthDay) {\n            return null;\n        }\n        // For now calculate based on Brussels timezone (we'll need to correct this later)\n        const birthDay = Formatter.luxon(this.birthDay);\n        return year - birthDay.year;\n    }\n    ageOnDate(date) {\n        if (!this.birthDay) {\n            return null;\n        }\n        // For now calculate based on Brussels timezone (we'll need to correct this later)\n        const birthDay = Formatter.luxon(this.birthDay);\n        let age = date.getFullYear() - birthDay.year;\n        const m = date.getMonth() - (birthDay.month - 1);\n        if (m < 0 || (m === 0 && date.getDate() < birthDay.day)) {\n            age--;\n        }\n        return age;\n    }\n    get age() {\n        return this.ageOnDate(new Date());\n    }\n    /**\n     * Age, set to 99 if missing\n     */\n    get defaultAge() {\n        var _a;\n        return (_a = this.age) !== null && _a !== void 0 ? _a : 99;\n    }\n    get birthDayFormatted() {\n        if (!this.birthDay) {\n            return null;\n        }\n        return Formatter.date(this.birthDay, true);\n    }\n    get hasUnverifiedData() {\n        return this.unverifiedEmails.length > 0 || this.unverifiedAddresses.length > 0 || this.unverifiedPhones.length > 0;\n    }\n    get shouldApplyReducedPrice() {\n        var _a, _b;\n        return (_b = (_a = this.requiresFinancialSupport) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : false;\n    }\n    /**\n     * @deprecated\n     */\n    matchQuery(query) {\n        if (StringCompare.typoCount(this.firstName, query) < 2\n            || StringCompare.typoCount(this.lastName, query) < 2\n            || StringCompare.typoCount(this.name, query) <= 2) {\n            return true;\n        }\n        for (const parent of this.parents) {\n            if (parent.matchQuery(query)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    /**\n     * Check if this member could fit a group, ignoring dates and waiting lists\n     */\n    doesMatchGroup(group) {\n        return this.getMatchingError(group) === null;\n    }\n    getMatchingError(group) {\n        var _a, _b, _c, _d;\n        if (group.settings.minAge || group.settings.maxAge) {\n            const age = this.trackedAgeForYear(Formatter.luxon((_b = (_a = group.settings.period) === null || _a === void 0 ? void 0 : _a.startDate) !== null && _b !== void 0 ? _b : new Date()).year);\n            if (age) {\n                if (group.settings.minAge && age < group.settings.minAge) {\n                    return {\n                        message: 'Te jong',\n                        description: this.firstName + ' is te jong. Inschrijvingen is beperkt tot leden ' + ((_c = group.settings.getAgeGenderDescription({ includeAge: true })) !== null && _c !== void 0 ? _c : ''),\n                    };\n                }\n                if (group.settings.maxAge && age > group.settings.maxAge) {\n                    return {\n                        message: 'Te oud',\n                        description: this.firstName + ' is te jong. Inschrijvingen is beperkt tot leden ' + ((_d = group.settings.getAgeGenderDescription({ includeAge: true })) !== null && _d !== void 0 ? _d : ''),\n                    };\n                }\n            }\n        }\n        if (this.gender == Gender.Male && group.settings.genderType == GroupGenderType.OnlyFemale) {\n            return {\n                message: 'Enkel ' + group.settings.getAgeGenderDescription({ includeGender: true }),\n                description: 'Inschrijvingen is beperkt tot ' + group.settings.getAgeGenderDescription({ includeGender: true }),\n            };\n        }\n        if (this.gender == Gender.Female && group.settings.genderType == GroupGenderType.OnlyMale) {\n            return {\n                message: 'Enkel ' + group.settings.getAgeGenderDescription({ includeGender: true }),\n                description: 'Inschrijvingen is beperkt tot ' + group.settings.getAgeGenderDescription({ includeGender: true }),\n            };\n        }\n        return null;\n    }\n    getMatchingGroups(groups) {\n        return groups.filter(g => this.doesMatchGroup(g));\n    }\n    updateAddress(oldValue, newValue) {\n        const str = oldValue.toString();\n        if (this.address && this.address.toString() == str) {\n            this.address = newValue;\n        }\n        for (const parent of this.parents) {\n            if (parent.address && parent.address.toString() == str) {\n                parent.address = newValue;\n            }\n        }\n    }\n    updateAddressPatch(oldValue, newValue) {\n        if (newValue.toString() === oldValue.toString()) {\n            return null;\n        }\n        const str = oldValue.toString();\n        let patch = MemberDetails.patch({});\n        let changed = false;\n        if (this.address && this.address.toString() === str) {\n            patch = patch.patch({ address: newValue });\n            changed = true;\n        }\n        for (const parent of this.parents) {\n            if (parent.address && parent.address.toString() === str) {\n                // parent.address = newValue\n                const arr = new PatchableArray();\n                arr.addPatch(Parent.patch({ id: parent.id, address: newValue }));\n                patch = patch.patch({ parents: arr });\n                changed = true;\n            }\n        }\n        if (changed) {\n            return patch;\n        }\n        return null;\n    }\n    /**\n     * This will add or update the parent (possibily partially if not all data is present)\n     */\n    addParent(parent) {\n        // Multiple loops to mangage priority\n        for (const [index, _parent] of this.parents.entries()) {\n            if (_parent.id == parent.id) {\n                this.parents[index].merge(parent);\n                return;\n            }\n        }\n        for (const [index, _parent] of this.parents.entries()) {\n            // clean both parents before checking\n            parent.cleanData();\n            _parent.cleanData();\n            if (_parent.name && parent.name) {\n                if (StringCompare.typoCount(_parent.name, parent.name) === 0) {\n                    this.parents[index].merge(parent);\n                    return;\n                }\n            }\n        }\n        for (const [index, _parent] of this.parents.entries()) {\n            if (_parent.name && parent.name) {\n                if (StringCompare.typoCount(_parent.name, parent.name) < 2) {\n                    this.parents[index].merge(parent);\n                    return;\n                }\n            }\n        }\n        for (const [index, _parent] of this.parents.entries()) {\n            if (!_parent.name || !parent.name) {\n                if (_parent.email && parent.email) {\n                    // Compare on email address\n                    if (_parent.email == parent.email) {\n                        this.parents[index].merge(parent);\n                        return;\n                    }\n                }\n                if (_parent.phone && parent.phone) {\n                    if (_parent.phone == parent.phone) {\n                        this.parents[index].merge(parent);\n                        return;\n                    }\n                }\n            }\n        }\n        this.parents.push(parent);\n    }\n    getShortCode(maxLength) {\n        return Formatter.firstLetters(this.firstName, maxLength);\n    }\n    /**\n     * Apply newer details without deleting data or replacing filled in data with empty data\n     */\n    merge(other) {\n        if (other.firstName.length > 0) {\n            this.firstName = other.firstName;\n        }\n        if (other.lastName.length > 0) {\n            this.lastName = other.lastName;\n        }\n        if (other.email) {\n            this.email = other.email;\n        }\n        if (other.birthDay) {\n            this.birthDay = other.birthDay;\n        }\n        if (other.gender !== Gender.Other) {\n            // Always copy gender\n            this.gender = other.gender;\n        }\n        if (other.address) {\n            if (this.address) {\n                this.updateAddress(this.address, other.address);\n            }\n            else {\n                this.address = other.address;\n            }\n        }\n        if (other.phone) {\n            this.phone = other.phone;\n        }\n        if (other.memberNumber) {\n            this.memberNumber = other.memberNumber;\n        }\n        if (other.parents.length > 0) {\n            for (const parent of other.parents) {\n                // Will override existing parent if possible\n                this.addParent(parent);\n            }\n        }\n        if (other.emergencyContacts.length > 0) {\n            this.emergencyContacts = other.emergencyContacts;\n        }\n        this.reviewTimes.merge(other.reviewTimes);\n        if (other.requiresFinancialSupport && (!this.requiresFinancialSupport || this.requiresFinancialSupport.date < other.requiresFinancialSupport.date)) {\n            this.requiresFinancialSupport = other.requiresFinancialSupport;\n        }\n        if (other.dataPermissions && (!this.dataPermissions || this.dataPermissions.date < other.dataPermissions.date)) {\n            this.dataPermissions = other.dataPermissions;\n        }\n        // Merge answers\n        const newAnswers = new Map(this.recordAnswers);\n        for (const answer of other.recordAnswers.values()) {\n            const existing = newAnswers.get(answer.settings.id);\n            if (!existing) {\n                newAnswers.set(answer.settings.id, answer);\n            }\n            else if (answer.date >= existing.date) {\n                newAnswers.set(answer.settings.id, answer);\n            }\n            else {\n                // keep existing, this one is more up-to-date, don't add the other answer\n            }\n        }\n        this.recordAnswers = newAnswers;\n        // Merge unverified data\n        this.unverifiedEmails = Formatter.uniqueArray(this.unverifiedEmails.concat(other.unverifiedEmails));\n        this.unverifiedPhones = Formatter.uniqueArray(this.unverifiedPhones.concat(other.unverifiedPhones));\n        // Merge unverified addresses\n        for (const address of other.unverifiedAddresses) {\n            if (!this.unverifiedAddresses.find(a => a.id === address.id)) {\n                this.unverifiedAddresses.push(address);\n            }\n        }\n        // Notes\n        if (other.notes) {\n            this.notes = (this.notes ? (this.notes + '\\n') : '') + other.notes;\n        }\n    }\n    getEmailReplacements() {\n        return [\n            Replacement.create({\n                token: 'memberFirstName',\n                value: this.firstName,\n            }),\n            Replacement.create({\n                token: 'memberLastName',\n                value: this.lastName,\n            }),\n        ];\n    }\n    getMemberEmails() {\n        const userEmails = [...this.alternativeEmails];\n        if (this.email) {\n            userEmails.unshift(this.email);\n        }\n        return userEmails;\n    }\n    getParentEmails() {\n        return this.parents.flatMap(p => p.getEmails());\n    }\n    hasEmail(email) {\n        const cleanedEmail = email.toLowerCase().trim();\n        return this.getMemberEmails().includes(cleanedEmail) || this.getParentEmails().includes(cleanedEmail);\n    }\n    getAllAddresses() {\n        const addresses = [];\n        if (this.address) {\n            addresses.push(this.address);\n        }\n        for (const parent of this.parents) {\n            if (parent.address && !addresses.find(a => a.id === parent.address.id)) {\n                addresses.push(parent.address);\n            }\n        }\n        for (const address of this.unverifiedAddresses) {\n            if (!addresses.find(a => a.id === address.id)) {\n                addresses.push(address);\n            }\n        }\n        return addresses;\n    }\n    static mergeParents(members, allowOverrides = true) {\n        return MemberDetails.mergeRelations(members, 'parents', allowOverrides);\n    }\n    static mergeEmergencyContacts(members, allowOverrides = true) {\n        return MemberDetails.mergeRelations(members, 'emergencyContacts', allowOverrides);\n    }\n    static mergeRelations(members, type, allowOverrides = true) {\n        var _a, _b, _c;\n        const allGroups = [];\n        const parentsGroupByName = new Map();\n        const parentsGroupById = new Map();\n        const mergeIdMap = new Map();\n        for (const member of members) {\n            for (const [index, object] of member[type].entries()) {\n                if (object.name.length <= 3) {\n                    continue;\n                }\n                // First find group by ID, then name\n                let group = (_a = parentsGroupById.get(object.id)) !== null && _a !== void 0 ? _a : parentsGroupByName.get(object.name);\n                if (!group) {\n                    group = [];\n                    allGroups.push(group);\n                }\n                // Save name and id groups\n                if (!parentsGroupByName.has(object.name)) {\n                    parentsGroupByName.set(object.name, group);\n                }\n                if (!parentsGroupById.has(object.id)) {\n                    parentsGroupById.set(object.id, group);\n                }\n                group.push({\n                    object: object,\n                    setObject(object) {\n                        member[type][index] = object;\n                    },\n                    reviewDate: (_c = (_b = object.updatedAt) !== null && _b !== void 0 ? _b : member.reviewTimes.getLastReview(type)) !== null && _c !== void 0 ? _c : object.createdAt,\n                    createdAt: object.createdAt,\n                });\n            }\n        }\n        // Sort each parent by review date and merge\n        for (const parents of allGroups) {\n            if (parents.length >= 2) {\n                // Fetch parent with oldest createdAt\n                // This is so we can keep the oldest createdAt and oldest id\n                parents.sort((a, b) => Sorter.byDateValue(b.createdAt, a.createdAt));\n                const oldestParent = parents[0].object;\n                // Sort from oldest reviewed to latest reviewed\n                parents.sort((a, b) => { var _a, _b; return Sorter.byDateValue((_a = b.reviewDate) !== null && _a !== void 0 ? _a : new Date(0), (_b = a.reviewDate) !== null && _b !== void 0 ? _b : new Date(0)); });\n                // Parents with the same id override each other, while parents with different ids merge while maintaining as much data as possible\n                // this happens in groups\n                let mergeTo = parents[0].object.clone();\n                const remaining = parents.slice(1);\n                let allowSet = true; // Only the first 'streak' of parents with the same id override mergeTo\n                for (const [index, { object }] of remaining.entries()) {\n                    if (allowSet && object.id === mergeTo.id && allowOverrides) {\n                        mergeTo = object.clone();\n                        continue;\n                    }\n                    else {\n                        allowSet = false;\n                    }\n                    if (allowOverrides) {\n                        if (index < remaining.length - 1) {\n                            const nextParent = remaining[index + 1].object;\n                            // If the next parent has the same id, we'll simply ignore this parent because it is out of date.\n                            // This is different from setting mergeTo because we'll still merge with the previous parents that had a different id\n                            if (object.id === nextParent.id) {\n                                continue;\n                            }\n                        }\n                    }\n                    // TypeScript does not understand the complexity here, so'll need to help it understand mergeTo is always the same type as object\n                    mergeTo.merge(object);\n                }\n                // Force set id + createdAt\n                mergeTo.id = oldestParent.id;\n                mergeTo.createdAt = oldestParent.createdAt;\n                for (const { object, setObject } of parents) {\n                    if (object.id !== mergeTo.id) {\n                        mergeIdMap.set(object.id, mergeTo.id);\n                    }\n                    setObject(mergeTo);\n                }\n                // Remove duplicate parents by id for each member\n                for (const member of members) {\n                    member[type] = member[type].filter((p, i, self) => self.findIndex(p2 => p2.id === p.id) === i);\n                }\n            }\n        }\n        return mergeIdMap;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], MemberDetails.prototype, \"firstName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], MemberDetails.prototype, \"lastName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 30, nullable: true })\n], MemberDetails.prototype, \"memberNumber\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 348, nullable: true }),\n    field({\n        decoder: new SymbolDecoder(StringDecoder, NationalRegisterNumberOptOut),\n        version: 349,\n        nullable: true,\n        downgrade: (n) => n === NationalRegisterNumberOptOut ? null : n,\n    })\n], MemberDetails.prototype, \"nationalRegisterNumber\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 331 })\n], MemberDetails.prototype, \"securityCode\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, optional: true, nullable: true })\n], MemberDetails.prototype, \"lastExternalSync\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(Gender) })\n], MemberDetails.prototype, \"gender\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], MemberDetails.prototype, \"phone\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, field: 'mail' }),\n    field({ decoder: StringDecoder, nullable: true, version: 5 })\n], MemberDetails.prototype, \"email\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), version: 277 })\n], MemberDetails.prototype, \"alternativeEmails\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), version: 304 })\n], MemberDetails.prototype, \"unverifiedEmails\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), version: 304 })\n], MemberDetails.prototype, \"unverifiedPhones\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Address), version: 304 })\n], MemberDetails.prototype, \"unverifiedAddresses\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 301 })\n], MemberDetails.prototype, \"notes\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 306 })\n], MemberDetails.prototype, \"uitpasNumber\", void 0);\n__decorate([\n    field({ decoder: DateDecoder }),\n    field({ decoder: DateDecoder, nullable: true, version: 52, downgrade: (old) => old !== null && old !== void 0 ? old : new Date('1970-01-01') })\n], MemberDetails.prototype, \"birthDay\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 352 })\n], MemberDetails.prototype, \"trackingYear\", void 0);\n__decorate([\n    field({ decoder: Address, nullable: true })\n], MemberDetails.prototype, \"address\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Parent) })\n], MemberDetails.prototype, \"parents\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(EmergencyContact) })\n], MemberDetails.prototype, \"emergencyContacts\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RecordAnswerDecoder), version: 120 }),\n    field({\n        decoder: new MapDecoder(StringDecoder, RecordAnswerDecoder),\n        version: 252,\n        upgrade: (old) => {\n            const map = new Map();\n            for (const answer of old) {\n                map.set(answer.settings.id, answer);\n            }\n            return map;\n        },\n    })\n], MemberDetails.prototype, \"recordAnswers\", void 0);\n__decorate([\n    field({ decoder: BooleanStatus, version: 117, optional: true }),\n    field({\n        decoder: BooleanStatus,\n        version: 258,\n        optional: false,\n        nullable: true,\n        downgrade: (newValue) => newValue === null ? undefined : newValue,\n        upgrade: (oldValue) => {\n            if (!oldValue) {\n                return null;\n            }\n            return oldValue;\n        },\n    })\n], MemberDetails.prototype, \"requiresFinancialSupport\", void 0);\n__decorate([\n    field({ decoder: BooleanStatus, version: 117, optional: true }),\n    field({\n        decoder: BooleanStatus,\n        version: 256,\n        optional: true,\n        nullable: true,\n        downgrade: (newValue) => newValue === null ? undefined : newValue,\n        upgrade: (oldValue) => {\n            if (!oldValue) {\n                return null;\n            }\n            return oldValue;\n        },\n    })\n], MemberDetails.prototype, \"dataPermissions\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 20, field: 'lastReviewed' }),\n    field({ decoder: ReviewTimes, version: 71, upgrade: (oldDate) => {\n            const times = ReviewTimes.create({});\n            if (oldDate) {\n                times.markReviewed('records', oldDate);\n                times.markReviewed('parents', oldDate);\n                times.markReviewed('emergencyContacts', oldDate);\n                times.markReviewed('details', oldDate);\n            }\n            return times;\n        } })\n], MemberDetails.prototype, \"reviewTimes\", void 0);\n//# sourceMappingURL=MemberDetails.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, DateDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { MemberDetails } from './MemberDetails.js';\nexport class TinyMember extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.firstName = '';\n        this.lastName = '';\n    }\n    get name() {\n        if (!this.firstName) {\n            return this.lastName;\n        }\n        if (!this.lastName) {\n            return this.firstName;\n        }\n        return this.firstName + ' ' + this.lastName;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], TinyMember.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], TinyMember.prototype, \"firstName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], TinyMember.prototype, \"lastName\", void 0);\nexport class Member extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * @deprecated\n         */\n        this.outstandingBalance = 0;\n        this.createdAt = new Date();\n        this.updatedAt = new Date();\n    }\n    get tiny() {\n        return TinyMember.create({\n            id: this.id,\n            firstName: this.details.firstName,\n            lastName: this.details.lastName,\n        });\n    }\n    get isMinor() {\n        return (this.details.age !== null && this.details.age < 18);\n    }\n    get firstName() {\n        return this.details.firstName;\n    }\n    get name() {\n        return this.details.name;\n    }\n    static sorterByName(sortDirection = 'ASC') {\n        return (a, b) => {\n            if (!a.details && !b.details) {\n                return 0;\n            }\n            if (!a.details) {\n                return 1;\n            }\n            if (!b.details) {\n                return -1;\n            }\n            if (sortDirection == 'ASC') {\n                if (a.details.name.toLowerCase() > b.details.name.toLowerCase()) {\n                    return 1;\n                }\n                if (a.details.name.toLowerCase() < b.details.name.toLowerCase()) {\n                    return -1;\n                }\n                return 0;\n            }\n            if (a.details.name.toLowerCase() > b.details.name.toLowerCase()) {\n                return -1;\n            }\n            if (a.details.name.toLowerCase() < b.details.name.toLowerCase()) {\n                return 1;\n            }\n            return 0;\n        };\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], Member.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: MemberDetails, field: 'nonEncryptedDetails' }),\n    field({ decoder: MemberDetails, version: 165 })\n], Member.prototype, \"details\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, optional: true })\n], Member.prototype, \"outstandingBalance\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, version: 31 })\n], Member.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, version: 31 })\n], Member.prototype, \"updatedAt\", void 0);\n//# sourceMappingURL=Member.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, DateDecoder, field, IntegerDecoder, MapDecoder, patchObject, StringDecoder } from '@simonbackx/simple-encoding';\nimport { isSimpleError, isSimpleErrors, SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\nimport { Formatter } from '@stamhoofd/utility';\nimport { v4 as uuidv4 } from 'uuid';\nimport { compileToInMemoryFilter } from '../../filters/InMemoryFilter.js';\nimport { registerItemInMemoryFilterCompilers } from '../../filters/inMemoryFilterDefinitions.js';\nimport { GroupOption, GroupOptionMenu, GroupPrice, WaitingListType } from '../../GroupSettings.js';\nimport { GroupType } from '../../GroupType.js';\nimport { PlatformMembershipTypeBehaviour } from '../../Platform.js';\nimport { StockReservation } from '../../StockReservation.js';\nimport { RecordAnswerDecoder } from '../records/RecordAnswer.js';\nimport { RecordCategory } from '../records/RecordCategory.js';\nexport class RegisterItemOption extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.amount = 1;\n    }\n}\n__decorate([\n    field({ decoder: GroupOption })\n], RegisterItemOption.prototype, \"option\", void 0);\n__decorate([\n    field({ decoder: GroupOptionMenu })\n], RegisterItemOption.prototype, \"optionMenu\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], RegisterItemOption.prototype, \"amount\", void 0);\nexport class IDRegisterItem extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.options = [];\n        this.recordAnswers = new Map();\n        this.replaceRegistrationIds = [];\n        this.trial = false;\n        this.customStartDate = null;\n    }\n    hydrate(context) {\n        return RegisterItem.fromId(this, context);\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], IDRegisterItem.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], IDRegisterItem.prototype, \"memberId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], IDRegisterItem.prototype, \"groupId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], IDRegisterItem.prototype, \"organizationId\", void 0);\n__decorate([\n    field({ decoder: GroupPrice })\n], IDRegisterItem.prototype, \"groupPrice\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RegisterItemOption) })\n], IDRegisterItem.prototype, \"options\", void 0);\n__decorate([\n    field({ decoder: new MapDecoder(StringDecoder, RecordAnswerDecoder), version: 338 })\n], IDRegisterItem.prototype, \"recordAnswers\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder) })\n], IDRegisterItem.prototype, \"replaceRegistrationIds\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 354 })\n], IDRegisterItem.prototype, \"trial\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 354 })\n], IDRegisterItem.prototype, \"customStartDate\", void 0);\nexport class RegisterItem {\n    /**\n     * @deprecated\n     */\n    get waitingList() {\n        return false;\n    }\n    static defaultFor(member, group, organization) {\n        if (group.organizationId !== organization.id) {\n            throw new Error('Group and organization do not match in RegisterItem.defaultFor');\n        }\n        const item = new RegisterItem({\n            member,\n            group,\n            organization,\n        });\n        return item;\n    }\n    constructor(data) {\n        var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n        this.trial = false;\n        this.options = [];\n        this.recordAnswers = new Map();\n        this.customStartDate = null;\n        /**\n         * Price for the new registration\n         */\n        this.calculatedPrice = 0;\n        /**\n         * Price for the new registration that is due later\n         */\n        this.calculatedPriceDueLater = 0;\n        /**\n         * Refund for the replaced registrations\n         */\n        this.calculatedRefund = 0;\n        /**\n         * These registrations will be replaced as part of this new registration (moving or updating a registration is possible this way)\n         */\n        this.replaceRegistrations = [];\n        /**\n         * Show an error in the cart for recovery\n         */\n        this.cartError = null;\n        this.id = (_a = data.id) !== null && _a !== void 0 ? _a : uuidv4();\n        this.member = data.member;\n        this.group = data.group;\n        if (!data.groupPrice) {\n            const prices = this.getFilteredPrices();\n            for (const price of prices) {\n                const stock = price.getRemainingStock(this);\n                if (stock !== 0) {\n                    this.groupPrice = price;\n                    break;\n                }\n            }\n            if (!this.groupPrice) {\n                // Probably all sold out\n                // Select the first one anyway\n                this.groupPrice = (_b = prices[0]) !== null && _b !== void 0 ? _b : GroupPrice.create({ name: 'Ongeldig tarief', id: '' });\n            }\n        }\n        else {\n            this.groupPrice = data.groupPrice;\n        }\n        this.organization = data.organization;\n        this.options = (_c = data.options) !== null && _c !== void 0 ? _c : [];\n        this.recordAnswers = (_d = data.recordAnswers) !== null && _d !== void 0 ? _d : new Map();\n        this.replaceRegistrations = (_e = data.replaceRegistrations) !== null && _e !== void 0 ? _e : [];\n        this.cartError = (_f = data.cartError) !== null && _f !== void 0 ? _f : null;\n        this.calculatedPrice = (_g = data.calculatedPrice) !== null && _g !== void 0 ? _g : 0;\n        this.calculatedRefund = (_h = data.calculatedRefund) !== null && _h !== void 0 ? _h : 0;\n        this.calculatedPriceDueLater = (_j = data.calculatedPriceDueLater) !== null && _j !== void 0 ? _j : 0;\n        this.trial = (_k = data.trial) !== null && _k !== void 0 ? _k : false;\n        // Select all defaults\n        for (const optionMenu of this.group.settings.optionMenus) {\n            if (!optionMenu.multipleChoice) {\n                if (this.options.find(o => o.optionMenu.id === optionMenu.id)) {\n                    continue;\n                }\n                let added = false;\n                const options = this.getFilteredOptions(optionMenu);\n                for (const option of options) {\n                    const stock = option.getRemainingStock(this);\n                    if (stock === 0) {\n                        continue;\n                    }\n                    this.options.push(RegisterItemOption.create({\n                        option,\n                        optionMenu: optionMenu,\n                        amount: 1,\n                    }));\n                    added = true;\n                    break;\n                }\n                if (!added) {\n                    if (options.length > 0) {\n                        // Add the first (this one is sold out, but still required for correct error handling)\n                        this.options.push(RegisterItemOption.create({\n                            option: options[0],\n                            optionMenu: optionMenu,\n                            amount: 1,\n                        }));\n                    }\n                    else if (optionMenu.hidden) {\n                        // Add the default option if the option menu is hidden\n                        this.options.push(RegisterItemOption.create({\n                            option: optionMenu.getDefaultOption(),\n                            optionMenu,\n                            amount: 1,\n                        }));\n                    }\n                }\n            }\n        }\n        if (data.trial === undefined) {\n            this.trial = this.canHaveTrial;\n        }\n        if (data.customStartDate !== undefined) {\n            this.customStartDate = data.customStartDate;\n        }\n    }\n    static fromRegistration(registration, member, organization) {\n        return new RegisterItem({\n            id: registration.id,\n            member,\n            group: registration.group,\n            organization,\n            groupPrice: registration.groupPrice,\n            recordAnswers: registration.recordAnswers,\n            options: registration.options,\n            trial: registration.trialUntil !== null,\n            customStartDate: registration.startDate,\n        });\n    }\n    clone() {\n        return new RegisterItem({\n            id: this.id,\n            member: this.member,\n            group: this.group,\n            organization: this.organization,\n            groupPrice: this.groupPrice.clone(),\n            options: this.options.map(o => o.clone()),\n            recordAnswers: new Map([...this.recordAnswers.entries()].map(([k, v]) => [k, v.clone()])),\n            replaceRegistrations: this.replaceRegistrations.map(r => r.clone()),\n            cartError: this.cartError,\n            calculatedPrice: this.calculatedPrice,\n            calculatedRefund: this.calculatedRefund,\n            calculatedPriceDueLater: this.calculatedPriceDueLater,\n            trial: this.trial,\n            customStartDate: this.customStartDate,\n        });\n    }\n    copyFrom(item) {\n        this.groupPrice = item.groupPrice.clone();\n        this.options = item.options.map(o => o.clone());\n        this.recordAnswers = new Map([...item.recordAnswers.entries()].map(([k, v]) => [k, v.clone()]));\n        this.calculatedPrice = item.calculatedPrice;\n        this.calculatedRefund = item.calculatedRefund;\n        this.calculatedPriceDueLater = item.calculatedPriceDueLater;\n        this.trial = item.trial;\n        this.customStartDate = item.customStartDate;\n    }\n    static fromId(idRegisterItem, context) {\n        const member = context.members.find(m => m.member.id === idRegisterItem.memberId);\n        if (!member) {\n            throw new Error('Member not found: ' + idRegisterItem.memberId);\n        }\n        const organization = context.organizations.find(o => o.id === idRegisterItem.organizationId);\n        if (!organization) {\n            throw new Error('Organization not found: ' + idRegisterItem.organizationId);\n        }\n        const group = context.groups.find(g => g.id === idRegisterItem.groupId);\n        if (!group) {\n            throw new Error('Group not found: ' + idRegisterItem.groupId);\n        }\n        const replaceRegistrations = [];\n        for (const registrationId of idRegisterItem.replaceRegistrationIds) {\n            const registration = member.patchedMember.registrations.find(r => r.id === registrationId);\n            if (!registration) {\n                throw new Error('Registration not found: ' + registrationId);\n            }\n            replaceRegistrations.push(registration);\n        }\n        return new RegisterItem({\n            id: idRegisterItem.id,\n            member,\n            group,\n            organization,\n            groupPrice: idRegisterItem.groupPrice,\n            options: idRegisterItem.options,\n            recordAnswers: idRegisterItem.recordAnswers,\n            replaceRegistrations,\n            trial: idRegisterItem.trial,\n            customStartDate: idRegisterItem.customStartDate,\n        });\n    }\n    convert() {\n        return IDRegisterItem.create({\n            id: this.id,\n            memberId: this.member.member.id,\n            groupId: this.group.id,\n            organizationId: this.organization.id,\n            groupPrice: this.groupPrice,\n            options: this.options,\n            replaceRegistrationIds: this.replaceRegistrations.map(r => r.id),\n            recordAnswers: this.recordAnswers,\n            trial: this.trial,\n            customStartDate: this.customStartDate,\n        });\n    }\n    get isInCart() {\n        return this.member.family.checkout.cart.contains(this);\n    }\n    get showItemView() {\n        return !!this.replaceRegistrations.length || this.group.settings.prices.length !== 1 || this.group.settings.optionMenus.length > 0 || this.group.type === GroupType.WaitingList || this.group.settings.description.length > 2 || this.group.settings.prices[0].price.price > 0 || (!this.isInCart && !this.isValid);\n    }\n    calculatePrice() {\n        this.calculatedPrice = this.groupPrice.price.forMember(this.member);\n        this.calculatedRefund = 0;\n        for (const option of this.options) {\n            this.calculatedPrice += option.option.price.forMember(this.member) * option.amount;\n        }\n        for (const registration of this.replaceRegistrations) {\n            this.calculatedRefund += registration.price;\n        }\n        if (this.calculatedTrialUntil) {\n            this.calculatedPriceDueLater = this.calculatedPrice;\n            this.calculatedPrice = 0;\n        }\n        else {\n            this.calculatedPriceDueLater = 0;\n        }\n    }\n    get totalPrice() {\n        return this.calculatedPrice - this.calculatedRefund;\n    }\n    get priceBreakown() {\n        let all = [];\n        for (const registration of this.replaceRegistrations) {\n            all.push({\n                name: this.checkout.isAdminFromSameOrganization ? 'Reeds aangerekend voor ' + registration.group.settings.name : 'Terugbetaling ' + registration.group.settings.name,\n                price: -registration.price,\n            });\n        }\n        if (this.calculatedPriceDueLater !== 0) {\n            const trialUntil = this.calculatedTrialUntil;\n            all.push({\n                name: 'Later te betalen',\n                price: this.calculatedPriceDueLater,\n                description: trialUntil ? `Tegen ${Formatter.date(trialUntil)}` : undefined,\n            });\n        }\n        all = all.filter(a => a.price !== 0);\n        if (all.length > 0) {\n            all.unshift({\n                name: 'Subtotaal',\n                price: this.calculatedPrice,\n            });\n        }\n        return [\n            ...all,\n            {\n                name: this.checkout.isAdminFromSameOrganization ? (this.totalPrice >= 0 ? 'Openstaand bedrag stijgt met' : 'Openstaand bedrag daalt met') : (this.calculatedPriceDueLater !== 0 ? 'Nu te betalen' : 'Totaal'),\n                price: this.checkout.isAdminFromSameOrganization ? Math.abs(this.totalPrice) : this.totalPrice,\n            },\n        ];\n    }\n    getFilteredPrices() {\n        const base = this.group.settings.getFilteredPrices({ admin: this.checkout.isAdminFromSameOrganization });\n        if (this.groupPrice && !base.some(b => b.id === this.groupPrice.id)) {\n            return [this.groupPrice, ...base];\n        }\n        return base;\n    }\n    getFilteredOptionMenus() {\n        return this.group.settings.getFilteredOptionMenus({ admin: this.checkout.isAdminFromSameOrganization });\n    }\n    getFilteredOptions(menu) {\n        return menu.getFilteredOptions({ admin: this.checkout.isAdminFromSameOrganization });\n    }\n    get memberId() {\n        return this.member.id;\n    }\n    get groupId() {\n        return this.group.id;\n    }\n    get reduced() {\n        var _a, _b;\n        return (_b = (_a = this.member.patchedMember.details.requiresFinancialSupport) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : false;\n    }\n    get family() {\n        return this.member.family;\n    }\n    get checkout() {\n        return this.family.checkout;\n    }\n    /**\n     * Update self to the newest available data, and throw error if something failed (only after refreshing other ones)\n     */\n    refresh(group, options) {\n        this.group = group;\n        const errors = new SimpleErrors();\n        if (this.group.settings.prices.length === 0) {\n            errors.addError(new SimpleError({\n                code: 'product_unavailable',\n                message: 'Product unavailable',\n                human: 'Er is iets fout met de tariefinstellingen van ' + this.group.settings.name + ', waardoor je nu niet kan inschrijven. Neem contact op met een beheerder en vraag de tariefinstellingen na te kijken.',\n            }));\n        }\n        else {\n            const groupPrice = this.group.settings.prices.find(p => p.id === this.groupPrice.id);\n            if (!groupPrice) {\n                errors.addError(new SimpleError({\n                    code: 'product_unavailable',\n                    message: 'Product unavailable',\n                    human: 'Eén of meerdere tarieven van ' + this.group.settings.name + ' zijn niet meer beschikbaar',\n                    meta: { recoverable: true },\n                }));\n            }\n            else {\n                this.groupPrice = groupPrice;\n            }\n        }\n        // Check all options\n        const remainingMenus = this.group.settings.optionMenus.slice();\n        for (const o of this.options) {\n            let index = remainingMenus.findIndex(m => m.id === o.optionMenu.id);\n            if (index == -1) {\n                // Check if it has a multiple choice one\n                index = this.group.settings.optionMenus.findIndex(m => m.id === o.optionMenu.id);\n                errors.addError(new SimpleError({\n                    code: 'option_menu_unavailable',\n                    message: 'Option menu unavailable',\n                    human: 'Eén of meerdere keuzemogelijkheden van ' + this.group.settings.name + ' zijn niet meer beschikbaar',\n                    meta: { recoverable: true },\n                }));\n                continue;\n            }\n            const menu = remainingMenus[index];\n            if (!menu.multipleChoice) {\n                // Already used: not possible to add another\n                remainingMenus.splice(index, 1);\n            }\n            const option = menu.options.find(m => m.id === o.option.id);\n            if (!option) {\n                errors.addError(new SimpleError({\n                    code: 'option_unavailable',\n                    message: 'Option unavailable',\n                    human: 'Eén of meerdere keuzemogelijkheden van ' + this.group.settings.name + ' zijn niet meer beschikbaar',\n                    meta: { recoverable: true },\n                }));\n                continue;\n            }\n            // Update to latest data\n            o.optionMenu = menu;\n            o.option = option;\n        }\n        if (remainingMenus.filter(m => !m.multipleChoice).length > 0) {\n            errors.addError(new SimpleError({\n                code: 'missing_menu',\n                message: \"Missing menu's \" + remainingMenus.filter(m => !m.multipleChoice).map(m => m.name).join(', '),\n                human: 'Er zijn nieuwe keuzemogelijkheden voor ' + this.group.settings.name + ' waaruit je moet kiezen',\n                meta: { recoverable: true },\n            }));\n        }\n        if (options === null || options === void 0 ? void 0 : options.final) {\n            // Check all answers are answered\n            try {\n                RecordCategory.validate(this.group.settings.recordCategories, this);\n            }\n            catch (e) {\n                if (isSimpleErrors(e) || isSimpleError(e)) {\n                    errors.addError(e);\n                }\n                else {\n                    throw e;\n                }\n            }\n            // Remove unsued answers\n            this.recordAnswers = RecordCategory.removeOldAnswers(this.group.settings.recordCategories, this).getRecordAnswers();\n        }\n        errors.throwIfNotEmpty();\n    }\n    willReplace(registrationId) {\n        return this.replaceRegistrations.some(rr => rr.id === registrationId);\n    }\n    isAlreadyRegistered() {\n        return !!this.member.member.registrations.find(r => !this.willReplace(r.id) && r.groupId === this.group.id && r.registeredAt !== null && r.deactivatedAt === null);\n    }\n    hasReachedCategoryMaximum() {\n        if (this.group.type !== GroupType.Membership) {\n            return false;\n        }\n        const parents = this.group.getParentCategories(this.organization.period.settings.categories, false);\n        for (const parent of parents) {\n            if (parent.settings.maximumRegistrations !== null) {\n                const count = this.member.patchedMember.registrations.filter((r) => {\n                    if (!this.willReplace(r.id) && r.registeredAt !== null && r.deactivatedAt === null && parent.groupIds.includes(r.groupId)) {\n                        return true;\n                    }\n                    return false;\n                }).length;\n                const waiting = this.checkout.cart.items.filter((item) => {\n                    return item.member.member.id === this.member.member.id && parent.groupIds.includes(item.group.id) && item.group.id !== this.group.id;\n                }).length;\n                if (count + waiting >= parent.settings.maximumRegistrations) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n    isInvited() {\n        return !!this.member.member.registrations.find(r => r.groupId === this.group.id && r.registeredAt === null && r.canRegister);\n    }\n    doesMeetRequireGroupIds() {\n        if (this.group.settings.requireGroupIds.length > 0) {\n            const hasGroup = this.member.member.registrations.find((r) => {\n                return !this.willReplace(r.id) && r.registeredAt !== null && r.deactivatedAt === null && this.group.settings.requireGroupIds.includes(r.groupId);\n            });\n            if (!hasGroup && !this.checkout.cart.items.find(item => item.member.id === this.member.id && this.group.settings.requireGroupIds.includes(item.group.id))) {\n                return false;\n            }\n        }\n        if (this.group.settings.requireDefaultAgeGroupIds.length > 0) {\n            const hasGroup = this.member.member.registrations.find((r) => {\n                return r.registeredAt !== null && r.deactivatedAt === null && r.group.defaultAgeGroupId && this.isActivePeriodId(r.group.periodId) && !this.willReplace(r.id) && this.group.settings.requireDefaultAgeGroupIds.includes(r.group.defaultAgeGroupId);\n            });\n            if (!hasGroup && !this.checkout.cart.items.find(item => item.member.id === this.member.id && item.group.defaultAgeGroupId && this.group.settings.requireDefaultAgeGroupIds.includes(item.group.defaultAgeGroupId))) {\n                return false;\n            }\n        }\n        return true;\n    }\n    doesMeetRequireOrganizationIds() {\n        if (this.group.settings.requireOrganizationIds.length > 0) {\n            const hasGroup = this.member.member.registrations.find((r) => {\n                return r.group.type === GroupType.Membership && r.registeredAt !== null && r.deactivatedAt === null && this.group.settings.requireOrganizationIds.includes(r.organizationId) && this.isActivePeriodId(r.group.periodId) && !this.willReplace(r.id);\n            });\n            if (!hasGroup && !this.checkout.cart.items.find(item => item.member.id === this.member.id && this.group.settings.requireOrganizationIds.includes(item.organization.id))) {\n                return false;\n            }\n        }\n        return true;\n    }\n    doesMeetRequireOrganizationTags() {\n        if (this.group.settings.requireOrganizationTags.length > 0) {\n            const hasOrganization = this.member.filterOrganizations({ currentPeriod: true, types: [GroupType.Membership] }).find((organization) => {\n                return organization.meta.matchTags(this.group.settings.requireOrganizationTags);\n            });\n            if (!hasOrganization && !this.checkout.cart.items.find(item => item.member.id === this.member.id && item.organization.meta.matchTags(this.group.settings.requireOrganizationTags))) {\n                return false;\n            }\n        }\n        return true;\n    }\n    doesMeetRequirePlatformMembershipOn() {\n        if (this.group.settings.requirePlatformMembershipOn !== null) {\n            const requirePlatformMembershipOn = this.group.settings.requirePlatformMembershipOn;\n            return !!this.member.patchedMember.platformMemberships.find(m => m.isActive(requirePlatformMembershipOn));\n        }\n        return true;\n    }\n    doesMeetRequirePlatformMembershipOnRegistrationDate() {\n        if (this.group.settings.requirePlatformMembershipOnRegistrationDate === true) {\n            const now = new Date();\n            return !!this.member.patchedMember.platformMemberships.find(m => m.isActive(now));\n        }\n        return true;\n    }\n    isExistingMemberOrFamily() {\n        return this.member.isExistingMember(this.group.organizationId) || (this.group.settings.priorityForFamily && !!this.family.members.find(f => f.isExistingMember(this.group.organizationId)));\n    }\n    get description() {\n        const descriptions = [];\n        if (this.replaceRegistrations.length > 0) {\n            for (const registration of this.replaceRegistrations) {\n                descriptions.push('Verplaatsen vanaf ' + registration.group.settings.name);\n            }\n        }\n        if (this.getFilteredPrices().length > 1) {\n            descriptions.push(this.groupPrice.name);\n        }\n        for (const option of this.options) {\n            descriptions.push(option.optionMenu.name + ': ' + option.option.name + (option.option.allowAmount ? ` x ${option.amount}` : ''));\n        }\n        return descriptions.filter(d => !!d).join('\\n');\n    }\n    hasReachedGroupMaximum() {\n        const available = this.group.settings.getRemainingStock(this);\n        if (available !== null && available <= 0) {\n            return true;\n        }\n        // If all prices are sold out -> also reached maximum\n        const prices = this.getFilteredPrices();\n        if (prices.length > 0) {\n            let allPricesSoldOut = true;\n            for (const price of prices) {\n                const remaining = price.getRemainingStock(this);\n                if (remaining === null || remaining > 0) {\n                    allPricesSoldOut = false;\n                    break;\n                }\n            }\n            if (allPricesSoldOut) {\n                return true;\n            }\n        }\n        // If non-multiple choice option menu's are sold out -> also reached maximum\n        const optionMenus = this.getFilteredOptionMenus();\n        for (const menu of optionMenus) {\n            if (!menu.multipleChoice) {\n                let allOptionsSoldOut = true;\n                for (const option of menu.options) {\n                    const remaining = option.getRemainingStock(this);\n                    if (remaining === null || remaining > 0) {\n                        allOptionsSoldOut = false;\n                        break;\n                    }\n                }\n                if (allOptionsSoldOut) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n    get validationErrorForWaitingList() {\n        try {\n            this.validate({ forWaitingList: true });\n        }\n        catch (e) {\n            if (isSimpleError(e) || isSimpleErrors(e)) {\n                return e.getHuman();\n            }\n            throw e;\n        }\n        return null;\n    }\n    get validationError() {\n        try {\n            this.validate();\n        }\n        catch (e) {\n            if (isSimpleError(e) || isSimpleErrors(e)) {\n                return e.getHuman();\n            }\n            throw e;\n        }\n        return null;\n    }\n    get validationWarning() {\n        if (this.validationError) {\n            return null;\n        }\n        if (!this.member.family.checkout.isAdminFromSameOrganization) {\n            // Warnings are only for admins\n            return null;\n        }\n        try {\n            this.validate({ warnings: true });\n        }\n        catch (e) {\n            if (isSimpleError(e) || isSimpleErrors(e)) {\n                return e.getHuman();\n            }\n            throw e;\n        }\n        return null;\n    }\n    get isValid() {\n        return this.validationError === null;\n    }\n    get defaultStartDate() {\n        if (this.replaceRegistrations.length > 0) {\n            const reg = this.replaceRegistrations[0];\n            if (reg.startDate && reg.startDate.getTime() >= this.group.settings.startDate.getTime()) {\n                return reg.startDate;\n            }\n            return this.group.settings.startDate;\n        }\n        let startDate = Formatter.luxon(new Date());\n        startDate = startDate.set({ hour: 0, minute: 0, second: 0, millisecond: 0 });\n        return new Date(Math.max(startDate.toJSDate().getTime(), this.group.settings.startDate.getTime()));\n    }\n    get calculatedStartDate() {\n        var _a;\n        return (_a = this.customStartDate) !== null && _a !== void 0 ? _a : this.defaultStartDate;\n    }\n    get calculatedTrialUntil() {\n        if (!this.trial) {\n            return null;\n        }\n        let trialUntil = Formatter.luxon(this.calculatedStartDate).plus({ days: this.group.settings.trialDays });\n        trialUntil = trialUntil.set({ hour: 23, minute: 59, second: 59, millisecond: 0 });\n        return trialUntil.toJSDate();\n    }\n    get canHaveTrial() {\n        if (this.group.type !== GroupType.Membership) {\n            return false;\n        }\n        if (this.group.settings.trialDays <= 0) {\n            return false;\n        }\n        if (this.replaceRegistrations.find(r => r.trialUntil !== null)) {\n            return true;\n        }\n        const currentPeriodId = this.organization.period.period.id;\n        const previousPeriodId = this.organization.period.period.previousPeriodId;\n        if (!previousPeriodId) {\n            // We have no data: never give trails to avoid accidental trials\n            return false;\n        }\n        if (this.group.periodId !== currentPeriodId) {\n            return false;\n        }\n        if (this.group.defaultAgeGroupId) {\n            // Use platform based logic to determine if it is a new member by looking at memberships\n            const types = this.member.platform.config.membershipTypes.filter(m => m.behaviour === PlatformMembershipTypeBehaviour.Period).map(m => m.id);\n            const hasBlockingMemberships = !!this.member.patchedMember.platformMemberships.find((m) => {\n                if (!types.includes(m.membershipTypeId)) {\n                    return false;\n                }\n                if (m.periodId === currentPeriodId && m.balanceItemId) {\n                    // Already has a membership for the current period - which is not deletable\n                    return true;\n                }\n                if (m.periodId !== previousPeriodId) {\n                    // Not previous period\n                    return false;\n                }\n                return true;\n            });\n            if (hasBlockingMemberships) {\n                return false;\n            }\n            return true;\n        }\n        // Should not have a registration last period\n        const reg = this.member.filterRegistrations({\n            organizationId: this.group.organizationId,\n            types: [GroupType.Membership],\n            periodId: previousPeriodId,\n        });\n        return reg.length === 0;\n    }\n    /**\n     * Return wheter a given period id matches the period of this group for a requirement.\n     * E.g. if you need to be registered for a default age group or organization, only count registrations that are in an active period.\n     *\n     * This evaluates to either the period of the group or the current period of the organization. The platform period is ignored and does not count as active.\n     * This allows organizations to switch to a new period earlier and disable allowing registrations of the previous organization as being valid.\n     */\n    isActivePeriodId(periodId) {\n        if (periodId === this.group.periodId) {\n            return true;\n        }\n        if (periodId === this.organization.period.period.id) {\n            return true;\n        }\n        return false;\n    }\n    validatePeriod(group, type, admin = false) {\n        if (group.type === GroupType.WaitingList) {\n            return;\n        }\n        const platform = this.family.platform;\n        const periodId = group.periodId;\n        if (periodId !== this.organization.period.period.id) {\n            if (group.type === GroupType.Membership) {\n                if (!admin) {\n                    throw new SimpleError({\n                        code: 'different_period',\n                        message: 'Different period',\n                        human: type === 'register'\n                            ? $t('dcb9126f-72c4-42c8-990a-8ddc747c0e2b', { group: group.settings.name })\n                            : $t('7c55cb44-8149-414a-a162-ca9859014e81', { group: group.settings.name }),\n                    });\n                }\n            }\n        }\n        const period = periodId === platform.period.id ? platform.period : (periodId === this.organization.period.period.id ? this.organization.period.period : group.settings.period);\n        if (!period) {\n            throw new SimpleError({\n                code: 'locked_period',\n                message: 'Locked period',\n                human: type === 'register' ? $t('f6360ada-86e7-4ec8-86fb-fe9e750c4926', { group: group.settings.name }) : $t('Je kan geen inschrijvingen wijzigen van {group} omdat dit werkjaar is afgesloten.', { group: group.settings.name }),\n            });\n        }\n        if (!period || period.locked) {\n            throw new SimpleError({\n                code: 'locked_period',\n                message: 'Locked period',\n                human: type === 'register' ? $t('26b8398d-a17c-4854-ae64-99a410ddeffb', { group: group.settings.name, period: period.nameShort }) : $t('Je kan geen inschrijvingen wijzigen van {group} omdat werkjaar {period} is afgesloten.', { group: group.settings.name, period: period.nameShort }),\n            });\n        }\n    }\n    validate(options) {\n        var _a;\n        this.refresh(this.group, options);\n        const checkout = this.member.family.checkout;\n        const admin = checkout.isAdminFromSameOrganization && !(options === null || options === void 0 ? void 0 : options.warnings);\n        if (this.group.organizationId !== this.organization.id) {\n            throw new Error('Group and organization do not match in RegisterItem.validate');\n        }\n        if (this.trial && !this.canHaveTrial) {\n            this.trial = false;\n        }\n        if (!checkout.isAdminFromSameOrganization && this.customStartDate) {\n            this.customStartDate = null;\n        }\n        if (this.customStartDate) {\n            if (this.customStartDate < this.group.settings.startDate) {\n                throw new SimpleError({\n                    code: 'invalid_start_date',\n                    message: 'Invalid start date',\n                    human: 'De startdatum van de inschrijving moet na de startdatum van de groep zelf zijn',\n                    field: 'customStartDate',\n                });\n            }\n            if (this.customStartDate > this.group.settings.endDate) {\n                throw new SimpleError({\n                    code: 'invalid_start_date',\n                    message: 'Invalid start date',\n                    human: 'De startdatum van de inschrijving moet voor de einddatum van de groep zijn',\n                    field: 'customStartDate',\n                });\n            }\n        }\n        if (this.checkout.singleOrganization && this.checkout.singleOrganization.id !== this.organization.id) {\n            throw new SimpleError({\n                code: 'multiple_organizations',\n                message: 'Cannot add items of multiple organizations to the checkout',\n                human: `Reken eerst jouw huidige winkelmandje af. Inschrijvingen voor ${this.group.settings.name} moeten aan een andere organisatie betaald worden en kan je daardoor niet samen afrekenen.`,\n                meta: { recoverable: true },\n            });\n        }\n        this.validatePeriod(this.group, 'register', admin);\n        if ((options === null || options === void 0 ? void 0 : options.forWaitingList) && !this.group.waitingList) {\n            throw new SimpleError({\n                code: 'missing_waiting_list',\n                message: 'No waiting list',\n                human: `Je kan niet inschrijven voor de wachtlijst`,\n            });\n        }\n        if (checkout.asOrganizationId && !checkout.isAdminFromSameOrganization && !this.group.settings.allowRegistrationsByOrganization) {\n            throw new SimpleError({\n                code: 'as_organization_disabled',\n                message: 'allowRegistrationsByOrganization disabled',\n                human: 'Inschrijvingen door organisaties zijn niet toegestaan voor ' + this.group.settings.name,\n            });\n        }\n        for (const registration of this.replaceRegistrations) {\n            // todo: check if you are allowed to move\n            if (registration.memberId !== this.member.id) {\n                throw new SimpleError({\n                    code: 'invalid_move',\n                    message: 'Invalid member in replaceRegistration',\n                    human: 'Je wilt een inschrijving verplaatsen van een ander lid in ruil voor een ander lid. Dit is niet toegestaan.',\n                    field: 'replaceRegistrations',\n                });\n            }\n            if (registration.group.organizationId !== this.organization.id) {\n                throw new SimpleError({\n                    code: 'invalid_move',\n                    message: 'Invalid organization in replaceRegistration',\n                    human: 'Je wilt een inschrijving verplaatsen van een andere organisatie. Dit is niet toegestaan.',\n                    field: 'replaceRegistrations',\n                });\n            }\n            if (!checkout.isAdminFromSameOrganization) { // we don't use admins because this shouldn't raise a warning\n                throw new SimpleError({\n                    code: 'invalid_move',\n                    message: 'Not allowed to move registrations',\n                    human: 'Enkel beheerders kunnen inschrijvingen verplaatsen.',\n                    field: 'replaceRegistrations',\n                });\n            }\n            this.validatePeriod(registration.group, 'move', admin);\n        }\n        // Already registered\n        if (this.isAlreadyRegistered()) {\n            throw new SimpleError({\n                code: 'already_registered',\n                message: 'Already registered',\n                human: `${this.member.member.firstName} is al ingeschreven voor ${this.group.settings.name}`,\n            });\n        }\n        if (this.hasReachedCategoryMaximum()) {\n            // Only happens if maximum is reached in teh cart (because maximum without cart is already checked in shouldShow)\n            throw new SimpleError({\n                code: 'maximum_reached',\n                message: 'Maximum reached',\n                human: `Je kan niet meer inschrijven voor ${this.group.settings.name} omdat ${this.member.patchedMember.name} al ingeschreven is voor een groep die je niet kan combineren.`,\n            });\n        }\n        // Check if we have an invite (doesn't matter if registrations are closed)\n        if (this.isInvited()) {\n            return;\n        }\n        if (!admin) {\n            if (!(options === null || options === void 0 ? void 0 : options.forWaitingList)) {\n                if (this.group.notYetOpen) {\n                    throw new SimpleError({\n                        code: 'not_yet_open',\n                        message: 'Not yet open',\n                        human: `De inschrijvingen voor ${this.group.settings.name} zijn nog niet geopend.`,\n                    });\n                }\n                if (this.group.closed) {\n                    throw new SimpleError({\n                        code: 'closed',\n                        message: 'Closed',\n                        human: `De inschrijvingen voor ${this.group.settings.name} zijn gesloten.`,\n                    });\n                }\n            }\n            // Check if it fits\n            if (this.member.member.details) {\n                if (!this.member.member.details.doesMatchGroup(this.group)) {\n                    const error = this.member.member.details.getMatchingError(this.group);\n                    throw new SimpleError({\n                        code: 'not_matching',\n                        message: 'Not matching: memberDetails',\n                        human: (_a = error === null || error === void 0 ? void 0 : error.description) !== null && _a !== void 0 ? _a : `${this.member.patchedMember.name} voldoet niet aan de voorwaarden om in te schrijven voor deze groep.`,\n                    });\n                }\n            }\n            // Check if registrations are limited\n            if (!this.doesMeetRequireGroupIds()) {\n                throw new SimpleError({\n                    code: 'not_matching',\n                    message: 'Not matching: requireGroupIds',\n                    human: `${this.member.patchedMember.name} voldoet niet aan de voorwaarden om in te schrijven voor deze groep (verplichte inschrijving bij leeftijdsgroep).`,\n                });\n            }\n            if (!this.doesMeetRequireOrganizationIds()) {\n                throw new SimpleError({\n                    code: 'not_matching',\n                    message: 'Not matching: requireOrganizationIds',\n                    human: `${this.member.patchedMember.name} kan pas inschrijven met een geldige actieve inschrijving  (verplichte inschrijving bij lokale groep).`,\n                });\n            }\n            if (!this.doesMeetRequireOrganizationTags()) {\n                throw new SimpleError({\n                    code: 'not_matching',\n                    message: 'Not matching: requireOrganizationIds',\n                    human: `${this.member.patchedMember.name} kan pas inschrijven met een geldige actieve inschrijving  (verplichte inschrijving in regio).`,\n                });\n            }\n            if (!this.doesMeetRequirePlatformMembershipOn()) {\n                throw new SimpleError({\n                    code: 'not_matching',\n                    message: 'Not matching: requirePlatformMembershipOn',\n                    human: `${this.member.patchedMember.name} kan pas inschrijven met een geldige aansluiting (en dus verzekering) bij de koepel`,\n                });\n            }\n            if (!this.doesMeetRequirePlatformMembershipOnRegistrationDate()) {\n                throw new SimpleError({\n                    code: 'not_matching',\n                    message: 'Not matching: requirePlatformMembershipOnRegistrationDate',\n                    human: `${this.member.patchedMember.name} kan pas inschrijven met een geldige aansluiting (en dus verzekering) bij de koepel op de datum van de inschrijving`,\n                });\n            }\n            const existingMember = this.isExistingMemberOrFamily();\n            // Pre registrations?\n            if (this.group.activePreRegistrationDate) {\n                if (!existingMember) {\n                    throw new SimpleError({\n                        code: 'pre_registrations',\n                        message: 'Pre registrations',\n                        human: 'Momenteel zijn de voorinschrijvingen nog bezig voor ' + this.group.settings.name + '. Dit is enkel voor bestaande leden' + (this.group.settings.priorityForFamily ? ' en hun broers/zussen' : '') + '.',\n                    });\n                }\n            }\n            const reachedMaximum = this.hasReachedGroupMaximum();\n            if (!(options === null || options === void 0 ? void 0 : options.forWaitingList)) {\n                // More detailed error messages\n                if (this.group.settings.waitingListType === WaitingListType.All) {\n                    throw new SimpleError({\n                        code: 'waiting_list_required',\n                        message: 'Waiting list required',\n                        human: `Iedereen moet zich eerst op de wachtlijst inschrijven`,\n                        meta: { recoverable: true },\n                    });\n                }\n                if (this.group.settings.waitingListType === WaitingListType.ExistingMembersFirst && !existingMember) {\n                    throw new SimpleError({\n                        code: 'waiting_list_required',\n                        message: 'Waiting list required',\n                        human: `Nieuwe leden moeten zich eerst op de wachtlijst inschrijven`,\n                        meta: { recoverable: true },\n                    });\n                }\n                if (this.group.waitingList) {\n                    if (reachedMaximum) {\n                        throw new SimpleError({\n                            code: 'waiting_list_required',\n                            message: 'Waiting list required',\n                            human: `De inschrijvingen voor ${this.group.settings.name} zijn volzet. Je kan wel nog inschrijven voor de wachtlijst`,\n                            meta: { recoverable: true },\n                        });\n                    }\n                }\n            }\n            if (reachedMaximum && !this.group.waitingList) {\n                // Reached maximum without waiting lists\n                throw new SimpleError({\n                    code: 'maximum_reached',\n                    message: 'Maximum reached',\n                    human: `De inschrijvingen voor ${this.group.settings.name} zijn volzet`,\n                    meta: { recoverable: true },\n                });\n            }\n            // Only check individual stock if we haven't reached the maximum - otherwise it won't suggest to use the waiting list\n            if (!reachedMaximum) {\n                // Check individual stock\n                if (this.groupPrice.getRemainingStock(this) === 0) {\n                    throw new SimpleError({\n                        code: 'stock_empty',\n                        message: 'Stock empty',\n                        human: `Het tarief ${this.groupPrice.name} is uitverkocht`,\n                        meta: { recoverable: true },\n                    });\n                }\n                for (const option of this.options) {\n                    const remaining = option.option.getRemainingStock(this);\n                    if (remaining !== null && remaining < option.amount) {\n                        throw new SimpleError({\n                            code: 'stock_empty',\n                            message: 'Stock empty',\n                            human: remaining === 0 ? `De keuzemogelijkheid ${option.option.name} is uitverkocht` : `Er zijn nog maar ${Formatter.pluralText(remaining, 'stuk', 'stuks')} beschikbaar van ${option.option.name}`,\n                            meta: { recoverable: true },\n                        });\n                    }\n                    const maximumSelection = option.option.getMaximumSelection(this);\n                    if (maximumSelection !== null && maximumSelection < option.amount) {\n                        throw new SimpleError({\n                            code: 'option_max',\n                            message: 'Option maximum exceeded',\n                            human: `Het maximum voor de keuzemogelijkheid ${option.option.name} is overschreden`,\n                        });\n                    }\n                }\n            }\n            if (options === null || options === void 0 ? void 0 : options.forWaitingList) {\n                // Also check waiting list itself\n                const item = RegisterItem.defaultFor(this.member, this.group.waitingList, this.organization);\n                item.validate({ warnings: options === null || options === void 0 ? void 0 : options.warnings });\n            }\n        }\n    }\n    /**\n     * Returns the stock that will be taken (or freed if negative) by all the register items before this item\n     * and with the removed registrations freed up, so this can be negative\n     */\n    getCartPendingStockReservations() {\n        const deleteRegistrations = [\n            ...this.checkout.cart.deleteRegistrations.filter(r => r.groupId === this.group.id),\n            ...this.replaceRegistrations.filter(r => r.groupId === this.group.id),\n        ];\n        const cartIndex = this.checkout.cart.items.findIndex(i => i.id === this.id);\n        const itemsBefore = this.checkout.cart.items.slice(0, cartIndex === -1 ? undefined : cartIndex);\n        return StockReservation.removed(itemsBefore.flatMap(i => i.getPendingStockReservations()), // these will be removed\n        deleteRegistrations.flatMap(r => r.stockReservations));\n    }\n    /**\n     * Stock that will be taken or removed by this item\n     */\n    getPendingStockReservations() {\n        const base = [\n            // Global level stock reservations (stored in each group)\n            StockReservation.create({\n                objectId: this.group.id,\n                objectType: 'Group',\n                amount: 1,\n                children: [\n                    // Group level stock reservatiosn (stored in the group)\n                    StockReservation.create({\n                        objectId: this.groupPrice.id,\n                        objectType: 'GroupPrice',\n                        amount: 1,\n                    }),\n                    ...this.options.map((o) => {\n                        return StockReservation.create({\n                            objectId: o.option.id,\n                            objectType: 'GroupOption',\n                            amount: o.amount,\n                        });\n                    }),\n                ],\n            }),\n        ];\n        const freed = this.replaceRegistrations.flatMap(r => r.stockReservations);\n        return StockReservation.removed(base, freed);\n    }\n    doesMatchFilter(filter) {\n        try {\n            const compiledFilter = compileToInMemoryFilter(filter, registerItemInMemoryFilterCompilers);\n            return compiledFilter(this);\n        }\n        catch (e) {\n            console.error('Error while compiling filter', e, filter);\n        }\n        return false;\n    }\n    isRecordEnabled(_) {\n        return true;\n    }\n    getRecordAnswers() {\n        return this.recordAnswers;\n    }\n    patchRecordAnswers(patch) {\n        const cloned = this.clone();\n        cloned.recordAnswers = patchObject(cloned.recordAnswers, patch);\n        return cloned;\n    }\n    isSameRegistration(item) {\n        return item.memberId === this.memberId && item.groupId === this.groupId && item.organization.id === this.organization.id;\n    }\n}\n//# sourceMappingURL=RegisterItem.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, DateDecoder, field, IntegerDecoder, MapDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { compileToInMemoryFilter } from '../filters/InMemoryFilter.js';\nimport { registrationInMemoryFilterCompilers } from '../filters/inMemoryFilterDefinitions.js';\nimport { GenericBalance } from '../GenericBalance.js';\nimport { Group } from '../Group.js';\nimport { GroupPrice } from '../GroupSettings.js';\nimport { StockReservation } from '../StockReservation.js';\nimport { RegisterItemOption } from './checkout/RegisterItem.js';\nimport { RecordAnswerDecoder } from './records/RecordAnswer.js';\nexport class Registration extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.options = [];\n        this.recordAnswers = new Map();\n        this.payingOrganizationId = null;\n        this.memberId = '';\n        /**\n         * @deprecated\n         */\n        this.cycle = 0;\n        /// Set registeredAt to null if the member is on the waiting list for now\n        this.registeredAt = null;\n        this.startDate = null;\n        this.trialUntil = null;\n        /// Keep spot for this member temporarily\n        this.reservedUntil = null;\n        /**\n         * Currently not yet used\n         */\n        this.deactivatedAt = null;\n        this.createdAt = new Date();\n        this.updatedAt = new Date();\n        /**\n         * @deprecated - replaced by group type\n         */\n        this.waitingList = false;\n        this.canRegister = false;\n        /**\n         * @deprecated\n         * Use balances instead\n         */\n        this.price = 0;\n        /**\n         * @deprecated\n         * Use balances instead\n         */\n        this.pricePaid = 0;\n        this.stockReservations = [];\n        this.balances = [];\n    }\n    get groupId() {\n        return this.group.id;\n    }\n    get isTrial() {\n        return this.trialUntil !== null && (this.deactivatedAt ? (this.trialUntil >= this.deactivatedAt) : (this.trialUntil > new Date()));\n    }\n    get description() {\n        const descriptions = [];\n        if (this.group.settings.getFilteredPrices().length > 1) {\n            descriptions.push(this.groupPrice.name);\n        }\n        for (const option of this.options) {\n            descriptions.push(option.optionMenu.name + ': ' + option.option.name + (option.option.allowAmount ? ` x ${option.amount}` : ''));\n        }\n        for (const answer of this.recordAnswers.values()) {\n            descriptions.push(answer.descriptionValue);\n        }\n        return descriptions.filter(d => !!d).join('\\n');\n    }\n    doesMatchFilter(filter) {\n        try {\n            const compiledFilter = compileToInMemoryFilter(filter, registrationInMemoryFilterCompilers);\n            return compiledFilter(this);\n        }\n        catch (e) {\n            console.error('Error while compiling filter', e, filter);\n        }\n        return false;\n    }\n    isRecordEnabled(_) {\n        return true;\n    }\n    getRecordAnswers() {\n        return this.recordAnswers;\n    }\n    patchRecordAnswers(patch) {\n        return this.patch({\n            recordAnswers: patch,\n        });\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], Registration.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: Group, version: 266 })\n], Registration.prototype, \"group\", void 0);\n__decorate([\n    field({ decoder: GroupPrice, version: 305 })\n], Registration.prototype, \"groupPrice\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RegisterItemOption), version: 305 })\n], Registration.prototype, \"options\", void 0);\n__decorate([\n    field({ decoder: new MapDecoder(StringDecoder, RecordAnswerDecoder), version: 338 })\n], Registration.prototype, \"recordAnswers\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 250 })\n], Registration.prototype, \"organizationId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 351 })\n], Registration.prototype, \"payingOrganizationId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 300 })\n], Registration.prototype, \"memberId\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, optional: true })\n], Registration.prototype, \"cycle\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], Registration.prototype, \"registeredAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 354 })\n], Registration.prototype, \"startDate\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 354 })\n], Registration.prototype, \"trialUntil\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], Registration.prototype, \"reservedUntil\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], Registration.prototype, \"deactivatedAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], Registration.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], Registration.prototype, \"updatedAt\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 16, optional: true })\n], Registration.prototype, \"waitingList\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 20 })\n], Registration.prototype, \"canRegister\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, optional: true })\n], Registration.prototype, \"price\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, optional: true })\n], Registration.prototype, \"pricePaid\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StockReservation), nullable: true, version: 299 })\n], Registration.prototype, \"stockReservations\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(GenericBalance), version: 354 })\n], Registration.prototype, \"balances\", void 0);\n//# sourceMappingURL=Registration.js.map","import { __decorate } from \"tslib\";\nimport { field } from '@simonbackx/simple-encoding';\nimport { TinyMember } from './Member.js';\nimport { Registration } from './Registration.js';\nexport class RegistrationWithMember extends Registration {\n    static from(registration, member) {\n        return RegistrationWithMember.create({\n            ...registration,\n            member,\n        });\n    }\n}\n__decorate([\n    field({ decoder: TinyMember })\n], RegistrationWithMember.prototype, \"member\", void 0);\n//# sourceMappingURL=RegistrationWithMember.js.map","import { Formatter } from '@stamhoofd/utility';\nimport { BalanceItem } from '../BalanceItem.js';\nimport { Replacement } from '../endpoints/EmailRequest.js';\nimport { STPackageType, STPackageTypeHelper } from '../billing/STPackage.js';\nconst exampleBalanceItem = BalanceItem.create({\n    description: 'Voorbeeld item 1',\n    amount: 5,\n    unitPrice: 1000,\n});\nconst exampleBalanceItem2 = BalanceItem.create({\n    description: 'Voorbeeld item 2',\n    amount: 1,\n    unitPrice: 500,\n});\nlet _injectedReplacementValues = (replacements) => {\n    throw new Error('injectReplacementValues is not yet injected. Call injectReplacementValues to inject dependencies.');\n};\nexport function injectReplacementValues(injected) {\n    _injectedReplacementValues = injected;\n}\nlet filled = false;\nlet _ExampleReplacements = {};\nfunction fillReplacementsIfNeeded() {\n    if (!filled) {\n        _ExampleReplacements = getReplacements();\n        _injectedReplacementValues(Object.values(_ExampleReplacements));\n        filled = true;\n    }\n}\nexport const ExampleReplacements = {\n    get all() {\n        fillReplacementsIfNeeded();\n        return _ExampleReplacements;\n    },\n    get default() {\n        fillReplacementsIfNeeded();\n        return [\n            _ExampleReplacements.greeting,\n            _ExampleReplacements.firstName,\n            _ExampleReplacements.lastName,\n            _ExampleReplacements.email,\n            _ExampleReplacements.organizationName,\n            _ExampleReplacements.fromAddress,\n            _ExampleReplacements.fromName,\n        ];\n    },\n};\nfunction getReplacements() {\n    /**\n     * Note: please also add the corresponding smart variable to shared/structures/src/email/EditorSmartVariable.ts\n     * and the corresponding buttons to shared/structures/src/email/EditorSmartButton.ts\n     */\n    const htmlPlaceholder = '<p class=\"description\">Oeps, er ging iets mis bij het laden van het voorbeeld dat hier moet komen</p>';\n    const textPlaceholder = 'ONTBREEKT';\n    return {\n        greeting: Replacement.create({\n            token: 'greeting',\n            value: 'Dag Jan,',\n        }),\n        firstName: Replacement.create({\n            token: 'firstName',\n            value: 'Jan',\n        }),\n        lastName: Replacement.create({\n            token: 'lastName',\n            value: 'Jansen',\n        }),\n        email: Replacement.create({\n            token: 'email',\n            value: 'jan.jansen@voorbeeld.com',\n        }),\n        fromAddress: Replacement.create({\n            token: 'fromAddress',\n            value: 'verstuurder@voorbeeld.com',\n        }),\n        fromName: Replacement.create({\n            token: 'fromName',\n            value: 'Verstuurder',\n        }),\n        paymentUrl: Replacement.create({\n            token: 'paymentUrl',\n            value: 'https://www.example.com/payment',\n        }),\n        balanceTable: Replacement.create({\n            token: 'balanceTable',\n            html: BalanceItem.getDetailsHTMLTable([\n                exampleBalanceItem,\n                exampleBalanceItem2,\n            ]),\n        }),\n        outstandingBalance: Replacement.create({\n            token: 'outstandingBalance',\n            value: '€ 55,00',\n        }),\n        objectName: Replacement.create({\n            token: 'objectName',\n            value: 'Jan Jansens',\n        }),\n        resetUrl: Replacement.create({\n            token: 'resetUrl',\n            value: 'https://www.voorbeeld.com/heel-lange-code-waarmee-de-link-beveiligd-wordt',\n        }),\n        confirmEmailUrl: Replacement.create({\n            token: 'confirmEmailUrl',\n            value: 'https://www.example.com/confirm-email',\n        }),\n        confirmEmailCode: Replacement.create({\n            token: 'confirmEmailCode',\n            value: '123 456',\n        }),\n        organizationName: Replacement.create({\n            token: 'organizationName',\n            value: $t('aeace79f-c772-4944-8d1d-f92eb519267f'),\n        }),\n        platformOrOrganizationName: Replacement.create({\n            token: 'platformOrOrganizationName',\n            value: $t('6f77926b-801a-477d-8254-78166ca8e6be'),\n        }),\n        feedbackText: Replacement.create({\n            token: 'feedbackText',\n            html: '<p class=\"pre-wrap\"><em>' + Formatter.escapeHtml($t('ac49cf9f-c0de-479c-829d-99e7a31874d2')) + '</em></p>',\n        }),\n        downloadUrl: Replacement.create({\n            token: 'downloadUrl',\n            value: 'https://www.example.com/download',\n        }),\n        reviewUrl: Replacement.create({\n            token: 'reviewUrl',\n            value: 'https://www.example.com/review',\n        }),\n        submitterName: Replacement.create({\n            token: 'submitterName',\n            value: 'Piet Pieters',\n        }),\n        eventName: Replacement.create({\n            token: 'eventName',\n            value: $t('aaaaf4eb-6714-42b8-bd94-aa167246cac6'),\n        }),\n        dateRange: Replacement.create({\n            token: 'dateRange',\n            value: $t('b66ae14a-e02d-4c80-bec2-d7440da7643f'),\n        }),\n        inviterName: Replacement.create({\n            token: 'inviterName',\n            value: 'Piet',\n        }),\n        validUntil: Replacement.create({\n            token: 'validUntil',\n            value: Formatter.dateTime(new Date(Date.now() + 7 * 24 * 3600 * 1000)),\n        }),\n        validUntilDate: Replacement.create({\n            token: 'validUntilDate',\n            value: Formatter.date(new Date(Date.now() + 7 * 24 * 3600 * 1000)),\n        }),\n        firstNameMember: Replacement.create({\n            token: 'firstNameMember',\n            value: 'Klaas',\n        }),\n        lastNameMember: Replacement.create({\n            token: 'lastNameMember',\n            value: 'Klaassen',\n        }),\n        registerUrl: Replacement.create({\n            token: 'registerUrl',\n            value: 'https://inschrijven.voorbeeld.com',\n        }),\n        groupName: Replacement.create({\n            token: 'groupName',\n            value: $t('07290df8-cad5-40df-9e10-3c7eccc049bc'),\n        }),\n        signInUrl: Replacement.create({\n            token: 'signInUrl',\n            value: 'https://www.example.com/sign-in',\n        }),\n        unsubscribeUrl: Replacement.create({\n            token: 'unsubscribeUrl',\n            value: 'https://www.example.com/unsubscribe',\n        }),\n        renewUrl: Replacement.create({\n            token: 'renewUrl',\n            value: 'https://www.example.com/renew',\n        }),\n        loginDetails: Replacement.create({\n            token: 'loginDetails',\n            html: `<p class=\"description\"><em>Je kan op het ledenportaal inloggen met <strong>${Formatter.escapeHtml('voorbeeld@email.com')}</strong></em></p>`,\n        }),\n        mailDomain: Replacement.create({\n            token: 'mailDomain',\n            value: 'voorbeeld.com',\n        }),\n        paymentMethod: Replacement.create({\n            token: 'paymentMethod',\n            value: 'Bancontact',\n        }),\n        priceToPay: Replacement.create({\n            token: 'priceToPay',\n            value: '€ 40,50',\n        }),\n        transferDescription: Replacement.create({\n            token: 'transferDescription',\n            value: '+++111/111/111+++',\n        }),\n        transferBankAccount: Replacement.create({\n            token: 'transferBankAccount',\n            value: 'BE1234 1234 1234',\n        }),\n        transferBankCreditor: Replacement.create({\n            token: 'transferBankCreditor',\n            value: $t('aeace79f-c772-4944-8d1d-f92eb519267f'),\n        }),\n        overviewContext: Replacement.create({\n            token: 'overviewContext',\n            value: 'Inschrijving van Klaas en Piet',\n        }),\n        memberNames: Replacement.create({\n            token: 'memberNames',\n            value: 'Klaas en Piet',\n        }),\n        overviewTable: Replacement.create({\n            token: 'overviewTable',\n            html: htmlPlaceholder,\n        }),\n        paymentTable: Replacement.create({\n            token: 'paymentTable',\n            html: htmlPlaceholder,\n        }),\n        packageName: Replacement.create({\n            token: 'packageName',\n            value: STPackageTypeHelper.getName(STPackageType.Members),\n        }),\n        orderPrice: Replacement.create({\n            token: 'orderPrice',\n            value: '€ 15,00',\n        }),\n        orderStatus: Replacement.create({\n            token: 'orderStatus',\n            value: textPlaceholder,\n        }),\n        nr: Replacement.create({\n            token: 'nr',\n            value: '15',\n        }),\n        orderTime: Replacement.create({\n            token: 'orderTime',\n            value: textPlaceholder,\n        }),\n        orderDate: Replacement.create({\n            token: 'orderDate',\n            value: textPlaceholder,\n        }),\n        orderMethod: Replacement.create({\n            token: 'orderMethod',\n            value: textPlaceholder,\n        }),\n        orderLocation: Replacement.create({\n            token: 'orderLocation',\n            value: textPlaceholder,\n        }),\n        orderDetailsTable: Replacement.create({\n            token: 'orderDetailsTable',\n            html: htmlPlaceholder,\n        }),\n        orderTable: Replacement.create({\n            token: 'orderTable',\n            html: htmlPlaceholder,\n        }),\n        orderUrl: Replacement.create({\n            token: 'orderUrl',\n            value: textPlaceholder,\n        }),\n        webshopName: Replacement.create({\n            token: 'webshopName',\n            value: 'Demoshop',\n        }),\n    };\n}\n//# sourceMappingURL=exampleReplacements.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { ExampleReplacements } from './exampleReplacements.js';\nexport class EditorSmartVariable extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.description = null;\n        this.example = '';\n    }\n    getJSONContent() {\n        return { type: this.html ? 'smartVariableBlock' : 'smartVariable', attrs: { id: this.id } };\n    }\n    static forRecipient(recipient) {\n        const replacements = [...recipient.replacements, ...recipient.getDefaultReplacements()];\n        return this.forReplacements(replacements);\n    }\n    static forReplacements(replacements) {\n        return this.fillExamples(this.all.map(v => v.clone()), replacements);\n    }\n    static fillExamples(list, replacements) {\n        return list.filter((variable) => {\n            // Always supported: signInUrl + unsubscribeUrl\n            if (variable.id === 'signInUrl' || variable.id === 'unsubscribeUrl') {\n                return true;\n            }\n            const replacement = replacements.find(r => r.token === variable.id && (r.value || r.html));\n            if (!replacement) {\n                // Not found\n                return false;\n            }\n            else {\n                if (variable instanceof EditorSmartVariable) {\n                    if (replacement.html) {\n                        variable.html = replacement.html;\n                        variable.example = '';\n                    }\n                    else if (replacement.value) {\n                        variable.example = replacement.value;\n                        variable.html = undefined;\n                    }\n                }\n                else {\n                    // Do not change text\n                }\n            }\n            return true;\n        });\n    }\n    static get all() {\n        /**\n         * Note: please also add the corresponding default replacements to `shared/structures/src/email/exampleReplacements.ts`\n         * and only add the example or html there. You should not fill it in here, that will happen automatically.\n         */\n        const variables = [\n            EditorSmartVariable.create({\n                id: 'greeting',\n                name: 'Begroeting',\n            }),\n            EditorSmartVariable.create({\n                id: 'firstName',\n                name: 'Voornaam',\n                deleteMessage: 'De voornaam van één of meerdere ontvangers ontbreekt in het systeem. De magische tekstvervanging voor de voornaam is daarom weggehaald.',\n            }),\n            EditorSmartVariable.create({\n                id: 'lastName',\n                name: 'Achternaam',\n                deleteMessage: 'De achternaam van één of meerdere ontvangers ontbreekt in het systeem. De magische tekstvervanging voor de achteraam is daarom weggehaald.',\n            }),\n            EditorSmartVariable.create({\n                id: 'email',\n                name: 'E-mailadres ontvanger',\n            }),\n            EditorSmartVariable.create({\n                id: 'fromAddress',\n                name: 'E-mailadres verstuurder',\n            }),\n            EditorSmartVariable.create({\n                id: 'fromName',\n                name: 'Naam verstuurder',\n            }),\n            EditorSmartVariable.create({\n                id: 'firstNameMember',\n                name: 'Voornaam van lid',\n                deleteMessage: 'Je kan de voornaam van een lid enkel gebruiken als je één e-mail per lid verstuurt.',\n            }),\n            EditorSmartVariable.create({\n                id: 'lastNameMember',\n                name: 'Achternaam van lid',\n                deleteMessage: 'Je kan de achternaam van een lid enkel gebruiken als je één e-mail per lid verstuurt.',\n            }),\n            EditorSmartVariable.create({\n                id: 'inviterName',\n                name: 'Naam van uitnodiger',\n            }),\n            EditorSmartVariable.create({\n                id: 'platformOrOrganizationName',\n                name: 'Naam van de vereniging of van het platform',\n            }),\n            EditorSmartVariable.create({\n                id: 'outstandingBalance',\n                name: 'Openstaand bedrag',\n                deleteMessage: 'Je kan het openstaand bedrag van een lid enkel gebruiken als je één e-mail per lid verstuurt.',\n            }),\n            EditorSmartVariable.create({\n                id: 'registerUrl',\n                name: 'Inschrijvingsportaal link',\n            }),\n            EditorSmartVariable.create({\n                id: 'resetUrl',\n                name: 'Voluit link om wachtwoord te herstellen',\n            }),\n            EditorSmartVariable.create({\n                id: 'confirmEmailCode',\n                name: 'Code om e-mail te bevestigen',\n            }),\n            EditorSmartVariable.create({\n                id: 'loginDetails',\n                name: 'Inloggegevens',\n                hint: 'Deze tekst wijzigt afhankelijk van de situatie: als de ontvanger nog geen account heeft, vertelt het op welk e-mailadres de ontvanger kan registreren. In het andere geval op welk e-mailadres de ontvanger kan inloggen.',\n            }),\n            EditorSmartVariable.create({\n                id: 'feedbackText',\n                name: $t('f90728f1-0e73-4027-9408-adfc38c9a4f0'),\n                hint: $t('21c3edb6-8c2d-43c2-8c51-245d75006774'),\n            }),\n            EditorSmartVariable.create({\n                id: 'groupName',\n                name: 'Groepnaam',\n            }),\n            EditorSmartVariable.create({\n                id: 'mailDomain',\n                name: 'E-maildomeinnaam',\n            }),\n        ];\n        // if (this.orders.length > 0) {\n        variables.push(EditorSmartVariable.create({\n            id: 'nr',\n            name: 'Bestelnummer',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'orderPrice',\n            name: 'Bestelbedrag',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'orderPrice',\n            name: 'Bestelbedrag',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'orderStatus',\n            name: 'Bestelstatus',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'orderTime',\n            name: 'Tijdstip',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'orderDate',\n            name: 'Afhaal/leverdatum',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'orderMethod',\n            name: 'Afhaalmethode (afhalen, leveren, ter plaatse)',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'orderLocation',\n            name: 'Locatie of leveradres',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'paymentMethod',\n            name: 'Betaalmethode',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'priceToPay',\n            name: 'Te betalen bedrag',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'pricePaid',\n            name: 'Betaald bedrag',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'transferDescription',\n            name: 'Mededeling (overschrijving)',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'transferBankAccount',\n            name: 'Rekeningnummer (overschrijving)',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'transferBankCreditor',\n            name: 'Begunstigde (overschrijving)',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'orderTable',\n            name: 'Tabel met bestelde artikels',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'overviewTable',\n            name: 'Overzichtstabel',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'balanceTable',\n            name: 'Tabel met openstaande bedragen',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'orderDetailsTable',\n            name: 'Tabel met bestelgegevens',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'paymentTable',\n            name: 'Tabel met betaalinstructies',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'overviewContext',\n            name: 'Betaalcontext',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'memberNames',\n            name: $t('bd54c45e-d3df-444e-b5d9-9722a6e08999'),\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'organizationName',\n            name: $t('e07bc7a1-92c0-48fc-91f3-46e12573ee03'),\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'objectName',\n            name: 'Naam schuldenaar',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'webshopName',\n            name: 'Naam webshop',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'validUntil',\n            name: 'Geldig tot',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'validUntilDate',\n            name: 'Geldig tot (datum)',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'packageName',\n            name: 'Pakketnaam',\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'submitterName',\n            name: $t('5685519b-26b5-43cf-b1f3-73fdc2e642cd'),\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'eventName',\n            name: $t('cb76c693-29ff-4d41-9c45-56106a798818'),\n        }));\n        variables.push(EditorSmartVariable.create({\n            id: 'dateRange',\n            name: $t('44f90dca-5bb1-4bad-bf03-fd425cdb6a03'),\n        }));\n        // Fill examples using the example replacements\n        this.fillExamples(variables, Object.values(ExampleReplacements.all));\n        return variables;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], EditorSmartVariable.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EditorSmartVariable.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], EditorSmartVariable.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EditorSmartVariable.prototype, \"example\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], EditorSmartVariable.prototype, \"html\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], EditorSmartVariable.prototype, \"deleteMessage\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], EditorSmartVariable.prototype, \"hint\", void 0);\n//# sourceMappingURL=EditorSmartVariable.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, EnumDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { EditorSmartVariable } from './EditorSmartVariable.js';\nexport class EditorSmartButton extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.type = 'block';\n    }\n    static forReplacements(replacements) {\n        return EditorSmartVariable.fillExamples(this.all.map(v => v.clone()), replacements);\n    }\n    static forRecipient(recipient) {\n        const replacements = [...recipient.replacements, ...recipient.getDefaultReplacements()];\n        return this.all.map(v => v.clone()).filter((variable) => {\n            // Always supported: signInUrl + unsubscribeUrl\n            if (variable.id === 'signInUrl' || variable.id === 'unsubscribeUrl') {\n                return true;\n            }\n            const replacement = replacements.find(r => r.token === variable.id && (r.value.length > 0 || r.html !== undefined));\n            if (!replacement) {\n                // Not found\n                return false;\n            }\n            return true;\n        });\n    }\n    static get all() {\n        const buttons = [];\n        buttons.push(EditorSmartButton.create({\n            id: 'paymentUrl',\n            name: 'Knop om te betalen',\n            text: 'Betalen',\n            hint: 'Met deze knop kunnen ontvangers betalen.',\n        }));\n        buttons.push(EditorSmartButton.create({\n            id: 'reviewUrl',\n            name: $t('d26eacf8-26b6-4fa6-8a58-1f8f256bd5fc'),\n            text: $t('b782247f-6a73-4de0-8563-03cf9187b888'),\n            hint: $t('21fb9a88-0fcd-4d55-8ae5-a2ef4af5637c'),\n        }));\n        buttons.push(EditorSmartButton.create({\n            id: 'downloadUrl',\n            name: 'Knop om te downloaden',\n            text: 'Download',\n            hint: 'Download een gekoppeld bestand.',\n        }));\n        buttons.push(EditorSmartButton.create({\n            id: 'resetUrl',\n            name: 'Knop om wachtwoord opnieuw in te stellen',\n            text: 'Wachtwoord opnieuw instellen',\n            hint: 'Knop waarmee gebruikers hun wachtwoord kunnen herstellen',\n        }));\n        buttons.push(EditorSmartButton.create({\n            id: 'signInUrl',\n            name: 'Knop om in te loggen',\n            text: 'Open ledenportaal',\n            hint: 'Als gebruikers op deze knop klikken, zorgt het systeem ervoor dat ze inloggen of registreren op het juiste e-mailadres dat al in het systeem zit.',\n        }));\n        // todo: make button text smart, e.g. 'view tickets' vs 'open order'\n        buttons.push(EditorSmartButton.create({\n            id: 'orderUrl',\n            name: 'Knop naar bestelling',\n            text: 'Bestelling bekijken',\n            hint: 'Deze knop gaat naar het besteloverzicht, met alle informatie van de bestellingen en eventueel betalingsinstructies.',\n        }));\n        buttons.push(EditorSmartButton.create({\n            id: 'unsubscribeUrl',\n            name: 'Knop om uit te schrijven voor e-mails',\n            text: 'Uitschrijven',\n            hint: 'Met deze knop kan de ontvanger zich uitschrijven voor alle e-mails.',\n            type: 'inline',\n        }));\n        buttons.push(EditorSmartButton.create({\n            id: 'confirmEmailUrl',\n            name: 'Knop om e-mailadres te bevestigen',\n            text: 'Bevestig e-mailadres',\n            hint: 'Met deze knop kan de ontvanger het e-mailadres bevestigen.',\n        }));\n        // Remove all smart variables that are not set in the recipients\n        return buttons;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], EditorSmartButton.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EditorSmartButton.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EditorSmartButton.prototype, \"text\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EditorSmartButton.prototype, \"hint\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], EditorSmartButton.prototype, \"deleteMessage\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(['block', 'inline']) })\n], EditorSmartButton.prototype, \"type\", void 0);\n//# sourceMappingURL=EditorSmartButton.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, DateDecoder, field } from '@simonbackx/simple-encoding';\nimport { Formatter } from '@stamhoofd/utility';\nimport { Organization } from '../Organization.js';\nimport { User } from '../User.js';\nimport { EmailRecipient } from '../email/Email.js';\nimport { Replacement } from '../endpoints/EmailRequest.js';\nimport { memberWithRegistrationsBlobInMemoryFilterCompilers } from '../filters/inMemoryFilterDefinitions.js';\nimport { compileToInMemoryFilter } from '../filters/InMemoryFilter.js';\nimport { Member } from './Member.js';\nimport { MemberPlatformMembership } from './MemberPlatformMembership.js';\nimport { Registration } from './Registration.js';\nimport { MemberResponsibilityRecord } from './MemberResponsibilityRecord.js';\nexport class MemberWithRegistrationsBlob extends Member {\n    constructor() {\n        super(...arguments);\n        this.registrations = [];\n        this.users = [];\n        this.responsibilities = [];\n        this.platformMemberships = [];\n    }\n    doesMatchFilter(filter) {\n        try {\n            const compiledFilter = compileToInMemoryFilter(filter, memberWithRegistrationsBlobInMemoryFilterCompilers);\n            return compiledFilter(this);\n        }\n        catch (e) {\n            console.error('Error while compiling filter', e, filter);\n        }\n        return false;\n    }\n    hasAccount(email) {\n        return !!this.users.find(u => u.hasAccount && u.email === email);\n    }\n    getEmailRecipients(subtypes = null) {\n        var _a;\n        const recipients = [];\n        const shared = [];\n        shared.push(Replacement.create({\n            token: 'firstNameMember',\n            value: this.firstName,\n        }));\n        shared.push(Replacement.create({\n            token: 'lastNameMember',\n            value: (_a = this.details.lastName) !== null && _a !== void 0 ? _a : '',\n        }));\n        /* shared.push(Replacement.create({\n            token: 'outstandingBalance',\n            value: Formatter.price(this.outstandingBalance),\n        })); */\n        const createLoginDetailsReplacement = (email) => {\n            const formattedEmail = Formatter.escapeHtml(email);\n            let suffix = '';\n            if (this.details.securityCode) {\n                suffix = ` De beveiligingscode voor ${Formatter.escapeHtml(this.firstName)} is <span class=\"style-inline-code\">${Formatter.escapeHtml(Formatter.spaceString(this.details.securityCode, 4, '-'))}</span>.`;\n            }\n            return Replacement.create({\n                token: 'loginDetails',\n                value: '',\n                html: this.hasAccount(email) ? `<p class=\"description\"><em>Je kan op het ledenportaal inloggen met <strong>${formattedEmail}</strong>.${suffix}</em></p>` : `<p class=\"description\"><em>Je kan op het ledenportaal een nieuw account aanmaken met het e-mailadres <strong>${formattedEmail}</strong>, dan krijg je automatisch toegang tot alle bestaande gegevens.${suffix}</em></p>`,\n            });\n        };\n        if (this.details.email && (subtypes === null || subtypes.includes('member'))) {\n            recipients.push(EmailRecipient.create({\n                objectId: this.id,\n                firstName: this.details.firstName,\n                lastName: this.details.lastName,\n                email: this.details.email,\n                replacements: [\n                    createLoginDetailsReplacement(this.details.email),\n                    ...shared,\n                ],\n            }));\n        }\n        if (subtypes === null || subtypes.includes('parents')) {\n            for (const parent of this.details.parents) {\n                if (parent.email) {\n                    recipients.push(EmailRecipient.create({\n                        objectId: this.id,\n                        firstName: parent.firstName,\n                        lastName: parent.lastName,\n                        email: parent.email,\n                        replacements: [\n                            createLoginDetailsReplacement(parent.email),\n                            ...shared,\n                        ],\n                    }));\n                }\n            }\n        }\n        if (subtypes && subtypes.includes('unverified')) {\n            for (const unverifiedEmail of this.details.unverifiedEmails) {\n                recipients.push(EmailRecipient.create({\n                    objectId: this.id,\n                    email: unverifiedEmail,\n                    replacements: [\n                        Replacement.create({\n                            token: 'email',\n                            value: unverifiedEmail.toLowerCase(),\n                        }),\n                        createLoginDetailsReplacement(unverifiedEmail),\n                        ...shared,\n                    ],\n                }));\n            }\n        }\n        return recipients;\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(Registration) })\n], MemberWithRegistrationsBlob.prototype, \"registrations\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(User), version: 32 })\n], MemberWithRegistrationsBlob.prototype, \"users\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(MemberResponsibilityRecord), version: 263 })\n], MemberWithRegistrationsBlob.prototype, \"responsibilities\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(MemberPlatformMembership), version: 270 })\n], MemberWithRegistrationsBlob.prototype, \"platformMemberships\", void 0);\nexport class MembersBlob extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.members = [];\n        this.organizations = [];\n        /**\n         * Timestamp on which the backend constructed this blob\n         *\n         * This is encoded, so it can be stored locally\n         */\n        this.receivedAt = new Date();\n    }\n    markReceivedFromBackend() {\n        this.receivedAt = new Date();\n    }\n    get isStale() {\n        return MembersBlob.lastPatchedMembersDate !== null && this.receivedAt < MembersBlob.lastPatchedMembersDate;\n    }\n    static markAllStale() {\n        MembersBlob.lastPatchedMembersDate = new Date();\n    }\n}\nMembersBlob.lastPatchedMembersDate = null;\n__decorate([\n    field({ decoder: new ArrayDecoder(MemberWithRegistrationsBlob) })\n], MembersBlob.prototype, \"members\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Organization) })\n], MembersBlob.prototype, \"organizations\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, version: 329 })\n], MembersBlob.prototype, \"receivedAt\", void 0);\n//# sourceMappingURL=MemberWithRegistrationsBlob.js.map","import { __decorate } from \"tslib\";\nimport { AnyDecoder, AutoEncoder, DateDecoder, EnumDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { EmailRecipientFilterType } from './Email.js';\nimport { ExampleReplacements } from './exampleReplacements.js';\nexport var EmailTemplateType;\n(function (EmailTemplateType) {\n    /**\n     * Template created by the user to send manually\n     */\n    EmailTemplateType[\"SavedMembersEmail\"] = \"SavedMembersEmail\";\n    /**\n     * Defaults\n     */\n    EmailTemplateType[\"DefaultMembersEmail\"] = \"DefaultMembersEmail\";\n    EmailTemplateType[\"DefaultReceivableBalancesEmail\"] = \"DefaultReceivableBalancesEmail\";\n    EmailTemplateType[\"SavedReceivableBalancesEmail\"] = \"SavedReceivableBalancesEmail\";\n    //\n    EmailTemplateType[\"MembersExpirationReminder\"] = \"MembersExpirationReminder\";\n    EmailTemplateType[\"WebshopsExpirationReminder\"] = \"WebshopsExpirationReminder\";\n    EmailTemplateType[\"SingleWebshopExpirationReminder\"] = \"SingleWebshopExpirationReminder\";\n    EmailTemplateType[\"TrialWebshopsExpirationReminder\"] = \"TrialWebshopsExpirationReminder\";\n    EmailTemplateType[\"TrialMembersExpirationReminder\"] = \"TrialMembersExpirationReminder\";\n    EmailTemplateType[\"OrderNotification\"] = \"OrderNotification\";\n    EmailTemplateType[\"RegistrationConfirmation\"] = \"RegistrationConfirmation\";\n    EmailTemplateType[\"RegistrationTransferDetails\"] = \"RegistrationTransferDetails\";\n    EmailTemplateType[\"OrderConfirmationOnline\"] = \"OrderConfirmationOnline\";\n    EmailTemplateType[\"OrderConfirmationTransfer\"] = \"OrderConfirmationTransfer\";\n    EmailTemplateType[\"OrderConfirmationPOS\"] = \"OrderConfirmationPOS\";\n    EmailTemplateType[\"OrderReceivedTransfer\"] = \"OrderReceivedTransfer\";\n    EmailTemplateType[\"OrderOnlinePaymentFailed\"] = \"OrderOnlinePaymentFailed\";\n    /**\n     * Tickets sent immediately after ordering\n     */\n    EmailTemplateType[\"TicketsConfirmation\"] = \"TicketsConfirmation\";\n    /**\n     * Order received, tickets will follow when we receive your payment\n     */\n    EmailTemplateType[\"TicketsConfirmationTransfer\"] = \"TicketsConfirmationTransfer\";\n    /**\n     * Order received, tickets sent, but need to get paid at entrance\n     */\n    EmailTemplateType[\"TicketsConfirmationPOS\"] = \"TicketsConfirmationPOS\";\n    /**\n     * Tickets sent after payment is received\n     */\n    EmailTemplateType[\"TicketsReceivedTransfer\"] = \"TicketsReceivedTransfer\";\n    /**\n     * Organization emails:\n     */\n    EmailTemplateType[\"OrganizationUnstableDNS\"] = \"OrganizationUnstableDNS\";\n    EmailTemplateType[\"OrganizationInvalidDNS\"] = \"OrganizationInvalidDNS\";\n    EmailTemplateType[\"OrganizationValidDNS\"] = \"OrganizationValidDNS\";\n    EmailTemplateType[\"OrganizationStableDNS\"] = \"OrganizationStableDNS\";\n    EmailTemplateType[\"OrganizationDNSSetupComplete\"] = \"OrganizationDNSSetupComplete\";\n    // Drip emails\n    EmailTemplateType[\"OrganizationDripWelcome\"] = \"OrganizationDripWelcome\";\n    EmailTemplateType[\"OrganizationDripWebshopTrialCheckin\"] = \"OrganizationDripWebshopTrialCheckin\";\n    EmailTemplateType[\"OrganizationDripMembersTrialCheckin\"] = \"OrganizationDripMembersTrialCheckin\";\n    EmailTemplateType[\"OrganizationDripWebshopTrialExpired\"] = \"OrganizationDripWebshopTrialExpired\";\n    EmailTemplateType[\"OrganizationDripMembersTrialExpired\"] = \"OrganizationDripMembersTrialExpired\";\n    EmailTemplateType[\"OrganizationDripTrialExpiredReminder\"] = \"OrganizationDripTrialExpiredReminder\";\n    EmailTemplateType[\"OrganizationDripWebshopNotRenewed\"] = \"OrganizationDripWebshopNotRenewed\";\n    EmailTemplateType[\"OrganizationDripMembersNotRenewed\"] = \"OrganizationDripMembersNotRenewed\";\n    /**\n     * Exports\n     */\n    EmailTemplateType[\"ExcelExportSucceeded\"] = \"ExcelExportSucceeded\";\n    EmailTemplateType[\"ExcelExportFailed\"] = \"ExcelExportFailed\";\n    /**\n     * User emails\n     */\n    EmailTemplateType[\"ForgotPasswordButNoAccount\"] = \"ForgotPasswordButNoAccount\";\n    EmailTemplateType[\"ForgotPassword\"] = \"ForgotPassword\";\n    EmailTemplateType[\"SignupAlreadyHasAccount\"] = \"SignupAlreadyHasAccount\";\n    EmailTemplateType[\"VerifyEmail\"] = \"VerifyEmail\";\n    EmailTemplateType[\"VerifyEmailWithoutCode\"] = \"VerifyEmailWithoutCode\";\n    EmailTemplateType[\"AdminInvitation\"] = \"AdminInvitation\";\n    EmailTemplateType[\"AdminInvitationNewUser\"] = \"AdminInvitationNewUser\";\n    EmailTemplateType[\"DeleteAccountConfirmation\"] = \"DeleteAccountConfirmation\";\n    /**\n     * Balances\n     */\n    /**\n     * E-mail sent to the user when their balance went up.\n     * E.g. end of trial, manually added a balance item...\n     */\n    EmailTemplateType[\"UserBalanceIncreaseNotification\"] = \"UserBalanceIncreaseNotification\";\n    EmailTemplateType[\"OrganizationBalanceIncreaseNotification\"] = \"OrganizationBalanceIncreaseNotification\";\n    /**\n     * A reminder e-mail to the user that their balance has to be paid.\n     */\n    EmailTemplateType[\"UserBalanceReminder\"] = \"UserBalanceReminder\";\n    EmailTemplateType[\"OrganizationBalanceReminder\"] = \"OrganizationBalanceReminder\";\n    /**\n     * Event notifications\n     */\n    EmailTemplateType[\"EventNotificationSubmittedCopy\"] = \"EventNotificationSubmittedCopy\";\n    EmailTemplateType[\"EventNotificationSubmittedReviewer\"] = \"EventNotificationSubmittedReviewer\";\n    EmailTemplateType[\"EventNotificationAccepted\"] = \"EventNotificationAccepted\";\n    EmailTemplateType[\"EventNotificationRejected\"] = \"EventNotificationRejected\";\n    EmailTemplateType[\"EventNotificationPartiallyAccepted\"] = \"EventNotificationPartiallyAccepted\";\n})(EmailTemplateType || (EmailTemplateType = {}));\nexport class EmailTemplate extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.organizationId = null;\n        this.subject = '';\n        this.type = EmailTemplateType.SavedMembersEmail;\n        this.html = '';\n        this.text = '';\n        this.json = {};\n        this.groupId = null;\n        this.webshopId = null;\n        this.createdAt = new Date();\n        this.updatedAt = new Date();\n    }\n    static getDefaultForRecipient(type) {\n        if (type === EmailRecipientFilterType.Members || type === EmailRecipientFilterType.MemberParents) {\n            return EmailTemplateType.DefaultMembersEmail;\n        }\n        if (type === EmailRecipientFilterType.ReceivableBalances) {\n            return EmailTemplateType.DefaultReceivableBalancesEmail;\n        }\n        return null;\n    }\n    static getSavedForRecipient(type) {\n        if (type === EmailRecipientFilterType.Members || type === EmailRecipientFilterType.MemberParents) {\n            return EmailTemplateType.SavedMembersEmail;\n        }\n        if (type === EmailRecipientFilterType.ReceivableBalances) {\n            return EmailTemplateType.SavedReceivableBalancesEmail;\n        }\n        return null;\n    }\n    static isSavedEmail(type) {\n        if (type === EmailTemplateType.SavedMembersEmail) {\n            return true;\n        }\n        if (type === EmailTemplateType.SavedReceivableBalancesEmail) {\n            return true;\n        }\n        return false;\n    }\n    static getRecipientType(type) {\n        if (type === EmailTemplateType.SavedMembersEmail) {\n            return EmailRecipientFilterType.Members;\n        }\n        if (type === EmailTemplateType.DefaultMembersEmail) {\n            return EmailRecipientFilterType.Members;\n        }\n        // Use custom getSupportedReplacementsForType for this type\n        return null;\n    }\n    static getTypeTitle(type) {\n        switch (type) {\n            case EmailTemplateType.SavedMembersEmail: return 'Opgeslagen e-mail naar leden';\n            case EmailTemplateType.SavedReceivableBalancesEmail: return 'Opgeslagen e-mail naar openstaande bedragen';\n            case EmailTemplateType.DefaultMembersEmail: return 'Standaard e-mail naar leden';\n            case EmailTemplateType.DefaultReceivableBalancesEmail: return 'Standaard e-mail naar openstaande bedragen';\n            case EmailTemplateType.MembersExpirationReminder: return 'Herinnering verlopen pakket ledenadministratie';\n            case EmailTemplateType.WebshopsExpirationReminder: return 'Herinnering verlopen pakket webshops';\n            case EmailTemplateType.SingleWebshopExpirationReminder: return 'Herinnering verlopen pakket enkele webshop';\n            case EmailTemplateType.TrialWebshopsExpirationReminder: return 'Herinnering verlopen proefperiode pakket webshops';\n            case EmailTemplateType.TrialMembersExpirationReminder: return 'Herinnering verlopen proefperiode pakket ledenadministratie';\n            case EmailTemplateType.OrderNotification: return 'Bestelling notificatie voor beheerders';\n            case EmailTemplateType.RegistrationConfirmation: return 'Bevestiging van inschrijving';\n            case EmailTemplateType.RegistrationTransferDetails: return 'Betaalinstructies met overschrijving';\n            case EmailTemplateType.OrderConfirmationOnline: return 'Bestelling bevestiging: online betaling';\n            case EmailTemplateType.OrderConfirmationTransfer: return 'Bestelling bevestiging: overschrijving';\n            case EmailTemplateType.OrderConfirmationPOS: return 'Bestelling bevestiging: betaling aan de kassa';\n            case EmailTemplateType.OrderReceivedTransfer: return 'Bevestiging ontvangen overschrijving';\n            case EmailTemplateType.OrderOnlinePaymentFailed: return 'Online betaling mislukt';\n            case EmailTemplateType.TicketsConfirmation: return 'E-mail met tickets: online betaling';\n            case EmailTemplateType.TicketsConfirmationTransfer: return 'Bevestiging voor bestelling met overschrijving (nog geen tickets)';\n            case EmailTemplateType.TicketsConfirmationPOS: return 'E-mail met tickets: betaling aan de kassa';\n            case EmailTemplateType.TicketsReceivedTransfer: return 'E-mail met tickets: na ontvangen overschrijving';\n            case EmailTemplateType.OrganizationUnstableDNS: return 'Instabiele DNS';\n            case EmailTemplateType.OrganizationInvalidDNS: return 'Ongeldige DNS';\n            case EmailTemplateType.OrganizationValidDNS: return 'Geldige DNS';\n            case EmailTemplateType.OrganizationStableDNS: return 'Stabiele DNS';\n            case EmailTemplateType.OrganizationDNSSetupComplete: return 'DNS setup compleet';\n            case EmailTemplateType.OrganizationDripWelcome: return 'Welkom';\n            case EmailTemplateType.OrganizationDripWebshopTrialCheckin: return 'Webshop proefperiode checkin';\n            case EmailTemplateType.OrganizationDripMembersTrialCheckin: return 'Ledenadministratie proefperiode checkin';\n            case EmailTemplateType.OrganizationDripWebshopTrialExpired: return 'Webshop proefperiode verlopen';\n            case EmailTemplateType.OrganizationDripMembersTrialExpired: return 'Ledenadministratie proefperiode verlopen';\n            case EmailTemplateType.OrganizationDripTrialExpiredReminder: return 'Proefperiode verlopen reminder';\n            case EmailTemplateType.OrganizationDripWebshopNotRenewed: return 'Webshop niet verlengd';\n            case EmailTemplateType.OrganizationDripMembersNotRenewed: return 'Ledenadministratie niet verlengd';\n            case EmailTemplateType.ExcelExportSucceeded: return 'Excel export geslaagd';\n            case EmailTemplateType.ExcelExportFailed: return 'Excel export mislukt';\n            case EmailTemplateType.SignupAlreadyHasAccount: return 'Registratie: account bestaat al';\n            case EmailTemplateType.ForgotPasswordButNoAccount: return 'Wachtwoord vergeten: geen account';\n            case EmailTemplateType.ForgotPassword: return 'Wachtwoord vergeten';\n            case EmailTemplateType.DeleteAccountConfirmation: return 'Bevestiging account verwijderen';\n            case EmailTemplateType.VerifyEmail: return 'Verifieer e-mailadres';\n            case EmailTemplateType.VerifyEmailWithoutCode: return 'Verifieer e-mailadres zonder code';\n            case EmailTemplateType.AdminInvitation: return 'Uitnodiging beheerder: bestaande gebruiker';\n            case EmailTemplateType.AdminInvitationNewUser: return 'Uitnodiging beheerder: nieuwe gebruiker';\n            case EmailTemplateType.UserBalanceIncreaseNotification: return 'Saldo verhoogd';\n            case EmailTemplateType.UserBalanceReminder: return 'Saldo herinnering';\n            case EmailTemplateType.OrganizationBalanceIncreaseNotification: return 'Saldo verhoogd';\n            case EmailTemplateType.OrganizationBalanceReminder: return 'Saldo herinnering';\n            case EmailTemplateType.EventNotificationSubmittedCopy: return $t('9a9a7777-44ca-494b-9d15-c0192bc41a7f');\n            case EmailTemplateType.EventNotificationSubmittedReviewer: return $t('ff2beaea-cb8f-4de8-ba1c-039b7ba20bc0');\n            case EmailTemplateType.EventNotificationAccepted: return $t('c936748e-b6f9-4aa9-9822-77bd727501eb');\n            case EmailTemplateType.EventNotificationRejected: return $t('01266433-c6b9-4c4b-b09f-b212cc0ce5a8');\n            case EmailTemplateType.EventNotificationPartiallyAccepted: return $t('Kampmelding voorlopig goedgekeurd');\n        }\n    }\n    static getTypeCategory(type) {\n        switch (type) {\n            case EmailTemplateType.SavedMembersEmail:\n            case EmailTemplateType.SavedReceivableBalancesEmail:\n                return 'Opgeslagen e-mail';\n            case EmailTemplateType.DefaultMembersEmail:\n            case EmailTemplateType.DefaultReceivableBalancesEmail:\n                return 'Placeholder';\n            case EmailTemplateType.MembersExpirationReminder:\n            case EmailTemplateType.WebshopsExpirationReminder:\n            case EmailTemplateType.SingleWebshopExpirationReminder:\n            case EmailTemplateType.TrialWebshopsExpirationReminder:\n            case EmailTemplateType.TrialMembersExpirationReminder:\n                return 'Billing';\n            case EmailTemplateType.RegistrationConfirmation:\n            case EmailTemplateType.RegistrationTransferDetails:\n                return 'Inschrijvingen';\n            case EmailTemplateType.OrderNotification:\n                return 'Webshop';\n            case EmailTemplateType.OrderConfirmationOnline:\n            case EmailTemplateType.OrderConfirmationTransfer:\n            case EmailTemplateType.OrderConfirmationPOS:\n            case EmailTemplateType.OrderReceivedTransfer:\n            case EmailTemplateType.OrderOnlinePaymentFailed:\n                return 'Webshop zonder tickets';\n            case EmailTemplateType.TicketsConfirmation:\n            case EmailTemplateType.TicketsConfirmationTransfer:\n            case EmailTemplateType.TicketsConfirmationPOS:\n            case EmailTemplateType.TicketsReceivedTransfer:\n                return 'Webshop met tickets';\n            case EmailTemplateType.OrganizationUnstableDNS:\n            case EmailTemplateType.OrganizationInvalidDNS:\n            case EmailTemplateType.OrganizationValidDNS:\n            case EmailTemplateType.OrganizationStableDNS:\n            case EmailTemplateType.OrganizationDNSSetupComplete:\n                return 'DNS';\n            case EmailTemplateType.OrganizationDripWelcome:\n            case EmailTemplateType.OrganizationDripWebshopTrialCheckin:\n            case EmailTemplateType.OrganizationDripMembersTrialCheckin:\n            case EmailTemplateType.OrganizationDripWebshopTrialExpired:\n            case EmailTemplateType.OrganizationDripMembersTrialExpired:\n            case EmailTemplateType.OrganizationDripTrialExpiredReminder:\n            case EmailTemplateType.OrganizationDripWebshopNotRenewed:\n            case EmailTemplateType.OrganizationDripMembersNotRenewed:\n                return 'Drip';\n            case EmailTemplateType.ExcelExportSucceeded:\n            case EmailTemplateType.ExcelExportFailed:\n                return 'Excel export';\n            case EmailTemplateType.SignupAlreadyHasAccount:\n            case EmailTemplateType.ForgotPasswordButNoAccount:\n            case EmailTemplateType.ForgotPassword:\n            case EmailTemplateType.DeleteAccountConfirmation:\n            case EmailTemplateType.VerifyEmail:\n            case EmailTemplateType.VerifyEmailWithoutCode:\n                return 'Accounts en wachtwoorden';\n            case EmailTemplateType.AdminInvitation:\n            case EmailTemplateType.AdminInvitationNewUser:\n                return 'Uitnodiging beheerder';\n            case EmailTemplateType.UserBalanceIncreaseNotification:\n            case EmailTemplateType.UserBalanceReminder:\n                return 'Openstaand bedrag leden';\n            case EmailTemplateType.OrganizationBalanceIncreaseNotification:\n            case EmailTemplateType.OrganizationBalanceReminder:\n                return 'Openstaand bedrag groepen';\n            case EmailTemplateType.EventNotificationSubmittedCopy:\n            case EmailTemplateType.EventNotificationSubmittedReviewer:\n            case EmailTemplateType.EventNotificationAccepted:\n            case EmailTemplateType.EventNotificationRejected:\n            case EmailTemplateType.EventNotificationPartiallyAccepted:\n                return $t('a4658017-52e9-4732-8570-2c60e5d6a5cd');\n        }\n        return 'Andere';\n    }\n    static allowPlatformLevel(type) {\n        if (STAMHOOFD.userMode === 'platform') {\n            if (type.includes('Drip') || type.includes('Expiration')) {\n                return false;\n            }\n        }\n        return true;\n    }\n    static allowOrganizationLevel(type) {\n        switch (type) {\n            case EmailTemplateType.DefaultMembersEmail: return true;\n            case EmailTemplateType.DefaultReceivableBalancesEmail: return true;\n            case EmailTemplateType.SavedMembersEmail: return true;\n            case EmailTemplateType.SavedReceivableBalancesEmail: return true;\n            case EmailTemplateType.RegistrationConfirmation: return true;\n            case EmailTemplateType.RegistrationTransferDetails: return true;\n            case EmailTemplateType.OrderConfirmationOnline: return true;\n            case EmailTemplateType.OrderConfirmationTransfer: return true;\n            case EmailTemplateType.OrderConfirmationPOS: return true;\n            case EmailTemplateType.OrderReceivedTransfer: return true;\n            case EmailTemplateType.TicketsConfirmation: return true;\n            case EmailTemplateType.TicketsConfirmationTransfer: return true;\n            case EmailTemplateType.TicketsConfirmationPOS: return true;\n            case EmailTemplateType.TicketsReceivedTransfer: return true;\n            case EmailTemplateType.UserBalanceIncreaseNotification: return true;\n            case EmailTemplateType.UserBalanceReminder: return true;\n            case EmailTemplateType.OrganizationBalanceIncreaseNotification: return true;\n            case EmailTemplateType.OrganizationBalanceReminder: return true;\n        }\n        return false;\n    }\n    static getPlatformTypeDescription(type) {\n        switch (type) {\n            case EmailTemplateType.OrganizationUnstableDNS: return 'Na periodiek controleren blijken de DNS-instellingen van de domeinnaam van een vereniging instabiel te zijn.';\n            case EmailTemplateType.OrganizationInvalidDNS: return 'Bij een routinecontrole blijken de DNS-instellingen van de domeinnaam van een vereniging ongeldig te zijn.';\n            case EmailTemplateType.OrganizationValidDNS: return 'Na een controle blijken de DNS-instellingen van de domeinnaam van een vereniging geldig te zijn.';\n            case EmailTemplateType.OrganizationStableDNS: return 'Na periodiek controleren blijken de DNS-instellingen van de domeinnaam van een vereniging terug stabiel te zijn.';\n            case EmailTemplateType.OrganizationDNSSetupComplete: return 'De DNS-instellingen van de domeinnaam van een vereniging zijn correct ingesteld.';\n            case EmailTemplateType.OrderOnlinePaymentFailed: return 'Wanneer een online betaling bij een webshop mislukt na een lange tijd wachten - zou zelden mogen voorkomen';\n            case EmailTemplateType.ExcelExportSucceeded: return 'Bij lange Excel exports ontvang je een e-mail om jouw bestand te downloaden';\n            case EmailTemplateType.ExcelExportFailed: return 'Als een lange Excel export toch mislukt, ontvang je een e-mail dat het mis ging';\n            case EmailTemplateType.ForgotPasswordButNoAccount: return 'Als iemand een wachtwoord probeert te resetten, maar er geen account is met dat e-mailadres';\n            case EmailTemplateType.ForgotPassword: return 'De e-mail met een link om je wachtwoord opnieuw in te stellen als je die bent vergeten';\n            case EmailTemplateType.DeleteAccountConfirmation: return 'De e-mail als bevestiging als iemand aanvraagt om hun account te verwijderen.';\n            case EmailTemplateType.VerifyEmail: return 'De e-mail die wordt verzonden om het e-mailadres te bevestigen als iemand een account aanmaakt.';\n            case EmailTemplateType.VerifyEmailWithoutCode: return 'De e-mail die wordt verzonden naar de gebruiker om het e-mailadres te bevestigen als een beheerder dit wijzigt. Deze e-mail bevat geen bevestigingscode.';\n            case EmailTemplateType.AdminInvitation: return 'De e-mail die een bestaande gebruiker ontvangt als hij toegevoegd wordt als beheerder.';\n            case EmailTemplateType.AdminInvitationNewUser: return 'De e-mail die iemand zonder account ontvangt als hij toegevoegd wordt als beheerder.';\n            case EmailTemplateType.SignupAlreadyHasAccount: return 'Als iemand probeert een account aan te maken, maar er al een account bestaat met dat e-mailadres';\n            case EmailTemplateType.EventNotificationSubmittedCopy: return $t('fdf6dd9d-25f9-41bc-869b-beb2906aa77f');\n            case EmailTemplateType.EventNotificationSubmittedReviewer: return $t('bd2321f7-caea-423e-a5e9-823023e74ec9');\n            case EmailTemplateType.EventNotificationAccepted: return $t('1bb58aa1-e36e-4384-8c54-be3b71d77a3b');\n            case EmailTemplateType.EventNotificationRejected: return $t('0b6949f6-80b7-4d48-9e1e-16bfb826014a');\n            case EmailTemplateType.EventNotificationPartiallyAccepted: return $t('E-mail die wordt verzonden naar de indieners als de kampmelding voorlopig wordt goedgekeurd');\n        }\n        return null;\n    }\n    static getTypeDescription(type) {\n        switch (type) {\n            case EmailTemplateType.DefaultMembersEmail: return 'Als iemand een nieuwe e-mail opstelt, gericht aan leden, zal deze template standaard al klaar staan. Deze kan dan nog aangepast worden.';\n            case EmailTemplateType.DefaultReceivableBalancesEmail: return 'Als iemand een nieuwe e-mail opstelt, gericht aan leden met openstaande bedragen, zal deze template standaard al klaar staan. Deze kan dan nog aangepast worden.';\n            case EmailTemplateType.OrderNotification: return 'E-mail die webshop eigenaren ontvangen wanneer er een bestelling is geplaatst (indien ze die functie hebben ingeschakeld)';\n            case EmailTemplateType.RegistrationConfirmation: return 'Leden en ouders (die toegang hebben of moeten krijgen) ontvangen deze e-mail nadat ze worden ingeschreven of zelf inschrijven.';\n            case EmailTemplateType.OrderConfirmationOnline: return 'Wanneer een besteller online betaald (of totaalbedrag is 0 euro)';\n            case EmailTemplateType.OrderConfirmationTransfer: return 'Wanneer een besteller kiest voor overschrijving - bevat nog eens de betaalinstructies als de betaling nog niet zou zijn gebeurd';\n            case EmailTemplateType.OrderConfirmationPOS: return 'Wanneer een besteller kiest voor betaling ter plaatse/bij levering';\n            case EmailTemplateType.OrderReceivedTransfer: return 'De e-mail die een besteller nog ontvangt als je de betaling hebt gemarkeerd als ontvangen (enkel bij betaalmethode overschrijving)';\n            case EmailTemplateType.TicketsConfirmation: return 'Wanneer een besteller online betaald (of totaalbedrag is 0 euro)';\n            case EmailTemplateType.TicketsConfirmationTransfer: return 'Wanneer een besteller kiest voor overschrijving - bevat nog eens de betaalinstructies als de betaling nog niet zou zijn gebeurd';\n            case EmailTemplateType.TicketsConfirmationPOS: return 'Wanneer een besteller kiest voor betaling ter plaatse/bij levering';\n            case EmailTemplateType.TicketsReceivedTransfer: return 'De e-mail die een besteller nog ontvangt als je de betaling hebt gemarkeerd als ontvangen (enkel bij betaalmethode overschrijving)';\n            case EmailTemplateType.UserBalanceIncreaseNotification: return 'Automatische e-mail die \\'s ochtends wordt verzonden als het saldo van een gebruiker omhoog is gegaan. Bijvoorbeeld als iemand een openstaand bedrag heeft toegevoegd bij een lid.';\n            case EmailTemplateType.UserBalanceReminder: return 'Automatische e-mail die \\'s ochtends wordt verzonden als een gebruiker nog steeds een openstaand bedrag heeft.';\n            case EmailTemplateType.OrganizationBalanceIncreaseNotification: return 'Automatische e-mail die \\'s ochtends wordt verzonden als het saldo van een groep omhoog is gegaan.';\n            case EmailTemplateType.OrganizationBalanceReminder: return 'Automatische e-mail die \\'s ochtends wordt verzonden als een groep nog steeds een openstaand bedrag heeft.';\n        }\n        return '';\n    }\n    static getSupportedReplacementsForType(type) {\n        if ([\n            EmailTemplateType.EventNotificationSubmittedCopy,\n            EmailTemplateType.EventNotificationSubmittedReviewer,\n            EmailTemplateType.EventNotificationAccepted,\n            EmailTemplateType.EventNotificationRejected,\n            EmailTemplateType.EventNotificationPartiallyAccepted,\n        ].includes(type)) {\n            return [\n                ...ExampleReplacements.default,\n                ExampleReplacements.all.reviewUrl,\n                ExampleReplacements.all.submitterName,\n                ExampleReplacements.all.organizationName,\n                ExampleReplacements.all.eventName,\n                ExampleReplacements.all.dateRange,\n                ...(type === EmailTemplateType.EventNotificationRejected || type === EmailTemplateType.EventNotificationPartiallyAccepted ? [ExampleReplacements.all.feedbackText] : []),\n            ];\n        }\n        if ([\n            EmailTemplateType.DefaultReceivableBalancesEmail,\n            EmailTemplateType.SavedReceivableBalancesEmail,\n            EmailTemplateType.UserBalanceIncreaseNotification,\n            EmailTemplateType.UserBalanceReminder,\n            EmailTemplateType.OrganizationBalanceIncreaseNotification,\n            EmailTemplateType.OrganizationBalanceReminder,\n        ].includes(type)) {\n            return [\n                ...ExampleReplacements.default,\n                ExampleReplacements.all.paymentUrl,\n                ExampleReplacements.all.outstandingBalance,\n                ExampleReplacements.all.balanceTable,\n                ExampleReplacements.all.objectName,\n            ];\n        }\n        if ([\n            EmailTemplateType.SavedMembersEmail,\n            EmailTemplateType.DefaultMembersEmail,\n        ].includes(type)) {\n            return [\n                ...ExampleReplacements.default,\n                ExampleReplacements.all.firstNameMember,\n                ExampleReplacements.all.lastNameMember,\n                ExampleReplacements.all.outstandingBalance,\n                ExampleReplacements.all.balanceTable,\n            ];\n        }\n        if (type === EmailTemplateType.SignupAlreadyHasAccount) {\n            return [\n                ...ExampleReplacements.default,\n                ExampleReplacements.all.resetUrl,\n            ];\n        }\n        if (type === EmailTemplateType.ForgotPasswordButNoAccount) {\n            return [\n                // Name not available\n                ExampleReplacements.all.email,\n            ];\n        }\n        if (type === EmailTemplateType.DeleteAccountConfirmation) {\n            return ExampleReplacements.default;\n        }\n        if (type === EmailTemplateType.ForgotPassword) {\n            return [\n                ...ExampleReplacements.default,\n                ExampleReplacements.all.resetUrl,\n            ];\n        }\n        if (type === EmailTemplateType.VerifyEmail) {\n            return [\n                ...ExampleReplacements.default,\n                ExampleReplacements.all.confirmEmailUrl,\n                ExampleReplacements.all.confirmEmailCode,\n            ];\n        }\n        if (type === EmailTemplateType.VerifyEmailWithoutCode) {\n            return [\n                ...ExampleReplacements.default,\n                ExampleReplacements.all.confirmEmailUrl,\n            ];\n        }\n        if (type === EmailTemplateType.AdminInvitation) {\n            return [\n                ...ExampleReplacements.default,\n                ExampleReplacements.all.platformOrOrganizationName,\n                ExampleReplacements.all.inviterName,\n                ExampleReplacements.all.validUntil,\n                ExampleReplacements.all.signInUrl,\n                ExampleReplacements.all.resetUrl,\n            ];\n        }\n        if (type === EmailTemplateType.AdminInvitationNewUser) {\n            return [\n                ...ExampleReplacements.default,\n                ExampleReplacements.all.platformOrOrganizationName,\n                ExampleReplacements.all.inviterName,\n                ExampleReplacements.all.validUntil,\n                ExampleReplacements.all.resetUrl,\n            ];\n        }\n        if (type === EmailTemplateType.ExcelExportSucceeded) {\n            return [\n                ...ExampleReplacements.default,\n                ExampleReplacements.all.downloadUrl,\n            ];\n        }\n        if (type === EmailTemplateType.ExcelExportFailed) {\n            return [\n                ...ExampleReplacements.default,\n            ];\n        }\n        if (type === EmailTemplateType.RegistrationConfirmation) {\n            return [\n                ...ExampleReplacements.default,\n                ExampleReplacements.all.firstNameMember,\n                ExampleReplacements.all.lastNameMember,\n                ExampleReplacements.all.registerUrl,\n                ExampleReplacements.all.groupName,\n                ExampleReplacements.all.signInUrl,\n                ExampleReplacements.all.unsubscribeUrl,\n                ExampleReplacements.all.loginDetails,\n            ];\n        }\n        if ([\n            EmailTemplateType.OrganizationDNSSetupComplete,\n            EmailTemplateType.OrganizationInvalidDNS,\n            EmailTemplateType.OrganizationStableDNS,\n            EmailTemplateType.OrganizationUnstableDNS,\n            EmailTemplateType.OrganizationValidDNS,\n        ].includes(type)) {\n            return [\n                ...ExampleReplacements.default,\n                ExampleReplacements.all.mailDomain,\n            ];\n        }\n        if (type === EmailTemplateType.RegistrationTransferDetails) {\n            return [\n                ExampleReplacements.all.priceToPay,\n                ExampleReplacements.all.paymentMethod,\n                ExampleReplacements.all.transferDescription,\n                ExampleReplacements.all.transferBankAccount,\n                ExampleReplacements.all.transferBankCreditor,\n                ExampleReplacements.all.overviewContext,\n                ExampleReplacements.all.memberNames,\n                ExampleReplacements.all.overviewTable,\n                ExampleReplacements.all.paymentTable,\n                ExampleReplacements.all.registerUrl,\n                ExampleReplacements.all.organizationName,\n                ExampleReplacements.all.signInUrl,\n                ExampleReplacements.all.unsubscribeUrl,\n                ExampleReplacements.all.loginDetails,\n            ];\n        }\n        if ([\n            EmailTemplateType.MembersExpirationReminder,\n            EmailTemplateType.WebshopsExpirationReminder,\n            EmailTemplateType.TrialMembersExpirationReminder,\n            EmailTemplateType.TrialWebshopsExpirationReminder,\n            EmailTemplateType.SingleWebshopExpirationReminder,\n        ].includes(type)) {\n            return [\n                ...ExampleReplacements.default,\n                ExampleReplacements.all.packageName,\n                ExampleReplacements.all.validUntil,\n                ExampleReplacements.all.validUntilDate,\n                ExampleReplacements.all.renewUrl,\n                ExampleReplacements.all.unsubscribeUrl,\n            ];\n        }\n        const sharedReplacements = [\n            ...ExampleReplacements.default,\n            ExampleReplacements.all.orderPrice,\n            ExampleReplacements.all.orderStatus,\n            ExampleReplacements.all.orderDetailsTable,\n            ExampleReplacements.all.orderTable,\n            ExampleReplacements.all.paymentTable,\n            ExampleReplacements.all.orderUrl,\n            ExampleReplacements.all.paymentMethod,\n            ExampleReplacements.all.organizationName,\n            ExampleReplacements.all.webshopName,\n            ExampleReplacements.all.unsubscribeUrl,\n        ];\n        if (type !== EmailTemplateType.OrderOnlinePaymentFailed) {\n            sharedReplacements.push(ExampleReplacements.all.nr);\n        }\n        if (type === EmailTemplateType.OrderConfirmationTransfer || type === EmailTemplateType.TicketsConfirmationTransfer) {\n            return [\n                ...sharedReplacements,\n                ExampleReplacements.all.transferDescription,\n                ExampleReplacements.all.transferBankAccount,\n                ExampleReplacements.all.transferBankCreditor,\n            ];\n        }\n        return sharedReplacements;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], EmailTemplate.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], EmailTemplate.prototype, \"organizationId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EmailTemplate.prototype, \"subject\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(EmailTemplateType) })\n], EmailTemplate.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EmailTemplate.prototype, \"html\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EmailTemplate.prototype, \"text\", void 0);\n__decorate([\n    field({ decoder: AnyDecoder })\n], EmailTemplate.prototype, \"json\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], EmailTemplate.prototype, \"groupId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], EmailTemplate.prototype, \"webshopId\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, optional: true })\n], EmailTemplate.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, optional: true })\n], EmailTemplate.prototype, \"updatedAt\", void 0);\n//# sourceMappingURL=EmailTemplate.js.map","import { __decorate } from \"tslib\";\nimport { AnyDecoder, ArrayDecoder, AutoEncoder, BooleanDecoder, DateDecoder, EnumDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { EditorSmartButton } from '../email/EditorSmartButton.js';\nimport { EditorSmartVariable } from '../email/EditorSmartVariable.js';\nimport { EmailAttachment, Recipient, Replacement } from '../endpoints/EmailRequest.js';\nimport { StamhoofdFilterDecoder } from '../filters/FilteredRequest.js';\nimport { MemberDetails } from '../members/MemberDetails.js';\nimport { MemberWithRegistrationsBlob } from '../members/MemberWithRegistrationsBlob.js';\nimport { EmailTemplate } from './EmailTemplate.js';\nexport var EmailRecipientFilterType;\n(function (EmailRecipientFilterType) {\n    EmailRecipientFilterType[\"Members\"] = \"Members\";\n    EmailRecipientFilterType[\"MemberParents\"] = \"MemberParents\";\n    EmailRecipientFilterType[\"MemberUnverified\"] = \"MemberUnverified\";\n    EmailRecipientFilterType[\"Orders\"] = \"Orders\";\n    EmailRecipientFilterType[\"ReceivableBalances\"] = \"ReceivableBalances\";\n})(EmailRecipientFilterType || (EmailRecipientFilterType = {}));\nexport function getExampleRecipient(type = null) {\n    return MemberWithRegistrationsBlob.create({\n        details: MemberDetails.create({\n            firstName: 'Jan',\n            lastName: 'Janssens',\n            email: 'jan.janssens@voorbeeld-emailadres.com',\n        }),\n    }).getEmailRecipients(['member'])[0];\n}\nexport var EmailStatus;\n(function (EmailStatus) {\n    EmailStatus[\"Draft\"] = \"Draft\";\n    EmailStatus[\"Sending\"] = \"Sending\";\n    EmailStatus[\"Sent\"] = \"Sent\";\n    EmailStatus[\"Deleted\"] = \"Deleted\";\n    EmailStatus[\"Failed\"] = \"Failed\";\n})(EmailStatus || (EmailStatus = {}));\nexport var EmailRecipientsStatus;\n(function (EmailRecipientsStatus) {\n    EmailRecipientsStatus[\"NotCreated\"] = \"NotCreated\";\n    EmailRecipientsStatus[\"Creating\"] = \"Creating\";\n    EmailRecipientsStatus[\"Created\"] = \"Created\";\n})(EmailRecipientsStatus || (EmailRecipientsStatus = {}));\nexport class EmailRecipientSubfilter extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.type = EmailRecipientFilterType.Members;\n        this.filter = null;\n        this.search = null;\n        /**\n         * In case the email is sent to a specific type of relation, we can filter that relation here.\n         * E.g. sending an email to organziations -> filter on who to email to for a specific organization (e.g. members with specific role)\n         */\n        this.subfilter = null;\n    }\n}\n__decorate([\n    field({ decoder: new EnumDecoder(EmailRecipientFilterType) })\n], EmailRecipientSubfilter.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: StamhoofdFilterDecoder, nullable: true })\n], EmailRecipientSubfilter.prototype, \"filter\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], EmailRecipientSubfilter.prototype, \"search\", void 0);\n__decorate([\n    field({ decoder: StamhoofdFilterDecoder, nullable: true, version: 346 })\n], EmailRecipientSubfilter.prototype, \"subfilter\", void 0);\nexport class EmailRecipientFilter extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.filters = [];\n        this.groupByEmail = false;\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(EmailRecipientSubfilter) })\n], EmailRecipientFilter.prototype, \"filters\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], EmailRecipientFilter.prototype, \"groupByEmail\", void 0);\nexport class Email extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.recipientFilter = EmailRecipientFilter.create({});\n        this.subject = null;\n        this.status = EmailStatus.Draft;\n        this.recipientsStatus = EmailRecipientsStatus.NotCreated;\n        this.json = {};\n        this.text = null;\n        this.html = null;\n        this.fromAddress = null;\n        this.fromName = null;\n        this.recipientCount = null;\n        this.attachments = [];\n        this.sentAt = null;\n        this.createdAt = new Date();\n        this.updatedAt = new Date();\n    }\n    getTemplateType() {\n        for (const filter of this.recipientFilter.filters) {\n            const d = EmailTemplate.getSavedForRecipient(filter.type);\n            if (d) {\n                return d;\n            }\n        }\n        return null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], Email.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: EmailRecipientFilter })\n], Email.prototype, \"recipientFilter\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], Email.prototype, \"subject\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(EmailStatus) })\n], Email.prototype, \"status\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(EmailRecipientsStatus) })\n], Email.prototype, \"recipientsStatus\", void 0);\n__decorate([\n    field({ decoder: AnyDecoder })\n], Email.prototype, \"json\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], Email.prototype, \"text\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], Email.prototype, \"html\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], Email.prototype, \"fromAddress\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], Email.prototype, \"fromName\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], Email.prototype, \"recipientCount\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(EmailAttachment) })\n], Email.prototype, \"attachments\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], Email.prototype, \"sentAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], Email.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], Email.prototype, \"updatedAt\", void 0);\nexport class EmailRecipient extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.emailId = '';\n        this.objectId = null;\n        this.emailType = null;\n        this.firstName = null;\n        this.lastName = null;\n        this.replacements = [];\n        this.failErrorMessage = null;\n        this.failCount = 0;\n        this.firstFailedAt = null;\n        this.lastFailedAt = null;\n        this.sentAt = null;\n        this.createdAt = new Date();\n        this.updatedAt = new Date();\n    }\n    getDefaultReplacements() {\n        return Recipient.create(this).getDefaultReplacements();\n    }\n    getReplacements(organization, platform) {\n        return [\n            ...this.replacements,\n            ...this.getDefaultReplacements(),\n            ...(organization ? organization.meta.getEmailReplacements(organization) : []),\n            ...platform.config.getEmailReplacements(platform),\n        ];\n    }\n    getRecipient() {\n        return Recipient.create({\n            ...this,\n        });\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], EmailRecipient.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EmailRecipient.prototype, \"emailId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 355 })\n], EmailRecipient.prototype, \"objectId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 355 })\n], EmailRecipient.prototype, \"emailType\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], EmailRecipient.prototype, \"firstName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], EmailRecipient.prototype, \"lastName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EmailRecipient.prototype, \"email\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Replacement) })\n], EmailRecipient.prototype, \"replacements\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], EmailRecipient.prototype, \"failErrorMessage\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], EmailRecipient.prototype, \"failCount\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], EmailRecipient.prototype, \"firstFailedAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], EmailRecipient.prototype, \"lastFailedAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], EmailRecipient.prototype, \"sentAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], EmailRecipient.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], EmailRecipient.prototype, \"updatedAt\", void 0);\nexport class EmailPreview extends Email {\n    constructor() {\n        super(...arguments);\n        this.exampleRecipient = null;\n        /**\n         * @deprecated\n         */\n        this.smartVariables = [];\n        /**\n         * @deprecated\n         */\n        this.smartButtons = [];\n        // todo: count stats\n        // todo: bounce / spam stats\n    }\n}\n__decorate([\n    field({ decoder: EmailRecipient, nullable: true })\n], EmailPreview.prototype, \"exampleRecipient\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(EditorSmartVariable), optional: true })\n], EmailPreview.prototype, \"smartVariables\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(EditorSmartButton), optional: true })\n], EmailPreview.prototype, \"smartButtons\", void 0);\n//# sourceMappingURL=Email.js.map","import { Formatter } from '@stamhoofd/utility';\nexport class CartStockHelper {\n    static getProductStock({ oldItem, cart, product, admin, amount }) {\n        if (product.remainingStock === null) {\n            return null;\n        }\n        const inCart = cart.items.reduce((prev, item) => {\n            if (item.id === (oldItem === null || oldItem === void 0 ? void 0 : oldItem.id)) {\n                return prev;\n            }\n            if (item.product.id !== product.id) {\n                return prev;\n            }\n            return prev + item.amount;\n        }, 0);\n        const reserved = cart.items.reduce((prev, item) => {\n            if (item.product.id !== product.id) {\n                return prev;\n            }\n            return prev + item.reservedAmount;\n        }, 0);\n        const remainingStock = product.remainingStock + reserved;\n        const remaining = Math.max(0, remainingStock - inCart);\n        let more = '';\n        if (inCart > 0) {\n            more = `, waarvan er al ${inCart} in jouw winkelmandje ${inCart === 1 ? 'zit' : 'zitten'}`;\n        }\n        const text = `Er ${remainingStock === 1 ? 'is' : 'zijn'} nog maar ${product.getRemainingStockText(remainingStock)} beschikbaar${more}`;\n        return {\n            stock: remainingStock,\n            remaining: admin ? null : remaining,\n            text: remainingStock === 0 ? `${Formatter.capitalizeFirstLetter(product.name)} is uitverkocht` : (remaining < 25 || (amount && remaining <= amount) ? text : null),\n        };\n    }\n    static getPriceStock({ productPrice, oldItem, cart, product, admin, amount }) {\n        if (productPrice.remainingStock === null) {\n            return null;\n        }\n        const inCart = cart.items.reduce((prev, item) => {\n            if (item.id === (oldItem === null || oldItem === void 0 ? void 0 : oldItem.id)) {\n                return prev;\n            }\n            if (item.product.id !== product.id) {\n                return prev;\n            }\n            if (item.productPrice.id !== productPrice.id) {\n                return prev;\n            }\n            return prev + item.amount;\n        }, 0);\n        const reserved = cart.items.reduce((prev, item) => {\n            if (item.product.id !== product.id) {\n                return prev;\n            }\n            if (item.productPrice.id !== productPrice.id) {\n                return prev;\n            }\n            return prev + item.reservedAmount;\n        }, 0);\n        const remainingStock = productPrice.remainingStock + reserved;\n        const remaining = Math.max(0, remainingStock - inCart);\n        let more = '';\n        if (inCart > 0) {\n            more = `, waarvan er al ${inCart} in jouw winkelmandje ${inCart === 1 ? 'zit' : 'zitten'}`;\n        }\n        const text = `Er ${remainingStock === 1 ? 'is' : 'zijn'} nog maar ${product.getRemainingStockText(remainingStock)} van ${productPrice.name} beschikbaar${more}`;\n        return {\n            stock: remainingStock,\n            remaining: admin ? null : remaining,\n            text: remainingStock === 0 ? `${Formatter.capitalizeFirstLetter(productPrice.name)} is uitverkocht` : (remaining < 25 || (amount && remaining <= amount) ? text : null),\n            shortText: remainingStock === 0 ? 'Uitverkocht' : (remaining === 0 ? 'Maximum bereikt' : (remaining < 25 ? `Nog ${product.getRemainingStockText(remaining)}` : null)),\n        };\n    }\n    static getOptionStock({ option, oldItem, cart, product, admin, amount }) {\n        if (option.remainingStock === null) {\n            return null;\n        }\n        function hasOption(item) {\n            return item.options.some(o => o.option.id === option.id);\n        }\n        const inCart = cart.items.reduce((prev, item) => {\n            if (item.id === (oldItem === null || oldItem === void 0 ? void 0 : oldItem.id)) {\n                return prev;\n            }\n            if (item.product.id !== product.id) {\n                return prev;\n            }\n            if (!hasOption(item)) {\n                return prev;\n            }\n            return prev + item.amount;\n        }, 0);\n        const reserved = cart.items.reduce((prev, item) => {\n            if (item.product.id !== product.id) {\n                return prev;\n            }\n            if (!hasOption(item)) {\n                return prev;\n            }\n            return prev + item.reservedAmount;\n        }, 0);\n        const remainingStock = option.remainingStock + reserved;\n        const remaining = Math.max(0, remainingStock - inCart);\n        let more = '';\n        if (inCart > 0) {\n            more = `, waarvan er al ${inCart} in jouw winkelmandje ${inCart === 1 ? 'zit' : 'zitten'}`;\n        }\n        const text = `Er ${remainingStock === 1 ? 'is' : 'zijn'} nog maar ${product.getRemainingStockText(remainingStock)} van ${option.name} beschikbaar${more}`;\n        return {\n            stock: remainingStock,\n            remaining: admin ? null : remaining,\n            text: remainingStock === 0 ? `${Formatter.capitalizeFirstLetter(option.name)} is uitverkocht` : (remaining < 25 || (amount && remaining <= amount) ? text : null),\n            shortText: remainingStock === 0 ? 'Uitverkocht' : (remaining === 0 ? 'Maximum bereikt' : (remaining < 25 ? `Nog ${product.getRemainingStockText(remaining)}` : null)),\n        };\n    }\n    static getSeatsStock({ oldItem, cart, product, webshop, admin, amount }) {\n        const remainingSeats = product.getRemainingSeats(webshop, admin);\n        if (remainingSeats === null) {\n            return null;\n        }\n        const inCart = cart.items.reduce((prev, item) => {\n            if (item.id === (oldItem === null || oldItem === void 0 ? void 0 : oldItem.id)) {\n                return prev;\n            }\n            if (item.product.id !== product.id) {\n                return prev;\n            }\n            return prev + item.seats.length;\n        }, 0);\n        const reserved = cart.items.reduce((prev, item) => {\n            if (item.product.id !== product.id) {\n                return prev;\n            }\n            return prev + item.reservedSeats.length;\n        }, 0);\n        const remainingStock = remainingSeats + reserved;\n        const remaining = Math.max(0, remainingStock - inCart);\n        let more = '';\n        if (inCart > 0) {\n            more = `, waarvan er al ${inCart} in jouw winkelmandje ${inCart === 1 ? 'zit' : 'zitten'}`;\n        }\n        const text = `Er ${remainingStock === 1 ? 'is' : 'zijn'} nog maar ${Formatter.pluralText(remainingStock, 'plaats', 'plaatsen')} beschikbaar${more}`;\n        return {\n            stock: remainingStock,\n            remaining,\n            text: remainingStock === 0 ? 'Er zijn geen plaatsen meer beschikbaar' : (remaining < 25 || (amount && remaining <= amount) ? text : null),\n        };\n    }\n    static getOrderMaximum({ amount, oldItem, cart, product, admin }) {\n        if (product.maxPerOrder === null) {\n            return null;\n        }\n        if (admin) {\n            return null;\n        }\n        const inCart = cart.items.reduce((prev, item) => {\n            if (item.id === (oldItem === null || oldItem === void 0 ? void 0 : oldItem.id)) {\n                return prev;\n            }\n            if (item.product.id !== product.id) {\n                return prev;\n            }\n            return prev + item.amount;\n        }, 0);\n        let more = '';\n        if (inCart > 0) {\n            more = `, waarvan er al ${inCart} in jouw winkelmandje ${inCart === 1 ? 'zit' : 'zitten'}`;\n        }\n        const remaining = product.maxPerOrder - inCart;\n        const show = (amount === undefined || (remaining <= amount));\n        return {\n            stock: product.maxPerOrder,\n            remaining: product.maxPerOrder - inCart,\n            text: !show ? null : ('Je kan maximaal ' + product.getRemainingStockText(product.maxPerOrder) + ' bestellen' + more),\n        };\n    }\n    static getAllowMultiple({ amount, oldItem, cart, product, admin }) {\n        if (product.allowMultiple) {\n            return null;\n        }\n        const inCart = cart.items.reduce((prev, item) => {\n            if (item.id === (oldItem === null || oldItem === void 0 ? void 0 : oldItem.id)) {\n                return prev;\n            }\n            if (item.product.id !== product.id) {\n                return prev;\n            }\n            if (item.code !== (oldItem === null || oldItem === void 0 ? void 0 : oldItem.code)) {\n                return prev;\n            }\n            return prev + item.amount;\n        }, 0);\n        if (inCart > 0) {\n            return {\n                stock: 1,\n                remaining: 0,\n                text: 'Je kan maximaal 1 van dit product bestellen',\n                shortText: 'Maximum bereikt',\n            };\n        }\n        return {\n            stock: 1,\n            remaining: 1,\n            text: null,\n        };\n    }\n    static getFixedStockDefinitions(data, options = {}) {\n        const definitions = [];\n        // General product amount\n        const productStock = CartStockHelper.getProductStock(data);\n        if (productStock) {\n            definitions.push(productStock);\n        }\n        // Seats stock\n        const seatsStock = CartStockHelper.getSeatsStock(data);\n        if (seatsStock) {\n            definitions.push(seatsStock);\n        }\n        // Maximum per order\n        if (!options.excludeOrder) {\n            const orderMaximum = CartStockHelper.getOrderMaximum(data);\n            if (orderMaximum) {\n                definitions.push(orderMaximum);\n            }\n            const allowMultiple = CartStockHelper.getAllowMultiple(data);\n            if (allowMultiple) {\n                definitions.push(allowMultiple);\n            }\n        }\n        return definitions;\n    }\n    /**\n     * Return all the stock definitions for this cart item with the currently selected options\n     * = calculate how much you can order with these options\n     */\n    static getAvailableStock(data) {\n        const definitions = this.getFixedStockDefinitions(data);\n        const priceStock = CartStockHelper.getPriceStock(data);\n        if (priceStock) {\n            definitions.push(priceStock);\n        }\n        for (const option of data.options) {\n            const optionStock = CartStockHelper.getOptionStock({ ...data, option: option.option });\n            if (optionStock) {\n                definitions.push(optionStock);\n            }\n        }\n        return definitions;\n    }\n    static getRemainingAcrossOptions(data, options = {}) {\n        let remaining = this.getRemaining(this.getFixedStockDefinitions(data, options));\n        // We sum the amount of product price stock remaining\n        // We can for example order 5 medium + 10 large, so total stock is 15 remaining\n        let maximumPriceStock = 0;\n        for (const productPrice of data.product.filteredPrices({ admin: data.admin })) {\n            const priceStock = CartStockHelper.getPriceStock({ ...data, productPrice });\n            if (priceStock && priceStock.remaining !== null) {\n                if (options.inMultipleCartItems) {\n                    maximumPriceStock += priceStock.remaining;\n                }\n                else {\n                    if (priceStock.remaining > maximumPriceStock) {\n                        maximumPriceStock = priceStock.remaining;\n                    }\n                }\n            }\n            else {\n                // Infinite price stock\n                maximumPriceStock = null;\n                break;\n            }\n        }\n        if (maximumPriceStock !== null) {\n            if (remaining === null) {\n                remaining = maximumPriceStock;\n            }\n            else {\n                remaining = Math.min(remaining, maximumPriceStock);\n            }\n        }\n        // Options\n        for (const optionMenu of data.product.optionMenus) {\n            if (optionMenu.multipleChoice) {\n                // Not affecting maximum stock because choice is optional\n                continue;\n            }\n            let maximumOptionStock = 0;\n            for (const option of optionMenu.options) {\n                const optionStock = CartStockHelper.getOptionStock({ ...data, option });\n                if (optionStock && optionStock.remaining !== null) {\n                    if (options.inMultipleCartItems) {\n                        maximumOptionStock += optionStock.remaining;\n                    }\n                    else {\n                        if (optionStock.remaining > maximumOptionStock) {\n                            maximumOptionStock = optionStock.remaining;\n                        }\n                    }\n                }\n                else {\n                    // Infinite option stock\n                    maximumOptionStock = null;\n                    break;\n                }\n            }\n            if (maximumOptionStock !== null) {\n                if (remaining === null) {\n                    remaining = maximumOptionStock;\n                }\n                else {\n                    remaining = Math.min(remaining, maximumOptionStock);\n                }\n            }\n        }\n        return remaining;\n    }\n    static getRemaining(definitions) {\n        const minArr = definitions.map(s => s.remaining).filter(v => v !== null);\n        if (minArr.length === 0) {\n            return null;\n        }\n        return Math.min(...minArr);\n    }\n}\n//# sourceMappingURL=CartStockHelper.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, field, IntegerDecoder, MapDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { isSimpleError, isSimpleErrors, SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\nimport { Formatter } from '@stamhoofd/utility';\nimport { v4 as uuidv4 } from 'uuid';\nimport { CartReservedSeat, ReservedSeat } from '../SeatingPlan.js';\nimport { CartStockHelper } from './CartStockHelper.js';\nimport { ProductDiscountSettings } from './Discount.js';\nimport { Option, OptionMenu, Product, ProductPrice, ProductType } from './Product.js';\nimport { WebshopFieldAnswer } from './WebshopField.js';\nexport class CartItemPrice extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.price = 0;\n        this.fixedDiscount = 0;\n        this.percentageDiscount = 0;\n    }\n    get discountedPrice() {\n        let price = this.price;\n        price = Math.min(price, Math.max(0, Math.round(price * (10000 - this.percentageDiscount) / 10000))); // Min is required to support negative prices: prices should never increase after applyign discounts\n        price = Math.min(price, Math.max(0, price - this.fixedDiscount)); // Min is required to support negative prices: prices should never increase after applyign discounts\n        return price;\n    }\n}\n__decorate([\n    field({ decoder: IntegerDecoder })\n], CartItemPrice.prototype, \"price\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], CartItemPrice.prototype, \"fixedDiscount\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], CartItemPrice.prototype, \"percentageDiscount\", void 0);\nexport class CartItemOption extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: Option })\n], CartItemOption.prototype, \"option\", void 0);\n__decorate([\n    field({ decoder: OptionMenu })\n], CartItemOption.prototype, \"optionMenu\", void 0);\nexport class CartItem extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.options = [];\n        this.fieldAnswers = [];\n        this.seats = [];\n        this.amount = 1;\n        /**\n         * Discounts that are actually applied\n         */\n        this.discounts = [];\n        /**\n         * When an order is correctly placed, we store the reserved amount in the stock here.\n         * We need this to check the stock changes when an order is edited after placement.\n         */\n        this.reservedAmount = 0;\n        /**\n         * Holds a list of what we reserved a stock for (which produce prices and which options specifically so we don't reserve the same thing multiple times or revert when it wasn't reserved earlier)\n         */\n        this.reservedOptions = new Map();\n        /**\n         * Holds a list of what we reserved a stock for (which produce prices and which options specifically so we don't reserve the same thing multiple times or revert when it wasn't reserved earlier)\n         */\n        this.reservedPrices = new Map();\n        /**\n         * When the seats are successfully reserved, we store them here\n         * This makes editing seats possible because we know we can still use these seats even if they are blocked normally\n         */\n        this.reservedSeats = [];\n        /**\n         * @deprecated\n         * Saved unitPrice (migration needed)\n         */\n        this.unitPrice = null;\n        /**\n         * Detailed list of prices\n         */\n        this.calculatedPrices = [];\n        /**\n         * Show an error in the cart for recovery\n         */\n        this.cartError = null;\n    }\n    /**\n     * @deprecated\n     */\n    get price() {\n        return this.unitPrice ? (this.unitPrice * this.amount) : null;\n    }\n    getReservedAmountPrice(priceId) {\n        return this.reservedPrices.get(priceId) || 0;\n    }\n    getReservedAmountOption(optionId) {\n        return this.reservedOptions.get(optionId) || 0;\n    }\n    static createDefault(product, cart, webshop, data) {\n        // Return the first that still has stock or the first if none has stock\n        const options = [];\n        // Fill in all default options here\n        for (const optionMenu of product.optionMenus) {\n            if (optionMenu.multipleChoice) {\n                continue;\n            }\n            let cartItemOption = null;\n            // Add first option with remaining stock\n            for (const option of optionMenu.options) {\n                const stock = CartStockHelper.getOptionStock({ product, option, oldItem: null, cart, webshop, admin: data.admin });\n                if (!stock || stock.remaining === null || stock.remaining > 0) {\n                    cartItemOption = CartItemOption.create({\n                        option,\n                        optionMenu,\n                    });\n                    break;\n                }\n            }\n            // Add (default if no stock for all)\n            options.push(cartItemOption !== null && cartItemOption !== void 0 ? cartItemOption : CartItemOption.create({\n                option: optionMenu.options[0],\n                optionMenu,\n            }));\n        }\n        const prices = product.filteredPrices(data);\n        let chosenPrice = null;\n        for (const productPrice of prices) {\n            const stock = CartStockHelper.getPriceStock({ product, productPrice, oldItem: null, cart, webshop, admin: data.admin });\n            if (!stock || stock.remaining === null || stock.remaining > 0) {\n                chosenPrice = productPrice;\n                break;\n            }\n        }\n        // Default\n        return CartItem.create({\n            product: product,\n            productPrice: chosenPrice !== null && chosenPrice !== void 0 ? chosenPrice : product.filteredPrices(data)[0],\n            options,\n        });\n    }\n    static create(object) {\n        const c = super.create(object);\n        // Fill in all default options here\n        for (const optionMenu of c.product.optionMenus) {\n            if (optionMenu.multipleChoice) {\n                continue;\n            }\n            if (c.options.find(o => o.optionMenu.id === optionMenu.id)) {\n                continue;\n            }\n            c.options.push(CartItemOption.create({\n                option: optionMenu.options[0],\n                optionMenu: optionMenu,\n            }));\n        }\n        return c;\n    }\n    /**\n     * Unique identifier to check if two cart items are the same\n     */\n    get code() {\n        return this.codeWithoutFields + '.' + this.fieldAnswers.map(a => a.field.id + '-' + Formatter.slug(a.answer)).join('.');\n    }\n    get codeWithoutFields() {\n        return this.product.id + '.' + this.productPrice.id + '.' + this.options.map(o => o.option.id).join('.');\n    }\n    /**\n     * Return total amount of same product in the given cart. Always includes the current item, even when it isn't in the cart. Doesn't count it twice\n     */\n    getTotalAmount(cart) {\n        return cart.items.reduce((c, item) => {\n            if (item.product.id !== this.product.id) {\n                return c;\n            }\n            if (item.id === this.id) {\n                return c;\n            }\n            return c + item.amount;\n        }, 0) + this.amount;\n    }\n    /**\n     * Note: this resets any discounts that are applied to the cart item\n     */\n    calculatePrices(cart) {\n        const prices = [];\n        const unitPrice = this.calculateUnitPrice(cart);\n        for (const seat of this.seats) {\n            const seatPrice = unitPrice + seat.price;\n            prices.push(CartItemPrice.create({\n                price: seatPrice,\n            }));\n        }\n        // Others (non seats)\n        const remaining = this.amount - this.seats.length;\n        if (remaining > 0) {\n            for (let index = 0; index < remaining; index++) {\n                prices.push(CartItemPrice.create({\n                    price: unitPrice,\n                }));\n            }\n        }\n        this.calculatedPrices = prices;\n    }\n    calculateUnitPrice(cart) {\n        const amount = this.getTotalAmount(cart);\n        let price = this.productPrice.price;\n        if (this.productPrice.discountPrice !== null && amount >= this.productPrice.discountAmount) {\n            price = this.productPrice.discountPrice;\n        }\n        for (const option of this.options) {\n            price += option.option.price;\n        }\n        if (this.productPrice.price >= 0) {\n            this.unitPrice = Math.max(0, price);\n        }\n        else {\n            // Allow negative\n            this.unitPrice = price;\n        }\n        return this.unitPrice;\n    }\n    /**\n     * @deprecated\n     * Use this method if you need temporary prices in case it is not yet calculated\n     */\n    getUnitPrice(cart) {\n        if (this.unitPrice) {\n            return this.unitPrice;\n        }\n        return this.calculateUnitPrice(cart);\n    }\n    getPriceWithDiscounts() {\n        return this.calculatedPrices.reduce((a, b) => a + b.discountedPrice, 0);\n    }\n    getPriceWithoutDiscounts() {\n        return this.calculatedPrices.reduce((a, b) => a + b.price, 0);\n    }\n    /**\n     * @deprecated: use other systems\n     * Prices that are only applicable to some amount, but not all (e.g. seat extra prices)\n     */\n    getPartialExtraPrice(cart) {\n        const unitPrice = this.getUnitPrice(cart);\n        const expectedPrice = unitPrice * this.amount;\n        const actualPrice = this.getPriceWithoutDiscounts();\n        return actualPrice - expectedPrice;\n    }\n    /**\n     * @deprecated use getPriceWithDiscounts instead for clarity\n     */\n    getPrice() {\n        return this.getPriceWithDiscounts();\n    }\n    getUnitPriceCombinationsWithoutDiscount() {\n        const priceCombinations = new Map();\n        for (const calculatedPrice of this.calculatedPrices) {\n            const price = calculatedPrice.price;\n            priceCombinations.set(price, (priceCombinations.get(price) || 0) + 1);\n        }\n        return priceCombinations;\n    }\n    getUnitPriceCombinationsWithDiscount() {\n        const priceCombinations = new Map();\n        for (const calculatedPrice of this.calculatedPrices) {\n            const price = calculatedPrice.discountedPrice;\n            priceCombinations.set(price, (priceCombinations.get(price) || 0) + 1);\n        }\n        return priceCombinations;\n    }\n    get formattedAmount() {\n        if (!this.product.allowMultiple) {\n            return '';\n        }\n        return Formatter.integer(this.amount);\n    }\n    /**\n     * Without discounts\n     */\n    getFormattedPriceWithoutDiscount() {\n        // Group by seats\n        const priceCombinations = this.getUnitPriceCombinationsWithoutDiscount();\n        return this.priceCombinationToString(priceCombinations);\n    }\n    getFormattedPriceWithDiscount() {\n        const price = this.getPriceWithDiscounts();\n        if (price === this.getPriceWithoutDiscounts()) {\n            return null;\n        }\n        const priceCombinations = this.getUnitPriceCombinationsWithDiscount();\n        return this.priceCombinationToString(priceCombinations);\n    }\n    getDiffName() {\n        return this.product.name;\n    }\n    getDiffValue() {\n        return this.formattedAmount + 'x ' + this.description;\n    }\n    priceCombinationToString(priceCombinations) {\n        // Sort by price\n        const sorted = [...priceCombinations.entries()].map(([price, amount]) => ({ price, amount })).sort((a, b) => b.price - a.price);\n        // Format\n        const parts = [];\n        for (const { price, amount } of sorted) {\n            if (parts.length > 0 || price < 0) {\n                if (price >= 0) {\n                    parts.push('+');\n                }\n                else {\n                    parts.push('-');\n                }\n            }\n            if (!this.product.allowMultiple && amount === 1) {\n                parts.push(Formatter.price(Math.abs(price)));\n                continue;\n            }\n            if (price === 0) {\n                if (sorted.length === 1) {\n                    parts.push('Gratis');\n                }\n                else {\n                    parts.push(amount + ' gratis');\n                }\n            }\n            else {\n                if (sorted.length === 1 || amount === 1) {\n                    if (amount > 1) {\n                        parts.push(Formatter.price(Math.abs(price)) + ' / stuk');\n                    }\n                    else {\n                        parts.push(Formatter.price(Math.abs(price)));\n                    }\n                }\n                else {\n                    parts.push(amount + ' × ' + Formatter.price(Math.abs(price)));\n                }\n            }\n        }\n        return parts.join(' ');\n    }\n    /**\n     * Used for statistics\n     */\n    get descriptionWithoutFields() {\n        const descriptions = [];\n        if (this.product.prices.length > 1) {\n            descriptions.push(this.productPrice.name);\n        }\n        for (const option of this.options) {\n            descriptions.push(option.option.name);\n        }\n        if ((this.product.type === ProductType.Ticket || this.product.type === ProductType.Voucher) && this.product.dateRange) {\n            descriptions.unshift(Formatter.capitalizeFirstLetter(this.product.dateRange.toString()));\n        }\n        return descriptions.filter(d => !!d).join('\\n');\n    }\n    get descriptionWithoutDate() {\n        const descriptions = [];\n        if (this.product.prices.length > 1) {\n            descriptions.push(this.productPrice.name);\n        }\n        for (const option of this.options) {\n            descriptions.push(option.option.name);\n        }\n        for (const a of this.fieldAnswers) {\n            if (!a.answer) {\n                continue;\n            }\n            descriptions.push(a.field.name + ': ' + a.answer);\n        }\n        return descriptions.filter(d => !!d).join('\\n');\n    }\n    get description() {\n        const descriptions = [this.descriptionWithoutDate];\n        if ((this.product.type === ProductType.Ticket || this.product.type === ProductType.Voucher) && this.product.dateRange) {\n            descriptions.unshift(Formatter.capitalizeFirstLetter(this.product.dateRange.toString()));\n        }\n        if (this.seats.length) {\n            descriptions.push((this.seats.length === 1 ? 'Plaats' : 'Plaatsen') + ': '\n                + this.seats.slice().sort(ReservedSeat.sort).map(s => s.getShortName(this.product)).join(', '));\n        }\n        return descriptions.filter(d => !!d).join('\\n');\n    }\n    validateAnswers() {\n        const newAnswers = [];\n        for (const field of this.product.customFields) {\n            const answer = this.fieldAnswers.find(a => a.field.id === field.id);\n            try {\n                if (!answer) {\n                    const a = WebshopFieldAnswer.create({ field, answer: '' });\n                    a.validate();\n                    newAnswers.push(a);\n                }\n                else {\n                    answer.field = field;\n                    answer.validate();\n                    newAnswers.push(answer);\n                }\n            }\n            catch (e) {\n                if (isSimpleError(e) || isSimpleErrors(e)) {\n                    e.addNamespace('fieldAnswers.' + field.id);\n                }\n                throw e;\n            }\n        }\n        this.fieldAnswers = newAnswers;\n    }\n    /**\n     * Update self to the newest available data, and throw error if something failed (only after refreshing other ones)\n     */\n    refresh(webshop) {\n        const errors = new SimpleErrors();\n        const product = webshop.products.find(p => p.id === this.product.id);\n        if (!product) {\n            errors.addError(new SimpleError({\n                code: 'product_unavailable',\n                message: 'Product unavailable',\n                human: this.product.name + ' is niet meer beschikbaar',\n            }));\n        }\n        else {\n            this.product = product;\n            const productPrice = product.prices.find(p => p.id === this.productPrice.id);\n            if (!productPrice) {\n                if ((this.productPrice.name.length === 0 || this.product.prices.length <= 1) && product.prices.length > 1) {\n                    errors.addError(new SimpleError({\n                        code: 'product_price_unavailable',\n                        message: 'Product price unavailable',\n                        human: 'Er werden keuzemogelijkheden toegevoegd aan ' + this.product.name + ', waar je nu eerst moet uit kiezen.',\n                    }));\n                }\n                else {\n                    errors.addError(new SimpleError({\n                        code: 'product_price_unavailable',\n                        message: 'Product price unavailable',\n                        human: \"De keuzemogelijkheid '\" + this.productPrice.name + \"' van \" + this.product.name + ' is niet meer beschikbaar. Kies een andere.',\n                    }));\n                }\n            }\n            else {\n                // Only set product if we did find our product price\n                this.productPrice = productPrice;\n            }\n            // Check all options\n            const remainingMenus = this.product.optionMenus.slice();\n            for (const o of this.options) {\n                let index = remainingMenus.findIndex(m => m.id === o.optionMenu.id);\n                if (index === -1) {\n                    // Check if it has a multiple choice one\n                    index = this.product.optionMenus.findIndex(m => m.id === o.optionMenu.id);\n                    errors.addError(new SimpleError({\n                        code: 'option_menu_unavailable',\n                        message: 'Option menu unavailable',\n                        human: 'Eén of meerdere keuzemogelijkheden van ' + this.product.name + ' zijn niet meer beschikbaar',\n                    }));\n                    continue;\n                }\n                const menu = remainingMenus[index];\n                if (!menu.multipleChoice) {\n                    // Already used: not possible to add another\n                    remainingMenus.splice(index, 1);\n                }\n                const option = menu.options.find(m => m.id === o.option.id);\n                if (!option) {\n                    errors.addError(new SimpleError({\n                        code: 'option_unavailable',\n                        message: 'Option unavailable',\n                        human: 'Eén of meerdere keuzemogelijkheden van ' + this.product.name + ' zijn niet meer beschikbaar',\n                    }));\n                    continue;\n                }\n                // Update to latest data\n                o.optionMenu = menu;\n                o.option = option;\n            }\n            if (remainingMenus.filter(m => !m.multipleChoice).length > 0) {\n                errors.addError(new SimpleError({\n                    code: 'missing_menu',\n                    message: \"Missing menu's \" + remainingMenus.filter(m => !m.multipleChoice).map(m => m.name).join(', '),\n                    human: 'Er zijn nieuwe keuzemogelijkheden voor ' + this.product.name + ' waaruit je moet kiezen',\n                }));\n            }\n        }\n        try {\n            this.validateAnswers();\n        }\n        catch (e) {\n            if (isSimpleError(e) || isSimpleErrors(e)) {\n                errors.addError(e);\n            }\n            else {\n                throw e;\n            }\n        }\n        errors.throwIfNotEmpty();\n    }\n    getFixedStockDefinitions(oldItem, cart, webshop, admin) {\n        return CartStockHelper.getFixedStockDefinitions({ oldItem, cart, product: this.product, webshop, admin, amount: this.amount });\n    }\n    /**\n     * Return all the stock definitions for this cart item with the currently selected options\n     * = calculate how much you can order with these options\n     */\n    getAvailableStock(oldItem, cart, webshop, admin) {\n        return CartStockHelper.getAvailableStock({ oldItem, cart, product: this.product, webshop, admin, amount: this.amount, productPrice: this.productPrice, options: this.options });\n    }\n    getMaximumRemaining(oldItem, cart, webshop, admin) {\n        return CartStockHelper.getRemaining(this.getAvailableStock(oldItem, cart, webshop, admin));\n    }\n    /**\n     * Update self to the newest available data and throw if it was not able to recover\n     */\n    validate(webshop, cart, { refresh, admin, validateSeats } = { refresh: true, admin: false, validateSeats: true }) {\n        this.cartError = null;\n        if (admin === undefined) {\n            admin = false;\n        }\n        if (refresh === undefined) {\n            refresh = true;\n        }\n        if (validateSeats === undefined) {\n            validateSeats = true;\n        }\n        if (refresh) {\n            this.refresh(webshop);\n        }\n        const product = this.product;\n        if (!product.allowMultiple) {\n            this.amount = 1;\n        }\n        // Check stock\n        if (!admin) {\n            if (!product.isEnabled && this.amount > this.reservedAmount) {\n                throw new SimpleError({\n                    code: 'product_unavailable',\n                    message: 'Product unavailable',\n                    human: this.product.name + ' is niet meer beschikbaar',\n                });\n            }\n            if (this.productPrice.hidden) {\n                throw new SimpleError({\n                    code: 'product_price_unavailable',\n                    message: 'Product price unavailable',\n                    human: this.productPrice.name + ' is niet meer beschikbaar',\n                });\n            }\n            if (product.isSoldOut && this.amount > this.reservedAmount) {\n                throw new SimpleError({\n                    code: 'product_unavailable',\n                    message: 'Product unavailable',\n                    human: this.product.name + ' is uitverkocht',\n                });\n            }\n            const remaining = this.getAvailableStock(this, cart, webshop, admin);\n            const minimumRemaining = CartStockHelper.getRemaining(remaining);\n            if (minimumRemaining !== null && minimumRemaining < this.amount) {\n                // Search for appropriate message in stock definitions\n                const stockDefinition = remaining.find(r => r.remaining === minimumRemaining);\n                throw new SimpleError({\n                    code: 'product_unavailable',\n                    message: 'Product unavailable',\n                    human: (stockDefinition === null || stockDefinition === void 0 ? void 0 : stockDefinition.text) || 'Er zijn nog maar ' + minimumRemaining + ' stuks beschikbaar van ' + this.product.name,\n                    meta: { recoverable: minimumRemaining > 0 },\n                });\n            }\n        }\n        if (this.product.seatingPlanId && validateSeats) {\n            const seatingPlan = webshop.meta.seatingPlans.find(s => s.id === this.product.seatingPlanId);\n            if (!seatingPlan) {\n                throw new SimpleError({\n                    code: 'seating_plan_unavailable',\n                    message: 'Invalid seating plan',\n                    human: 'Het zaalplan van ' + this.product.name + ' is niet meer beschikbaar. Herlaad de pagina en probeer opnieuw. Neem contact met ons op als het probleem zich herhaalt.',\n                });\n            }\n            // Check seats taken already?\n            const reservedSeats = this.product.reservedSeats;\n            // Remove invalid seats\n            const invalidSeats = this.seats.filter((s) => {\n                const valid = seatingPlan.isValidSeat(s, reservedSeats, this.reservedSeats);\n                if (valid) {\n                    return false;\n                }\n                else {\n                    if (!admin && seatingPlan.isAdminSeat(s)) {\n                        return false;\n                    }\n                    return true;\n                }\n            });\n            if (invalidSeats.length) {\n                throw new SimpleError({\n                    code: 'seats_unavailable',\n                    message: 'Seats unavailable',\n                    human: 'De volgende plaatsen zijn niet meer beschikbaar: ' + invalidSeats.map(s => s.getNameString(webshop, this.product)).join(', '),\n                    meta: { recoverable: true },\n                });\n            }\n            // Seating validation\n            if (this.seats.length !== this.amount) {\n                if (this.seats.length > this.amount) {\n                    // We need to handle this, because this can be caused by a stock limit\n                    throw new SimpleError({\n                        code: 'invalid_seats',\n                        message: 'Invalid seats',\n                        human: `Kies ${Formatter.pluralText(this.amount, 'plaats', 'plaatsen')}`,\n                        meta: { recoverable: true },\n                    });\n                }\n                throw new SimpleError({\n                    code: 'invalid_seats',\n                    message: 'Invalid seats',\n                    human: `Kies nog ${Formatter.pluralText(this.amount - this.seats.length, 'plaats', 'plaatsen')}`,\n                    meta: { recoverable: true },\n                });\n            }\n            // Check other cart items have same seats\n            const otherItems = cart.items.filter(i => i.product.id === this.product.id && i.id !== this.id);\n            for (const item of otherItems) {\n                for (const seat of item.seats) {\n                    if (this.seats.find(s => s.equals(seat))) {\n                        throw new SimpleError({\n                            code: 'seats_unavailable',\n                            message: 'Seats unavailable',\n                            human: 'De volgende plaatsen heb je twee keer gekozen: ' + seat.getNameString(webshop, this.product),\n                        });\n                    }\n                }\n            }\n            // Adjust seats automatically if enabled\n            if (seatingPlan.requireOptimalReservation && !admin) {\n                const otherSeats = cart.items.filter(i => i.product.id === this.product.id && i.id !== this.id).flatMap(i => i.seats);\n                const adjusted = seatingPlan.adjustSeatsForBetterFit(this.seats, [...reservedSeats, ...otherSeats], this.reservedSeats);\n                if (adjusted) {\n                    this.seats = adjusted.map(a => CartReservedSeat.create(a));\n                }\n                // Edge case: if seats are not optimal across multiple items, we can't fix it\n                const adjusted2 = seatingPlan.adjustSeatsForBetterFit([...this.seats, ...otherSeats], reservedSeats, this.reservedSeats);\n                if (adjusted2) {\n                    // Not able to correct this across multiple items\n                    throw new SimpleError({\n                        code: 'select_connected_seats',\n                        message: 'Select connected seats',\n                        human: 'Pas de plaatsen aan zodat ze aansluiten en geen enkele plaatsen openlaten.',\n                        meta: { recoverable: true },\n                    });\n                }\n            }\n            // Update prices\n            for (const seat of this.seats) {\n                seat.calculatePrice(seatingPlan);\n            }\n        }\n        // Update prices\n        // should now happen in the checkout so discounts are in sync\n        // this.calculateUnitPrice(cart)\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4(), version: 106, upgrade: function () {\n            // Warning: this id will always be too long for storage in a normal database record.\n            // But that is not a problem, since only new orders will use tickets that need this field\n            return this.code;\n        } })\n], CartItem.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: Product })\n], CartItem.prototype, \"product\", void 0);\n__decorate([\n    field({ decoder: ProductPrice })\n], CartItem.prototype, \"productPrice\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(CartItemOption) })\n], CartItem.prototype, \"options\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(WebshopFieldAnswer), version: 94 })\n], CartItem.prototype, \"fieldAnswers\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(CartReservedSeat), version: 212 })\n], CartItem.prototype, \"seats\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], CartItem.prototype, \"amount\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(ProductDiscountSettings), version: 237, optional: true })\n], CartItem.prototype, \"discounts\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 115 })\n], CartItem.prototype, \"reservedAmount\", void 0);\n__decorate([\n    field({ decoder: new MapDecoder(StringDecoder, IntegerDecoder), version: 224 })\n], CartItem.prototype, \"reservedOptions\", void 0);\n__decorate([\n    field({ decoder: new MapDecoder(StringDecoder, IntegerDecoder), version: 224 })\n], CartItem.prototype, \"reservedPrices\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(CartReservedSeat), version: 213 })\n], CartItem.prototype, \"reservedSeats\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 107 })\n], CartItem.prototype, \"unitPrice\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(CartItemPrice), version: 236, upgrade: function () {\n            var _a;\n            const prices = [];\n            const unitPrice = (_a = this.unitPrice) !== null && _a !== void 0 ? _a : 0;\n            for (const seat of this.seats) {\n                const seatPrice = unitPrice + seat.price;\n                prices.push(CartItemPrice.create({\n                    price: seatPrice,\n                }));\n            }\n            // Others (non seats)\n            const remaining = this.amount - this.seats.length;\n            if (remaining > 0) {\n                for (let index = 0; index < remaining; index++) {\n                    prices.push(CartItemPrice.create({\n                        price: unitPrice,\n                    }));\n                }\n            }\n            return prices;\n        } })\n], CartItem.prototype, \"calculatedPrices\", void 0);\n//# sourceMappingURL=CartItem.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, field } from '@simonbackx/simple-encoding';\nimport { isSimpleError, isSimpleErrors, SimpleErrors } from '@simonbackx/simple-errors';\nimport { ProductType } from './Product.js';\nimport { CartItem } from './CartItem.js';\nexport class Cart extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.items = [];\n    }\n    clear() {\n        this.items = [];\n    }\n    addItem(item, allowMerge = true) {\n        if (item.amount === 0) {\n            return;\n        }\n        const c = item.code;\n        for (const i of this.items) {\n            if (i.code === c && allowMerge) {\n                i.amount += item.amount;\n                i.seats.push(...item.seats);\n                return;\n            }\n        }\n        this.items.push(item);\n    }\n    removeItem(item) {\n        const c = item.code;\n        for (const [index, i] of this.items.entries()) {\n            if (i.code === c) {\n                this.items.splice(index, 1);\n                return;\n            }\n        }\n    }\n    replaceItem(old, item) {\n        // First check if code is already used\n        const c = item.code;\n        const oldCode = old.code;\n        for (const i of this.items) {\n            if (i.code === c && i.code !== oldCode) {\n                i.amount += item.amount;\n                i.seats.push(...item.seats);\n                this.removeItem(old);\n                return;\n            }\n        }\n        for (const [index, i] of this.items.entries()) {\n            if (i.code === oldCode) {\n                this.items.splice(index, 1, item);\n                return;\n            }\n        }\n        if (item.amount === 0) {\n            return;\n        }\n        this.removeItem(old);\n        this.addItem(item);\n    }\n    /**\n     * @deprecated\n     * Be careful when to use the price with and without discounts\n     */\n    get price() {\n        return this.priceWithDiscounts;\n    }\n    get priceWithDiscounts() {\n        return Math.max(0, this.items.reduce((c, item) => c + item.getPriceWithDiscounts(), 0));\n    }\n    get priceWithoutDiscounts() {\n        return Math.max(0, this.items.reduce((c, item) => c + item.getPriceWithoutDiscounts(), 0));\n    }\n    get count() {\n        return this.items.reduce((c, item) => c + item.amount, 0);\n    }\n    get persons() {\n        return this.items.reduce((sum, item) => sum + (item.product.type === ProductType.Person ? item.amount : 0), 0);\n    }\n    /**\n     * Refresh all items with the newest data, throw if something failed (at the end)\n     */\n    refresh(webshop) {\n        const errors = new SimpleErrors();\n        for (const item of this.items) {\n            try {\n                item.refresh(webshop);\n            }\n            catch (e) {\n                if (isSimpleError(e) || isSimpleErrors(e)) {\n                    errors.addError(e);\n                }\n                else {\n                    throw e;\n                }\n            }\n        }\n        errors.throwIfNotEmpty();\n    }\n    validate(webshop, asAdmin = false) {\n        var _a;\n        const newItems = [];\n        const errors = new SimpleErrors();\n        for (const item of this.items) {\n            try {\n                item.validate(webshop, this, {\n                    refresh: true,\n                    admin: asAdmin,\n                });\n                newItems.push(item);\n                if (!webshop.meta.cartEnabled) {\n                    break;\n                }\n            }\n            catch (e) {\n                if (isSimpleError(e) || isSimpleErrors(e)) {\n                    e.addNamespace('cart');\n                    errors.addError(e);\n                }\n                else {\n                    throw e;\n                }\n                if (isSimpleError(e) && ((_a = e.meta) === null || _a === void 0 ? void 0 : _a.recoverable)) {\n                    item.cartError = e;\n                    newItems.push(item);\n                    if (!webshop.meta.cartEnabled) {\n                        break;\n                    }\n                }\n            }\n        }\n        this.items = newItems;\n        errors.throwIfNotEmpty();\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(CartItem) })\n], Cart.prototype, \"items\", void 0);\n//# sourceMappingURL=Cart.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nexport class Customer extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.firstName = '';\n        this.lastName = '';\n        this.email = '';\n        this.phone = '';\n    }\n    get name() {\n        if (this.lastName === '') {\n            return this.firstName;\n        }\n        if (this.firstName === '') {\n            return this.lastName;\n        }\n        return this.firstName + ' ' + this.lastName;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], Customer.prototype, \"firstName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Customer.prototype, \"lastName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Customer.prototype, \"email\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Customer.prototype, \"phone\", void 0);\n//# sourceMappingURL=Customer.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, field, StringDecoder, ArrayDecoder, IntegerDecoder, BooleanDecoder, DateDecoder } from '@simonbackx/simple-encoding';\nimport { Discount } from './Discount.js';\nimport { v4 as uuidv4 } from 'uuid';\nexport class DiscountCode extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.description = '';\n        this.discounts = [];\n        this.usageCount = 0;\n        this.maximumUsage = null;\n        /**\n         * When an order is correctly placed, we store the reserved amount in the stock here.\n         * We need this to check the stock changes when an order is edited after placement.\n         */\n        this.reserved = false;\n        this.createdAt = new Date();\n        this.updatedAt = new Date();\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], DiscountCode.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], DiscountCode.prototype, \"code\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 241 })\n], DiscountCode.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Discount) })\n], DiscountCode.prototype, \"discounts\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], DiscountCode.prototype, \"usageCount\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], DiscountCode.prototype, \"maximumUsage\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], DiscountCode.prototype, \"reserved\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, version: 240 })\n], DiscountCode.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, version: 240 })\n], DiscountCode.prototype, \"updatedAt\", void 0);\n//# sourceMappingURL=DiscountCode.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, EnumDecoder, field, IntegerDecoder, MapDecoder, NumberDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { isSimpleError, isSimpleErrors, SimpleError } from '@simonbackx/simple-errors';\nimport { Formatter } from '@stamhoofd/utility';\nimport { ValidatedAddress } from '../addresses/Address.js';\nimport { RecordAnswerDecoder } from '../members/records/RecordAnswer.js';\nimport { RecordCategory } from '../members/records/RecordCategory.js';\nimport { PaymentMethod } from '../PaymentMethod.js';\nimport { Cart } from './Cart.js';\nimport { Customer } from './Customer.js';\nimport { Discount } from './Discount.js';\nimport { DiscountCode } from './DiscountCode.js';\nimport { WebshopFieldAnswer } from './WebshopField.js';\nimport { AnyCheckoutMethodDecoder, CheckoutMethodType, WebshopDeliveryMethod, WebshopTimeSlot } from './WebshopMetaData.js';\nimport { compileToInMemoryFilter } from '../filters/InMemoryFilter.js';\nimport { checkoutInMemoryFilterCompilers } from '../filters/inMemoryFilterDefinitions.js';\nexport class Checkout extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.timeSlot = null;\n        this.checkoutMethod = null;\n        /**\n         * Only needed for delivery\n         */\n        this.address = null;\n        this.customer = Customer.create({});\n        this.fieldAnswers = [];\n        this.recordAnswers = new Map();\n        this.cart = Cart.create({});\n        this.paymentMethod = null;\n        this.administrationFee = 0;\n        this.discounts = [];\n        this.discountCodes = [];\n        /**\n         * Applied fixed discount (not applicable to a specific cart item)\n         */\n        this.fixedDiscount = 0;\n        /**\n         * Applied percentage discount (not applicable to a specific cart item)\n         * in pertenthousand\n         */\n        this.percentageDiscount = 0;\n        /**\n         * Number of persons we did reserve in webshop time slots (and maybe future other maximums)\n         */\n        this.reservedPersons = 0;\n        /**\n         * Whether we reserved order stock in webshop time slots (and maybe future other maximums)\n         */\n        this.reservedOrder = false;\n    }\n    get paymentContext() {\n        var _a, _b;\n        if (((_a = this.checkoutMethod) === null || _a === void 0 ? void 0 : _a.type) === CheckoutMethodType.Takeout) {\n            return 'takeout';\n        }\n        if (((_b = this.checkoutMethod) === null || _b === void 0 ? void 0 : _b.type) === CheckoutMethodType.Delivery) {\n            return 'delivery';\n        }\n        return null;\n    }\n    get deliveryPrice() {\n        if (!this.checkoutMethod || this.checkoutMethod.type !== CheckoutMethodType.Delivery) {\n            return 0;\n        }\n        if (!(this.checkoutMethod instanceof WebshopDeliveryMethod)) {\n            // will throw in validation\n            return 0;\n        }\n        if (this.checkoutMethod.price.minimumPrice !== null && this.cart.price >= this.checkoutMethod.price.minimumPrice) {\n            return this.checkoutMethod.price.discountPrice;\n        }\n        return this.checkoutMethod.price.price;\n    }\n    get appliedPercentageDiscount() {\n        return Math.round(this.cart.price * this.percentageDiscount / 10000);\n    }\n    get totalPrice() {\n        // Percentage discount\n        // + this.administrationFee;\n        return Math.max(0, this.cart.price - this.appliedPercentageDiscount - this.fixedDiscount) + this.deliveryPrice + this.administrationFee;\n    }\n    get amount() {\n        return this.cart.items.reduce((acc, item) => acc + item.amount, 0);\n    }\n    get priceBreakown() {\n        const all = [\n            {\n                name: Formatter.percentage(this.percentageDiscount) + ' korting',\n                price: -this.appliedPercentageDiscount,\n            },\n            {\n                name: 'Korting',\n                price: -this.fixedDiscount,\n            },\n            {\n                name: 'Leveringskost',\n                price: this.deliveryPrice,\n            },\n            {\n                name: 'Administratiekost',\n                price: this.administrationFee,\n            },\n        ].filter(a => a.price !== 0);\n        if (all.length > 0) {\n            all.unshift({\n                name: 'Subtotaal',\n                price: this.cart.priceWithDiscounts,\n            });\n        }\n        return [\n            ...all,\n            {\n                name: 'Totaal',\n                price: this.totalPrice,\n            },\n        ];\n    }\n    get totalPriceWithoutAdministrationFee() {\n        return this.totalPrice - this.administrationFee;\n    }\n    doesMatchFilter(filter) {\n        try {\n            const compiledFilter = compileToInMemoryFilter(filter, checkoutInMemoryFilterCompilers);\n            return compiledFilter(this);\n        }\n        catch (e) {\n            console.error('Error while compiling filter', e, filter);\n        }\n        return false;\n    }\n    isRecordEnabled(_record) {\n        return true;\n    }\n    getRecordAnswers() {\n        return this.recordAnswers;\n    }\n    patchRecordAnswers(patch) {\n        return this.patch({\n            recordAnswers: patch,\n        });\n    }\n    validateAnswers(webshop) {\n        const newAnswers = [];\n        for (const field of webshop.meta.customFields) {\n            const answer = this.fieldAnswers.find(a => a.field.id === field.id);\n            try {\n                if (!answer) {\n                    const a = WebshopFieldAnswer.create({ field, answer: '' });\n                    a.validate();\n                    newAnswers.push(a);\n                }\n                else {\n                    answer.field = field;\n                    answer.validate();\n                    newAnswers.push(answer);\n                }\n            }\n            catch (e) {\n                if (isSimpleError(e) || isSimpleErrors(e)) {\n                    e.addNamespace('fieldAnswers.' + field.id);\n                }\n                throw e;\n            }\n        }\n        this.fieldAnswers = newAnswers;\n    }\n    validateCart(webshop, organizationMeta, asAdmin = false) {\n        if (this.cart.items.length === 0) {\n            throw new SimpleError({\n                code: 'cart_empty',\n                message: 'Cart is empty',\n                human: 'Jouw winkelmandje is leeg',\n                field: 'cart',\n            });\n        }\n        try {\n            this.cart.validate(webshop, asAdmin);\n        }\n        catch (e) {\n            if (isSimpleError(e) || isSimpleErrors(e)) {\n                e.addNamespace('cart');\n            }\n            // also update discounts on errors\n            this.updateDiscounts(webshop);\n            this.calculatePrices();\n            throw e;\n        }\n        this.updateDiscounts(webshop);\n        this.calculatePrices();\n        if (!asAdmin && webshop.meta.availableUntil && webshop.meta.availableUntil < new Date()) {\n            throw new SimpleError({\n                code: 'closed',\n                message: 'Orders are closed',\n                human: 'Helaas! Je bent te laat. De bestellingen zijn gesloten.',\n            });\n        }\n        if (!asAdmin && webshop.meta.openAt && webshop.meta.openAt > new Date()) {\n            throw new SimpleError({\n                code: 'closed',\n                message: 'Orders are closed',\n                human: 'Nog even geduld. Bestellen kan vanaf ' + Formatter.dateTime(webshop.meta.openAt) + '.',\n            });\n        }\n        if (!asAdmin && webshop.isClosed()) {\n            throw new SimpleError({\n                code: 'closed',\n                message: 'Orders are closed',\n                human: 'De webshop is gesloten. Je kan niet langer bestellen.',\n            });\n        }\n    }\n    validateCheckoutMethod(webshop, organizationMeta) {\n        if (this.checkoutMethod === null) {\n            if (webshop.meta.checkoutMethods.length > 0) {\n                throw new SimpleError({\n                    code: 'missing_checkout_method',\n                    message: 'Checkout method is required',\n                    human: 'Er zijn enkele instellingen gewijzigd terwijl je aan het bestellen was. Herlaad de pagina en probeer opnieuw.',\n                    field: 'checkoutMethod',\n                });\n            }\n            return;\n        }\n        const current = this.checkoutMethod;\n        const checkoutMethod = webshop.meta.checkoutMethods.find(m => m.id === current.id);\n        if (!checkoutMethod) {\n            if (webshop.meta.checkoutMethods.length === 0) {\n                this.checkoutMethod = null;\n                return;\n            }\n            throw new SimpleError({\n                code: 'invalid_checkout_method',\n                message: 'Checkout method is invalid',\n                human: 'Er zijn enkele instellingen gewijzigd terwijl je aan het bestellen was. Herlaad de pagina en probeer opnieuw.',\n                field: 'checkoutMethod',\n            });\n        }\n        this.checkoutMethod = checkoutMethod;\n    }\n    validateDeliveryAddress(webshop, organizationMeta) {\n        if (!this.checkoutMethod || this.checkoutMethod.type !== CheckoutMethodType.Delivery) {\n            this.address = null;\n            return;\n        }\n        if (!(this.checkoutMethod instanceof WebshopDeliveryMethod)) {\n            throw new SimpleError({\n                code: 'invalid_data_type',\n                message: 'Invalid data type',\n                human: 'Er ontbreekt data. Probeer het opnieuw of neem contact op met de webshop eigenaar om dit te melden.',\n                field: 'address',\n            });\n        }\n        if (!this.address) {\n            throw new SimpleError({\n                code: 'missing_address',\n                message: 'Checkout address is invalid',\n                human: 'Een leveringsadres is noodzakelijk, herlaad de pagina opnieuw en vul een leveringsadres in.',\n                field: 'address',\n            });\n        }\n        // Check country\n        if (this.checkoutMethod.countries.includes(this.address.country)) {\n            return;\n        }\n        if (this.checkoutMethod.provinces.map(p => p.id).includes(this.address.provinceId)) {\n            return;\n        }\n        if (this.checkoutMethod.cities.map(c => c.id).includes(this.address.cityId)) {\n            return;\n        }\n        if (this.address.parentCityId && this.checkoutMethod.cities.map(c => c.id).includes(this.address.parentCityId)) {\n            return;\n        }\n        throw new SimpleError({\n            code: 'region_not_supported',\n            message: 'Region not supported',\n            human: 'We leveren jammer genoeg niet op dit adres.',\n            field: 'address',\n        });\n    }\n    validateTimeSlot(_webshop, _organizationMeta) {\n        if (!this.checkoutMethod || this.checkoutMethod.timeSlots.timeSlots.length === 0) {\n            this.timeSlot = null;\n            return;\n        }\n        if (!this.timeSlot) {\n            throw new SimpleError({\n                code: 'missing_timeslot',\n                message: 'Checkout timeslot is missings',\n                human: 'Kies een tijdstip, herlaad de pagina opnieuw en maak een keuze.',\n                field: 'timeSlot',\n            });\n        }\n        const current = this.timeSlot;\n        const timeSlot = this.checkoutMethod.timeSlots.timeSlots.find(s => s.id === current.id);\n        const availableTimeslots = this.checkoutMethod.timeSlots.timeSlots.length;\n        if (!timeSlot) {\n            throw new SimpleError({\n                code: 'invalid_timeslot',\n                message: 'Checkout timeslot is invalid',\n                human: 'Het afhaaltijdstip dat je had gekozen werd gewijzigd terwijl je aan het bestellen was, kies een nieuw tijdstip.',\n                field: 'timeSlot',\n            });\n        }\n        // Check maximum\n        if (!this.reservedOrder && timeSlot.remainingOrders === 0) {\n            throw new SimpleError({\n                code: 'timeslot_full',\n                message: 'Timeslot has reached maximum orders',\n                human: (availableTimeslots !== 1 ? 'Het gekozen tijdstip is helaas volzet. Kies een ander tijdstip indien mogelijk.' : 'Het evenement is helaas volzet. We aanvaarden geen verdere bestellingen.'),\n                field: 'timeSlot',\n            });\n        }\n        // Check maximum\n        if (timeSlot.remainingPersons !== null && this.cart.persons - this.reservedPersons > timeSlot.remainingPersons) {\n            const remainingPersons = timeSlot.remainingPersons;\n            if (remainingPersons === 0) {\n                throw new SimpleError({\n                    code: 'timeslot_full',\n                    message: 'Timeslot has reached maximum orders',\n                    human: (availableTimeslots !== 1 ? 'Het gekozen tijdstip is helaas volzet. Kies een ander tijdstip indien mogelijk.' : 'Het evenement is helaas volzet. We aanvaarden geen verdere bestellingen.'),\n                    field: 'timeSlot',\n                });\n            }\n            throw new SimpleError({\n                code: 'timeslot_full',\n                message: 'Timeslot has reached maximum persons',\n                human: 'Er ' + (remainingPersons !== 1 ? 'zijn' : 'is') + ' nog maar ' + remainingPersons + ' ' + (remainingPersons !== 1 ? 'plaatsen' : 'plaats') + ' vrij ' + (availableTimeslots !== 1 ? 'op het gekozen tijdstip' : 'voor dit evenement') + '. Jouw mandje is voor ' + this.cart.persons + ' ' + (this.cart.persons !== 1 ? 'personen' : 'persoon') + (availableTimeslots !== 1 ? '. Kies een ander tijdstip indien mogelijk.' : ''),\n                field: 'timeSlot',\n            });\n        }\n        this.timeSlot = timeSlot;\n    }\n    validateCustomer(webshop, organizationMeta, i18n, asAdmin = false, user = null) {\n        if (user) {\n            if (user.firstName) {\n                this.customer.firstName = user.firstName;\n            }\n            if (user.lastName) {\n                this.customer.lastName = user.lastName;\n            }\n            this.customer.email = user.email;\n        }\n        if (this.customer.firstName.length < 2) {\n            throw new SimpleError({\n                code: 'invalid_first_name',\n                message: 'Invalid first name',\n                human: 'De voornaam die je hebt opgegeven is ongeldig, corrigeer het voor je verder gaat.',\n                field: 'customer.firstName',\n            });\n        }\n        if (this.customer.lastName.length < 2) {\n            throw new SimpleError({\n                code: 'invalid_last_name',\n                message: 'Invalid last name',\n                human: 'De achternaam die je hebt opgegeven is ongeldig, corrigeer het voor je verder gaat.',\n                field: 'customer.lastName',\n            });\n        }\n        if (webshop.meta.phoneEnabled) {\n            if (this.customer.phone.length < 6 && !asAdmin) {\n                throw new SimpleError({\n                    code: 'invalid_phone',\n                    message: 'Invalid phone',\n                    human: i18n.t('shared.inputs.mobile.invalidMessage'),\n                    field: 'customer.phone',\n                });\n            }\n        }\n        else {\n            this.customer.phone = '';\n        }\n        const regex = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n        if (!regex.test(this.customer.email)) {\n            throw new SimpleError({\n                code: 'invalid_email',\n                message: 'Invalid email',\n                human: 'Het e-mailadres dat je hebt opgegeven is ongeldig, corrigeer het voor je verder gaat.',\n                field: 'customer.email',\n            });\n        }\n        this.validateAnswers(webshop);\n    }\n    validatePayment(webshop, organizationMeta) {\n        if (!this.paymentMethod) {\n            throw new SimpleError({\n                code: 'missing_payment_method',\n                message: 'Missing payment method',\n                human: 'Kies een betaalmethode',\n                field: 'paymentMethod',\n            });\n        }\n        if (!webshop.meta.paymentMethods.includes(this.paymentMethod)) {\n            throw new SimpleError({\n                code: 'invalid_payment_method',\n                message: 'Invalid payment method',\n                human: 'Deze betaalmethode is niet meer beschikbaar. Herlaad eventueel de pagina en probeer opnieuw.',\n                field: 'paymentMethod',\n            });\n        }\n    }\n    validateRecordAnswersFor(webshop, category) {\n        RecordCategory.validate([category], this);\n    }\n    validateRecordAnswers(webshop) {\n        RecordCategory.validate(webshop.meta.recordCategories, this);\n    }\n    updateAdministrationFee(webshop) {\n        this.administrationFee = webshop.meta.paymentConfiguration.administrationFee.calculate(this.totalPriceWithoutAdministrationFee);\n    }\n    updateDiscounts(webshop) {\n        this.discounts = webshop.meta.defaultDiscounts.slice();\n        this.discounts.push(...this.discountCodes.flatMap(c => c.discounts));\n    }\n    calculatePrices() {\n        // Group discounts by discounts that can get applied together with other discounts\n        // for now: everything can get combined\n        const discountOrders = [this.discounts];\n        for (const discounts of discountOrders) {\n            this.fixedDiscount = 0;\n            this.percentageDiscount = 0;\n            for (const item of this.cart.items) {\n                item.discounts = [];\n                // Reset all discounts on this item\n                item.calculatePrices(this.cart);\n            }\n            const trackers = [];\n            for (const discount of discounts) {\n                trackers.push(...discount.applyToCheckout(this));\n            }\n            // Loop trackers and apply the one with the current highest potential\n            while (true) {\n                let bestPotential = null;\n                for (const tracker of trackers) {\n                    const potential = tracker.getPotentialDiscount();\n                    if (potential !== 0 && (bestPotential === null || potential > bestPotential.potential)) {\n                        bestPotential = { tracker, potential };\n                    }\n                }\n                if (bestPotential) {\n                    bestPotential.tracker.apply();\n                }\n                else {\n                    break;\n                }\n            }\n        }\n    }\n    update(webshop) {\n        this.updateDiscounts(webshop);\n        this.calculatePrices();\n        this.updateAdministrationFee(webshop);\n    }\n    validate(webshop, organizationMeta, i18n, asAdmin = false, user = null) {\n        try {\n            this.validateCart(webshop, organizationMeta, asAdmin);\n            this.validateCheckoutMethod(webshop, organizationMeta);\n            this.validateDeliveryAddress(webshop, organizationMeta);\n            this.validateTimeSlot(webshop, organizationMeta);\n            this.validateCustomer(webshop, organizationMeta, i18n, asAdmin, user);\n            this.validateRecordAnswers(webshop);\n            if (this.totalPrice !== 0 && !asAdmin) {\n                this.validatePayment(webshop, organizationMeta);\n            }\n            else if (this.totalPrice === 0) {\n                this.paymentMethod = PaymentMethod.Unknown;\n            }\n        }\n        finally {\n            this.update(webshop);\n        }\n    }\n    /**\n     * Convenience mapper\n     */\n    get deliveryMethod() {\n        if (!this.checkoutMethod || this.checkoutMethod.type !== CheckoutMethodType.Delivery) {\n            return null;\n        }\n        if (!(this.checkoutMethod instanceof WebshopDeliveryMethod)) {\n            // will throw in validation\n            return null;\n        }\n        return this.checkoutMethod;\n    }\n}\n__decorate([\n    field({ decoder: WebshopTimeSlot, nullable: true })\n], Checkout.prototype, \"timeSlot\", void 0);\n__decorate([\n    field({ decoder: AnyCheckoutMethodDecoder, nullable: true })\n], Checkout.prototype, \"checkoutMethod\", void 0);\n__decorate([\n    field({ decoder: ValidatedAddress, nullable: true })\n], Checkout.prototype, \"address\", void 0);\n__decorate([\n    field({ decoder: Customer, version: 40 })\n], Checkout.prototype, \"customer\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(WebshopFieldAnswer), version: 94 })\n], Checkout.prototype, \"fieldAnswers\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RecordAnswerDecoder), optional: true }),\n    field({\n        decoder: new MapDecoder(StringDecoder, RecordAnswerDecoder),\n        version: 252,\n        optional: true,\n        upgrade: (old) => {\n            const map = new Map();\n            for (const answer of old) {\n                map.set(answer.settings.id, answer);\n            }\n            return map;\n        },\n    })\n], Checkout.prototype, \"recordAnswers\", void 0);\n__decorate([\n    field({ decoder: Cart })\n], Checkout.prototype, \"cart\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(PaymentMethod), nullable: true })\n], Checkout.prototype, \"paymentMethod\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 207 })\n], Checkout.prototype, \"administrationFee\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Discount), version: 235 })\n], Checkout.prototype, \"discounts\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(DiscountCode), version: 239 })\n], Checkout.prototype, \"discountCodes\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 235 })\n], Checkout.prototype, \"fixedDiscount\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 235 })\n], Checkout.prototype, \"percentageDiscount\", void 0);\n__decorate([\n    field({ decoder: NumberDecoder, version: 143 })\n], Checkout.prototype, \"reservedPersons\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 143 })\n], Checkout.prototype, \"reservedOrder\", void 0);\n//# sourceMappingURL=Checkout.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, DateDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { Sorter } from '@stamhoofd/utility';\nimport { v4 as uuidv4 } from 'uuid';\nimport { CartReservedSeat } from '../SeatingPlan.js';\nimport { CartItem } from './CartItem.js';\nexport class Ticket extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.scannedAt = null;\n        this.createdAt = new Date();\n        this.updatedAt = new Date();\n        this.seat = null;\n        this.originalSeat = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], Ticket.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], Ticket.prototype, \"scannedAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], Ticket.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], Ticket.prototype, \"updatedAt\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Ticket.prototype, \"secret\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], Ticket.prototype, \"index\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], Ticket.prototype, \"total\", void 0);\n__decorate([\n    field({ decoder: CartReservedSeat, nullable: true, version: 216 })\n], Ticket.prototype, \"seat\", void 0);\n__decorate([\n    field({ decoder: CartReservedSeat, nullable: true, version: 216 })\n], Ticket.prototype, \"originalSeat\", void 0);\n/**\n * Ticket extended with the order data. This is\n * required because the user doesn't have access\n * to the order. So we need to add the relevant data\n * */\nexport class TicketPublic extends Ticket {\n    constructor() {\n        super(...arguments);\n        this.items = [];\n    }\n    get isSingle() {\n        return this.items.length === 1 && this.items[0].product.isTicket;\n    }\n    getPrice(order) {\n        var _a, _b, _c;\n        if (!this.isSingle) {\n            if (order) {\n                return order.data.totalPrice;\n            }\n            return Math.max(0, this.items.reduce((c, item) => { var _a; return c + ((_a = item.price) !== null && _a !== void 0 ? _a : 0); }, 0));\n        }\n        const item = this.items[0];\n        return ((_a = item.unitPrice) !== null && _a !== void 0 ? _a : 0) + ((_c = (_b = this.seat) === null || _b === void 0 ? void 0 : _b.price) !== null && _c !== void 0 ? _c : 0);\n    }\n    getTitle() {\n        if (!this.isSingle) {\n            return 'Ticket';\n        }\n        return this.items[0].product.name;\n    }\n    getChangedSeatString(webshop, isCustomer) {\n        if (!this.isSingle) {\n            return null;\n        }\n        const item = this.items[0];\n        if (!item || !item.product.seatingPlanId) {\n            return null;\n        }\n        if (!this.originalSeat) {\n            return null;\n        }\n        if (!this.seat) {\n            return null;\n        }\n        if (this.seat.equals(this.originalSeat)) {\n            return null;\n        }\n        const to = this.seat.getNameString(webshop, item.product);\n        const from = this.originalSeat.getNameString(webshop, item.product);\n        if (isCustomer) {\n            return 'Jouw zitplaats werd gewijzigd van ' + from + ' naar ' + to;\n        }\n        return 'Deze zitplaats werd gewijzigd van ' + from + ' naar ' + to;\n    }\n    getIndexDescriptionString(webshop) {\n        if (!this.isSingle) {\n            return '';\n        }\n        const description = this.getIndexDescription(webshop);\n        return description.map(d => d.title + ': ' + d.value).join('\\n');\n    }\n    getIndexDescription(webshop) {\n        if (!this.isSingle) {\n            return [];\n        }\n        const item = this.items[0];\n        if (!item || !item.product.seatingPlanId) {\n            return [];\n        }\n        const seat = this.seat;\n        if (seat) {\n            const r = seat.getName(webshop, item.product);\n            if (r.length > 0) {\n                return r;\n            }\n        }\n        return [\n            {\n                title: 'Plaats',\n                value: 'Onbekende plaats. Jouw toegekende plaats werd waarschijnlijk verwijderd. Neem contact met ons op om dit recht te zetten.',\n            },\n        ];\n    }\n    getSeatingPlanId() {\n        if (!this.isSingle) {\n            return null;\n        }\n        return this.items[0].product.seatingPlanId;\n    }\n    getIndexText() {\n        if (this.items.length !== 1) {\n            if (this.total > 1) {\n                return this.index + ' / ' + this.total;\n            }\n            return null;\n        }\n        const item = this.items[0];\n        const nameField = item.fieldAnswers.findIndex(a => a.field.name.toLowerCase().includes('naam'));\n        if (nameField !== -1) {\n            return item.fieldAnswers[nameField].answer;\n        }\n        if (this.total > 1) {\n            return this.index + ' / ' + this.total;\n        }\n        return null;\n    }\n    static sort(a, b) {\n        var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n        return Sorter.stack(Sorter.byNumberValue(a.items.length, b.items.length), Sorter.byStringValue((_c = (_b = (_a = a.items[0]) === null || _a === void 0 ? void 0 : _a.product) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : '', (_f = (_e = (_d = b.items[0]) === null || _d === void 0 ? void 0 : _d.product) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : ''), Sorter.byStringValue((_h = (_g = a.items[0]) === null || _g === void 0 ? void 0 : _g.id) !== null && _h !== void 0 ? _h : '', (_k = (_j = b.items[0]) === null || _j === void 0 ? void 0 : _j.id) !== null && _k !== void 0 ? _k : ''), // group same options and items\n        -1 * Sorter.byNumberValue(a.index, b.index));\n    }\n    get isValid() {\n        return this.items.length > 0;\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(CartItem) })\n], TicketPublic.prototype, \"items\", void 0);\n/**\n * Structure if you do have access to the order (needs proof first: be an admin or pass the order id along the request)\n */\nexport class TicketOrder extends Ticket {\n    constructor() {\n        super(...arguments);\n        /**\n         * itemId is private because access to the order is needed to be able to look it up.\n         */\n        this.itemId = null;\n    }\n    getPublic(order) {\n        if (this.itemId) {\n            const item = order.data.cart.items.find(i => i.id === this.itemId);\n            return TicketPublic.create({\n                ...this,\n                items: item ? [item] : [],\n            });\n        }\n        else {\n            return TicketPublic.create({\n                ...this,\n                items: order.data.cart.items,\n            });\n        }\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], TicketOrder.prototype, \"orderId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], TicketOrder.prototype, \"itemId\", void 0);\nexport class TicketPublicPrivate extends TicketPublic {\n    constructor() {\n        super(...arguments);\n        /**\n         * Private information\n         */\n        this.scannedBy = null;\n        this.deletedAt = null;\n    }\n    getPublic() {\n        return this;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], TicketPublicPrivate.prototype, \"scannedBy\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 229 })\n], TicketPublicPrivate.prototype, \"deletedAt\", void 0);\n/**\n * Structure if you do have access to the order (needs proof first: be an admin or pass the order id along the request)\n */\nexport class TicketPrivate extends TicketOrder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Private information\n         */\n        this.scannedBy = null;\n        this.deletedAt = null;\n    }\n    getPublic(order) {\n        return TicketPublicPrivate.create({\n            ...super.getPublic(order),\n            scannedBy: this.scannedBy,\n            deletedAt: this.deletedAt,\n        });\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], TicketPrivate.prototype, \"scannedBy\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 229 })\n], TicketPrivate.prototype, \"deletedAt\", void 0);\n//# sourceMappingURL=Ticket.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, DateDecoder, EnumDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { Formatter } from '@stamhoofd/utility';\nimport { BalanceItemWithPayments, BalanceItemWithPrivatePayments } from '../BalanceItem.js';\nimport { EmailRecipient } from '../email/Email.js';\nimport { Recipient, Replacement } from '../endpoints/EmailRequest.js';\nimport { Payment, PrivatePayment } from '../members/Payment.js';\nimport { downgradePaymentMethodV150, PaymentMethod, PaymentMethodHelper, PaymentMethodV150 } from '../PaymentMethod.js';\nimport { PaymentStatus } from '../PaymentStatus.js';\nimport { Checkout } from './Checkout.js';\nimport { Customer } from './Customer.js';\nimport { TicketPrivate } from './Ticket.js';\nimport { CheckoutMethodType } from './WebshopMetaData.js';\nimport { RecordCheckboxAnswer } from '../members/records/RecordAnswer.js';\nexport var OrderStatusV103;\n(function (OrderStatusV103) {\n    OrderStatusV103[\"Created\"] = \"Created\";\n    OrderStatusV103[\"Prepared\"] = \"Prepared\";\n    OrderStatusV103[\"Completed\"] = \"Completed\";\n    OrderStatusV103[\"Canceled\"] = \"Canceled\";\n})(OrderStatusV103 || (OrderStatusV103 = {}));\nexport var OrderStatusV137;\n(function (OrderStatusV137) {\n    OrderStatusV137[\"Created\"] = \"Created\";\n    OrderStatusV137[\"Prepared\"] = \"Prepared\";\n    OrderStatusV137[\"Collect\"] = \"Collect\";\n    OrderStatusV137[\"Completed\"] = \"Completed\";\n    OrderStatusV137[\"Canceled\"] = \"Canceled\";\n})(OrderStatusV137 || (OrderStatusV137 = {}));\nexport var OrderStatus;\n(function (OrderStatus) {\n    OrderStatus[\"Created\"] = \"Created\";\n    OrderStatus[\"Prepared\"] = \"Prepared\";\n    OrderStatus[\"Collect\"] = \"Collect\";\n    OrderStatus[\"Completed\"] = \"Completed\";\n    OrderStatus[\"Canceled\"] = \"Canceled\";\n    OrderStatus[\"Deleted\"] = \"Deleted\";\n})(OrderStatus || (OrderStatus = {}));\nexport class OrderStatusHelper {\n    static getName(status) {\n        switch (status) {\n            case OrderStatus.Created: return 'Nieuw';\n            case OrderStatus.Prepared: return 'Verwerkt';\n            case OrderStatus.Collect: return 'Ligt klaar';\n            case OrderStatus.Completed: return 'Voltooid';\n            case OrderStatus.Canceled: return 'Geannuleerd';\n            case OrderStatus.Deleted: return 'Verwijderd';\n        }\n    }\n    static getColor(status) {\n        switch (status) {\n            case OrderStatus.Completed: return 'success';\n            case OrderStatus.Prepared: return 'secundary';\n            case OrderStatus.Collect: return 'tertiary';\n            case OrderStatus.Canceled: return 'error';\n            case OrderStatus.Created: return 'info';\n        }\n        return 'error';\n    }\n}\nexport class OrderData extends Checkout {\n    constructor() {\n        super(...arguments);\n        this.consumerLanguage = 'nl';\n        this.comments = '';\n        // Payment method is required\n        this.paymentMethod = PaymentMethod.Unknown;\n    }\n    matchQuery(query) {\n        const lowerQuery = query.toLowerCase();\n        if (this.customer.firstName.toLowerCase().includes(lowerQuery)\n            || this.customer.lastName.toLowerCase().includes(lowerQuery)\n            || this.customer.name.toLowerCase().includes(lowerQuery)) {\n            return true;\n        }\n        // Search product names\n        for (const item of this.cart.items) {\n            if (item.product.name.toLowerCase().includes(lowerQuery)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    get shouldSendPaymentUpdates() {\n        return (!this.timeSlot || (this.timeSlot.date.getTime() + 1000 * 60 * 60 * 24) > new Date().getTime());\n    }\n    get locationName() {\n        var _a, _b, _c, _d;\n        if (((_a = this.checkoutMethod) === null || _a === void 0 ? void 0 : _a.type) === CheckoutMethodType.Takeout) {\n            return this.checkoutMethod.name;\n        }\n        if (((_b = this.checkoutMethod) === null || _b === void 0 ? void 0 : _b.type) === CheckoutMethodType.OnSite) {\n            return this.checkoutMethod.name;\n        }\n        return (_d = (_c = this.address) === null || _c === void 0 ? void 0 : _c.shortString()) !== null && _d !== void 0 ? _d : 'Onbekend';\n    }\n    /**\n     * Delete the personal data associated with an order when you delete an order.\n     * We still need the other data (e.g. to inform other clients about a deleted order)\n     * And also to match online payments and handle refunds if needed\n     */\n    removePersonalData() {\n        // Clear customer data\n        this.customer = Customer.create({});\n        // Clear free inputs\n        this.fieldAnswers = [];\n        for (const item of this.cart.items) {\n            item.fieldAnswers = [];\n        }\n        this.recordAnswers = new Map();\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, version: 129 })\n], OrderData.prototype, \"consumerLanguage\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 158 })\n], OrderData.prototype, \"comments\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(PaymentMethodV150) }),\n    field({\n        decoder: new EnumDecoder(PaymentMethod),\n        version: 151,\n        downgrade: downgradePaymentMethodV150,\n    })\n], OrderData.prototype, \"paymentMethod\", void 0);\nexport class Order extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.number = null;\n        this.data = OrderData.create({});\n        this.balanceItems = [];\n        /**\n         * @deprecated: replaced by balance items\n         */\n        this.payment = null;\n        this.createdAt = new Date();\n        this.updatedAt = new Date();\n        this.validAt = null;\n        this.status = OrderStatus.Created;\n    }\n    get shouldIncludeStock() {\n        return this.status !== OrderStatus.Canceled && this.status !== OrderStatus.Deleted;\n    }\n    get pricePaid() {\n        return this.balanceItems.reduce((total, item) => total + item.pricePaid, 0);\n    }\n    get totalToPay() {\n        if (this.status === OrderStatus.Canceled || this.status === OrderStatus.Deleted) {\n            return 0;\n        }\n        return this.data.totalPrice;\n    }\n    get openBalance() {\n        return this.totalToPay - this.pricePaid;\n    }\n    updatePricePaid() {\n        for (const item of this.balanceItems) {\n            item.updatePricePaid();\n        }\n    }\n    get payments() {\n        return this.balanceItems.flatMap(i => i.payments.map(p => p.payment)).filter(p => p.status !== PaymentStatus.Failed).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n    }\n    matchQuery(query) {\n        var _a;\n        if (this.number + '' === query) {\n            return true;\n        }\n        if ((_a = this.payment) === null || _a === void 0 ? void 0 : _a.matchQuery(query)) {\n            return true;\n        }\n        return this.data.matchQuery(query);\n    }\n    getHTMLTable() {\n        var _a, _b;\n        const allFree = this.data.cart.items.every(i => i.getPriceWithoutDiscounts() === 0);\n        if (allFree) {\n            let str = `<table width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" class=\"email-data-table\"><thead><tr><th>Artikel</th><th>Aantal</th></tr></thead><tbody>`;\n            for (const item of this.data.cart.items) {\n                str += `<tr><td><h4>${Formatter.escapeHtml(item.product.name)}</h4>${item.description.length > 0 ? '<p style=\"white-space: pre-wrap;\">' + Formatter.escapeHtml(item.description) + '</p>' : ''}</td><td>${Formatter.escapeHtml((_a = item.formattedAmount) !== null && _a !== void 0 ? _a : '1')}</td></tr>`;\n            }\n            return str + '</tbody></table>';\n        }\n        let str = `<table width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" class=\"email-data-table\"><thead><tr><th>Artikel</th><th>Aantal</th></tr></thead><tbody>`;\n        for (const item of this.data.cart.items) {\n            str += `<tr><td><h4>${Formatter.escapeHtml(item.product.name)}</h4>${item.description.length > 0 ? '<p style=\"white-space: pre-wrap;\">' + Formatter.escapeHtml(item.description) + '</p>' : ''}${'<p style=\"white-space: pre-wrap;\">' + Formatter.escapeHtml(item.getFormattedPriceWithDiscount() || item.getFormattedPriceWithoutDiscount()) + '</p>'}</td><td>${Formatter.escapeHtml((_b = item.formattedAmount) !== null && _b !== void 0 ? _b : '1')}</td></tr>`;\n        }\n        return str + '</tbody></table>';\n    }\n    getDetailsHTMLTable() {\n        var _a, _b, _c, _d, _e, _f, _g, _h;\n        let str = `<table width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" class=\"email-data-table\"><tbody>`;\n        const data = [\n            {\n                title: 'Bestelnummer',\n                value: '' + ((_a = this.number) !== null && _a !== void 0 ? _a : '?'),\n            },\n            {\n                title: ((order) => {\n                    var _a, _b;\n                    if (((_a = order.data.checkoutMethod) === null || _a === void 0 ? void 0 : _a.type) === CheckoutMethodType.Takeout) {\n                        return 'Afhaallocatie';\n                    }\n                    if (((_b = order.data.checkoutMethod) === null || _b === void 0 ? void 0 : _b.type) === CheckoutMethodType.OnSite) {\n                        return 'Locatie';\n                    }\n                    return 'Leveringsadres';\n                })(this),\n                value: ((order) => {\n                    var _a, _b, _c, _d;\n                    if (((_a = order.data.checkoutMethod) === null || _a === void 0 ? void 0 : _a.type) === CheckoutMethodType.Takeout) {\n                        return order.data.checkoutMethod.name;\n                    }\n                    if (((_b = order.data.checkoutMethod) === null || _b === void 0 ? void 0 : _b.type) === CheckoutMethodType.OnSite) {\n                        return order.data.checkoutMethod.name;\n                    }\n                    return (_d = (_c = order.data.address) === null || _c === void 0 ? void 0 : _c.shortString()) !== null && _d !== void 0 ? _d : '';\n                })(this),\n            },\n            ...((((_b = this.data.checkoutMethod) === null || _b === void 0 ? void 0 : _b.type) === CheckoutMethodType.Takeout || ((_c = this.data.checkoutMethod) === null || _c === void 0 ? void 0 : _c.type) === CheckoutMethodType.OnSite) && ((_d = this.data.checkoutMethod) === null || _d === void 0 ? void 0 : _d.address)\n                ? [\n                    {\n                        title: 'Adres',\n                        value: ((order) => {\n                            var _a, _b, _c;\n                            return (_c = (_b = (_a = order.data.checkoutMethod) === null || _a === void 0 ? void 0 : _a.address) === null || _b === void 0 ? void 0 : _b.shortString()) !== null && _c !== void 0 ? _c : '';\n                        })(this),\n                    },\n                ]\n                : []),\n            {\n                title: 'Datum',\n                value: Formatter.capitalizeFirstLetter((_f = (_e = this.data.timeSlot) === null || _e === void 0 ? void 0 : _e.dateString()) !== null && _f !== void 0 ? _f : ''),\n            },\n            {\n                title: 'Tijdstip',\n                value: (_h = (_g = this.data.timeSlot) === null || _g === void 0 ? void 0 : _g.timeRangeString()) !== null && _h !== void 0 ? _h : '',\n            },\n            {\n                title: 'Naam',\n                value: this.data.customer.name,\n            },\n            ...(this.data.customer.phone\n                ? [\n                    {\n                        title: 'GSM-nummer',\n                        value: this.data.customer.phone,\n                    },\n                ]\n                : []),\n            ...this.data.fieldAnswers.filter(a => a.answer).map(a => ({\n                title: a.field.name,\n                value: a.answer,\n            })),\n            ...[...this.data.recordAnswers.values()].filter(a => !a.isEmpty || a instanceof RecordCheckboxAnswer).map(a => ({\n                title: a.settings.name,\n                value: a.stringValue,\n            })),\n            ...((this.data.paymentMethod !== PaymentMethod.Unknown)\n                ? [\n                    {\n                        title: 'Betaalmethode',\n                        value: Formatter.capitalizeFirstLetter(PaymentMethodHelper.getName(this.data.paymentMethod)),\n                    },\n                ]\n                : []),\n            ...this.data.priceBreakown.map((p) => {\n                return {\n                    title: p.name,\n                    value: Formatter.price(p.price),\n                };\n            }),\n        ];\n        for (const replacement of data) {\n            if (replacement.value.length === 0) {\n                continue;\n            }\n            str += `<tr><td><h4>${Formatter.escapeHtml(replacement.title)}</h4></td><td>${Formatter.escapeHtml(replacement.value)}</td></tr>`;\n        }\n        return str + '</tbody></table>';\n    }\n    getEmailRecipient(organization, webshop) {\n        const customer = this.data.customer;\n        const email = customer.email.toLowerCase();\n        return EmailRecipient.create({\n            objectId: this.id,\n            firstName: customer.firstName,\n            lastName: customer.lastName,\n            email,\n            replacements: this.getRecipientReplacements(organization, webshop),\n        });\n    }\n    getRecipient(organization, webshop, payment) {\n        const order = this;\n        const email = order.data.customer.email.toLowerCase();\n        return Recipient.create({\n            firstName: order.data.customer.firstName,\n            lastName: order.data.customer.lastName,\n            email,\n            replacements: this.getRecipientReplacements(organization, webshop, payment ? [payment] : order.payments),\n        });\n    }\n    getRecipientReplacements(organization, webshop, payments = this.payments) {\n        var _a, _b, _c, _d, _e, _f, _g, _h;\n        const order = this;\n        const succeededTransfers = (_a = payments\n            .filter(p => p.status === PaymentStatus.Succeeded && p.method === PaymentMethod.Transfer)) !== null && _a !== void 0 ? _a : payments.filter(p => p.method === PaymentMethod.Transfer);\n        return [\n            Replacement.create({\n                token: 'orderUrl',\n                value: 'https://' + (webshop === null || webshop === void 0 ? void 0 : webshop.getUrl(organization)) + '/order/' + (order.id),\n            }),\n            Replacement.create({\n                token: 'nr',\n                value: ((_b = order.number) !== null && _b !== void 0 ? _b : '') + '',\n            }),\n            Replacement.create({\n                token: 'orderPrice',\n                value: Formatter.price(order.data.totalPrice),\n            }),\n            Replacement.create({\n                token: 'priceToPay',\n                value: order.openBalance <= 0 ? '' : Formatter.price(order.openBalance),\n            }),\n            Replacement.create({\n                token: 'paymentMethod',\n                value: order.data.paymentMethod,\n            }),\n            Replacement.create({\n                token: 'transferDescription',\n                value: succeededTransfers.map(p => p.transferDescription).join(', '),\n            }),\n            Replacement.create({\n                token: 'transferBankAccount',\n                value: succeededTransfers\n                    .map(p => { var _a, _b; return (_b = (_a = p.transferSettings) === null || _a === void 0 ? void 0 : _a.iban) !== null && _b !== void 0 ? _b : organization.meta.registrationPaymentConfiguration.transferSettings.iban; })\n                    .filter(iban => !!iban)\n                    .join(', '),\n            }),\n            Replacement.create({\n                token: 'transferBankCreditor',\n                value: succeededTransfers\n                    .map(p => { var _a, _b, _c; return (_c = (_b = (_a = p.transferSettings) === null || _a === void 0 ? void 0 : _a.creditor) !== null && _b !== void 0 ? _b : organization.meta.registrationPaymentConfiguration.transferSettings.creditor) !== null && _c !== void 0 ? _c : organization.name; })\n                    .join(', '),\n            }),\n            Replacement.create({\n                token: 'orderStatus',\n                value: OrderStatusHelper.getName(order.status),\n            }),\n            Replacement.create({\n                token: 'orderMethod',\n                value: (_d = (_c = order.data.checkoutMethod) === null || _c === void 0 ? void 0 : _c.typeName) !== null && _d !== void 0 ? _d : '',\n            }),\n            Replacement.create({\n                token: 'orderLocation',\n                value: order.data.locationName,\n            }),\n            Replacement.create({\n                token: 'orderDate',\n                value: (_f = (_e = order.data.timeSlot) === null || _e === void 0 ? void 0 : _e.dateString()) !== null && _f !== void 0 ? _f : '',\n            }),\n            Replacement.create({\n                token: 'orderTime',\n                value: (_h = (_g = order.data.timeSlot) === null || _g === void 0 ? void 0 : _g.timeRangeString()) !== null && _h !== void 0 ? _h : '',\n            }),\n            Replacement.create({\n                token: 'orderDetailsTable',\n                value: '',\n                html: order.getDetailsHTMLTable(),\n            }),\n            Replacement.create({\n                token: 'orderTable',\n                value: '',\n                html: order.getHTMLTable(),\n            }),\n            Replacement.create({\n                token: 'paymentTable',\n                value: '',\n                html: order.payments.map(p => p.getHTMLTable()).join(),\n            }),\n            Replacement.create({\n                token: 'organizationName',\n                value: organization.name,\n            }),\n            Replacement.create({\n                token: 'webshopName',\n                value: webshop.meta.name,\n            }),\n        ];\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], Order.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 140 })\n], Order.prototype, \"webshopId\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], Order.prototype, \"number\", void 0);\n__decorate([\n    field({ decoder: OrderData })\n], Order.prototype, \"data\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(BalanceItemWithPayments), version: 225 })\n], Order.prototype, \"balanceItems\", void 0);\n__decorate([\n    field({ decoder: Payment, nullable: true })\n], Order.prototype, \"payment\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], Order.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, version: 107 })\n], Order.prototype, \"updatedAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], Order.prototype, \"validAt\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(OrderStatusV103), version: 47 })\n    // Migrate newer order status .collect in case of older client\n    ,\n    field({\n        decoder: new EnumDecoder(OrderStatusV137),\n        version: 104,\n        upgrade: (old) => {\n            return old;\n        },\n        downgrade: (n) => {\n            if (n === OrderStatusV137.Collect) {\n                // Map to other status\n                return OrderStatusV103.Prepared;\n            }\n            return n;\n        },\n    }),\n    field({\n        decoder: new EnumDecoder(OrderStatus),\n        version: 138,\n        upgrade: (old) => {\n            return old;\n        },\n        downgrade: (n) => {\n            if (n === OrderStatus.Deleted) {\n                // Map to other status\n                return OrderStatusV137.Canceled;\n            }\n            return n;\n        },\n    })\n], Order.prototype, \"status\", void 0);\nexport class PrivateOrder extends Order {\n    constructor() {\n        super(...arguments);\n        /**\n         * @deprecated\n         */\n        this.payment = null;\n        this.balanceItems = [];\n    }\n    get payments() {\n        return this.balanceItems.flatMap(i => i.payments.map(p => p.payment)).filter(p => p.status !== PaymentStatus.Failed).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n    }\n}\n__decorate([\n    field({ decoder: PrivatePayment, nullable: true })\n], PrivateOrder.prototype, \"payment\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(BalanceItemWithPrivatePayments), nullable: true, version: 225 })\n], PrivateOrder.prototype, \"balanceItems\", void 0);\nexport class PrivateOrderWithTickets extends PrivateOrder {\n    constructor() {\n        super(...arguments);\n        this.tickets = [];\n    }\n    /**\n     * Adds or removes tickets as appropriate\n     */\n    addTickets(tickets) {\n        for (const ticket of tickets) {\n            if (ticket.orderId === this.id) {\n                if (ticket.deletedAt) {\n                    const existingIndex = this.tickets.findIndex(t => t.id === ticket.id);\n                    if (existingIndex !== -1) {\n                        this.tickets.splice(existingIndex, 1);\n                    }\n                }\n                else {\n                    const existing = this.tickets.find(t => t.id === ticket.id);\n                    if (existing) {\n                        existing.set(ticket);\n                    }\n                    else {\n                        this.tickets.push(ticket);\n                    }\n                }\n            }\n        }\n    }\n    addTicketPatches(patches) {\n        PrivateOrderWithTickets.addTicketPatches([this], patches);\n    }\n    static addTicketPatches(orders, patches) {\n        mainLoop: for (const patch of patches) {\n            for (const order of orders) {\n                for (const ticket of order.tickets) {\n                    if (ticket.id === patch.id) {\n                        ticket.set(ticket.patch(patch));\n                        continue mainLoop;\n                    }\n                }\n            }\n        }\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(TicketPrivate) })\n], PrivateOrderWithTickets.prototype, \"tickets\", void 0);\nexport class OrderResponse extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.paymentUrl = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], OrderResponse.prototype, \"paymentUrl\", void 0);\n__decorate([\n    field({ decoder: Order })\n], OrderResponse.prototype, \"order\", void 0);\n//# sourceMappingURL=Order.js.map","import { __decorate } from \"tslib\";\nimport { field } from '@simonbackx/simple-encoding';\nimport { Formatter } from '@stamhoofd/utility';\nimport { BalanceItem, BalanceItemPayment } from './BalanceItem.js';\nimport { RegistrationWithMember } from './members/RegistrationWithMember.js';\nimport { Order } from './webshops/Order.js';\n// Do we still need this?\nexport class BalanceItemDetailed extends BalanceItem {\n    constructor() {\n        super(...arguments);\n        this.registration = null;\n        this.order = null;\n    }\n}\n__decorate([\n    field({ decoder: RegistrationWithMember, nullable: true })\n], BalanceItemDetailed.prototype, \"registration\", void 0);\n__decorate([\n    field({ decoder: Order, nullable: true })\n], BalanceItemDetailed.prototype, \"order\", void 0);\nexport class BalanceItemPaymentDetailed extends BalanceItemPayment {\n    /**\n     * Note: this can be a float in case of partial payments\n     * Try to avoid using this in calculations, as this is not super reliable\n     *\n     * Always round when displaying!\n     */\n    get amount() {\n        if (this.unitPrice === 0) {\n            // Not possible to calculate amount\n            return this.balanceItem.amount;\n        }\n        return this.price / this.unitPrice;\n    }\n    get unitPrice() {\n        if (this.price < 0 && this.balanceItem.unitPrice > 0) {\n            return -this.balanceItem.unitPrice;\n        }\n        return this.balanceItem.unitPrice;\n    }\n    /**\n     * When displayed as a single item\n     */\n    get itemTitle() {\n        return this.balanceItem.itemTitle;\n    }\n    /**\n     * When displayed as a single item\n     */\n    get itemDescription() {\n        return this.balanceItem.itemDescription;\n    }\n    toString() {\n        return Formatter.float(this.amount) + 'x ' + this.itemTitle + (this.itemDescription ? ' (' + this.itemDescription + ')' : '');\n    }\n}\n__decorate([\n    field({ decoder: BalanceItem })\n], BalanceItemPaymentDetailed.prototype, \"balanceItem\", void 0);\n//# sourceMappingURL=BalanceItemDetailed.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { Formatter } from '@stamhoofd/utility';\nimport { BalanceItemRelationType } from '../BalanceItem.js';\nimport { BalanceItemPaymentDetailed } from '../BalanceItemDetailed.js';\nimport { BaseOrganization } from '../Organization.js';\nimport { Payment, Settlement } from './Payment.js';\nexport class PaymentGeneral extends Payment {\n    constructor() {\n        super(...arguments);\n        this.balanceItemPayments = [];\n        this.iban = null;\n        this.ibanName = null;\n        /**\n         * Only set for administrators with the correct permissions\n         */\n        this.settlement = null;\n        /**\n         * Only set for administrators with the correct permissions\n         */\n        this.transferFee = 0;\n        /**\n         * Only set for administrators with the correct permissions\n         */\n        this.stripeAccountId = null;\n        /**\n         * Only set for administrators with the correct permissions\n         */\n        this.payingOrganization = null;\n    }\n    get groupIds() {\n        const ids = this.balanceItemPayments.flatMap((p) => {\n            var _a;\n            const id = (_a = p.balanceItem.relations.get(BalanceItemRelationType.Group)) === null || _a === void 0 ? void 0 : _a.id;\n            return id ? [id] : [];\n        });\n        return Formatter.uniqueArray(ids);\n    }\n    get webshopIds() {\n        const ids = this.balanceItemPayments.flatMap((p) => {\n            var _a;\n            const id = (_a = p.balanceItem.relations.get(BalanceItemRelationType.Webshop)) === null || _a === void 0 ? void 0 : _a.id;\n            return id ? [id] : [];\n        });\n        return Formatter.uniqueArray(ids);\n    }\n    get memberNames() {\n        const ids = this.balanceItemPayments.flatMap((p) => {\n            var _a;\n            const id = (_a = p.balanceItem.relations.get(BalanceItemRelationType.Member)) === null || _a === void 0 ? void 0 : _a.name;\n            return id ? [id] : [];\n        });\n        return Formatter.joinLast(Formatter.uniqueArray(ids), ', ', ' en ');\n    }\n    getDetailsHTMLTable() {\n        let str = '';\n        str += `<table width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" class=\"email-data-table\"><thead><tr><th>Beschrijving</th><th>Prijs</th></tr></thead><tbody>`;\n        for (const balanceItemPayment of this.balanceItemPayments) {\n            str += `<tr><td><h4>${Formatter.escapeHtml(balanceItemPayment.balanceItem.description)}</h4></td><td>${Formatter.escapeHtml(Formatter.price(balanceItemPayment.price))}</td></tr>`;\n        }\n        return str + '</tbody></table>';\n    }\n    getShortDescription() {\n        const shortDescriptions = this.balanceItemPayments.filter(p => p.price !== 0).map(p => p.balanceItem.paymentShortDescription).filter(p => p !== null);\n        // Count the number of times each description occurs and add prefix if more than 1\n        const counts = {};\n        for (const shortDescription of shortDescriptions) {\n            counts[shortDescription] = (counts[shortDescription] || 0) + 1;\n        }\n        // Add prefix if more than 1\n        const arr = [];\n        for (const shortDescription of Object.keys(counts)) {\n            if (counts[shortDescription] > 1) {\n                arr.push(counts[shortDescription] + ' x ' + shortDescription);\n            }\n            else {\n                arr.push(shortDescription);\n            }\n        }\n        return Formatter.capitalizeFirstLetter(Formatter.joinLast(arr, ', ', ' en '));\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(BalanceItemPaymentDetailed) })\n], PaymentGeneral.prototype, \"balanceItemPayments\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], PaymentGeneral.prototype, \"iban\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], PaymentGeneral.prototype, \"ibanName\", void 0);\n__decorate([\n    field({ decoder: Settlement, nullable: true })\n], PaymentGeneral.prototype, \"settlement\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 196 })\n], PaymentGeneral.prototype, \"transferFee\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 198 })\n], PaymentGeneral.prototype, \"stripeAccountId\", void 0);\n__decorate([\n    field({ decoder: BaseOrganization, nullable: true, version: 344 })\n], PaymentGeneral.prototype, \"payingOrganization\", void 0);\n//# sourceMappingURL=PaymentGeneral.js.map","import { __decorate } from \"tslib\";\nimport { AnyDecoder, ArrayDecoder, AutoEncoder, DateDecoder, EnumDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nimport { BalanceItem, BalanceItemWithPayments } from './BalanceItem.js';\nimport { PaymentGeneral } from './members/PaymentGeneral.js';\nexport var ReceivableBalanceType;\n(function (ReceivableBalanceType) {\n    ReceivableBalanceType[\"organization\"] = \"organization\";\n    ReceivableBalanceType[\"member\"] = \"member\";\n    ReceivableBalanceType[\"user\"] = \"user\";\n    ReceivableBalanceType[\"registration\"] = \"registration\";\n})(ReceivableBalanceType || (ReceivableBalanceType = {}));\nexport function getReceivableBalanceTypeName(type, $t) {\n    switch (type) {\n        case ReceivableBalanceType.organization: return $t('b66501e0-f6de-4259-95ef-13590b24182b');\n        case ReceivableBalanceType.member: return $t('146d0874-2f4d-4374-8808-61a4bd953354');\n        case ReceivableBalanceType.user: return $t('fbb0dee5-c500-4bb4-81d6-945666ae4784');\n        case ReceivableBalanceType.registration: return $t('b4a0f9cb-ecd0-4f9b-bd28-9e4a6c8b1518');\n    }\n}\n/**\n * @deprecated\n * @param type\n * @returns\n */\nexport function getReceivableBalanceTypeNameNotTranslated(type) {\n    switch (type) {\n        case ReceivableBalanceType.organization: return 'vereniging';\n        case ReceivableBalanceType.member: return 'lid';\n        case ReceivableBalanceType.user: return 'account';\n        case ReceivableBalanceType.registration: return 'inschriving';\n    }\n}\nexport class ReceivableBalanceObjectContact extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.firstName = null;\n        this.lastName = null;\n        this.emails = [];\n        /**\n         * Meta data that is used for filtering who to email\n         */\n        this.meta = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], ReceivableBalanceObjectContact.prototype, \"firstName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], ReceivableBalanceObjectContact.prototype, \"lastName\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder) })\n], ReceivableBalanceObjectContact.prototype, \"emails\", void 0);\n__decorate([\n    field({ decoder: AnyDecoder, nullable: true, version: 346 })\n], ReceivableBalanceObjectContact.prototype, \"meta\", void 0);\nexport class ReceivableBalanceObject extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.uri = null;\n        // E-mail addresses to reach out to this entity\n        this.contacts = [];\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], ReceivableBalanceObject.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], ReceivableBalanceObject.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 362 })\n], ReceivableBalanceObject.prototype, \"uri\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(ReceivableBalanceObjectContact) })\n], ReceivableBalanceObject.prototype, \"contacts\", void 0);\n/**\n * An entity (organization, member or user) that has an outstanding balance towards an organization\n */\nexport class ReceivableBalance extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.amountPaid = 0;\n        this.amountOpen = 0;\n        this.amountPending = 0;\n        this.lastReminderEmail = null;\n        this.lastReminderAmountOpen = 0;\n        this.reminderEmailCount = 0;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], ReceivableBalance.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(ReceivableBalanceType) })\n], ReceivableBalance.prototype, \"objectType\", void 0);\n__decorate([\n    field({ decoder: ReceivableBalanceObject })\n], ReceivableBalance.prototype, \"object\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], ReceivableBalance.prototype, \"organizationId\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 354 })\n], ReceivableBalance.prototype, \"amountPaid\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, field: 'amount' }),\n    field({ decoder: IntegerDecoder, version: 354 })\n], ReceivableBalance.prototype, \"amountOpen\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], ReceivableBalance.prototype, \"amountPending\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, version: 355 })\n], ReceivableBalance.prototype, \"lastReminderEmail\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 355 })\n], ReceivableBalance.prototype, \"lastReminderAmountOpen\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 355 })\n], ReceivableBalance.prototype, \"reminderEmailCount\", void 0);\nexport class DetailedReceivableBalance extends ReceivableBalance {\n    constructor() {\n        super(...arguments);\n        this.balanceItems = [];\n        this.payments = [];\n    }\n    get filteredBalanceItems() {\n        return BalanceItem.filterBalanceItems(this.balanceItems);\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(BalanceItemWithPayments) })\n], DetailedReceivableBalance.prototype, \"balanceItems\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(PaymentGeneral) })\n], DetailedReceivableBalance.prototype, \"payments\", void 0);\n//# sourceMappingURL=ReceivableBalance.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, DateDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nexport class UsedRegisterCode extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.creditValue = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], UsedRegisterCode.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], UsedRegisterCode.prototype, \"organizationName\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], UsedRegisterCode.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], UsedRegisterCode.prototype, \"creditValue\", void 0);\nexport class RegisterCodeStatus extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.usedCodes = [];\n        this.value = 0;\n        this.invoiceValue = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], RegisterCodeStatus.prototype, \"code\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(UsedRegisterCode) })\n], RegisterCodeStatus.prototype, \"usedCodes\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 231 })\n], RegisterCodeStatus.prototype, \"value\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true, version: 231 })\n], RegisterCodeStatus.prototype, \"invoiceValue\", void 0);\nexport class RegisterCode extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.customMessage = null;\n        this.value = 0;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], RegisterCode.prototype, \"code\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], RegisterCode.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], RegisterCode.prototype, \"customMessage\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], RegisterCode.prototype, \"organizationName\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], RegisterCode.prototype, \"value\", void 0);\n//# sourceMappingURL=RegisterCodeStatus.js.map","import { __decorate } from \"tslib\";\nimport { AnyDecoder, ArrayDecoder, AutoEncoder, BooleanDecoder, field, IntegerDecoder, RecordDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { Formatter } from '@stamhoofd/utility';\nimport { PaymentMethod, PaymentMethodHelper } from './PaymentMethod.js';\nexport class Requirements extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.currently_due = [];\n        this.eventually_due = [];\n        this.past_due = [];\n        this.current_deadline = null;\n        this.disabled_reason = null;\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), optional: true })\n], Requirements.prototype, \"currently_due\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), optional: true })\n], Requirements.prototype, \"eventually_due\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), optional: true })\n], Requirements.prototype, \"past_due\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, optional: true, nullable: true })\n], Requirements.prototype, \"current_deadline\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true, nullable: true })\n], Requirements.prototype, \"disabled_reason\", void 0);\nexport class StripeBusinessProfile extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.mcc = null;\n        this.name = '';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], StripeBusinessProfile.prototype, \"mcc\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], StripeBusinessProfile.prototype, \"name\", void 0);\nexport class StripeCompany extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.structure = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], StripeCompany.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], StripeCompany.prototype, \"structure\", void 0);\nexport class StripeMetaAccountDashboardSettings extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.display_name = '';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, optional: true, nullable: true })\n], StripeMetaAccountDashboardSettings.prototype, \"display_name\", void 0);\nexport class StripeMetaAccountSettings extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.dashboard = StripeMetaAccountDashboardSettings.create({});\n    }\n}\n__decorate([\n    field({ decoder: StripeMetaAccountDashboardSettings, optional: true })\n], StripeMetaAccountSettings.prototype, \"dashboard\", void 0);\nexport class StripeMetaData extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.type = 'express';\n        this.blob = null;\n        this.business_profile = StripeBusinessProfile.create({});\n        this.business_type = null;\n        this.company = null;\n        this.charges_enabled = false;\n        this.payouts_enabled = false;\n        this.details_submitted = false;\n        this.capabilities = {};\n        this.requirements = Requirements.create({});\n        this.settings = StripeMetaAccountSettings.create({});\n        this.future_requirements = Requirements.create({});\n        this.bank_account_last4 = '';\n        this.bank_account_bank_name = '';\n        this.bank_account_name = '';\n    }\n    get paymentMethods() {\n        if (!this.charges_enabled) {\n            return [];\n        }\n        const methods = [];\n        if (this.capabilities.card_payments === 'active') {\n            methods.push(PaymentMethod.CreditCard);\n        }\n        if (this.capabilities.bancontact_payments === 'active') {\n            methods.push(PaymentMethod.Bancontact);\n        }\n        if (this.capabilities.ideal_payments === 'active') {\n            methods.push(PaymentMethod.iDEAL);\n        }\n        if (this.capabilities.sepa_debit_payments === 'active') {\n            methods.push(PaymentMethod.DirectDebit);\n        }\n        return methods;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], StripeMetaData.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: AnyDecoder, optional: true, nullable: true })\n], StripeMetaData.prototype, \"blob\", void 0);\n__decorate([\n    field({ decoder: StripeBusinessProfile, optional: true })\n], StripeMetaData.prototype, \"business_profile\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true, nullable: true })\n], StripeMetaData.prototype, \"business_type\", void 0);\n__decorate([\n    field({ decoder: StripeCompany, optional: true, nullable: true })\n], StripeMetaData.prototype, \"company\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], StripeMetaData.prototype, \"charges_enabled\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], StripeMetaData.prototype, \"payouts_enabled\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, optional: true })\n], StripeMetaData.prototype, \"details_submitted\", void 0);\n__decorate([\n    field({ decoder: new RecordDecoder(StringDecoder, StringDecoder), optional: true })\n], StripeMetaData.prototype, \"capabilities\", void 0);\n__decorate([\n    field({ decoder: Requirements, optional: true })\n], StripeMetaData.prototype, \"requirements\", void 0);\n__decorate([\n    field({ decoder: StripeMetaAccountSettings, optional: true })\n], StripeMetaData.prototype, \"settings\", void 0);\n__decorate([\n    field({ decoder: Requirements, optional: true })\n], StripeMetaData.prototype, \"future_requirements\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], StripeMetaData.prototype, \"bank_account_last4\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], StripeMetaData.prototype, \"bank_account_bank_name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], StripeMetaData.prototype, \"bank_account_name\", void 0);\nfunction requirementsToString(list) {\n    let missing = list.map((key) => {\n        if (key.match(/person_.+?\\.verification.document/)) {\n            return 'identiteitsbewijs van een persoon';\n        }\n        if (key.match(/(representative|person|individual|director)\\.address/)) {\n            return 'adres van een vertegenwoordiger';\n        }\n        if (key.match(/(representative|person|individual|director)\\.phone/)) {\n            return 'telefoon van een vertegenwoordiger';\n        }\n        if (key.match(/(representative|person|individual|director)\\.email/)) {\n            return 'email van een vertegenwoordiger';\n        }\n        if (key.match(/(representative|person|individual|director)\\.dob/)) {\n            return 'geboortedatum van een vertegenwoordiger';\n        }\n        if (key.match(/(representative|person|individual|director)\\.(first|last)_name/)) {\n            return 'naam van een vertegenwoordiger';\n        }\n        if (key.match(/(representative|person|individual|director)?\\.relationship.title/)) {\n            return 'functie van een vertegenwoordiger';\n        }\n        if (key.match(/person_.+?\\.address/)) {\n            return 'adres van een persoon';\n        }\n        if (key.match(/person_.+?\\.phone/)) {\n            return 'telefoon van een persoon';\n        }\n        if (key.match(/person_.+?\\.email/)) {\n            return 'email van een persoon';\n        }\n        if (key.match(/person_.+?\\.dob/)) {\n            return 'geboortedatum van een persoon';\n        }\n        if (key.match(/person_.+?\\.(first|last)_name/)) {\n            return 'naam van een persoon';\n        }\n        if (key.match(/person_.+?\\.relationship.title/)) {\n            return 'functie van een persoon';\n        }\n        if (key.match(/(representative|person|individual|director)_/)) {\n            return 'gegevens van een persoon';\n        }\n        if (key.match(/company_.+?\\.address/)) {\n            return 'adres van je vereniging';\n        }\n        if (key === 'company.phone') {\n            return 'telefoonnummer van je vereniging';\n        }\n        if (key === 'company.name') {\n            return 'naam van je vereniging';\n        }\n        if (key === 'company.verification.document') {\n            return 'verificatiedocument van je vereniging';\n        }\n        if (key === 'individual.verification.document') {\n            return 'verificatiedocument van natuurlijk persoon';\n        }\n        if (key === 'business_profile.product_description') {\n            return 'beschrijving van je vereniging';\n        }\n        if (key === 'business_profile.url') {\n            return 'website van je vereniging';\n        }\n        return 'andere';\n    });\n    missing = Formatter.uniqueArray(missing);\n    return Formatter.joinLast(missing, ', ', ' en ');\n}\nexport class StripeAccountPatch extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.businessProfileUrl = null;\n        this.businessProfileName = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, optional: true, nullable: true })\n], StripeAccountPatch.prototype, \"businessProfileUrl\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true, nullable: true })\n], StripeAccountPatch.prototype, \"businessProfileName\", void 0);\nexport class StripeAccount extends AutoEncoder {\n    get missingData() {\n        return requirementsToString([...this.meta.requirements.past_due, ...this.meta.future_requirements.past_due, ...this.meta.requirements.currently_due, ...this.meta.requirements.eventually_due, ...this.meta.future_requirements.currently_due, ...this.meta.future_requirements.eventually_due]);\n    }\n    get canDelete() {\n        return !this.meta.charges_enabled || !this.meta.payouts_enabled || !this.meta.details_submitted;\n    }\n    get warning() {\n        if (this.meta.requirements.current_deadline) {\n            const missing = this.missingData;\n            return {\n                text: 'Je moet gegevens aanvullen om te voorkomen dat uitbetalingen en betalingen worden stopgezet. Dit moet gebeuren voor ' + Formatter.date(new Date(this.meta.requirements.current_deadline * 1000)) + '. Ga naar je Stripe dashboard om dit in orde te brengen. Volgende zaken zouden ontbreken: ' + missing + '.',\n                type: 'error',\n            };\n        }\n        if (this.meta.charges_enabled && this.meta.paymentMethods.length < 3) {\n            const missing = [PaymentMethod.CreditCard, PaymentMethod.Bancontact, PaymentMethod.iDEAL].filter(m => !this.meta.paymentMethods.includes(m));\n            const text = Formatter.joinLast(missing.map(m => PaymentMethodHelper.getName(m)), ', ', ' en ');\n            const missingText = this.missingData;\n            if (missing.length === 1) {\n                return {\n                    text: 'De betaalmethode ' + text + ' werd nog niet door Stripe geactiveerd. Kijk na of alle informatie in je Stripe dashboard volledig ingevuld werd. ' + (missingText ? (' Volgende zaken zouden ontbreken: ' + missingText + '.') : ''),\n                    type: 'error',\n                };\n            }\n            return {\n                text: 'De betaalmethodes ' + text + ' werden nog niet door Stripe geactiveerd. Kijk na of alle informatie in je Stripe dashboard volledig ingevuld werd. ' + (missingText ? (' Volgende zaken zouden ontbreken: ' + missingText + '.') : ''),\n                type: 'error',\n            };\n        }\n        if (this.meta.future_requirements.current_deadline) {\n            const missing = this.missingData;\n            const d = new Date(this.meta.future_requirements.current_deadline * 1000);\n            return {\n                text: 'Je moet gegevens aanvullen om te voorkomen dat uitbetalingen en betalingen worden stopgezet. Dit moet gebeuren voor ' + Formatter.date(d) + '. Ga naar je Stripe dashboard om dit in orde te brengen. Volgende zaken zouden ontbreken: ' + missing + '.',\n                // Error if needed within one month\n                type: d < new Date(Date.now() + 24 * 60 * 60 * 1000 * 30) ? 'error' : 'warning',\n            };\n        }\n        if (this.meta.details_submitted && (this.meta.requirements.currently_due.length || this.meta.requirements.eventually_due.length || this.meta.future_requirements.currently_due.length || this.meta.future_requirements.eventually_due.length)) {\n            // Try to convert to readable text\n            const missing = this.missingData;\n            return {\n                text: 'Niet alle gegevens van jouw vereniging werden in het Stripe dashboard ingevuld. Kijk na of alles werd ingevuld. Volgende zaken zouden ontbreken: ' + missing + '.',\n                type: 'warning',\n            };\n        }\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], StripeAccount.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], StripeAccount.prototype, \"accountId\", void 0);\n__decorate([\n    field({ decoder: StripeMetaData })\n], StripeAccount.prototype, \"meta\", void 0);\n//# sourceMappingURL=StripeAccount.js.map","/**\n * This is a custom encoded implementation since we need to follow the OAuth2 specification, which for some reason\n * returns a relative \"expires_in\" timestamp instead of an absolute value.\n */\nexport class Token {\n    constructor(token) {\n        this.accessToken = token.accessToken;\n        this.refreshToken = token.refreshToken;\n        this.accessTokenValidUntil = token.accessTokenValidUntil;\n    }\n    static decode(data) {\n        return new Token({\n            accessToken: data.field('access_token').string,\n            refreshToken: data.field('refresh_token').string,\n            accessTokenValidUntil: new Date(new Date().getTime() + data.field('expires_in').integer * 1000),\n        });\n    }\n    encode(_context) {\n        // We convert to snake case, as specified in the OAuth2 specs\n        return {\n            access_token: this.accessToken,\n            token_type: 'bearer',\n            expires_in: Math.floor((this.accessTokenValidUntil.getTime() - new Date().getTime()) / 1000),\n            refresh_token: this.refreshToken,\n        };\n    }\n    needsRefresh() {\n        return this.accessToken.length == 0 || this.accessTokenValidUntil < new Date();\n    }\n}\n//# sourceMappingURL=Token.js.map","import { __decorate } from \"tslib\";\nimport { field } from '@simonbackx/simple-encoding';\nimport { MembersBlob } from './members/MemberWithRegistrationsBlob.js';\nimport { User } from './User.js';\nexport class UserWithMembers extends User {\n    constructor() {\n        super(...arguments);\n        this.members = MembersBlob.create({});\n    }\n}\n__decorate([\n    field({ decoder: MembersBlob })\n], UserWithMembers.prototype, \"members\", void 0);\n//# sourceMappingURL=UserWithMembers.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, BooleanDecoder, IntegerDecoder, MapDecoder, StringDecoder, field } from '@simonbackx/simple-encoding';\nexport class ChargeMembershipsTypeSummary extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.memberships = 0;\n        this.members = 0;\n        this.price = 0;\n        this.organizations = 0;\n    }\n}\n__decorate([\n    field({ decoder: IntegerDecoder })\n], ChargeMembershipsTypeSummary.prototype, \"memberships\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], ChargeMembershipsTypeSummary.prototype, \"members\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], ChargeMembershipsTypeSummary.prototype, \"price\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], ChargeMembershipsTypeSummary.prototype, \"organizations\", void 0);\nexport class ChargeMembershipsSummary extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.running = false;\n        this.memberships = 0;\n        this.members = 0;\n        this.price = 0;\n        this.organizations = 0;\n        this.membershipsPerType = new Map();\n        this.trials = ChargeMembershipsTypeSummary.create({});\n    }\n}\n__decorate([\n    field({ decoder: BooleanDecoder })\n], ChargeMembershipsSummary.prototype, \"running\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], ChargeMembershipsSummary.prototype, \"memberships\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], ChargeMembershipsSummary.prototype, \"members\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], ChargeMembershipsSummary.prototype, \"price\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], ChargeMembershipsSummary.prototype, \"organizations\", void 0);\n__decorate([\n    field({ decoder: new MapDecoder(StringDecoder, ChargeMembershipsTypeSummary) })\n], ChargeMembershipsSummary.prototype, \"membershipsPerType\", void 0);\n__decorate([\n    field({ decoder: ChargeMembershipsTypeSummary, version: 355 })\n], ChargeMembershipsSummary.prototype, \"trials\", void 0);\n//# sourceMappingURL=ChargeMembershipsSummary.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, DateDecoder, field, NumberDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nexport class ChargeOrganizationsRequest extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.dueAt = null;\n        this.createdAt = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, nullable: false })\n], ChargeOrganizationsRequest.prototype, \"organizationId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], ChargeOrganizationsRequest.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: NumberDecoder })\n], ChargeOrganizationsRequest.prototype, \"price\", void 0);\n__decorate([\n    field({ decoder: NumberDecoder, nullable: true })\n], ChargeOrganizationsRequest.prototype, \"amount\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], ChargeOrganizationsRequest.prototype, \"dueAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], ChargeOrganizationsRequest.prototype, \"createdAt\", void 0);\n//# sourceMappingURL=ChargeOrganizationsRequest.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, DateDecoder, field, NumberDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nexport class ChargeMembersRequest extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.dueAt = null;\n        this.createdAt = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], ChargeMembersRequest.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: NumberDecoder })\n], ChargeMembersRequest.prototype, \"price\", void 0);\n__decorate([\n    field({ decoder: NumberDecoder, nullable: true })\n], ChargeMembersRequest.prototype, \"amount\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], ChargeMembersRequest.prototype, \"dueAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], ChargeMembersRequest.prototype, \"createdAt\", void 0);\n//# sourceMappingURL=ChargeMembersRequest.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, field } from '@simonbackx/simple-encoding';\nimport { Organization } from '../Organization.js';\nimport { MollieProfile } from '../OrganizationPrivateMetaData.js';\nexport class CheckMollieResponse extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.profiles = [];\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(MollieProfile) })\n], CheckMollieResponse.prototype, \"profiles\", void 0);\n__decorate([\n    field({ decoder: Organization })\n], CheckMollieResponse.prototype, \"organization\", void 0);\n//# sourceMappingURL=CheckMollieResponse.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { Organization } from '../Organization.js';\nimport { NewUser } from '../User.js';\nexport class CreateOrganization extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.registerCode = null;\n    }\n}\n__decorate([\n    field({ decoder: Organization })\n], CreateOrganization.prototype, \"organization\", void 0);\n__decorate([\n    field({ decoder: NewUser })\n], CreateOrganization.prototype, \"user\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 24 })\n], CreateOrganization.prototype, \"registerCode\", void 0);\n//# sourceMappingURL=CreateOrganization.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, EmailDecoder, field } from '@simonbackx/simple-encoding';\nexport class ForgotPasswordRequest extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: EmailDecoder })\n], ForgotPasswordRequest.prototype, \"email\", void 0);\n//# sourceMappingURL=ForgotPasswordRequest.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, field } from '@simonbackx/simple-encoding';\nimport { Group } from '../Group.js';\nimport { Organization } from '../Organization.js';\nexport class GroupsWithOrganizations extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.groups = [];\n        this.organizations = [];\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(Group) })\n], GroupsWithOrganizations.prototype, \"groups\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Organization) })\n], GroupsWithOrganizations.prototype, \"organizations\", void 0);\n//# sourceMappingURL=GroupsWithOrganizations.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, field } from '@simonbackx/simple-encoding';\nimport { UserWithMembers } from '../UserWithMembers.js';\nexport class OrganizationAdmins extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.users = [];\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(UserWithMembers) })\n], OrganizationAdmins.prototype, \"users\", void 0);\n//# sourceMappingURL=OrganizationAdmins.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, BooleanDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nexport class OrganizationDomains extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.registerDomain = null;\n        /**\n         * Used for sending emails. Use of subdomain is discouraged, because that sends emails from @sub.domain.com instead of @domain.com\n         */\n        this.mailDomain = null;\n        /**\n         * Use shorter DKIM key (1024 bit) instead of 2048 bit\n         */\n        this.useDkim1024bit = false;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], OrganizationDomains.prototype, \"registerDomain\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], OrganizationDomains.prototype, \"mailDomain\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, optional: true, version: 177 })\n], OrganizationDomains.prototype, \"useDkim1024bit\", void 0);\n//# sourceMappingURL=OrganizationDomains.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, field, IntegerDecoder } from '@simonbackx/simple-encoding';\nimport { BalanceItem, BalanceItemWithPayments } from '../BalanceItem.js';\nimport { PaymentGeneral } from '../members/PaymentGeneral.js';\nimport { Organization } from '../Organization.js';\nexport class PayableBalance extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.amountPaid = 0;\n        this.amountOpen = 0;\n        this.amountPending = 0;\n    }\n}\n__decorate([\n    field({ decoder: Organization })\n], PayableBalance.prototype, \"organization\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 354 })\n], PayableBalance.prototype, \"amountPaid\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, field: 'amount' }),\n    field({ decoder: IntegerDecoder, version: 354 })\n], PayableBalance.prototype, \"amountOpen\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 335 })\n], PayableBalance.prototype, \"amountPending\", void 0);\nexport class PayableBalanceCollection extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Debt you have to other organizations\n         */\n        this.organizations = [];\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(PayableBalance) })\n], PayableBalanceCollection.prototype, \"organizations\", void 0);\nexport class DetailedPayableBalance extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.balanceItems = [];\n        this.payments = [];\n    }\n    get filteredBalanceItems() {\n        return BalanceItem.filterBalanceItems(this.balanceItems);\n    }\n}\n__decorate([\n    field({ decoder: Organization })\n], DetailedPayableBalance.prototype, \"organization\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(BalanceItemWithPayments) })\n], DetailedPayableBalance.prototype, \"balanceItems\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(PaymentGeneral) })\n], DetailedPayableBalance.prototype, \"payments\", void 0);\nexport class DetailedPayableBalanceCollection extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Debt you have to other organizations\n         */\n        this.organizations = [];\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(DetailedPayableBalance) })\n], DetailedPayableBalanceCollection.prototype, \"organizations\", void 0);\n//# sourceMappingURL=PayableBalanceCollection.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, EnumDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { PaymentMethod } from '../PaymentMethod.js';\n/**\n * @deprecated\n */\nexport class RegisterMember extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Set to true to put a member on the waiting list instead of registering it. Please note that the value of this property is validated. You cannot register a new member when waiting lists are enabled\n         */\n        this.waitingList = false;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], RegisterMember.prototype, \"memberId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], RegisterMember.prototype, \"groupId\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], RegisterMember.prototype, \"reduced\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 16 })\n], RegisterMember.prototype, \"waitingList\", void 0);\n/**\n * @deprecated\n */\nexport class RegisterMembers extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(RegisterMember) })\n], RegisterMembers.prototype, \"members\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(PaymentMethod) })\n], RegisterMembers.prototype, \"paymentMethod\", void 0);\n//# sourceMappingURL=RegisterMember.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { MembersBlob } from '../members/MemberWithRegistrationsBlob.js';\nimport { Payment } from '../members/Payment.js';\nimport { RegistrationWithMember } from '../members/RegistrationWithMember.js';\nexport class RegisterResponse extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.payment = null;\n        this.paymentUrl = null;\n        this.registrations = [];\n    }\n}\n__decorate([\n    field({ decoder: Payment, nullable: true })\n], RegisterResponse.prototype, \"payment\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 28 })\n], RegisterResponse.prototype, \"paymentUrl\", void 0);\n__decorate([\n    field({ decoder: MembersBlob })\n], RegisterResponse.prototype, \"members\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(RegistrationWithMember), version: 19 })\n], RegisterResponse.prototype, \"registrations\", void 0);\n//# sourceMappingURL=RegisterResponse.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nexport class SignupResponse extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], SignupResponse.prototype, \"token\", void 0);\n//# sourceMappingURL=SignupResponse.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, BooleanDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nexport class VerifyEmailRequest extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], VerifyEmailRequest.prototype, \"token\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], VerifyEmailRequest.prototype, \"code\", void 0);\nexport class PollEmailVerificationRequest extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], PollEmailVerificationRequest.prototype, \"token\", void 0);\nexport class PollEmailVerificationResponse extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: BooleanDecoder })\n], PollEmailVerificationResponse.prototype, \"valid\", void 0);\n//# sourceMappingURL=VerifyEmailRequest.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, BooleanDecoder, field } from '@simonbackx/simple-encoding';\nexport class WebshopUriAvailabilityResponse extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: BooleanDecoder })\n], WebshopUriAvailabilityResponse.prototype, \"available\", void 0);\n//# sourceMappingURL=WebshopUriAvailabilityResponse.js.map","import { encodeObject } from '@simonbackx/simple-encoding';\nexport class IPaginatedResponse {\n}\nexport class UnencodeablePaginatedResponse {\n    constructor(data) {\n        this.results = data.results;\n        this.next = data.next;\n    }\n}\nexport class PaginatedResponse {\n    constructor(data) {\n        this.results = data.results;\n        this.next = data.next;\n    }\n    encode(context) {\n        var _a;\n        return {\n            results: encodeObject(this.results, context), // this.results.map(r => r.encode(context)),\n            next: (_a = this.next) === null || _a === void 0 ? void 0 : _a.encode(context),\n        };\n    }\n}\nexport class PaginatedResponseDecoder {\n    constructor(resultDecoder, querydecoder) {\n        this.resultDecoder = resultDecoder;\n        this.querydecoder = querydecoder;\n    }\n    decode(data) {\n        var _a;\n        return new PaginatedResponse({\n            results: data.field('results').decode(this.resultDecoder),\n            next: (_a = data.optionalField('next')) === null || _a === void 0 ? void 0 : _a.decode(this.querydecoder),\n        });\n    }\n}\n//# sourceMappingURL=PaginatedResponse.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, DateDecoder, EnumDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { PaymentMethod } from '../PaymentMethod.js';\nimport { PaymentStatus } from '../PaymentStatus.js';\nimport { TransferSettings } from '../webshops/TransferSettings.js';\nexport class PaymentPatch extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], PaymentPatch.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(PaymentStatus), optional: true })\n], PaymentPatch.prototype, \"status\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, optional: true })\n], PaymentPatch.prototype, \"price\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(PaymentMethod), optional: true })\n], PaymentPatch.prototype, \"method\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true, optional: true })\n], PaymentPatch.prototype, \"paidAt\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, optional: true })\n], PaymentPatch.prototype, \"transferDescription\", void 0);\n__decorate([\n    field({ decoder: TransferSettings, nullable: true, optional: true })\n], PaymentPatch.prototype, \"transferSettings\", void 0);\n//# sourceMappingURL=PaymentPatch.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, field } from '@simonbackx/simple-encoding';\nimport { Payment } from './Payment.js';\nimport { RegistrationWithMember } from './RegistrationWithMember.js';\nexport class PaymentWithRegistrations extends Payment {\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(RegistrationWithMember) })\n], PaymentWithRegistrations.prototype, \"registrations\", void 0);\n//# sourceMappingURL=PaymentWithRegistrations.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, field, IntegerDecoder } from '@simonbackx/simple-encoding';\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { BalanceItem } from '../../BalanceItem.js';\n/**\n * Contains an intention to pay for an outstanding balance item\n */\nexport class BalanceItemCartItem extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Amount you want to pay of that balance item\n         */\n        this.price = 0;\n    }\n    get id() {\n        return this.item.id;\n    }\n    validate(data) {\n        if (data.balanceItems !== undefined) {\n            const found = data.balanceItems.find(b => b.id === this.item.id);\n            if (!found) {\n                throw new SimpleError({\n                    code: 'not_found',\n                    message: 'Eén van de openstaande bedragen is niet meer beschikbaar.',\n                });\n            }\n            this.item = found;\n        }\n        const maxPrice = this.item.priceOpen;\n        if (maxPrice === 0) {\n            throw new SimpleError({\n                code: 'not_found',\n                message: 'Eén van de openstaande bedragen is ondertussen al betaald.',\n            });\n        }\n        if (maxPrice < 0) {\n            // Allow negative prices\n            if (this.price > 0) {\n                this.price = maxPrice;\n            }\n            if (this.price < maxPrice) {\n                // Don't throw: we'll throw a different error during checkout if the price has changed\n                this.price = maxPrice;\n            }\n            return;\n        }\n        if (this.price < 0) {\n            this.price = maxPrice;\n        }\n        if (this.price > maxPrice) {\n            // Don't throw: we'll throw a different error during checkout if the price has changed\n            this.price = maxPrice;\n        }\n    }\n}\n__decorate([\n    field({ decoder: BalanceItem })\n], BalanceItemCartItem.prototype, \"item\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], BalanceItemCartItem.prototype, \"price\", void 0);\n//# sourceMappingURL=BalanceItemCartItem.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { isSimpleError, isSimpleErrors, SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\nimport { Platform } from '../../Platform.js';\nimport { RegistrationWithMember } from '../RegistrationWithMember.js';\nimport { BalanceItemCartItem } from './BalanceItemCartItem.js';\nimport { IDRegisterItem } from './RegisterItem.js';\nexport class IDRegisterCart extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.items = [];\n        this.balanceItems = [];\n        this.deleteRegistrationIds = [];\n    }\n    hydrate(context) {\n        const cart = new RegisterCart();\n        cart.items = this.items.map(i => i.hydrate(context));\n        cart.balanceItems = this.balanceItems;\n        const registrations = [];\n        for (const registrationId of this.deleteRegistrationIds) {\n            let found = false;\n            for (const member of context.members) {\n                const registration = member.patchedMember.registrations.find(r => r.id === registrationId);\n                if (!registration) {\n                    continue;\n                }\n                registrations.push(RegistrationWithMember.from(registration, member.patchedMember.tiny));\n                found = true;\n                break;\n            }\n            if (!found) {\n                throw new SimpleError({\n                    code: 'not_found',\n                    message: 'Registration not found',\n                    human: 'De inschrijving die je wou verwijderen kon niet gevonden worden. Het is mogelijk dat deze inschrijving al verwijderd is.',\n                    field: 'deleteRegistrationIds',\n                });\n            }\n        }\n        cart.deleteRegistrations = registrations;\n        return cart;\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(IDRegisterItem) })\n], IDRegisterCart.prototype, \"items\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(BalanceItemCartItem), optional: true })\n], IDRegisterCart.prototype, \"balanceItems\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), optional: true })\n], IDRegisterCart.prototype, \"deleteRegistrationIds\", void 0);\nexport class RegisterCart {\n    constructor() {\n        this.items = [];\n        this.balanceItems = [];\n        /**\n         * You can define which registrations you want remove as part of this register operation.\n         */\n        this.deleteRegistrations = [];\n    }\n    calculatePrices() {\n        for (const item of this.items) {\n            item.calculatePrice();\n        }\n    }\n    clone() {\n        const cart = new RegisterCart();\n        cart.items = this.items.map(i => i.clone());\n        cart.balanceItems = this.balanceItems.map(i => i.clone());\n        cart.deleteRegistrations = this.deleteRegistrations.map(r => r.clone());\n        return cart;\n    }\n    convert() {\n        return IDRegisterCart.create({\n            items: this.items.map(i => i.convert()),\n            balanceItems: this.balanceItems,\n            deleteRegistrationIds: this.deleteRegistrations.map(r => r.id),\n        });\n    }\n    add(item) {\n        if (this.contains(item)) {\n            return this.remove(item, item);\n        }\n        if (!this.canAdd(item)) {\n            return;\n        }\n        this.items.push(item);\n    }\n    canAdd(item) {\n        if (this.contains(item)) {\n            return false;\n        }\n        if (this.items.length >= 500) {\n            return false;\n        }\n        return true;\n    }\n    contains(item) {\n        for (const [i, otherItem] of this.items.entries()) {\n            if (otherItem.id === item.id || (otherItem.member.id === item.member.id && otherItem.groupId === item.groupId)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    getMemberAndGroup(memberId, groupId) {\n        for (const [i, otherItem] of this.items.entries()) {\n            if (otherItem.member.id === memberId && otherItem.groupId === groupId) {\n                return otherItem;\n            }\n        }\n        return null;\n    }\n    containsMemberAndGroup(memberId, groupId) {\n        return this.getMemberAndGroup(memberId, groupId) !== null;\n    }\n    remove(item, replaceWith) {\n        for (const [i, otherItem] of this.items.entries()) {\n            if (otherItem.id === item.id || (otherItem.member.id === item.member.id && otherItem.groupId === item.groupId)) {\n                this.items.splice(i, 1, ...(replaceWith ? [replaceWith] : []));\n                break;\n            }\n        }\n    }\n    removeMemberAndGroup(memberId, groupId) {\n        for (let i = this.items.length - 1; i >= 0; i--) {\n            const otherItem = this.items[i];\n            if (otherItem.member.id === memberId && otherItem.groupId === groupId) {\n                this.items.splice(i, 1);\n            }\n        }\n    }\n    removeRegistration(registration) {\n        const index = this.deleteRegistrations.findIndex(r => r.id === registration.id);\n        if (index === -1) {\n            this.deleteRegistrations.push(registration);\n        }\n    }\n    unremoveRegistration(registration) {\n        const index = this.deleteRegistrations.findIndex(r => r.id === registration.id);\n        if (index !== -1) {\n            this.deleteRegistrations.splice(index, 1);\n        }\n    }\n    canAddBalanceItem(item) {\n        var _a;\n        if (this.singleOrganization) {\n            if (item.item.organizationId !== ((_a = this.singleOrganization) === null || _a === void 0 ? void 0 : _a.id)) {\n                return false;\n            }\n        }\n        // Check duplicate\n        for (const i of this.balanceItems) {\n            if (i.item.id === item.item.id) {\n                return false;\n            }\n        }\n        return true;\n    }\n    addBalanceItem(item) {\n        if (!this.canAddBalanceItem(item)) {\n            return;\n        }\n        this.balanceItems.push(item);\n    }\n    removeBalanceItem(item) {\n        for (let i = this.balanceItems.length - 1; i >= 0; i--) {\n            if (this.balanceItems[i].id === item.id) {\n                this.balanceItems.splice(i, 1);\n            }\n        }\n    }\n    get isEmpty() {\n        return this.count === 0;\n    }\n    get count() {\n        return this.items.length + this.balanceItems.length + this.deleteRegistrations.length;\n    }\n    get price() {\n        return this.items.reduce((total, item) => item.calculatedPrice + total, 0)\n            + this.balanceItems.reduce((total, item) => {\n                return total + item.price;\n            }, 0);\n    }\n    get priceDueLater() {\n        return this.items.reduce((total, item) => item.calculatedPriceDueLater + total, 0);\n    }\n    get refund() {\n        return this.items.reduce((total, item) => item.calculatedRefund + total, 0)\n            + this.deleteRegistrations.reduce((total, item) => {\n                return total + item.price;\n            }, 0);\n    }\n    get singleOrganization() {\n        if (this.items.length === 0) {\n            return null;\n        }\n        return this.items[0].organization;\n    }\n    validate(checkout, data) {\n        var _a;\n        const newItems = [];\n        const errors = new SimpleErrors();\n        for (const item of this.items) {\n            try {\n                item.validate({ final: true });\n                item.cartError = null;\n                newItems.push(item);\n                const isDuplicate = !!this.items.find(i => i !== item && i.isSameRegistration(item));\n                if (isDuplicate) {\n                    errors.addError(new SimpleError({\n                        code: 'duplicate_register_item',\n                        message: 'duplicate register item',\n                        human: 'Het is niet mogelijk om meerdere keren in te schrijven voor dezelfde groep.',\n                    }));\n                }\n            }\n            catch (e) {\n                if (isSimpleError(e) || isSimpleErrors(e)) {\n                    e.addNamespace('cart');\n                    errors.addError(e);\n                }\n                else {\n                    throw e;\n                }\n                if (isSimpleError(e) && ((_a = e.meta) === null || _a === void 0 ? void 0 : _a.recoverable)) {\n                    item.cartError = e;\n                    newItems.push(item);\n                }\n            }\n        }\n        const cleanedBalanceItems = [];\n        for (const balanceItem of this.balanceItems) {\n            // TODO: validate balance item organization (happens in backend anyway)\n            if (checkout.singleOrganizationId && balanceItem.item.organizationId !== checkout.singleOrganizationId) {\n                errors.addError(new SimpleError({\n                    code: 'invalid_organization',\n                    message: 'Invalid organization in balanceItems',\n                    human: 'Het is niet mogelijk om een openstaand bedrag af te rekenen voor een andere organisatie samen met andere items in je winkelmandje voor een andere organisatie, dit moet apart gebeuren.',\n                    field: 'balanceItems',\n                }));\n                continue;\n            }\n            try {\n                balanceItem.validate({ balanceItems: data === null || data === void 0 ? void 0 : data.memberBalanceItems });\n                cleanedBalanceItems.push(balanceItem);\n            }\n            catch (e) {\n                if (isSimpleError(e) || isSimpleErrors(e)) {\n                    e.addNamespace('cart');\n                    errors.addError(e);\n                }\n                else {\n                    throw e;\n                }\n            }\n        }\n        const cleanedRegistrations = [];\n        const singleOrganization = checkout.singleOrganization;\n        for (const registration of this.deleteRegistrations) {\n            if (checkout.singleOrganizationId && registration.group.organizationId !== checkout.singleOrganizationId) {\n                errors.addError(new SimpleError({\n                    code: 'invalid_organization',\n                    message: 'Invalid organization in deleteRegistrations',\n                    human: 'Het is niet mogelijk om een inschrijving te verwijderen samen met een inschrijving voor een andere organisatie, dit moet apart gebeuren.',\n                    field: 'deleteRegistrations',\n                }));\n                continue;\n            }\n            if (!singleOrganization) {\n                continue;\n            }\n            const platform = Platform.shared;\n            const periodId = registration.group.periodId;\n            const period = periodId === platform.period.id ? platform.period : (periodId === singleOrganization.period.period.id ? singleOrganization.period.period : registration.group.settings.period);\n            if (period && period.locked) {\n                errors.addError(new SimpleError({\n                    code: 'locked_period',\n                    message: 'Locked period',\n                    human: `Je kan geen inschrijvingen wijzigen van ${registration.group.settings.name} omdat werkjaar ${period.nameShort} is afgesloten.`,\n                }));\n                continue;\n            }\n            if (!period) {\n                errors.addError(new SimpleError({\n                    code: 'locked_period',\n                    message: 'Locked period',\n                    human: `Je kan geen inschrijvingen wijzigen van ${registration.group.settings.name} omdat dat werkjaar is afgesloten.`,\n                }));\n                continue;\n            }\n            cleanedRegistrations.push(registration);\n        }\n        this.balanceItems = cleanedBalanceItems;\n        this.deleteRegistrations = cleanedRegistrations;\n        this.items = newItems;\n        errors.throwIfNotEmpty();\n    }\n}\n//# sourceMappingURL=RegisterCart.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, EnumDecoder, field, IntegerDecoder, StringDecoder, URLDecoder } from '@simonbackx/simple-encoding';\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { Formatter } from '@stamhoofd/utility';\nimport { PaymentCustomer } from '../../PaymentCustomer.js';\nimport { PaymentMethod } from '../../PaymentMethod.js';\nimport { IDRegisterCart, RegisterCart } from './RegisterCart.js';\nexport class IDRegisterCheckout extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.cart = IDRegisterCart.create({});\n        this.administrationFee = 0;\n        this.freeContribution = 0;\n        this.cancellationFeePercentage = 0;\n        this.paymentMethod = null;\n        /**\n         * The link we'll redirect the user back too after the payment page (either succeeded or failed!)\n         * The id query param will be appended with the payment id\n         */\n        this.redirectUrl = null;\n        /**\n         * The link we'll redirect the user back too after the user canceled a payment (not supported for all payment methods)\n         * The id query param will be appended with the payment id\n         */\n        this.cancelUrl = null;\n        /**\n         * Register these members as the organization\n         */\n        this.asOrganizationId = null;\n        this.customer = null;\n        /**\n         * Cached price so we can detect inconsistencies between frontend and backend\n         */\n        this.totalPrice = null;\n    }\n    hydrate(context) {\n        var _a;\n        const checkout = new RegisterCheckout();\n        checkout.cart = this.cart.hydrate(context);\n        checkout.administrationFee = this.administrationFee;\n        checkout.freeContribution = this.freeContribution;\n        checkout.paymentMethod = this.paymentMethod;\n        checkout.asOrganizationId = this.asOrganizationId;\n        checkout.customer = this.customer;\n        checkout.cancellationFeePercentage = this.cancellationFeePercentage;\n        if (context.organizations[0] && !checkout.cart.isEmpty && checkout.defaultOrganization === null) {\n            const preferredId = checkout.singleOrganizationId;\n            checkout.setDefaultOrganization((_a = (preferredId ? context.organizations.find(o => o.id === preferredId) : null)) !== null && _a !== void 0 ? _a : context.organizations[0]);\n        }\n        else {\n            if (!checkout.cart.isEmpty && !checkout.singleOrganization) {\n                throw new Error('Missing default organization');\n            }\n        }\n        return checkout;\n    }\n    get memberIds() {\n        return Formatter.uniqueArray(this.cart.items.map(i => i.memberId));\n    }\n    get groupIds() {\n        return Formatter.uniqueArray(this.cart.items.map(i => i.groupId));\n    }\n}\n__decorate([\n    field({ decoder: IDRegisterCart })\n], IDRegisterCheckout.prototype, \"cart\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], IDRegisterCheckout.prototype, \"administrationFee\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], IDRegisterCheckout.prototype, \"freeContribution\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, version: 362 })\n], IDRegisterCheckout.prototype, \"cancellationFeePercentage\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(PaymentMethod), nullable: true })\n], IDRegisterCheckout.prototype, \"paymentMethod\", void 0);\n__decorate([\n    field({ decoder: new URLDecoder({ allowedProtocols: ['https:'] }), nullable: true })\n], IDRegisterCheckout.prototype, \"redirectUrl\", void 0);\n__decorate([\n    field({ decoder: new URLDecoder({ allowedProtocols: ['https:'] }), nullable: true })\n], IDRegisterCheckout.prototype, \"cancelUrl\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], IDRegisterCheckout.prototype, \"asOrganizationId\", void 0);\n__decorate([\n    field({ decoder: PaymentCustomer, nullable: true, version: 322 })\n], IDRegisterCheckout.prototype, \"customer\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], IDRegisterCheckout.prototype, \"totalPrice\", void 0);\nexport class RegisterCheckout {\n    constructor() {\n        this.cart = new RegisterCart();\n        this.administrationFee = 0;\n        this.freeContribution = 0;\n        this.paymentMethod = null;\n        this.customer = null;\n        this.asOrganizationId = null;\n        // Default hint for empty carts to know the organization to use\n        this.defaultOrganization = null;\n        this.cancellationFeePercentage = 0; // per ten thousand\n    }\n    convert() {\n        return IDRegisterCheckout.create({\n            cart: this.cart.convert(),\n            administrationFee: this.administrationFee,\n            freeContribution: this.freeContribution,\n            paymentMethod: this.paymentMethod,\n            totalPrice: this.totalPrice,\n            cancellationFeePercentage: this.cancellationFeePercentage,\n            asOrganizationId: this.asOrganizationId,\n            customer: this.customer,\n        });\n    }\n    get singleOrganization() {\n        var _a;\n        return (_a = this.cart.singleOrganization) !== null && _a !== void 0 ? _a : this.defaultOrganization;\n    }\n    get singleOrganizationId() {\n        var _a, _b, _c, _d, _e;\n        return (_d = (_b = (_a = this.singleOrganization) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : (_c = this.cart.deleteRegistrations[0]) === null || _c === void 0 ? void 0 : _c.organizationId) !== null && _d !== void 0 ? _d : (_e = this.cart.balanceItems[0]) === null || _e === void 0 ? void 0 : _e.item.organizationId;\n    }\n    setDefaultOrganization(organization) {\n        this.defaultOrganization = organization;\n    }\n    get isAdminFromSameOrganization() {\n        var _a;\n        return !!this.asOrganizationId && this.asOrganizationId === ((_a = this.singleOrganization) === null || _a === void 0 ? void 0 : _a.id);\n    }\n    add(item, options) {\n        if (this.cart.isEmpty) {\n            this.defaultOrganization = null;\n        }\n        if (!this.singleOrganization) {\n            this.setDefaultOrganization(item.organization);\n        }\n        this.cart.add(item);\n        if ((options === null || options === void 0 ? void 0 : options.calculate) !== false) {\n            this.updatePrices();\n        }\n    }\n    remove(item, options) {\n        this.cart.remove(item);\n        if ((options === null || options === void 0 ? void 0 : options.calculate) !== false) {\n            this.updatePrices();\n        }\n        if (this.cart.isEmpty) {\n            this.defaultOrganization = null;\n        }\n    }\n    removeMemberAndGroup(memberId, groupId, options) {\n        this.cart.removeMemberAndGroup(memberId, groupId);\n        if ((options === null || options === void 0 ? void 0 : options.calculate) !== false) {\n            this.updatePrices();\n        }\n        if (this.cart.isEmpty) {\n            this.defaultOrganization = null;\n        }\n    }\n    removeRegistration(registration, options) {\n        this.cart.removeRegistration(registration);\n        if ((options === null || options === void 0 ? void 0 : options.calculate) !== false) {\n            this.updatePrices();\n        }\n        if (this.cart.isEmpty) {\n            this.defaultOrganization = null;\n        }\n    }\n    unremoveRegistration(registration, options) {\n        this.cart.unremoveRegistration(registration);\n        if ((options === null || options === void 0 ? void 0 : options.calculate) !== false) {\n            this.updatePrices();\n        }\n        if (this.cart.isEmpty) {\n            this.defaultOrganization = null;\n        }\n    }\n    addBalanceItem(item, options) {\n        this.cart.addBalanceItem(item);\n        if ((options === null || options === void 0 ? void 0 : options.calculate) !== false) {\n            this.updatePrices();\n        }\n    }\n    removeBalanceItem(item, options) {\n        this.cart.removeBalanceItem(item);\n        if ((options === null || options === void 0 ? void 0 : options.calculate) !== false) {\n            this.updatePrices();\n        }\n        if (this.cart.isEmpty) {\n            this.defaultOrganization = null;\n        }\n    }\n    removeBalanceItemByBalance(item, options) {\n        const _item = this.cart.balanceItems.find(i => i.item.id === item.id);\n        if (!_item) {\n            return;\n        }\n        this.removeBalanceItem(_item, options);\n    }\n    updatePrices() {\n        var _a;\n        this.cart.calculatePrices();\n        if (this.isAdminFromSameOrganization || !this.singleOrganization) {\n            this.administrationFee = 0;\n        }\n        else {\n            this.administrationFee = (_a = this.singleOrganization.meta.registrationPaymentConfiguration.administrationFee.calculate(this.cart.price)) !== null && _a !== void 0 ? _a : 0;\n        }\n    }\n    validate(data) {\n        var _a, _b;\n        if (!this.isAdminFromSameOrganization && this.cart.deleteRegistrations.length > 0) {\n            throw new SimpleError({\n                code: 'forbidden',\n                message: 'Permission denied: you are not allowed to delete registrations',\n                human: 'Oeps, je hebt geen rechten om inschrijvingen te verwijderen.',\n            });\n        }\n        this.cart.validate(this, data);\n        if (this.singleOrganization && ((_b = (_a = this.singleOrganization.meta.recordsConfiguration.freeContribution) === null || _a === void 0 ? void 0 : _a.amounts.length) !== null && _b !== void 0 ? _b : 0) === 0) {\n            // Automatically clear free contribution if there are no options\n            this.freeContribution = 0;\n        }\n    }\n    clear() {\n        this.administrationFee = 0;\n        this.freeContribution = 0;\n        this.cart.items = [];\n        this.cart.balanceItems = [];\n        this.cart.deleteRegistrations = [];\n        this.customer = null;\n    }\n    get totalPrice() {\n        return Math.max(0, this.cart.price + this.administrationFee + this.freeContribution - this.cart.refund);\n    }\n    get priceBreakown() {\n        const all = [\n            {\n                name: 'Administratiekost',\n                price: this.administrationFee,\n            },\n            {\n                name: 'Vrije bijdrage',\n                price: this.freeContribution,\n            },\n            {\n                name: 'Terugbetaling',\n                price: -this.cart.refund,\n            },\n            {\n                name: 'Later te betalen',\n                price: this.cart.priceDueLater,\n            },\n        ].filter(a => a.price !== 0);\n        if (all.length > 0) {\n            all.unshift({\n                name: 'Subtotaal',\n                price: this.cart.price,\n            });\n        }\n        return [\n            ...all,\n            {\n                name: this.cart.priceDueLater ? 'Nu te betalen' : 'Totaal',\n                price: this.totalPrice,\n            },\n        ];\n    }\n}\n//# sourceMappingURL=RegisterCheckout.js.map","import { deepSetArray, PatchableArray } from '@simonbackx/simple-encoding';\nimport { AccessRight } from '../AccessRight.js';\nimport { GroupType } from '../GroupType.js';\nimport { PermissionLevel } from '../PermissionLevel.js';\nimport { PermissionsResourceType } from '../PermissionsResourceType.js';\nimport { Platform } from '../Platform.js';\nimport { MemberDetails } from './MemberDetails.js';\nimport { MemberWithRegistrationsBlob } from './MemberWithRegistrationsBlob.js';\nimport { NationalRegisterNumberOptOut } from './NationalRegisterNumberOptOut.js';\nimport { OrganizationRecordsConfiguration } from './OrganizationRecordsConfiguration.js';\nimport { RegisterCheckout } from './checkout/RegisterCheckout.js';\nimport { RegisterItem } from './checkout/RegisterItem.js';\nexport class PlatformFamily {\n    constructor(context) {\n        this.members = [];\n        this.documents = [];\n        /**\n         * Checkout is required for the member to know whether certain fields are required to get collected\n         */\n        this.checkout = new RegisterCheckout();\n        /**\n         * Items that have not been added to the cart/checkout, but will be - and for which data has to be collected\n         */\n        this.pendingRegisterItems = [];\n        this.organizations = [];\n        this.platform = context.platform;\n        this.organizations = context.contextOrganization ? [context.contextOrganization] : [];\n    }\n    insertOrganization(organization) {\n        const existing = this.organizations.find(o => o.id === organization.id);\n        if (existing) {\n            // Deep set, because this might be the context organization\n            if (existing !== organization) {\n                existing.deepSet(organization);\n            }\n            return;\n        }\n        this.organizations.push(organization);\n    }\n    getOrganization(id) {\n        return this.organizations.find(o => o.id === id);\n    }\n    static create(blob, context) {\n        const family = new PlatformFamily(context);\n        family.insertFromBlob(blob);\n        return family;\n    }\n    insertFromBlob(blob, removeMissing = false) {\n        for (const organization of blob.organizations) {\n            this.insertOrganization(organization);\n        }\n        for (const member of blob.members) {\n            const existing = this.members.find(m => m.id === member.id);\n            if (existing) {\n                existing.member.deepSet(member);\n                continue;\n            }\n            const platformMember = new PlatformMember({\n                member,\n                family: this,\n            });\n            this.members.push(platformMember);\n        }\n        if (removeMissing) {\n            // Keep same array reference\n            deepSetArray(this.members, this.members.filter(m => blob.members.find(b => b.id === m.id)));\n        }\n    }\n    /**\n     * Update multiple members if you don't have a family reference (or multiple families)\n     */\n    static updateFromBlob(members, blob) {\n        const passedFamilies = new Set();\n        for (const member of members) {\n            if (passedFamilies.has(member.family)) {\n                continue;\n            }\n            member.family.updateFromBlob(blob);\n            passedFamilies.add(member.family);\n        }\n    }\n    /**\n     * Same as insertFromBlob, but doesn't add new members, only updates existing members\n     */\n    updateFromBlob(blob) {\n        for (const organization of blob.organizations) {\n            this.insertOrganization(organization);\n        }\n        for (const member of blob.members) {\n            const existing = this.members.find(m => m.id === member.id);\n            if (existing) {\n                existing.member.deepSet(member);\n            }\n        }\n    }\n    newMember() {\n        const member = new PlatformMember({\n            member: MemberWithRegistrationsBlob.create({\n                details: MemberDetails.create({}),\n                users: [],\n                registrations: [],\n            }),\n            family: this,\n            isNew: true,\n        });\n        this.members.push(member);\n        return member;\n    }\n    static createSingles(blob, context) {\n        const memberList = [];\n        for (const member of blob.members) {\n            const family = new PlatformFamily(context);\n            for (const organization of blob.organizations) {\n                // Check if this organization is relevant to this member\n                if (member.registrations.find(r => r.organizationId === organization.id) || member.platformMemberships.find(m => m.organizationId === organization.id) || member.responsibilities.find(r => r.organizationId === organization.id)) {\n                    family.insertOrganization(organization);\n                }\n            }\n            const platformMember = new PlatformMember({\n                member,\n                family,\n            });\n            family.members.push(platformMember);\n            memberList.push(platformMember);\n        }\n        return memberList;\n    }\n    insertSingle(member) {\n        const platformMember = new PlatformMember({\n            member,\n            family: this,\n        });\n        this.members.push(platformMember);\n        return platformMember;\n    }\n    /**\n     * These clones are for patches so they only become visible after saving\n     */\n    clone() {\n        const family = new PlatformFamily({\n            platform: this.platform,\n        });\n        family.organizations = this.organizations;\n        family.checkout = this.checkout;\n        family.pendingRegisterItems = this.pendingRegisterItems;\n        family.members = this.members.map(m => m._cloneWithFamily(family));\n        return family;\n    }\n    copyFromClone(clone) {\n        var _a;\n        for (const member of this.members) {\n            const cloneMember = (_a = clone.members.find(m => m.id === member.id)) !== null && _a !== void 0 ? _a : clone.members.find(m => m._oldId && m._oldId === member.id);\n            if (cloneMember) {\n                member.member.deepSet(cloneMember.member);\n                member.patch.deepSet(cloneMember.patch);\n                member.patch.id = member.id;\n                member.isNew = cloneMember.isNew;\n                member._oldId = cloneMember._oldId;\n                if (cloneMember._savingPatch || cloneMember._isCreating) {\n                    console.warn('Copying from member that is being saved');\n                }\n            }\n            else {\n                console.warn('copyFromClone could not find member with id', member.id, 'in clone.');\n            }\n        }\n        for (const c of clone.members) {\n            const member = this.members.find(m => m.id === c.id);\n            if (!member) {\n                this.members.push(c._cloneWithFamily(this));\n            }\n        }\n        // Delete members that are not in the clone\n        this.members = this.members.filter(m => clone.members.find(c => c.id === m.id));\n        for (const o of clone.organizations) {\n            this.insertOrganization(o);\n        }\n    }\n    getAddressOccurrences(address, skip) {\n        const occurrences = new Set();\n        const searchString = address.toString();\n        for (const member of this.members) {\n            if (member.patchedMember.details.address) {\n                if (!(skip === null || skip === void 0 ? void 0 : skip.memberId) || member.id !== (skip === null || skip === void 0 ? void 0 : skip.memberId)) {\n                    if (member.patchedMember.details.address.toString() === searchString) {\n                        occurrences.add(member.patchedMember.details.name);\n                    }\n                }\n            }\n            for (const parent of member.patchedMember.details.parents) {\n                if (parent.address) {\n                    if (!(skip === null || skip === void 0 ? void 0 : skip.parentId) || parent.id !== (skip === null || skip === void 0 ? void 0 : skip.parentId)) {\n                        if (parent.address.toString() === searchString) {\n                            occurrences.add(parent.name);\n                        }\n                    }\n                }\n            }\n        }\n        return Array.from(occurrences.values());\n    }\n    getAddressesWithoutPatches(skip) {\n        const addresses = new Map();\n        for (const member of this.members) {\n            if (member.member.details.address) {\n                addresses.set(member.member.details.address.toString(), member.member.details.address);\n            }\n            if (!skip.memberId || member.id !== skip.memberId) {\n                if (member.patchedMember.details.address) {\n                    addresses.set(member.patchedMember.details.address.toString(), member.patchedMember.details.address);\n                }\n            }\n            for (const parent of member.member.details.parents) {\n                if (parent.address) {\n                    addresses.set(parent.address.toString(), parent.address);\n                }\n            }\n            for (const parent of member.patchedMember.details.parents) {\n                if (!skip.parentId || parent.id !== skip.parentId) {\n                    if (parent.address) {\n                        addresses.set(parent.address.toString(), parent.address);\n                    }\n                }\n            }\n            for (const unverifiedAddress of member.member.details.unverifiedAddresses) {\n                addresses.set(unverifiedAddress.toString(), unverifiedAddress);\n            }\n        }\n        return Array.from(addresses.values());\n    }\n    get addresses() {\n        const addresses = new Map();\n        for (const member of this.members) {\n            if (member.member.details.address) {\n                addresses.set(member.member.details.address.toString(), member.member.details.address);\n            }\n            if (member.patchedMember.details.address) {\n                addresses.set(member.patchedMember.details.address.toString(), member.patchedMember.details.address);\n            }\n            for (const parent of member.member.details.parents) {\n                if (parent.address) {\n                    addresses.set(parent.address.toString(), parent.address);\n                }\n            }\n            for (const parent of member.patchedMember.details.parents) {\n                if (parent.address) {\n                    addresses.set(parent.address.toString(), parent.address);\n                }\n            }\n            for (const unverifiedAddress of member.member.details.unverifiedAddresses) {\n                addresses.set(unverifiedAddress.toString(), unverifiedAddress);\n            }\n        }\n        return Array.from(addresses.values());\n    }\n    get parents() {\n        if (!this.members) {\n            return [];\n        }\n        const parents = new Map();\n        for (const member of this.members) {\n            for (const parent of member.patchedMember.details.parents) {\n                parents.set(parent.id, parent);\n            }\n        }\n        return Array.from(parents.values());\n    }\n    /**\n     * Change all references to an address to a new address\n     */\n    updateAddress(oldValue, newValue) {\n        for (const member of this.members) {\n            const patch = member.patchedMember.details.updateAddressPatch(oldValue, newValue);\n            if (patch !== null) {\n                member.addDetailsPatch(patch);\n            }\n        }\n    }\n    /// Update all references to this parent (with same id)\n    patchParent(parent) {\n        for (const member of this.members) {\n            if (member.patchedMember.details.parents.find(p => p.id === parent.id)) {\n                member.patchParent(parent);\n            }\n        }\n    }\n    getMembersForParent(parent) {\n        return this.members.filter(m => m.patchedMember.details.parents.find(p => p.id === parent.id));\n    }\n    patchEmergencyContact(emergencyContact) {\n        for (const member of this.members) {\n            if (member.patchedMember.details.emergencyContacts.find(p => p.id === emergencyContact.id)) {\n                member.patchEmergencyContact(emergencyContact);\n            }\n        }\n    }\n    getRecommendedEventsFilter() {\n        const filter = [];\n        const groups = new Set();\n        const defaultGroupIds = new Set();\n        const organizationIds = new Set();\n        const organizationTags = new Set();\n        for (const member of this.members) {\n            for (const group of member.filterGroups({ types: [GroupType.Membership], currentPeriod: true, includePending: false })) {\n                groups.add(group.id);\n                if (group.defaultAgeGroupId) {\n                    defaultGroupIds.add(group.defaultAgeGroupId);\n                }\n                organizationIds.add(group.organizationId);\n                const organization = this.organizations.find(o => o.id === group.organizationId);\n                if (organization) {\n                    for (const tag of organization.meta.tags) {\n                        organizationTags.add(tag);\n                    }\n                }\n            }\n        }\n        filter.push({\n            groupIds: {\n                $in: [null, ...groups.values()],\n            },\n            defaultAgeGroupIds: {\n                $in: [null, ...defaultGroupIds.values()],\n            },\n            organizationId: {\n                $in: [null, ...organizationIds.values()],\n            },\n            organizationTagIds: {\n                $in: [null, ...organizationTags.values()],\n            },\n        });\n        return filter;\n    }\n    deleteMember(id) {\n        this.members = this.members.filter(m => m.id !== id);\n    }\n    setDocuments(documents) {\n        this.documents = documents;\n    }\n}\nexport var MembershipStatus;\n(function (MembershipStatus) {\n    MembershipStatus[\"Active\"] = \"Active\";\n    MembershipStatus[\"Trial\"] = \"Trial\";\n    MembershipStatus[\"Expiring\"] = \"Expiring\";\n    MembershipStatus[\"Inactive\"] = \"Inactive\";\n    MembershipStatus[\"Temporary\"] = \"Temporary\";\n})(MembershipStatus || (MembershipStatus = {}));\nexport class PlatformMember {\n    get id() {\n        return this.member.id;\n    }\n    constructor(data) {\n        var _a, _b;\n        // Save status data:\n        this._savingPatch = null;\n        this._isCreating = null;\n        /**\n         * In case this was a duplicate member, we need to keep track of the old id to merge changes\n         */\n        this._oldId = null;\n        this.isNew = false;\n        this.member = data.member;\n        this.patch = (_a = data.patch) !== null && _a !== void 0 ? _a : MemberWithRegistrationsBlob.patch({ id: this.member.id });\n        this.family = data.family;\n        this.isNew = (_b = data.isNew) !== null && _b !== void 0 ? _b : false;\n    }\n    clone() {\n        const family = this.family.clone();\n        return family.members.find(m => m.id === this.id);\n    }\n    _cloneWithFamily(family) {\n        const c = new PlatformMember({\n            member: this.member.clone(),\n            family,\n            isNew: this.isNew,\n            patch: this.patch.clone(),\n        });\n        c._oldId = this._oldId;\n        return c;\n    }\n    get organizations() {\n        return this.family.organizations;\n    }\n    get platform() {\n        return this.family.platform;\n    }\n    get allGroups() {\n        return this.organizations.flatMap(o => o.groups);\n    }\n    get isSaving() {\n        return this._savingPatch !== null || this._isCreating !== null;\n    }\n    get membershipStatus() {\n        let status = MembershipStatus.Inactive;\n        const now = new Date();\n        for (const t of this.patchedMember.platformMemberships) {\n            const organization = this.organizations.find(o => o.id === t.organizationId);\n            if (!organization) {\n                continue;\n            }\n            if (t.endDate && t.endDate < now) {\n                continue;\n            }\n            if (t.startDate > now) {\n                continue;\n            }\n            if (t.expireDate && t.expireDate < now) {\n                if (status === MembershipStatus.Inactive) {\n                    status = MembershipStatus.Expiring;\n                }\n                continue;\n            }\n            const isTemporary = t.endDate.getTime() - t.startDate.getTime() < 1000 * 60 * 60 * 24 * 31;\n            if (status === MembershipStatus.Inactive || ((status === MembershipStatus.Expiring || status === MembershipStatus.Temporary) && !isTemporary)) {\n                if (isTemporary) {\n                    status = MembershipStatus.Temporary;\n                }\n                else {\n                    if (t.trialUntil && t.trialUntil > now) {\n                        status = MembershipStatus.Trial;\n                    }\n                    else {\n                        status = MembershipStatus.Active;\n                        break;\n                    }\n                }\n            }\n        }\n        return status;\n    }\n    get shouldApplyReducedPrice() {\n        return this.patchedMember.details.shouldApplyReducedPrice;\n    }\n    addPatch(p) {\n        this.patch = this.patch.patch(MemberWithRegistrationsBlob.patch(p));\n    }\n    addEmergencyContact(emergencyContact) {\n        const arr = new PatchableArray();\n        arr.addPut(emergencyContact);\n        this.addDetailsPatch({\n            emergencyContacts: arr,\n        });\n    }\n    patchEmergencyContact(emergencyContact) {\n        const arr = new PatchableArray();\n        arr.addPatch(emergencyContact);\n        this.addDetailsPatch({\n            emergencyContacts: arr,\n        });\n    }\n    addParent(parent) {\n        const arr = new PatchableArray();\n        arr.addPut(parent);\n        this.addDetailsPatch({\n            parents: arr,\n        });\n    }\n    patchParent(parent) {\n        const arr = new PatchableArray();\n        arr.addPatch(parent);\n        this.addDetailsPatch({\n            parents: arr,\n        });\n    }\n    addDetailsPatch(p) {\n        this.addPatch({\n            details: MemberDetails.patch(p),\n        });\n    }\n    isPropertyEnabledForPlatform(property) {\n        var _a;\n        if ((property === 'financialSupport' || property === 'uitpasNumber')\n            && ((_a = this.patchedMember.details.dataPermissions) === null || _a === void 0 ? void 0 : _a.value) === false) {\n            return false;\n        }\n        if (property === 'dataPermission' || property === 'financialSupport') {\n            if (this.platform.config.recordsConfiguration[property]) {\n                return true;\n            }\n            return false;\n        }\n        if (property === 'parents.nationalRegisterNumber') {\n            if (this.patchedMember.details.nationalRegisterNumber === NationalRegisterNumberOptOut) {\n                return false;\n            }\n            property = 'nationalRegisterNumber';\n        }\n        const def = this.platform.config.recordsConfiguration[property];\n        if (def === null) {\n            return false;\n        }\n        return def.isEnabled(this);\n    }\n    isPropertyEnabled(property, options) {\n        var _a, _b, _c, _d, _e;\n        if (property === 'parents.nationalRegisterNumber') {\n            if (this.patchedMember.details.nationalRegisterNumber === NationalRegisterNumberOptOut) {\n                return false;\n            }\n            property = 'nationalRegisterNumber';\n        }\n        if ((property === 'financialSupport' || property === 'uitpasNumber')\n            && ((_a = this.patchedMember.details.dataPermissions) === null || _a === void 0 ? void 0 : _a.value) === false) {\n            return false;\n        }\n        if ((options === null || options === void 0 ? void 0 : options.checkPermissions) && (property === 'financialSupport' || property === 'uitpasNumber')) {\n            const isUserManager = options.checkPermissions.user.members.members.some(m => m.id === this.id);\n            if (!isUserManager) {\n                // Need permission to view financial support\n                let foundPermissions = false;\n                for (const organization of this.filterOrganizations({ currentPeriod: (options === null || options === void 0 ? void 0 : options.scopeGroups) ? undefined : true, groups: options === null || options === void 0 ? void 0 : options.scopeGroups })) {\n                    if ((_c = (_b = options.checkPermissions.user.permissions) === null || _b === void 0 ? void 0 : _b.forOrganization(organization, Platform.shared)) === null || _c === void 0 ? void 0 : _c.hasAccessRight(options.checkPermissions.level === PermissionLevel.Read ? AccessRight.MemberReadFinancialData : AccessRight.MemberWriteFinancialData)) {\n                        foundPermissions = true;\n                        break;\n                    }\n                }\n                if (!foundPermissions) {\n                    return false;\n                }\n            }\n        }\n        if ((options === null || options === void 0 ? void 0 : options.checkPermissions) && (property === 'nationalRegisterNumber')) {\n            const isUserManager = options.checkPermissions.user.members.members.some(m => m.id === this.id);\n            if (!isUserManager) {\n                // Need permission to view financial support\n                let foundPermissions = false;\n                for (const organization of this.filterOrganizations({ currentPeriod: (options === null || options === void 0 ? void 0 : options.scopeGroups) ? undefined : true, groups: options === null || options === void 0 ? void 0 : options.scopeGroups })) {\n                    if ((_e = (_d = options.checkPermissions.user.permissions) === null || _d === void 0 ? void 0 : _d.forOrganization(organization, Platform.shared)) === null || _e === void 0 ? void 0 : _e.hasAccessRight(AccessRight.MemberManageNRN)) {\n                        foundPermissions = true;\n                        break;\n                    }\n                }\n                if (!foundPermissions) {\n                    return false;\n                }\n            }\n        }\n        if (this.isPropertyEnabledForPlatform(property)) {\n            return true;\n        }\n        const recordsConfigurations = this.filterRecordsConfigurations({ currentPeriod: (options === null || options === void 0 ? void 0 : options.scopeGroups) ? undefined : true, groups: options === null || options === void 0 ? void 0 : options.scopeGroups });\n        for (const recordsConfiguration of recordsConfigurations) {\n            if (property === 'dataPermission' || property === 'financialSupport') {\n                if (recordsConfiguration[property]) {\n                    return true;\n                }\n                continue;\n            }\n            const def = recordsConfiguration[property];\n            if (def === null) {\n                continue;\n            }\n            if (def.enabledWhen === null) {\n                return true;\n            }\n            if (this.doesMatchFilter(def.enabledWhen)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    isPropertyRequiredForPlatform(property) {\n        if (!this.isPropertyEnabledForPlatform(property)) {\n            return false;\n        }\n        if (property === 'parents.nationalRegisterNumber') {\n            if (this.patchedMember.details.nationalRegisterNumber === NationalRegisterNumberOptOut) {\n                return false;\n            }\n            property = 'nationalRegisterNumber';\n        }\n        const def = this.platform.config.recordsConfiguration[property];\n        if (typeof def === 'boolean') {\n            return def;\n        }\n        if (def === null) {\n            return false;\n        }\n        return def.isRequired(this);\n    }\n    isPropertyRequired(property, options) {\n        if (!this.isPropertyEnabled(property, options)) {\n            return false;\n        }\n        if (property === 'parents.nationalRegisterNumber') {\n            property = 'nationalRegisterNumber';\n        }\n        if (property === 'nationalRegisterNumber' && this.patchedMember.details.nationalRegisterNumber === NationalRegisterNumberOptOut) {\n            // Not required for parents or member itself\n            return false;\n        }\n        const recordsConfigurations = this.filterRecordsConfigurations({ currentPeriod: (options === null || options === void 0 ? void 0 : options.scopeGroups) ? undefined : true, groups: options === null || options === void 0 ? void 0 : options.scopeGroups });\n        for (const recordsConfiguration of recordsConfigurations) {\n            const def = recordsConfiguration[property];\n            if (typeof def === 'boolean') {\n                if (def === true) {\n                    return def;\n                }\n                continue;\n            }\n            if (def === null) {\n                continue;\n            }\n            if (def.isRequired(this)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    prepareSave() {\n        this._savingPatch = this.patch;\n        this.patch = MemberWithRegistrationsBlob.patch({ id: this.member.id });\n        this._isCreating = this.isNew;\n        this.isNew = false;\n    }\n    markSaved() {\n        if (this._isCreating === true) {\n            this.isNew = false;\n        }\n        this._savingPatch = null;\n        this._isCreating = null;\n    }\n    markFailedSave() {\n        if (this._savingPatch) {\n            this.patch = this._savingPatch.patch(this.patch);\n            this._savingPatch = null;\n        }\n        if (this._isCreating !== null) {\n            this.isNew = this._isCreating;\n            this._isCreating = null;\n        }\n    }\n    /**\n     *\n     * @param filters\n     * @param filters.groups - Only show registrations for these groups\n     * @param filters.groupIds - Only show registrations for these group ids\n     * @param filters.canRegister - Only show registrations for which the member can register\n     * @param filters.periodId - Only show registrations for this period\n     * @param filters.currentPeriod - Only show registrations for the current period\n     * @param filters.includeFuture - Used in combination with currentPeriod. If true, also show registrations that start in the future. Defaults to true.\n     * @param filters.types - Only show registrations for these group types\n     * @param filters.organizationId - Only show registrations for this organization\n     * @returns\n     */\n    filterRegistrations(filters) {\n        return this.patchedMember.registrations.filter((r) => {\n            var _a;\n            if (r.registeredAt === null || r.deactivatedAt !== null) {\n                return false;\n            }\n            if (filters.organizationId && r.organizationId !== filters.organizationId) {\n                return false;\n            }\n            if (filters.types !== undefined) {\n                if (!filters.types.includes(r.group.type)) {\n                    return false;\n                }\n            }\n            if (filters.groups && !filters.groups.find(g => g.id === r.groupId)) {\n                return false;\n            }\n            if (filters.groupIds && !filters.groupIds.includes(r.groupId)) {\n                return false;\n            }\n            if (filters.currentPeriod !== undefined) {\n                const organization = this.organizations.find(o => o.id === r.organizationId);\n                const isCurrentPeriod = !!organization && r.group.periodId === organization.period.period.id;\n                if (isCurrentPeriod !== filters.currentPeriod) {\n                    if (!((_a = filters.includeFuture) !== null && _a !== void 0 ? _a : true) || r.group.settings.endDate < new Date()) {\n                        return false;\n                    }\n                }\n            }\n            if (filters.periodId && r.group.periodId !== filters.periodId) {\n                return false;\n            }\n            if (filters.canRegister !== undefined && r.canRegister !== filters.canRegister) {\n                return false;\n            }\n            return true;\n        });\n    }\n    filterGroups(filters) {\n        const registrations = this.filterRegistrations(filters);\n        const base = [];\n        for (const registration of registrations) {\n            if (base.find(g => g.id === registration.groupId)) {\n                continue;\n            }\n            base.push(registration.group);\n        }\n        // Loop checkout\n        for (const item of [...this.family.checkout.cart.items, ...(filters.includePending ? this.family.pendingRegisterItems : [])]) {\n            if (item.member.id === this.id) {\n                if (filters.currentPeriod === false) {\n                    continue;\n                }\n                if (filters.periodId && item.group.periodId !== filters.periodId) {\n                    continue;\n                }\n                if (filters.canRegister !== undefined) {\n                    continue;\n                }\n                if (filters.organizationId !== undefined) {\n                    if (item.organization.id !== filters.organizationId) {\n                        continue;\n                    }\n                }\n                if (!base.find(g => g.id === item.group.id)) {\n                    base.push(item.group);\n                }\n            }\n        }\n        return base;\n    }\n    filterRecordsConfigurations(filters) {\n        const groups = this.filterGroups({ ...filters, includePending: true });\n        const configurations = [];\n        for (const group of groups) {\n            const organization = this.family.getOrganization(group.organizationId);\n            if (!organization) {\n                continue;\n            }\n            configurations.push(OrganizationRecordsConfiguration.build({\n                platform: this.platform,\n                organization,\n                group,\n                includeGroup: true,\n            }));\n        }\n        if (groups.length === 0) {\n            configurations.push(OrganizationRecordsConfiguration.build({\n                platform: this.platform,\n            }));\n        }\n        return configurations;\n    }\n    filterOrganizations(filters) {\n        const registrations = this.filterRegistrations(filters);\n        const base = [];\n        for (const registration of registrations) {\n            if (base.find(g => g.id === registration.organizationId)) {\n                continue;\n            }\n            const organization = this.organizations.find(o => o.id === registration.organizationId);\n            if (organization) {\n                base.push(organization);\n            }\n        }\n        // Loop checkout\n        for (const item of [...this.family.checkout.cart.items, ...this.family.pendingRegisterItems]) {\n            if (item.member.id === this.id) {\n                if (filters.currentPeriod === false) {\n                    continue;\n                }\n                if (filters.periodId && item.group.periodId !== filters.periodId) {\n                    continue;\n                }\n                if (filters.canRegister !== undefined) {\n                    continue;\n                }\n                if (filters.types !== undefined) {\n                    if (!filters.types.includes(item.group.type)) {\n                        continue;\n                    }\n                }\n                if (!base.find(g => g.id === item.organization.id)) {\n                    base.push(item.organization);\n                }\n            }\n        }\n        // Loop responsibilities\n        if (filters.withResponsibilities) {\n            for (const responsibility of this.patchedMember.responsibilities) {\n                if (!responsibility.isActive) {\n                    continue;\n                }\n                if (base.find(g => g.id === responsibility.organizationId)) {\n                    continue;\n                }\n                const organization = this.organizations.find(o => o.id === responsibility.organizationId);\n                if (organization) {\n                    base.push(organization);\n                }\n            }\n        }\n        return base;\n    }\n    get groups() {\n        return this.filterGroups({ currentPeriod: true, includePending: false });\n    }\n    insertOrganization(organization) {\n        this.family.insertOrganization(organization);\n    }\n    canRegister(group, organization) {\n        const item = RegisterItem.defaultFor(this, group, organization);\n        const error = item.validationError;\n        if (error === null) {\n            return true;\n        }\n        return false;\n    }\n    canRegisterForWaitingList(group, organization) {\n        const item = RegisterItem.defaultFor(this, group, organization);\n        const error = item.validationErrorForWaitingList;\n        if (error === null) {\n            return true;\n        }\n        return false;\n    }\n    get patchedMember() {\n        if (this._savingPatch) {\n            return this.member.patch(this._savingPatch).patch(this.patch);\n        }\n        return this.member.patch(this.patch);\n    }\n    doesMatchFilter(filter) {\n        return this.patchedMember.doesMatchFilter(filter);\n    }\n    getAllRecordCategories() {\n        // From organization\n        const categories = [];\n        categories.push(...this.platform.config.recordsConfiguration.recordCategories);\n        for (const organization of this.organizations) {\n            categories.push(...organization.meta.recordsConfiguration.recordCategories);\n        }\n        return categories;\n    }\n    getEnabledRecordCategories(options) {\n        var _a, _b, _c, _d;\n        const checkPermissions = options.checkPermissions;\n        const isUserManager = (_b = (_a = options.checkPermissions) === null || _a === void 0 ? void 0 : _a.user.members.members.some(m => m.id === this.id)) !== null && _b !== void 0 ? _b : false;\n        if (!isUserManager && (checkPermissions && !checkPermissions.user.permissions)) {\n            return [];\n        }\n        // From organization\n        const categories = [];\n        const scopedOrganizations = options.scopeOrganization ? [options.scopeOrganization] : this.filterOrganizations({ currentPeriod: true });\n        const recordsConfigurations = this.filterRecordsConfigurations({\n            currentPeriod: (options.scopeGroups || options.scopeGroup) ? undefined : true,\n            groups: options.scopeGroups ? options.scopeGroups : (options.scopeGroup ? [options.scopeGroup] : null),\n            organizationId: (_d = (_c = options.scopeOrganization) === null || _c === void 0 ? void 0 : _c.id) !== null && _d !== void 0 ? _d : undefined,\n        });\n        for (const recordsConfiguration of recordsConfigurations) {\n            for (const recordCategory of recordsConfiguration.recordCategories) {\n                if (categories.find(c => c.id === recordCategory.id)) {\n                    // Already added\n                    continue;\n                }\n                if (recordCategory.isEnabled(this)) {\n                    if (checkPermissions) {\n                        let hasUserManagerPermissions = false;\n                        let hasAdminPermissions = false;\n                        if (isUserManager) {\n                            hasUserManagerPermissions = recordCategory.checkPermissionForUserManager(checkPermissions.level);\n                        }\n                        if (checkPermissions.user.permissions) {\n                            // Check permissions\n                            // we need at least permission in one organization\n                            for (const organization of scopedOrganizations) {\n                                const organizationPermissions = checkPermissions.user.permissions.forOrganization(organization, Platform.shared);\n                                if (!organizationPermissions) {\n                                    continue;\n                                }\n                                if (organizationPermissions.hasResourceAccess(PermissionsResourceType.RecordCategories, recordCategory.id, checkPermissions.level)) {\n                                    hasAdminPermissions = true;\n                                    break;\n                                }\n                            }\n                        }\n                        if (!hasUserManagerPermissions && !hasAdminPermissions) {\n                            continue;\n                        }\n                    }\n                    categories.push(recordCategory);\n                }\n            }\n        }\n        return categories;\n    }\n    isExistingMember(organizationId) {\n        const member = this.member;\n        if (member.registrations.length === 0) {\n            return false;\n        }\n        const organization = this.organizations.find(o => o.id === organizationId);\n        if (!organization) {\n            return false;\n        }\n        for (const registration of member.registrations) {\n            if (registration.group.type === GroupType.Membership && registration.registeredAt !== null && registration.deactivatedAt === null) {\n                return true;\n            }\n        }\n        return false;\n    }\n    isRecordEnabled(record) {\n        var _a;\n        if (record.sensitive && ((_a = this.patchedMember.details.dataPermissions) === null || _a === void 0 ? void 0 : _a.value) === false) {\n            return false;\n        }\n        return true;\n    }\n    getRecordAnswers() {\n        return this.patchedMember.details.recordAnswers;\n    }\n    patchRecordAnswers(patch) {\n        const cloned = this.clone();\n        cloned.addDetailsPatch(MemberDetails.patch({\n            recordAnswers: patch,\n        }));\n        return cloned;\n    }\n    getResponsibilities(filter) {\n        return this.patchedMember.responsibilities\n            .filter(r => r.isActive && ((filter === null || filter === void 0 ? void 0 : filter.organization) === undefined || (filter.organization ? r.organizationId === filter.organization.id : r.organizationId === null)));\n    }\n}\n//# sourceMappingURL=PlatformMember.js.map","export var LegacyRecordType;\n(function (LegacyRecordType) {\n    // Privacy\n    LegacyRecordType[\"DataPermissions\"] = \"DataPermissions\";\n    LegacyRecordType[\"PicturePermissions\"] = \"PicturePermissions\";\n    LegacyRecordType[\"GroupPicturePermissions\"] = \"GroupPicturePermissions\";\n    // Allergies & diet\n    LegacyRecordType[\"FoodAllergies\"] = \"FoodAllergies\";\n    LegacyRecordType[\"MedicineAllergies\"] = \"MedicineAllergies\";\n    LegacyRecordType[\"HayFever\"] = \"HayFever\";\n    LegacyRecordType[\"OtherAllergies\"] = \"OtherAllergies\";\n    // Diet\n    LegacyRecordType[\"Vegetarian\"] = \"Vegetarian\";\n    LegacyRecordType[\"Vegan\"] = \"Vegan\";\n    LegacyRecordType[\"Halal\"] = \"Halal\";\n    LegacyRecordType[\"Kosher\"] = \"Kosher\";\n    LegacyRecordType[\"Diet\"] = \"Diet\";\n    // Medicines\n    LegacyRecordType[\"MedicinePermissions\"] = \"MedicinePermissions\";\n    LegacyRecordType[\"TetanusVaccine\"] = \"TetanusVaccine\";\n    // Health, hygiene and sleep\n    LegacyRecordType[\"CovidHighRisk\"] = \"CovidHighRisk\";\n    LegacyRecordType[\"Asthma\"] = \"Asthma\";\n    LegacyRecordType[\"BedWaters\"] = \"BedWaters\";\n    LegacyRecordType[\"Epilepsy\"] = \"Epilepsy\";\n    LegacyRecordType[\"HeartDisease\"] = \"HeartDisease\";\n    LegacyRecordType[\"SkinCondition\"] = \"SkinCondition\";\n    LegacyRecordType[\"Rheumatism\"] = \"Rheumatism\";\n    LegacyRecordType[\"SleepWalking\"] = \"SleepWalking\";\n    LegacyRecordType[\"Diabetes\"] = \"Diabetes\";\n    LegacyRecordType[\"SpecialHealthCare\"] = \"SpecialHealthCare\";\n    // Medicines\n    LegacyRecordType[\"Medicines\"] = \"Medicines\";\n    // Sport, games, social\n    LegacyRecordType[\"CanNotSwim\"] = \"CanNotSwim\";\n    LegacyRecordType[\"TiredQuickly\"] = \"TiredQuickly\";\n    LegacyRecordType[\"CanNotParticipateInSport\"] = \"CanNotParticipateInSport\";\n    LegacyRecordType[\"SpecialSocialCare\"] = \"SpecialSocialCare\";\n    // Other\n    LegacyRecordType[\"Other\"] = \"Other\";\n    // Moved\n    LegacyRecordType[\"FinancialProblems\"] = \"FinancialProblems\";\n})(LegacyRecordType || (LegacyRecordType = {}));\n/**\n * We removed all the inverse records, because they are getting too complicated, to fast.\n * We've moved them away to seperate ones\n */\nexport var OldRecordType;\n(function (OldRecordType) {\n    // Privacy\n    OldRecordType[\"NoData\"] = \"NoData\";\n    OldRecordType[\"NoPictures\"] = \"NoPictures\";\n    OldRecordType[\"OnlyGroupPictures\"] = \"OnlyGroupPictures\";\n    // Diet\n    OldRecordType[\"Vegetarian\"] = \"Vegetarian\";\n    OldRecordType[\"Vegan\"] = \"Vegan\";\n    OldRecordType[\"Halal\"] = \"Halal\";\n    OldRecordType[\"Kosher\"] = \"Kosher\";\n    OldRecordType[\"Diet\"] = \"Diet\";\n    // Allergies & diet\n    OldRecordType[\"FoodAllergies\"] = \"FoodAllergies\";\n    OldRecordType[\"MedicineAllergies\"] = \"MedicineAllergies\";\n    OldRecordType[\"OtherAllergies\"] = \"OtherAllergies\";\n    // Medicines\n    OldRecordType[\"NoPermissionForMedicines\"] = \"NoPermissionForMedicines\";\n    // Health, hygiene and sleep\n    OldRecordType[\"HayFever\"] = \"HayFever\";\n    OldRecordType[\"Asthma\"] = \"Asthma\";\n    OldRecordType[\"BedWaters\"] = \"BedWaters\";\n    OldRecordType[\"Epilepsy\"] = \"Epilepsy\";\n    OldRecordType[\"HeartDisease\"] = \"HeartDisease\";\n    OldRecordType[\"SkinCondition\"] = \"SkinCondition\";\n    OldRecordType[\"Rheumatism\"] = \"Rheumatism\";\n    OldRecordType[\"SleepWalking\"] = \"SleepWalking\";\n    OldRecordType[\"Diabetes\"] = \"Diabetes\";\n    OldRecordType[\"SpecialHealthCare\"] = \"SpecialHealthCare\";\n    OldRecordType[\"Medicines\"] = \"Medicines\";\n    // Sport, games, social\n    OldRecordType[\"CanNotSwim\"] = \"CanNotSwim\";\n    OldRecordType[\"TiredQuickly\"] = \"TiredQuickly\";\n    OldRecordType[\"CanNotParticipateInSport\"] = \"CanNotParticipateInSport\";\n    OldRecordType[\"SpecialSocialCare\"] = \"SpecialSocialCare\";\n    OldRecordType[\"FinancialProblems\"] = \"FinancialProblems\";\n    // Other\n    OldRecordType[\"Other\"] = \"Other\";\n})(OldRecordType || (OldRecordType = {}));\nexport var LegacyRecordTypePriority;\n(function (LegacyRecordTypePriority) {\n    LegacyRecordTypePriority[\"High\"] = \"High\";\n    LegacyRecordTypePriority[\"Medium\"] = \"Medium\";\n    LegacyRecordTypePriority[\"Low\"] = \"Low\";\n})(LegacyRecordTypePriority || (LegacyRecordTypePriority = {}));\n//# sourceMappingURL=LegacyRecordType.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, EnumDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { LegacyRecordType, OldRecordType } from './LegacyRecordType.js';\n// Temporary fix for space in enum....\nclass TrimEnumDecoder {\n    constructor(e) {\n        this.enum = e;\n    }\n    decode(data) {\n        let str;\n        try {\n            str = data.string.trim();\n            if (Object.values(this.enum).includes(str)) {\n                return str;\n            }\n        }\n        catch (e) {\n            try {\n                str = data.number;\n                if (Object.values(this.enum).includes(str)) {\n                    return str;\n                }\n            }\n            catch (e2) {\n                throw new SimpleError({\n                    code: 'invalid_field',\n                    message: `Expected a number or string for enum: ` + Object.values(this.enum).join(', '),\n                    field: data.currentField,\n                });\n            }\n        }\n        throw new SimpleError({\n            code: 'invalid_field',\n            message: 'Unknown enum value ' + str + ' expected ' + Object.values(this.enum).join(', '),\n            field: data.currentField,\n        });\n    }\n}\nexport class LegacyRecord extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.description = '';\n    }\n}\n__decorate([\n    field({ decoder: new EnumDecoder(LegacyRecordType) })\n], LegacyRecord.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], LegacyRecord.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], LegacyRecord.prototype, \"author\", void 0);\n/**\n * @deprecated only used for migration. Keep here for at least one year or create a migration that runs in the clients and saves\n */\nexport class OldRecord extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.description = '';\n    }\n}\n__decorate([\n    field({ decoder: new TrimEnumDecoder(OldRecordType) }),\n    field({ decoder: new EnumDecoder(OldRecordType), version: 34 })\n], OldRecord.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], OldRecord.prototype, \"description\", void 0);\n//# sourceMappingURL=LegacyRecord.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, BooleanDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nexport class RegistrationPatch extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], RegistrationPatch.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], RegistrationPatch.prototype, \"groupId\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, optional: true })\n], RegistrationPatch.prototype, \"cycle\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, optional: true })\n], RegistrationPatch.prototype, \"waitingList\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, optional: true })\n], RegistrationPatch.prototype, \"canRegister\", void 0);\n//# sourceMappingURL=RegistrationPatch.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, BooleanDecoder, DateDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { Member } from './Member.js';\nexport class RegistrationWithEncryptedMember extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.registeredAt = null;\n        this.deactivatedAt = null;\n        this.waitingList = false;\n        this.canRegister = false;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], RegistrationWithEncryptedMember.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], RegistrationWithEncryptedMember.prototype, \"groupId\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], RegistrationWithEncryptedMember.prototype, \"cycle\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], RegistrationWithEncryptedMember.prototype, \"registeredAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], RegistrationWithEncryptedMember.prototype, \"deactivatedAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], RegistrationWithEncryptedMember.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], RegistrationWithEncryptedMember.prototype, \"updatedAt\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 16 })\n], RegistrationWithEncryptedMember.prototype, \"waitingList\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 20 })\n], RegistrationWithEncryptedMember.prototype, \"canRegister\", void 0);\n__decorate([\n    field({ decoder: Member })\n], RegistrationWithEncryptedMember.prototype, \"member\", void 0);\n//# sourceMappingURL=RegistrationWithEncryptedMember.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, DateDecoder, EnumDecoder, field, IntegerDecoder } from '@simonbackx/simple-encoding';\nexport var SortDirection;\n(function (SortDirection) {\n    SortDirection[\"Ascending\"] = \"Ascending\";\n    SortDirection[\"Descending\"] = \"Descending\";\n})(SortDirection || (SortDirection = {}));\n// todo: remove?\nexport class WebshopOrdersQuery extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: IntegerDecoder, optional: true })\n], WebshopOrdersQuery.prototype, \"afterNumber\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, optional: true })\n], WebshopOrdersQuery.prototype, \"updatedSince\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(SortDirection), optional: true })\n], WebshopOrdersQuery.prototype, \"sort\", void 0);\n//# sourceMappingURL=WebshopOrdersQuery.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, DateDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nexport class WebshopTicketsQuery extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], WebshopTicketsQuery.prototype, \"lastId\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, optional: true })\n], WebshopTicketsQuery.prototype, \"updatedSince\", void 0);\n//# sourceMappingURL=WebshopTicketsQuery.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, BooleanDecoder, DateDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { v4 as uuidv4 } from 'uuid';\nexport class STCredit extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Credits in cents\n         */\n        this.change = 0;\n        this.allowTransactions = false;\n        this.description = '';\n        this.createdAt = new Date();\n        this.expireAt = null;\n    }\n    static getBalance(credits) {\n        var _a;\n        return (_a = credits.slice().reverse().reduce((t, c) => {\n            if (c.expireAt !== null && c.expireAt < new Date()) {\n                return t;\n            }\n            const l = t + c.change;\n            if (l < 0) {\n                return 0;\n            }\n            return l;\n        }, 0)) !== null && _a !== void 0 ? _a : 0;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], STCredit.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], STCredit.prototype, \"change\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, optional: true })\n], STCredit.prototype, \"allowTransactions\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], STCredit.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], STCredit.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], STCredit.prototype, \"expireAt\", void 0);\n//# sourceMappingURL=STCredit.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, DateDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { Formatter, StringCompare } from '@stamhoofd/utility';\nimport { v4 as uuidv4 } from 'uuid';\nimport { Address } from '../addresses/Address.js';\nimport { File } from '../files/File.js';\nimport { Payment, Settlement } from '../members/Payment.js';\nimport { OrganizationSimple } from '../OrganizationSimple.js';\nimport { STPackage, STPricingType } from './STPackage.js';\nimport { Organization } from '../Organization.js';\nexport var STInvoiceStatus;\n(function (STInvoiceStatus) {\n    STInvoiceStatus[\"Created\"] = \"Created\";\n    STInvoiceStatus[\"Prepared\"] = \"Prepared\";\n    STInvoiceStatus[\"Completed\"] = \"Completed\";\n    STInvoiceStatus[\"Canceled\"] = \"Canceled\";\n})(STInvoiceStatus || (STInvoiceStatus = {}));\nexport class STInvoiceItemDetail extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], STInvoiceItemDetail.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], STInvoiceItemDetail.prototype, \"name\", void 0);\nexport class STInvoiceItem extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.description = '';\n        /**\n         * Allow to add a very detailed list of included items\n         */\n        this.details = [];\n        this.amount = 1;\n        this.unitPrice = 0;\n        this.canUseCredits = true;\n    }\n    get price() {\n        return this.unitPrice * this.amount;\n    }\n    /**\n     * Convertable into STInvoiceItem (or the diffence if amount is increased)\n     * Use this to calculate prices or create an invoice\n     * This will calculate the price to expand the package to the given amount.\n     * If you want to renew a package, you need to create a new package first\n     */\n    static fromPackage(pack, amount = 1, pendingAmount = 0, date) {\n        let unitPrice = Math.round(pack.meta.unitPrice);\n        if (amount < pack.meta.minimumAmount) {\n            // Minimum should get applied first, because we might already have paid for the minimum (paid amount)\n            amount = pack.meta.minimumAmount;\n        }\n        amount -= pendingAmount;\n        amount -= pack.meta.paidAmount;\n        if (amount <= 0) {\n            amount = 0;\n        }\n        /// When pricing type is memebrs, the price is calculated per year.\n        /// If a shorter period is remaining, we give a discount in order\n        /// to no need to handle it more complicated\n        let now = date !== null && date !== void 0 ? date : new Date();\n        if (now < pack.meta.startDate) {\n            // When creating a new package, we sometimes buy it for the future, so use that date instead of now\n            now = pack.meta.startDate;\n        }\n        if (pack.validUntil && pack.meta.pricingType !== STPricingType.Fixed) {\n            const totalDays = Math.round((pack.validUntil.getTime() - pack.meta.startDate.getTime()) / (1000 * 60 * 60 * 24));\n            let remainingDays = Math.round((pack.validUntil.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));\n            /// First 3 months are full price\n            const paidDays = 30 * 3;\n            if (remainingDays > totalDays) {\n                remainingDays = totalDays;\n            }\n            if (totalDays > 366) {\n                // Increase unit price\n                unitPrice = unitPrice * (totalDays / 365);\n            }\n            if (pack.meta.pricingType === STPricingType.PerMember) {\n                unitPrice = Math.round(Math.min(unitPrice, unitPrice * remainingDays / (Math.max(365, totalDays) - paidDays)));\n            }\n            else {\n                unitPrice = Math.round(unitPrice);\n            }\n        }\n        const item = STInvoiceItem.create({\n            name: pack.meta.name,\n            description: pack.validUntil ? ('Van ' + Formatter.date(now, true) + ' tot ' + Formatter.date(pack.validUntil, true)) : ('Vanaf ' + Formatter.date(pack.meta.startDate, true)),\n            package: pack,\n            date: now,\n            unitPrice: unitPrice,\n            amount: amount,\n        });\n        return item;\n    }\n    canMerge(other) {\n        // Mergeable if both don't have a packege, or both have the same package\n        if (other.package && !this.package) {\n            return false;\n        }\n        if (!other.package && this.package) {\n            return false;\n        }\n        if (other.package && this.package && other.package.id !== this.package.id) {\n            return false;\n        }\n        if (this.name === other.name) {\n            if (this.unitPrice === other.unitPrice && this.description === other.description) {\n                return true;\n            }\n        }\n        return false;\n    }\n    merge(other) {\n        this.amount += other.amount;\n        // Other package will be more up to date\n        this.package = other.package;\n        // Copy details\n        for (const detail of other.details) {\n            this.details.push(detail.clone());\n        }\n    }\n    /// Only compress an invoice when it is marked as paid and for a pending invoice when it doesn't has an invoice\n    /// Else you'll lose the ID's!\n    static compress(items) {\n        const copy = items.slice();\n        for (let index = 0; index < copy.length; index++) {\n            // Create a copy to prevent changing the original one\n            const item = STInvoiceItem.create(copy[index]);\n            copy[index] = item;\n            // Loop further (in reverse order to be able to delete items)\n            for (let j = copy.length - 1; j > index; j--) {\n                const other = copy[j];\n                if (item.canMerge(other)) {\n                    // Delete other\n                    item.merge(other);\n                    copy.splice(j, 1);\n                }\n            }\n        }\n        return copy;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], STInvoiceItem.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], STInvoiceItem.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], STInvoiceItem.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(STInvoiceItemDetail), version: 271 })\n], STInvoiceItem.prototype, \"details\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], STInvoiceItem.prototype, \"amount\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], STInvoiceItem.prototype, \"unitPrice\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 155 })\n], STInvoiceItem.prototype, \"canUseCredits\", void 0);\n__decorate([\n    field({ decoder: STPackage, optional: true })\n], STInvoiceItem.prototype, \"package\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, optional: true })\n], STInvoiceItem.prototype, \"date\", void 0);\nexport class STInvoiceMeta extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * VATPercentage should be zero in countries outside Belgium in EU\n         */\n        this.VATPercentage = 21;\n        this.items = [];\n        /**\n         * Sometimes we need to calculate an invoice in reverse when we have a fixed price including VAT,\n         * but need to calculatle the price excluding VAT.\n         */\n        this.areItemsIncludingVAT = false;\n        this.companyVATNumber = null;\n        this.companyNumber = null;\n        this.ipAddress = null;\n        this.userAgent = null;\n        this.stripeAccountId = null;\n    }\n    /**\n     * Depending on areItemsIncludingVAT, this can either be including or excluding VAT\n     */\n    get itemPrice() {\n        return this.items.reduce((price, item) => price + item.price, 0);\n    }\n    includingVATToExcludingVAT(price) {\n        // Always only round the VAT, not other prices\n        return price - this.getVATOnIncludingVATAmount(price);\n    }\n    excludingVATToIncludingVAT(price) {\n        // Always only round the VAT, not other prices\n        return price + this.getVATOnExcludingVATAmount(price);\n    }\n    getVATOnIncludingVATAmount(price) {\n        return Math.round(price * this.VATPercentage / (100 + this.VATPercentage));\n    }\n    getVATOnExcludingVATAmount(price) {\n        return Math.round(this.itemPrice * this.VATPercentage / 100);\n    }\n    get priceWithoutVAT() {\n        const itemPrice = this.itemPrice;\n        if (this.areItemsIncludingVAT) {\n            return itemPrice - this.VAT;\n        }\n        return itemPrice;\n    }\n    get VAT() {\n        if (this.areItemsIncludingVAT) {\n            // Subtract VAT and round\n            return this.getVATOnIncludingVATAmount(this.itemPrice);\n        }\n        return this.getVATOnExcludingVATAmount(this.itemPrice);\n    }\n    get priceWithVAT() {\n        const itemPrice = this.itemPrice;\n        if (this.areItemsIncludingVAT) {\n            return itemPrice;\n        }\n        return itemPrice + this.VAT;\n    }\n}\n__decorate([\n    field({ decoder: DateDecoder, optional: true })\n], STInvoiceMeta.prototype, \"date\", void 0);\n__decorate([\n    field({ decoder: File, optional: true })\n], STInvoiceMeta.prototype, \"pdf\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], STInvoiceMeta.prototype, \"VATPercentage\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(STInvoiceItem) })\n], STInvoiceMeta.prototype, \"items\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder, version: 186 })\n], STInvoiceMeta.prototype, \"areItemsIncludingVAT\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], STInvoiceMeta.prototype, \"companyName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], STInvoiceMeta.prototype, \"companyContact\", void 0);\n__decorate([\n    field({ decoder: Address })\n], STInvoiceMeta.prototype, \"companyAddress\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], STInvoiceMeta.prototype, \"companyVATNumber\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, optional: true })\n], STInvoiceMeta.prototype, \"companyNumber\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 133 })\n], STInvoiceMeta.prototype, \"ipAddress\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 133 })\n], STInvoiceMeta.prototype, \"userAgent\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 210 })\n], STInvoiceMeta.prototype, \"stripeAccountId\", void 0);\nexport class STInvoice extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.payment = null;\n        /**\n         * If the number is null, no invoice is generated yet. Its still a WIP invoice (not an official one!)\n         */\n        this.number = null;\n        this.createdAt = null;\n        this.updatedAt = null;\n        this.paidAt = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, defaultValue: () => uuidv4() })\n], STInvoice.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: Payment, nullable: true })\n], STInvoice.prototype, \"payment\", void 0);\n__decorate([\n    field({ decoder: STInvoiceMeta })\n], STInvoice.prototype, \"meta\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder, nullable: true })\n], STInvoice.prototype, \"number\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], STInvoice.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], STInvoice.prototype, \"updatedAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], STInvoice.prototype, \"paidAt\", void 0);\nexport class STInvoicePrivate extends STInvoice {\n    constructor() {\n        super(...arguments);\n        this.settlement = null;\n        this.reference = null;\n    }\n    matchQuery(query) {\n        var _a;\n        if (query === ((_a = this.number) === null || _a === void 0 ? void 0 : _a.toString()) || query === this.id) {\n            return true;\n        }\n        if (StringCompare.typoCount(this.meta.companyName, query) < 2\n            || StringCompare.typoCount(this.meta.companyAddress.city, query) < 2\n            || StringCompare.typoCount(this.meta.companyContact, query) < 2\n            || (this.meta.companyVATNumber && StringCompare.typoCount(this.meta.companyVATNumber, query) < 2)\n            || StringCompare.typoCount(this.meta.companyAddress.street, query) < 2) {\n            return true;\n        }\n        if (!this.organization) {\n            return false;\n        }\n        if (StringCompare.typoCount(this.organization.name, query) < 2\n            || StringCompare.typoCount(this.organization.address.city, query) < 2\n            || StringCompare.typoCount(this.organization.address.street, query) < 2\n            || StringCompare.typoCount(this.meta.companyName, query) < 2\n            || StringCompare.typoCount(this.meta.companyName, query) < 2) {\n            return true;\n        }\n        return false;\n    }\n}\n__decorate([\n    field({ decoder: Organization, optional: true })\n], STInvoicePrivate.prototype, \"organization\", void 0);\n__decorate([\n    field({ decoder: Settlement, nullable: true })\n], STInvoicePrivate.prototype, \"settlement\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 186 })\n], STInvoicePrivate.prototype, \"reference\", void 0);\nexport class STPendingInvoice extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.id = null;\n        this.invoice = null;\n        this.createdAt = null;\n        this.updatedAt = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, optional: true })\n], STPendingInvoice.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: STInvoiceMeta })\n], STPendingInvoice.prototype, \"meta\", void 0);\n__decorate([\n    field({ decoder: STInvoice, nullable: true })\n], STPendingInvoice.prototype, \"invoice\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], STPendingInvoice.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], STPendingInvoice.prototype, \"updatedAt\", void 0);\nexport class STPendingInvoicePrivate extends STPendingInvoice {\n}\n__decorate([\n    field({ decoder: OrganizationSimple, optional: true })\n], STPendingInvoicePrivate.prototype, \"organization\", void 0);\nexport class STInvoiceResponse extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], STInvoiceResponse.prototype, \"paymentUrl\", void 0);\n__decorate([\n    field({ decoder: STInvoice, optional: true })\n], STInvoiceResponse.prototype, \"invoice\", void 0);\n//# sourceMappingURL=STInvoice.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, field } from '@simonbackx/simple-encoding';\nimport { STCredit } from './STCredit.js';\nimport { STInvoice, STPendingInvoice } from './STInvoice.js';\nimport { STPackage } from './STPackage.js';\nexport class STBillingStatus extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(STInvoice) })\n], STBillingStatus.prototype, \"invoices\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(STPackage) })\n], STBillingStatus.prototype, \"packages\", void 0);\n__decorate([\n    field({ decoder: STPendingInvoice, nullable: true })\n], STBillingStatus.prototype, \"pendingInvoice\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(STCredit) })\n], STBillingStatus.prototype, \"credits\", void 0);\n//# sourceMappingURL=STBillingStatus.js.map","import { STPackage, STPackageMeta, STPackageType, STPricingType } from './STPackage.js';\n/**\n * Package bundle are packages that you can buy\n */\nexport var STPackageBundle;\n(function (STPackageBundle) {\n    // Full members package\n    STPackageBundle[\"Members\"] = \"Members\";\n    // Webshop package (max 10 webshops)\n    STPackageBundle[\"Webshops\"] = \"Webshops\";\n    // One webshop package (max 1 webshop)\n    STPackageBundle[\"SingleWebshop\"] = \"SingleWebshop\";\n    STPackageBundle[\"TrialMembers\"] = \"TrialMembers\";\n    STPackageBundle[\"TrialWebshops\"] = \"TrialWebshops\";\n})(STPackageBundle || (STPackageBundle = {}));\nexport class STPackageBundleHelper {\n    static getTitle(bundle) {\n        switch (bundle) {\n            case STPackageBundle.Members: return 'Ledenadministratie voor één jaar';\n            case STPackageBundle.Webshops: return 'Webshops (max. 10) voor één jaar';\n            case STPackageBundle.SingleWebshop: return 'Eén webshop voor twee maanden';\n        }\n        return '?';\n    }\n    static getDescription(bundle) {\n        switch (bundle) {\n            case STPackageBundle.Members: return '€ 1 per jaar, per lid. Minimum € 79 per jaar, waarbij 79 leden inbegrepen (minder leden kan uiteraard)';\n            case STPackageBundle.Webshops: return '€ 79 per jaar (inclusief ticketverkoop-functie) indien minder dan 50.000 euro omzet per jaar (zie website voor hogere omzet)';\n            case STPackageBundle.SingleWebshop: return 'Eénmalig € 49 (inclusief ticketverkoop-functie)';\n        }\n        return '?';\n    }\n    static isPublic(bundle) {\n        switch (bundle) {\n            case STPackageBundle.Members: return true;\n            case STPackageBundle.Webshops: return true;\n            case STPackageBundle.SingleWebshop: return true;\n        }\n        return false;\n    }\n    /**\n     * If you buy a package that is not combineable with an existing one, should it throw an error?\n     */\n    static isStackable(bundle, pack) {\n        switch (bundle) {\n            case STPackageBundle.TrialMembers: {\n                // Not allowed to start a trial even if pack is expired\n                return false;\n            }\n            case STPackageBundle.TrialWebshops: {\n                // Not allowed to start a trial again if pack is expired\n                return false;\n            }\n        }\n        return true;\n    }\n    static isCombineable(bundle, pack) {\n        switch (bundle) {\n            case STPackageBundle.Members: {\n                if (pack.meta.type === STPackageType.Members) {\n                    // Already bought\n                    return false;\n                }\n                return true;\n            }\n            case STPackageBundle.Webshops: {\n                if (pack.meta.type === STPackageType.Webshops) {\n                    // Already bought\n                    return false;\n                }\n                return true;\n            }\n            case STPackageBundle.SingleWebshop: {\n                if (pack.meta.type === STPackageType.SingleWebshop || pack.meta.type === STPackageType.Webshops) {\n                    // Already bought\n                    return false;\n                }\n                return true;\n            }\n            case STPackageBundle.TrialMembers: {\n                if (pack.meta.type === STPackageType.Members || pack.meta.type === STPackageType.TrialMembers) {\n                    // Already bought\n                    return false;\n                }\n                return true;\n            }\n            case STPackageBundle.TrialWebshops: {\n                if (pack.meta.type === STPackageType.SingleWebshop || pack.meta.type === STPackageType.Webshops || pack.meta.type === STPackageType.TrialWebshops) {\n                    // Already bought\n                    return false;\n                }\n                return true;\n            }\n        }\n        return false;\n    }\n    /**\n     * Create a new package for this type and return the pricing\n     */\n    static getCurrentPackage(bundle, date) {\n        switch (bundle) {\n            case STPackageBundle.Members: {\n                // 1 year valid\n                const validUntil = new Date(date);\n                validUntil.setFullYear(validUntil.getFullYear() + 1);\n                // Remove (= not renewable) if not renewed after 1 month\n                const removeAt = new Date(validUntil);\n                removeAt.setMonth(removeAt.getMonth() + 1);\n                return STPackage.create({\n                    validUntil,\n                    removeAt,\n                    meta: STPackageMeta.create({\n                        type: STPackageType.Members,\n                        unitPrice: 100,\n                        minimumAmount: 79,\n                        allowRenew: true,\n                        pricingType: STPricingType.PerMember,\n                        startDate: new Date(date),\n                    }),\n                });\n            }\n            case STPackageBundle.Webshops: {\n                // 1 year valid\n                const validUntil = new Date(date);\n                validUntil.setFullYear(validUntil.getFullYear() + 1);\n                // Remove (= not renewable) if not renewed after 1 month\n                const removeAt = new Date(validUntil);\n                removeAt.setMonth(removeAt.getMonth() + 1);\n                return STPackage.create({\n                    validUntil,\n                    removeAt,\n                    meta: STPackageMeta.create({\n                        type: STPackageType.Webshops,\n                        unitPrice: 7900,\n                        minimumAmount: 1,\n                        allowRenew: true,\n                        pricingType: STPricingType.PerYear,\n                        startDate: new Date(date),\n                    }),\n                });\n            }\n            case STPackageBundle.SingleWebshop: {\n                // Disable functions after two months\n                const validUntil = new Date(date);\n                validUntil.setMonth(validUntil.getMonth() + 2);\n                // Remove if not valid anymore\n                const removeAt = new Date(validUntil);\n                return STPackage.create({\n                    validUntil,\n                    removeAt,\n                    meta: STPackageMeta.create({\n                        type: STPackageType.SingleWebshop,\n                        unitPrice: 3900,\n                        minimumAmount: 1,\n                        allowRenew: true,\n                        pricingType: STPricingType.Fixed,\n                        startDate: new Date(date),\n                    }),\n                });\n            }\n            case STPackageBundle.TrialMembers: {\n                // Disable functions after two weeks, manual reenable required\n                const validUntil = new Date(date);\n                validUntil.setDate(validUntil.getDate() + 14);\n                // Remove if not valid anymore\n                const removeAt = new Date(validUntil);\n                return STPackage.create({\n                    validUntil,\n                    removeAt,\n                    meta: STPackageMeta.create({\n                        type: STPackageType.TrialMembers,\n                        unitPrice: 0,\n                        minimumAmount: 1,\n                        allowRenew: false,\n                        pricingType: STPricingType.Fixed,\n                        startDate: new Date(date),\n                        canDeactivate: true,\n                    }),\n                });\n            }\n            case STPackageBundle.TrialWebshops: {\n                // Disable functions after two weeks, manual reenable required\n                const validUntil = new Date(date);\n                validUntil.setDate(validUntil.getDate() + 14);\n                // Remove if not valid anymore\n                const removeAt = new Date(validUntil);\n                return STPackage.create({\n                    validUntil,\n                    removeAt,\n                    meta: STPackageMeta.create({\n                        type: STPackageType.TrialWebshops,\n                        unitPrice: 0,\n                        minimumAmount: 1,\n                        allowRenew: false,\n                        pricingType: STPricingType.Fixed,\n                        startDate: new Date(date),\n                        canDeactivate: true,\n                    }),\n                });\n            }\n        }\n        throw new Error('Package not available');\n    }\n}\n//# sourceMappingURL=STPackageBundle.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, EmailDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nexport class Admin extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], Admin.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], Admin.prototype, \"email\", void 0);\nexport class EditAdmin extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: EmailDecoder })\n], EditAdmin.prototype, \"email\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], EditAdmin.prototype, \"password\", void 0);\n//# sourceMappingURL=Admin.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, DateDecoder, EnumDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { Formatter, StringCompare } from '@stamhoofd/utility';\nimport { Address } from '../addresses/Address.js';\nimport { Recipient, Replacement } from '../endpoints/EmailRequest.js';\nimport { Gender } from '../members/Gender.js';\nimport { Parent } from '../members/Parent.js';\nexport class MemberSummary extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.email = null;\n        this.gender = Gender.Other;\n        this.phone = null;\n        this.birthDay = null;\n        this.address = null;\n        this.parents = [];\n    }\n    get name() {\n        return this.firstName + ' ' + this.lastName;\n    }\n    matchQuery(query) {\n        const parts = query.split(' ');\n        const nameParts = [...this.firstName.split(' '), ...this.lastName.split(' ')];\n        // Each part should at least match a namepart\n        for (const part of parts) {\n            if (!nameParts.find(p => StringCompare.contains(p, part))) {\n                return false;\n            }\n        }\n        return parts.length > 0;\n        // return StringCompare.contains(this.firstName, query) || StringCompare.contains(this.lastName, query)\n    }\n    get addresses() {\n        const addresses = this.parents.map(p => p.address).filter(a => a !== null);\n        if (this.address) {\n            addresses.push(this.address);\n        }\n        // Remove duplicates by toString()\n        return addresses.filter((a, i, self) => self.findIndex(b => b.toString() === a.toString()) === i);\n    }\n    get age() {\n        if (!this.birthDay) {\n            return null;\n        }\n        // For now calculate based on Brussels timezone (we'll need to correct this later)\n        const today = new Date();\n        const birthDay = Formatter.luxon(this.birthDay);\n        let age = today.getFullYear() - birthDay.year;\n        const m = today.getMonth() - (birthDay.month - 1);\n        if (m < 0 || (m === 0 && today.getDate() < birthDay.day)) {\n            age--;\n        }\n        return age;\n    }\n    get emailRecipients() {\n        // for each parent\n        const recipients = [];\n        for (const parent of this.parents) {\n            if (parent.email) {\n                recipients.push(Recipient.create({\n                    firstName: parent.firstName,\n                    lastName: parent.lastName,\n                    email: parent.email,\n                    types: ['parent'],\n                    replacements: [\n                        Replacement.create({\n                            token: 'organization',\n                            value: this.organizationName,\n                        }),\n                    ],\n                }));\n            }\n        }\n        if (this.email && (!this.age || this.age >= 18)) {\n            recipients.push(Recipient.create({\n                firstName: this.firstName,\n                lastName: this.lastName,\n                email: this.email,\n                types: ['member'],\n                replacements: [\n                    Replacement.create({\n                        token: 'organization',\n                        value: this.organizationName,\n                    }),\n                ],\n            }));\n        }\n        return recipients;\n    }\n    get emailaddresses() {\n        const emails = this.parents.map(p => p.email).filter(e => e !== null);\n        if (this.email && (!this.age || this.age >= 18)) {\n            emails.push(this.email);\n        }\n        // Remove duplicates\n        return emails.filter((a, i, self) => self.indexOf(a) === i);\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], MemberSummary.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], MemberSummary.prototype, \"firstName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], MemberSummary.prototype, \"lastName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], MemberSummary.prototype, \"email\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(Gender) })\n], MemberSummary.prototype, \"gender\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], MemberSummary.prototype, \"phone\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], MemberSummary.prototype, \"birthDay\", void 0);\n__decorate([\n    field({ decoder: Address, nullable: true })\n], MemberSummary.prototype, \"address\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(Parent) })\n], MemberSummary.prototype, \"parents\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], MemberSummary.prototype, \"organizationName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], MemberSummary.prototype, \"organizationId\", void 0);\n//# sourceMappingURL=MemberSummary.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, DateDecoder, EnumDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { Formatter, StringCompare } from '@stamhoofd/utility';\nimport { Address } from '../addresses/Address.js';\nimport { STBillingStatus } from '../billing/STBillingStatus.js';\nimport { Organization } from '../Organization.js';\nimport { OrganizationEmail } from '../OrganizationEmail.js';\nimport { OrganizationPackages } from '../OrganizationMetaData.js';\nimport { AcquisitionType } from '../OrganizationPrivateMetaData.js';\nimport { OrganizationType } from '../OrganizationType.js';\nimport { UmbrellaOrganization } from '../UmbrellaOrganization.js';\nimport { User } from '../User.js';\nexport class OrganizationStats extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: IntegerDecoder })\n], OrganizationStats.prototype, \"activeWebshops\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], OrganizationStats.prototype, \"memberCount\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], OrganizationStats.prototype, \"orderCount\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], OrganizationStats.prototype, \"webshopRevenue\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], OrganizationStats.prototype, \"activeAdmins\", void 0);\nexport class OrganizationPaymentMandateDetails extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], OrganizationPaymentMandateDetails.prototype, \"consumerName\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], OrganizationPaymentMandateDetails.prototype, \"consumerAccount\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, optional: true })\n], OrganizationPaymentMandateDetails.prototype, \"consumerBic\", void 0);\nexport class OrganizationPaymentMandate extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * The signature date of the mandate in YYYY-MM-DD format.\n         */\n        this.signatureDate = null;\n        this.mandateReference = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], OrganizationPaymentMandate.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], OrganizationPaymentMandate.prototype, \"method\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], OrganizationPaymentMandate.prototype, \"status\", void 0);\n__decorate([\n    field({ decoder: OrganizationPaymentMandateDetails })\n], OrganizationPaymentMandate.prototype, \"details\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], OrganizationPaymentMandate.prototype, \"signatureDate\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], OrganizationPaymentMandate.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], OrganizationPaymentMandate.prototype, \"mandateReference\", void 0);\nexport class OrganizationSummary extends Organization {\n    constructor() {\n        super(...arguments);\n        this.lastActiveAt = null;\n        this.acquisitionTypes = [];\n        this.mollieCustomerId = null;\n        this.paymentMandates = [];\n        this.features = [];\n    }\n}\n__decorate([\n    field({ decoder: STBillingStatus })\n], OrganizationSummary.prototype, \"billingStatus\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], OrganizationSummary.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: DateDecoder, nullable: true })\n], OrganizationSummary.prototype, \"lastActiveAt\", void 0);\n__decorate([\n    field({ decoder: OrganizationStats })\n], OrganizationSummary.prototype, \"stats\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(new EnumDecoder(AcquisitionType)), version: 130 })\n], OrganizationSummary.prototype, \"acquisitionTypes\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true, version: 154 })\n], OrganizationSummary.prototype, \"mollieCustomerId\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(OrganizationPaymentMandate), version: 154 })\n], OrganizationSummary.prototype, \"paymentMandates\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), optional: true })\n], OrganizationSummary.prototype, \"features\", void 0);\nexport class OrganizationOverview extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.umbrellaOrganization = null;\n        this.emails = [];\n        this.features = [];\n        this.acquisitionTypes = [];\n    }\n    matchQuery(q) {\n        if (q === this.id) {\n            return true;\n        }\n        const parts = q.split(/[ -]/);\n        const name = Formatter.slug(this.name);\n        const orgParts = name.split(/[ -]/);\n        if (q.includes('@')) {\n            if (this.emails.some(e => e.email.toLocaleLowerCase() == q.toLocaleLowerCase())) {\n                return true;\n            }\n            if (this.admins.some(a => a.email.toLocaleLowerCase() == q.toLocaleLowerCase())) {\n                return true;\n            }\n        }\n        for (const [index, part] of parts.entries()) {\n            if (part.length > 1 || index >= parts.length - 1) {\n                if (index < parts.length - 1) {\n                    // Should be a full match of a word in name\n                    if (!orgParts.some(o => o.toLocaleLowerCase() == (part.toLocaleLowerCase()))) {\n                        if (StringCompare.typoCount(this.address.city, part) > 0) {\n                            return false;\n                        }\n                    }\n                    continue;\n                }\n                if (name.toLocaleLowerCase().includes(part.toLocaleLowerCase())) {\n                    return true;\n                }\n                if (StringCompare.typoCount(this.address.city, part) == 0) {\n                    return true;\n                }\n            }\n        }\n        if (StringCompare.typoCount(name, q) < 2) {\n            return true;\n        }\n        if (StringCompare.typoCount(this.address.city, q) < 2) {\n            return true;\n        }\n        return false;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], OrganizationOverview.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], OrganizationOverview.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(OrganizationType), version: 90 })\n], OrganizationOverview.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(UmbrellaOrganization), nullable: true, version: 90 })\n], OrganizationOverview.prototype, \"umbrellaOrganization\", void 0);\n__decorate([\n    field({ decoder: Address })\n], OrganizationOverview.prototype, \"address\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], OrganizationOverview.prototype, \"createdAt\", void 0);\n__decorate([\n    field({ decoder: OrganizationPackages })\n], OrganizationOverview.prototype, \"packages\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(User), optional: true, version: 90 })\n], OrganizationOverview.prototype, \"admins\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(OrganizationEmail), version: 90 })\n], OrganizationOverview.prototype, \"emails\", void 0);\n__decorate([\n    field({ decoder: OrganizationStats, version: 90 })\n], OrganizationOverview.prototype, \"stats\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder), optional: true })\n], OrganizationOverview.prototype, \"features\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(new EnumDecoder(AcquisitionType)), optional: true })\n], OrganizationOverview.prototype, \"acquisitionTypes\", void 0);\n//# sourceMappingURL=OrganizationSummary.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, DateDecoder, EnumDecoder, field, IntegerDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nimport { STInvoice } from '../billing/STInvoice.js';\nfunction isInvoiceComplete(invoice, payoutExport) {\n    // Find all payout items for this invoice\n    const payoutItems = payoutExport.payouts.flatMap(p => p.items).filter(i => i.invoices.find(i => i.id === invoice.id));\n    // Get total sum of all payout items\n    const totalPayout = payoutItems.reduce((total, item) => total + item.amount, 0);\n    return totalPayout === invoice.meta.priceWithVAT;\n}\nexport var StripePayoutItemType;\n(function (StripePayoutItemType) {\n    StripePayoutItemType[\"Invoice\"] = \"Invoice\";\n    StripePayoutItemType[\"StripeFees\"] = \"StripeFees\";\n    StripePayoutItemType[\"StripeReserved\"] = \"StripeReserved\";\n})(StripePayoutItemType || (StripePayoutItemType = {}));\nexport class StripePayoutItem extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.type = StripePayoutItemType.Invoice;\n        this.amount = 0;\n        this.description = '';\n        this.invoices = [];\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], StripePayoutItem.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(StripePayoutItemType) })\n], StripePayoutItem.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], StripePayoutItem.prototype, \"amount\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], StripePayoutItem.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(STInvoice) })\n], StripePayoutItem.prototype, \"invoices\", void 0);\nexport class StripePayout extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.amount = 0;\n        this.statementDescriptor = '';\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], StripePayout.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: IntegerDecoder })\n], StripePayout.prototype, \"amount\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], StripePayout.prototype, \"arrivalDate\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], StripePayout.prototype, \"statementDescriptor\", void 0);\nexport class StripePayoutBreakdown extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.items = [];\n    }\n    /**\n     * Whether the payout amout matches the sum of the items\n     */\n    get isValid() {\n        return this.payout.amount === this.items.reduce((total, item) => total + item.amount, 0);\n    }\n    isComplete(payoutExport) {\n        for (const item of this.items) {\n            if (item.type !== StripePayoutItemType.Invoice) {\n                continue;\n            }\n            if (item.invoices.length === 0) {\n                return false;\n            }\n            for (const invoice of item.invoices) {\n                if (!isInvoiceComplete(invoice, payoutExport)) {\n                    return false;\n                }\n            }\n        }\n        return true;\n    }\n}\n__decorate([\n    field({ decoder: StripePayout })\n], StripePayoutBreakdown.prototype, \"payout\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(StripePayoutItem) })\n], StripePayoutBreakdown.prototype, \"items\", void 0);\nexport class StripePayoutExport extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * All fetched payouts (we need to fetch more payouts than requested in order to complete all information on each invoice, because an invoice might have been paid out in other payouts than requested)\n         */\n        this.payouts = [];\n    }\n    get includedPayouts() {\n        return this.payouts.filter(p => p.payout.arrivalDate >= this.start && p.payout.arrivalDate <= this.end);\n    }\n    /**\n     * All payouts that only have invoices that are completely paid out in this export\n     */\n    get completePayouts() {\n        return this.includedPayouts.filter(p => p.isComplete(this));\n    }\n    get totalPaidOut() {\n        return this.completePayouts.reduce((total, payout) => total + payout.payout.amount, 0);\n    }\n    get totalStripeFees() {\n        return this.completePayouts.reduce((total, payout) => total + payout.items.filter(i => i.type === StripePayoutItemType.StripeFees).reduce((total, item) => total - item.amount, 0), 0);\n    }\n    get totalStripeReserved() {\n        return this.completePayouts.reduce((total, payout) => total + payout.items.filter(i => i.type === StripePayoutItemType.StripeReserved).reduce((total, item) => total - item.amount, 0), 0);\n    }\n    get totalInvoices() {\n        return this.completePayouts.reduce((total, payout) => total + payout.items.filter(i => i.type === StripePayoutItemType.Invoice).reduce((total, item) => total + item.amount, 0), 0);\n    }\n    get totalVAT() {\n        let VAT = 0;\n        for (const payout of this.completePayouts) {\n            for (const item of payout.items) {\n                if (item.type !== StripePayoutItemType.Invoice) {\n                    continue;\n                }\n                const invoiceVAT = item.invoices.reduce((total, invoice) => total + invoice.meta.VAT, 0);\n                const invoiceTotal = item.invoices.reduce((total, invoice) => total + invoice.meta.priceWithVAT, 0);\n                if (invoiceTotal === 0) {\n                    continue;\n                }\n                // Calculate applicable VAT based on the amount of the invoice\n                VAT += invoiceVAT / invoiceTotal * item.amount;\n            }\n        }\n        return Math.round(VAT);\n    }\n    get net() {\n        return this.totalPaidOut - this.totalVAT;\n    }\n    get isValid() {\n        return this.totalPaidOut === this.totalInvoices - this.totalStripeFees && this.completePayouts.length === this.includedPayouts.length;\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(StripePayoutBreakdown) })\n], StripePayoutExport.prototype, \"payouts\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], StripePayoutExport.prototype, \"start\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], StripePayoutExport.prototype, \"end\", void 0);\n//# sourceMappingURL=StripePayoutExport.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, field, NumberDecoder, StringDecoder } from '@simonbackx/simple-encoding';\nexport class GraphData extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.label = '';\n        this.values = [];\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], GraphData.prototype, \"label\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(NumberDecoder) })\n], GraphData.prototype, \"values\", void 0);\nexport class Graph extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.labels = [];\n        this.data = [];\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(StringDecoder) })\n], Graph.prototype, \"labels\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(GraphData) })\n], Graph.prototype, \"data\", void 0);\n//# sourceMappingURL=Graph.js.map","import { __decorate } from \"tslib\";\nimport { AutoEncoder, BooleanDecoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { OrganizationSimple } from '../OrganizationSimple.js';\nexport class EmailAddressSettings extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.organization = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], EmailAddressSettings.prototype, \"email\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], EmailAddressSettings.prototype, \"unsubscribedMarketing\", void 0);\n__decorate([\n    field({ decoder: BooleanDecoder })\n], EmailAddressSettings.prototype, \"unsubscribedAll\", void 0);\n__decorate([\n    field({ decoder: OrganizationSimple, nullable: true })\n], EmailAddressSettings.prototype, \"organization\", void 0);\n//# sourceMappingURL=EmailAddressSettings.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, field, StringDecoder } from '@simonbackx/simple-encoding';\nimport { LimitedFilteredRequest } from './FilteredRequest.js';\nexport var ExcelExportType;\n(function (ExcelExportType) {\n    ExcelExportType[\"Payments\"] = \"payments\";\n    ExcelExportType[\"Members\"] = \"members\";\n    ExcelExportType[\"Organizations\"] = \"organizations\";\n    ExcelExportType[\"ReceivableBalances\"] = \"receivable-balances\";\n})(ExcelExportType || (ExcelExportType = {}));\nexport class ExcelSheetColumnFilter extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], ExcelSheetColumnFilter.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], ExcelSheetColumnFilter.prototype, \"name\", void 0);\nexport class ExcelSheetFilter extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.name = '';\n        this.columns = [];\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], ExcelSheetFilter.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, version: 345 })\n], ExcelSheetFilter.prototype, \"name\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(ExcelSheetColumnFilter), version: 345, upgrade: (old) => old.map(id => ExcelSheetColumnFilter.create({ id, name: '' })) }),\n    field({ decoder: new ArrayDecoder(StringDecoder) })\n], ExcelSheetFilter.prototype, \"columns\", void 0);\n/**\n * Which sheets and columns to include in the excel file\n */\nexport class ExcelWorkbookFilter extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.sheets = [];\n    }\n}\n__decorate([\n    field({ decoder: new ArrayDecoder(ExcelSheetFilter) })\n], ExcelWorkbookFilter.prototype, \"sheets\", void 0);\nexport class ExcelExportRequest extends AutoEncoder {\n}\n__decorate([\n    field({ decoder: LimitedFilteredRequest })\n], ExcelExportRequest.prototype, \"filter\", void 0);\n__decorate([\n    field({ decoder: ExcelWorkbookFilter })\n], ExcelExportRequest.prototype, \"workbookFilter\", void 0);\nexport class ExcelExportResponse extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        /**\n         * Contains a file id which can be used to download the file\n         *\n         * If this is null, the file will be sent via e-mail\n         */\n        this.url = null;\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], ExcelExportResponse.prototype, \"url\", void 0);\n//# sourceMappingURL=ExcelExportRequest.js.map","import { isSimpleError, isSimpleErrors, SimpleError } from '@simonbackx/simple-errors';\nimport { AccessRight } from '../AccessRight.js';\nimport { PermissionsResourceType } from '../PermissionsResourceType.js';\nexport class EventPermissionChecker {\n    /**\n     * Will throw error if not allowed to edit/add/delete this event\n     * @param event\n     * @returns Organization if event for specific organization, else null\n     * @throws error if not allowed to write this event\n     */\n    static async checkEventAccessAsync(event, { getOrganization, userPermissions, platform, }) {\n        if (!userPermissions) {\n            throw new SimpleError({\n                code: 'permission_denied',\n                message: 'Je hebt geen toegangsrechten om een activiteit te beheren.',\n                statusCode: 403,\n            });\n        }\n        if (event.organizationId !== null) {\n            let organization;\n            try {\n                organization = await getOrganization(event.organizationId);\n            }\n            catch (error) {\n                throw new SimpleError({\n                    code: 'not_found',\n                    message: 'Organization not found',\n                    human: 'De activiteit werd niet gevonden',\n                });\n            }\n            this.throwIfNoPermissionToWriteEventForOrganization(event, organization, platform, userPermissions);\n            return organization;\n        }\n        this.throwIfNoPermissionToWriteNationalOrRegionalEvent(event, userPermissions, platform);\n        return null;\n    }\n    /**\n     * Will throw error if not allowed to edit/add/delete this event\n     * @param event\n     * @throws error if not allowed to write this event\n     */\n    static throwIfNoPermissionToWriteEvent(event, { organization, userPermissions, platform, }) {\n        if (!userPermissions) {\n            throw new SimpleError({\n                code: 'permission_denied',\n                message: 'Je hebt geen toegangsrechten om een activiteit te beheren.',\n                statusCode: 403,\n            });\n        }\n        if (event.organizationId !== null) {\n            if (organization === null) {\n                throw new Error('Organization not specified.');\n            }\n            this.throwIfNoPermissionToWriteEventForOrganization(event, organization, platform, userPermissions);\n        }\n        else {\n            this.throwIfNoPermissionToWriteNationalOrRegionalEvent(event, userPermissions, platform);\n        }\n    }\n    static hasPermissionToWriteEvent(event, options) {\n        try {\n            this.throwIfNoPermissionToWriteEvent(event, options);\n        }\n        catch (error) {\n            if (isSimpleError(error) || isSimpleErrors(error)) {\n                return false;\n            }\n            throw error;\n        }\n        return true;\n    }\n    static throwIfNoPermissionToWriteEventForOrganization(event, organization, platform, userPermissions) {\n        const accessRight = AccessRight.EventWrite;\n        if (event.organizationId !== organization.id) {\n            throw new SimpleError({\n                code: 'permission_denied',\n                message: 'Je kan geen activiteit beheren voor deze organisatie.',\n                statusCode: 403,\n            });\n        }\n        const organizationPermissions = userPermissions.forOrganization(organization, platform);\n        if (!organizationPermissions) {\n            throw new SimpleError({\n                code: 'permission_denied',\n                message: 'Je hebt geen toegangsrechten om een activiteit te beheren voor deze organisatie.',\n                statusCode: 403,\n            });\n        }\n        if (event.meta.groups === null) {\n            if (!organizationPermissions.hasResourceAccessRight(PermissionsResourceType.Groups, '', accessRight)) {\n                throw new SimpleError({\n                    code: 'permission_denied',\n                    message: 'Je hebt geen toegangsrechten om een activiteit te beheren voor deze organisatie.',\n                    statusCode: 403,\n                });\n            }\n        }\n        else {\n            for (const group of event.meta.groups) {\n                if (!organizationPermissions.hasResourceAccessRight(PermissionsResourceType.Groups, group.id, accessRight)) {\n                    throw new SimpleError({\n                        code: 'permission_denied',\n                        message: 'Je hebt geen toegangsrechten om een activiteit te beheren voor deze groep(en).',\n                        statusCode: 403,\n                    });\n                }\n            }\n        }\n    }\n    static throwIfNoPermissionToWriteNationalOrRegionalEvent(event, userPermissions, platform) {\n        const accessRight = AccessRight.EventWrite;\n        const platformPermissions = userPermissions.forPlatform(platform);\n        if (!platformPermissions) {\n            throw new SimpleError({\n                code: 'permission_denied',\n                message: 'Je hebt geen toegangsrechten om een nationale activiteit te beheren.',\n                statusCode: 403,\n            });\n        }\n        // organization tags\n        if (event.meta.organizationTagIds === null) {\n            if (!(platformPermissions.hasResourceAccessRight(PermissionsResourceType.OrganizationTags, '', accessRight))) {\n                throw new SimpleError({\n                    code: 'permission_denied',\n                    message: 'Je hebt geen toegangsrechten om een nationale activiteit te beheren voor alle groepen.',\n                    statusCode: 403,\n                });\n            }\n        }\n        else {\n            for (const tagId of event.meta.organizationTagIds) {\n                if (!platformPermissions.hasResourceAccessRight(PermissionsResourceType.OrganizationTags, tagId, accessRight)) {\n                    throw new SimpleError({\n                        code: 'permission_denied',\n                        message: \"Je hebt geen toegangsrechten om een regionale activiteit te beheren voor deze regio('s).\",\n                        statusCode: 403,\n                    });\n                }\n            }\n        }\n    }\n}\n//# sourceMappingURL=EventPermissionChecker.js.map","export class TagHelper {\n    /**\n     * Get the root tags from the tags array.\n     * A root tag is a tag that is not a child of another tag in the array.\n     * @param tags\n     */\n    static getRootTags(tags) {\n        const result = [];\n        for (const tag of tags) {\n            const tagId = tag.id;\n            let isRootTag = true;\n            for (const otherTag of tags) {\n                const otherTagId = otherTag.id;\n                if (tagId === otherTagId) {\n                    continue;\n                }\n                if (otherTag.childTags.includes(tagId)) {\n                    isRootTag = false;\n                    break;\n                }\n            }\n            if (isRootTag) {\n                result.push(tag);\n            }\n        }\n        return result;\n    }\n    /**\n     * Checks if a tag with the provided id contains the tag with the id to search recursively.\n     * @param tagId id of the tag to search into\n     * @param tagIdToSearch id of the tag to search inside the tag\n     * @param tagMap a map of all the tags\n     * @returns true if the tag contains the tag to search recursively or false otherwise\n     */\n    static containsDeep(tagId, tagIdToSearch, tags) {\n        const tagMap = 'tagMap' in tags ? tags.tagMap : new Map(tags.allTags.map(tag => [tag.id, tag]));\n        const tag = tagMap.get(tagId);\n        if (!tag) {\n            // should not happen\n            return false;\n        }\n        if (tag.childTags.length === 0) {\n            return false;\n        }\n        if (tag.childTags.includes(tagIdToSearch)) {\n            return true;\n        }\n        for (const childTagId of tag.childTags) {\n            if (this.containsDeep(childTagId, tagIdToSearch, { tagMap })) {\n                return true;\n            }\n        }\n        return false;\n    }\n}\n//# sourceMappingURL=TagHelper.js.map","class RendersState {\n    constructor() {\n        this.previousBackslash = false;\n        this.previousIsOpenCurly = false;\n        this.previousIsEndCurly = false;\n        this.insideCurly = false;\n        this.pendingString = '';\n        this.output = [];\n        this.quoteChar = null;\n        this.currentHelper = null;\n        this.currentHelperArgs = [];\n        this.pos = 0;\n    }\n    endCurlyWord() {\n        // Check helper\n        const helperName = this.quoteChar ? this.pendingString : this.pendingString.trim();\n        if (helperName.length === 0 && !this.quoteChar) {\n            return;\n        }\n        if (!this.quoteChar && this.currentHelper === null && this.context.helpers[helperName]) {\n            this.currentHelper = this.context.helpers[helperName];\n        }\n        else {\n            if (!this.currentHelper) {\n                // Default output helper\n                this.currentHelper = (_c, ...v) => v;\n            }\n            if (this.quoteChar) {\n                this.currentHelperArgs.push(this.pendingString);\n            }\n            else if (this.context.context[helperName]) {\n                this.currentHelperArgs.push(this.context.context[helperName]);\n            }\n            else {\n                this.currentHelperArgs.push(undefined);\n            }\n        }\n        this.pendingString = '';\n    }\n    addOutput(...vv) {\n        for (const v of vv) {\n            const last = this.output[this.output.length - 1];\n            if (typeof last === 'string' && typeof v === 'string') {\n                this.output[this.output.length - 1] = last + v;\n                continue;\n            }\n            this.output.push(v);\n        }\n    }\n    process(char) {\n        this.pos += 1;\n        if (char === '\\\\') {\n            this.previousBackslash = true;\n            return;\n        }\n        if (this.insideCurly) {\n            this.previousIsOpenCurly = false;\n            if (this.previousBackslash) {\n                if (char === 'n' || char === 'r' || char === 't') {\n                    this.pendingString += char === 'n' ? '\\n' : char === 'r' ? '\\r' : '\\t';\n                }\n                else {\n                    this.pendingString += char;\n                }\n                this.previousBackslash = false;\n                this.previousIsEndCurly = false;\n            }\n            else if ((char === '\"' || char === \"'\") && !this.quoteChar) {\n                this.quoteChar = char;\n                this.previousIsEndCurly = false;\n            }\n            else if (char === this.quoteChar) {\n                this.previousIsEndCurly = false;\n                this.endCurlyWord();\n                this.quoteChar = null;\n            }\n            else if (char === ' ' && !this.quoteChar) {\n                this.previousIsEndCurly = false;\n                this.endCurlyWord();\n            }\n            else if (char === '}') {\n                // Ending\n                if (this.previousIsEndCurly) {\n                    this.endCurlyWord();\n                    if (!this.currentHelper) {\n                        throw new Error('Unexpected } at position ' + this.pos);\n                    }\n                    // End\n                    this.insideCurly = false;\n                    this.addOutput(...this.currentHelper(this.context, ...this.currentHelperArgs));\n                    this.currentHelperArgs = [];\n                    this.currentHelper = null;\n                    this.pendingString = '';\n                    this.previousIsEndCurly = false;\n                }\n                else {\n                    this.previousIsEndCurly = true;\n                }\n            }\n            else {\n                this.pendingString += char;\n                this.previousIsEndCurly = false;\n            }\n            return;\n        }\n        this.previousIsEndCurly = false;\n        if (this.previousBackslash) {\n            if (char === 'n' || char === 'r' || char === 't') {\n                this.addOutput(char === 'n' ? '\\n' : char === 'r' ? '\\r' : '\\t');\n            }\n            else {\n                this.addOutput(char);\n            }\n            this.previousBackslash = false;\n            this.previousIsOpenCurly = false;\n            return;\n        }\n        if (char === '{') {\n            if (this.previousIsOpenCurly) {\n                this.insideCurly = true;\n            }\n            this.previousIsOpenCurly = true;\n            return;\n        }\n        if (this.previousIsOpenCurly) {\n            this.addOutput('{');\n        }\n        this.previousIsOpenCurly = false;\n        this.addOutput(char);\n        return;\n    }\n}\n/**\n * Very basic lightweight rendering method - to avoid loading expensive dependencies for simple rendering\n */\nexport function renderTemplate(template, context) {\n    const state = new RendersState();\n    state.context = context;\n    for (const char of template) {\n        state.process(char);\n    }\n    return state.output;\n}\n//# sourceMappingURL=AuditLogRenderer.js.map","import { __decorate } from \"tslib\";\nimport { ArrayDecoder, AutoEncoder, DateDecoder, EnumDecoder, field, MapDecoder, StringDecoder, StringOrNumberDecoder } from '@simonbackx/simple-encoding';\nimport { Formatter } from '@stamhoofd/utility';\nimport { renderTemplate } from './AuditLogRenderer.js';\nimport { AuditLogReplacement } from './AuditLogReplacement.js';\nimport { NamedObject } from './Event.js';\nexport var AuditLogSource;\n(function (AuditLogSource) {\n    AuditLogSource[\"User\"] = \"User\";\n    AuditLogSource[\"System\"] = \"System\";\n    /**\n     * Caused by a change in payment status\n     */\n    AuditLogSource[\"Payment\"] = \"Payment\";\n    /**\n     * E.g. orders placed via a webshop.\n     */\n    AuditLogSource[\"Anonymous\"] = \"Anonymous\";\n})(AuditLogSource || (AuditLogSource = {}));\nexport var AuditLogType;\n(function (AuditLogType) {\n    /**\n     * Used for legacy logs\n     */\n    AuditLogType[\"Unknown\"] = \"Unknown\";\n    AuditLogType[\"MemberRegistered\"] = \"MemberRegistered\";\n    AuditLogType[\"MemberUnregistered\"] = \"MemberUnregistered\";\n    AuditLogType[\"PlatformSettingsChanged\"] = \"PlatformSettingsChanged\";\n    AuditLogType[\"OrganizationAdded\"] = \"OrganizationAdded\";\n    AuditLogType[\"OrganizationDeleted\"] = \"OrganizationDeleted\";\n    AuditLogType[\"OrganizationEdited\"] = \"OrganizationEdited\";\n    // Events\n    AuditLogType[\"EventEdited\"] = \"EventEdited\";\n    AuditLogType[\"EventAdded\"] = \"EventAdded\";\n    AuditLogType[\"EventDeleted\"] = \"EventDeleted\";\n    // Members\n    AuditLogType[\"MemberEdited\"] = \"MemberEdited\";\n    AuditLogType[\"MemberAdded\"] = \"MemberAdded\";\n    AuditLogType[\"MemberDeleted\"] = \"MemberDeleted\";\n    // Groups\n    AuditLogType[\"GroupEdited\"] = \"GroupEdited\";\n    AuditLogType[\"GroupAdded\"] = \"GroupAdded\";\n    AuditLogType[\"GroupDeleted\"] = \"GroupDeleted\";\n    // Webshops\n    AuditLogType[\"WebshopEdited\"] = \"WebshopEdited\";\n    AuditLogType[\"WebshopAdded\"] = \"WebshopAdded\";\n    AuditLogType[\"WebshopDeleted\"] = \"WebshopDeleted\";\n    // Waiting lists\n    AuditLogType[\"WaitingListEdited\"] = \"WaitingListEdited\";\n    AuditLogType[\"WaitingListAdded\"] = \"WaitingListAdded\";\n    AuditLogType[\"WaitingListDeleted\"] = \"WaitingListDeleted\";\n    // Periods\n    AuditLogType[\"RegistrationPeriodEdited\"] = \"RegistrationPeriodEdited\";\n    AuditLogType[\"RegistrationPeriodAdded\"] = \"RegistrationPeriodAdded\";\n    AuditLogType[\"RegistrationPeriodDeleted\"] = \"RegistrationPeriodDeleted\";\n    // Stripe\n    AuditLogType[\"StripeAccountAdded\"] = \"StripeAccountAdded\";\n    AuditLogType[\"StripeAccountDeleted\"] = \"StripeAccountDeleted\";\n    AuditLogType[\"StripeAccountEdited\"] = \"StripeAccountEdited\";\n    // Orders\n    AuditLogType[\"OrderAdded\"] = \"OrderAdded\";\n    AuditLogType[\"OrderEdited\"] = \"OrderEdited\";\n    AuditLogType[\"OrderDeleted\"] = \"OrderDeleted\";\n    // Payment\n    AuditLogType[\"PaymentAdded\"] = \"PaymentAdded\";\n    AuditLogType[\"PaymentEdited\"] = \"PaymentEdited\";\n    AuditLogType[\"PaymentDeleted\"] = \"PaymentDeleted\";\n    // Document templates\n    AuditLogType[\"DocumentTemplateAdded\"] = \"DocumentTemplateAdded\";\n    AuditLogType[\"DocumentTemplateEdited\"] = \"DocumentTemplateEdited\";\n    AuditLogType[\"DocumentTemplateDeleted\"] = \"DocumentTemplateDeleted\";\n    // Users\n    AuditLogType[\"UserAdded\"] = \"UserAdded\";\n    AuditLogType[\"UserEdited\"] = \"UserEdited\";\n    AuditLogType[\"UserDeleted\"] = \"UserDeleted\";\n    // MemberResponsibilityRecord\n    AuditLogType[\"MemberResponsibilityRecordAdded\"] = \"MemberResponsibilityRecordAdded\";\n    AuditLogType[\"MemberResponsibilityRecordEdited\"] = \"MemberResponsibilityRecordEdited\";\n    AuditLogType[\"MemberResponsibilityRecordDeleted\"] = \"MemberResponsibilityRecordDeleted\";\n    // MemberPlatformMembership\n    AuditLogType[\"MemberPlatformMembershipAdded\"] = \"MemberPlatformMembershipAdded\";\n    AuditLogType[\"MemberPlatformMembershipEdited\"] = \"MemberPlatformMembershipEdited\";\n    AuditLogType[\"MemberPlatformMembershipDeleted\"] = \"MemberPlatformMembershipDeleted\";\n    // Security code\n    AuditLogType[\"MemberSecurityCodeUsed\"] = \"MemberSecurityCodeUsed\";\n    // Email\n    AuditLogType[\"EmailSent\"] = \"EmailSent\";\n    AuditLogType[\"EmailSending\"] = \"EmailSending\";\n    // Marked as spam events\n    AuditLogType[\"EmailAddressMarkedAsSpam\"] = \"EmailAddressMarkedAsSpam\";\n    AuditLogType[\"EmailAddressHardBounced\"] = \"EmailAddressHardBounced\";\n    AuditLogType[\"EmailAddressSoftBounced\"] = \"EmailAddressSoftBounced\";\n    AuditLogType[\"EmailAddressUnsubscribed\"] = \"EmailAddressUnsubscribed\";\n    AuditLogType[\"EmailAddressFraudComplaint\"] = \"EmailAddressFraudComplaint\";\n    AuditLogType[\"EmailTemplateAdded\"] = \"EmailTemplateAdded\";\n    AuditLogType[\"EmailTemplateEdited\"] = \"EmailTemplateEdited\";\n    AuditLogType[\"EmailTemplateDeleted\"] = \"EmailTemplateDeleted\";\n})(AuditLogType || (AuditLogType = {}));\nexport function getAuditLogTypeName(type) {\n    switch (type) {\n        case AuditLogType.MemberEdited:\n            return `Wijzigingen aan gegevens van leden`;\n        case AuditLogType.MemberAdded:\n            return `Nieuwe leden`;\n        case AuditLogType.MemberDeleted:\n            return `Verwijderde leden`;\n        case AuditLogType.MemberRegistered:\n            return `Inschrijvingen`;\n        case AuditLogType.MemberUnregistered:\n            return `Uitschrijvingen`;\n        case AuditLogType.Unknown:\n            return `Onbekende actie`;\n        case AuditLogType.PlatformSettingsChanged:\n            return `Wijzigingen aan platforminstellingen`;\n        case AuditLogType.OrganizationEdited:\n            return `Wijzigingen aan instellingen van een groep`;\n        case AuditLogType.OrganizationAdded:\n            return `Nieuwe lokale groepen`;\n        case AuditLogType.OrganizationDeleted:\n            return `Verwijderde lokale groepen`;\n        case AuditLogType.EventEdited:\n            return `Wijzigingen aan activiteiten`;\n        case AuditLogType.EventAdded:\n            return `Nieuwe activiteiten`;\n        case AuditLogType.EventDeleted:\n            return `Verwijderde activiteiten`;\n        case AuditLogType.GroupEdited:\n            return `Wijzigingen aan groepen`;\n        case AuditLogType.GroupAdded:\n            return `Nieuwe groepen`;\n        case AuditLogType.GroupDeleted:\n            return `Verwijderde groepen`;\n        case AuditLogType.WaitingListEdited:\n            return `Wijzigingen aan wachtlijsten`;\n        case AuditLogType.WaitingListAdded:\n            return `Nieuwe wachtlijsten`;\n        case AuditLogType.WaitingListDeleted:\n            return `Verwijderde wachtlijsten`;\n        case AuditLogType.RegistrationPeriodEdited:\n            return `Wijzigingen aan werkjaren`;\n        case AuditLogType.RegistrationPeriodAdded:\n            return `Nieuwe werkjaren`;\n        case AuditLogType.RegistrationPeriodDeleted:\n            return `Verwijderde werkjaren`;\n        case AuditLogType.StripeAccountAdded:\n            return `Stripe account aangemaakt`;\n        case AuditLogType.StripeAccountDeleted:\n            return `Stripe account verwijderd`;\n        case AuditLogType.StripeAccountEdited:\n            return `Stripe account gewijzigd`;\n        case AuditLogType.WebshopEdited:\n            return `Wijzigingen aan webshops`;\n        case AuditLogType.WebshopAdded:\n            return `Nieuwe webshops`;\n        case AuditLogType.WebshopDeleted:\n            return `Verwijderde webshops`;\n        case AuditLogType.OrderAdded:\n            return `Nieuwe bestellingen`;\n        case AuditLogType.OrderEdited:\n            return `Wijzigingen aan bestellingen`;\n        case AuditLogType.OrderDeleted:\n            return `Verwijderde bestellingen`;\n        case AuditLogType.PaymentAdded:\n            return `Nieuwe betalingen`;\n        case AuditLogType.PaymentEdited:\n            return `Wijzigingen aan betalingen`;\n        case AuditLogType.PaymentDeleted:\n            return `Verwijderde betalingen`;\n        case AuditLogType.DocumentTemplateAdded:\n            return `Nieuwe document`;\n        case AuditLogType.DocumentTemplateEdited:\n            return `Wijzigingen aan documenten`;\n        case AuditLogType.DocumentTemplateDeleted:\n            return `Verwijderde documenten`;\n        case AuditLogType.UserAdded:\n            return `Nieuwe accounts`;\n        case AuditLogType.UserEdited:\n            return `Wijzigingen aan accounts`;\n        case AuditLogType.UserDeleted:\n            return `Verwijderde accounts`;\n        case AuditLogType.MemberResponsibilityRecordAdded:\n            return `Nieuwe toegekende functies`;\n        case AuditLogType.MemberResponsibilityRecordEdited:\n            return `Wijzigingen aan toegekende functies`;\n        case AuditLogType.MemberResponsibilityRecordDeleted:\n            return `Verwijderde functies`;\n        case AuditLogType.MemberPlatformMembershipAdded:\n            return `Nieuwe aansluitingen`;\n        case AuditLogType.MemberPlatformMembershipEdited:\n            return `Wijzigingen aan aansluitingen`;\n        case AuditLogType.MemberPlatformMembershipDeleted:\n            return `Verwijderde aansluitingen`;\n        case AuditLogType.EmailSent:\n            return `Succesvol verzonden e-mails`;\n        case AuditLogType.EmailSending:\n            return `E-mails gestart met verzenden`;\n        case AuditLogType.EmailAddressMarkedAsSpam:\n            return `E-mailadressen gemarkeerd als spam`;\n        case AuditLogType.EmailAddressHardBounced:\n            return `E-mailadressen die hard gebounced zijn`;\n        case AuditLogType.EmailAddressSoftBounced:\n            return `E-mailadressen die soft gebounced zijn`;\n        case AuditLogType.EmailAddressUnsubscribed:\n            return `E-mailadressen die zich hebben uitgeschreven`;\n        case AuditLogType.EmailTemplateAdded:\n            return `Nieuw e-mailsjabloon`;\n        case AuditLogType.EmailTemplateEdited:\n            return `Wijzigingen aan e-mailsjablonen`;\n        case AuditLogType.EmailTemplateDeleted:\n            return `Verwijderde E-mailsjablonen`;\n        case AuditLogType.EmailAddressFraudComplaint:\n            return `E-mailadressen die een fraudeklacht hebben ingediend`;\n        case AuditLogType.MemberSecurityCodeUsed:\n            return `Gebruik van beveiligingscodes`;\n    }\n}\nexport function getAuditLogTypeIcon(type) {\n    switch (type) {\n        case AuditLogType.MemberEdited:\n            return [`user`, `edit`];\n        case AuditLogType.MemberAdded:\n            return [`user`, 'add green'];\n        case AuditLogType.MemberDeleted:\n            return [`user`, `canceled red`];\n        case AuditLogType.MemberRegistered:\n            return [`membership-filled`, `success`];\n        case AuditLogType.MemberUnregistered:\n            return [`membership-filled`, `canceled red`];\n        case AuditLogType.PlatformSettingsChanged:\n            return [`flag`, `settings`];\n        case AuditLogType.OrganizationEdited:\n            return [`flag`];\n        case AuditLogType.OrganizationAdded:\n            return [`flag`, `add green`];\n        case AuditLogType.OrganizationDeleted:\n            return [`flag`, `canceled red`];\n        case AuditLogType.Unknown:\n            return [`history`];\n        case AuditLogType.EventEdited:\n            return [`calendar`, `edit`];\n        case AuditLogType.EventAdded:\n            return [`calendar`, `add green`];\n        case AuditLogType.EventDeleted:\n            return [`calendar`, `canceled red`];\n        case AuditLogType.GroupEdited:\n            return [`group`, `edit`];\n        case AuditLogType.GroupAdded:\n            return [`group`, `add green`];\n        case AuditLogType.GroupDeleted:\n            return [`group`, `canceled red`];\n        case AuditLogType.WaitingListEdited:\n            return [`hourglass`, `edit`];\n        case AuditLogType.WaitingListAdded:\n            return [`hourglass`, `add green`];\n        case AuditLogType.WaitingListDeleted:\n            return [`hourglass`, `canceled red`];\n        case AuditLogType.RegistrationPeriodEdited:\n            return [`history`, `edit`];\n        case AuditLogType.RegistrationPeriodAdded:\n            return [`history`, `add green`];\n        case AuditLogType.RegistrationPeriodDeleted:\n            return [`history`, `canceled red`];\n        case AuditLogType.StripeAccountAdded:\n            return [`stripe`, `add green`];\n        case AuditLogType.StripeAccountDeleted:\n            return [`stripe`, `canceled red`];\n        case AuditLogType.StripeAccountEdited:\n            return [`stripe`, `edit`];\n        case AuditLogType.WebshopEdited:\n            return [`basket`, `edit`];\n        case AuditLogType.WebshopAdded:\n            return [`basket`, `add green`];\n        case AuditLogType.WebshopDeleted:\n            return [`basket`, `canceled red`];\n        case AuditLogType.OrderAdded:\n            return [`basket`, `add green`];\n        case AuditLogType.OrderEdited:\n            return [`basket`, `edit`];\n        case AuditLogType.OrderDeleted:\n            return [`basket`, `canceled red`];\n        case AuditLogType.PaymentAdded:\n            return [`card`, `add green`];\n        case AuditLogType.PaymentEdited:\n            return [`card`, `edit`];\n        case AuditLogType.PaymentDeleted:\n            return [`card`, `canceled red`];\n        case AuditLogType.DocumentTemplateAdded:\n            return [`file`, `add green`];\n        case AuditLogType.DocumentTemplateEdited:\n            return [`file`, `edit`];\n        case AuditLogType.DocumentTemplateDeleted:\n            return [`file`, `canceled red`];\n        case AuditLogType.UserAdded:\n            return [`user`, `add green`];\n        case AuditLogType.UserEdited:\n            return [`user`, `edit`];\n        case AuditLogType.UserDeleted:\n            return [`user`, `canceled red`];\n        case AuditLogType.MemberResponsibilityRecordAdded:\n            return [`star`, `add green`];\n        case AuditLogType.MemberResponsibilityRecordEdited:\n            return [`star`, `edit`];\n        case AuditLogType.MemberResponsibilityRecordDeleted:\n            return [`star`, `canceled red`];\n        case AuditLogType.MemberPlatformMembershipAdded:\n            return [`membership-filled`, `add green`];\n        case AuditLogType.MemberPlatformMembershipEdited:\n            return [`membership-filled`, `edit`];\n        case AuditLogType.MemberPlatformMembershipDeleted:\n            return [`membership-filled`, `canceled red`];\n        case AuditLogType.EmailSent:\n            return [`email`, `success primary`];\n        case AuditLogType.EmailSending:\n            return [`email`, `clock`];\n        case AuditLogType.EmailAddressMarkedAsSpam:\n            return [`email`, `error red`];\n        case AuditLogType.EmailAddressHardBounced:\n            return [`email`, `error red`];\n        case AuditLogType.EmailAddressSoftBounced:\n            return [`email`, `warning`];\n        case AuditLogType.EmailAddressUnsubscribed:\n            return [`email`, `disabled red`];\n        case AuditLogType.EmailAddressFraudComplaint:\n            return [`email`, `error red`];\n        case AuditLogType.EmailTemplateAdded:\n            return [`email-template`, `add green`];\n        case AuditLogType.EmailTemplateEdited:\n            return [`email-template`, `edit`];\n        case AuditLogType.EmailTemplateDeleted:\n            return [`email-template`, `canceled red`];\n        case AuditLogType.MemberSecurityCodeUsed:\n            return [`key`, `success primary`];\n    }\n}\nfunction getAuditLogTypeTitleTemplate(type) {\n    switch (type) {\n        case AuditLogType.MemberAdded:\n            return `{{m}} werd aangemaakt`;\n        case AuditLogType.MemberDeleted:\n            return `{{m}} werd verwijderd`;\n        case AuditLogType.MemberEdited:\n            return `De gegevens van {{m}} werden gewijzigd`;\n        case AuditLogType.MemberRegistered:\n            return `{{m}} werd ingeschreven voor {{g}}{{if org \" (\" org \")\"}}`;\n        case AuditLogType.MemberUnregistered:\n            return `{{m}} werd uitgeschreven voor {{g}}{{if org \" (\" org \")\"}}`;\n        case AuditLogType.Unknown:\n            return `Onbekende actie`;\n        case AuditLogType.PlatformSettingsChanged:\n            return `De platforminstellingen werden gewijzigd`;\n        case AuditLogType.OrganizationEdited:\n            return `{{if org 'De instellingen van ' org ' werden gewijzigd'}}{{unless org 'De instellingen werden gewijzigd'}}`;\n        case AuditLogType.OrganizationAdded:\n            return `De lokale groep {{org}} werd aangemaakt`;\n        case AuditLogType.OrganizationDeleted:\n            return `De lokale groep {{org}} werd verwijderd`;\n        case AuditLogType.EventEdited:\n            return `De activiteit {{e}}{{if org \" (\" org \")\"}} werd gewijzigd`;\n        case AuditLogType.EventAdded:\n            return `De activiteit {{e}}{{if org \" (\" org \")\"}} werd aangemaakt`;\n        case AuditLogType.EventDeleted:\n            return `De activiteit {{e}}{{if org \" (\" org \")\"}} werd verwijderd`;\n        case AuditLogType.GroupEdited:\n            return `De groep {{g}}{{if org \" (\" org \")\"}} werd gewijzigd`;\n        case AuditLogType.GroupAdded:\n            return `De groep {{g}}{{if org \" (\" org \")\"}} werd aangemaakt`;\n        case AuditLogType.GroupDeleted:\n            return `De groep {{g}}{{if org \" (\" org \")\"}} werd verwijderd`;\n        case AuditLogType.WaitingListEdited:\n            return `De wachtlijst {{g}}{{if org \" (\" org \")\"}} werd gewijzigd`;\n        case AuditLogType.WaitingListAdded:\n            return `De wachtlijst {{g}}{{if org \" (\" org \")\"}} werd aangemaakt`;\n        case AuditLogType.WaitingListDeleted:\n            return `De wachtlijst {{g}}{{if org \" (\" org \")\"}} werd verwijderd`;\n        case AuditLogType.RegistrationPeriodEdited:\n            return `Het werkjaar {{p}} werd gewijzigd`;\n        case AuditLogType.RegistrationPeriodAdded:\n            return `Het werkjaar {{p}} werd aangemaakt`;\n        case AuditLogType.RegistrationPeriodDeleted:\n            return `Het werkjaar {{p}} werd verwijderd`;\n        case AuditLogType.StripeAccountAdded:\n            return `Stripe account {{a}}{{if org \" (\" org \")\"}} aangemaakt`;\n        case AuditLogType.StripeAccountDeleted:\n            return `Stripe account {{a}}{{if org \" (\" org \")\"}} verwijderd`;\n        case AuditLogType.StripeAccountEdited:\n            return `Stripe account {{a}}{{if org \" (\" org \")\"}} gewijzigd`;\n        case AuditLogType.WebshopEdited:\n            return `De webshop {{w}}{{if org \" (\" org \")\"}} werd gewijzigd`;\n        case AuditLogType.WebshopAdded:\n            return `De webshop {{w}}{{if org \" (\" org \")\"}} werd aangemaakt`;\n        case AuditLogType.WebshopDeleted:\n            return `De webshop {{w}}{{if org \" (\" org \")\"}} werd verwijderd`;\n        case AuditLogType.OrderAdded:\n            return `{{capitalizeFirstLetter o}} werd geplaatst (voor {{w}})`;\n        case AuditLogType.OrderEdited:\n            return `{{capitalizeFirstLetter o}} werd gewijzigd ({{w}})`;\n        case AuditLogType.OrderDeleted:\n            return `{{capitalizeFirstLetter o}} werd verwijderd ({{w}})`;\n        case AuditLogType.PaymentAdded:\n            return `{{capitalizeFirstLetter p}} werd aangemaakt`;\n        case AuditLogType.PaymentEdited:\n            return `{{capitalizeFirstLetter p}} werd gewijzigd`;\n        case AuditLogType.PaymentDeleted:\n            return `{{capitalizeFirstLetter p}} werd verwijderd`;\n        case AuditLogType.DocumentTemplateAdded:\n            return `Document {{d}}{{if org \" (\" org \")\"}} werd aangemaakt`;\n        case AuditLogType.DocumentTemplateEdited:\n            return `Document {{d}}{{if org \" (\" org \")\"}} werd gewijzigd`;\n        case AuditLogType.DocumentTemplateDeleted:\n            return `Document {{d}}{{if org \" (\" org \")\"}} werd verwijderd`;\n        case AuditLogType.UserAdded:\n            return `Account {{u}} werd aangemaakt`;\n        case AuditLogType.UserEdited:\n            return `Account {{u}} werd gewijzigd`;\n        case AuditLogType.UserDeleted:\n            return `Account {{u}} werd verwijderd`;\n        case AuditLogType.MemberResponsibilityRecordAdded:\n            return `Functie {{r}}{{if g \" van \" g}}{{if org \" (\" org \")\"}} werd toegekend aan {{m}}`;\n        case AuditLogType.MemberResponsibilityRecordEdited:\n            return `Functie {{r}}{{if g \" van \" g}}{{if org \" (\" org \")\"}} werd gewijzigd bij {{m}}`;\n        case AuditLogType.MemberResponsibilityRecordDeleted:\n            return `Functie {{r}}{{if g \" van \" g}}{{if org \" (\" org \")\"}} werd verwijderd van {{m}}`;\n        case AuditLogType.MemberPlatformMembershipAdded:\n            return `Aansluiting {{pm}} werd toegevoegd bij {{m}}{{if org \" via \" org}}`;\n        case AuditLogType.MemberPlatformMembershipEdited:\n            return `Aansluiting {{pm}} werd gewijzigd bij {{m}}{{if org \" via \" org}}`;\n        case AuditLogType.MemberPlatformMembershipDeleted:\n            return `Aansluiting {{pm}} werd verwijderd bij {{m}}{{if org \" via \" org}}`;\n        case AuditLogType.EmailSent:\n            return `E-mail {{e}} werd succesvol verzonden aan {{c}} {{ plural c 'ontvanger' 'ontvangers' }}`;\n        case AuditLogType.EmailSending:\n            return `E-mail {{e}} werd ingepland om te verzenden aan {{c}} {{ plural c 'ontvanger' 'ontvangers' }}`;\n        case AuditLogType.EmailAddressMarkedAsSpam:\n            return `{{if subject 'De e-mail ‘', subject '’'}}{{unless subject 'Een e-mail'}} werd door {{e}} als spam gemarkeerd`;\n        case AuditLogType.EmailAddressFraudComplaint:\n            return `{{if subject 'De e-mail ‘', subject '’'}}{{unless subject 'Een e-mail'}} werd door {{e}} als fraude, phishing of virus gemarkeerd`;\n        case AuditLogType.EmailAddressHardBounced:\n            return `{{if subject 'De e-mail ‘', subject '’'}}{{unless subject 'Een e-mail'}} naar {{e}} is permanent mislukt`;\n        case AuditLogType.EmailAddressSoftBounced:\n            return `{{if subject 'De e-mail ‘', subject '’'}}{{unless subject 'Een e-mail'}} naar {{e}} is mislukt`;\n        case AuditLogType.EmailAddressUnsubscribed:\n            return `{{e}} heeft zich uitgeschreven voor e-mails`;\n        case AuditLogType.EmailTemplateAdded:\n            return `E-mailsjabloon {{e}} werd aangemaakt {{if org \" voor \" org}}`;\n        case AuditLogType.EmailTemplateEdited:\n            return `E-mailsjabloon {{e}} werd gewijzigd {{if org \" voor \" org}}`;\n        case AuditLogType.EmailTemplateDeleted:\n            return `E-mailsjabloon {{e}} werd verwijderd {{if org \" voor \" org}}`;\n        case AuditLogType.MemberSecurityCodeUsed:\n            return `De beveiligingscode werd gebruikt om toegang te krijgen tot {{m}}`;\n    }\n}\nfunction getAuditLogTypeDescriptionTemplate(type) {\n    switch (type) {\n        case AuditLogType.EmailSent:\n            return `{{html}}`;\n        case AuditLogType.EmailAddressMarkedAsSpam:\n            return `Verzonden door {{sender}} {{if org \" (\" org \")\"}}\\n{{if subType 'Reden: ' subType '\\n'}}{{if response 'Volledig antwoord: ' response '\\n'}}Soms doen mensen dit per ongeluk. Vraag hen dan de e-mail terug als 'geen spam' te markeren.`;\n        case AuditLogType.EmailAddressHardBounced:\n            return `Verzonden door {{sender}} {{if org \" (\" org \")\"}}\\n{{if subType 'Reden: ' subType '\\n'}}{{if response 'Volledig antwoord: ' response '\\n'}}De e-mailprovider gaat ervanuit dat dit een permanent probleem is, dus toekomstige e-mails zullen niet meer verzonden worden naar dit adres. Meestal komt dit voor bij een ongeldig e-mailadres.`;\n        case AuditLogType.EmailAddressSoftBounced:\n            return `Verzonden door {{sender}} {{if org \" (\" org \")\"}}\\n{{if subType 'Reden: ' subType '\\n'}}{{if response 'Volledig antwoord: ' response '\\n'}}Wellicht gaat het om een tijdelijk probleem (bv. volle inbox).`;\n        case AuditLogType.EmailAddressFraudComplaint:\n            return `Verzonden door {{sender}} {{if org \" (\" org \")\"}}\\n{{if subType 'Reden: ' subType '\\n'}}{{if response 'Volledig antwoord: ' response}}`;\n    }\n}\nfunction getTypeReplacements(type) {\n    switch (type) {\n        case AuditLogType.MemberAdded:\n        case AuditLogType.MemberEdited:\n        case AuditLogType.MemberDeleted:\n        case AuditLogType.MemberSecurityCodeUsed:\n            return ['m'];\n        case AuditLogType.MemberRegistered:\n        case AuditLogType.MemberUnregistered:\n            return ['m', 'g'];\n        case AuditLogType.OrganizationEdited:\n        case AuditLogType.OrganizationAdded:\n        case AuditLogType.OrganizationDeleted:\n            return ['o'];\n        case AuditLogType.Unknown:\n            return [];\n        case AuditLogType.EventAdded:\n        case AuditLogType.EventEdited:\n        case AuditLogType.EventDeleted:\n            return ['e'];\n        case AuditLogType.GroupEdited:\n        case AuditLogType.GroupAdded:\n        case AuditLogType.GroupDeleted:\n        case AuditLogType.WaitingListEdited:\n        case AuditLogType.WaitingListAdded:\n        case AuditLogType.WaitingListDeleted:\n            return ['g'];\n        case AuditLogType.RegistrationPeriodEdited:\n        case AuditLogType.RegistrationPeriodAdded:\n        case AuditLogType.RegistrationPeriodDeleted:\n            return ['p'];\n        case AuditLogType.StripeAccountAdded:\n        case AuditLogType.StripeAccountDeleted:\n        case AuditLogType.StripeAccountEdited:\n            return ['a'];\n        case AuditLogType.WebshopEdited:\n        case AuditLogType.WebshopAdded:\n        case AuditLogType.WebshopDeleted:\n            return ['w'];\n        case AuditLogType.OrderAdded:\n        case AuditLogType.OrderEdited:\n        case AuditLogType.OrderDeleted:\n            return ['o', 'w'];\n        case AuditLogType.PaymentAdded:\n        case AuditLogType.PaymentEdited:\n        case AuditLogType.PaymentDeleted:\n            return ['p'];\n        case AuditLogType.DocumentTemplateAdded:\n        case AuditLogType.DocumentTemplateEdited:\n        case AuditLogType.DocumentTemplateDeleted:\n            return ['d'];\n        case AuditLogType.UserAdded:\n        case AuditLogType.UserEdited:\n        case AuditLogType.UserDeleted:\n            return ['u'];\n        case AuditLogType.MemberResponsibilityRecordAdded:\n        case AuditLogType.MemberResponsibilityRecordEdited:\n        case AuditLogType.MemberResponsibilityRecordDeleted:\n            return ['r', 'm'];\n        case AuditLogType.MemberPlatformMembershipAdded:\n        case AuditLogType.MemberPlatformMembershipEdited:\n        case AuditLogType.MemberPlatformMembershipDeleted:\n            return ['pm', 'm'];\n        case AuditLogType.EmailSent:\n        case AuditLogType.EmailSending:\n            return ['e'];\n        case AuditLogType.EmailAddressMarkedAsSpam:\n        case AuditLogType.EmailAddressHardBounced:\n        case AuditLogType.EmailAddressSoftBounced:\n        case AuditLogType.EmailAddressUnsubscribed:\n        case AuditLogType.EmailAddressFraudComplaint:\n            return ['e'];\n        case AuditLogType.EmailTemplateAdded:\n        case AuditLogType.EmailTemplateEdited:\n        case AuditLogType.EmailTemplateDeleted:\n            return ['e'];\n        default:\n            return [];\n    }\n}\nexport var AuditLogPatchItemType;\n(function (AuditLogPatchItemType) {\n    AuditLogPatchItemType[\"Added\"] = \"Added\";\n    AuditLogPatchItemType[\"Removed\"] = \"Removed\";\n    AuditLogPatchItemType[\"Changed\"] = \"Changed\";\n    AuditLogPatchItemType[\"Reordered\"] = \"Reordered\";\n})(AuditLogPatchItemType || (AuditLogPatchItemType = {}));\nexport class AuditLogPatchItem extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.key = AuditLogReplacement.empty();\n    }\n    autoType() {\n        if (!this.oldValue && this.value) {\n            this.type = AuditLogPatchItemType.Added;\n        }\n        else if (!this.value && this.oldValue) {\n            this.type = AuditLogPatchItemType.Removed;\n        }\n        else {\n            this.type = AuditLogPatchItemType.Changed;\n        }\n        return this;\n    }\n}\n__decorate([\n    field({ field: 'k', decoder: AuditLogReplacement })\n], AuditLogPatchItem.prototype, \"key\", void 0);\n__decorate([\n    field({ field: 'o', decoder: AuditLogReplacement, optional: true })\n], AuditLogPatchItem.prototype, \"oldValue\", void 0);\n__decorate([\n    field({ field: 'v', decoder: AuditLogReplacement, optional: true })\n], AuditLogPatchItem.prototype, \"value\", void 0);\n__decorate([\n    field({ field: 't', decoder: new EnumDecoder(AuditLogPatchItemType), optional: true })\n], AuditLogPatchItem.prototype, \"type\", void 0);\nconst helpers = {\n    plural: (context, object, singular, plural) => {\n        if (object instanceof AuditLogReplacement) {\n            if (object.count === undefined) {\n                return object.value === '1' ? [singular] : [plural];\n            }\n            return object.count === 1 ? [singular] : [plural];\n        }\n        return [object === 1 || object === '1' ? singular : plural];\n    },\n    capitalizeFirstLetter: (context, object) => {\n        if (object instanceof AuditLogReplacement) {\n            const clone = object.clone();\n            clone.value = Formatter.capitalizeFirstLetter(clone.value);\n            return [clone];\n        }\n        return [object];\n    },\n    if: (context, object, ...prefixes) => {\n        if (object) {\n            return [...prefixes];\n        }\n        return [];\n    },\n    unless: (context, object, ...prefixes) => {\n        if (!object) {\n            return [...prefixes];\n        }\n        return [];\n    },\n};\nexport class AuditLog extends AutoEncoder {\n    constructor() {\n        super(...arguments);\n        this.organizationId = null;\n        /**\n         * The user who performed the action. Might get anonymized in case the user does not have permission to view who performed the action.\n         */\n        this.objectId = null;\n        /**\n         * A custom description in case the patchList can't be used (try to avoid because these won't be translated)\n         */\n        this.description = '';\n        this.meta = new Map();\n        this.patchList = [];\n    }\n    get renderableTitle() {\n        try {\n            return renderTemplate(getAuditLogTypeTitleTemplate(this.type), {\n                type: 'text',\n                context: Object.fromEntries(this.replacements.entries()),\n                helpers,\n            });\n        }\n        catch (e) {\n            console.error('Invalid render template', e);\n            return ['Onbekende actie'];\n        }\n    }\n    get renderableDescription() {\n        const template = getAuditLogTypeDescriptionTemplate(this.type);\n        if (!template) {\n            return [];\n        }\n        try {\n            return renderTemplate(template, {\n                type: 'text',\n                context: Object.fromEntries(this.replacements.entries()),\n                helpers,\n            });\n        }\n        catch (e) {\n            console.error('Invalid render template', e);\n            return ['Onbekende actie'];\n        }\n    }\n    get title() {\n        return this.renderableTitle.map(v => v.toString()).join('');\n    }\n    get icon() {\n        return getAuditLogTypeIcon(this.type)[0];\n    }\n    get subIcon() {\n        return getAuditLogTypeIcon(this.type)[1];\n    }\n    validate() {\n        const replacements = getTypeReplacements(this.type);\n        for (const replacement of replacements) {\n            if (!this.replacements.has(replacement)) {\n                throw new Error(`Missing replacement ${replacement}`);\n            }\n        }\n    }\n}\n__decorate([\n    field({ decoder: StringDecoder })\n], AuditLog.prototype, \"id\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(AuditLogSource), version: 350 })\n], AuditLog.prototype, \"source\", void 0);\n__decorate([\n    field({ decoder: new EnumDecoder(AuditLogType) })\n], AuditLog.prototype, \"type\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], AuditLog.prototype, \"organizationId\", void 0);\n__decorate([\n    field({ decoder: NamedObject, nullable: true })\n], AuditLog.prototype, \"user\", void 0);\n__decorate([\n    field({ decoder: StringDecoder, nullable: true })\n], AuditLog.prototype, \"objectId\", void 0);\n__decorate([\n    field({ decoder: StringDecoder })\n], AuditLog.prototype, \"description\", void 0);\n__decorate([\n    field({ decoder: new MapDecoder(StringDecoder, AuditLogReplacement) })\n], AuditLog.prototype, \"replacements\", void 0);\n__decorate([\n    field({ decoder: new MapDecoder(StringDecoder, StringOrNumberDecoder), version: 357 })\n], AuditLog.prototype, \"meta\", void 0);\n__decorate([\n    field({ decoder: new ArrayDecoder(AuditLogPatchItem) })\n], AuditLog.prototype, \"patchList\", void 0);\n__decorate([\n    field({ decoder: DateDecoder })\n], AuditLog.prototype, \"createdAt\", void 0);\n//# sourceMappingURL=AuditLog.js.map","import { Platform } from '../Platform.js';\nexport function uuidToName(uuid) {\n    var _a, _b;\n    // Look up in UUID library list\n    const objectLists = [\n        Platform.shared.config.premiseTypes,\n        Platform.shared.config.eventTypes,\n        Platform.shared.config.defaultAgeGroups,\n        Platform.shared.config.tags,\n        Platform.shared.config.recordsConfiguration.recordCategories,\n        Platform.shared.config.membershipTypes,\n        Platform.shared.config.responsibilities,\n        (_b = (_a = Platform.shared.privateConfig) === null || _a === void 0 ? void 0 : _a.roles) !== null && _b !== void 0 ? _b : [],\n    ];\n    for (const list of objectLists) {\n        for (const object of list) {\n            if (object.id === uuid) {\n                return object.name;\n            }\n        }\n    }\n    return null;\n}\n//# sourceMappingURL=uuidToName.js.map","import { AccessRightHelper } from '../AccessRight.js';\nimport { CountryHelper } from '../addresses/CountryDecoder.js';\nimport { AuditLogReplacementDependencies } from '../AuditLogReplacement.js';\nimport { STPackageTypeHelper } from '../billing/STPackage.js';\nimport { DocumentStatusHelper } from '../Document.js';\nimport { EmailTemplate } from '../email/EmailTemplate.js';\nimport { getGroupStatusName } from '../Group.js';\nimport { uuidToName } from '../helpers/uuidToName.js';\nimport { getGenderName } from '../members/Gender.js';\nimport { ParentTypeHelper } from '../members/ParentType.js';\nimport { OrganizationTypeHelper } from '../OrganizationType.js';\nimport { PaymentMethodHelper } from '../PaymentMethod.js';\nimport { PaymentStatusHelper } from '../PaymentStatus.js';\nimport { getSetupStepName } from '../SetupStepType.js';\nimport { UmbrellaOrganizationHelper } from '../UmbrellaOrganization.js';\nimport { OrderStatusHelper } from '../webshops/Order.js';\nimport { CheckoutMethodTypeHelper } from '../webshops/WebshopMetaData.js';\nAuditLogReplacementDependencies.enumHelpers.push(PaymentMethodHelper.getPluralName, ParentTypeHelper.getName, OrderStatusHelper.getName, DocumentStatusHelper.getName, AccessRightHelper.getName, CheckoutMethodTypeHelper.getName, CountryHelper.getName, \n// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\nOrganizationTypeHelper.getName.bind(OrganizationTypeHelper), \n// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\nPaymentStatusHelper.getName.bind(PaymentStatusHelper), \n// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\nUmbrellaOrganizationHelper.getName.bind(UmbrellaOrganizationHelper), \n// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\nSTPackageTypeHelper.getName.bind(STPackageTypeHelper), \n// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\nParentTypeHelper.getName.bind(ParentTypeHelper), getGroupStatusName, getGenderName, getSetupStepName, EmailTemplate.getTypeTitle);\nAuditLogReplacementDependencies.uuidToName = uuidToName;\n//# sourceMappingURL=AuditLogReplacementDependencies.js.map","import { Address, ValidatedAddress } from '../addresses/Address.js';\nimport { Country } from '../addresses/CountryDecoder.js';\nimport { BalanceItem } from '../BalanceItem.js';\nimport { BalanceItemPaymentDetailed } from '../BalanceItemDetailed.js';\nimport { injectReplacementValues } from '../email/exampleReplacements.js';\nimport { Replacement } from '../endpoints/EmailRequest.js';\nimport { Payment } from '../members/Payment.js';\nimport { PaymentGeneral } from '../members/PaymentGeneral.js';\nimport { Organization } from '../Organization.js';\nimport { OrganizationMetaData } from '../OrganizationMetaData.js';\nimport { OrganizationType } from '../OrganizationType.js';\nimport { PaymentMethod } from '../PaymentMethod.js';\nimport { PaymentStatus } from '../PaymentStatus.js';\nimport { Cart } from '../webshops/Cart.js';\nimport { CartItem, CartItemPrice } from '../webshops/CartItem.js';\nimport { Customer } from '../webshops/Customer.js';\nimport { Order, OrderData } from '../webshops/Order.js';\nimport { Product, ProductPrice } from '../webshops/Product.js';\nimport { TransferSettings, TransferDescriptionType } from '../webshops/TransferSettings.js';\nimport { WebshopPreview } from '../webshops/Webshop.js';\nimport { WebshopTimeSlot, WebshopTakeoutMethod, WebshopMetaData } from '../webshops/WebshopMetaData.js';\ninjectReplacementValues(fillReplacements);\nfunction fillReplacements(replacements) {\n    const exampleOrder = Order.create({\n        id: '',\n        payment: Payment.create({\n            id: '',\n            method: PaymentMethod.Transfer,\n            transferDescription: '+++111/111/111+++',\n            price: 1500,\n            transferSettings: TransferSettings.create({\n                type: TransferDescriptionType.Structured,\n                iban: 'BE1234 1234 1234',\n                creditor: $t('16ba3d97-5943-451d-92b5-0bf21555f7ae'),\n            }),\n            createdAt: new Date(),\n            updatedAt: new Date(),\n        }),\n        webshopId: '',\n        number: 15,\n        data: OrderData.create({\n            customer: Customer.create({\n                firstName: 'John',\n                lastName: 'Doe',\n                email: 'john@example.com',\n                phone: '+32 479 45 71 52',\n            }),\n            timeSlot: WebshopTimeSlot.create({\n                date: new Date(),\n                startTime: 12 * 60,\n                endTime: 13 * 60,\n            }),\n            checkoutMethod: WebshopTakeoutMethod.create({\n                name: 'Bakkerij',\n                address: Address.create({\n                    street: 'Demostraat',\n                    number: '12',\n                    postalCode: '9000',\n                    city: 'Gent',\n                    country: Country.Belgium,\n                }),\n            }),\n            address: ValidatedAddress.create({\n                street: 'Demostraat',\n                number: '12',\n                postalCode: '9000',\n                city: 'Gent',\n                country: Country.Belgium,\n                cityId: '',\n                parentCityId: null,\n                provinceId: '',\n            }),\n            cart: Cart.create({\n                items: [\n                    CartItem.create({\n                        product: Product.create({\n                            name: 'Voorbeeld product',\n                        }),\n                        productPrice: ProductPrice.create({\n                            price: 550,\n                        }),\n                        amount: 2,\n                        calculatedPrices: [CartItemPrice.create({\n                                price: 550,\n                            }), CartItemPrice.create({\n                                price: 550,\n                            })],\n                    }),\n                    CartItem.create({\n                        product: Product.create({\n                            name: 'Nog een voorbeeld product',\n                        }),\n                        productPrice: ProductPrice.create({\n                            price: 400,\n                        }),\n                        amount: 1,\n                        calculatedPrices: [CartItemPrice.create({\n                                price: 400,\n                            })],\n                    }),\n                ],\n            }),\n            paymentMethod: PaymentMethod.CreditCard,\n        }),\n    });\n    const recipient = exampleOrder.getEmailRecipient(Organization.create({\n        name: $t('16ba3d97-5943-451d-92b5-0bf21555f7ae'),\n        uri: 'demo',\n        meta: OrganizationMetaData.create({\n            type: OrganizationType.Other,\n            defaultStartDate: new Date(),\n            defaultEndDate: new Date(),\n        }),\n        address: Address.createDefault(Country.Belgium),\n    }), WebshopPreview.create({\n        meta: WebshopMetaData.create({\n            name: $t('a17cab0f-62f8-4403-8436-c649f578196f'),\n        }),\n    }));\n    const balance1 = BalanceItem.create({\n        description: 'Voorbeeld betaallijn 1',\n        unitPrice: 1234,\n    });\n    const balance2 = BalanceItem.create({\n        description: 'Voorbeeld betaallijn 2',\n        unitPrice: 1234,\n        amount: 2,\n    });\n    const paymentGeneral = PaymentGeneral.create({\n        method: PaymentMethod.Transfer,\n        status: PaymentStatus.Pending,\n        iban: 'BE1234 1234 1234',\n        ibanName: 'Voorbeeld',\n        transferDescription: '+++111/111/111+++',\n        transferSettings: TransferSettings.create({\n            type: TransferDescriptionType.Structured,\n            iban: 'BE1234 1234 1234',\n            creditor: $t('16ba3d97-5943-451d-92b5-0bf21555f7ae'),\n        }),\n        price: 1234 + 2468,\n        balanceItemPayments: [\n            BalanceItemPaymentDetailed.create({\n                price: 1234,\n                balanceItem: balance1,\n            }),\n            BalanceItemPaymentDetailed.create({\n                price: 2468,\n                balanceItem: balance2,\n            }),\n        ],\n    });\n    const paymentReplacemnets = [\n        Replacement.create({\n            token: 'overviewTable',\n            value: '',\n            html: paymentGeneral.getDetailsHTMLTable(),\n        }),\n        Replacement.create({\n            token: 'paymentTable',\n            value: '',\n            html: paymentGeneral.getHTMLTable(),\n        }),\n        Replacement.create({\n            token: 'balanceTable',\n            value: '',\n            html: BalanceItem.getDetailsHTMLTable([\n                balance1,\n                balance2,\n            ]),\n        }),\n    ];\n    for (const replacement of [...recipient.replacements, ...recipient.getDefaultReplacements(), ...paymentReplacemnets]) {\n        const variable = replacements.find(v => v.token === replacement.token);\n        if (variable) {\n            if (replacement.value) {\n                variable.value = replacement.value;\n            }\n            if (replacement.html) {\n                variable.html = replacement.html;\n            }\n        }\n    }\n}\n//# sourceMappingURL=ExampleReplacementsDependencies.js.map","if (typeof window === 'object') {\n    if (!window.$t) {\n        window.$t = (s) => s;\n    }\n}\nif (typeof global === 'object') {\n    if (!global.$t) {\n        global.$t = (s) => s;\n    }\n}\nif (typeof self === 'object') {\n    if (!self.$t) {\n        self.$t = (s) => s;\n    }\n}\n// Latest version of the structures\nexport { Version } from './src/Version.js';\nexport * from './src/PriceBreakdown.js';\n// General\nexport * from './src/AccessRight.js';\nexport * from './src/addresses/Address.js';\nexport * from './src/addresses/City.js';\nexport * from './src/addresses/CountryDecoder.js';\nexport * from './src/addresses/Premise.js';\nexport * from './src/addresses/Province.js';\nexport * from './src/addresses/SearchRegions.js';\nexport * from './src/Company.js';\nexport * from './src/DefaultAgeGroup.js';\nexport * from './src/Document.js';\nexport * from './src/Event.js';\nexport * from './src/EventNotification.js';\nexport * from './src/EventNotificationStatus.js';\nexport * from './src/EventNotificationType.js';\nexport * from './src/GenericBalance.js';\nexport * from './src/Group.js';\nexport * from './src/GroupCategory.js';\nexport * from './src/GroupGenderType.js';\nexport * from './src/GroupPrivateSettings.js';\nexport * from './src/GroupSettings.js';\nexport * from './src/GroupType.js';\nexport * from './src/LoginMethod.js';\nexport * from './src/MemberResponsibility.js';\nexport * from './src/members/MemberPlatformMembership.js';\nexport * from './src/members/MemberResponsibilityRecord.js';\nexport * from './src/members/NationalRegisterNumberOptOut.js';\nexport * from './src/OldGroupPrices.js';\nexport * from './src/OpenID.js';\nexport * from './src/Organization.js';\nexport * from './src/OrganizationEmail.js';\nexport * from './src/OrganizationGenderType.js';\nexport * from './src/OrganizationLevelRecordsConfiguration.js';\nexport * from './src/OrganizationMetaData.js';\nexport * from './src/OrganizationPrivateMetaData.js';\nexport * from './src/OrganizationSimple.js';\nexport * from './src/OrganizationType.js';\nexport * from './src/PaymentConfiguration.js';\nexport * from './src/PaymentCustomer.js';\nexport * from './src/PaymentMethod.js';\nexport * from './src/PaymentProvider.js';\nexport * from './src/PaymentStatus.js';\nexport * from './src/PaymentType.js';\nexport * from './src/PermissionLevel.js';\nexport * from './src/PermissionRole.js';\nexport * from './src/Permissions.js';\nexport * from './src/PermissionsByRole.js';\nexport * from './src/PermissionsResourceType.js';\nexport * from './src/Platform.js';\nexport * from './src/PlatformServerConfig.js';\nexport * from './src/Policy.js';\nexport * from './src/ReceivableBalance.js';\nexport * from './src/RegisterCodeStatus.js';\nexport * from './src/RegistrationPeriod.js';\nexport * from './src/RegistrationPeriodBase.js';\nexport * from './src/ResourcePermissions.js';\nexport * from './src/RichText.js';\nexport * from './src/SeatingPlan.js';\nexport * from './src/SetupStepReview.js';\nexport * from './src/SetupSteps.js';\nexport * from './src/SetupStepType.js';\nexport * from './src/StockReservation.js';\nexport * from './src/StripeAccount.js';\nexport * from './src/Token.js';\nexport * from './src/UmbrellaOrganization.js';\nexport * from './src/User.js';\nexport * from './src/LoadedPermissions.js';\n// UserPermissions\nexport * from './src/UserPermissions.js';\nexport * from './src/UserWithMembers.js';\n// Endpoints\nexport * from './src/DNSRecord.js';\nexport * from './src/endpoints/ChargeMembershipsSummary.js';\nexport * from './src/endpoints/ChargeOrganizationsRequest.js';\nexport * from './src/endpoints/ChargeMembersRequest.js';\nexport * from './src/endpoints/CheckMollieResponse.js';\nexport * from './src/endpoints/CreateOrganization.js';\nexport * from './src/endpoints/EmailRequest.js';\nexport * from './src/endpoints/ForgotPasswordRequest.js';\nexport * from './src/endpoints/GroupsWithOrganizations.js';\nexport * from './src/endpoints/OrganizationAdmins.js';\nexport * from './src/endpoints/OrganizationDomains.js';\nexport * from './src/endpoints/PayableBalanceCollection.js';\nexport * from './src/endpoints/RegisterMember.js';\nexport * from './src/endpoints/RegisterResponse.js';\nexport * from './src/endpoints/SignupResponse.js';\nexport * from './src/endpoints/tokens/ChallengeGrantStruct.js';\nexport * from './src/endpoints/tokens/CreateTokenStruct.js';\nexport * from './src/endpoints/tokens/PasswordGrantStruct.js';\nexport * from './src/endpoints/tokens/PasswordTokenGrantStruct.js';\nexport * from './src/endpoints/tokens/RefreshTokenGrantStruct.js';\nexport * from './src/endpoints/tokens/RequestChallengeGrantStruct.js';\nexport * from './src/endpoints/VerifyEmailRequest.js';\nexport * from './src/endpoints/WebshopUriAvailabilityResponse.js';\n// email\nexport * from './src/email/EditorSmartButton.js';\nexport * from './src/email/EditorSmartVariable.js';\nexport * from './src/email/Email.js';\n// Grouping\nexport * from './src/grouping/PaginatedResponse.js';\n// Members\nexport * from './src/files/File.js';\nexport * from './src/files/Image.js';\nexport * from './src/files/Resolution.js';\nexport * from './src/files/ResolutionRequest.js';\nexport * from './src/members/EmergencyContact.js';\nexport * from './src/members/Gender.js';\nexport * from './src/members/Member.js';\nexport * from './src/members/MemberDetails.js';\nexport * from './src/members/MemberWithRegistrationsBlob.js';\nexport * from './src/members/ObjectWithRecords.js';\nexport * from './src/members/OrganizationRecordsConfiguration.js';\nexport * from './src/members/Parent.js';\nexport * from './src/members/ParentType.js';\nexport * from './src/members/Payment.js';\nexport * from './src/members/PaymentGeneral.js';\nexport * from './src/members/PaymentPatch.js';\nexport * from './src/members/PaymentWithRegistrations.js';\nexport * from './src/members/PlatformMember.js';\nexport * from './src/members/records/LegacyRecord.js';\nexport * from './src/members/records/LegacyRecordType.js';\nexport * from './src/members/records/RecordAnswer.js';\nexport * from './src/members/records/RecordCategory.js';\nexport * from './src/members/records/RecordConfigurationFactory.js';\nexport * from './src/members/records/RecordFactory.js';\nexport * from './src/members/records/RecordSettings.js';\nexport * from './src/members/Registration.js';\nexport * from './src/members/RegistrationPatch.js';\nexport * from './src/members/RegistrationWithEncryptedMember.js';\nexport * from './src/members/RegistrationWithMember.js';\nexport * from './src/members/ReviewTime.js';\n// Register checkout\nexport * from './src/members/checkout/BalanceItemCartItem.js';\nexport * from './src/members/checkout/RegisterCart.js';\nexport * from './src/members/checkout/RegisterCheckout.js';\nexport * from './src/members/checkout/RegisterItem.js';\n// Webshop\nexport * from './src/endpoints/WebshopOrdersQuery.js';\nexport * from './src/endpoints/WebshopTicketsQuery.js';\nexport * from './src/webshops/Cart.js';\nexport * from './src/webshops/CartItem.js';\nexport * from './src/webshops/CartStockHelper.js';\nexport * from './src/webshops/Category.js';\nexport * from './src/webshops/Checkout.js';\nexport * from './src/webshops/Customer.js';\nexport * from './src/webshops/Discount.js';\nexport * from './src/webshops/DiscountCode.js';\nexport * from './src/webshops/Order.js';\nexport * from './src/webshops/Product.js';\nexport * from './src/webshops/Ticket.js';\nexport * from './src/webshops/TransferSettings.js';\nexport * from './src/webshops/Webshop.js';\nexport * from './src/webshops/WebshopField.js';\nexport * from './src/webshops/WebshopMetaData.js';\n// billing\nexport * from './src/billing/STBillingStatus.js';\nexport * from './src/billing/STCredit.js';\nexport * from './src/billing/STInvoice.js';\nexport * from './src/billing/STPackage.js';\nexport * from './src/billing/STPackageBundle.js';\n// Admin\nexport * from './src/admin/Admin.js';\nexport * from './src/admin/MemberSummary.js';\nexport * from './src/admin/OrganizationSummary.js';\nexport * from './src/admin/StripePayoutExport.js';\nexport * from './src/Graph.js';\n// Email\nexport * from './src/email/EmailAddressSettings.js';\nexport * from './src/email/EmailTemplate.js';\n// Filters\nexport * from './src/filters/FilteredRequest.js';\nexport * from './src/filters/InMemoryFilter.js';\nexport * from './src/filters/inMemoryFilterDefinitions.js';\nexport * from './src/filters/InMemorySorter.js';\nexport * from './src/filters/PropertyFilter.js';\nexport * from './src/filters/searchFilterFactories.js';\nexport * from './src/filters/Sorters.js';\nexport * from './src/filters/SortList.js';\nexport * from './src/filters/StamhoofdFilter.js';\n// Balance\nexport * from './src/BalanceItem.js';\nexport * from './src/BalanceItemDetailed.js';\nexport * from './src/SponsorConfig.js';\nexport * from './src/filters/ExcelExportRequest.js';\nexport * from './src/filters/SearchFilterFactory.js';\nexport * from './src/helpers/index.js';\n// Last\nexport * from './src/AuditLog.js';\nexport * from './src/AuditLogReplacement.js';\n// Wire up circular dependencies\nimport './src/circular-dependencies/AuditLogReplacementDependencies.js';\nimport './src/circular-dependencies/ExampleReplacementsDependencies.js';\n//# sourceMappingURL=index.js.map","/**\n * Group related requests so you can cancel them easily when they are no longer needed\n */\nexport class RequestBag {\n    constructor() {\n        this.requests = [];\n    }\n    static get(object) {\n        return this.bags.get(object);\n    }\n    static getOrCreate(object) {\n        var _a;\n        return (_a = this.get(object)) !== null && _a !== void 0 ? _a : this.create(object);\n    }\n    static create(object) {\n        const bag = new RequestBag();\n        this.bags.set(object, bag);\n        return bag;\n    }\n    addRequest(request) {\n        this.requests.push(request);\n    }\n    removeRequest(request) {\n        const index = this.requests.findIndex(r => r === request);\n        if (index !== -1) {\n            this.requests.splice(index, 1);\n        }\n    }\n    cancel() {\n        for (const request of this.requests) {\n            request.cancel();\n        }\n        this.requests = [];\n    }\n}\n/**\n * We use a WeakMap so all the requests can get garbage collected\n * when all references to an instance disappears.\n * Note: since this is javascript, we cannot automatically cancel all pending requests in a RequestBag\n * when the associated key is deallocated (it is possible in newer browsers, but with a high and unreliable delay);\n * So use the .cancel() method on the bag to stop all requests in a bag properly if they are no longer needed\n */\nRequestBag.bags = new WeakMap();\n//# sourceMappingURL=RequestBag.js.map","// Requests use middleware to extend its behaviour\nimport { EncodeMedium, encodeObject, ObjectData } from '@simonbackx/simple-encoding';\nimport { isSimpleError, isSimpleErrors, SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\nimport { RequestBag } from './RequestBag';\nexport class RequestResult {\n    constructor(data, headers = {}, responseVersion) {\n        this.data = data;\n        this.headers = headers;\n        this.responseVersion = responseVersion;\n    }\n}\nexport class Request {\n    constructor(server, request) {\n        var _a, _b, _c, _d, _e, _f;\n        /**\n         * Set to false to disable middleware retry logic entirely. When canceling a request, this will also\n         * disable retries\n         */\n        this.shouldRetry = true;\n        /**\n         * Even when shouldRetry is false, still allow to retry normal valid errors\n         * often needed to refresh a token etc\n         */\n        this.allowErrorRetry = true;\n        /// Request specific middleware\n        this.middlewares = [];\n        this.errorDecoder = SimpleErrors;\n        this.didFailNetwork = false;\n        this.XMLHttpRequest = null;\n        this.server = server;\n        this.method = request.method;\n        this.path = request.path;\n        this.query = request.query;\n        this.body = request.body;\n        this.decoder = request.decoder;\n        this.headers = (_a = request.headers) !== null && _a !== void 0 ? _a : {};\n        this.version = request.version;\n        this.timeout = request.timeout;\n        this.responseType = (_b = request.responseType) !== null && _b !== void 0 ? _b : '';\n        this.shouldRetry = (_c = request.shouldRetry) !== null && _c !== void 0 ? _c : this.shouldRetry;\n        this.allowErrorRetry = (_d = request.allowErrorRetry) !== null && _d !== void 0 ? _d : this.allowErrorRetry;\n        this.bag = (_e = request.bag) !== null && _e !== void 0 ? _e : (request.owner ? RequestBag.getOrCreate(request.owner) : undefined);\n        this.overrideXMLHttpRequest = request.overrideXMLHttpRequest;\n        (_f = this.bag) === null || _f === void 0 ? void 0 : _f.addRequest(this);\n    }\n    get static() {\n        return this.constructor;\n    }\n    getMiddlewares() {\n        return Request.sharedMiddlewares.concat(this.middlewares);\n    }\n    /**\n     * Cancels any pending requests and also disables retries\n     */\n    cancel() {\n        this.shouldRetry = false;\n        this.allowErrorRetry = false;\n        if (this.XMLHttpRequest) {\n            this.XMLHttpRequest.abort();\n            this.XMLHttpRequest = null;\n        }\n        else {\n            // Probably a middleware that is running a timeout to retry it later on\n            // Immediately call all middlewares to notify them faster of this abort\n            // Notify middleware that we stop retrying\n            if (!this.didFailNetwork) {\n                this.didFailNetwork = true;\n                for (const middleware of this.getMiddlewares()) {\n                    // Check if one of the middlewares decides to stop\n                    if (middleware.onFatalNetworkError) {\n                        middleware.onFatalNetworkError(this, new SimpleError({\n                            code: 'network_abort',\n                            message: 'Network abort',\n                        }));\n                    }\n                }\n            }\n        }\n    }\n    /**\n     * Cancel all requests with a given owner\n     * Shorthand to avoid RequestBag syntax.\n     */\n    static cancelAll(owner) {\n        var _a;\n        (_a = RequestBag.get(owner)) === null || _a === void 0 ? void 0 : _a.cancel();\n    }\n    static isNetworkError(e) {\n        return !!((isSimpleError(e) || isSimpleErrors(e)) && (e.hasCode('network_error') || e.hasCode('network_timeout') || e.hasCode('network_abort')));\n    }\n    static isAbortError(e) {\n        return !!((isSimpleError(e) || isSimpleErrors(e)) && (e.hasCode('network_abort')));\n    }\n    async fetch(data) {\n        return new Promise((resolve, reject) => {\n            try {\n                const request = this.overrideXMLHttpRequest ? (new this.overrideXMLHttpRequest()) : new XMLHttpRequest();\n                request.responseType = this.responseType;\n                let finished = false;\n                request.onreadystatechange = (e) => {\n                    if (finished) {\n                        // ignore duplicate events\n                        return;\n                    }\n                    if (request.readyState == 4) {\n                        if (request.status == 0) {\n                            // should call handleError or handleTimeout\n                            return;\n                        }\n                        finished = true;\n                        this.XMLHttpRequest = null;\n                        resolve(request);\n                    }\n                };\n                request.ontimeout = () => {\n                    if (finished) {\n                        // ignore duplicate events\n                        return;\n                    }\n                    finished = true;\n                    this.XMLHttpRequest = null;\n                    reject(new SimpleError({\n                        code: 'network_timeout',\n                        message: 'Timeout',\n                    }));\n                };\n                request.onerror = (e) => {\n                    if (finished) {\n                        // ignore duplicate events\n                        return;\n                    }\n                    // Your request timed out\n                    finished = true;\n                    this.XMLHttpRequest = null;\n                    reject(new SimpleError({\n                        code: 'network_error',\n                        message: 'Network error',\n                    }));\n                };\n                request.onabort = () => {\n                    if (finished) {\n                        // ignore duplicate events\n                        return;\n                    }\n                    finished = true;\n                    this.XMLHttpRequest = null;\n                    // Disable retries\n                    this.shouldRetry = false;\n                    reject(new SimpleError({\n                        code: 'network_abort',\n                        message: 'Network abort',\n                    }));\n                };\n                request.open(data.method, data.url);\n                for (const key in data.headers) {\n                    if (Object.prototype.hasOwnProperty.call(data.headers, key)) {\n                        const value = data.headers[key];\n                        request.setRequestHeader(key, value);\n                    }\n                }\n                request.timeout = data.timeout;\n                this.XMLHttpRequest = request;\n                request.send(data.body);\n            }\n            catch (e) {\n                reject(e);\n            }\n        });\n    }\n    async start() {\n        // todo: check if already running or not\n        var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;\n        // todo: add query parameters\n        for (const middleware of this.getMiddlewares()) {\n            if (middleware.onBeforeRequest)\n                await middleware.onBeforeRequest(this);\n        }\n        if (this.didFailNetwork) {\n            // In the meantime, the request is canceled before it even started\n            // This can happen when the onBeforeRequest did something time intensive (e.g. refresh a token)\n            // and in the meantime, the request bag got canceled\n            throw new SimpleError({\n                code: 'network_abort',\n                message: 'Network abort',\n            });\n        }\n        let response;\n        let timeout = (_a = this.timeout) !== null && _a !== void 0 ? _a : (this.method == 'GET' ? 20 * 1000 : 30 * 10000);\n        try {\n            let body;\n            // We only support application/json or FormData for now\n            if (this.body === undefined) {\n                body = undefined;\n            }\n            else {\n                if (this.body instanceof FormData) {\n                    body = this.body;\n                    let size = 0;\n                    for (const [prop, value] of this.body.entries()) {\n                        if (typeof value === 'string') {\n                            size += value.length;\n                        }\n                        else {\n                            size += value.size;\n                        }\n                    }\n                    if (size > 1000 * 1000 * 1000) {\n                        // > 1MB upload\n                        timeout = Math.max(timeout, 60 * 1000);\n                    }\n                }\n                else {\n                    if (!this.headers['Content-Type'] && this.headers['content-type']) {\n                        this.headers['Content-Type'] = this.headers['content-type'];\n                        delete this.headers['content-type'];\n                    }\n                    if (this.headers['Content-Type'] && this.headers['Content-Type'].startsWith('application/x-www-form-urlencoded')) {\n                        const typeCopy = encodeObject(this.body, {\n                            version: (_b = this.version) !== null && _b !== void 0 ? _b : 0,\n                            medium: EncodeMedium.Network,\n                        });\n                        if (typeCopy === null || typeCopy === undefined) {\n                            throw new Error('Invalid body, got null/undefined, which is not encodeable to a querystring');\n                        }\n                        body = Object.keys(typeCopy)\n                            .filter(k => typeCopy[k] !== undefined)\n                            .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(typeCopy[k]))\n                            .join('&');\n                    }\n                    else {\n                        this.headers['Content-Type'] = 'application/json;charset=utf-8';\n                        body = JSON.stringify(encodeObject(this.body, {\n                            version: (_c = this.version) !== null && _c !== void 0 ? _c : 0,\n                            medium: EncodeMedium.Network,\n                        }));\n                    }\n                }\n            }\n            let queryString = '';\n            if (this.query) {\n                const query = encodeObject(this.query, {\n                    version: (_d = this.version) !== null && _d !== void 0 ? _d : 0,\n                    medium: EncodeMedium.Network,\n                });\n                if (query !== undefined && query !== null) {\n                    if (typeof query === 'object' && !Array.isArray(query)) {\n                        const params = new URLSearchParams();\n                        for (const key in query) {\n                            const value = query[key];\n                            if (value === null || value === undefined) {\n                                // skip\n                            }\n                            else if (typeof value === 'boolean') {\n                                params.set(key, value ? 'true' : 'false');\n                            }\n                            else if (typeof value === 'number') {\n                                if (Number.isFinite(value)) {\n                                    params.set(key, value.toString());\n                                }\n                                else {\n                                    throw new SimpleError({\n                                        code: 'invalid_query',\n                                        message: 'Invalid query parameter with non-integer number value ' + value.toString(),\n                                        human: 'Er ging iets mis bij het omvormen van dit verzoek',\n                                    });\n                                }\n                            }\n                            else if (typeof value === 'string') {\n                                params.set(key, value);\n                            }\n                            else if (Array.isArray(value)) {\n                                for (const v of value) {\n                                    if (typeof v === 'boolean') {\n                                        params.append(key, v ? 'true' : 'false');\n                                    }\n                                    else if (typeof v === 'number') {\n                                        if (Number.isFinite(v)) {\n                                            params.set(key, v.toString());\n                                        }\n                                        else {\n                                            throw new SimpleError({\n                                                code: 'invalid_query',\n                                                message: 'Invalid query parameter with non-integer number value in array ' + v.toString(),\n                                                human: 'Er ging iets mis bij het omvormen van dit verzoek',\n                                            });\n                                        }\n                                    }\n                                    else if (typeof v === 'string') {\n                                        params.append(key, v);\n                                    }\n                                    else {\n                                        throw new SimpleError({\n                                            code: 'invalid_query',\n                                            message: 'Invalid query parameter with non-string array value',\n                                            human: 'Er ging iets mis bij het omvormen van dit verzoek',\n                                        });\n                                    }\n                                }\n                            }\n                            else {\n                                throw new SimpleError({\n                                    code: 'invalid_query',\n                                    message: 'Invalid query parameter with non-string value',\n                                    human: 'Er ging iets mis bij het omvormen van dit verzoek',\n                                });\n                            }\n                        }\n                        const s = params.toString();\n                        if (s.length) {\n                            queryString = '?' + s;\n                        }\n                    }\n                    else {\n                        throw new SimpleError({\n                            code: 'invalid_query',\n                            message: 'Invalid query parameter of type ' + (typeof query),\n                            human: 'Er ging iets mis bij het omvormen van dit verzoek',\n                        });\n                    }\n                }\n            }\n            if (this.static.verbose) {\n                console.log('Starting new request');\n                console.log('New request', this.method, this.path, this.body, this.query, this.headers);\n            }\n            response = await this.fetch({\n                url: this.server.host + (this.version !== undefined ? ('/v' + this.version) : '') + this.path + queryString,\n                method: this.method,\n                headers: this.headers,\n                body,\n                timeout,\n            });\n        }\n        catch (error) {\n            if ((isSimpleError(error) || isSimpleErrors(error)) && error.hasCode('network_timeout')) {\n                // Increase next timeout (note: upload will stay 1 minute)\n                this.timeout = Math.max(timeout, 30 * 1000);\n            }\n            // network error is encountered or CORS is misconfigured on the server-side\n            // A middleware might decide here to interrupt the callback\n            // He might for example fire a timer to retry the request because of a network failure\n            // Or it might decide to fetch a new access token because the current one is expired\n            // They return a promise with a boolean value indicating that the request should get retried\n            if (this.shouldRetry && !this.didFailNetwork) {\n                let retry = false;\n                for (const middleware of this.getMiddlewares()) {\n                    // Check if one of the middlewares decides to stop\n                    if (middleware.shouldRetryNetworkError) {\n                        retry = retry || (await middleware.shouldRetryNetworkError(this, error));\n                    }\n                    if (!this.shouldRetry || this.didFailNetwork) {\n                        // Stop the loop faster\n                        break;\n                    }\n                }\n                // Sometimes, in the meantime, shouldRetry might have become false, so check again\n                if (retry && this.shouldRetry && !this.didFailNetwork) {\n                    // Retry\n                    return await this.start();\n                }\n            }\n            // Notify middleware that we stop retrying\n            if (!this.didFailNetwork) {\n                // On abort we call this faster if needed (e.g. when middleware is hanging)\n                this.didFailNetwork = true;\n                for (const middleware of this.getMiddlewares()) {\n                    // Check if one of the middlewares decides to stop\n                    if (middleware.onFatalNetworkError) {\n                        middleware.onFatalNetworkError(this, error);\n                    }\n                }\n            }\n            // Failed and not caught\n            (_e = this.bag) === null || _e === void 0 ? void 0 : _e.removeRequest(this);\n            throw error;\n        }\n        for (const middleware of this.getMiddlewares()) {\n            // Update middleware of recovered network status\n            if (middleware.onNetworkResponse) {\n                middleware.onNetworkResponse(this, response);\n            }\n        }\n        // Get the version\n        let responseVersion;\n        for (const header of this.server.versionHeaders) {\n            const value = response.getResponseHeader(header);\n            if (value) {\n                const v = parseInt(value);\n                if (!isNaN(v) && isFinite(v)) {\n                    responseVersion = v;\n                    break;\n                }\n            }\n        }\n        if (!responseVersion) {\n            // Use the request version by default\n            responseVersion = (_f = this.version) !== null && _f !== void 0 ? _f : 0;\n        }\n        if (response.status < 200 || response.status >= 300) {\n            if (response.getResponseHeader('Content-Type') === 'application/json') {\n                let err;\n                try {\n                    let bodyText = await response.response;\n                    if (bodyText instanceof Blob) {\n                        bodyText = await response.response.text();\n                    }\n                    const json = JSON.parse(bodyText);\n                    if (this.errorDecoder) {\n                        try {\n                            err = this.errorDecoder.decode(new ObjectData(json, {\n                                version: responseVersion,\n                                medium: EncodeMedium.Network,\n                            }));\n                            if (this.static.verbose) {\n                                console.error(err);\n                            }\n                        }\n                        catch (e) {\n                            // Failed to decode\n                            if (this.static.verbose) {\n                                console.error(json);\n                            }\n                            throw e;\n                        }\n                    }\n                    else {\n                        err = json;\n                    }\n                }\n                catch (e) {\n                    return await this.retryOrThrowServerError(response, e);\n                }\n                // A middleware might decide here to retry instead of passing the error to the caller\n                if (this.shouldRetry || this.allowErrorRetry) {\n                    let retry = false;\n                    for (const middleware of this.getMiddlewares()) {\n                        // Check if one of the middlewares decides to stop\n                        if (middleware.shouldRetryError) {\n                            retry = retry || (await middleware.shouldRetryError(this, response, err));\n                        }\n                    }\n                    // Sometimes, in the meantime, shouldRetry might have become false, so check again\n                    if (retry && (this.shouldRetry || this.allowErrorRetry)) {\n                        // Retry\n                        return await this.start();\n                    }\n                }\n                (_g = this.bag) === null || _g === void 0 ? void 0 : _g.removeRequest(this);\n                throw err;\n            }\n            // A non 200 status code without json header is always considered as a server error.\n            return await this.retryOrThrowServerError(response, new Error(response.response));\n        }\n        if (response.getResponseHeader('Content-Type') === 'application/json') {\n            let json;\n            try {\n                let bodyText = await response.response;\n                if (bodyText instanceof Blob) {\n                    bodyText = await response.response.text();\n                }\n                json = JSON.parse(bodyText);\n            }\n            catch (e) {\n                // A 200 status code with invalid JSON is considered a server error\n                return await this.retryOrThrowServerError(response, e);\n            }\n            if (this.decoder) {\n                const decoded = (_h = this.decoder) === null || _h === void 0 ? void 0 : _h.decode(new ObjectData(json, {\n                    version: responseVersion,\n                    medium: EncodeMedium.Network,\n                }));\n                if (this.static.verbose) {\n                    console.info(decoded);\n                }\n                (_j = this.bag) === null || _j === void 0 ? void 0 : _j.removeRequest(this);\n                return new RequestResult(decoded, Request.parseHeaders(response.getAllResponseHeaders()), responseVersion);\n            }\n            (_k = this.bag) === null || _k === void 0 ? void 0 : _k.removeRequest(this);\n            return new RequestResult(json, Request.parseHeaders(response.getAllResponseHeaders()), responseVersion);\n        }\n        if (this.decoder) {\n            // Expected content, but the server didn't respond with content\n            if (this.static.verbose) {\n                console.error(response.response);\n            }\n            return await this.retryOrThrowServerError(response, new Error('Missing JSON response from server'));\n        }\n        (_l = this.bag) === null || _l === void 0 ? void 0 : _l.removeRequest(this);\n        return new RequestResult(await response.response, Request.parseHeaders(response.getAllResponseHeaders()), responseVersion);\n    }\n    static parseHeaders(headers) {\n        const result = {};\n        for (const line of headers.trim().split(/[\\r\\n]+/)) {\n            const parts = line.split(': ');\n            const header = parts.shift();\n            if (header) {\n                const value = parts.join(': ');\n                result[header.toLowerCase()] = value;\n            }\n        }\n        return result;\n    }\n    async retryOrThrowServerError(response, e) {\n        var _a;\n        // Invalid json is considered as a server error\n        if (this.static.verbose) {\n            console.error(e);\n        }\n        if (this.shouldRetry) {\n            // A middleware might decide here to retry instead of passing the error to the caller\n            let retry = false;\n            for (const middleware of this.getMiddlewares()) {\n                // Check if one of the middlewares decides to stop\n                if (middleware.shouldRetryServerError) {\n                    retry = retry || (await middleware.shouldRetryServerError(this, response, e));\n                }\n            }\n            // Sometimes, in the meantime, shouldRetry might have become false, so check again\n            if (retry && this.shouldRetry) {\n                // Retry\n                return await this.start();\n            }\n        }\n        (_a = this.bag) === null || _a === void 0 ? void 0 : _a.removeRequest(this);\n        throw e;\n    }\n}\n/// Shared middlewares that allows dependency injection here\nRequest.sharedMiddlewares = [];\nRequest.verbose = false;\n//# sourceMappingURL=Request.js.map","import { Request } from './Request';\nexport class Server {\n    constructor(host) {\n        this.middlewares = [];\n        /**\n         * When decoding the version headers of the response will be used if they are present.\n         */\n        this.versionHeaders = ['X-Version'];\n        this.host = host;\n    }\n    setVersionHeaders(headers) {\n        this.versionHeaders = headers;\n    }\n    /**\n     * Build an internal request. Start it manually.\n     * Usefull if you need the reference to the request object in order to cancel it later.\n     */\n    build(request) {\n        const r = new Request(this, request);\n        r.middlewares.push(...this.middlewares);\n        return r;\n    }\n    /**\n     * Build an internal request and start it immediately\n     */\n    request(request) {\n        return this.build(request).start();\n    }\n}\n//# sourceMappingURL=Server.js.map","import { Country, CountryCode } from '@stamhoofd/structures';\nimport { App } from 'vue';\n\nexport class I18n {\n    loadedLocales: Map<string, Map<string, string>> = new Map();\n    loadedNamespaces: Set<string> = new Set();\n    locale = 'nl-BE';\n    language: string = 'nl';\n    country: CountryCode = Country.Belgium;\n\n    // Reference to messages in loadedLocales\n    messages: Map<string, string>;\n\n    install(app: App) {\n        app.config.globalProperties.$t = this.$t.bind(this);\n    }\n\n    loadRecursive(messages: any, prefix: string | null = null): Map<string, string> {\n        const map = new Map();\n        for (const key in messages) {\n            const element = messages[key];\n            if (typeof (element) !== 'string') {\n                const map2 = this.loadRecursive(element, (prefix ? prefix + '.' : '') + key);\n                map2.forEach((val, key) => map.set(key, val));\n            }\n            else {\n                map.set((prefix ? prefix + '.' : '') + key, element);\n            }\n        }\n        return map;\n    }\n\n    setLocale(locale: string, language: string, country: CountryCode) {\n        this.language = language;\n        this.country = country;\n        this.locale = locale;\n        const messages = this.loadedLocales.get(locale);\n        if (!messages) {\n            throw new Error('Locale not loaded when creating I18n for ' + locale);\n        }\n        this.messages = messages;\n    }\n\n    isLocaleLoaded(namespace: string, locale: string) {\n        return this.loadedNamespaces.has(namespace + ':' + locale);\n    }\n\n    loadLocale(namespace: string, locale: string, messages: any) {\n        this.loadedNamespaces.add(namespace + ':' + locale);\n        const loaded = this.loadRecursive(messages);\n        const existing = this.loadedLocales.get(locale);\n\n        // Merge maps\n        if (existing) {\n            loaded.forEach((val, key) => existing.set(key, val));\n        }\n        else {\n            this.loadedLocales.set(locale, loaded);\n        }\n    }\n\n    t(key: string, replace?: Record<string, string>): string {\n        return this.$t(key, replace);\n    }\n\n    $t(key: string, replace?: Record<string, string>): string {\n        return this.replace(this.messages?.get(key) ?? key, replace);\n    }\n\n    escapeRegex(string: string) {\n        return string.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n    }\n\n    replace(text: string, replace?: Record<string, string>): string {\n        if (!replace) {\n            return text;\n        }\n        for (const key in replace) {\n            const value = replace[key];\n            text = text.replace(new RegExp('{' + this.escapeRegex(key) + '}', 'g'), value);\n        }\n        return text;\n    }\n}\n","/**\n* @vue/shared v3.5.12\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction makeMap(str) {\n  const map = /* @__PURE__ */ Object.create(null);\n  for (const key of str.split(\",\")) map[key] = 1;\n  return (val) => val in map;\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter\n(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n  const i = arr.indexOf(el);\n  if (i > -1) {\n    arr.splice(i, 1);\n  }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n  return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n  return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n  // the leading comma is intentional so empty string \"\" is also included\n  \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n  \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n  const cache = /* @__PURE__ */ Object.create(null);\n  return (str) => {\n    const hit = cache[str];\n    return hit || (cache[str] = fn(str));\n  };\n};\nconst camelizeRE = /-(\\w)/g;\nconst camelize = cacheStringFunction(\n  (str) => {\n    return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : \"\");\n  }\n);\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n  (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction((str) => {\n  return str.charAt(0).toUpperCase() + str.slice(1);\n});\nconst toHandlerKey = cacheStringFunction(\n  (str) => {\n    const s = str ? `on${capitalize(str)}` : ``;\n    return s;\n  }\n);\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, ...arg) => {\n  for (let i = 0; i < fns.length; i++) {\n    fns[i](...arg);\n  }\n};\nconst def = (obj, key, value, writable = false) => {\n  Object.defineProperty(obj, key, {\n    configurable: true,\n    enumerable: false,\n    writable,\n    value\n  });\n};\nconst looseToNumber = (val) => {\n  const n = parseFloat(val);\n  return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n  const n = isString(val) ? Number(val) : NaN;\n  return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n  return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n  return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\nfunction genCacheKey(source, options) {\n  return source + JSON.stringify(\n    options,\n    (_, val) => typeof val === \"function\" ? val.toString() : val\n  );\n}\n\nconst PatchFlags = {\n  \"TEXT\": 1,\n  \"1\": \"TEXT\",\n  \"CLASS\": 2,\n  \"2\": \"CLASS\",\n  \"STYLE\": 4,\n  \"4\": \"STYLE\",\n  \"PROPS\": 8,\n  \"8\": \"PROPS\",\n  \"FULL_PROPS\": 16,\n  \"16\": \"FULL_PROPS\",\n  \"NEED_HYDRATION\": 32,\n  \"32\": \"NEED_HYDRATION\",\n  \"STABLE_FRAGMENT\": 64,\n  \"64\": \"STABLE_FRAGMENT\",\n  \"KEYED_FRAGMENT\": 128,\n  \"128\": \"KEYED_FRAGMENT\",\n  \"UNKEYED_FRAGMENT\": 256,\n  \"256\": \"UNKEYED_FRAGMENT\",\n  \"NEED_PATCH\": 512,\n  \"512\": \"NEED_PATCH\",\n  \"DYNAMIC_SLOTS\": 1024,\n  \"1024\": \"DYNAMIC_SLOTS\",\n  \"DEV_ROOT_FRAGMENT\": 2048,\n  \"2048\": \"DEV_ROOT_FRAGMENT\",\n  \"CACHED\": -1,\n  \"-1\": \"CACHED\",\n  \"BAIL\": -2,\n  \"-2\": \"BAIL\"\n};\nconst PatchFlagNames = {\n  [1]: `TEXT`,\n  [2]: `CLASS`,\n  [4]: `STYLE`,\n  [8]: `PROPS`,\n  [16]: `FULL_PROPS`,\n  [32]: `NEED_HYDRATION`,\n  [64]: `STABLE_FRAGMENT`,\n  [128]: `KEYED_FRAGMENT`,\n  [256]: `UNKEYED_FRAGMENT`,\n  [512]: `NEED_PATCH`,\n  [1024]: `DYNAMIC_SLOTS`,\n  [2048]: `DEV_ROOT_FRAGMENT`,\n  [-1]: `HOISTED`,\n  [-2]: `BAIL`\n};\n\nconst ShapeFlags = {\n  \"ELEMENT\": 1,\n  \"1\": \"ELEMENT\",\n  \"FUNCTIONAL_COMPONENT\": 2,\n  \"2\": \"FUNCTIONAL_COMPONENT\",\n  \"STATEFUL_COMPONENT\": 4,\n  \"4\": \"STATEFUL_COMPONENT\",\n  \"TEXT_CHILDREN\": 8,\n  \"8\": \"TEXT_CHILDREN\",\n  \"ARRAY_CHILDREN\": 16,\n  \"16\": \"ARRAY_CHILDREN\",\n  \"SLOTS_CHILDREN\": 32,\n  \"32\": \"SLOTS_CHILDREN\",\n  \"TELEPORT\": 64,\n  \"64\": \"TELEPORT\",\n  \"SUSPENSE\": 128,\n  \"128\": \"SUSPENSE\",\n  \"COMPONENT_SHOULD_KEEP_ALIVE\": 256,\n  \"256\": \"COMPONENT_SHOULD_KEEP_ALIVE\",\n  \"COMPONENT_KEPT_ALIVE\": 512,\n  \"512\": \"COMPONENT_KEPT_ALIVE\",\n  \"COMPONENT\": 6,\n  \"6\": \"COMPONENT\"\n};\n\nconst SlotFlags = {\n  \"STABLE\": 1,\n  \"1\": \"STABLE\",\n  \"DYNAMIC\": 2,\n  \"2\": \"DYNAMIC\",\n  \"FORWARDED\": 3,\n  \"3\": \"FORWARDED\"\n};\nconst slotFlagsText = {\n  [1]: \"STABLE\",\n  [2]: \"DYNAMIC\",\n  [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_ALLOWED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol\";\nconst isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);\nconst isGloballyWhitelisted = isGloballyAllowed;\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n  start = Math.max(0, Math.min(start, source.length));\n  end = Math.max(0, Math.min(end, source.length));\n  if (start > end) return \"\";\n  let lines = source.split(/(\\r?\\n)/);\n  const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n  lines = lines.filter((_, idx) => idx % 2 === 0);\n  let count = 0;\n  const res = [];\n  for (let i = 0; i < lines.length; i++) {\n    count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n    if (count >= start) {\n      for (let j = i - range; j <= i + range || end > count; j++) {\n        if (j < 0 || j >= lines.length) continue;\n        const line = j + 1;\n        res.push(\n          `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}|  ${lines[j]}`\n        );\n        const lineLength = lines[j].length;\n        const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n        if (j === i) {\n          const pad = start - (count - (lineLength + newLineSeqLength));\n          const length = Math.max(\n            1,\n            end > count ? lineLength - pad : end - start\n          );\n          res.push(`   |  ` + \" \".repeat(pad) + \"^\".repeat(length));\n        } else if (j > i) {\n          if (end > count) {\n            const length = Math.max(Math.min(end - count, lineLength), 1);\n            res.push(`   |  ` + \"^\".repeat(length));\n          }\n          count += lineLength + newLineSeqLength;\n        }\n      }\n      break;\n    }\n  }\n  return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n  if (isArray(value)) {\n    const res = {};\n    for (let i = 0; i < value.length; i++) {\n      const item = value[i];\n      const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n      if (normalized) {\n        for (const key in normalized) {\n          res[key] = normalized[key];\n        }\n      }\n    }\n    return res;\n  } else if (isString(value) || isObject(value)) {\n    return value;\n  }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n  const ret = {};\n  cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n    if (item) {\n      const tmp = item.split(propertyDelimiterRE);\n      tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n    }\n  });\n  return ret;\n}\nfunction stringifyStyle(styles) {\n  let ret = \"\";\n  if (!styles || isString(styles)) {\n    return ret;\n  }\n  for (const key in styles) {\n    const value = styles[key];\n    if (isString(value) || typeof value === \"number\") {\n      const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n      ret += `${normalizedKey}:${value};`;\n    }\n  }\n  return ret;\n}\nfunction normalizeClass(value) {\n  let res = \"\";\n  if (isString(value)) {\n    res = value;\n  } else if (isArray(value)) {\n    for (let i = 0; i < value.length; i++) {\n      const normalized = normalizeClass(value[i]);\n      if (normalized) {\n        res += normalized + \" \";\n      }\n    }\n  } else if (isObject(value)) {\n    for (const name in value) {\n      if (value[name]) {\n        res += name + \" \";\n      }\n    }\n  }\n  return res.trim();\n}\nfunction normalizeProps(props) {\n  if (!props) return null;\n  let { class: klass, style } = props;\n  if (klass && !isString(klass)) {\n    props.class = normalizeClass(klass);\n  }\n  if (style) {\n    props.style = normalizeStyle(style);\n  }\n  return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst MATH_TAGS = \"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n  specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n  return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n  if (attrValidationCache.hasOwnProperty(name)) {\n    return attrValidationCache[name];\n  }\n  const isUnsafe = unsafeAttrCharRE.test(name);\n  if (isUnsafe) {\n    console.error(`unsafe attribute name: ${name}`);\n  }\n  return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n  acceptCharset: \"accept-charset\",\n  className: \"class\",\n  htmlFor: \"for\",\n  httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n  `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n  `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\nconst isKnownMathMLAttr = /* @__PURE__ */ makeMap(\n  `accent,accentunder,actiontype,align,alignmentscope,altimg,altimg-height,altimg-valign,altimg-width,alttext,bevelled,close,columnsalign,columnlines,columnspan,denomalign,depth,dir,display,displaystyle,encoding,equalcolumns,equalrows,fence,fontstyle,fontweight,form,frame,framespacing,groupalign,height,href,id,indentalign,indentalignfirst,indentalignlast,indentshift,indentshiftfirst,indentshiftlast,indextype,justify,largetop,largeop,lquote,lspace,mathbackground,mathcolor,mathsize,mathvariant,maxsize,minlabelspacing,mode,other,overflow,position,rowalign,rowlines,rowspan,rquote,rspace,scriptlevel,scriptminsize,scriptsizemultiplier,selection,separator,separators,shift,side,src,stackalign,stretchy,subscriptshift,superscriptshift,symmetric,voffset,width,widths,xlink:href,xlink:show,xlink:type,xmlns`\n);\nfunction isRenderableAttrValue(value) {\n  if (value == null) {\n    return false;\n  }\n  const type = typeof value;\n  return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n  const str = \"\" + string;\n  const match = escapeRE.exec(str);\n  if (!match) {\n    return str;\n  }\n  let html = \"\";\n  let escaped;\n  let index;\n  let lastIndex = 0;\n  for (index = match.index; index < str.length; index++) {\n    switch (str.charCodeAt(index)) {\n      case 34:\n        escaped = \"&quot;\";\n        break;\n      case 38:\n        escaped = \"&amp;\";\n        break;\n      case 39:\n        escaped = \"&#39;\";\n        break;\n      case 60:\n        escaped = \"&lt;\";\n        break;\n      case 62:\n        escaped = \"&gt;\";\n        break;\n      default:\n        continue;\n    }\n    if (lastIndex !== index) {\n      html += str.slice(lastIndex, index);\n    }\n    lastIndex = index + 1;\n    html += escaped;\n  }\n  return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^-?>|<!--|-->|--!>|<!-$/g;\nfunction escapeHtmlComment(src) {\n  return src.replace(commentStripRE, \"\");\n}\nconst cssVarNameEscapeSymbolsRE = /[ !\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~]/g;\nfunction getEscapedCssVarName(key, doubleEscape) {\n  return key.replace(\n    cssVarNameEscapeSymbolsRE,\n    (s) => doubleEscape ? s === '\"' ? '\\\\\\\\\\\\\"' : `\\\\\\\\${s}` : `\\\\${s}`\n  );\n}\n\nfunction looseCompareArrays(a, b) {\n  if (a.length !== b.length) return false;\n  let equal = true;\n  for (let i = 0; equal && i < a.length; i++) {\n    equal = looseEqual(a[i], b[i]);\n  }\n  return equal;\n}\nfunction looseEqual(a, b) {\n  if (a === b) return true;\n  let aValidType = isDate(a);\n  let bValidType = isDate(b);\n  if (aValidType || bValidType) {\n    return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n  }\n  aValidType = isSymbol(a);\n  bValidType = isSymbol(b);\n  if (aValidType || bValidType) {\n    return a === b;\n  }\n  aValidType = isArray(a);\n  bValidType = isArray(b);\n  if (aValidType || bValidType) {\n    return aValidType && bValidType ? looseCompareArrays(a, b) : false;\n  }\n  aValidType = isObject(a);\n  bValidType = isObject(b);\n  if (aValidType || bValidType) {\n    if (!aValidType || !bValidType) {\n      return false;\n    }\n    const aKeysCount = Object.keys(a).length;\n    const bKeysCount = Object.keys(b).length;\n    if (aKeysCount !== bKeysCount) {\n      return false;\n    }\n    for (const key in a) {\n      const aHasKey = a.hasOwnProperty(key);\n      const bHasKey = b.hasOwnProperty(key);\n      if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {\n        return false;\n      }\n    }\n  }\n  return String(a) === String(b);\n}\nfunction looseIndexOf(arr, val) {\n  return arr.findIndex((item) => looseEqual(item, val));\n}\n\nconst isRef = (val) => {\n  return !!(val && val[\"__v_isRef\"] === true);\n};\nconst toDisplayString = (val) => {\n  return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n  if (isRef(val)) {\n    return replacer(_key, val.value);\n  } else if (isMap(val)) {\n    return {\n      [`Map(${val.size})`]: [...val.entries()].reduce(\n        (entries, [key, val2], i) => {\n          entries[stringifySymbol(key, i) + \" =>\"] = val2;\n          return entries;\n        },\n        {}\n      )\n    };\n  } else if (isSet(val)) {\n    return {\n      [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))\n    };\n  } else if (isSymbol(val)) {\n    return stringifySymbol(val);\n  } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n    return String(val);\n  }\n  return val;\n};\nconst stringifySymbol = (v, i = \"\") => {\n  var _a;\n  return (\n    // Symbol.description in es2019+ so we need to cast here to pass\n    // the lib: es2016 check\n    isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v\n  );\n};\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, PatchFlags, ShapeFlags, SlotFlags, camelize, capitalize, cssVarNameEscapeSymbolsRE, def, escapeHtml, escapeHtmlComment, extend, genCacheKey, genPropsAccessExp, generateCodeFrame, getEscapedCssVarName, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyAllowed, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownMathMLAttr, isKnownSvgAttr, isMap, isMathMLTag, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isRenderableAttrValue, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n","/**\n* @vue/reactivity v3.5.12\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { hasChanged, extend, isArray, isIntegerKey, isSymbol, isMap, hasOwn, isObject, makeMap, toRawType, capitalize, def, isFunction, EMPTY_OBJ, isSet, isPlainObject, NOOP, remove } from '@vue/shared';\n\nfunction warn(msg, ...args) {\n  console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n  constructor(detached = false) {\n    this.detached = detached;\n    /**\n     * @internal\n     */\n    this._active = true;\n    /**\n     * @internal\n     */\n    this.effects = [];\n    /**\n     * @internal\n     */\n    this.cleanups = [];\n    this._isPaused = false;\n    this.parent = activeEffectScope;\n    if (!detached && activeEffectScope) {\n      this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n        this\n      ) - 1;\n    }\n  }\n  get active() {\n    return this._active;\n  }\n  pause() {\n    if (this._active) {\n      this._isPaused = true;\n      let i, l;\n      if (this.scopes) {\n        for (i = 0, l = this.scopes.length; i < l; i++) {\n          this.scopes[i].pause();\n        }\n      }\n      for (i = 0, l = this.effects.length; i < l; i++) {\n        this.effects[i].pause();\n      }\n    }\n  }\n  /**\n   * Resumes the effect scope, including all child scopes and effects.\n   */\n  resume() {\n    if (this._active) {\n      if (this._isPaused) {\n        this._isPaused = false;\n        let i, l;\n        if (this.scopes) {\n          for (i = 0, l = this.scopes.length; i < l; i++) {\n            this.scopes[i].resume();\n          }\n        }\n        for (i = 0, l = this.effects.length; i < l; i++) {\n          this.effects[i].resume();\n        }\n      }\n    }\n  }\n  run(fn) {\n    if (this._active) {\n      const currentEffectScope = activeEffectScope;\n      try {\n        activeEffectScope = this;\n        return fn();\n      } finally {\n        activeEffectScope = currentEffectScope;\n      }\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(`cannot run an inactive effect scope.`);\n    }\n  }\n  /**\n   * This should only be called on non-detached scopes\n   * @internal\n   */\n  on() {\n    activeEffectScope = this;\n  }\n  /**\n   * This should only be called on non-detached scopes\n   * @internal\n   */\n  off() {\n    activeEffectScope = this.parent;\n  }\n  stop(fromParent) {\n    if (this._active) {\n      let i, l;\n      for (i = 0, l = this.effects.length; i < l; i++) {\n        this.effects[i].stop();\n      }\n      for (i = 0, l = this.cleanups.length; i < l; i++) {\n        this.cleanups[i]();\n      }\n      if (this.scopes) {\n        for (i = 0, l = this.scopes.length; i < l; i++) {\n          this.scopes[i].stop(true);\n        }\n      }\n      if (!this.detached && this.parent && !fromParent) {\n        const last = this.parent.scopes.pop();\n        if (last && last !== this) {\n          this.parent.scopes[this.index] = last;\n          last.index = this.index;\n        }\n      }\n      this.parent = void 0;\n      this._active = false;\n    }\n  }\n}\nfunction effectScope(detached) {\n  return new EffectScope(detached);\n}\nfunction getCurrentScope() {\n  return activeEffectScope;\n}\nfunction onScopeDispose(fn, failSilently = false) {\n  if (activeEffectScope) {\n    activeEffectScope.cleanups.push(fn);\n  } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n    warn(\n      `onScopeDispose() is called when there is no active effect scope to be associated with.`\n    );\n  }\n}\n\nlet activeSub;\nconst EffectFlags = {\n  \"ACTIVE\": 1,\n  \"1\": \"ACTIVE\",\n  \"RUNNING\": 2,\n  \"2\": \"RUNNING\",\n  \"TRACKING\": 4,\n  \"4\": \"TRACKING\",\n  \"NOTIFIED\": 8,\n  \"8\": \"NOTIFIED\",\n  \"DIRTY\": 16,\n  \"16\": \"DIRTY\",\n  \"ALLOW_RECURSE\": 32,\n  \"32\": \"ALLOW_RECURSE\",\n  \"PAUSED\": 64,\n  \"64\": \"PAUSED\"\n};\nconst pausedQueueEffects = /* @__PURE__ */ new WeakSet();\nclass ReactiveEffect {\n  constructor(fn) {\n    this.fn = fn;\n    /**\n     * @internal\n     */\n    this.deps = void 0;\n    /**\n     * @internal\n     */\n    this.depsTail = void 0;\n    /**\n     * @internal\n     */\n    this.flags = 1 | 4;\n    /**\n     * @internal\n     */\n    this.next = void 0;\n    /**\n     * @internal\n     */\n    this.cleanup = void 0;\n    this.scheduler = void 0;\n    if (activeEffectScope && activeEffectScope.active) {\n      activeEffectScope.effects.push(this);\n    }\n  }\n  pause() {\n    this.flags |= 64;\n  }\n  resume() {\n    if (this.flags & 64) {\n      this.flags &= ~64;\n      if (pausedQueueEffects.has(this)) {\n        pausedQueueEffects.delete(this);\n        this.trigger();\n      }\n    }\n  }\n  /**\n   * @internal\n   */\n  notify() {\n    if (this.flags & 2 && !(this.flags & 32)) {\n      return;\n    }\n    if (!(this.flags & 8)) {\n      batch(this);\n    }\n  }\n  run() {\n    if (!(this.flags & 1)) {\n      return this.fn();\n    }\n    this.flags |= 2;\n    cleanupEffect(this);\n    prepareDeps(this);\n    const prevEffect = activeSub;\n    const prevShouldTrack = shouldTrack;\n    activeSub = this;\n    shouldTrack = true;\n    try {\n      return this.fn();\n    } finally {\n      if (!!(process.env.NODE_ENV !== \"production\") && activeSub !== this) {\n        warn(\n          \"Active effect was not restored correctly - this is likely a Vue internal bug.\"\n        );\n      }\n      cleanupDeps(this);\n      activeSub = prevEffect;\n      shouldTrack = prevShouldTrack;\n      this.flags &= ~2;\n    }\n  }\n  stop() {\n    if (this.flags & 1) {\n      for (let link = this.deps; link; link = link.nextDep) {\n        removeSub(link);\n      }\n      this.deps = this.depsTail = void 0;\n      cleanupEffect(this);\n      this.onStop && this.onStop();\n      this.flags &= ~1;\n    }\n  }\n  trigger() {\n    if (this.flags & 64) {\n      pausedQueueEffects.add(this);\n    } else if (this.scheduler) {\n      this.scheduler();\n    } else {\n      this.runIfDirty();\n    }\n  }\n  /**\n   * @internal\n   */\n  runIfDirty() {\n    if (isDirty(this)) {\n      this.run();\n    }\n  }\n  get dirty() {\n    return isDirty(this);\n  }\n}\nlet batchDepth = 0;\nlet batchedSub;\nlet batchedComputed;\nfunction batch(sub, isComputed = false) {\n  sub.flags |= 8;\n  if (isComputed) {\n    sub.next = batchedComputed;\n    batchedComputed = sub;\n    return;\n  }\n  sub.next = batchedSub;\n  batchedSub = sub;\n}\nfunction startBatch() {\n  batchDepth++;\n}\nfunction endBatch() {\n  if (--batchDepth > 0) {\n    return;\n  }\n  if (batchedComputed) {\n    let e = batchedComputed;\n    batchedComputed = void 0;\n    while (e) {\n      const next = e.next;\n      e.next = void 0;\n      e.flags &= ~8;\n      e = next;\n    }\n  }\n  let error;\n  while (batchedSub) {\n    let e = batchedSub;\n    batchedSub = void 0;\n    while (e) {\n      const next = e.next;\n      e.next = void 0;\n      e.flags &= ~8;\n      if (e.flags & 1) {\n        try {\n          ;\n          e.trigger();\n        } catch (err) {\n          if (!error) error = err;\n        }\n      }\n      e = next;\n    }\n  }\n  if (error) throw error;\n}\nfunction prepareDeps(sub) {\n  for (let link = sub.deps; link; link = link.nextDep) {\n    link.version = -1;\n    link.prevActiveLink = link.dep.activeLink;\n    link.dep.activeLink = link;\n  }\n}\nfunction cleanupDeps(sub) {\n  let head;\n  let tail = sub.depsTail;\n  let link = tail;\n  while (link) {\n    const prev = link.prevDep;\n    if (link.version === -1) {\n      if (link === tail) tail = prev;\n      removeSub(link);\n      removeDep(link);\n    } else {\n      head = link;\n    }\n    link.dep.activeLink = link.prevActiveLink;\n    link.prevActiveLink = void 0;\n    link = prev;\n  }\n  sub.deps = head;\n  sub.depsTail = tail;\n}\nfunction isDirty(sub) {\n  for (let link = sub.deps; link; link = link.nextDep) {\n    if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) {\n      return true;\n    }\n  }\n  if (sub._dirty) {\n    return true;\n  }\n  return false;\n}\nfunction refreshComputed(computed) {\n  if (computed.flags & 4 && !(computed.flags & 16)) {\n    return;\n  }\n  computed.flags &= ~16;\n  if (computed.globalVersion === globalVersion) {\n    return;\n  }\n  computed.globalVersion = globalVersion;\n  const dep = computed.dep;\n  computed.flags |= 2;\n  if (dep.version > 0 && !computed.isSSR && computed.deps && !isDirty(computed)) {\n    computed.flags &= ~2;\n    return;\n  }\n  const prevSub = activeSub;\n  const prevShouldTrack = shouldTrack;\n  activeSub = computed;\n  shouldTrack = true;\n  try {\n    prepareDeps(computed);\n    const value = computed.fn(computed._value);\n    if (dep.version === 0 || hasChanged(value, computed._value)) {\n      computed._value = value;\n      dep.version++;\n    }\n  } catch (err) {\n    dep.version++;\n    throw err;\n  } finally {\n    activeSub = prevSub;\n    shouldTrack = prevShouldTrack;\n    cleanupDeps(computed);\n    computed.flags &= ~2;\n  }\n}\nfunction removeSub(link, soft = false) {\n  const { dep, prevSub, nextSub } = link;\n  if (prevSub) {\n    prevSub.nextSub = nextSub;\n    link.prevSub = void 0;\n  }\n  if (nextSub) {\n    nextSub.prevSub = prevSub;\n    link.nextSub = void 0;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && dep.subsHead === link) {\n    dep.subsHead = nextSub;\n  }\n  if (dep.subs === link) {\n    dep.subs = prevSub;\n    if (!prevSub && dep.computed) {\n      dep.computed.flags &= ~4;\n      for (let l = dep.computed.deps; l; l = l.nextDep) {\n        removeSub(l, true);\n      }\n    }\n  }\n  if (!soft && !--dep.sc && dep.map) {\n    dep.map.delete(dep.key);\n  }\n}\nfunction removeDep(link) {\n  const { prevDep, nextDep } = link;\n  if (prevDep) {\n    prevDep.nextDep = nextDep;\n    link.prevDep = void 0;\n  }\n  if (nextDep) {\n    nextDep.prevDep = prevDep;\n    link.nextDep = void 0;\n  }\n}\nfunction effect(fn, options) {\n  if (fn.effect instanceof ReactiveEffect) {\n    fn = fn.effect.fn;\n  }\n  const e = new ReactiveEffect(fn);\n  if (options) {\n    extend(e, options);\n  }\n  try {\n    e.run();\n  } catch (err) {\n    e.stop();\n    throw err;\n  }\n  const runner = e.run.bind(e);\n  runner.effect = e;\n  return runner;\n}\nfunction stop(runner) {\n  runner.effect.stop();\n}\nlet shouldTrack = true;\nconst trackStack = [];\nfunction pauseTracking() {\n  trackStack.push(shouldTrack);\n  shouldTrack = false;\n}\nfunction enableTracking() {\n  trackStack.push(shouldTrack);\n  shouldTrack = true;\n}\nfunction resetTracking() {\n  const last = trackStack.pop();\n  shouldTrack = last === void 0 ? true : last;\n}\nfunction onEffectCleanup(fn, failSilently = false) {\n  if (activeSub instanceof ReactiveEffect) {\n    activeSub.cleanup = fn;\n  } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n    warn(\n      `onEffectCleanup() was called when there was no active effect to associate with.`\n    );\n  }\n}\nfunction cleanupEffect(e) {\n  const { cleanup } = e;\n  e.cleanup = void 0;\n  if (cleanup) {\n    const prevSub = activeSub;\n    activeSub = void 0;\n    try {\n      cleanup();\n    } finally {\n      activeSub = prevSub;\n    }\n  }\n}\n\nlet globalVersion = 0;\nclass Link {\n  constructor(sub, dep) {\n    this.sub = sub;\n    this.dep = dep;\n    this.version = dep.version;\n    this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0;\n  }\n}\nclass Dep {\n  constructor(computed) {\n    this.computed = computed;\n    this.version = 0;\n    /**\n     * Link between this dep and the current active effect\n     */\n    this.activeLink = void 0;\n    /**\n     * Doubly linked list representing the subscribing effects (tail)\n     */\n    this.subs = void 0;\n    /**\n     * For object property deps cleanup\n     */\n    this.map = void 0;\n    this.key = void 0;\n    /**\n     * Subscriber counter\n     */\n    this.sc = 0;\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      this.subsHead = void 0;\n    }\n  }\n  track(debugInfo) {\n    if (!activeSub || !shouldTrack || activeSub === this.computed) {\n      return;\n    }\n    let link = this.activeLink;\n    if (link === void 0 || link.sub !== activeSub) {\n      link = this.activeLink = new Link(activeSub, this);\n      if (!activeSub.deps) {\n        activeSub.deps = activeSub.depsTail = link;\n      } else {\n        link.prevDep = activeSub.depsTail;\n        activeSub.depsTail.nextDep = link;\n        activeSub.depsTail = link;\n      }\n      addSub(link);\n    } else if (link.version === -1) {\n      link.version = this.version;\n      if (link.nextDep) {\n        const next = link.nextDep;\n        next.prevDep = link.prevDep;\n        if (link.prevDep) {\n          link.prevDep.nextDep = next;\n        }\n        link.prevDep = activeSub.depsTail;\n        link.nextDep = void 0;\n        activeSub.depsTail.nextDep = link;\n        activeSub.depsTail = link;\n        if (activeSub.deps === link) {\n          activeSub.deps = next;\n        }\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") && activeSub.onTrack) {\n      activeSub.onTrack(\n        extend(\n          {\n            effect: activeSub\n          },\n          debugInfo\n        )\n      );\n    }\n    return link;\n  }\n  trigger(debugInfo) {\n    this.version++;\n    globalVersion++;\n    this.notify(debugInfo);\n  }\n  notify(debugInfo) {\n    startBatch();\n    try {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        for (let head = this.subsHead; head; head = head.nextSub) {\n          if (head.sub.onTrigger && !(head.sub.flags & 8)) {\n            head.sub.onTrigger(\n              extend(\n                {\n                  effect: head.sub\n                },\n                debugInfo\n              )\n            );\n          }\n        }\n      }\n      for (let link = this.subs; link; link = link.prevSub) {\n        if (link.sub.notify()) {\n          ;\n          link.sub.dep.notify();\n        }\n      }\n    } finally {\n      endBatch();\n    }\n  }\n}\nfunction addSub(link) {\n  link.dep.sc++;\n  if (link.sub.flags & 4) {\n    const computed = link.dep.computed;\n    if (computed && !link.dep.subs) {\n      computed.flags |= 4 | 16;\n      for (let l = computed.deps; l; l = l.nextDep) {\n        addSub(l);\n      }\n    }\n    const currentTail = link.dep.subs;\n    if (currentTail !== link) {\n      link.prevSub = currentTail;\n      if (currentTail) currentTail.nextSub = link;\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") && link.dep.subsHead === void 0) {\n      link.dep.subsHead = link;\n    }\n    link.dep.subs = link;\n  }\n}\nconst targetMap = /* @__PURE__ */ new WeakMap();\nconst ITERATE_KEY = Symbol(\n  !!(process.env.NODE_ENV !== \"production\") ? \"Object iterate\" : \"\"\n);\nconst MAP_KEY_ITERATE_KEY = Symbol(\n  !!(process.env.NODE_ENV !== \"production\") ? \"Map keys iterate\" : \"\"\n);\nconst ARRAY_ITERATE_KEY = Symbol(\n  !!(process.env.NODE_ENV !== \"production\") ? \"Array iterate\" : \"\"\n);\nfunction track(target, type, key) {\n  if (shouldTrack && activeSub) {\n    let depsMap = targetMap.get(target);\n    if (!depsMap) {\n      targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n    }\n    let dep = depsMap.get(key);\n    if (!dep) {\n      depsMap.set(key, dep = new Dep());\n      dep.map = depsMap;\n      dep.key = key;\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      dep.track({\n        target,\n        type,\n        key\n      });\n    } else {\n      dep.track();\n    }\n  }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n  const depsMap = targetMap.get(target);\n  if (!depsMap) {\n    globalVersion++;\n    return;\n  }\n  const run = (dep) => {\n    if (dep) {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        dep.trigger({\n          target,\n          type,\n          key,\n          newValue,\n          oldValue,\n          oldTarget\n        });\n      } else {\n        dep.trigger();\n      }\n    }\n  };\n  startBatch();\n  if (type === \"clear\") {\n    depsMap.forEach(run);\n  } else {\n    const targetIsArray = isArray(target);\n    const isArrayIndex = targetIsArray && isIntegerKey(key);\n    if (targetIsArray && key === \"length\") {\n      const newLength = Number(newValue);\n      depsMap.forEach((dep, key2) => {\n        if (key2 === \"length\" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) {\n          run(dep);\n        }\n      });\n    } else {\n      if (key !== void 0 || depsMap.has(void 0)) {\n        run(depsMap.get(key));\n      }\n      if (isArrayIndex) {\n        run(depsMap.get(ARRAY_ITERATE_KEY));\n      }\n      switch (type) {\n        case \"add\":\n          if (!targetIsArray) {\n            run(depsMap.get(ITERATE_KEY));\n            if (isMap(target)) {\n              run(depsMap.get(MAP_KEY_ITERATE_KEY));\n            }\n          } else if (isArrayIndex) {\n            run(depsMap.get(\"length\"));\n          }\n          break;\n        case \"delete\":\n          if (!targetIsArray) {\n            run(depsMap.get(ITERATE_KEY));\n            if (isMap(target)) {\n              run(depsMap.get(MAP_KEY_ITERATE_KEY));\n            }\n          }\n          break;\n        case \"set\":\n          if (isMap(target)) {\n            run(depsMap.get(ITERATE_KEY));\n          }\n          break;\n      }\n    }\n  }\n  endBatch();\n}\nfunction getDepFromReactive(object, key) {\n  const depMap = targetMap.get(object);\n  return depMap && depMap.get(key);\n}\n\nfunction reactiveReadArray(array) {\n  const raw = toRaw(array);\n  if (raw === array) return raw;\n  track(raw, \"iterate\", ARRAY_ITERATE_KEY);\n  return isShallow(array) ? raw : raw.map(toReactive);\n}\nfunction shallowReadArray(arr) {\n  track(arr = toRaw(arr), \"iterate\", ARRAY_ITERATE_KEY);\n  return arr;\n}\nconst arrayInstrumentations = {\n  __proto__: null,\n  [Symbol.iterator]() {\n    return iterator(this, Symbol.iterator, toReactive);\n  },\n  concat(...args) {\n    return reactiveReadArray(this).concat(\n      ...args.map((x) => isArray(x) ? reactiveReadArray(x) : x)\n    );\n  },\n  entries() {\n    return iterator(this, \"entries\", (value) => {\n      value[1] = toReactive(value[1]);\n      return value;\n    });\n  },\n  every(fn, thisArg) {\n    return apply(this, \"every\", fn, thisArg, void 0, arguments);\n  },\n  filter(fn, thisArg) {\n    return apply(this, \"filter\", fn, thisArg, (v) => v.map(toReactive), arguments);\n  },\n  find(fn, thisArg) {\n    return apply(this, \"find\", fn, thisArg, toReactive, arguments);\n  },\n  findIndex(fn, thisArg) {\n    return apply(this, \"findIndex\", fn, thisArg, void 0, arguments);\n  },\n  findLast(fn, thisArg) {\n    return apply(this, \"findLast\", fn, thisArg, toReactive, arguments);\n  },\n  findLastIndex(fn, thisArg) {\n    return apply(this, \"findLastIndex\", fn, thisArg, void 0, arguments);\n  },\n  // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement\n  forEach(fn, thisArg) {\n    return apply(this, \"forEach\", fn, thisArg, void 0, arguments);\n  },\n  includes(...args) {\n    return searchProxy(this, \"includes\", args);\n  },\n  indexOf(...args) {\n    return searchProxy(this, \"indexOf\", args);\n  },\n  join(separator) {\n    return reactiveReadArray(this).join(separator);\n  },\n  // keys() iterator only reads `length`, no optimisation required\n  lastIndexOf(...args) {\n    return searchProxy(this, \"lastIndexOf\", args);\n  },\n  map(fn, thisArg) {\n    return apply(this, \"map\", fn, thisArg, void 0, arguments);\n  },\n  pop() {\n    return noTracking(this, \"pop\");\n  },\n  push(...args) {\n    return noTracking(this, \"push\", args);\n  },\n  reduce(fn, ...args) {\n    return reduce(this, \"reduce\", fn, args);\n  },\n  reduceRight(fn, ...args) {\n    return reduce(this, \"reduceRight\", fn, args);\n  },\n  shift() {\n    return noTracking(this, \"shift\");\n  },\n  // slice could use ARRAY_ITERATE but also seems to beg for range tracking\n  some(fn, thisArg) {\n    return apply(this, \"some\", fn, thisArg, void 0, arguments);\n  },\n  splice(...args) {\n    return noTracking(this, \"splice\", args);\n  },\n  toReversed() {\n    return reactiveReadArray(this).toReversed();\n  },\n  toSorted(comparer) {\n    return reactiveReadArray(this).toSorted(comparer);\n  },\n  toSpliced(...args) {\n    return reactiveReadArray(this).toSpliced(...args);\n  },\n  unshift(...args) {\n    return noTracking(this, \"unshift\", args);\n  },\n  values() {\n    return iterator(this, \"values\", toReactive);\n  }\n};\nfunction iterator(self, method, wrapValue) {\n  const arr = shallowReadArray(self);\n  const iter = arr[method]();\n  if (arr !== self && !isShallow(self)) {\n    iter._next = iter.next;\n    iter.next = () => {\n      const result = iter._next();\n      if (result.value) {\n        result.value = wrapValue(result.value);\n      }\n      return result;\n    };\n  }\n  return iter;\n}\nconst arrayProto = Array.prototype;\nfunction apply(self, method, fn, thisArg, wrappedRetFn, args) {\n  const arr = shallowReadArray(self);\n  const needsWrap = arr !== self && !isShallow(self);\n  const methodFn = arr[method];\n  if (methodFn !== arrayProto[method]) {\n    const result2 = methodFn.apply(self, args);\n    return needsWrap ? toReactive(result2) : result2;\n  }\n  let wrappedFn = fn;\n  if (arr !== self) {\n    if (needsWrap) {\n      wrappedFn = function(item, index) {\n        return fn.call(this, toReactive(item), index, self);\n      };\n    } else if (fn.length > 2) {\n      wrappedFn = function(item, index) {\n        return fn.call(this, item, index, self);\n      };\n    }\n  }\n  const result = methodFn.call(arr, wrappedFn, thisArg);\n  return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result;\n}\nfunction reduce(self, method, fn, args) {\n  const arr = shallowReadArray(self);\n  let wrappedFn = fn;\n  if (arr !== self) {\n    if (!isShallow(self)) {\n      wrappedFn = function(acc, item, index) {\n        return fn.call(this, acc, toReactive(item), index, self);\n      };\n    } else if (fn.length > 3) {\n      wrappedFn = function(acc, item, index) {\n        return fn.call(this, acc, item, index, self);\n      };\n    }\n  }\n  return arr[method](wrappedFn, ...args);\n}\nfunction searchProxy(self, method, args) {\n  const arr = toRaw(self);\n  track(arr, \"iterate\", ARRAY_ITERATE_KEY);\n  const res = arr[method](...args);\n  if ((res === -1 || res === false) && isProxy(args[0])) {\n    args[0] = toRaw(args[0]);\n    return arr[method](...args);\n  }\n  return res;\n}\nfunction noTracking(self, method, args = []) {\n  pauseTracking();\n  startBatch();\n  const res = toRaw(self)[method].apply(self, args);\n  endBatch();\n  resetTracking();\n  return res;\n}\n\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n  /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== \"arguments\" && key !== \"caller\").map((key) => Symbol[key]).filter(isSymbol)\n);\nfunction hasOwnProperty(key) {\n  if (!isSymbol(key)) key = String(key);\n  const obj = toRaw(this);\n  track(obj, \"has\", key);\n  return obj.hasOwnProperty(key);\n}\nclass BaseReactiveHandler {\n  constructor(_isReadonly = false, _isShallow = false) {\n    this._isReadonly = _isReadonly;\n    this._isShallow = _isShallow;\n  }\n  get(target, key, receiver) {\n    const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;\n    if (key === \"__v_isReactive\") {\n      return !isReadonly2;\n    } else if (key === \"__v_isReadonly\") {\n      return isReadonly2;\n    } else if (key === \"__v_isShallow\") {\n      return isShallow2;\n    } else if (key === \"__v_raw\") {\n      if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype\n      // this means the receiver is a user proxy of the reactive proxy\n      Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {\n        return target;\n      }\n      return;\n    }\n    const targetIsArray = isArray(target);\n    if (!isReadonly2) {\n      let fn;\n      if (targetIsArray && (fn = arrayInstrumentations[key])) {\n        return fn;\n      }\n      if (key === \"hasOwnProperty\") {\n        return hasOwnProperty;\n      }\n    }\n    const res = Reflect.get(\n      target,\n      key,\n      // if this is a proxy wrapping a ref, return methods using the raw ref\n      // as receiver so that we don't have to call `toRaw` on the ref in all\n      // its class methods\n      isRef(target) ? target : receiver\n    );\n    if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n      return res;\n    }\n    if (!isReadonly2) {\n      track(target, \"get\", key);\n    }\n    if (isShallow2) {\n      return res;\n    }\n    if (isRef(res)) {\n      return targetIsArray && isIntegerKey(key) ? res : res.value;\n    }\n    if (isObject(res)) {\n      return isReadonly2 ? readonly(res) : reactive(res);\n    }\n    return res;\n  }\n}\nclass MutableReactiveHandler extends BaseReactiveHandler {\n  constructor(isShallow2 = false) {\n    super(false, isShallow2);\n  }\n  set(target, key, value, receiver) {\n    let oldValue = target[key];\n    if (!this._isShallow) {\n      const isOldValueReadonly = isReadonly(oldValue);\n      if (!isShallow(value) && !isReadonly(value)) {\n        oldValue = toRaw(oldValue);\n        value = toRaw(value);\n      }\n      if (!isArray(target) && isRef(oldValue) && !isRef(value)) {\n        if (isOldValueReadonly) {\n          return false;\n        } else {\n          oldValue.value = value;\n          return true;\n        }\n      }\n    }\n    const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);\n    const result = Reflect.set(\n      target,\n      key,\n      value,\n      isRef(target) ? target : receiver\n    );\n    if (target === toRaw(receiver)) {\n      if (!hadKey) {\n        trigger(target, \"add\", key, value);\n      } else if (hasChanged(value, oldValue)) {\n        trigger(target, \"set\", key, value, oldValue);\n      }\n    }\n    return result;\n  }\n  deleteProperty(target, key) {\n    const hadKey = hasOwn(target, key);\n    const oldValue = target[key];\n    const result = Reflect.deleteProperty(target, key);\n    if (result && hadKey) {\n      trigger(target, \"delete\", key, void 0, oldValue);\n    }\n    return result;\n  }\n  has(target, key) {\n    const result = Reflect.has(target, key);\n    if (!isSymbol(key) || !builtInSymbols.has(key)) {\n      track(target, \"has\", key);\n    }\n    return result;\n  }\n  ownKeys(target) {\n    track(\n      target,\n      \"iterate\",\n      isArray(target) ? \"length\" : ITERATE_KEY\n    );\n    return Reflect.ownKeys(target);\n  }\n}\nclass ReadonlyReactiveHandler extends BaseReactiveHandler {\n  constructor(isShallow2 = false) {\n    super(true, isShallow2);\n  }\n  set(target, key) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(\n        `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n        target\n      );\n    }\n    return true;\n  }\n  deleteProperty(target, key) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(\n        `Delete operation on key \"${String(key)}\" failed: target is readonly.`,\n        target\n      );\n    }\n    return true;\n  }\n}\nconst mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();\nconst readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();\nconst shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(true);\nconst shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction createIterableMethod(method, isReadonly2, isShallow2) {\n  return function(...args) {\n    const target = this[\"__v_raw\"];\n    const rawTarget = toRaw(target);\n    const targetIsMap = isMap(rawTarget);\n    const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n    const isKeyOnly = method === \"keys\" && targetIsMap;\n    const innerIterator = target[method](...args);\n    const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;\n    !isReadonly2 && track(\n      rawTarget,\n      \"iterate\",\n      isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY\n    );\n    return {\n      // iterator protocol\n      next() {\n        const { value, done } = innerIterator.next();\n        return done ? { value, done } : {\n          value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n          done\n        };\n      },\n      // iterable protocol\n      [Symbol.iterator]() {\n        return this;\n      }\n    };\n  };\n}\nfunction createReadonlyMethod(type) {\n  return function(...args) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n      warn(\n        `${capitalize(type)} operation ${key}failed: target is readonly.`,\n        toRaw(this)\n      );\n    }\n    return type === \"delete\" ? false : type === \"clear\" ? void 0 : this;\n  };\n}\nfunction createInstrumentations(readonly, shallow) {\n  const instrumentations = {\n    get(key) {\n      const target = this[\"__v_raw\"];\n      const rawTarget = toRaw(target);\n      const rawKey = toRaw(key);\n      if (!readonly) {\n        if (hasChanged(key, rawKey)) {\n          track(rawTarget, \"get\", key);\n        }\n        track(rawTarget, \"get\", rawKey);\n      }\n      const { has } = getProto(rawTarget);\n      const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n      if (has.call(rawTarget, key)) {\n        return wrap(target.get(key));\n      } else if (has.call(rawTarget, rawKey)) {\n        return wrap(target.get(rawKey));\n      } else if (target !== rawTarget) {\n        target.get(key);\n      }\n    },\n    get size() {\n      const target = this[\"__v_raw\"];\n      !readonly && track(toRaw(target), \"iterate\", ITERATE_KEY);\n      return Reflect.get(target, \"size\", target);\n    },\n    has(key) {\n      const target = this[\"__v_raw\"];\n      const rawTarget = toRaw(target);\n      const rawKey = toRaw(key);\n      if (!readonly) {\n        if (hasChanged(key, rawKey)) {\n          track(rawTarget, \"has\", key);\n        }\n        track(rawTarget, \"has\", rawKey);\n      }\n      return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n    },\n    forEach(callback, thisArg) {\n      const observed = this;\n      const target = observed[\"__v_raw\"];\n      const rawTarget = toRaw(target);\n      const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n      !readonly && track(rawTarget, \"iterate\", ITERATE_KEY);\n      return target.forEach((value, key) => {\n        return callback.call(thisArg, wrap(value), wrap(key), observed);\n      });\n    }\n  };\n  extend(\n    instrumentations,\n    readonly ? {\n      add: createReadonlyMethod(\"add\"),\n      set: createReadonlyMethod(\"set\"),\n      delete: createReadonlyMethod(\"delete\"),\n      clear: createReadonlyMethod(\"clear\")\n    } : {\n      add(value) {\n        if (!shallow && !isShallow(value) && !isReadonly(value)) {\n          value = toRaw(value);\n        }\n        const target = toRaw(this);\n        const proto = getProto(target);\n        const hadKey = proto.has.call(target, value);\n        if (!hadKey) {\n          target.add(value);\n          trigger(target, \"add\", value, value);\n        }\n        return this;\n      },\n      set(key, value) {\n        if (!shallow && !isShallow(value) && !isReadonly(value)) {\n          value = toRaw(value);\n        }\n        const target = toRaw(this);\n        const { has, get } = getProto(target);\n        let hadKey = has.call(target, key);\n        if (!hadKey) {\n          key = toRaw(key);\n          hadKey = has.call(target, key);\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          checkIdentityKeys(target, has, key);\n        }\n        const oldValue = get.call(target, key);\n        target.set(key, value);\n        if (!hadKey) {\n          trigger(target, \"add\", key, value);\n        } else if (hasChanged(value, oldValue)) {\n          trigger(target, \"set\", key, value, oldValue);\n        }\n        return this;\n      },\n      delete(key) {\n        const target = toRaw(this);\n        const { has, get } = getProto(target);\n        let hadKey = has.call(target, key);\n        if (!hadKey) {\n          key = toRaw(key);\n          hadKey = has.call(target, key);\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          checkIdentityKeys(target, has, key);\n        }\n        const oldValue = get ? get.call(target, key) : void 0;\n        const result = target.delete(key);\n        if (hadKey) {\n          trigger(target, \"delete\", key, void 0, oldValue);\n        }\n        return result;\n      },\n      clear() {\n        const target = toRaw(this);\n        const hadItems = target.size !== 0;\n        const oldTarget = !!(process.env.NODE_ENV !== \"production\") ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n        const result = target.clear();\n        if (hadItems) {\n          trigger(\n            target,\n            \"clear\",\n            void 0,\n            void 0,\n            oldTarget\n          );\n        }\n        return result;\n      }\n    }\n  );\n  const iteratorMethods = [\n    \"keys\",\n    \"values\",\n    \"entries\",\n    Symbol.iterator\n  ];\n  iteratorMethods.forEach((method) => {\n    instrumentations[method] = createIterableMethod(method, readonly, shallow);\n  });\n  return instrumentations;\n}\nfunction createInstrumentationGetter(isReadonly2, shallow) {\n  const instrumentations = createInstrumentations(isReadonly2, shallow);\n  return (target, key, receiver) => {\n    if (key === \"__v_isReactive\") {\n      return !isReadonly2;\n    } else if (key === \"__v_isReadonly\") {\n      return isReadonly2;\n    } else if (key === \"__v_raw\") {\n      return target;\n    }\n    return Reflect.get(\n      hasOwn(instrumentations, key) && key in target ? instrumentations : target,\n      key,\n      receiver\n    );\n  };\n}\nconst mutableCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n  get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has, key) {\n  const rawKey = toRaw(key);\n  if (rawKey !== key && has.call(target, rawKey)) {\n    const type = toRawType(target);\n    warn(\n      `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`\n    );\n  }\n}\n\nconst reactiveMap = /* @__PURE__ */ new WeakMap();\nconst shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nconst readonlyMap = /* @__PURE__ */ new WeakMap();\nconst shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n  switch (rawType) {\n    case \"Object\":\n    case \"Array\":\n      return 1 /* COMMON */;\n    case \"Map\":\n    case \"Set\":\n    case \"WeakMap\":\n    case \"WeakSet\":\n      return 2 /* COLLECTION */;\n    default:\n      return 0 /* INVALID */;\n  }\n}\nfunction getTargetType(value) {\n  return value[\"__v_skip\"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(toRawType(value));\n}\nfunction reactive(target) {\n  if (isReadonly(target)) {\n    return target;\n  }\n  return createReactiveObject(\n    target,\n    false,\n    mutableHandlers,\n    mutableCollectionHandlers,\n    reactiveMap\n  );\n}\nfunction shallowReactive(target) {\n  return createReactiveObject(\n    target,\n    false,\n    shallowReactiveHandlers,\n    shallowCollectionHandlers,\n    shallowReactiveMap\n  );\n}\nfunction readonly(target) {\n  return createReactiveObject(\n    target,\n    true,\n    readonlyHandlers,\n    readonlyCollectionHandlers,\n    readonlyMap\n  );\n}\nfunction shallowReadonly(target) {\n  return createReactiveObject(\n    target,\n    true,\n    shallowReadonlyHandlers,\n    shallowReadonlyCollectionHandlers,\n    shallowReadonlyMap\n  );\n}\nfunction createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n  if (!isObject(target)) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(\n        `value cannot be made ${isReadonly2 ? \"readonly\" : \"reactive\"}: ${String(\n          target\n        )}`\n      );\n    }\n    return target;\n  }\n  if (target[\"__v_raw\"] && !(isReadonly2 && target[\"__v_isReactive\"])) {\n    return target;\n  }\n  const existingProxy = proxyMap.get(target);\n  if (existingProxy) {\n    return existingProxy;\n  }\n  const targetType = getTargetType(target);\n  if (targetType === 0 /* INVALID */) {\n    return target;\n  }\n  const proxy = new Proxy(\n    target,\n    targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers\n  );\n  proxyMap.set(target, proxy);\n  return proxy;\n}\nfunction isReactive(value) {\n  if (isReadonly(value)) {\n    return isReactive(value[\"__v_raw\"]);\n  }\n  return !!(value && value[\"__v_isReactive\"]);\n}\nfunction isReadonly(value) {\n  return !!(value && value[\"__v_isReadonly\"]);\n}\nfunction isShallow(value) {\n  return !!(value && value[\"__v_isShallow\"]);\n}\nfunction isProxy(value) {\n  return value ? !!value[\"__v_raw\"] : false;\n}\nfunction toRaw(observed) {\n  const raw = observed && observed[\"__v_raw\"];\n  return raw ? toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n  if (!hasOwn(value, \"__v_skip\") && Object.isExtensible(value)) {\n    def(value, \"__v_skip\", true);\n  }\n  return value;\n}\nconst toReactive = (value) => isObject(value) ? reactive(value) : value;\nconst toReadonly = (value) => isObject(value) ? readonly(value) : value;\n\nfunction isRef(r) {\n  return r ? r[\"__v_isRef\"] === true : false;\n}\nfunction ref(value) {\n  return createRef(value, false);\n}\nfunction shallowRef(value) {\n  return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n  if (isRef(rawValue)) {\n    return rawValue;\n  }\n  return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n  constructor(value, isShallow2) {\n    this.dep = new Dep();\n    this[\"__v_isRef\"] = true;\n    this[\"__v_isShallow\"] = false;\n    this._rawValue = isShallow2 ? value : toRaw(value);\n    this._value = isShallow2 ? value : toReactive(value);\n    this[\"__v_isShallow\"] = isShallow2;\n  }\n  get value() {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      this.dep.track({\n        target: this,\n        type: \"get\",\n        key: \"value\"\n      });\n    } else {\n      this.dep.track();\n    }\n    return this._value;\n  }\n  set value(newValue) {\n    const oldValue = this._rawValue;\n    const useDirectValue = this[\"__v_isShallow\"] || isShallow(newValue) || isReadonly(newValue);\n    newValue = useDirectValue ? newValue : toRaw(newValue);\n    if (hasChanged(newValue, oldValue)) {\n      this._rawValue = newValue;\n      this._value = useDirectValue ? newValue : toReactive(newValue);\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        this.dep.trigger({\n          target: this,\n          type: \"set\",\n          key: \"value\",\n          newValue,\n          oldValue\n        });\n      } else {\n        this.dep.trigger();\n      }\n    }\n  }\n}\nfunction triggerRef(ref2) {\n  if (ref2.dep) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      ref2.dep.trigger({\n        target: ref2,\n        type: \"set\",\n        key: \"value\",\n        newValue: ref2._value\n      });\n    } else {\n      ref2.dep.trigger();\n    }\n  }\n}\nfunction unref(ref2) {\n  return isRef(ref2) ? ref2.value : ref2;\n}\nfunction toValue(source) {\n  return isFunction(source) ? source() : unref(source);\n}\nconst shallowUnwrapHandlers = {\n  get: (target, key, receiver) => key === \"__v_raw\" ? target : unref(Reflect.get(target, key, receiver)),\n  set: (target, key, value, receiver) => {\n    const oldValue = target[key];\n    if (isRef(oldValue) && !isRef(value)) {\n      oldValue.value = value;\n      return true;\n    } else {\n      return Reflect.set(target, key, value, receiver);\n    }\n  }\n};\nfunction proxyRefs(objectWithRefs) {\n  return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n  constructor(factory) {\n    this[\"__v_isRef\"] = true;\n    this._value = void 0;\n    const dep = this.dep = new Dep();\n    const { get, set } = factory(dep.track.bind(dep), dep.trigger.bind(dep));\n    this._get = get;\n    this._set = set;\n  }\n  get value() {\n    return this._value = this._get();\n  }\n  set value(newVal) {\n    this._set(newVal);\n  }\n}\nfunction customRef(factory) {\n  return new CustomRefImpl(factory);\n}\nfunction toRefs(object) {\n  if (!!(process.env.NODE_ENV !== \"production\") && !isProxy(object)) {\n    warn(`toRefs() expects a reactive object but received a plain one.`);\n  }\n  const ret = isArray(object) ? new Array(object.length) : {};\n  for (const key in object) {\n    ret[key] = propertyToRef(object, key);\n  }\n  return ret;\n}\nclass ObjectRefImpl {\n  constructor(_object, _key, _defaultValue) {\n    this._object = _object;\n    this._key = _key;\n    this._defaultValue = _defaultValue;\n    this[\"__v_isRef\"] = true;\n    this._value = void 0;\n  }\n  get value() {\n    const val = this._object[this._key];\n    return this._value = val === void 0 ? this._defaultValue : val;\n  }\n  set value(newVal) {\n    this._object[this._key] = newVal;\n  }\n  get dep() {\n    return getDepFromReactive(toRaw(this._object), this._key);\n  }\n}\nclass GetterRefImpl {\n  constructor(_getter) {\n    this._getter = _getter;\n    this[\"__v_isRef\"] = true;\n    this[\"__v_isReadonly\"] = true;\n    this._value = void 0;\n  }\n  get value() {\n    return this._value = this._getter();\n  }\n}\nfunction toRef(source, key, defaultValue) {\n  if (isRef(source)) {\n    return source;\n  } else if (isFunction(source)) {\n    return new GetterRefImpl(source);\n  } else if (isObject(source) && arguments.length > 1) {\n    return propertyToRef(source, key, defaultValue);\n  } else {\n    return ref(source);\n  }\n}\nfunction propertyToRef(source, key, defaultValue) {\n  const val = source[key];\n  return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue);\n}\n\nclass ComputedRefImpl {\n  constructor(fn, setter, isSSR) {\n    this.fn = fn;\n    this.setter = setter;\n    /**\n     * @internal\n     */\n    this._value = void 0;\n    /**\n     * @internal\n     */\n    this.dep = new Dep(this);\n    /**\n     * @internal\n     */\n    this.__v_isRef = true;\n    // TODO isolatedDeclarations \"__v_isReadonly\"\n    // A computed is also a subscriber that tracks other deps\n    /**\n     * @internal\n     */\n    this.deps = void 0;\n    /**\n     * @internal\n     */\n    this.depsTail = void 0;\n    /**\n     * @internal\n     */\n    this.flags = 16;\n    /**\n     * @internal\n     */\n    this.globalVersion = globalVersion - 1;\n    /**\n     * @internal\n     */\n    this.next = void 0;\n    // for backwards compat\n    this.effect = this;\n    this[\"__v_isReadonly\"] = !setter;\n    this.isSSR = isSSR;\n  }\n  /**\n   * @internal\n   */\n  notify() {\n    this.flags |= 16;\n    if (!(this.flags & 8) && // avoid infinite self recursion\n    activeSub !== this) {\n      batch(this, true);\n      return true;\n    } else if (!!(process.env.NODE_ENV !== \"production\")) ;\n  }\n  get value() {\n    const link = !!(process.env.NODE_ENV !== \"production\") ? this.dep.track({\n      target: this,\n      type: \"get\",\n      key: \"value\"\n    }) : this.dep.track();\n    refreshComputed(this);\n    if (link) {\n      link.version = this.dep.version;\n    }\n    return this._value;\n  }\n  set value(newValue) {\n    if (this.setter) {\n      this.setter(newValue);\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn(\"Write operation failed: computed value is readonly\");\n    }\n  }\n}\nfunction computed(getterOrOptions, debugOptions, isSSR = false) {\n  let getter;\n  let setter;\n  if (isFunction(getterOrOptions)) {\n    getter = getterOrOptions;\n  } else {\n    getter = getterOrOptions.get;\n    setter = getterOrOptions.set;\n  }\n  const cRef = new ComputedRefImpl(getter, setter, isSSR);\n  if (!!(process.env.NODE_ENV !== \"production\") && debugOptions && !isSSR) {\n    cRef.onTrack = debugOptions.onTrack;\n    cRef.onTrigger = debugOptions.onTrigger;\n  }\n  return cRef;\n}\n\nconst TrackOpTypes = {\n  \"GET\": \"get\",\n  \"HAS\": \"has\",\n  \"ITERATE\": \"iterate\"\n};\nconst TriggerOpTypes = {\n  \"SET\": \"set\",\n  \"ADD\": \"add\",\n  \"DELETE\": \"delete\",\n  \"CLEAR\": \"clear\"\n};\nconst ReactiveFlags = {\n  \"SKIP\": \"__v_skip\",\n  \"IS_REACTIVE\": \"__v_isReactive\",\n  \"IS_READONLY\": \"__v_isReadonly\",\n  \"IS_SHALLOW\": \"__v_isShallow\",\n  \"RAW\": \"__v_raw\",\n  \"IS_REF\": \"__v_isRef\"\n};\n\nconst WatchErrorCodes = {\n  \"WATCH_GETTER\": 2,\n  \"2\": \"WATCH_GETTER\",\n  \"WATCH_CALLBACK\": 3,\n  \"3\": \"WATCH_CALLBACK\",\n  \"WATCH_CLEANUP\": 4,\n  \"4\": \"WATCH_CLEANUP\"\n};\nconst INITIAL_WATCHER_VALUE = {};\nconst cleanupMap = /* @__PURE__ */ new WeakMap();\nlet activeWatcher = void 0;\nfunction getCurrentWatcher() {\n  return activeWatcher;\n}\nfunction onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) {\n  if (owner) {\n    let cleanups = cleanupMap.get(owner);\n    if (!cleanups) cleanupMap.set(owner, cleanups = []);\n    cleanups.push(cleanupFn);\n  } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n    warn(\n      `onWatcherCleanup() was called when there was no active watcher to associate with.`\n    );\n  }\n}\nfunction watch(source, cb, options = EMPTY_OBJ) {\n  const { immediate, deep, once, scheduler, augmentJob, call } = options;\n  const warnInvalidSource = (s) => {\n    (options.onWarn || warn)(\n      `Invalid watch source: `,\n      s,\n      `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`\n    );\n  };\n  const reactiveGetter = (source2) => {\n    if (deep) return source2;\n    if (isShallow(source2) || deep === false || deep === 0)\n      return traverse(source2, 1);\n    return traverse(source2);\n  };\n  let effect;\n  let getter;\n  let cleanup;\n  let boundCleanup;\n  let forceTrigger = false;\n  let isMultiSource = false;\n  if (isRef(source)) {\n    getter = () => source.value;\n    forceTrigger = isShallow(source);\n  } else if (isReactive(source)) {\n    getter = () => reactiveGetter(source);\n    forceTrigger = true;\n  } else if (isArray(source)) {\n    isMultiSource = true;\n    forceTrigger = source.some((s) => isReactive(s) || isShallow(s));\n    getter = () => source.map((s) => {\n      if (isRef(s)) {\n        return s.value;\n      } else if (isReactive(s)) {\n        return reactiveGetter(s);\n      } else if (isFunction(s)) {\n        return call ? call(s, 2) : s();\n      } else {\n        !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(s);\n      }\n    });\n  } else if (isFunction(source)) {\n    if (cb) {\n      getter = call ? () => call(source, 2) : source;\n    } else {\n      getter = () => {\n        if (cleanup) {\n          pauseTracking();\n          try {\n            cleanup();\n          } finally {\n            resetTracking();\n          }\n        }\n        const currentEffect = activeWatcher;\n        activeWatcher = effect;\n        try {\n          return call ? call(source, 3, [boundCleanup]) : source(boundCleanup);\n        } finally {\n          activeWatcher = currentEffect;\n        }\n      };\n    }\n  } else {\n    getter = NOOP;\n    !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(source);\n  }\n  if (cb && deep) {\n    const baseGetter = getter;\n    const depth = deep === true ? Infinity : deep;\n    getter = () => traverse(baseGetter(), depth);\n  }\n  const scope = getCurrentScope();\n  const watchHandle = () => {\n    effect.stop();\n    if (scope) {\n      remove(scope.effects, effect);\n    }\n  };\n  if (once && cb) {\n    const _cb = cb;\n    cb = (...args) => {\n      _cb(...args);\n      watchHandle();\n    };\n  }\n  let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;\n  const job = (immediateFirstRun) => {\n    if (!(effect.flags & 1) || !effect.dirty && !immediateFirstRun) {\n      return;\n    }\n    if (cb) {\n      const newValue = effect.run();\n      if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) {\n        if (cleanup) {\n          cleanup();\n        }\n        const currentWatcher = activeWatcher;\n        activeWatcher = effect;\n        try {\n          const args = [\n            newValue,\n            // pass undefined as the old value when it's changed for the first time\n            oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,\n            boundCleanup\n          ];\n          call ? call(cb, 3, args) : (\n            // @ts-expect-error\n            cb(...args)\n          );\n          oldValue = newValue;\n        } finally {\n          activeWatcher = currentWatcher;\n        }\n      }\n    } else {\n      effect.run();\n    }\n  };\n  if (augmentJob) {\n    augmentJob(job);\n  }\n  effect = new ReactiveEffect(getter);\n  effect.scheduler = scheduler ? () => scheduler(job, false) : job;\n  boundCleanup = (fn) => onWatcherCleanup(fn, false, effect);\n  cleanup = effect.onStop = () => {\n    const cleanups = cleanupMap.get(effect);\n    if (cleanups) {\n      if (call) {\n        call(cleanups, 4);\n      } else {\n        for (const cleanup2 of cleanups) cleanup2();\n      }\n      cleanupMap.delete(effect);\n    }\n  };\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    effect.onTrack = options.onTrack;\n    effect.onTrigger = options.onTrigger;\n  }\n  if (cb) {\n    if (immediate) {\n      job(true);\n    } else {\n      oldValue = effect.run();\n    }\n  } else if (scheduler) {\n    scheduler(job.bind(null, true), true);\n  } else {\n    effect.run();\n  }\n  watchHandle.pause = effect.pause.bind(effect);\n  watchHandle.resume = effect.resume.bind(effect);\n  watchHandle.stop = watchHandle;\n  return watchHandle;\n}\nfunction traverse(value, depth = Infinity, seen) {\n  if (depth <= 0 || !isObject(value) || value[\"__v_skip\"]) {\n    return value;\n  }\n  seen = seen || /* @__PURE__ */ new Set();\n  if (seen.has(value)) {\n    return value;\n  }\n  seen.add(value);\n  depth--;\n  if (isRef(value)) {\n    traverse(value.value, depth, seen);\n  } else if (isArray(value)) {\n    for (let i = 0; i < value.length; i++) {\n      traverse(value[i], depth, seen);\n    }\n  } else if (isSet(value) || isMap(value)) {\n    value.forEach((v) => {\n      traverse(v, depth, seen);\n    });\n  } else if (isPlainObject(value)) {\n    for (const key in value) {\n      traverse(value[key], depth, seen);\n    }\n    for (const key of Object.getOwnPropertySymbols(value)) {\n      if (Object.prototype.propertyIsEnumerable.call(value, key)) {\n        traverse(value[key], depth, seen);\n      }\n    }\n  }\n  return value;\n}\n\nexport { ARRAY_ITERATE_KEY, EffectFlags, EffectScope, ITERATE_KEY, MAP_KEY_ITERATE_KEY, ReactiveEffect, ReactiveFlags, TrackOpTypes, TriggerOpTypes, WatchErrorCodes, computed, customRef, effect, effectScope, enableTracking, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onEffectCleanup, onScopeDispose, onWatcherCleanup, pauseTracking, proxyRefs, reactive, reactiveReadArray, readonly, ref, resetTracking, shallowReactive, shallowReadArray, shallowReadonly, shallowRef, stop, toRaw, toReactive, toReadonly, toRef, toRefs, toValue, track, traverse, trigger, triggerRef, unref, watch };\n","/**\n* @vue/runtime-core v3.5.12\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { pauseTracking, resetTracking, isRef, toRaw, traverse, shallowRef, readonly, isReactive, ref, isShallow, shallowReadArray, toReactive, shallowReadonly, track, reactive, shallowReactive, trigger, ReactiveEffect, watch as watch$1, customRef, isProxy, proxyRefs, markRaw, EffectScope, computed as computed$1, isReadonly } from '@vue/reactivity';\nexport { EffectScope, ReactiveEffect, TrackOpTypes, TriggerOpTypes, customRef, effect, effectScope, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onScopeDispose, onWatcherCleanup, proxyRefs, reactive, readonly, ref, shallowReactive, shallowReadonly, shallowRef, stop, toRaw, toRef, toRefs, toValue, triggerRef, unref } from '@vue/reactivity';\nimport { isString, isFunction, isPromise, isArray, EMPTY_OBJ, NOOP, getGlobalThis, extend, isBuiltInDirective, hasOwn, remove, def, isOn, isReservedProp, normalizeClass, stringifyStyle, normalizeStyle, isKnownSvgAttr, isBooleanAttr, isKnownHtmlAttr, includeBooleanAttr, isRenderableAttrValue, getEscapedCssVarName, isObject, isRegExp, invokeArrayFns, toHandlerKey, capitalize, camelize, isSymbol, isGloballyAllowed, NO, hyphenate, EMPTY_ARR, toRawType, makeMap, hasChanged, looseToNumber, isModelListener, toNumber } from '@vue/shared';\nexport { camelize, capitalize, normalizeClass, normalizeProps, normalizeStyle, toDisplayString, toHandlerKey } from '@vue/shared';\n\nconst stack = [];\nfunction pushWarningContext(vnode) {\n  stack.push(vnode);\n}\nfunction popWarningContext() {\n  stack.pop();\n}\nlet isWarning = false;\nfunction warn$1(msg, ...args) {\n  if (isWarning) return;\n  isWarning = true;\n  pauseTracking();\n  const instance = stack.length ? stack[stack.length - 1].component : null;\n  const appWarnHandler = instance && instance.appContext.config.warnHandler;\n  const trace = getComponentTrace();\n  if (appWarnHandler) {\n    callWithErrorHandling(\n      appWarnHandler,\n      instance,\n      11,\n      [\n        // eslint-disable-next-line no-restricted-syntax\n        msg + args.map((a) => {\n          var _a, _b;\n          return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a);\n        }).join(\"\"),\n        instance && instance.proxy,\n        trace.map(\n          ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`\n        ).join(\"\\n\"),\n        trace\n      ]\n    );\n  } else {\n    const warnArgs = [`[Vue warn]: ${msg}`, ...args];\n    if (trace.length && // avoid spamming console during tests\n    true) {\n      warnArgs.push(`\n`, ...formatTrace(trace));\n    }\n    console.warn(...warnArgs);\n  }\n  resetTracking();\n  isWarning = false;\n}\nfunction getComponentTrace() {\n  let currentVNode = stack[stack.length - 1];\n  if (!currentVNode) {\n    return [];\n  }\n  const normalizedStack = [];\n  while (currentVNode) {\n    const last = normalizedStack[0];\n    if (last && last.vnode === currentVNode) {\n      last.recurseCount++;\n    } else {\n      normalizedStack.push({\n        vnode: currentVNode,\n        recurseCount: 0\n      });\n    }\n    const parentInstance = currentVNode.component && currentVNode.component.parent;\n    currentVNode = parentInstance && parentInstance.vnode;\n  }\n  return normalizedStack;\n}\nfunction formatTrace(trace) {\n  const logs = [];\n  trace.forEach((entry, i) => {\n    logs.push(...i === 0 ? [] : [`\n`], ...formatTraceEntry(entry));\n  });\n  return logs;\n}\nfunction formatTraceEntry({ vnode, recurseCount }) {\n  const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;\n  const isRoot = vnode.component ? vnode.component.parent == null : false;\n  const open = ` at <${formatComponentName(\n    vnode.component,\n    vnode.type,\n    isRoot\n  )}`;\n  const close = `>` + postfix;\n  return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];\n}\nfunction formatProps(props) {\n  const res = [];\n  const keys = Object.keys(props);\n  keys.slice(0, 3).forEach((key) => {\n    res.push(...formatProp(key, props[key]));\n  });\n  if (keys.length > 3) {\n    res.push(` ...`);\n  }\n  return res;\n}\nfunction formatProp(key, value, raw) {\n  if (isString(value)) {\n    value = JSON.stringify(value);\n    return raw ? value : [`${key}=${value}`];\n  } else if (typeof value === \"number\" || typeof value === \"boolean\" || value == null) {\n    return raw ? value : [`${key}=${value}`];\n  } else if (isRef(value)) {\n    value = formatProp(key, toRaw(value.value), true);\n    return raw ? value : [`${key}=Ref<`, value, `>`];\n  } else if (isFunction(value)) {\n    return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];\n  } else {\n    value = toRaw(value);\n    return raw ? value : [`${key}=`, value];\n  }\n}\nfunction assertNumber(val, type) {\n  if (!!!(process.env.NODE_ENV !== \"production\")) return;\n  if (val === void 0) {\n    return;\n  } else if (typeof val !== \"number\") {\n    warn$1(`${type} is not a valid number - got ${JSON.stringify(val)}.`);\n  } else if (isNaN(val)) {\n    warn$1(`${type} is NaN - the duration expression might be incorrect.`);\n  }\n}\n\nconst ErrorCodes = {\n  \"SETUP_FUNCTION\": 0,\n  \"0\": \"SETUP_FUNCTION\",\n  \"RENDER_FUNCTION\": 1,\n  \"1\": \"RENDER_FUNCTION\",\n  \"NATIVE_EVENT_HANDLER\": 5,\n  \"5\": \"NATIVE_EVENT_HANDLER\",\n  \"COMPONENT_EVENT_HANDLER\": 6,\n  \"6\": \"COMPONENT_EVENT_HANDLER\",\n  \"VNODE_HOOK\": 7,\n  \"7\": \"VNODE_HOOK\",\n  \"DIRECTIVE_HOOK\": 8,\n  \"8\": \"DIRECTIVE_HOOK\",\n  \"TRANSITION_HOOK\": 9,\n  \"9\": \"TRANSITION_HOOK\",\n  \"APP_ERROR_HANDLER\": 10,\n  \"10\": \"APP_ERROR_HANDLER\",\n  \"APP_WARN_HANDLER\": 11,\n  \"11\": \"APP_WARN_HANDLER\",\n  \"FUNCTION_REF\": 12,\n  \"12\": \"FUNCTION_REF\",\n  \"ASYNC_COMPONENT_LOADER\": 13,\n  \"13\": \"ASYNC_COMPONENT_LOADER\",\n  \"SCHEDULER\": 14,\n  \"14\": \"SCHEDULER\",\n  \"COMPONENT_UPDATE\": 15,\n  \"15\": \"COMPONENT_UPDATE\",\n  \"APP_UNMOUNT_CLEANUP\": 16,\n  \"16\": \"APP_UNMOUNT_CLEANUP\"\n};\nconst ErrorTypeStrings$1 = {\n  [\"sp\"]: \"serverPrefetch hook\",\n  [\"bc\"]: \"beforeCreate hook\",\n  [\"c\"]: \"created hook\",\n  [\"bm\"]: \"beforeMount hook\",\n  [\"m\"]: \"mounted hook\",\n  [\"bu\"]: \"beforeUpdate hook\",\n  [\"u\"]: \"updated\",\n  [\"bum\"]: \"beforeUnmount hook\",\n  [\"um\"]: \"unmounted hook\",\n  [\"a\"]: \"activated hook\",\n  [\"da\"]: \"deactivated hook\",\n  [\"ec\"]: \"errorCaptured hook\",\n  [\"rtc\"]: \"renderTracked hook\",\n  [\"rtg\"]: \"renderTriggered hook\",\n  [0]: \"setup function\",\n  [1]: \"render function\",\n  [2]: \"watcher getter\",\n  [3]: \"watcher callback\",\n  [4]: \"watcher cleanup function\",\n  [5]: \"native event handler\",\n  [6]: \"component event handler\",\n  [7]: \"vnode hook\",\n  [8]: \"directive hook\",\n  [9]: \"transition hook\",\n  [10]: \"app errorHandler\",\n  [11]: \"app warnHandler\",\n  [12]: \"ref function\",\n  [13]: \"async component loader\",\n  [14]: \"scheduler flush\",\n  [15]: \"component update\",\n  [16]: \"app unmount cleanup function\"\n};\nfunction callWithErrorHandling(fn, instance, type, args) {\n  try {\n    return args ? fn(...args) : fn();\n  } catch (err) {\n    handleError(err, instance, type);\n  }\n}\nfunction callWithAsyncErrorHandling(fn, instance, type, args) {\n  if (isFunction(fn)) {\n    const res = callWithErrorHandling(fn, instance, type, args);\n    if (res && isPromise(res)) {\n      res.catch((err) => {\n        handleError(err, instance, type);\n      });\n    }\n    return res;\n  }\n  if (isArray(fn)) {\n    const values = [];\n    for (let i = 0; i < fn.length; i++) {\n      values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));\n    }\n    return values;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(\n      `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}`\n    );\n  }\n}\nfunction handleError(err, instance, type, throwInDev = true) {\n  const contextVNode = instance ? instance.vnode : null;\n  const { errorHandler, throwUnhandledErrorInProduction } = instance && instance.appContext.config || EMPTY_OBJ;\n  if (instance) {\n    let cur = instance.parent;\n    const exposedInstance = instance.proxy;\n    const errorInfo = !!(process.env.NODE_ENV !== \"production\") ? ErrorTypeStrings$1[type] : `https://vuejs.org/error-reference/#runtime-${type}`;\n    while (cur) {\n      const errorCapturedHooks = cur.ec;\n      if (errorCapturedHooks) {\n        for (let i = 0; i < errorCapturedHooks.length; i++) {\n          if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {\n            return;\n          }\n        }\n      }\n      cur = cur.parent;\n    }\n    if (errorHandler) {\n      pauseTracking();\n      callWithErrorHandling(errorHandler, null, 10, [\n        err,\n        exposedInstance,\n        errorInfo\n      ]);\n      resetTracking();\n      return;\n    }\n  }\n  logError(err, type, contextVNode, throwInDev, throwUnhandledErrorInProduction);\n}\nfunction logError(err, type, contextVNode, throwInDev = true, throwInProd = false) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const info = ErrorTypeStrings$1[type];\n    if (contextVNode) {\n      pushWarningContext(contextVNode);\n    }\n    warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`);\n    if (contextVNode) {\n      popWarningContext();\n    }\n    if (throwInDev) {\n      throw err;\n    } else {\n      console.error(err);\n    }\n  } else if (throwInProd) {\n    throw err;\n  } else {\n    console.error(err);\n  }\n}\n\nconst queue = [];\nlet flushIndex = -1;\nconst pendingPostFlushCbs = [];\nlet activePostFlushCbs = null;\nlet postFlushIndex = 0;\nconst resolvedPromise = /* @__PURE__ */ Promise.resolve();\nlet currentFlushPromise = null;\nconst RECURSION_LIMIT = 100;\nfunction nextTick(fn) {\n  const p = currentFlushPromise || resolvedPromise;\n  return fn ? p.then(this ? fn.bind(this) : fn) : p;\n}\nfunction findInsertionIndex(id) {\n  let start = flushIndex + 1;\n  let end = queue.length;\n  while (start < end) {\n    const middle = start + end >>> 1;\n    const middleJob = queue[middle];\n    const middleJobId = getId(middleJob);\n    if (middleJobId < id || middleJobId === id && middleJob.flags & 2) {\n      start = middle + 1;\n    } else {\n      end = middle;\n    }\n  }\n  return start;\n}\nfunction queueJob(job) {\n  if (!(job.flags & 1)) {\n    const jobId = getId(job);\n    const lastJob = queue[queue.length - 1];\n    if (!lastJob || // fast path when the job id is larger than the tail\n    !(job.flags & 2) && jobId >= getId(lastJob)) {\n      queue.push(job);\n    } else {\n      queue.splice(findInsertionIndex(jobId), 0, job);\n    }\n    job.flags |= 1;\n    queueFlush();\n  }\n}\nfunction queueFlush() {\n  if (!currentFlushPromise) {\n    currentFlushPromise = resolvedPromise.then(flushJobs);\n  }\n}\nfunction queuePostFlushCb(cb) {\n  if (!isArray(cb)) {\n    if (activePostFlushCbs && cb.id === -1) {\n      activePostFlushCbs.splice(postFlushIndex + 1, 0, cb);\n    } else if (!(cb.flags & 1)) {\n      pendingPostFlushCbs.push(cb);\n      cb.flags |= 1;\n    }\n  } else {\n    pendingPostFlushCbs.push(...cb);\n  }\n  queueFlush();\n}\nfunction flushPreFlushCbs(instance, seen, i = flushIndex + 1) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    seen = seen || /* @__PURE__ */ new Map();\n  }\n  for (; i < queue.length; i++) {\n    const cb = queue[i];\n    if (cb && cb.flags & 2) {\n      if (instance && cb.id !== instance.uid) {\n        continue;\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n        continue;\n      }\n      queue.splice(i, 1);\n      i--;\n      if (cb.flags & 4) {\n        cb.flags &= ~1;\n      }\n      cb();\n      if (!(cb.flags & 4)) {\n        cb.flags &= ~1;\n      }\n    }\n  }\n}\nfunction flushPostFlushCbs(seen) {\n  if (pendingPostFlushCbs.length) {\n    const deduped = [...new Set(pendingPostFlushCbs)].sort(\n      (a, b) => getId(a) - getId(b)\n    );\n    pendingPostFlushCbs.length = 0;\n    if (activePostFlushCbs) {\n      activePostFlushCbs.push(...deduped);\n      return;\n    }\n    activePostFlushCbs = deduped;\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      seen = seen || /* @__PURE__ */ new Map();\n    }\n    for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {\n      const cb = activePostFlushCbs[postFlushIndex];\n      if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n        continue;\n      }\n      if (cb.flags & 4) {\n        cb.flags &= ~1;\n      }\n      if (!(cb.flags & 8)) cb();\n      cb.flags &= ~1;\n    }\n    activePostFlushCbs = null;\n    postFlushIndex = 0;\n  }\n}\nconst getId = (job) => job.id == null ? job.flags & 2 ? -1 : Infinity : job.id;\nfunction flushJobs(seen) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    seen = seen || /* @__PURE__ */ new Map();\n  }\n  const check = !!(process.env.NODE_ENV !== \"production\") ? (job) => checkRecursiveUpdates(seen, job) : NOOP;\n  try {\n    for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {\n      const job = queue[flushIndex];\n      if (job && !(job.flags & 8)) {\n        if (!!(process.env.NODE_ENV !== \"production\") && check(job)) {\n          continue;\n        }\n        if (job.flags & 4) {\n          job.flags &= ~1;\n        }\n        callWithErrorHandling(\n          job,\n          job.i,\n          job.i ? 15 : 14\n        );\n        if (!(job.flags & 4)) {\n          job.flags &= ~1;\n        }\n      }\n    }\n  } finally {\n    for (; flushIndex < queue.length; flushIndex++) {\n      const job = queue[flushIndex];\n      if (job) {\n        job.flags &= ~1;\n      }\n    }\n    flushIndex = -1;\n    queue.length = 0;\n    flushPostFlushCbs(seen);\n    currentFlushPromise = null;\n    if (queue.length || pendingPostFlushCbs.length) {\n      flushJobs(seen);\n    }\n  }\n}\nfunction checkRecursiveUpdates(seen, fn) {\n  const count = seen.get(fn) || 0;\n  if (count > RECURSION_LIMIT) {\n    const instance = fn.i;\n    const componentName = instance && getComponentName(instance.type);\n    handleError(\n      `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,\n      null,\n      10\n    );\n    return true;\n  }\n  seen.set(fn, count + 1);\n  return false;\n}\n\nlet isHmrUpdating = false;\nconst hmrDirtyComponents = /* @__PURE__ */ new Map();\nif (!!(process.env.NODE_ENV !== \"production\")) {\n  getGlobalThis().__VUE_HMR_RUNTIME__ = {\n    createRecord: tryWrap(createRecord),\n    rerender: tryWrap(rerender),\n    reload: tryWrap(reload)\n  };\n}\nconst map = /* @__PURE__ */ new Map();\nfunction registerHMR(instance) {\n  const id = instance.type.__hmrId;\n  let record = map.get(id);\n  if (!record) {\n    createRecord(id, instance.type);\n    record = map.get(id);\n  }\n  record.instances.add(instance);\n}\nfunction unregisterHMR(instance) {\n  map.get(instance.type.__hmrId).instances.delete(instance);\n}\nfunction createRecord(id, initialDef) {\n  if (map.has(id)) {\n    return false;\n  }\n  map.set(id, {\n    initialDef: normalizeClassComponent(initialDef),\n    instances: /* @__PURE__ */ new Set()\n  });\n  return true;\n}\nfunction normalizeClassComponent(component) {\n  return isClassComponent(component) ? component.__vccOpts : component;\n}\nfunction rerender(id, newRender) {\n  const record = map.get(id);\n  if (!record) {\n    return;\n  }\n  record.initialDef.render = newRender;\n  [...record.instances].forEach((instance) => {\n    if (newRender) {\n      instance.render = newRender;\n      normalizeClassComponent(instance.type).render = newRender;\n    }\n    instance.renderCache = [];\n    isHmrUpdating = true;\n    instance.update();\n    isHmrUpdating = false;\n  });\n}\nfunction reload(id, newComp) {\n  const record = map.get(id);\n  if (!record) return;\n  newComp = normalizeClassComponent(newComp);\n  updateComponentDef(record.initialDef, newComp);\n  const instances = [...record.instances];\n  for (let i = 0; i < instances.length; i++) {\n    const instance = instances[i];\n    const oldComp = normalizeClassComponent(instance.type);\n    let dirtyInstances = hmrDirtyComponents.get(oldComp);\n    if (!dirtyInstances) {\n      if (oldComp !== record.initialDef) {\n        updateComponentDef(oldComp, newComp);\n      }\n      hmrDirtyComponents.set(oldComp, dirtyInstances = /* @__PURE__ */ new Set());\n    }\n    dirtyInstances.add(instance);\n    instance.appContext.propsCache.delete(instance.type);\n    instance.appContext.emitsCache.delete(instance.type);\n    instance.appContext.optionsCache.delete(instance.type);\n    if (instance.ceReload) {\n      dirtyInstances.add(instance);\n      instance.ceReload(newComp.styles);\n      dirtyInstances.delete(instance);\n    } else if (instance.parent) {\n      queueJob(() => {\n        isHmrUpdating = true;\n        instance.parent.update();\n        isHmrUpdating = false;\n        dirtyInstances.delete(instance);\n      });\n    } else if (instance.appContext.reload) {\n      instance.appContext.reload();\n    } else if (typeof window !== \"undefined\") {\n      window.location.reload();\n    } else {\n      console.warn(\n        \"[HMR] Root or manually mounted instance modified. Full reload required.\"\n      );\n    }\n    if (instance.root.ce && instance !== instance.root) {\n      instance.root.ce._removeChildStyle(oldComp);\n    }\n  }\n  queuePostFlushCb(() => {\n    hmrDirtyComponents.clear();\n  });\n}\nfunction updateComponentDef(oldComp, newComp) {\n  extend(oldComp, newComp);\n  for (const key in oldComp) {\n    if (key !== \"__file\" && !(key in newComp)) {\n      delete oldComp[key];\n    }\n  }\n}\nfunction tryWrap(fn) {\n  return (id, arg) => {\n    try {\n      return fn(id, arg);\n    } catch (e) {\n      console.error(e);\n      console.warn(\n        `[HMR] Something went wrong during Vue component hot-reload. Full reload required.`\n      );\n    }\n  };\n}\n\nlet devtools$1;\nlet buffer = [];\nlet devtoolsNotInstalled = false;\nfunction emit$1(event, ...args) {\n  if (devtools$1) {\n    devtools$1.emit(event, ...args);\n  } else if (!devtoolsNotInstalled) {\n    buffer.push({ event, args });\n  }\n}\nfunction setDevtoolsHook$1(hook, target) {\n  var _a, _b;\n  devtools$1 = hook;\n  if (devtools$1) {\n    devtools$1.enabled = true;\n    buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args));\n    buffer = [];\n  } else if (\n    // handle late devtools injection - only do this if we are in an actual\n    // browser environment to avoid the timer handle stalling test runner exit\n    // (#4815)\n    typeof window !== \"undefined\" && // some envs mock window but not fully\n    window.HTMLElement && // also exclude jsdom\n    // eslint-disable-next-line no-restricted-syntax\n    !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes(\"jsdom\"))\n  ) {\n    const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];\n    replay.push((newHook) => {\n      setDevtoolsHook$1(newHook, target);\n    });\n    setTimeout(() => {\n      if (!devtools$1) {\n        target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;\n        devtoolsNotInstalled = true;\n        buffer = [];\n      }\n    }, 3e3);\n  } else {\n    devtoolsNotInstalled = true;\n    buffer = [];\n  }\n}\nfunction devtoolsInitApp(app, version) {\n  emit$1(\"app:init\" /* APP_INIT */, app, version, {\n    Fragment,\n    Text,\n    Comment,\n    Static\n  });\n}\nfunction devtoolsUnmountApp(app) {\n  emit$1(\"app:unmount\" /* APP_UNMOUNT */, app);\n}\nconst devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(\"component:added\" /* COMPONENT_ADDED */);\nconst devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook(\"component:updated\" /* COMPONENT_UPDATED */);\nconst _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(\n  \"component:removed\" /* COMPONENT_REMOVED */\n);\nconst devtoolsComponentRemoved = (component) => {\n  if (devtools$1 && typeof devtools$1.cleanupBuffer === \"function\" && // remove the component if it wasn't buffered\n  !devtools$1.cleanupBuffer(component)) {\n    _devtoolsComponentRemoved(component);\n  }\n};\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction createDevtoolsComponentHook(hook) {\n  return (component) => {\n    emit$1(\n      hook,\n      component.appContext.app,\n      component.uid,\n      component.parent ? component.parent.uid : void 0,\n      component\n    );\n  };\n}\nconst devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:start\" /* PERFORMANCE_START */);\nconst devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:end\" /* PERFORMANCE_END */);\nfunction createDevtoolsPerformanceHook(hook) {\n  return (component, type, time) => {\n    emit$1(hook, component.appContext.app, component.uid, component, type, time);\n  };\n}\nfunction devtoolsComponentEmit(component, event, params) {\n  emit$1(\n    \"component:emit\" /* COMPONENT_EMIT */,\n    component.appContext.app,\n    component,\n    event,\n    params\n  );\n}\n\nlet currentRenderingInstance = null;\nlet currentScopeId = null;\nfunction setCurrentRenderingInstance(instance) {\n  const prev = currentRenderingInstance;\n  currentRenderingInstance = instance;\n  currentScopeId = instance && instance.type.__scopeId || null;\n  return prev;\n}\nfunction pushScopeId(id) {\n  currentScopeId = id;\n}\nfunction popScopeId() {\n  currentScopeId = null;\n}\nconst withScopeId = (_id) => withCtx;\nfunction withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {\n  if (!ctx) return fn;\n  if (fn._n) {\n    return fn;\n  }\n  const renderFnWithContext = (...args) => {\n    if (renderFnWithContext._d) {\n      setBlockTracking(-1);\n    }\n    const prevInstance = setCurrentRenderingInstance(ctx);\n    let res;\n    try {\n      res = fn(...args);\n    } finally {\n      setCurrentRenderingInstance(prevInstance);\n      if (renderFnWithContext._d) {\n        setBlockTracking(1);\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      devtoolsComponentUpdated(ctx);\n    }\n    return res;\n  };\n  renderFnWithContext._n = true;\n  renderFnWithContext._c = true;\n  renderFnWithContext._d = true;\n  return renderFnWithContext;\n}\n\nfunction validateDirectiveName(name) {\n  if (isBuiltInDirective(name)) {\n    warn$1(\"Do not use built-in directive ids as custom directive id: \" + name);\n  }\n}\nfunction withDirectives(vnode, directives) {\n  if (currentRenderingInstance === null) {\n    !!(process.env.NODE_ENV !== \"production\") && warn$1(`withDirectives can only be used inside render functions.`);\n    return vnode;\n  }\n  const instance = getComponentPublicInstance(currentRenderingInstance);\n  const bindings = vnode.dirs || (vnode.dirs = []);\n  for (let i = 0; i < directives.length; i++) {\n    let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];\n    if (dir) {\n      if (isFunction(dir)) {\n        dir = {\n          mounted: dir,\n          updated: dir\n        };\n      }\n      if (dir.deep) {\n        traverse(value);\n      }\n      bindings.push({\n        dir,\n        instance,\n        value,\n        oldValue: void 0,\n        arg,\n        modifiers\n      });\n    }\n  }\n  return vnode;\n}\nfunction invokeDirectiveHook(vnode, prevVNode, instance, name) {\n  const bindings = vnode.dirs;\n  const oldBindings = prevVNode && prevVNode.dirs;\n  for (let i = 0; i < bindings.length; i++) {\n    const binding = bindings[i];\n    if (oldBindings) {\n      binding.oldValue = oldBindings[i].value;\n    }\n    let hook = binding.dir[name];\n    if (hook) {\n      pauseTracking();\n      callWithAsyncErrorHandling(hook, instance, 8, [\n        vnode.el,\n        binding,\n        vnode,\n        prevVNode\n      ]);\n      resetTracking();\n    }\n  }\n}\n\nconst TeleportEndKey = Symbol(\"_vte\");\nconst isTeleport = (type) => type.__isTeleport;\nconst isTeleportDisabled = (props) => props && (props.disabled || props.disabled === \"\");\nconst isTeleportDeferred = (props) => props && (props.defer || props.defer === \"\");\nconst isTargetSVG = (target) => typeof SVGElement !== \"undefined\" && target instanceof SVGElement;\nconst isTargetMathML = (target) => typeof MathMLElement === \"function\" && target instanceof MathMLElement;\nconst resolveTarget = (props, select) => {\n  const targetSelector = props && props.to;\n  if (isString(targetSelector)) {\n    if (!select) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(\n        `Current renderer does not support string target for Teleports. (missing querySelector renderer option)`\n      );\n      return null;\n    } else {\n      const target = select(targetSelector);\n      if (!!(process.env.NODE_ENV !== \"production\") && !target && !isTeleportDisabled(props)) {\n        warn$1(\n          `Failed to locate Teleport target with selector \"${targetSelector}\". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.`\n        );\n      }\n      return target;\n    }\n  } else {\n    if (!!(process.env.NODE_ENV !== \"production\") && !targetSelector && !isTeleportDisabled(props)) {\n      warn$1(`Invalid Teleport target: ${targetSelector}`);\n    }\n    return targetSelector;\n  }\n};\nconst TeleportImpl = {\n  name: \"Teleport\",\n  __isTeleport: true,\n  process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals) {\n    const {\n      mc: mountChildren,\n      pc: patchChildren,\n      pbc: patchBlockChildren,\n      o: { insert, querySelector, createText, createComment }\n    } = internals;\n    const disabled = isTeleportDisabled(n2.props);\n    let { shapeFlag, children, dynamicChildren } = n2;\n    if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n      optimized = false;\n      dynamicChildren = null;\n    }\n    if (n1 == null) {\n      const placeholder = n2.el = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport start\") : createText(\"\");\n      const mainAnchor = n2.anchor = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport end\") : createText(\"\");\n      insert(placeholder, container, anchor);\n      insert(mainAnchor, container, anchor);\n      const mount = (container2, anchor2) => {\n        if (shapeFlag & 16) {\n          if (parentComponent && parentComponent.isCE) {\n            parentComponent.ce._teleportTarget = container2;\n          }\n          mountChildren(\n            children,\n            container2,\n            anchor2,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        }\n      };\n      const mountToTarget = () => {\n        const target = n2.target = resolveTarget(n2.props, querySelector);\n        const targetAnchor = prepareAnchor(target, n2, createText, insert);\n        if (target) {\n          if (namespace !== \"svg\" && isTargetSVG(target)) {\n            namespace = \"svg\";\n          } else if (namespace !== \"mathml\" && isTargetMathML(target)) {\n            namespace = \"mathml\";\n          }\n          if (!disabled) {\n            mount(target, targetAnchor);\n            updateCssVars(n2, false);\n          }\n        } else if (!!(process.env.NODE_ENV !== \"production\") && !disabled) {\n          warn$1(\n            \"Invalid Teleport target on mount:\",\n            target,\n            `(${typeof target})`\n          );\n        }\n      };\n      if (disabled) {\n        mount(container, mainAnchor);\n        updateCssVars(n2, true);\n      }\n      if (isTeleportDeferred(n2.props)) {\n        queuePostRenderEffect(mountToTarget, parentSuspense);\n      } else {\n        mountToTarget();\n      }\n    } else {\n      n2.el = n1.el;\n      n2.targetStart = n1.targetStart;\n      const mainAnchor = n2.anchor = n1.anchor;\n      const target = n2.target = n1.target;\n      const targetAnchor = n2.targetAnchor = n1.targetAnchor;\n      const wasDisabled = isTeleportDisabled(n1.props);\n      const currentContainer = wasDisabled ? container : target;\n      const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;\n      if (namespace === \"svg\" || isTargetSVG(target)) {\n        namespace = \"svg\";\n      } else if (namespace === \"mathml\" || isTargetMathML(target)) {\n        namespace = \"mathml\";\n      }\n      if (dynamicChildren) {\n        patchBlockChildren(\n          n1.dynamicChildren,\n          dynamicChildren,\n          currentContainer,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds\n        );\n        traverseStaticChildren(n1, n2, true);\n      } else if (!optimized) {\n        patchChildren(\n          n1,\n          n2,\n          currentContainer,\n          currentAnchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          false\n        );\n      }\n      if (disabled) {\n        if (!wasDisabled) {\n          moveTeleport(\n            n2,\n            container,\n            mainAnchor,\n            internals,\n            1\n          );\n        } else {\n          if (n2.props && n1.props && n2.props.to !== n1.props.to) {\n            n2.props.to = n1.props.to;\n          }\n        }\n      } else {\n        if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {\n          const nextTarget = n2.target = resolveTarget(\n            n2.props,\n            querySelector\n          );\n          if (nextTarget) {\n            moveTeleport(\n              n2,\n              nextTarget,\n              null,\n              internals,\n              0\n            );\n          } else if (!!(process.env.NODE_ENV !== \"production\")) {\n            warn$1(\n              \"Invalid Teleport target on update:\",\n              target,\n              `(${typeof target})`\n            );\n          }\n        } else if (wasDisabled) {\n          moveTeleport(\n            n2,\n            target,\n            targetAnchor,\n            internals,\n            1\n          );\n        }\n      }\n      updateCssVars(n2, disabled);\n    }\n  },\n  remove(vnode, parentComponent, parentSuspense, { um: unmount, o: { remove: hostRemove } }, doRemove) {\n    const {\n      shapeFlag,\n      children,\n      anchor,\n      targetStart,\n      targetAnchor,\n      target,\n      props\n    } = vnode;\n    if (target) {\n      hostRemove(targetStart);\n      hostRemove(targetAnchor);\n    }\n    doRemove && hostRemove(anchor);\n    if (shapeFlag & 16) {\n      const shouldRemove = doRemove || !isTeleportDisabled(props);\n      for (let i = 0; i < children.length; i++) {\n        const child = children[i];\n        unmount(\n          child,\n          parentComponent,\n          parentSuspense,\n          shouldRemove,\n          !!child.dynamicChildren\n        );\n      }\n    }\n  },\n  move: moveTeleport,\n  hydrate: hydrateTeleport\n};\nfunction moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) {\n  if (moveType === 0) {\n    insert(vnode.targetAnchor, container, parentAnchor);\n  }\n  const { el, anchor, shapeFlag, children, props } = vnode;\n  const isReorder = moveType === 2;\n  if (isReorder) {\n    insert(el, container, parentAnchor);\n  }\n  if (!isReorder || isTeleportDisabled(props)) {\n    if (shapeFlag & 16) {\n      for (let i = 0; i < children.length; i++) {\n        move(\n          children[i],\n          container,\n          parentAnchor,\n          2\n        );\n      }\n    }\n  }\n  if (isReorder) {\n    insert(anchor, container, parentAnchor);\n  }\n}\nfunction hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, {\n  o: { nextSibling, parentNode, querySelector, insert, createText }\n}, hydrateChildren) {\n  const target = vnode.target = resolveTarget(\n    vnode.props,\n    querySelector\n  );\n  if (target) {\n    const disabled = isTeleportDisabled(vnode.props);\n    const targetNode = target._lpa || target.firstChild;\n    if (vnode.shapeFlag & 16) {\n      if (disabled) {\n        vnode.anchor = hydrateChildren(\n          nextSibling(node),\n          vnode,\n          parentNode(node),\n          parentComponent,\n          parentSuspense,\n          slotScopeIds,\n          optimized\n        );\n        vnode.targetStart = targetNode;\n        vnode.targetAnchor = targetNode && nextSibling(targetNode);\n      } else {\n        vnode.anchor = nextSibling(node);\n        let targetAnchor = targetNode;\n        while (targetAnchor) {\n          if (targetAnchor && targetAnchor.nodeType === 8) {\n            if (targetAnchor.data === \"teleport start anchor\") {\n              vnode.targetStart = targetAnchor;\n            } else if (targetAnchor.data === \"teleport anchor\") {\n              vnode.targetAnchor = targetAnchor;\n              target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);\n              break;\n            }\n          }\n          targetAnchor = nextSibling(targetAnchor);\n        }\n        if (!vnode.targetAnchor) {\n          prepareAnchor(target, vnode, createText, insert);\n        }\n        hydrateChildren(\n          targetNode && nextSibling(targetNode),\n          vnode,\n          target,\n          parentComponent,\n          parentSuspense,\n          slotScopeIds,\n          optimized\n        );\n      }\n    }\n    updateCssVars(vnode, disabled);\n  }\n  return vnode.anchor && nextSibling(vnode.anchor);\n}\nconst Teleport = TeleportImpl;\nfunction updateCssVars(vnode, isDisabled) {\n  const ctx = vnode.ctx;\n  if (ctx && ctx.ut) {\n    let node, anchor;\n    if (isDisabled) {\n      node = vnode.el;\n      anchor = vnode.anchor;\n    } else {\n      node = vnode.targetStart;\n      anchor = vnode.targetAnchor;\n    }\n    while (node && node !== anchor) {\n      if (node.nodeType === 1) node.setAttribute(\"data-v-owner\", ctx.uid);\n      node = node.nextSibling;\n    }\n    ctx.ut();\n  }\n}\nfunction prepareAnchor(target, vnode, createText, insert) {\n  const targetStart = vnode.targetStart = createText(\"\");\n  const targetAnchor = vnode.targetAnchor = createText(\"\");\n  targetStart[TeleportEndKey] = targetAnchor;\n  if (target) {\n    insert(targetStart, target);\n    insert(targetAnchor, target);\n  }\n  return targetAnchor;\n}\n\nconst leaveCbKey = Symbol(\"_leaveCb\");\nconst enterCbKey = Symbol(\"_enterCb\");\nfunction useTransitionState() {\n  const state = {\n    isMounted: false,\n    isLeaving: false,\n    isUnmounting: false,\n    leavingVNodes: /* @__PURE__ */ new Map()\n  };\n  onMounted(() => {\n    state.isMounted = true;\n  });\n  onBeforeUnmount(() => {\n    state.isUnmounting = true;\n  });\n  return state;\n}\nconst TransitionHookValidator = [Function, Array];\nconst BaseTransitionPropsValidators = {\n  mode: String,\n  appear: Boolean,\n  persisted: Boolean,\n  // enter\n  onBeforeEnter: TransitionHookValidator,\n  onEnter: TransitionHookValidator,\n  onAfterEnter: TransitionHookValidator,\n  onEnterCancelled: TransitionHookValidator,\n  // leave\n  onBeforeLeave: TransitionHookValidator,\n  onLeave: TransitionHookValidator,\n  onAfterLeave: TransitionHookValidator,\n  onLeaveCancelled: TransitionHookValidator,\n  // appear\n  onBeforeAppear: TransitionHookValidator,\n  onAppear: TransitionHookValidator,\n  onAfterAppear: TransitionHookValidator,\n  onAppearCancelled: TransitionHookValidator\n};\nconst recursiveGetSubtree = (instance) => {\n  const subTree = instance.subTree;\n  return subTree.component ? recursiveGetSubtree(subTree.component) : subTree;\n};\nconst BaseTransitionImpl = {\n  name: `BaseTransition`,\n  props: BaseTransitionPropsValidators,\n  setup(props, { slots }) {\n    const instance = getCurrentInstance();\n    const state = useTransitionState();\n    return () => {\n      const children = slots.default && getTransitionRawChildren(slots.default(), true);\n      if (!children || !children.length) {\n        return;\n      }\n      const child = findNonCommentChild(children);\n      const rawProps = toRaw(props);\n      const { mode } = rawProps;\n      if (!!(process.env.NODE_ENV !== \"production\") && mode && mode !== \"in-out\" && mode !== \"out-in\" && mode !== \"default\") {\n        warn$1(`invalid <transition> mode: ${mode}`);\n      }\n      if (state.isLeaving) {\n        return emptyPlaceholder(child);\n      }\n      const innerChild = getInnerChild$1(child);\n      if (!innerChild) {\n        return emptyPlaceholder(child);\n      }\n      let enterHooks = resolveTransitionHooks(\n        innerChild,\n        rawProps,\n        state,\n        instance,\n        // #11061, ensure enterHooks is fresh after clone\n        (hooks) => enterHooks = hooks\n      );\n      if (innerChild.type !== Comment) {\n        setTransitionHooks(innerChild, enterHooks);\n      }\n      const oldChild = instance.subTree;\n      const oldInnerChild = oldChild && getInnerChild$1(oldChild);\n      if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(innerChild, oldInnerChild) && recursiveGetSubtree(instance).type !== Comment) {\n        const leavingHooks = resolveTransitionHooks(\n          oldInnerChild,\n          rawProps,\n          state,\n          instance\n        );\n        setTransitionHooks(oldInnerChild, leavingHooks);\n        if (mode === \"out-in\" && innerChild.type !== Comment) {\n          state.isLeaving = true;\n          leavingHooks.afterLeave = () => {\n            state.isLeaving = false;\n            if (!(instance.job.flags & 8)) {\n              instance.update();\n            }\n            delete leavingHooks.afterLeave;\n          };\n          return emptyPlaceholder(child);\n        } else if (mode === \"in-out\" && innerChild.type !== Comment) {\n          leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {\n            const leavingVNodesCache = getLeavingNodesForType(\n              state,\n              oldInnerChild\n            );\n            leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;\n            el[leaveCbKey] = () => {\n              earlyRemove();\n              el[leaveCbKey] = void 0;\n              delete enterHooks.delayedLeave;\n            };\n            enterHooks.delayedLeave = delayedLeave;\n          };\n        }\n      }\n      return child;\n    };\n  }\n};\nfunction findNonCommentChild(children) {\n  let child = children[0];\n  if (children.length > 1) {\n    let hasFound = false;\n    for (const c of children) {\n      if (c.type !== Comment) {\n        if (!!(process.env.NODE_ENV !== \"production\") && hasFound) {\n          warn$1(\n            \"<transition> can only be used on a single element or component. Use <transition-group> for lists.\"\n          );\n          break;\n        }\n        child = c;\n        hasFound = true;\n        if (!!!(process.env.NODE_ENV !== \"production\")) break;\n      }\n    }\n  }\n  return child;\n}\nconst BaseTransition = BaseTransitionImpl;\nfunction getLeavingNodesForType(state, vnode) {\n  const { leavingVNodes } = state;\n  let leavingVNodesCache = leavingVNodes.get(vnode.type);\n  if (!leavingVNodesCache) {\n    leavingVNodesCache = /* @__PURE__ */ Object.create(null);\n    leavingVNodes.set(vnode.type, leavingVNodesCache);\n  }\n  return leavingVNodesCache;\n}\nfunction resolveTransitionHooks(vnode, props, state, instance, postClone) {\n  const {\n    appear,\n    mode,\n    persisted = false,\n    onBeforeEnter,\n    onEnter,\n    onAfterEnter,\n    onEnterCancelled,\n    onBeforeLeave,\n    onLeave,\n    onAfterLeave,\n    onLeaveCancelled,\n    onBeforeAppear,\n    onAppear,\n    onAfterAppear,\n    onAppearCancelled\n  } = props;\n  const key = String(vnode.key);\n  const leavingVNodesCache = getLeavingNodesForType(state, vnode);\n  const callHook = (hook, args) => {\n    hook && callWithAsyncErrorHandling(\n      hook,\n      instance,\n      9,\n      args\n    );\n  };\n  const callAsyncHook = (hook, args) => {\n    const done = args[1];\n    callHook(hook, args);\n    if (isArray(hook)) {\n      if (hook.every((hook2) => hook2.length <= 1)) done();\n    } else if (hook.length <= 1) {\n      done();\n    }\n  };\n  const hooks = {\n    mode,\n    persisted,\n    beforeEnter(el) {\n      let hook = onBeforeEnter;\n      if (!state.isMounted) {\n        if (appear) {\n          hook = onBeforeAppear || onBeforeEnter;\n        } else {\n          return;\n        }\n      }\n      if (el[leaveCbKey]) {\n        el[leaveCbKey](\n          true\n          /* cancelled */\n        );\n      }\n      const leavingVNode = leavingVNodesCache[key];\n      if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) {\n        leavingVNode.el[leaveCbKey]();\n      }\n      callHook(hook, [el]);\n    },\n    enter(el) {\n      let hook = onEnter;\n      let afterHook = onAfterEnter;\n      let cancelHook = onEnterCancelled;\n      if (!state.isMounted) {\n        if (appear) {\n          hook = onAppear || onEnter;\n          afterHook = onAfterAppear || onAfterEnter;\n          cancelHook = onAppearCancelled || onEnterCancelled;\n        } else {\n          return;\n        }\n      }\n      let called = false;\n      const done = el[enterCbKey] = (cancelled) => {\n        if (called) return;\n        called = true;\n        if (cancelled) {\n          callHook(cancelHook, [el]);\n        } else {\n          callHook(afterHook, [el]);\n        }\n        if (hooks.delayedLeave) {\n          hooks.delayedLeave();\n        }\n        el[enterCbKey] = void 0;\n      };\n      if (hook) {\n        callAsyncHook(hook, [el, done]);\n      } else {\n        done();\n      }\n    },\n    leave(el, remove) {\n      const key2 = String(vnode.key);\n      if (el[enterCbKey]) {\n        el[enterCbKey](\n          true\n          /* cancelled */\n        );\n      }\n      if (state.isUnmounting) {\n        return remove();\n      }\n      callHook(onBeforeLeave, [el]);\n      let called = false;\n      const done = el[leaveCbKey] = (cancelled) => {\n        if (called) return;\n        called = true;\n        remove();\n        if (cancelled) {\n          callHook(onLeaveCancelled, [el]);\n        } else {\n          callHook(onAfterLeave, [el]);\n        }\n        el[leaveCbKey] = void 0;\n        if (leavingVNodesCache[key2] === vnode) {\n          delete leavingVNodesCache[key2];\n        }\n      };\n      leavingVNodesCache[key2] = vnode;\n      if (onLeave) {\n        callAsyncHook(onLeave, [el, done]);\n      } else {\n        done();\n      }\n    },\n    clone(vnode2) {\n      const hooks2 = resolveTransitionHooks(\n        vnode2,\n        props,\n        state,\n        instance,\n        postClone\n      );\n      if (postClone) postClone(hooks2);\n      return hooks2;\n    }\n  };\n  return hooks;\n}\nfunction emptyPlaceholder(vnode) {\n  if (isKeepAlive(vnode)) {\n    vnode = cloneVNode(vnode);\n    vnode.children = null;\n    return vnode;\n  }\n}\nfunction getInnerChild$1(vnode) {\n  if (!isKeepAlive(vnode)) {\n    if (isTeleport(vnode.type) && vnode.children) {\n      return findNonCommentChild(vnode.children);\n    }\n    return vnode;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && vnode.component) {\n    return vnode.component.subTree;\n  }\n  const { shapeFlag, children } = vnode;\n  if (children) {\n    if (shapeFlag & 16) {\n      return children[0];\n    }\n    if (shapeFlag & 32 && isFunction(children.default)) {\n      return children.default();\n    }\n  }\n}\nfunction setTransitionHooks(vnode, hooks) {\n  if (vnode.shapeFlag & 6 && vnode.component) {\n    vnode.transition = hooks;\n    setTransitionHooks(vnode.component.subTree, hooks);\n  } else if (vnode.shapeFlag & 128) {\n    vnode.ssContent.transition = hooks.clone(vnode.ssContent);\n    vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);\n  } else {\n    vnode.transition = hooks;\n  }\n}\nfunction getTransitionRawChildren(children, keepComment = false, parentKey) {\n  let ret = [];\n  let keyedFragmentCount = 0;\n  for (let i = 0; i < children.length; i++) {\n    let child = children[i];\n    const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i);\n    if (child.type === Fragment) {\n      if (child.patchFlag & 128) keyedFragmentCount++;\n      ret = ret.concat(\n        getTransitionRawChildren(child.children, keepComment, key)\n      );\n    } else if (keepComment || child.type !== Comment) {\n      ret.push(key != null ? cloneVNode(child, { key }) : child);\n    }\n  }\n  if (keyedFragmentCount > 1) {\n    for (let i = 0; i < ret.length; i++) {\n      ret[i].patchFlag = -2;\n    }\n  }\n  return ret;\n}\n\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction defineComponent(options, extraOptions) {\n  return isFunction(options) ? (\n    // #8236: extend call and options.name access are considered side-effects\n    // by Rollup, so we have to wrap it in a pure-annotated IIFE.\n    /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()\n  ) : options;\n}\n\nfunction useId() {\n  const i = getCurrentInstance();\n  if (i) {\n    return (i.appContext.config.idPrefix || \"v\") + \"-\" + i.ids[0] + i.ids[1]++;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(\n      `useId() is called when there is no active component instance to be associated with.`\n    );\n  }\n  return \"\";\n}\nfunction markAsyncBoundary(instance) {\n  instance.ids = [instance.ids[0] + instance.ids[2]++ + \"-\", 0, 0];\n}\n\nconst knownTemplateRefs = /* @__PURE__ */ new WeakSet();\nfunction useTemplateRef(key) {\n  const i = getCurrentInstance();\n  const r = shallowRef(null);\n  if (i) {\n    const refs = i.refs === EMPTY_OBJ ? i.refs = {} : i.refs;\n    let desc;\n    if (!!(process.env.NODE_ENV !== \"production\") && (desc = Object.getOwnPropertyDescriptor(refs, key)) && !desc.configurable) {\n      warn$1(`useTemplateRef('${key}') already exists.`);\n    } else {\n      Object.defineProperty(refs, key, {\n        enumerable: true,\n        get: () => r.value,\n        set: (val) => r.value = val\n      });\n    }\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(\n      `useTemplateRef() is called when there is no active component instance to be associated with.`\n    );\n  }\n  const ret = !!(process.env.NODE_ENV !== \"production\") ? readonly(r) : r;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    knownTemplateRefs.add(ret);\n  }\n  return ret;\n}\n\nfunction setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {\n  if (isArray(rawRef)) {\n    rawRef.forEach(\n      (r, i) => setRef(\n        r,\n        oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef),\n        parentSuspense,\n        vnode,\n        isUnmount\n      )\n    );\n    return;\n  }\n  if (isAsyncWrapper(vnode) && !isUnmount) {\n    return;\n  }\n  const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el;\n  const value = isUnmount ? null : refValue;\n  const { i: owner, r: ref } = rawRef;\n  if (!!(process.env.NODE_ENV !== \"production\") && !owner) {\n    warn$1(\n      `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.`\n    );\n    return;\n  }\n  const oldRef = oldRawRef && oldRawRef.r;\n  const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs;\n  const setupState = owner.setupState;\n  const rawSetupState = toRaw(setupState);\n  const canSetSetupRef = setupState === EMPTY_OBJ ? () => false : (key) => {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      if (hasOwn(rawSetupState, key) && !isRef(rawSetupState[key])) {\n        warn$1(\n          `Template ref \"${key}\" used on a non-ref value. It will not work in the production build.`\n        );\n      }\n      if (knownTemplateRefs.has(rawSetupState[key])) {\n        return false;\n      }\n    }\n    return hasOwn(rawSetupState, key);\n  };\n  if (oldRef != null && oldRef !== ref) {\n    if (isString(oldRef)) {\n      refs[oldRef] = null;\n      if (canSetSetupRef(oldRef)) {\n        setupState[oldRef] = null;\n      }\n    } else if (isRef(oldRef)) {\n      oldRef.value = null;\n    }\n  }\n  if (isFunction(ref)) {\n    callWithErrorHandling(ref, owner, 12, [value, refs]);\n  } else {\n    const _isString = isString(ref);\n    const _isRef = isRef(ref);\n    if (_isString || _isRef) {\n      const doSet = () => {\n        if (rawRef.f) {\n          const existing = _isString ? canSetSetupRef(ref) ? setupState[ref] : refs[ref] : ref.value;\n          if (isUnmount) {\n            isArray(existing) && remove(existing, refValue);\n          } else {\n            if (!isArray(existing)) {\n              if (_isString) {\n                refs[ref] = [refValue];\n                if (canSetSetupRef(ref)) {\n                  setupState[ref] = refs[ref];\n                }\n              } else {\n                ref.value = [refValue];\n                if (rawRef.k) refs[rawRef.k] = ref.value;\n              }\n            } else if (!existing.includes(refValue)) {\n              existing.push(refValue);\n            }\n          }\n        } else if (_isString) {\n          refs[ref] = value;\n          if (canSetSetupRef(ref)) {\n            setupState[ref] = value;\n          }\n        } else if (_isRef) {\n          ref.value = value;\n          if (rawRef.k) refs[rawRef.k] = value;\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n        }\n      };\n      if (value) {\n        doSet.id = -1;\n        queuePostRenderEffect(doSet, parentSuspense);\n      } else {\n        doSet();\n      }\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n    }\n  }\n}\n\nlet hasLoggedMismatchError = false;\nconst logMismatchError = () => {\n  if (hasLoggedMismatchError) {\n    return;\n  }\n  console.error(\"Hydration completed but contains mismatches.\");\n  hasLoggedMismatchError = true;\n};\nconst isSVGContainer = (container) => container.namespaceURI.includes(\"svg\") && container.tagName !== \"foreignObject\";\nconst isMathMLContainer = (container) => container.namespaceURI.includes(\"MathML\");\nconst getContainerType = (container) => {\n  if (container.nodeType !== 1) return void 0;\n  if (isSVGContainer(container)) return \"svg\";\n  if (isMathMLContainer(container)) return \"mathml\";\n  return void 0;\n};\nconst isComment = (node) => node.nodeType === 8;\nfunction createHydrationFunctions(rendererInternals) {\n  const {\n    mt: mountComponent,\n    p: patch,\n    o: {\n      patchProp,\n      createText,\n      nextSibling,\n      parentNode,\n      remove,\n      insert,\n      createComment\n    }\n  } = rendererInternals;\n  const hydrate = (vnode, container) => {\n    if (!container.hasChildNodes()) {\n      (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n        `Attempting to hydrate existing markup but container is empty. Performing full mount instead.`\n      );\n      patch(null, vnode, container);\n      flushPostFlushCbs();\n      container._vnode = vnode;\n      return;\n    }\n    hydrateNode(container.firstChild, vnode, null, null, null);\n    flushPostFlushCbs();\n    container._vnode = vnode;\n  };\n  const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {\n    optimized = optimized || !!vnode.dynamicChildren;\n    const isFragmentStart = isComment(node) && node.data === \"[\";\n    const onMismatch = () => handleMismatch(\n      node,\n      vnode,\n      parentComponent,\n      parentSuspense,\n      slotScopeIds,\n      isFragmentStart\n    );\n    const { type, ref, shapeFlag, patchFlag } = vnode;\n    let domType = node.nodeType;\n    vnode.el = node;\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      def(node, \"__vnode\", vnode, true);\n      def(node, \"__vueParentComponent\", parentComponent, true);\n    }\n    if (patchFlag === -2) {\n      optimized = false;\n      vnode.dynamicChildren = null;\n    }\n    let nextNode = null;\n    switch (type) {\n      case Text:\n        if (domType !== 3) {\n          if (vnode.children === \"\") {\n            insert(vnode.el = createText(\"\"), parentNode(node), node);\n            nextNode = node;\n          } else {\n            nextNode = onMismatch();\n          }\n        } else {\n          if (node.data !== vnode.children) {\n            (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n              `Hydration text mismatch in`,\n              node.parentNode,\n              `\n  - rendered on server: ${JSON.stringify(\n                node.data\n              )}\n  - expected on client: ${JSON.stringify(vnode.children)}`\n            );\n            logMismatchError();\n            node.data = vnode.children;\n          }\n          nextNode = nextSibling(node);\n        }\n        break;\n      case Comment:\n        if (isTemplateNode(node)) {\n          nextNode = nextSibling(node);\n          replaceNode(\n            vnode.el = node.content.firstChild,\n            node,\n            parentComponent\n          );\n        } else if (domType !== 8 || isFragmentStart) {\n          nextNode = onMismatch();\n        } else {\n          nextNode = nextSibling(node);\n        }\n        break;\n      case Static:\n        if (isFragmentStart) {\n          node = nextSibling(node);\n          domType = node.nodeType;\n        }\n        if (domType === 1 || domType === 3) {\n          nextNode = node;\n          const needToAdoptContent = !vnode.children.length;\n          for (let i = 0; i < vnode.staticCount; i++) {\n            if (needToAdoptContent)\n              vnode.children += nextNode.nodeType === 1 ? nextNode.outerHTML : nextNode.data;\n            if (i === vnode.staticCount - 1) {\n              vnode.anchor = nextNode;\n            }\n            nextNode = nextSibling(nextNode);\n          }\n          return isFragmentStart ? nextSibling(nextNode) : nextNode;\n        } else {\n          onMismatch();\n        }\n        break;\n      case Fragment:\n        if (!isFragmentStart) {\n          nextNode = onMismatch();\n        } else {\n          nextNode = hydrateFragment(\n            node,\n            vnode,\n            parentComponent,\n            parentSuspense,\n            slotScopeIds,\n            optimized\n          );\n        }\n        break;\n      default:\n        if (shapeFlag & 1) {\n          if ((domType !== 1 || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode(node)) {\n            nextNode = onMismatch();\n          } else {\n            nextNode = hydrateElement(\n              node,\n              vnode,\n              parentComponent,\n              parentSuspense,\n              slotScopeIds,\n              optimized\n            );\n          }\n        } else if (shapeFlag & 6) {\n          vnode.slotScopeIds = slotScopeIds;\n          const container = parentNode(node);\n          if (isFragmentStart) {\n            nextNode = locateClosingAnchor(node);\n          } else if (isComment(node) && node.data === \"teleport start\") {\n            nextNode = locateClosingAnchor(node, node.data, \"teleport end\");\n          } else {\n            nextNode = nextSibling(node);\n          }\n          mountComponent(\n            vnode,\n            container,\n            null,\n            parentComponent,\n            parentSuspense,\n            getContainerType(container),\n            optimized\n          );\n          if (isAsyncWrapper(vnode)) {\n            let subTree;\n            if (isFragmentStart) {\n              subTree = createVNode(Fragment);\n              subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild;\n            } else {\n              subTree = node.nodeType === 3 ? createTextVNode(\"\") : createVNode(\"div\");\n            }\n            subTree.el = node;\n            vnode.component.subTree = subTree;\n          }\n        } else if (shapeFlag & 64) {\n          if (domType !== 8) {\n            nextNode = onMismatch();\n          } else {\n            nextNode = vnode.type.hydrate(\n              node,\n              vnode,\n              parentComponent,\n              parentSuspense,\n              slotScopeIds,\n              optimized,\n              rendererInternals,\n              hydrateChildren\n            );\n          }\n        } else if (shapeFlag & 128) {\n          nextNode = vnode.type.hydrate(\n            node,\n            vnode,\n            parentComponent,\n            parentSuspense,\n            getContainerType(parentNode(node)),\n            slotScopeIds,\n            optimized,\n            rendererInternals,\n            hydrateNode\n          );\n        } else if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) {\n          warn$1(\"Invalid HostVNode type:\", type, `(${typeof type})`);\n        }\n    }\n    if (ref != null) {\n      setRef(ref, null, parentSuspense, vnode);\n    }\n    return nextNode;\n  };\n  const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n    optimized = optimized || !!vnode.dynamicChildren;\n    const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode;\n    const forcePatch = type === \"input\" || type === \"option\";\n    if (!!(process.env.NODE_ENV !== \"production\") || forcePatch || patchFlag !== -1) {\n      if (dirs) {\n        invokeDirectiveHook(vnode, null, parentComponent, \"created\");\n      }\n      let needCallTransitionHooks = false;\n      if (isTemplateNode(el)) {\n        needCallTransitionHooks = needTransition(\n          null,\n          // no need check parentSuspense in hydration\n          transition\n        ) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear;\n        const content = el.content.firstChild;\n        if (needCallTransitionHooks) {\n          transition.beforeEnter(content);\n        }\n        replaceNode(content, el, parentComponent);\n        vnode.el = el = content;\n      }\n      if (shapeFlag & 16 && // skip if element has innerHTML / textContent\n      !(props && (props.innerHTML || props.textContent))) {\n        let next = hydrateChildren(\n          el.firstChild,\n          vnode,\n          el,\n          parentComponent,\n          parentSuspense,\n          slotScopeIds,\n          optimized\n        );\n        let hasWarned = false;\n        while (next) {\n          if (!isMismatchAllowed(el, 1 /* CHILDREN */)) {\n            if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n              warn$1(\n                `Hydration children mismatch on`,\n                el,\n                `\nServer rendered element contains more child nodes than client vdom.`\n              );\n              hasWarned = true;\n            }\n            logMismatchError();\n          }\n          const cur = next;\n          next = next.nextSibling;\n          remove(cur);\n        }\n      } else if (shapeFlag & 8) {\n        let clientText = vnode.children;\n        if (clientText[0] === \"\\n\" && (el.tagName === \"PRE\" || el.tagName === \"TEXTAREA\")) {\n          clientText = clientText.slice(1);\n        }\n        if (el.textContent !== clientText) {\n          if (!isMismatchAllowed(el, 0 /* TEXT */)) {\n            (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n              `Hydration text content mismatch on`,\n              el,\n              `\n  - rendered on server: ${el.textContent}\n  - expected on client: ${vnode.children}`\n            );\n            logMismatchError();\n          }\n          el.textContent = vnode.children;\n        }\n      }\n      if (props) {\n        if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ || forcePatch || !optimized || patchFlag & (16 | 32)) {\n          const isCustomElement = el.tagName.includes(\"-\");\n          for (const key in props) {\n            if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && // #11189 skip if this node has directives that have created hooks\n            // as it could have mutated the DOM in any possible way\n            !(dirs && dirs.some((d) => d.dir.created)) && propHasMismatch(el, key, props[key], vnode, parentComponent)) {\n              logMismatchError();\n            }\n            if (forcePatch && (key.endsWith(\"value\") || key === \"indeterminate\") || isOn(key) && !isReservedProp(key) || // force hydrate v-bind with .prop modifiers\n            key[0] === \".\" || isCustomElement) {\n              patchProp(el, key, null, props[key], void 0, parentComponent);\n            }\n          }\n        } else if (props.onClick) {\n          patchProp(\n            el,\n            \"onClick\",\n            null,\n            props.onClick,\n            void 0,\n            parentComponent\n          );\n        } else if (patchFlag & 4 && isReactive(props.style)) {\n          for (const key in props.style) props.style[key];\n        }\n      }\n      let vnodeHooks;\n      if (vnodeHooks = props && props.onVnodeBeforeMount) {\n        invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n      }\n      if (dirs) {\n        invokeDirectiveHook(vnode, null, parentComponent, \"beforeMount\");\n      }\n      if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) {\n        queueEffectWithSuspense(() => {\n          vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n          needCallTransitionHooks && transition.enter(el);\n          dirs && invokeDirectiveHook(vnode, null, parentComponent, \"mounted\");\n        }, parentSuspense);\n      }\n    }\n    return el.nextSibling;\n  };\n  const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n    optimized = optimized || !!parentVNode.dynamicChildren;\n    const children = parentVNode.children;\n    const l = children.length;\n    let hasWarned = false;\n    for (let i = 0; i < l; i++) {\n      const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]);\n      const isText = vnode.type === Text;\n      if (node) {\n        if (isText && !optimized) {\n          if (i + 1 < l && normalizeVNode(children[i + 1]).type === Text) {\n            insert(\n              createText(\n                node.data.slice(vnode.children.length)\n              ),\n              container,\n              nextSibling(node)\n            );\n            node.data = vnode.children;\n          }\n        }\n        node = hydrateNode(\n          node,\n          vnode,\n          parentComponent,\n          parentSuspense,\n          slotScopeIds,\n          optimized\n        );\n      } else if (isText && !vnode.children) {\n        insert(vnode.el = createText(\"\"), container);\n      } else {\n        if (!isMismatchAllowed(container, 1 /* CHILDREN */)) {\n          if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n            warn$1(\n              `Hydration children mismatch on`,\n              container,\n              `\nServer rendered element contains fewer child nodes than client vdom.`\n            );\n            hasWarned = true;\n          }\n          logMismatchError();\n        }\n        patch(\n          null,\n          vnode,\n          container,\n          null,\n          parentComponent,\n          parentSuspense,\n          getContainerType(container),\n          slotScopeIds\n        );\n      }\n    }\n    return node;\n  };\n  const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n    const { slotScopeIds: fragmentSlotScopeIds } = vnode;\n    if (fragmentSlotScopeIds) {\n      slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;\n    }\n    const container = parentNode(node);\n    const next = hydrateChildren(\n      nextSibling(node),\n      vnode,\n      container,\n      parentComponent,\n      parentSuspense,\n      slotScopeIds,\n      optimized\n    );\n    if (next && isComment(next) && next.data === \"]\") {\n      return nextSibling(vnode.anchor = next);\n    } else {\n      logMismatchError();\n      insert(vnode.anchor = createComment(`]`), container, next);\n      return next;\n    }\n  };\n  const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => {\n    if (!isMismatchAllowed(node.parentElement, 1 /* CHILDREN */)) {\n      (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n        `Hydration node mismatch:\n- rendered on server:`,\n        node,\n        node.nodeType === 3 ? `(text)` : isComment(node) && node.data === \"[\" ? `(start of fragment)` : ``,\n        `\n- expected on client:`,\n        vnode.type\n      );\n      logMismatchError();\n    }\n    vnode.el = null;\n    if (isFragment) {\n      const end = locateClosingAnchor(node);\n      while (true) {\n        const next2 = nextSibling(node);\n        if (next2 && next2 !== end) {\n          remove(next2);\n        } else {\n          break;\n        }\n      }\n    }\n    const next = nextSibling(node);\n    const container = parentNode(node);\n    remove(node);\n    patch(\n      null,\n      vnode,\n      container,\n      next,\n      parentComponent,\n      parentSuspense,\n      getContainerType(container),\n      slotScopeIds\n    );\n    return next;\n  };\n  const locateClosingAnchor = (node, open = \"[\", close = \"]\") => {\n    let match = 0;\n    while (node) {\n      node = nextSibling(node);\n      if (node && isComment(node)) {\n        if (node.data === open) match++;\n        if (node.data === close) {\n          if (match === 0) {\n            return nextSibling(node);\n          } else {\n            match--;\n          }\n        }\n      }\n    }\n    return node;\n  };\n  const replaceNode = (newNode, oldNode, parentComponent) => {\n    const parentNode2 = oldNode.parentNode;\n    if (parentNode2) {\n      parentNode2.replaceChild(newNode, oldNode);\n    }\n    let parent = parentComponent;\n    while (parent) {\n      if (parent.vnode.el === oldNode) {\n        parent.vnode.el = parent.subTree.el = newNode;\n      }\n      parent = parent.parent;\n    }\n  };\n  const isTemplateNode = (node) => {\n    return node.nodeType === 1 && node.tagName === \"TEMPLATE\";\n  };\n  return [hydrate, hydrateNode];\n}\nfunction propHasMismatch(el, key, clientValue, vnode, instance) {\n  let mismatchType;\n  let mismatchKey;\n  let actual;\n  let expected;\n  if (key === \"class\") {\n    actual = el.getAttribute(\"class\");\n    expected = normalizeClass(clientValue);\n    if (!isSetEqual(toClassSet(actual || \"\"), toClassSet(expected))) {\n      mismatchType = 2 /* CLASS */;\n      mismatchKey = `class`;\n    }\n  } else if (key === \"style\") {\n    actual = el.getAttribute(\"style\") || \"\";\n    expected = isString(clientValue) ? clientValue : stringifyStyle(normalizeStyle(clientValue));\n    const actualMap = toStyleMap(actual);\n    const expectedMap = toStyleMap(expected);\n    if (vnode.dirs) {\n      for (const { dir, value } of vnode.dirs) {\n        if (dir.name === \"show\" && !value) {\n          expectedMap.set(\"display\", \"none\");\n        }\n      }\n    }\n    if (instance) {\n      resolveCssVars(instance, vnode, expectedMap);\n    }\n    if (!isMapEqual(actualMap, expectedMap)) {\n      mismatchType = 3 /* STYLE */;\n      mismatchKey = \"style\";\n    }\n  } else if (el instanceof SVGElement && isKnownSvgAttr(key) || el instanceof HTMLElement && (isBooleanAttr(key) || isKnownHtmlAttr(key))) {\n    if (isBooleanAttr(key)) {\n      actual = el.hasAttribute(key);\n      expected = includeBooleanAttr(clientValue);\n    } else if (clientValue == null) {\n      actual = el.hasAttribute(key);\n      expected = false;\n    } else {\n      if (el.hasAttribute(key)) {\n        actual = el.getAttribute(key);\n      } else if (key === \"value\" && el.tagName === \"TEXTAREA\") {\n        actual = el.value;\n      } else {\n        actual = false;\n      }\n      expected = isRenderableAttrValue(clientValue) ? String(clientValue) : false;\n    }\n    if (actual !== expected) {\n      mismatchType = 4 /* ATTRIBUTE */;\n      mismatchKey = key;\n    }\n  }\n  if (mismatchType != null && !isMismatchAllowed(el, mismatchType)) {\n    const format = (v) => v === false ? `(not rendered)` : `${mismatchKey}=\"${v}\"`;\n    const preSegment = `Hydration ${MismatchTypeString[mismatchType]} mismatch on`;\n    const postSegment = `\n  - rendered on server: ${format(actual)}\n  - expected on client: ${format(expected)}\n  Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead.\n  You should fix the source of the mismatch.`;\n    {\n      warn$1(preSegment, el, postSegment);\n    }\n    return true;\n  }\n  return false;\n}\nfunction toClassSet(str) {\n  return new Set(str.trim().split(/\\s+/));\n}\nfunction isSetEqual(a, b) {\n  if (a.size !== b.size) {\n    return false;\n  }\n  for (const s of a) {\n    if (!b.has(s)) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction toStyleMap(str) {\n  const styleMap = /* @__PURE__ */ new Map();\n  for (const item of str.split(\";\")) {\n    let [key, value] = item.split(\":\");\n    key = key.trim();\n    value = value && value.trim();\n    if (key && value) {\n      styleMap.set(key, value);\n    }\n  }\n  return styleMap;\n}\nfunction isMapEqual(a, b) {\n  if (a.size !== b.size) {\n    return false;\n  }\n  for (const [key, value] of a) {\n    if (value !== b.get(key)) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction resolveCssVars(instance, vnode, expectedMap) {\n  const root = instance.subTree;\n  if (instance.getCssVars && (vnode === root || root && root.type === Fragment && root.children.includes(vnode))) {\n    const cssVars = instance.getCssVars();\n    for (const key in cssVars) {\n      expectedMap.set(\n        `--${getEscapedCssVarName(key, false)}`,\n        String(cssVars[key])\n      );\n    }\n  }\n  if (vnode === root && instance.parent) {\n    resolveCssVars(instance.parent, instance.vnode, expectedMap);\n  }\n}\nconst allowMismatchAttr = \"data-allow-mismatch\";\nconst MismatchTypeString = {\n  [0 /* TEXT */]: \"text\",\n  [1 /* CHILDREN */]: \"children\",\n  [2 /* CLASS */]: \"class\",\n  [3 /* STYLE */]: \"style\",\n  [4 /* ATTRIBUTE */]: \"attribute\"\n};\nfunction isMismatchAllowed(el, allowedType) {\n  if (allowedType === 0 /* TEXT */ || allowedType === 1 /* CHILDREN */) {\n    while (el && !el.hasAttribute(allowMismatchAttr)) {\n      el = el.parentElement;\n    }\n  }\n  const allowedAttr = el && el.getAttribute(allowMismatchAttr);\n  if (allowedAttr == null) {\n    return false;\n  } else if (allowedAttr === \"\") {\n    return true;\n  } else {\n    const list = allowedAttr.split(\",\");\n    if (allowedType === 0 /* TEXT */ && list.includes(\"children\")) {\n      return true;\n    }\n    return allowedAttr.split(\",\").includes(MismatchTypeString[allowedType]);\n  }\n}\n\nconst requestIdleCallback = getGlobalThis().requestIdleCallback || ((cb) => setTimeout(cb, 1));\nconst cancelIdleCallback = getGlobalThis().cancelIdleCallback || ((id) => clearTimeout(id));\nconst hydrateOnIdle = (timeout = 1e4) => (hydrate) => {\n  const id = requestIdleCallback(hydrate, { timeout });\n  return () => cancelIdleCallback(id);\n};\nfunction elementIsVisibleInViewport(el) {\n  const { top, left, bottom, right } = el.getBoundingClientRect();\n  const { innerHeight, innerWidth } = window;\n  return (top > 0 && top < innerHeight || bottom > 0 && bottom < innerHeight) && (left > 0 && left < innerWidth || right > 0 && right < innerWidth);\n}\nconst hydrateOnVisible = (opts) => (hydrate, forEach) => {\n  const ob = new IntersectionObserver((entries) => {\n    for (const e of entries) {\n      if (!e.isIntersecting) continue;\n      ob.disconnect();\n      hydrate();\n      break;\n    }\n  }, opts);\n  forEach((el) => {\n    if (!(el instanceof Element)) return;\n    if (elementIsVisibleInViewport(el)) {\n      hydrate();\n      ob.disconnect();\n      return false;\n    }\n    ob.observe(el);\n  });\n  return () => ob.disconnect();\n};\nconst hydrateOnMediaQuery = (query) => (hydrate) => {\n  if (query) {\n    const mql = matchMedia(query);\n    if (mql.matches) {\n      hydrate();\n    } else {\n      mql.addEventListener(\"change\", hydrate, { once: true });\n      return () => mql.removeEventListener(\"change\", hydrate);\n    }\n  }\n};\nconst hydrateOnInteraction = (interactions = []) => (hydrate, forEach) => {\n  if (isString(interactions)) interactions = [interactions];\n  let hasHydrated = false;\n  const doHydrate = (e) => {\n    if (!hasHydrated) {\n      hasHydrated = true;\n      teardown();\n      hydrate();\n      e.target.dispatchEvent(new e.constructor(e.type, e));\n    }\n  };\n  const teardown = () => {\n    forEach((el) => {\n      for (const i of interactions) {\n        el.removeEventListener(i, doHydrate);\n      }\n    });\n  };\n  forEach((el) => {\n    for (const i of interactions) {\n      el.addEventListener(i, doHydrate, { once: true });\n    }\n  });\n  return teardown;\n};\nfunction forEachElement(node, cb) {\n  if (isComment(node) && node.data === \"[\") {\n    let depth = 1;\n    let next = node.nextSibling;\n    while (next) {\n      if (next.nodeType === 1) {\n        const result = cb(next);\n        if (result === false) {\n          break;\n        }\n      } else if (isComment(next)) {\n        if (next.data === \"]\") {\n          if (--depth === 0) break;\n        } else if (next.data === \"[\") {\n          depth++;\n        }\n      }\n      next = next.nextSibling;\n    }\n  } else {\n    cb(node);\n  }\n}\n\nconst isAsyncWrapper = (i) => !!i.type.__asyncLoader;\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction defineAsyncComponent(source) {\n  if (isFunction(source)) {\n    source = { loader: source };\n  }\n  const {\n    loader,\n    loadingComponent,\n    errorComponent,\n    delay = 200,\n    hydrate: hydrateStrategy,\n    timeout,\n    // undefined = never times out\n    suspensible = true,\n    onError: userOnError\n  } = source;\n  let pendingRequest = null;\n  let resolvedComp;\n  let retries = 0;\n  const retry = () => {\n    retries++;\n    pendingRequest = null;\n    return load();\n  };\n  const load = () => {\n    let thisRequest;\n    return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => {\n      err = err instanceof Error ? err : new Error(String(err));\n      if (userOnError) {\n        return new Promise((resolve, reject) => {\n          const userRetry = () => resolve(retry());\n          const userFail = () => reject(err);\n          userOnError(err, userRetry, userFail, retries + 1);\n        });\n      } else {\n        throw err;\n      }\n    }).then((comp) => {\n      if (thisRequest !== pendingRequest && pendingRequest) {\n        return pendingRequest;\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && !comp) {\n        warn$1(\n          `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`\n        );\n      }\n      if (comp && (comp.__esModule || comp[Symbol.toStringTag] === \"Module\")) {\n        comp = comp.default;\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && comp && !isObject(comp) && !isFunction(comp)) {\n        throw new Error(`Invalid async component load result: ${comp}`);\n      }\n      resolvedComp = comp;\n      return comp;\n    }));\n  };\n  return defineComponent({\n    name: \"AsyncComponentWrapper\",\n    __asyncLoader: load,\n    __asyncHydrate(el, instance, hydrate) {\n      const doHydrate = hydrateStrategy ? () => {\n        const teardown = hydrateStrategy(\n          hydrate,\n          (cb) => forEachElement(el, cb)\n        );\n        if (teardown) {\n          (instance.bum || (instance.bum = [])).push(teardown);\n        }\n      } : hydrate;\n      if (resolvedComp) {\n        doHydrate();\n      } else {\n        load().then(() => !instance.isUnmounted && doHydrate());\n      }\n    },\n    get __asyncResolved() {\n      return resolvedComp;\n    },\n    setup() {\n      const instance = currentInstance;\n      markAsyncBoundary(instance);\n      if (resolvedComp) {\n        return () => createInnerComp(resolvedComp, instance);\n      }\n      const onError = (err) => {\n        pendingRequest = null;\n        handleError(\n          err,\n          instance,\n          13,\n          !errorComponent\n        );\n      };\n      if (suspensible && instance.suspense || isInSSRComponentSetup) {\n        return load().then((comp) => {\n          return () => createInnerComp(comp, instance);\n        }).catch((err) => {\n          onError(err);\n          return () => errorComponent ? createVNode(errorComponent, {\n            error: err\n          }) : null;\n        });\n      }\n      const loaded = ref(false);\n      const error = ref();\n      const delayed = ref(!!delay);\n      if (delay) {\n        setTimeout(() => {\n          delayed.value = false;\n        }, delay);\n      }\n      if (timeout != null) {\n        setTimeout(() => {\n          if (!loaded.value && !error.value) {\n            const err = new Error(\n              `Async component timed out after ${timeout}ms.`\n            );\n            onError(err);\n            error.value = err;\n          }\n        }, timeout);\n      }\n      load().then(() => {\n        loaded.value = true;\n        if (instance.parent && isKeepAlive(instance.parent.vnode)) {\n          instance.parent.update();\n        }\n      }).catch((err) => {\n        onError(err);\n        error.value = err;\n      });\n      return () => {\n        if (loaded.value && resolvedComp) {\n          return createInnerComp(resolvedComp, instance);\n        } else if (error.value && errorComponent) {\n          return createVNode(errorComponent, {\n            error: error.value\n          });\n        } else if (loadingComponent && !delayed.value) {\n          return createVNode(loadingComponent);\n        }\n      };\n    }\n  });\n}\nfunction createInnerComp(comp, parent) {\n  const { ref: ref2, props, children, ce } = parent.vnode;\n  const vnode = createVNode(comp, props, children);\n  vnode.ref = ref2;\n  vnode.ce = ce;\n  delete parent.vnode.ce;\n  return vnode;\n}\n\nconst isKeepAlive = (vnode) => vnode.type.__isKeepAlive;\nconst KeepAliveImpl = {\n  name: `KeepAlive`,\n  // Marker for special handling inside the renderer. We are not using a ===\n  // check directly on KeepAlive in the renderer, because importing it directly\n  // would prevent it from being tree-shaken.\n  __isKeepAlive: true,\n  props: {\n    include: [String, RegExp, Array],\n    exclude: [String, RegExp, Array],\n    max: [String, Number]\n  },\n  setup(props, { slots }) {\n    const instance = getCurrentInstance();\n    const sharedContext = instance.ctx;\n    if (!sharedContext.renderer) {\n      return () => {\n        const children = slots.default && slots.default();\n        return children && children.length === 1 ? children[0] : children;\n      };\n    }\n    const cache = /* @__PURE__ */ new Map();\n    const keys = /* @__PURE__ */ new Set();\n    let current = null;\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      instance.__v_cache = cache;\n    }\n    const parentSuspense = instance.suspense;\n    const {\n      renderer: {\n        p: patch,\n        m: move,\n        um: _unmount,\n        o: { createElement }\n      }\n    } = sharedContext;\n    const storageContainer = createElement(\"div\");\n    sharedContext.activate = (vnode, container, anchor, namespace, optimized) => {\n      const instance2 = vnode.component;\n      move(vnode, container, anchor, 0, parentSuspense);\n      patch(\n        instance2.vnode,\n        vnode,\n        container,\n        anchor,\n        instance2,\n        parentSuspense,\n        namespace,\n        vnode.slotScopeIds,\n        optimized\n      );\n      queuePostRenderEffect(() => {\n        instance2.isDeactivated = false;\n        if (instance2.a) {\n          invokeArrayFns(instance2.a);\n        }\n        const vnodeHook = vnode.props && vnode.props.onVnodeMounted;\n        if (vnodeHook) {\n          invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n        }\n      }, parentSuspense);\n      if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n        devtoolsComponentAdded(instance2);\n      }\n    };\n    sharedContext.deactivate = (vnode) => {\n      const instance2 = vnode.component;\n      invalidateMount(instance2.m);\n      invalidateMount(instance2.a);\n      move(vnode, storageContainer, null, 1, parentSuspense);\n      queuePostRenderEffect(() => {\n        if (instance2.da) {\n          invokeArrayFns(instance2.da);\n        }\n        const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;\n        if (vnodeHook) {\n          invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n        }\n        instance2.isDeactivated = true;\n      }, parentSuspense);\n      if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n        devtoolsComponentAdded(instance2);\n      }\n    };\n    function unmount(vnode) {\n      resetShapeFlag(vnode);\n      _unmount(vnode, instance, parentSuspense, true);\n    }\n    function pruneCache(filter) {\n      cache.forEach((vnode, key) => {\n        const name = getComponentName(vnode.type);\n        if (name && !filter(name)) {\n          pruneCacheEntry(key);\n        }\n      });\n    }\n    function pruneCacheEntry(key) {\n      const cached = cache.get(key);\n      if (cached && (!current || !isSameVNodeType(cached, current))) {\n        unmount(cached);\n      } else if (current) {\n        resetShapeFlag(current);\n      }\n      cache.delete(key);\n      keys.delete(key);\n    }\n    watch(\n      () => [props.include, props.exclude],\n      ([include, exclude]) => {\n        include && pruneCache((name) => matches(include, name));\n        exclude && pruneCache((name) => !matches(exclude, name));\n      },\n      // prune post-render after `current` has been updated\n      { flush: \"post\", deep: true }\n    );\n    let pendingCacheKey = null;\n    const cacheSubtree = () => {\n      if (pendingCacheKey != null) {\n        if (isSuspense(instance.subTree.type)) {\n          queuePostRenderEffect(() => {\n            cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n          }, instance.subTree.suspense);\n        } else {\n          cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n        }\n      }\n    };\n    onMounted(cacheSubtree);\n    onUpdated(cacheSubtree);\n    onBeforeUnmount(() => {\n      cache.forEach((cached) => {\n        const { subTree, suspense } = instance;\n        const vnode = getInnerChild(subTree);\n        if (cached.type === vnode.type && cached.key === vnode.key) {\n          resetShapeFlag(vnode);\n          const da = vnode.component.da;\n          da && queuePostRenderEffect(da, suspense);\n          return;\n        }\n        unmount(cached);\n      });\n    });\n    return () => {\n      pendingCacheKey = null;\n      if (!slots.default) {\n        return current = null;\n      }\n      const children = slots.default();\n      const rawVNode = children[0];\n      if (children.length > 1) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(`KeepAlive should contain exactly one component child.`);\n        }\n        current = null;\n        return children;\n      } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) {\n        current = null;\n        return rawVNode;\n      }\n      let vnode = getInnerChild(rawVNode);\n      if (vnode.type === Comment) {\n        current = null;\n        return vnode;\n      }\n      const comp = vnode.type;\n      const name = getComponentName(\n        isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp\n      );\n      const { include, exclude, max } = props;\n      if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) {\n        vnode.shapeFlag &= ~256;\n        current = vnode;\n        return rawVNode;\n      }\n      const key = vnode.key == null ? comp : vnode.key;\n      const cachedVNode = cache.get(key);\n      if (vnode.el) {\n        vnode = cloneVNode(vnode);\n        if (rawVNode.shapeFlag & 128) {\n          rawVNode.ssContent = vnode;\n        }\n      }\n      pendingCacheKey = key;\n      if (cachedVNode) {\n        vnode.el = cachedVNode.el;\n        vnode.component = cachedVNode.component;\n        if (vnode.transition) {\n          setTransitionHooks(vnode, vnode.transition);\n        }\n        vnode.shapeFlag |= 512;\n        keys.delete(key);\n        keys.add(key);\n      } else {\n        keys.add(key);\n        if (max && keys.size > parseInt(max, 10)) {\n          pruneCacheEntry(keys.values().next().value);\n        }\n      }\n      vnode.shapeFlag |= 256;\n      current = vnode;\n      return isSuspense(rawVNode.type) ? rawVNode : vnode;\n    };\n  }\n};\nconst KeepAlive = KeepAliveImpl;\nfunction matches(pattern, name) {\n  if (isArray(pattern)) {\n    return pattern.some((p) => matches(p, name));\n  } else if (isString(pattern)) {\n    return pattern.split(\",\").includes(name);\n  } else if (isRegExp(pattern)) {\n    pattern.lastIndex = 0;\n    return pattern.test(name);\n  }\n  return false;\n}\nfunction onActivated(hook, target) {\n  registerKeepAliveHook(hook, \"a\", target);\n}\nfunction onDeactivated(hook, target) {\n  registerKeepAliveHook(hook, \"da\", target);\n}\nfunction registerKeepAliveHook(hook, type, target = currentInstance) {\n  const wrappedHook = hook.__wdc || (hook.__wdc = () => {\n    let current = target;\n    while (current) {\n      if (current.isDeactivated) {\n        return;\n      }\n      current = current.parent;\n    }\n    return hook();\n  });\n  injectHook(type, wrappedHook, target);\n  if (target) {\n    let current = target.parent;\n    while (current && current.parent) {\n      if (isKeepAlive(current.parent.vnode)) {\n        injectToKeepAliveRoot(wrappedHook, type, target, current);\n      }\n      current = current.parent;\n    }\n  }\n}\nfunction injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {\n  const injected = injectHook(\n    type,\n    hook,\n    keepAliveRoot,\n    true\n    /* prepend */\n  );\n  onUnmounted(() => {\n    remove(keepAliveRoot[type], injected);\n  }, target);\n}\nfunction resetShapeFlag(vnode) {\n  vnode.shapeFlag &= ~256;\n  vnode.shapeFlag &= ~512;\n}\nfunction getInnerChild(vnode) {\n  return vnode.shapeFlag & 128 ? vnode.ssContent : vnode;\n}\n\nfunction injectHook(type, hook, target = currentInstance, prepend = false) {\n  if (target) {\n    const hooks = target[type] || (target[type] = []);\n    const wrappedHook = hook.__weh || (hook.__weh = (...args) => {\n      pauseTracking();\n      const reset = setCurrentInstance(target);\n      const res = callWithAsyncErrorHandling(hook, target, type, args);\n      reset();\n      resetTracking();\n      return res;\n    });\n    if (prepend) {\n      hooks.unshift(wrappedHook);\n    } else {\n      hooks.push(wrappedHook);\n    }\n    return wrappedHook;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, \"\"));\n    warn$1(\n      `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (` If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` )\n    );\n  }\n}\nconst createHook = (lifecycle) => (hook, target = currentInstance) => {\n  if (!isInSSRComponentSetup || lifecycle === \"sp\") {\n    injectHook(lifecycle, (...args) => hook(...args), target);\n  }\n};\nconst onBeforeMount = createHook(\"bm\");\nconst onMounted = createHook(\"m\");\nconst onBeforeUpdate = createHook(\n  \"bu\"\n);\nconst onUpdated = createHook(\"u\");\nconst onBeforeUnmount = createHook(\n  \"bum\"\n);\nconst onUnmounted = createHook(\"um\");\nconst onServerPrefetch = createHook(\n  \"sp\"\n);\nconst onRenderTriggered = createHook(\"rtg\");\nconst onRenderTracked = createHook(\"rtc\");\nfunction onErrorCaptured(hook, target = currentInstance) {\n  injectHook(\"ec\", hook, target);\n}\n\nconst COMPONENTS = \"components\";\nconst DIRECTIVES = \"directives\";\nfunction resolveComponent(name, maybeSelfReference) {\n  return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;\n}\nconst NULL_DYNAMIC_COMPONENT = Symbol.for(\"v-ndc\");\nfunction resolveDynamicComponent(component) {\n  if (isString(component)) {\n    return resolveAsset(COMPONENTS, component, false) || component;\n  } else {\n    return component || NULL_DYNAMIC_COMPONENT;\n  }\n}\nfunction resolveDirective(name) {\n  return resolveAsset(DIRECTIVES, name);\n}\nfunction resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {\n  const instance = currentRenderingInstance || currentInstance;\n  if (instance) {\n    const Component = instance.type;\n    if (type === COMPONENTS) {\n      const selfName = getComponentName(\n        Component,\n        false\n      );\n      if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {\n        return Component;\n      }\n    }\n    const res = (\n      // local registration\n      // check instance[type] first which is resolved for options API\n      resolve(instance[type] || Component[type], name) || // global registration\n      resolve(instance.appContext[type], name)\n    );\n    if (!res && maybeSelfReference) {\n      return Component;\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") && warnMissing && !res) {\n      const extra = type === COMPONENTS ? `\nIf this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;\n      warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);\n    }\n    return res;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(\n      `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`\n    );\n  }\n}\nfunction resolve(registry, name) {\n  return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);\n}\n\nfunction renderList(source, renderItem, cache, index) {\n  let ret;\n  const cached = cache && cache[index];\n  const sourceIsArray = isArray(source);\n  if (sourceIsArray || isString(source)) {\n    const sourceIsReactiveArray = sourceIsArray && isReactive(source);\n    let needsWrap = false;\n    if (sourceIsReactiveArray) {\n      needsWrap = !isShallow(source);\n      source = shallowReadArray(source);\n    }\n    ret = new Array(source.length);\n    for (let i = 0, l = source.length; i < l; i++) {\n      ret[i] = renderItem(\n        needsWrap ? toReactive(source[i]) : source[i],\n        i,\n        void 0,\n        cached && cached[i]\n      );\n    }\n  } else if (typeof source === \"number\") {\n    if (!!(process.env.NODE_ENV !== \"production\") && !Number.isInteger(source)) {\n      warn$1(`The v-for range expect an integer value but got ${source}.`);\n    }\n    ret = new Array(source);\n    for (let i = 0; i < source; i++) {\n      ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);\n    }\n  } else if (isObject(source)) {\n    if (source[Symbol.iterator]) {\n      ret = Array.from(\n        source,\n        (item, i) => renderItem(item, i, void 0, cached && cached[i])\n      );\n    } else {\n      const keys = Object.keys(source);\n      ret = new Array(keys.length);\n      for (let i = 0, l = keys.length; i < l; i++) {\n        const key = keys[i];\n        ret[i] = renderItem(source[key], key, i, cached && cached[i]);\n      }\n    }\n  } else {\n    ret = [];\n  }\n  if (cache) {\n    cache[index] = ret;\n  }\n  return ret;\n}\n\nfunction createSlots(slots, dynamicSlots) {\n  for (let i = 0; i < dynamicSlots.length; i++) {\n    const slot = dynamicSlots[i];\n    if (isArray(slot)) {\n      for (let j = 0; j < slot.length; j++) {\n        slots[slot[j].name] = slot[j].fn;\n      }\n    } else if (slot) {\n      slots[slot.name] = slot.key ? (...args) => {\n        const res = slot.fn(...args);\n        if (res) res.key = slot.key;\n        return res;\n      } : slot.fn;\n    }\n  }\n  return slots;\n}\n\nfunction renderSlot(slots, name, props = {}, fallback, noSlotted) {\n  if (currentRenderingInstance.ce || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.ce) {\n    if (name !== \"default\") props.name = name;\n    return openBlock(), createBlock(\n      Fragment,\n      null,\n      [createVNode(\"slot\", props, fallback && fallback())],\n      64\n    );\n  }\n  let slot = slots[name];\n  if (!!(process.env.NODE_ENV !== \"production\") && slot && slot.length > 1) {\n    warn$1(\n      `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`\n    );\n    slot = () => [];\n  }\n  if (slot && slot._c) {\n    slot._d = false;\n  }\n  openBlock();\n  const validSlotContent = slot && ensureValidVNode(slot(props));\n  const slotKey = props.key || // slot content array of a dynamic conditional slot may have a branch\n  // key attached in the `createSlots` helper, respect that\n  validSlotContent && validSlotContent.key;\n  const rendered = createBlock(\n    Fragment,\n    {\n      key: (slotKey && !isSymbol(slotKey) ? slotKey : `_${name}`) + // #7256 force differentiate fallback content from actual content\n      (!validSlotContent && fallback ? \"_fb\" : \"\")\n    },\n    validSlotContent || (fallback ? fallback() : []),\n    validSlotContent && slots._ === 1 ? 64 : -2\n  );\n  if (!noSlotted && rendered.scopeId) {\n    rendered.slotScopeIds = [rendered.scopeId + \"-s\"];\n  }\n  if (slot && slot._c) {\n    slot._d = true;\n  }\n  return rendered;\n}\nfunction ensureValidVNode(vnodes) {\n  return vnodes.some((child) => {\n    if (!isVNode(child)) return true;\n    if (child.type === Comment) return false;\n    if (child.type === Fragment && !ensureValidVNode(child.children))\n      return false;\n    return true;\n  }) ? vnodes : null;\n}\n\nfunction toHandlers(obj, preserveCaseIfNecessary) {\n  const ret = {};\n  if (!!(process.env.NODE_ENV !== \"production\") && !isObject(obj)) {\n    warn$1(`v-on with no argument expects an object value.`);\n    return ret;\n  }\n  for (const key in obj) {\n    ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];\n  }\n  return ret;\n}\n\nconst getPublicInstance = (i) => {\n  if (!i) return null;\n  if (isStatefulComponent(i)) return getComponentPublicInstance(i);\n  return getPublicInstance(i.parent);\n};\nconst publicPropertiesMap = (\n  // Move PURE marker to new line to workaround compiler discarding it\n  // due to type annotation\n  /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {\n    $: (i) => i,\n    $el: (i) => i.vnode.el,\n    $data: (i) => i.data,\n    $props: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.props) : i.props,\n    $attrs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.attrs) : i.attrs,\n    $slots: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.slots) : i.slots,\n    $refs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.refs) : i.refs,\n    $parent: (i) => getPublicInstance(i.parent),\n    $root: (i) => getPublicInstance(i.root),\n    $host: (i) => i.ce,\n    $emit: (i) => i.emit,\n    $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type,\n    $forceUpdate: (i) => i.f || (i.f = () => {\n      queueJob(i.update);\n    }),\n    $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),\n    $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP\n  })\n);\nconst isReservedPrefix = (key) => key === \"_\" || key === \"$\";\nconst hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);\nconst PublicInstanceProxyHandlers = {\n  get({ _: instance }, key) {\n    if (key === \"__v_skip\") {\n      return true;\n    }\n    const { ctx, setupState, data, props, accessCache, type, appContext } = instance;\n    if (!!(process.env.NODE_ENV !== \"production\") && key === \"__isVue\") {\n      return true;\n    }\n    let normalizedProps;\n    if (key[0] !== \"$\") {\n      const n = accessCache[key];\n      if (n !== void 0) {\n        switch (n) {\n          case 1 /* SETUP */:\n            return setupState[key];\n          case 2 /* DATA */:\n            return data[key];\n          case 4 /* CONTEXT */:\n            return ctx[key];\n          case 3 /* PROPS */:\n            return props[key];\n        }\n      } else if (hasSetupBinding(setupState, key)) {\n        accessCache[key] = 1 /* SETUP */;\n        return setupState[key];\n      } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {\n        accessCache[key] = 2 /* DATA */;\n        return data[key];\n      } else if (\n        // only cache other properties when instance has declared (thus stable)\n        // props\n        (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key)\n      ) {\n        accessCache[key] = 3 /* PROPS */;\n        return props[key];\n      } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n        accessCache[key] = 4 /* CONTEXT */;\n        return ctx[key];\n      } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) {\n        accessCache[key] = 0 /* OTHER */;\n      }\n    }\n    const publicGetter = publicPropertiesMap[key];\n    let cssModule, globalProperties;\n    if (publicGetter) {\n      if (key === \"$attrs\") {\n        track(instance.attrs, \"get\", \"\");\n        !!(process.env.NODE_ENV !== \"production\") && markAttrsAccessed();\n      } else if (!!(process.env.NODE_ENV !== \"production\") && key === \"$slots\") {\n        track(instance, \"get\", key);\n      }\n      return publicGetter(instance);\n    } else if (\n      // css module (injected by vue-loader)\n      (cssModule = type.__cssModules) && (cssModule = cssModule[key])\n    ) {\n      return cssModule;\n    } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n      accessCache[key] = 4 /* CONTEXT */;\n      return ctx[key];\n    } else if (\n      // global properties\n      globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)\n    ) {\n      {\n        return globalProperties[key];\n      }\n    } else if (!!(process.env.NODE_ENV !== \"production\") && currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading\n    // to infinite warning loop\n    key.indexOf(\"__v\") !== 0)) {\n      if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {\n        warn$1(\n          `Property ${JSON.stringify(\n            key\n          )} must be accessed via $data because it starts with a reserved character (\"$\" or \"_\") and is not proxied on the render context.`\n        );\n      } else if (instance === currentRenderingInstance) {\n        warn$1(\n          `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`\n        );\n      }\n    }\n  },\n  set({ _: instance }, key, value) {\n    const { data, setupState, ctx } = instance;\n    if (hasSetupBinding(setupState, key)) {\n      setupState[key] = value;\n      return true;\n    } else if (!!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup && hasOwn(setupState, key)) {\n      warn$1(`Cannot mutate <script setup> binding \"${key}\" from Options API.`);\n      return false;\n    } else if (data !== EMPTY_OBJ && hasOwn(data, key)) {\n      data[key] = value;\n      return true;\n    } else if (hasOwn(instance.props, key)) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(`Attempting to mutate prop \"${key}\". Props are readonly.`);\n      return false;\n    }\n    if (key[0] === \"$\" && key.slice(1) in instance) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(\n        `Attempting to mutate public property \"${key}\". Properties starting with $ are reserved and readonly.`\n      );\n      return false;\n    } else {\n      if (!!(process.env.NODE_ENV !== \"production\") && key in instance.appContext.config.globalProperties) {\n        Object.defineProperty(ctx, key, {\n          enumerable: true,\n          configurable: true,\n          value\n        });\n      } else {\n        ctx[key] = value;\n      }\n    }\n    return true;\n  },\n  has({\n    _: { data, setupState, accessCache, ctx, appContext, propsOptions }\n  }, key) {\n    let normalizedProps;\n    return !!accessCache[key] || data !== EMPTY_OBJ && hasOwn(data, key) || hasSetupBinding(setupState, key) || (normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key);\n  },\n  defineProperty(target, key, descriptor) {\n    if (descriptor.get != null) {\n      target._.accessCache[key] = 0;\n    } else if (hasOwn(descriptor, \"value\")) {\n      this.set(target, key, descriptor.value, null);\n    }\n    return Reflect.defineProperty(target, key, descriptor);\n  }\n};\nif (!!(process.env.NODE_ENV !== \"production\") && true) {\n  PublicInstanceProxyHandlers.ownKeys = (target) => {\n    warn$1(\n      `Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead.`\n    );\n    return Reflect.ownKeys(target);\n  };\n}\nconst RuntimeCompiledPublicInstanceProxyHandlers = /* @__PURE__ */ extend({}, PublicInstanceProxyHandlers, {\n  get(target, key) {\n    if (key === Symbol.unscopables) {\n      return;\n    }\n    return PublicInstanceProxyHandlers.get(target, key, target);\n  },\n  has(_, key) {\n    const has = key[0] !== \"_\" && !isGloballyAllowed(key);\n    if (!!(process.env.NODE_ENV !== \"production\") && !has && PublicInstanceProxyHandlers.has(_, key)) {\n      warn$1(\n        `Property ${JSON.stringify(\n          key\n        )} should not start with _ which is a reserved prefix for Vue internals.`\n      );\n    }\n    return has;\n  }\n});\nfunction createDevRenderContext(instance) {\n  const target = {};\n  Object.defineProperty(target, `_`, {\n    configurable: true,\n    enumerable: false,\n    get: () => instance\n  });\n  Object.keys(publicPropertiesMap).forEach((key) => {\n    Object.defineProperty(target, key, {\n      configurable: true,\n      enumerable: false,\n      get: () => publicPropertiesMap[key](instance),\n      // intercepted by the proxy so no need for implementation,\n      // but needed to prevent set errors\n      set: NOOP\n    });\n  });\n  return target;\n}\nfunction exposePropsOnRenderContext(instance) {\n  const {\n    ctx,\n    propsOptions: [propsOptions]\n  } = instance;\n  if (propsOptions) {\n    Object.keys(propsOptions).forEach((key) => {\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => instance.props[key],\n        set: NOOP\n      });\n    });\n  }\n}\nfunction exposeSetupStateOnRenderContext(instance) {\n  const { ctx, setupState } = instance;\n  Object.keys(toRaw(setupState)).forEach((key) => {\n    if (!setupState.__isScriptSetup) {\n      if (isReservedPrefix(key[0])) {\n        warn$1(\n          `setup() return property ${JSON.stringify(\n            key\n          )} should not start with \"$\" or \"_\" which are reserved prefixes for Vue internals.`\n        );\n        return;\n      }\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => setupState[key],\n        set: NOOP\n      });\n    }\n  });\n}\n\nconst warnRuntimeUsage = (method) => warn$1(\n  `${method}() is a compiler-hint helper that is only usable inside <script setup> of a single file component. Its arguments should be compiled away and passing it at runtime has no effect.`\n);\nfunction defineProps() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineProps`);\n  }\n  return null;\n}\nfunction defineEmits() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineEmits`);\n  }\n  return null;\n}\nfunction defineExpose(exposed) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineExpose`);\n  }\n}\nfunction defineOptions(options) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineOptions`);\n  }\n}\nfunction defineSlots() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`defineSlots`);\n  }\n  return null;\n}\nfunction defineModel() {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(\"defineModel\");\n  }\n}\nfunction withDefaults(props, defaults) {\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    warnRuntimeUsage(`withDefaults`);\n  }\n  return null;\n}\nfunction useSlots() {\n  return getContext().slots;\n}\nfunction useAttrs() {\n  return getContext().attrs;\n}\nfunction getContext() {\n  const i = getCurrentInstance();\n  if (!!(process.env.NODE_ENV !== \"production\") && !i) {\n    warn$1(`useContext() called without active instance.`);\n  }\n  return i.setupContext || (i.setupContext = createSetupContext(i));\n}\nfunction normalizePropsOrEmits(props) {\n  return isArray(props) ? props.reduce(\n    (normalized, p) => (normalized[p] = null, normalized),\n    {}\n  ) : props;\n}\nfunction mergeDefaults(raw, defaults) {\n  const props = normalizePropsOrEmits(raw);\n  for (const key in defaults) {\n    if (key.startsWith(\"__skip\")) continue;\n    let opt = props[key];\n    if (opt) {\n      if (isArray(opt) || isFunction(opt)) {\n        opt = props[key] = { type: opt, default: defaults[key] };\n      } else {\n        opt.default = defaults[key];\n      }\n    } else if (opt === null) {\n      opt = props[key] = { default: defaults[key] };\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn$1(`props default key \"${key}\" has no corresponding declaration.`);\n    }\n    if (opt && defaults[`__skip_${key}`]) {\n      opt.skipFactory = true;\n    }\n  }\n  return props;\n}\nfunction mergeModels(a, b) {\n  if (!a || !b) return a || b;\n  if (isArray(a) && isArray(b)) return a.concat(b);\n  return extend({}, normalizePropsOrEmits(a), normalizePropsOrEmits(b));\n}\nfunction createPropsRestProxy(props, excludedKeys) {\n  const ret = {};\n  for (const key in props) {\n    if (!excludedKeys.includes(key)) {\n      Object.defineProperty(ret, key, {\n        enumerable: true,\n        get: () => props[key]\n      });\n    }\n  }\n  return ret;\n}\nfunction withAsyncContext(getAwaitable) {\n  const ctx = getCurrentInstance();\n  if (!!(process.env.NODE_ENV !== \"production\") && !ctx) {\n    warn$1(\n      `withAsyncContext called without active current instance. This is likely a bug.`\n    );\n  }\n  let awaitable = getAwaitable();\n  unsetCurrentInstance();\n  if (isPromise(awaitable)) {\n    awaitable = awaitable.catch((e) => {\n      setCurrentInstance(ctx);\n      throw e;\n    });\n  }\n  return [awaitable, () => setCurrentInstance(ctx)];\n}\n\nfunction createDuplicateChecker() {\n  const cache = /* @__PURE__ */ Object.create(null);\n  return (type, key) => {\n    if (cache[key]) {\n      warn$1(`${type} property \"${key}\" is already defined in ${cache[key]}.`);\n    } else {\n      cache[key] = type;\n    }\n  };\n}\nlet shouldCacheAccess = true;\nfunction applyOptions(instance) {\n  const options = resolveMergedOptions(instance);\n  const publicThis = instance.proxy;\n  const ctx = instance.ctx;\n  shouldCacheAccess = false;\n  if (options.beforeCreate) {\n    callHook(options.beforeCreate, instance, \"bc\");\n  }\n  const {\n    // state\n    data: dataOptions,\n    computed: computedOptions,\n    methods,\n    watch: watchOptions,\n    provide: provideOptions,\n    inject: injectOptions,\n    // lifecycle\n    created,\n    beforeMount,\n    mounted,\n    beforeUpdate,\n    updated,\n    activated,\n    deactivated,\n    beforeDestroy,\n    beforeUnmount,\n    destroyed,\n    unmounted,\n    render,\n    renderTracked,\n    renderTriggered,\n    errorCaptured,\n    serverPrefetch,\n    // public API\n    expose,\n    inheritAttrs,\n    // assets\n    components,\n    directives,\n    filters\n  } = options;\n  const checkDuplicateProperties = !!(process.env.NODE_ENV !== \"production\") ? createDuplicateChecker() : null;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const [propsOptions] = instance.propsOptions;\n    if (propsOptions) {\n      for (const key in propsOptions) {\n        checkDuplicateProperties(\"Props\" /* PROPS */, key);\n      }\n    }\n  }\n  if (injectOptions) {\n    resolveInjections(injectOptions, ctx, checkDuplicateProperties);\n  }\n  if (methods) {\n    for (const key in methods) {\n      const methodHandler = methods[key];\n      if (isFunction(methodHandler)) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          Object.defineProperty(ctx, key, {\n            value: methodHandler.bind(publicThis),\n            configurable: true,\n            enumerable: true,\n            writable: true\n          });\n        } else {\n          ctx[key] = methodHandler.bind(publicThis);\n        }\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          checkDuplicateProperties(\"Methods\" /* METHODS */, key);\n        }\n      } else if (!!(process.env.NODE_ENV !== \"production\")) {\n        warn$1(\n          `Method \"${key}\" has type \"${typeof methodHandler}\" in the component definition. Did you reference the function correctly?`\n        );\n      }\n    }\n  }\n  if (dataOptions) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isFunction(dataOptions)) {\n      warn$1(\n        `The data option must be a function. Plain object usage is no longer supported.`\n      );\n    }\n    const data = dataOptions.call(publicThis, publicThis);\n    if (!!(process.env.NODE_ENV !== \"production\") && isPromise(data)) {\n      warn$1(\n        `data() returned a Promise - note data() cannot be async; If you intend to perform data fetching before component renders, use async setup() + <Suspense>.`\n      );\n    }\n    if (!isObject(data)) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(`data() should return an object.`);\n    } else {\n      instance.data = reactive(data);\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        for (const key in data) {\n          checkDuplicateProperties(\"Data\" /* DATA */, key);\n          if (!isReservedPrefix(key[0])) {\n            Object.defineProperty(ctx, key, {\n              configurable: true,\n              enumerable: true,\n              get: () => data[key],\n              set: NOOP\n            });\n          }\n        }\n      }\n    }\n  }\n  shouldCacheAccess = true;\n  if (computedOptions) {\n    for (const key in computedOptions) {\n      const opt = computedOptions[key];\n      const get = isFunction(opt) ? opt.bind(publicThis, publicThis) : isFunction(opt.get) ? opt.get.bind(publicThis, publicThis) : NOOP;\n      if (!!(process.env.NODE_ENV !== \"production\") && get === NOOP) {\n        warn$1(`Computed property \"${key}\" has no getter.`);\n      }\n      const set = !isFunction(opt) && isFunction(opt.set) ? opt.set.bind(publicThis) : !!(process.env.NODE_ENV !== \"production\") ? () => {\n        warn$1(\n          `Write operation failed: computed property \"${key}\" is readonly.`\n        );\n      } : NOOP;\n      const c = computed({\n        get,\n        set\n      });\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => c.value,\n        set: (v) => c.value = v\n      });\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        checkDuplicateProperties(\"Computed\" /* COMPUTED */, key);\n      }\n    }\n  }\n  if (watchOptions) {\n    for (const key in watchOptions) {\n      createWatcher(watchOptions[key], ctx, publicThis, key);\n    }\n  }\n  if (provideOptions) {\n    const provides = isFunction(provideOptions) ? provideOptions.call(publicThis) : provideOptions;\n    Reflect.ownKeys(provides).forEach((key) => {\n      provide(key, provides[key]);\n    });\n  }\n  if (created) {\n    callHook(created, instance, \"c\");\n  }\n  function registerLifecycleHook(register, hook) {\n    if (isArray(hook)) {\n      hook.forEach((_hook) => register(_hook.bind(publicThis)));\n    } else if (hook) {\n      register(hook.bind(publicThis));\n    }\n  }\n  registerLifecycleHook(onBeforeMount, beforeMount);\n  registerLifecycleHook(onMounted, mounted);\n  registerLifecycleHook(onBeforeUpdate, beforeUpdate);\n  registerLifecycleHook(onUpdated, updated);\n  registerLifecycleHook(onActivated, activated);\n  registerLifecycleHook(onDeactivated, deactivated);\n  registerLifecycleHook(onErrorCaptured, errorCaptured);\n  registerLifecycleHook(onRenderTracked, renderTracked);\n  registerLifecycleHook(onRenderTriggered, renderTriggered);\n  registerLifecycleHook(onBeforeUnmount, beforeUnmount);\n  registerLifecycleHook(onUnmounted, unmounted);\n  registerLifecycleHook(onServerPrefetch, serverPrefetch);\n  if (isArray(expose)) {\n    if (expose.length) {\n      const exposed = instance.exposed || (instance.exposed = {});\n      expose.forEach((key) => {\n        Object.defineProperty(exposed, key, {\n          get: () => publicThis[key],\n          set: (val) => publicThis[key] = val\n        });\n      });\n    } else if (!instance.exposed) {\n      instance.exposed = {};\n    }\n  }\n  if (render && instance.render === NOOP) {\n    instance.render = render;\n  }\n  if (inheritAttrs != null) {\n    instance.inheritAttrs = inheritAttrs;\n  }\n  if (components) instance.components = components;\n  if (directives) instance.directives = directives;\n  if (serverPrefetch) {\n    markAsyncBoundary(instance);\n  }\n}\nfunction resolveInjections(injectOptions, ctx, checkDuplicateProperties = NOOP) {\n  if (isArray(injectOptions)) {\n    injectOptions = normalizeInject(injectOptions);\n  }\n  for (const key in injectOptions) {\n    const opt = injectOptions[key];\n    let injected;\n    if (isObject(opt)) {\n      if (\"default\" in opt) {\n        injected = inject(\n          opt.from || key,\n          opt.default,\n          true\n        );\n      } else {\n        injected = inject(opt.from || key);\n      }\n    } else {\n      injected = inject(opt);\n    }\n    if (isRef(injected)) {\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => injected.value,\n        set: (v) => injected.value = v\n      });\n    } else {\n      ctx[key] = injected;\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      checkDuplicateProperties(\"Inject\" /* INJECT */, key);\n    }\n  }\n}\nfunction callHook(hook, instance, type) {\n  callWithAsyncErrorHandling(\n    isArray(hook) ? hook.map((h) => h.bind(instance.proxy)) : hook.bind(instance.proxy),\n    instance,\n    type\n  );\n}\nfunction createWatcher(raw, ctx, publicThis, key) {\n  let getter = key.includes(\".\") ? createPathGetter(publicThis, key) : () => publicThis[key];\n  if (isString(raw)) {\n    const handler = ctx[raw];\n    if (isFunction(handler)) {\n      {\n        watch(getter, handler);\n      }\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn$1(`Invalid watch handler specified by key \"${raw}\"`, handler);\n    }\n  } else if (isFunction(raw)) {\n    {\n      watch(getter, raw.bind(publicThis));\n    }\n  } else if (isObject(raw)) {\n    if (isArray(raw)) {\n      raw.forEach((r) => createWatcher(r, ctx, publicThis, key));\n    } else {\n      const handler = isFunction(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler];\n      if (isFunction(handler)) {\n        watch(getter, handler, raw);\n      } else if (!!(process.env.NODE_ENV !== \"production\")) {\n        warn$1(`Invalid watch handler specified by key \"${raw.handler}\"`, handler);\n      }\n    }\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(`Invalid watch option: \"${key}\"`, raw);\n  }\n}\nfunction resolveMergedOptions(instance) {\n  const base = instance.type;\n  const { mixins, extends: extendsOptions } = base;\n  const {\n    mixins: globalMixins,\n    optionsCache: cache,\n    config: { optionMergeStrategies }\n  } = instance.appContext;\n  const cached = cache.get(base);\n  let resolved;\n  if (cached) {\n    resolved = cached;\n  } else if (!globalMixins.length && !mixins && !extendsOptions) {\n    {\n      resolved = base;\n    }\n  } else {\n    resolved = {};\n    if (globalMixins.length) {\n      globalMixins.forEach(\n        (m) => mergeOptions(resolved, m, optionMergeStrategies, true)\n      );\n    }\n    mergeOptions(resolved, base, optionMergeStrategies);\n  }\n  if (isObject(base)) {\n    cache.set(base, resolved);\n  }\n  return resolved;\n}\nfunction mergeOptions(to, from, strats, asMixin = false) {\n  const { mixins, extends: extendsOptions } = from;\n  if (extendsOptions) {\n    mergeOptions(to, extendsOptions, strats, true);\n  }\n  if (mixins) {\n    mixins.forEach(\n      (m) => mergeOptions(to, m, strats, true)\n    );\n  }\n  for (const key in from) {\n    if (asMixin && key === \"expose\") {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(\n        `\"expose\" option is ignored when declared in mixins or extends. It should only be declared in the base component itself.`\n      );\n    } else {\n      const strat = internalOptionMergeStrats[key] || strats && strats[key];\n      to[key] = strat ? strat(to[key], from[key]) : from[key];\n    }\n  }\n  return to;\n}\nconst internalOptionMergeStrats = {\n  data: mergeDataFn,\n  props: mergeEmitsOrPropsOptions,\n  emits: mergeEmitsOrPropsOptions,\n  // objects\n  methods: mergeObjectOptions,\n  computed: mergeObjectOptions,\n  // lifecycle\n  beforeCreate: mergeAsArray,\n  created: mergeAsArray,\n  beforeMount: mergeAsArray,\n  mounted: mergeAsArray,\n  beforeUpdate: mergeAsArray,\n  updated: mergeAsArray,\n  beforeDestroy: mergeAsArray,\n  beforeUnmount: mergeAsArray,\n  destroyed: mergeAsArray,\n  unmounted: mergeAsArray,\n  activated: mergeAsArray,\n  deactivated: mergeAsArray,\n  errorCaptured: mergeAsArray,\n  serverPrefetch: mergeAsArray,\n  // assets\n  components: mergeObjectOptions,\n  directives: mergeObjectOptions,\n  // watch\n  watch: mergeWatchOptions,\n  // provide / inject\n  provide: mergeDataFn,\n  inject: mergeInject\n};\nfunction mergeDataFn(to, from) {\n  if (!from) {\n    return to;\n  }\n  if (!to) {\n    return from;\n  }\n  return function mergedDataFn() {\n    return (extend)(\n      isFunction(to) ? to.call(this, this) : to,\n      isFunction(from) ? from.call(this, this) : from\n    );\n  };\n}\nfunction mergeInject(to, from) {\n  return mergeObjectOptions(normalizeInject(to), normalizeInject(from));\n}\nfunction normalizeInject(raw) {\n  if (isArray(raw)) {\n    const res = {};\n    for (let i = 0; i < raw.length; i++) {\n      res[raw[i]] = raw[i];\n    }\n    return res;\n  }\n  return raw;\n}\nfunction mergeAsArray(to, from) {\n  return to ? [...new Set([].concat(to, from))] : from;\n}\nfunction mergeObjectOptions(to, from) {\n  return to ? extend(/* @__PURE__ */ Object.create(null), to, from) : from;\n}\nfunction mergeEmitsOrPropsOptions(to, from) {\n  if (to) {\n    if (isArray(to) && isArray(from)) {\n      return [.../* @__PURE__ */ new Set([...to, ...from])];\n    }\n    return extend(\n      /* @__PURE__ */ Object.create(null),\n      normalizePropsOrEmits(to),\n      normalizePropsOrEmits(from != null ? from : {})\n    );\n  } else {\n    return from;\n  }\n}\nfunction mergeWatchOptions(to, from) {\n  if (!to) return from;\n  if (!from) return to;\n  const merged = extend(/* @__PURE__ */ Object.create(null), to);\n  for (const key in from) {\n    merged[key] = mergeAsArray(to[key], from[key]);\n  }\n  return merged;\n}\n\nfunction createAppContext() {\n  return {\n    app: null,\n    config: {\n      isNativeTag: NO,\n      performance: false,\n      globalProperties: {},\n      optionMergeStrategies: {},\n      errorHandler: void 0,\n      warnHandler: void 0,\n      compilerOptions: {}\n    },\n    mixins: [],\n    components: {},\n    directives: {},\n    provides: /* @__PURE__ */ Object.create(null),\n    optionsCache: /* @__PURE__ */ new WeakMap(),\n    propsCache: /* @__PURE__ */ new WeakMap(),\n    emitsCache: /* @__PURE__ */ new WeakMap()\n  };\n}\nlet uid$1 = 0;\nfunction createAppAPI(render, hydrate) {\n  return function createApp(rootComponent, rootProps = null) {\n    if (!isFunction(rootComponent)) {\n      rootComponent = extend({}, rootComponent);\n    }\n    if (rootProps != null && !isObject(rootProps)) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(`root props passed to app.mount() must be an object.`);\n      rootProps = null;\n    }\n    const context = createAppContext();\n    const installedPlugins = /* @__PURE__ */ new WeakSet();\n    const pluginCleanupFns = [];\n    let isMounted = false;\n    const app = context.app = {\n      _uid: uid$1++,\n      _component: rootComponent,\n      _props: rootProps,\n      _container: null,\n      _context: context,\n      _instance: null,\n      version,\n      get config() {\n        return context.config;\n      },\n      set config(v) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\n            `app.config cannot be replaced. Modify individual options instead.`\n          );\n        }\n      },\n      use(plugin, ...options) {\n        if (installedPlugins.has(plugin)) {\n          !!(process.env.NODE_ENV !== \"production\") && warn$1(`Plugin has already been applied to target app.`);\n        } else if (plugin && isFunction(plugin.install)) {\n          installedPlugins.add(plugin);\n          plugin.install(app, ...options);\n        } else if (isFunction(plugin)) {\n          installedPlugins.add(plugin);\n          plugin(app, ...options);\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\n            `A plugin must either be a function or an object with an \"install\" function.`\n          );\n        }\n        return app;\n      },\n      mixin(mixin) {\n        if (__VUE_OPTIONS_API__) {\n          if (!context.mixins.includes(mixin)) {\n            context.mixins.push(mixin);\n          } else if (!!(process.env.NODE_ENV !== \"production\")) {\n            warn$1(\n              \"Mixin has already been applied to target app\" + (mixin.name ? `: ${mixin.name}` : \"\")\n            );\n          }\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\"Mixins are only available in builds supporting Options API\");\n        }\n        return app;\n      },\n      component(name, component) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          validateComponentName(name, context.config);\n        }\n        if (!component) {\n          return context.components[name];\n        }\n        if (!!(process.env.NODE_ENV !== \"production\") && context.components[name]) {\n          warn$1(`Component \"${name}\" has already been registered in target app.`);\n        }\n        context.components[name] = component;\n        return app;\n      },\n      directive(name, directive) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          validateDirectiveName(name);\n        }\n        if (!directive) {\n          return context.directives[name];\n        }\n        if (!!(process.env.NODE_ENV !== \"production\") && context.directives[name]) {\n          warn$1(`Directive \"${name}\" has already been registered in target app.`);\n        }\n        context.directives[name] = directive;\n        return app;\n      },\n      mount(rootContainer, isHydrate, namespace) {\n        if (!isMounted) {\n          if (!!(process.env.NODE_ENV !== \"production\") && rootContainer.__vue_app__) {\n            warn$1(\n              `There is already an app instance mounted on the host container.\n If you want to mount another app on the same host container, you need to unmount the previous app by calling \\`app.unmount()\\` first.`\n            );\n          }\n          const vnode = app._ceVNode || createVNode(rootComponent, rootProps);\n          vnode.appContext = context;\n          if (namespace === true) {\n            namespace = \"svg\";\n          } else if (namespace === false) {\n            namespace = void 0;\n          }\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            context.reload = () => {\n              render(\n                cloneVNode(vnode),\n                rootContainer,\n                namespace\n              );\n            };\n          }\n          if (isHydrate && hydrate) {\n            hydrate(vnode, rootContainer);\n          } else {\n            render(vnode, rootContainer, namespace);\n          }\n          isMounted = true;\n          app._container = rootContainer;\n          rootContainer.__vue_app__ = app;\n          if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n            app._instance = vnode.component;\n            devtoolsInitApp(app, version);\n          }\n          return getComponentPublicInstance(vnode.component);\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\n            `App has already been mounted.\nIf you want to remount the same app, move your app creation logic into a factory function and create fresh app instances for each mount - e.g. \\`const createMyApp = () => createApp(App)\\``\n          );\n        }\n      },\n      onUnmount(cleanupFn) {\n        if (!!(process.env.NODE_ENV !== \"production\") && typeof cleanupFn !== \"function\") {\n          warn$1(\n            `Expected function as first argument to app.onUnmount(), but got ${typeof cleanupFn}`\n          );\n        }\n        pluginCleanupFns.push(cleanupFn);\n      },\n      unmount() {\n        if (isMounted) {\n          callWithAsyncErrorHandling(\n            pluginCleanupFns,\n            app._instance,\n            16\n          );\n          render(null, app._container);\n          if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n            app._instance = null;\n            devtoolsUnmountApp(app);\n          }\n          delete app._container.__vue_app__;\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(`Cannot unmount an app that is not mounted.`);\n        }\n      },\n      provide(key, value) {\n        if (!!(process.env.NODE_ENV !== \"production\") && key in context.provides) {\n          warn$1(\n            `App already provides property with key \"${String(key)}\". It will be overwritten with the new value.`\n          );\n        }\n        context.provides[key] = value;\n        return app;\n      },\n      runWithContext(fn) {\n        const lastApp = currentApp;\n        currentApp = app;\n        try {\n          return fn();\n        } finally {\n          currentApp = lastApp;\n        }\n      }\n    };\n    return app;\n  };\n}\nlet currentApp = null;\n\nfunction provide(key, value) {\n  if (!currentInstance) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn$1(`provide() can only be used inside setup().`);\n    }\n  } else {\n    let provides = currentInstance.provides;\n    const parentProvides = currentInstance.parent && currentInstance.parent.provides;\n    if (parentProvides === provides) {\n      provides = currentInstance.provides = Object.create(parentProvides);\n    }\n    provides[key] = value;\n  }\n}\nfunction inject(key, defaultValue, treatDefaultAsFactory = false) {\n  const instance = currentInstance || currentRenderingInstance;\n  if (instance || currentApp) {\n    const provides = currentApp ? currentApp._context.provides : instance ? instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : void 0;\n    if (provides && key in provides) {\n      return provides[key];\n    } else if (arguments.length > 1) {\n      return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;\n    } else if (!!(process.env.NODE_ENV !== \"production\")) {\n      warn$1(`injection \"${String(key)}\" not found.`);\n    }\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(`inject() can only be used inside setup() or functional components.`);\n  }\n}\nfunction hasInjectionContext() {\n  return !!(currentInstance || currentRenderingInstance || currentApp);\n}\n\nconst internalObjectProto = {};\nconst createInternalObject = () => Object.create(internalObjectProto);\nconst isInternalObject = (obj) => Object.getPrototypeOf(obj) === internalObjectProto;\n\nfunction initProps(instance, rawProps, isStateful, isSSR = false) {\n  const props = {};\n  const attrs = createInternalObject();\n  instance.propsDefaults = /* @__PURE__ */ Object.create(null);\n  setFullProps(instance, rawProps, props, attrs);\n  for (const key in instance.propsOptions[0]) {\n    if (!(key in props)) {\n      props[key] = void 0;\n    }\n  }\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    validateProps(rawProps || {}, props, instance);\n  }\n  if (isStateful) {\n    instance.props = isSSR ? props : shallowReactive(props);\n  } else {\n    if (!instance.type.props) {\n      instance.props = attrs;\n    } else {\n      instance.props = props;\n    }\n  }\n  instance.attrs = attrs;\n}\nfunction isInHmrContext(instance) {\n  while (instance) {\n    if (instance.type.__hmrId) return true;\n    instance = instance.parent;\n  }\n}\nfunction updateProps(instance, rawProps, rawPrevProps, optimized) {\n  const {\n    props,\n    attrs,\n    vnode: { patchFlag }\n  } = instance;\n  const rawCurrentProps = toRaw(props);\n  const [options] = instance.propsOptions;\n  let hasAttrsChanged = false;\n  if (\n    // always force full diff in dev\n    // - #1942 if hmr is enabled with sfc component\n    // - vite#872 non-sfc component used by sfc component\n    !(!!(process.env.NODE_ENV !== \"production\") && isInHmrContext(instance)) && (optimized || patchFlag > 0) && !(patchFlag & 16)\n  ) {\n    if (patchFlag & 8) {\n      const propsToUpdate = instance.vnode.dynamicProps;\n      for (let i = 0; i < propsToUpdate.length; i++) {\n        let key = propsToUpdate[i];\n        if (isEmitListener(instance.emitsOptions, key)) {\n          continue;\n        }\n        const value = rawProps[key];\n        if (options) {\n          if (hasOwn(attrs, key)) {\n            if (value !== attrs[key]) {\n              attrs[key] = value;\n              hasAttrsChanged = true;\n            }\n          } else {\n            const camelizedKey = camelize(key);\n            props[camelizedKey] = resolvePropValue(\n              options,\n              rawCurrentProps,\n              camelizedKey,\n              value,\n              instance,\n              false\n            );\n          }\n        } else {\n          if (value !== attrs[key]) {\n            attrs[key] = value;\n            hasAttrsChanged = true;\n          }\n        }\n      }\n    }\n  } else {\n    if (setFullProps(instance, rawProps, props, attrs)) {\n      hasAttrsChanged = true;\n    }\n    let kebabKey;\n    for (const key in rawCurrentProps) {\n      if (!rawProps || // for camelCase\n      !hasOwn(rawProps, key) && // it's possible the original props was passed in as kebab-case\n      // and converted to camelCase (#955)\n      ((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey))) {\n        if (options) {\n          if (rawPrevProps && // for camelCase\n          (rawPrevProps[key] !== void 0 || // for kebab-case\n          rawPrevProps[kebabKey] !== void 0)) {\n            props[key] = resolvePropValue(\n              options,\n              rawCurrentProps,\n              key,\n              void 0,\n              instance,\n              true\n            );\n          }\n        } else {\n          delete props[key];\n        }\n      }\n    }\n    if (attrs !== rawCurrentProps) {\n      for (const key in attrs) {\n        if (!rawProps || !hasOwn(rawProps, key) && true) {\n          delete attrs[key];\n          hasAttrsChanged = true;\n        }\n      }\n    }\n  }\n  if (hasAttrsChanged) {\n    trigger(instance.attrs, \"set\", \"\");\n  }\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    validateProps(rawProps || {}, props, instance);\n  }\n}\nfunction setFullProps(instance, rawProps, props, attrs) {\n  const [options, needCastKeys] = instance.propsOptions;\n  let hasAttrsChanged = false;\n  let rawCastValues;\n  if (rawProps) {\n    for (let key in rawProps) {\n      if (isReservedProp(key)) {\n        continue;\n      }\n      const value = rawProps[key];\n      let camelKey;\n      if (options && hasOwn(options, camelKey = camelize(key))) {\n        if (!needCastKeys || !needCastKeys.includes(camelKey)) {\n          props[camelKey] = value;\n        } else {\n          (rawCastValues || (rawCastValues = {}))[camelKey] = value;\n        }\n      } else if (!isEmitListener(instance.emitsOptions, key)) {\n        if (!(key in attrs) || value !== attrs[key]) {\n          attrs[key] = value;\n          hasAttrsChanged = true;\n        }\n      }\n    }\n  }\n  if (needCastKeys) {\n    const rawCurrentProps = toRaw(props);\n    const castValues = rawCastValues || EMPTY_OBJ;\n    for (let i = 0; i < needCastKeys.length; i++) {\n      const key = needCastKeys[i];\n      props[key] = resolvePropValue(\n        options,\n        rawCurrentProps,\n        key,\n        castValues[key],\n        instance,\n        !hasOwn(castValues, key)\n      );\n    }\n  }\n  return hasAttrsChanged;\n}\nfunction resolvePropValue(options, props, key, value, instance, isAbsent) {\n  const opt = options[key];\n  if (opt != null) {\n    const hasDefault = hasOwn(opt, \"default\");\n    if (hasDefault && value === void 0) {\n      const defaultValue = opt.default;\n      if (opt.type !== Function && !opt.skipFactory && isFunction(defaultValue)) {\n        const { propsDefaults } = instance;\n        if (key in propsDefaults) {\n          value = propsDefaults[key];\n        } else {\n          const reset = setCurrentInstance(instance);\n          value = propsDefaults[key] = defaultValue.call(\n            null,\n            props\n          );\n          reset();\n        }\n      } else {\n        value = defaultValue;\n      }\n      if (instance.ce) {\n        instance.ce._setProp(key, value);\n      }\n    }\n    if (opt[0 /* shouldCast */]) {\n      if (isAbsent && !hasDefault) {\n        value = false;\n      } else if (opt[1 /* shouldCastTrue */] && (value === \"\" || value === hyphenate(key))) {\n        value = true;\n      }\n    }\n  }\n  return value;\n}\nconst mixinPropsCache = /* @__PURE__ */ new WeakMap();\nfunction normalizePropsOptions(comp, appContext, asMixin = false) {\n  const cache = __VUE_OPTIONS_API__ && asMixin ? mixinPropsCache : appContext.propsCache;\n  const cached = cache.get(comp);\n  if (cached) {\n    return cached;\n  }\n  const raw = comp.props;\n  const normalized = {};\n  const needCastKeys = [];\n  let hasExtends = false;\n  if (__VUE_OPTIONS_API__ && !isFunction(comp)) {\n    const extendProps = (raw2) => {\n      hasExtends = true;\n      const [props, keys] = normalizePropsOptions(raw2, appContext, true);\n      extend(normalized, props);\n      if (keys) needCastKeys.push(...keys);\n    };\n    if (!asMixin && appContext.mixins.length) {\n      appContext.mixins.forEach(extendProps);\n    }\n    if (comp.extends) {\n      extendProps(comp.extends);\n    }\n    if (comp.mixins) {\n      comp.mixins.forEach(extendProps);\n    }\n  }\n  if (!raw && !hasExtends) {\n    if (isObject(comp)) {\n      cache.set(comp, EMPTY_ARR);\n    }\n    return EMPTY_ARR;\n  }\n  if (isArray(raw)) {\n    for (let i = 0; i < raw.length; i++) {\n      if (!!(process.env.NODE_ENV !== \"production\") && !isString(raw[i])) {\n        warn$1(`props must be strings when using array syntax.`, raw[i]);\n      }\n      const normalizedKey = camelize(raw[i]);\n      if (validatePropName(normalizedKey)) {\n        normalized[normalizedKey] = EMPTY_OBJ;\n      }\n    }\n  } else if (raw) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isObject(raw)) {\n      warn$1(`invalid props options`, raw);\n    }\n    for (const key in raw) {\n      const normalizedKey = camelize(key);\n      if (validatePropName(normalizedKey)) {\n        const opt = raw[key];\n        const prop = normalized[normalizedKey] = isArray(opt) || isFunction(opt) ? { type: opt } : extend({}, opt);\n        const propType = prop.type;\n        let shouldCast = false;\n        let shouldCastTrue = true;\n        if (isArray(propType)) {\n          for (let index = 0; index < propType.length; ++index) {\n            const type = propType[index];\n            const typeName = isFunction(type) && type.name;\n            if (typeName === \"Boolean\") {\n              shouldCast = true;\n              break;\n            } else if (typeName === \"String\") {\n              shouldCastTrue = false;\n            }\n          }\n        } else {\n          shouldCast = isFunction(propType) && propType.name === \"Boolean\";\n        }\n        prop[0 /* shouldCast */] = shouldCast;\n        prop[1 /* shouldCastTrue */] = shouldCastTrue;\n        if (shouldCast || hasOwn(prop, \"default\")) {\n          needCastKeys.push(normalizedKey);\n        }\n      }\n    }\n  }\n  const res = [normalized, needCastKeys];\n  if (isObject(comp)) {\n    cache.set(comp, res);\n  }\n  return res;\n}\nfunction validatePropName(key) {\n  if (key[0] !== \"$\" && !isReservedProp(key)) {\n    return true;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    warn$1(`Invalid prop name: \"${key}\" is a reserved property.`);\n  }\n  return false;\n}\nfunction getType(ctor) {\n  if (ctor === null) {\n    return \"null\";\n  }\n  if (typeof ctor === \"function\") {\n    return ctor.name || \"\";\n  } else if (typeof ctor === \"object\") {\n    const name = ctor.constructor && ctor.constructor.name;\n    return name || \"\";\n  }\n  return \"\";\n}\nfunction validateProps(rawProps, props, instance) {\n  const resolvedValues = toRaw(props);\n  const options = instance.propsOptions[0];\n  const camelizePropsKey = Object.keys(rawProps).map((key) => camelize(key));\n  for (const key in options) {\n    let opt = options[key];\n    if (opt == null) continue;\n    validateProp(\n      key,\n      resolvedValues[key],\n      opt,\n      !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(resolvedValues) : resolvedValues,\n      !camelizePropsKey.includes(key)\n    );\n  }\n}\nfunction validateProp(name, value, prop, props, isAbsent) {\n  const { type, required, validator, skipCheck } = prop;\n  if (required && isAbsent) {\n    warn$1('Missing required prop: \"' + name + '\"');\n    return;\n  }\n  if (value == null && !required) {\n    return;\n  }\n  if (type != null && type !== true && !skipCheck) {\n    let isValid = false;\n    const types = isArray(type) ? type : [type];\n    const expectedTypes = [];\n    for (let i = 0; i < types.length && !isValid; i++) {\n      const { valid, expectedType } = assertType(value, types[i]);\n      expectedTypes.push(expectedType || \"\");\n      isValid = valid;\n    }\n    if (!isValid) {\n      warn$1(getInvalidTypeMessage(name, value, expectedTypes));\n      return;\n    }\n  }\n  if (validator && !validator(value, props)) {\n    warn$1('Invalid prop: custom validator check failed for prop \"' + name + '\".');\n  }\n}\nconst isSimpleType = /* @__PURE__ */ makeMap(\n  \"String,Number,Boolean,Function,Symbol,BigInt\"\n);\nfunction assertType(value, type) {\n  let valid;\n  const expectedType = getType(type);\n  if (expectedType === \"null\") {\n    valid = value === null;\n  } else if (isSimpleType(expectedType)) {\n    const t = typeof value;\n    valid = t === expectedType.toLowerCase();\n    if (!valid && t === \"object\") {\n      valid = value instanceof type;\n    }\n  } else if (expectedType === \"Object\") {\n    valid = isObject(value);\n  } else if (expectedType === \"Array\") {\n    valid = isArray(value);\n  } else {\n    valid = value instanceof type;\n  }\n  return {\n    valid,\n    expectedType\n  };\n}\nfunction getInvalidTypeMessage(name, value, expectedTypes) {\n  if (expectedTypes.length === 0) {\n    return `Prop type [] for prop \"${name}\" won't match anything. Did you mean to use type Array instead?`;\n  }\n  let message = `Invalid prop: type check failed for prop \"${name}\". Expected ${expectedTypes.map(capitalize).join(\" | \")}`;\n  const expectedType = expectedTypes[0];\n  const receivedType = toRawType(value);\n  const expectedValue = styleValue(value, expectedType);\n  const receivedValue = styleValue(value, receivedType);\n  if (expectedTypes.length === 1 && isExplicable(expectedType) && !isBoolean(expectedType, receivedType)) {\n    message += ` with value ${expectedValue}`;\n  }\n  message += `, got ${receivedType} `;\n  if (isExplicable(receivedType)) {\n    message += `with value ${receivedValue}.`;\n  }\n  return message;\n}\nfunction styleValue(value, type) {\n  if (type === \"String\") {\n    return `\"${value}\"`;\n  } else if (type === \"Number\") {\n    return `${Number(value)}`;\n  } else {\n    return `${value}`;\n  }\n}\nfunction isExplicable(type) {\n  const explicitTypes = [\"string\", \"number\", \"boolean\"];\n  return explicitTypes.some((elem) => type.toLowerCase() === elem);\n}\nfunction isBoolean(...args) {\n  return args.some((elem) => elem.toLowerCase() === \"boolean\");\n}\n\nconst isInternalKey = (key) => key[0] === \"_\" || key === \"$stable\";\nconst normalizeSlotValue = (value) => isArray(value) ? value.map(normalizeVNode) : [normalizeVNode(value)];\nconst normalizeSlot = (key, rawSlot, ctx) => {\n  if (rawSlot._n) {\n    return rawSlot;\n  }\n  const normalized = withCtx((...args) => {\n    if (!!(process.env.NODE_ENV !== \"production\") && currentInstance && (!ctx || ctx.root === currentInstance.root)) {\n      warn$1(\n        `Slot \"${key}\" invoked outside of the render function: this will not track dependencies used in the slot. Invoke the slot function inside the render function instead.`\n      );\n    }\n    return normalizeSlotValue(rawSlot(...args));\n  }, ctx);\n  normalized._c = false;\n  return normalized;\n};\nconst normalizeObjectSlots = (rawSlots, slots, instance) => {\n  const ctx = rawSlots._ctx;\n  for (const key in rawSlots) {\n    if (isInternalKey(key)) continue;\n    const value = rawSlots[key];\n    if (isFunction(value)) {\n      slots[key] = normalizeSlot(key, value, ctx);\n    } else if (value != null) {\n      if (!!(process.env.NODE_ENV !== \"production\") && true) {\n        warn$1(\n          `Non-function value encountered for slot \"${key}\". Prefer function slots for better performance.`\n        );\n      }\n      const normalized = normalizeSlotValue(value);\n      slots[key] = () => normalized;\n    }\n  }\n};\nconst normalizeVNodeSlots = (instance, children) => {\n  if (!!(process.env.NODE_ENV !== \"production\") && !isKeepAlive(instance.vnode) && true) {\n    warn$1(\n      `Non-function value encountered for default slot. Prefer function slots for better performance.`\n    );\n  }\n  const normalized = normalizeSlotValue(children);\n  instance.slots.default = () => normalized;\n};\nconst assignSlots = (slots, children, optimized) => {\n  for (const key in children) {\n    if (optimized || key !== \"_\") {\n      slots[key] = children[key];\n    }\n  }\n};\nconst initSlots = (instance, children, optimized) => {\n  const slots = instance.slots = createInternalObject();\n  if (instance.vnode.shapeFlag & 32) {\n    const type = children._;\n    if (type) {\n      assignSlots(slots, children, optimized);\n      if (optimized) {\n        def(slots, \"_\", type, true);\n      }\n    } else {\n      normalizeObjectSlots(children, slots);\n    }\n  } else if (children) {\n    normalizeVNodeSlots(instance, children);\n  }\n};\nconst updateSlots = (instance, children, optimized) => {\n  const { vnode, slots } = instance;\n  let needDeletionCheck = true;\n  let deletionComparisonTarget = EMPTY_OBJ;\n  if (vnode.shapeFlag & 32) {\n    const type = children._;\n    if (type) {\n      if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n        assignSlots(slots, children, optimized);\n        trigger(instance, \"set\", \"$slots\");\n      } else if (optimized && type === 1) {\n        needDeletionCheck = false;\n      } else {\n        assignSlots(slots, children, optimized);\n      }\n    } else {\n      needDeletionCheck = !children.$stable;\n      normalizeObjectSlots(children, slots);\n    }\n    deletionComparisonTarget = children;\n  } else if (children) {\n    normalizeVNodeSlots(instance, children);\n    deletionComparisonTarget = { default: 1 };\n  }\n  if (needDeletionCheck) {\n    for (const key in slots) {\n      if (!isInternalKey(key) && deletionComparisonTarget[key] == null) {\n        delete slots[key];\n      }\n    }\n  }\n};\n\nlet supported;\nlet perf;\nfunction startMeasure(instance, type) {\n  if (instance.appContext.config.performance && isSupported()) {\n    perf.mark(`vue-${type}-${instance.uid}`);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    devtoolsPerfStart(instance, type, isSupported() ? perf.now() : Date.now());\n  }\n}\nfunction endMeasure(instance, type) {\n  if (instance.appContext.config.performance && isSupported()) {\n    const startTag = `vue-${type}-${instance.uid}`;\n    const endTag = startTag + `:end`;\n    perf.mark(endTag);\n    perf.measure(\n      `<${formatComponentName(instance, instance.type)}> ${type}`,\n      startTag,\n      endTag\n    );\n    perf.clearMarks(startTag);\n    perf.clearMarks(endTag);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    devtoolsPerfEnd(instance, type, isSupported() ? perf.now() : Date.now());\n  }\n}\nfunction isSupported() {\n  if (supported !== void 0) {\n    return supported;\n  }\n  if (typeof window !== \"undefined\" && window.performance) {\n    supported = true;\n    perf = window.performance;\n  } else {\n    supported = false;\n  }\n  return supported;\n}\n\nfunction initFeatureFlags() {\n  const needWarn = [];\n  if (typeof __VUE_OPTIONS_API__ !== \"boolean\") {\n    !!(process.env.NODE_ENV !== \"production\") && needWarn.push(`__VUE_OPTIONS_API__`);\n    getGlobalThis().__VUE_OPTIONS_API__ = true;\n  }\n  if (typeof __VUE_PROD_DEVTOOLS__ !== \"boolean\") {\n    !!(process.env.NODE_ENV !== \"production\") && needWarn.push(`__VUE_PROD_DEVTOOLS__`);\n    getGlobalThis().__VUE_PROD_DEVTOOLS__ = false;\n  }\n  if (typeof __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ !== \"boolean\") {\n    !!(process.env.NODE_ENV !== \"production\") && needWarn.push(`__VUE_PROD_HYDRATION_MISMATCH_DETAILS__`);\n    getGlobalThis().__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ = false;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && needWarn.length) {\n    const multi = needWarn.length > 1;\n    console.warn(\n      `Feature flag${multi ? `s` : ``} ${needWarn.join(\", \")} ${multi ? `are` : `is`} not explicitly defined. You are running the esm-bundler build of Vue, which expects these compile-time feature flags to be globally injected via the bundler config in order to get better tree-shaking in the production bundle.\n\nFor more details, see https://link.vuejs.org/feature-flags.`\n    );\n  }\n}\n\nconst queuePostRenderEffect = queueEffectWithSuspense ;\nfunction createRenderer(options) {\n  return baseCreateRenderer(options);\n}\nfunction createHydrationRenderer(options) {\n  return baseCreateRenderer(options, createHydrationFunctions);\n}\nfunction baseCreateRenderer(options, createHydrationFns) {\n  {\n    initFeatureFlags();\n  }\n  const target = getGlobalThis();\n  target.__VUE__ = true;\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    setDevtoolsHook$1(target.__VUE_DEVTOOLS_GLOBAL_HOOK__, target);\n  }\n  const {\n    insert: hostInsert,\n    remove: hostRemove,\n    patchProp: hostPatchProp,\n    createElement: hostCreateElement,\n    createText: hostCreateText,\n    createComment: hostCreateComment,\n    setText: hostSetText,\n    setElementText: hostSetElementText,\n    parentNode: hostParentNode,\n    nextSibling: hostNextSibling,\n    setScopeId: hostSetScopeId = NOOP,\n    insertStaticContent: hostInsertStaticContent\n  } = options;\n  const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, namespace = void 0, slotScopeIds = null, optimized = !!(process.env.NODE_ENV !== \"production\") && isHmrUpdating ? false : !!n2.dynamicChildren) => {\n    if (n1 === n2) {\n      return;\n    }\n    if (n1 && !isSameVNodeType(n1, n2)) {\n      anchor = getNextHostNode(n1);\n      unmount(n1, parentComponent, parentSuspense, true);\n      n1 = null;\n    }\n    if (n2.patchFlag === -2) {\n      optimized = false;\n      n2.dynamicChildren = null;\n    }\n    const { type, ref, shapeFlag } = n2;\n    switch (type) {\n      case Text:\n        processText(n1, n2, container, anchor);\n        break;\n      case Comment:\n        processCommentNode(n1, n2, container, anchor);\n        break;\n      case Static:\n        if (n1 == null) {\n          mountStaticNode(n2, container, anchor, namespace);\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          patchStaticNode(n1, n2, container, namespace);\n        }\n        break;\n      case Fragment:\n        processFragment(\n          n1,\n          n2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        break;\n      default:\n        if (shapeFlag & 1) {\n          processElement(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        } else if (shapeFlag & 6) {\n          processComponent(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        } else if (shapeFlag & 64) {\n          type.process(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized,\n            internals\n          );\n        } else if (shapeFlag & 128) {\n          type.process(\n            n1,\n            n2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized,\n            internals\n          );\n        } else if (!!(process.env.NODE_ENV !== \"production\")) {\n          warn$1(\"Invalid VNode type:\", type, `(${typeof type})`);\n        }\n    }\n    if (ref != null && parentComponent) {\n      setRef(ref, n1 && n1.ref, parentSuspense, n2 || n1, !n2);\n    }\n  };\n  const processText = (n1, n2, container, anchor) => {\n    if (n1 == null) {\n      hostInsert(\n        n2.el = hostCreateText(n2.children),\n        container,\n        anchor\n      );\n    } else {\n      const el = n2.el = n1.el;\n      if (n2.children !== n1.children) {\n        hostSetText(el, n2.children);\n      }\n    }\n  };\n  const processCommentNode = (n1, n2, container, anchor) => {\n    if (n1 == null) {\n      hostInsert(\n        n2.el = hostCreateComment(n2.children || \"\"),\n        container,\n        anchor\n      );\n    } else {\n      n2.el = n1.el;\n    }\n  };\n  const mountStaticNode = (n2, container, anchor, namespace) => {\n    [n2.el, n2.anchor] = hostInsertStaticContent(\n      n2.children,\n      container,\n      anchor,\n      namespace,\n      n2.el,\n      n2.anchor\n    );\n  };\n  const patchStaticNode = (n1, n2, container, namespace) => {\n    if (n2.children !== n1.children) {\n      const anchor = hostNextSibling(n1.anchor);\n      removeStaticNode(n1);\n      [n2.el, n2.anchor] = hostInsertStaticContent(\n        n2.children,\n        container,\n        anchor,\n        namespace\n      );\n    } else {\n      n2.el = n1.el;\n      n2.anchor = n1.anchor;\n    }\n  };\n  const moveStaticNode = ({ el, anchor }, container, nextSibling) => {\n    let next;\n    while (el && el !== anchor) {\n      next = hostNextSibling(el);\n      hostInsert(el, container, nextSibling);\n      el = next;\n    }\n    hostInsert(anchor, container, nextSibling);\n  };\n  const removeStaticNode = ({ el, anchor }) => {\n    let next;\n    while (el && el !== anchor) {\n      next = hostNextSibling(el);\n      hostRemove(el);\n      el = next;\n    }\n    hostRemove(anchor);\n  };\n  const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    if (n2.type === \"svg\") {\n      namespace = \"svg\";\n    } else if (n2.type === \"math\") {\n      namespace = \"mathml\";\n    }\n    if (n1 == null) {\n      mountElement(\n        n2,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n    } else {\n      patchElement(\n        n1,\n        n2,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n    }\n  };\n  const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    let el;\n    let vnodeHook;\n    const { props, shapeFlag, transition, dirs } = vnode;\n    el = vnode.el = hostCreateElement(\n      vnode.type,\n      namespace,\n      props && props.is,\n      props\n    );\n    if (shapeFlag & 8) {\n      hostSetElementText(el, vnode.children);\n    } else if (shapeFlag & 16) {\n      mountChildren(\n        vnode.children,\n        el,\n        null,\n        parentComponent,\n        parentSuspense,\n        resolveChildrenNamespace(vnode, namespace),\n        slotScopeIds,\n        optimized\n      );\n    }\n    if (dirs) {\n      invokeDirectiveHook(vnode, null, parentComponent, \"created\");\n    }\n    setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent);\n    if (props) {\n      for (const key in props) {\n        if (key !== \"value\" && !isReservedProp(key)) {\n          hostPatchProp(el, key, null, props[key], namespace, parentComponent);\n        }\n      }\n      if (\"value\" in props) {\n        hostPatchProp(el, \"value\", null, props.value, namespace);\n      }\n      if (vnodeHook = props.onVnodeBeforeMount) {\n        invokeVNodeHook(vnodeHook, parentComponent, vnode);\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      def(el, \"__vnode\", vnode, true);\n      def(el, \"__vueParentComponent\", parentComponent, true);\n    }\n    if (dirs) {\n      invokeDirectiveHook(vnode, null, parentComponent, \"beforeMount\");\n    }\n    const needCallTransitionHooks = needTransition(parentSuspense, transition);\n    if (needCallTransitionHooks) {\n      transition.beforeEnter(el);\n    }\n    hostInsert(el, container, anchor);\n    if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) {\n      queuePostRenderEffect(() => {\n        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);\n        needCallTransitionHooks && transition.enter(el);\n        dirs && invokeDirectiveHook(vnode, null, parentComponent, \"mounted\");\n      }, parentSuspense);\n    }\n  };\n  const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => {\n    if (scopeId) {\n      hostSetScopeId(el, scopeId);\n    }\n    if (slotScopeIds) {\n      for (let i = 0; i < slotScopeIds.length; i++) {\n        hostSetScopeId(el, slotScopeIds[i]);\n      }\n    }\n    if (parentComponent) {\n      let subTree = parentComponent.subTree;\n      if (!!(process.env.NODE_ENV !== \"production\") && subTree.patchFlag > 0 && subTree.patchFlag & 2048) {\n        subTree = filterSingleRoot(subTree.children) || subTree;\n      }\n      if (vnode === subTree || isSuspense(subTree.type) && (subTree.ssContent === vnode || subTree.ssFallback === vnode)) {\n        const parentVNode = parentComponent.vnode;\n        setScopeId(\n          el,\n          parentVNode,\n          parentVNode.scopeId,\n          parentVNode.slotScopeIds,\n          parentComponent.parent\n        );\n      }\n    }\n  };\n  const mountChildren = (children, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, start = 0) => {\n    for (let i = start; i < children.length; i++) {\n      const child = children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]);\n      patch(\n        null,\n        child,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n    }\n  };\n  const patchElement = (n1, n2, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    const el = n2.el = n1.el;\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      el.__vnode = n2;\n    }\n    let { patchFlag, dynamicChildren, dirs } = n2;\n    patchFlag |= n1.patchFlag & 16;\n    const oldProps = n1.props || EMPTY_OBJ;\n    const newProps = n2.props || EMPTY_OBJ;\n    let vnodeHook;\n    parentComponent && toggleRecurse(parentComponent, false);\n    if (vnodeHook = newProps.onVnodeBeforeUpdate) {\n      invokeVNodeHook(vnodeHook, parentComponent, n2, n1);\n    }\n    if (dirs) {\n      invokeDirectiveHook(n2, n1, parentComponent, \"beforeUpdate\");\n    }\n    parentComponent && toggleRecurse(parentComponent, true);\n    if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n      patchFlag = 0;\n      optimized = false;\n      dynamicChildren = null;\n    }\n    if (oldProps.innerHTML && newProps.innerHTML == null || oldProps.textContent && newProps.textContent == null) {\n      hostSetElementText(el, \"\");\n    }\n    if (dynamicChildren) {\n      patchBlockChildren(\n        n1.dynamicChildren,\n        dynamicChildren,\n        el,\n        parentComponent,\n        parentSuspense,\n        resolveChildrenNamespace(n2, namespace),\n        slotScopeIds\n      );\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        traverseStaticChildren(n1, n2);\n      }\n    } else if (!optimized) {\n      patchChildren(\n        n1,\n        n2,\n        el,\n        null,\n        parentComponent,\n        parentSuspense,\n        resolveChildrenNamespace(n2, namespace),\n        slotScopeIds,\n        false\n      );\n    }\n    if (patchFlag > 0) {\n      if (patchFlag & 16) {\n        patchProps(el, oldProps, newProps, parentComponent, namespace);\n      } else {\n        if (patchFlag & 2) {\n          if (oldProps.class !== newProps.class) {\n            hostPatchProp(el, \"class\", null, newProps.class, namespace);\n          }\n        }\n        if (patchFlag & 4) {\n          hostPatchProp(el, \"style\", oldProps.style, newProps.style, namespace);\n        }\n        if (patchFlag & 8) {\n          const propsToUpdate = n2.dynamicProps;\n          for (let i = 0; i < propsToUpdate.length; i++) {\n            const key = propsToUpdate[i];\n            const prev = oldProps[key];\n            const next = newProps[key];\n            if (next !== prev || key === \"value\") {\n              hostPatchProp(el, key, prev, next, namespace, parentComponent);\n            }\n          }\n        }\n      }\n      if (patchFlag & 1) {\n        if (n1.children !== n2.children) {\n          hostSetElementText(el, n2.children);\n        }\n      }\n    } else if (!optimized && dynamicChildren == null) {\n      patchProps(el, oldProps, newProps, parentComponent, namespace);\n    }\n    if ((vnodeHook = newProps.onVnodeUpdated) || dirs) {\n      queuePostRenderEffect(() => {\n        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1);\n        dirs && invokeDirectiveHook(n2, n1, parentComponent, \"updated\");\n      }, parentSuspense);\n    }\n  };\n  const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, namespace, slotScopeIds) => {\n    for (let i = 0; i < newChildren.length; i++) {\n      const oldVNode = oldChildren[i];\n      const newVNode = newChildren[i];\n      const container = (\n        // oldVNode may be an errored async setup() component inside Suspense\n        // which will not have a mounted element\n        oldVNode.el && // - In the case of a Fragment, we need to provide the actual parent\n        // of the Fragment itself so it can move its children.\n        (oldVNode.type === Fragment || // - In the case of different nodes, there is going to be a replacement\n        // which also requires the correct parent container\n        !isSameVNodeType(oldVNode, newVNode) || // - In the case of a component, it could contain anything.\n        oldVNode.shapeFlag & (6 | 64)) ? hostParentNode(oldVNode.el) : (\n          // In other cases, the parent container is not actually used so we\n          // just pass the block element here to avoid a DOM parentNode call.\n          fallbackContainer\n        )\n      );\n      patch(\n        oldVNode,\n        newVNode,\n        container,\n        null,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        true\n      );\n    }\n  };\n  const patchProps = (el, oldProps, newProps, parentComponent, namespace) => {\n    if (oldProps !== newProps) {\n      if (oldProps !== EMPTY_OBJ) {\n        for (const key in oldProps) {\n          if (!isReservedProp(key) && !(key in newProps)) {\n            hostPatchProp(\n              el,\n              key,\n              oldProps[key],\n              null,\n              namespace,\n              parentComponent\n            );\n          }\n        }\n      }\n      for (const key in newProps) {\n        if (isReservedProp(key)) continue;\n        const next = newProps[key];\n        const prev = oldProps[key];\n        if (next !== prev && key !== \"value\") {\n          hostPatchProp(el, key, prev, next, namespace, parentComponent);\n        }\n      }\n      if (\"value\" in newProps) {\n        hostPatchProp(el, \"value\", oldProps.value, newProps.value, namespace);\n      }\n    }\n  };\n  const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText(\"\");\n    const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText(\"\");\n    let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2;\n    if (!!(process.env.NODE_ENV !== \"production\") && // #5523 dev root fragment may inherit directives\n    (isHmrUpdating || patchFlag & 2048)) {\n      patchFlag = 0;\n      optimized = false;\n      dynamicChildren = null;\n    }\n    if (fragmentSlotScopeIds) {\n      slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;\n    }\n    if (n1 == null) {\n      hostInsert(fragmentStartAnchor, container, anchor);\n      hostInsert(fragmentEndAnchor, container, anchor);\n      mountChildren(\n        // #10007\n        // such fragment like `<></>` will be compiled into\n        // a fragment which doesn't have a children.\n        // In this case fallback to an empty array\n        n2.children || [],\n        container,\n        fragmentEndAnchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n    } else {\n      if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && // #2715 the previous fragment could've been a BAILed one as a result\n      // of renderSlot() with no valid children\n      n1.dynamicChildren) {\n        patchBlockChildren(\n          n1.dynamicChildren,\n          dynamicChildren,\n          container,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds\n        );\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          traverseStaticChildren(n1, n2);\n        } else if (\n          // #2080 if the stable fragment has a key, it's a <template v-for> that may\n          //  get moved around. Make sure all root level vnodes inherit el.\n          // #2134 or if it's a component root, it may also get moved around\n          // as the component is being moved.\n          n2.key != null || parentComponent && n2 === parentComponent.subTree\n        ) {\n          traverseStaticChildren(\n            n1,\n            n2,\n            true\n            /* shallow */\n          );\n        }\n      } else {\n        patchChildren(\n          n1,\n          n2,\n          container,\n          fragmentEndAnchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n      }\n    }\n  };\n  const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    n2.slotScopeIds = slotScopeIds;\n    if (n1 == null) {\n      if (n2.shapeFlag & 512) {\n        parentComponent.ctx.activate(\n          n2,\n          container,\n          anchor,\n          namespace,\n          optimized\n        );\n      } else {\n        mountComponent(\n          n2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          optimized\n        );\n      }\n    } else {\n      updateComponent(n1, n2, optimized);\n    }\n  };\n  const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, namespace, optimized) => {\n    const instance = (initialVNode.component = createComponentInstance(\n      initialVNode,\n      parentComponent,\n      parentSuspense\n    ));\n    if (!!(process.env.NODE_ENV !== \"production\") && instance.type.__hmrId) {\n      registerHMR(instance);\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      pushWarningContext(initialVNode);\n      startMeasure(instance, `mount`);\n    }\n    if (isKeepAlive(initialVNode)) {\n      instance.ctx.renderer = internals;\n    }\n    {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        startMeasure(instance, `init`);\n      }\n      setupComponent(instance, false, optimized);\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        endMeasure(instance, `init`);\n      }\n    }\n    if (instance.asyncDep) {\n      if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) initialVNode.el = null;\n      parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect, optimized);\n      if (!initialVNode.el) {\n        const placeholder = instance.subTree = createVNode(Comment);\n        processCommentNode(null, placeholder, container, anchor);\n      }\n    } else {\n      setupRenderEffect(\n        instance,\n        initialVNode,\n        container,\n        anchor,\n        parentSuspense,\n        namespace,\n        optimized\n      );\n    }\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      popWarningContext();\n      endMeasure(instance, `mount`);\n    }\n  };\n  const updateComponent = (n1, n2, optimized) => {\n    const instance = n2.component = n1.component;\n    if (shouldUpdateComponent(n1, n2, optimized)) {\n      if (instance.asyncDep && !instance.asyncResolved) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          pushWarningContext(n2);\n        }\n        updateComponentPreRender(instance, n2, optimized);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          popWarningContext();\n        }\n        return;\n      } else {\n        instance.next = n2;\n        instance.update();\n      }\n    } else {\n      n2.el = n1.el;\n      instance.vnode = n2;\n    }\n  };\n  const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, namespace, optimized) => {\n    const componentUpdateFn = () => {\n      if (!instance.isMounted) {\n        let vnodeHook;\n        const { el, props } = initialVNode;\n        const { bm, m, parent, root, type } = instance;\n        const isAsyncWrapperVNode = isAsyncWrapper(initialVNode);\n        toggleRecurse(instance, false);\n        if (bm) {\n          invokeArrayFns(bm);\n        }\n        if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeBeforeMount)) {\n          invokeVNodeHook(vnodeHook, parent, initialVNode);\n        }\n        toggleRecurse(instance, true);\n        if (el && hydrateNode) {\n          const hydrateSubTree = () => {\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              startMeasure(instance, `render`);\n            }\n            instance.subTree = renderComponentRoot(instance);\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              endMeasure(instance, `render`);\n            }\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              startMeasure(instance, `hydrate`);\n            }\n            hydrateNode(\n              el,\n              instance.subTree,\n              instance,\n              parentSuspense,\n              null\n            );\n            if (!!(process.env.NODE_ENV !== \"production\")) {\n              endMeasure(instance, `hydrate`);\n            }\n          };\n          if (isAsyncWrapperVNode && type.__asyncHydrate) {\n            type.__asyncHydrate(\n              el,\n              instance,\n              hydrateSubTree\n            );\n          } else {\n            hydrateSubTree();\n          }\n        } else {\n          if (root.ce) {\n            root.ce._injectChildStyle(type);\n          }\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            startMeasure(instance, `render`);\n          }\n          const subTree = instance.subTree = renderComponentRoot(instance);\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            endMeasure(instance, `render`);\n          }\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            startMeasure(instance, `patch`);\n          }\n          patch(\n            null,\n            subTree,\n            container,\n            anchor,\n            instance,\n            parentSuspense,\n            namespace\n          );\n          if (!!(process.env.NODE_ENV !== \"production\")) {\n            endMeasure(instance, `patch`);\n          }\n          initialVNode.el = subTree.el;\n        }\n        if (m) {\n          queuePostRenderEffect(m, parentSuspense);\n        }\n        if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeMounted)) {\n          const scopedInitialVNode = initialVNode;\n          queuePostRenderEffect(\n            () => invokeVNodeHook(vnodeHook, parent, scopedInitialVNode),\n            parentSuspense\n          );\n        }\n        if (initialVNode.shapeFlag & 256 || parent && isAsyncWrapper(parent.vnode) && parent.vnode.shapeFlag & 256) {\n          instance.a && queuePostRenderEffect(instance.a, parentSuspense);\n        }\n        instance.isMounted = true;\n        if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n          devtoolsComponentAdded(instance);\n        }\n        initialVNode = container = anchor = null;\n      } else {\n        let { next, bu, u, parent, vnode } = instance;\n        {\n          const nonHydratedAsyncRoot = locateNonHydratedAsyncRoot(instance);\n          if (nonHydratedAsyncRoot) {\n            if (next) {\n              next.el = vnode.el;\n              updateComponentPreRender(instance, next, optimized);\n            }\n            nonHydratedAsyncRoot.asyncDep.then(() => {\n              if (!instance.isUnmounted) {\n                componentUpdateFn();\n              }\n            });\n            return;\n          }\n        }\n        let originNext = next;\n        let vnodeHook;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          pushWarningContext(next || instance.vnode);\n        }\n        toggleRecurse(instance, false);\n        if (next) {\n          next.el = vnode.el;\n          updateComponentPreRender(instance, next, optimized);\n        } else {\n          next = vnode;\n        }\n        if (bu) {\n          invokeArrayFns(bu);\n        }\n        if (vnodeHook = next.props && next.props.onVnodeBeforeUpdate) {\n          invokeVNodeHook(vnodeHook, parent, next, vnode);\n        }\n        toggleRecurse(instance, true);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          startMeasure(instance, `render`);\n        }\n        const nextTree = renderComponentRoot(instance);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          endMeasure(instance, `render`);\n        }\n        const prevTree = instance.subTree;\n        instance.subTree = nextTree;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          startMeasure(instance, `patch`);\n        }\n        patch(\n          prevTree,\n          nextTree,\n          // parent may have changed if it's in a teleport\n          hostParentNode(prevTree.el),\n          // anchor may have changed if it's in a fragment\n          getNextHostNode(prevTree),\n          instance,\n          parentSuspense,\n          namespace\n        );\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          endMeasure(instance, `patch`);\n        }\n        next.el = nextTree.el;\n        if (originNext === null) {\n          updateHOCHostEl(instance, nextTree.el);\n        }\n        if (u) {\n          queuePostRenderEffect(u, parentSuspense);\n        }\n        if (vnodeHook = next.props && next.props.onVnodeUpdated) {\n          queuePostRenderEffect(\n            () => invokeVNodeHook(vnodeHook, parent, next, vnode),\n            parentSuspense\n          );\n        }\n        if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n          devtoolsComponentUpdated(instance);\n        }\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          popWarningContext();\n        }\n      }\n    };\n    instance.scope.on();\n    const effect = instance.effect = new ReactiveEffect(componentUpdateFn);\n    instance.scope.off();\n    const update = instance.update = effect.run.bind(effect);\n    const job = instance.job = effect.runIfDirty.bind(effect);\n    job.i = instance;\n    job.id = instance.uid;\n    effect.scheduler = () => queueJob(job);\n    toggleRecurse(instance, true);\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      effect.onTrack = instance.rtc ? (e) => invokeArrayFns(instance.rtc, e) : void 0;\n      effect.onTrigger = instance.rtg ? (e) => invokeArrayFns(instance.rtg, e) : void 0;\n    }\n    update();\n  };\n  const updateComponentPreRender = (instance, nextVNode, optimized) => {\n    nextVNode.component = instance;\n    const prevProps = instance.vnode.props;\n    instance.vnode = nextVNode;\n    instance.next = null;\n    updateProps(instance, nextVNode.props, prevProps, optimized);\n    updateSlots(instance, nextVNode.children, optimized);\n    pauseTracking();\n    flushPreFlushCbs(instance);\n    resetTracking();\n  };\n  const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized = false) => {\n    const c1 = n1 && n1.children;\n    const prevShapeFlag = n1 ? n1.shapeFlag : 0;\n    const c2 = n2.children;\n    const { patchFlag, shapeFlag } = n2;\n    if (patchFlag > 0) {\n      if (patchFlag & 128) {\n        patchKeyedChildren(\n          c1,\n          c2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        return;\n      } else if (patchFlag & 256) {\n        patchUnkeyedChildren(\n          c1,\n          c2,\n          container,\n          anchor,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        return;\n      }\n    }\n    if (shapeFlag & 8) {\n      if (prevShapeFlag & 16) {\n        unmountChildren(c1, parentComponent, parentSuspense);\n      }\n      if (c2 !== c1) {\n        hostSetElementText(container, c2);\n      }\n    } else {\n      if (prevShapeFlag & 16) {\n        if (shapeFlag & 16) {\n          patchKeyedChildren(\n            c1,\n            c2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        } else {\n          unmountChildren(c1, parentComponent, parentSuspense, true);\n        }\n      } else {\n        if (prevShapeFlag & 8) {\n          hostSetElementText(container, \"\");\n        }\n        if (shapeFlag & 16) {\n          mountChildren(\n            c2,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        }\n      }\n    }\n  };\n  const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    c1 = c1 || EMPTY_ARR;\n    c2 = c2 || EMPTY_ARR;\n    const oldLength = c1.length;\n    const newLength = c2.length;\n    const commonLength = Math.min(oldLength, newLength);\n    let i;\n    for (i = 0; i < commonLength; i++) {\n      const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);\n      patch(\n        c1[i],\n        nextChild,\n        container,\n        null,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n    }\n    if (oldLength > newLength) {\n      unmountChildren(\n        c1,\n        parentComponent,\n        parentSuspense,\n        true,\n        false,\n        commonLength\n      );\n    } else {\n      mountChildren(\n        c2,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized,\n        commonLength\n      );\n    }\n  };\n  const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => {\n    let i = 0;\n    const l2 = c2.length;\n    let e1 = c1.length - 1;\n    let e2 = l2 - 1;\n    while (i <= e1 && i <= e2) {\n      const n1 = c1[i];\n      const n2 = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);\n      if (isSameVNodeType(n1, n2)) {\n        patch(\n          n1,\n          n2,\n          container,\n          null,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n      } else {\n        break;\n      }\n      i++;\n    }\n    while (i <= e1 && i <= e2) {\n      const n1 = c1[e1];\n      const n2 = c2[e2] = optimized ? cloneIfMounted(c2[e2]) : normalizeVNode(c2[e2]);\n      if (isSameVNodeType(n1, n2)) {\n        patch(\n          n1,\n          n2,\n          container,\n          null,\n          parentComponent,\n          parentSuspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n      } else {\n        break;\n      }\n      e1--;\n      e2--;\n    }\n    if (i > e1) {\n      if (i <= e2) {\n        const nextPos = e2 + 1;\n        const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor;\n        while (i <= e2) {\n          patch(\n            null,\n            c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]),\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n          i++;\n        }\n      }\n    } else if (i > e2) {\n      while (i <= e1) {\n        unmount(c1[i], parentComponent, parentSuspense, true);\n        i++;\n      }\n    } else {\n      const s1 = i;\n      const s2 = i;\n      const keyToNewIndexMap = /* @__PURE__ */ new Map();\n      for (i = s2; i <= e2; i++) {\n        const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]);\n        if (nextChild.key != null) {\n          if (!!(process.env.NODE_ENV !== \"production\") && keyToNewIndexMap.has(nextChild.key)) {\n            warn$1(\n              `Duplicate keys found during update:`,\n              JSON.stringify(nextChild.key),\n              `Make sure keys are unique.`\n            );\n          }\n          keyToNewIndexMap.set(nextChild.key, i);\n        }\n      }\n      let j;\n      let patched = 0;\n      const toBePatched = e2 - s2 + 1;\n      let moved = false;\n      let maxNewIndexSoFar = 0;\n      const newIndexToOldIndexMap = new Array(toBePatched);\n      for (i = 0; i < toBePatched; i++) newIndexToOldIndexMap[i] = 0;\n      for (i = s1; i <= e1; i++) {\n        const prevChild = c1[i];\n        if (patched >= toBePatched) {\n          unmount(prevChild, parentComponent, parentSuspense, true);\n          continue;\n        }\n        let newIndex;\n        if (prevChild.key != null) {\n          newIndex = keyToNewIndexMap.get(prevChild.key);\n        } else {\n          for (j = s2; j <= e2; j++) {\n            if (newIndexToOldIndexMap[j - s2] === 0 && isSameVNodeType(prevChild, c2[j])) {\n              newIndex = j;\n              break;\n            }\n          }\n        }\n        if (newIndex === void 0) {\n          unmount(prevChild, parentComponent, parentSuspense, true);\n        } else {\n          newIndexToOldIndexMap[newIndex - s2] = i + 1;\n          if (newIndex >= maxNewIndexSoFar) {\n            maxNewIndexSoFar = newIndex;\n          } else {\n            moved = true;\n          }\n          patch(\n            prevChild,\n            c2[newIndex],\n            container,\n            null,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n          patched++;\n        }\n      }\n      const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : EMPTY_ARR;\n      j = increasingNewIndexSequence.length - 1;\n      for (i = toBePatched - 1; i >= 0; i--) {\n        const nextIndex = s2 + i;\n        const nextChild = c2[nextIndex];\n        const anchor = nextIndex + 1 < l2 ? c2[nextIndex + 1].el : parentAnchor;\n        if (newIndexToOldIndexMap[i] === 0) {\n          patch(\n            null,\n            nextChild,\n            container,\n            anchor,\n            parentComponent,\n            parentSuspense,\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n        } else if (moved) {\n          if (j < 0 || i !== increasingNewIndexSequence[j]) {\n            move(nextChild, container, anchor, 2);\n          } else {\n            j--;\n          }\n        }\n      }\n    }\n  };\n  const move = (vnode, container, anchor, moveType, parentSuspense = null) => {\n    const { el, type, transition, children, shapeFlag } = vnode;\n    if (shapeFlag & 6) {\n      move(vnode.component.subTree, container, anchor, moveType);\n      return;\n    }\n    if (shapeFlag & 128) {\n      vnode.suspense.move(container, anchor, moveType);\n      return;\n    }\n    if (shapeFlag & 64) {\n      type.move(vnode, container, anchor, internals);\n      return;\n    }\n    if (type === Fragment) {\n      hostInsert(el, container, anchor);\n      for (let i = 0; i < children.length; i++) {\n        move(children[i], container, anchor, moveType);\n      }\n      hostInsert(vnode.anchor, container, anchor);\n      return;\n    }\n    if (type === Static) {\n      moveStaticNode(vnode, container, anchor);\n      return;\n    }\n    const needTransition2 = moveType !== 2 && shapeFlag & 1 && transition;\n    if (needTransition2) {\n      if (moveType === 0) {\n        transition.beforeEnter(el);\n        hostInsert(el, container, anchor);\n        queuePostRenderEffect(() => transition.enter(el), parentSuspense);\n      } else {\n        const { leave, delayLeave, afterLeave } = transition;\n        const remove2 = () => hostInsert(el, container, anchor);\n        const performLeave = () => {\n          leave(el, () => {\n            remove2();\n            afterLeave && afterLeave();\n          });\n        };\n        if (delayLeave) {\n          delayLeave(el, remove2, performLeave);\n        } else {\n          performLeave();\n        }\n      }\n    } else {\n      hostInsert(el, container, anchor);\n    }\n  };\n  const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => {\n    const {\n      type,\n      props,\n      ref,\n      children,\n      dynamicChildren,\n      shapeFlag,\n      patchFlag,\n      dirs,\n      cacheIndex\n    } = vnode;\n    if (patchFlag === -2) {\n      optimized = false;\n    }\n    if (ref != null) {\n      setRef(ref, null, parentSuspense, vnode, true);\n    }\n    if (cacheIndex != null) {\n      parentComponent.renderCache[cacheIndex] = void 0;\n    }\n    if (shapeFlag & 256) {\n      parentComponent.ctx.deactivate(vnode);\n      return;\n    }\n    const shouldInvokeDirs = shapeFlag & 1 && dirs;\n    const shouldInvokeVnodeHook = !isAsyncWrapper(vnode);\n    let vnodeHook;\n    if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeBeforeUnmount)) {\n      invokeVNodeHook(vnodeHook, parentComponent, vnode);\n    }\n    if (shapeFlag & 6) {\n      unmountComponent(vnode.component, parentSuspense, doRemove);\n    } else {\n      if (shapeFlag & 128) {\n        vnode.suspense.unmount(parentSuspense, doRemove);\n        return;\n      }\n      if (shouldInvokeDirs) {\n        invokeDirectiveHook(vnode, null, parentComponent, \"beforeUnmount\");\n      }\n      if (shapeFlag & 64) {\n        vnode.type.remove(\n          vnode,\n          parentComponent,\n          parentSuspense,\n          internals,\n          doRemove\n        );\n      } else if (dynamicChildren && // #5154\n      // when v-once is used inside a block, setBlockTracking(-1) marks the\n      // parent block with hasOnce: true\n      // so that it doesn't take the fast path during unmount - otherwise\n      // components nested in v-once are never unmounted.\n      !dynamicChildren.hasOnce && // #1153: fast path should not be taken for non-stable (v-for) fragments\n      (type !== Fragment || patchFlag > 0 && patchFlag & 64)) {\n        unmountChildren(\n          dynamicChildren,\n          parentComponent,\n          parentSuspense,\n          false,\n          true\n        );\n      } else if (type === Fragment && patchFlag & (128 | 256) || !optimized && shapeFlag & 16) {\n        unmountChildren(children, parentComponent, parentSuspense);\n      }\n      if (doRemove) {\n        remove(vnode);\n      }\n    }\n    if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeUnmounted) || shouldInvokeDirs) {\n      queuePostRenderEffect(() => {\n        vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode);\n        shouldInvokeDirs && invokeDirectiveHook(vnode, null, parentComponent, \"unmounted\");\n      }, parentSuspense);\n    }\n  };\n  const remove = (vnode) => {\n    const { type, el, anchor, transition } = vnode;\n    if (type === Fragment) {\n      if (!!(process.env.NODE_ENV !== \"production\") && vnode.patchFlag > 0 && vnode.patchFlag & 2048 && transition && !transition.persisted) {\n        vnode.children.forEach((child) => {\n          if (child.type === Comment) {\n            hostRemove(child.el);\n          } else {\n            remove(child);\n          }\n        });\n      } else {\n        removeFragment(el, anchor);\n      }\n      return;\n    }\n    if (type === Static) {\n      removeStaticNode(vnode);\n      return;\n    }\n    const performRemove = () => {\n      hostRemove(el);\n      if (transition && !transition.persisted && transition.afterLeave) {\n        transition.afterLeave();\n      }\n    };\n    if (vnode.shapeFlag & 1 && transition && !transition.persisted) {\n      const { leave, delayLeave } = transition;\n      const performLeave = () => leave(el, performRemove);\n      if (delayLeave) {\n        delayLeave(vnode.el, performRemove, performLeave);\n      } else {\n        performLeave();\n      }\n    } else {\n      performRemove();\n    }\n  };\n  const removeFragment = (cur, end) => {\n    let next;\n    while (cur !== end) {\n      next = hostNextSibling(cur);\n      hostRemove(cur);\n      cur = next;\n    }\n    hostRemove(end);\n  };\n  const unmountComponent = (instance, parentSuspense, doRemove) => {\n    if (!!(process.env.NODE_ENV !== \"production\") && instance.type.__hmrId) {\n      unregisterHMR(instance);\n    }\n    const { bum, scope, job, subTree, um, m, a } = instance;\n    invalidateMount(m);\n    invalidateMount(a);\n    if (bum) {\n      invokeArrayFns(bum);\n    }\n    scope.stop();\n    if (job) {\n      job.flags |= 8;\n      unmount(subTree, instance, parentSuspense, doRemove);\n    }\n    if (um) {\n      queuePostRenderEffect(um, parentSuspense);\n    }\n    queuePostRenderEffect(() => {\n      instance.isUnmounted = true;\n    }, parentSuspense);\n    if (parentSuspense && parentSuspense.pendingBranch && !parentSuspense.isUnmounted && instance.asyncDep && !instance.asyncResolved && instance.suspenseId === parentSuspense.pendingId) {\n      parentSuspense.deps--;\n      if (parentSuspense.deps === 0) {\n        parentSuspense.resolve();\n      }\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      devtoolsComponentRemoved(instance);\n    }\n  };\n  const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => {\n    for (let i = start; i < children.length; i++) {\n      unmount(children[i], parentComponent, parentSuspense, doRemove, optimized);\n    }\n  };\n  const getNextHostNode = (vnode) => {\n    if (vnode.shapeFlag & 6) {\n      return getNextHostNode(vnode.component.subTree);\n    }\n    if (vnode.shapeFlag & 128) {\n      return vnode.suspense.next();\n    }\n    const el = hostNextSibling(vnode.anchor || vnode.el);\n    const teleportEnd = el && el[TeleportEndKey];\n    return teleportEnd ? hostNextSibling(teleportEnd) : el;\n  };\n  let isFlushing = false;\n  const render = (vnode, container, namespace) => {\n    if (vnode == null) {\n      if (container._vnode) {\n        unmount(container._vnode, null, null, true);\n      }\n    } else {\n      patch(\n        container._vnode || null,\n        vnode,\n        container,\n        null,\n        null,\n        null,\n        namespace\n      );\n    }\n    container._vnode = vnode;\n    if (!isFlushing) {\n      isFlushing = true;\n      flushPreFlushCbs();\n      flushPostFlushCbs();\n      isFlushing = false;\n    }\n  };\n  const internals = {\n    p: patch,\n    um: unmount,\n    m: move,\n    r: remove,\n    mt: mountComponent,\n    mc: mountChildren,\n    pc: patchChildren,\n    pbc: patchBlockChildren,\n    n: getNextHostNode,\n    o: options\n  };\n  let hydrate;\n  let hydrateNode;\n  if (createHydrationFns) {\n    [hydrate, hydrateNode] = createHydrationFns(\n      internals\n    );\n  }\n  return {\n    render,\n    hydrate,\n    createApp: createAppAPI(render, hydrate)\n  };\n}\nfunction resolveChildrenNamespace({ type, props }, currentNamespace) {\n  return currentNamespace === \"svg\" && type === \"foreignObject\" || currentNamespace === \"mathml\" && type === \"annotation-xml\" && props && props.encoding && props.encoding.includes(\"html\") ? void 0 : currentNamespace;\n}\nfunction toggleRecurse({ effect, job }, allowed) {\n  if (allowed) {\n    effect.flags |= 32;\n    job.flags |= 4;\n  } else {\n    effect.flags &= ~32;\n    job.flags &= ~4;\n  }\n}\nfunction needTransition(parentSuspense, transition) {\n  return (!parentSuspense || parentSuspense && !parentSuspense.pendingBranch) && transition && !transition.persisted;\n}\nfunction traverseStaticChildren(n1, n2, shallow = false) {\n  const ch1 = n1.children;\n  const ch2 = n2.children;\n  if (isArray(ch1) && isArray(ch2)) {\n    for (let i = 0; i < ch1.length; i++) {\n      const c1 = ch1[i];\n      let c2 = ch2[i];\n      if (c2.shapeFlag & 1 && !c2.dynamicChildren) {\n        if (c2.patchFlag <= 0 || c2.patchFlag === 32) {\n          c2 = ch2[i] = cloneIfMounted(ch2[i]);\n          c2.el = c1.el;\n        }\n        if (!shallow && c2.patchFlag !== -2)\n          traverseStaticChildren(c1, c2);\n      }\n      if (c2.type === Text) {\n        c2.el = c1.el;\n      }\n      if (!!(process.env.NODE_ENV !== \"production\") && c2.type === Comment && !c2.el) {\n        c2.el = c1.el;\n      }\n    }\n  }\n}\nfunction getSequence(arr) {\n  const p = arr.slice();\n  const result = [0];\n  let i, j, u, v, c;\n  const len = arr.length;\n  for (i = 0; i < len; i++) {\n    const arrI = arr[i];\n    if (arrI !== 0) {\n      j = result[result.length - 1];\n      if (arr[j] < arrI) {\n        p[i] = j;\n        result.push(i);\n        continue;\n      }\n      u = 0;\n      v = result.length - 1;\n      while (u < v) {\n        c = u + v >> 1;\n        if (arr[result[c]] < arrI) {\n          u = c + 1;\n        } else {\n          v = c;\n        }\n      }\n      if (arrI < arr[result[u]]) {\n        if (u > 0) {\n          p[i] = result[u - 1];\n        }\n        result[u] = i;\n      }\n    }\n  }\n  u = result.length;\n  v = result[u - 1];\n  while (u-- > 0) {\n    result[u] = v;\n    v = p[v];\n  }\n  return result;\n}\nfunction locateNonHydratedAsyncRoot(instance) {\n  const subComponent = instance.subTree.component;\n  if (subComponent) {\n    if (subComponent.asyncDep && !subComponent.asyncResolved) {\n      return subComponent;\n    } else {\n      return locateNonHydratedAsyncRoot(subComponent);\n    }\n  }\n}\nfunction invalidateMount(hooks) {\n  if (hooks) {\n    for (let i = 0; i < hooks.length; i++)\n      hooks[i].flags |= 8;\n  }\n}\n\nconst ssrContextKey = Symbol.for(\"v-scx\");\nconst useSSRContext = () => {\n  {\n    const ctx = inject(ssrContextKey);\n    if (!ctx) {\n      !!(process.env.NODE_ENV !== \"production\") && warn$1(\n        `Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.`\n      );\n    }\n    return ctx;\n  }\n};\n\nfunction watchEffect(effect, options) {\n  return doWatch(effect, null, options);\n}\nfunction watchPostEffect(effect, options) {\n  return doWatch(\n    effect,\n    null,\n    !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"post\" }) : { flush: \"post\" }\n  );\n}\nfunction watchSyncEffect(effect, options) {\n  return doWatch(\n    effect,\n    null,\n    !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"sync\" }) : { flush: \"sync\" }\n  );\n}\nfunction watch(source, cb, options) {\n  if (!!(process.env.NODE_ENV !== \"production\") && !isFunction(cb)) {\n    warn$1(\n      `\\`watch(fn, options?)\\` signature has been moved to a separate API. Use \\`watchEffect(fn, options?)\\` instead. \\`watch\\` now only supports \\`watch(source, cb, options?) signature.`\n    );\n  }\n  return doWatch(source, cb, options);\n}\nfunction doWatch(source, cb, options = EMPTY_OBJ) {\n  const { immediate, deep, flush, once } = options;\n  if (!!(process.env.NODE_ENV !== \"production\") && !cb) {\n    if (immediate !== void 0) {\n      warn$1(\n        `watch() \"immediate\" option is only respected when using the watch(source, callback, options?) signature.`\n      );\n    }\n    if (deep !== void 0) {\n      warn$1(\n        `watch() \"deep\" option is only respected when using the watch(source, callback, options?) signature.`\n      );\n    }\n    if (once !== void 0) {\n      warn$1(\n        `watch() \"once\" option is only respected when using the watch(source, callback, options?) signature.`\n      );\n    }\n  }\n  const baseWatchOptions = extend({}, options);\n  if (!!(process.env.NODE_ENV !== \"production\")) baseWatchOptions.onWarn = warn$1;\n  const runsImmediately = cb && immediate || !cb && flush !== \"post\";\n  let ssrCleanup;\n  if (isInSSRComponentSetup) {\n    if (flush === \"sync\") {\n      const ctx = useSSRContext();\n      ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []);\n    } else if (!runsImmediately) {\n      const watchStopHandle = () => {\n      };\n      watchStopHandle.stop = NOOP;\n      watchStopHandle.resume = NOOP;\n      watchStopHandle.pause = NOOP;\n      return watchStopHandle;\n    }\n  }\n  const instance = currentInstance;\n  baseWatchOptions.call = (fn, type, args) => callWithAsyncErrorHandling(fn, instance, type, args);\n  let isPre = false;\n  if (flush === \"post\") {\n    baseWatchOptions.scheduler = (job) => {\n      queuePostRenderEffect(job, instance && instance.suspense);\n    };\n  } else if (flush !== \"sync\") {\n    isPre = true;\n    baseWatchOptions.scheduler = (job, isFirstRun) => {\n      if (isFirstRun) {\n        job();\n      } else {\n        queueJob(job);\n      }\n    };\n  }\n  baseWatchOptions.augmentJob = (job) => {\n    if (cb) {\n      job.flags |= 4;\n    }\n    if (isPre) {\n      job.flags |= 2;\n      if (instance) {\n        job.id = instance.uid;\n        job.i = instance;\n      }\n    }\n  };\n  const watchHandle = watch$1(source, cb, baseWatchOptions);\n  if (isInSSRComponentSetup) {\n    if (ssrCleanup) {\n      ssrCleanup.push(watchHandle);\n    } else if (runsImmediately) {\n      watchHandle();\n    }\n  }\n  return watchHandle;\n}\nfunction instanceWatch(source, value, options) {\n  const publicThis = this.proxy;\n  const getter = isString(source) ? source.includes(\".\") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);\n  let cb;\n  if (isFunction(value)) {\n    cb = value;\n  } else {\n    cb = value.handler;\n    options = value;\n  }\n  const reset = setCurrentInstance(this);\n  const res = doWatch(getter, cb.bind(publicThis), options);\n  reset();\n  return res;\n}\nfunction createPathGetter(ctx, path) {\n  const segments = path.split(\".\");\n  return () => {\n    let cur = ctx;\n    for (let i = 0; i < segments.length && cur; i++) {\n      cur = cur[segments[i]];\n    }\n    return cur;\n  };\n}\n\nfunction useModel(props, name, options = EMPTY_OBJ) {\n  const i = getCurrentInstance();\n  if (!!(process.env.NODE_ENV !== \"production\") && !i) {\n    warn$1(`useModel() called without active instance.`);\n    return ref();\n  }\n  const camelizedName = camelize(name);\n  if (!!(process.env.NODE_ENV !== \"production\") && !i.propsOptions[0][camelizedName]) {\n    warn$1(`useModel() called with prop \"${name}\" which is not declared.`);\n    return ref();\n  }\n  const hyphenatedName = hyphenate(name);\n  const modifiers = getModelModifiers(props, camelizedName);\n  const res = customRef((track, trigger) => {\n    let localValue;\n    let prevSetValue = EMPTY_OBJ;\n    let prevEmittedValue;\n    watchSyncEffect(() => {\n      const propValue = props[camelizedName];\n      if (hasChanged(localValue, propValue)) {\n        localValue = propValue;\n        trigger();\n      }\n    });\n    return {\n      get() {\n        track();\n        return options.get ? options.get(localValue) : localValue;\n      },\n      set(value) {\n        const emittedValue = options.set ? options.set(value) : value;\n        if (!hasChanged(emittedValue, localValue) && !(prevSetValue !== EMPTY_OBJ && hasChanged(value, prevSetValue))) {\n          return;\n        }\n        const rawProps = i.vnode.props;\n        if (!(rawProps && // check if parent has passed v-model\n        (name in rawProps || camelizedName in rawProps || hyphenatedName in rawProps) && (`onUpdate:${name}` in rawProps || `onUpdate:${camelizedName}` in rawProps || `onUpdate:${hyphenatedName}` in rawProps))) {\n          localValue = value;\n          trigger();\n        }\n        i.emit(`update:${name}`, emittedValue);\n        if (hasChanged(value, emittedValue) && hasChanged(value, prevSetValue) && !hasChanged(emittedValue, prevEmittedValue)) {\n          trigger();\n        }\n        prevSetValue = value;\n        prevEmittedValue = emittedValue;\n      }\n    };\n  });\n  res[Symbol.iterator] = () => {\n    let i2 = 0;\n    return {\n      next() {\n        if (i2 < 2) {\n          return { value: i2++ ? modifiers || EMPTY_OBJ : res, done: false };\n        } else {\n          return { done: true };\n        }\n      }\n    };\n  };\n  return res;\n}\nconst getModelModifiers = (props, modelName) => {\n  return modelName === \"modelValue\" || modelName === \"model-value\" ? props.modelModifiers : props[`${modelName}Modifiers`] || props[`${camelize(modelName)}Modifiers`] || props[`${hyphenate(modelName)}Modifiers`];\n};\n\nfunction emit(instance, event, ...rawArgs) {\n  if (instance.isUnmounted) return;\n  const props = instance.vnode.props || EMPTY_OBJ;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const {\n      emitsOptions,\n      propsOptions: [propsOptions]\n    } = instance;\n    if (emitsOptions) {\n      if (!(event in emitsOptions) && true) {\n        if (!propsOptions || !(toHandlerKey(camelize(event)) in propsOptions)) {\n          warn$1(\n            `Component emitted event \"${event}\" but it is neither declared in the emits option nor as an \"${toHandlerKey(camelize(event))}\" prop.`\n          );\n        }\n      } else {\n        const validator = emitsOptions[event];\n        if (isFunction(validator)) {\n          const isValid = validator(...rawArgs);\n          if (!isValid) {\n            warn$1(\n              `Invalid event arguments: event validation failed for event \"${event}\".`\n            );\n          }\n        }\n      }\n    }\n  }\n  let args = rawArgs;\n  const isModelListener = event.startsWith(\"update:\");\n  const modifiers = isModelListener && getModelModifiers(props, event.slice(7));\n  if (modifiers) {\n    if (modifiers.trim) {\n      args = rawArgs.map((a) => isString(a) ? a.trim() : a);\n    }\n    if (modifiers.number) {\n      args = rawArgs.map(looseToNumber);\n    }\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n    devtoolsComponentEmit(instance, event, args);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const lowerCaseEvent = event.toLowerCase();\n    if (lowerCaseEvent !== event && props[toHandlerKey(lowerCaseEvent)]) {\n      warn$1(\n        `Event \"${lowerCaseEvent}\" is emitted in component ${formatComponentName(\n          instance,\n          instance.type\n        )} but the handler is registered for \"${event}\". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates. You should probably use \"${hyphenate(\n          event\n        )}\" instead of \"${event}\".`\n      );\n    }\n  }\n  let handlerName;\n  let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249)\n  props[handlerName = toHandlerKey(camelize(event))];\n  if (!handler && isModelListener) {\n    handler = props[handlerName = toHandlerKey(hyphenate(event))];\n  }\n  if (handler) {\n    callWithAsyncErrorHandling(\n      handler,\n      instance,\n      6,\n      args\n    );\n  }\n  const onceHandler = props[handlerName + `Once`];\n  if (onceHandler) {\n    if (!instance.emitted) {\n      instance.emitted = {};\n    } else if (instance.emitted[handlerName]) {\n      return;\n    }\n    instance.emitted[handlerName] = true;\n    callWithAsyncErrorHandling(\n      onceHandler,\n      instance,\n      6,\n      args\n    );\n  }\n}\nfunction normalizeEmitsOptions(comp, appContext, asMixin = false) {\n  const cache = appContext.emitsCache;\n  const cached = cache.get(comp);\n  if (cached !== void 0) {\n    return cached;\n  }\n  const raw = comp.emits;\n  let normalized = {};\n  let hasExtends = false;\n  if (__VUE_OPTIONS_API__ && !isFunction(comp)) {\n    const extendEmits = (raw2) => {\n      const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true);\n      if (normalizedFromExtend) {\n        hasExtends = true;\n        extend(normalized, normalizedFromExtend);\n      }\n    };\n    if (!asMixin && appContext.mixins.length) {\n      appContext.mixins.forEach(extendEmits);\n    }\n    if (comp.extends) {\n      extendEmits(comp.extends);\n    }\n    if (comp.mixins) {\n      comp.mixins.forEach(extendEmits);\n    }\n  }\n  if (!raw && !hasExtends) {\n    if (isObject(comp)) {\n      cache.set(comp, null);\n    }\n    return null;\n  }\n  if (isArray(raw)) {\n    raw.forEach((key) => normalized[key] = null);\n  } else {\n    extend(normalized, raw);\n  }\n  if (isObject(comp)) {\n    cache.set(comp, normalized);\n  }\n  return normalized;\n}\nfunction isEmitListener(options, key) {\n  if (!options || !isOn(key)) {\n    return false;\n  }\n  key = key.slice(2).replace(/Once$/, \"\");\n  return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key);\n}\n\nlet accessedAttrs = false;\nfunction markAttrsAccessed() {\n  accessedAttrs = true;\n}\nfunction renderComponentRoot(instance) {\n  const {\n    type: Component,\n    vnode,\n    proxy,\n    withProxy,\n    propsOptions: [propsOptions],\n    slots,\n    attrs,\n    emit,\n    render,\n    renderCache,\n    props,\n    data,\n    setupState,\n    ctx,\n    inheritAttrs\n  } = instance;\n  const prev = setCurrentRenderingInstance(instance);\n  let result;\n  let fallthroughAttrs;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    accessedAttrs = false;\n  }\n  try {\n    if (vnode.shapeFlag & 4) {\n      const proxyToUse = withProxy || proxy;\n      const thisProxy = !!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup ? new Proxy(proxyToUse, {\n        get(target, key, receiver) {\n          warn$1(\n            `Property '${String(\n              key\n            )}' was accessed via 'this'. Avoid using 'this' in templates.`\n          );\n          return Reflect.get(target, key, receiver);\n        }\n      }) : proxyToUse;\n      result = normalizeVNode(\n        render.call(\n          thisProxy,\n          proxyToUse,\n          renderCache,\n          !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(props) : props,\n          setupState,\n          data,\n          ctx\n        )\n      );\n      fallthroughAttrs = attrs;\n    } else {\n      const render2 = Component;\n      if (!!(process.env.NODE_ENV !== \"production\") && attrs === props) {\n        markAttrsAccessed();\n      }\n      result = normalizeVNode(\n        render2.length > 1 ? render2(\n          !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(props) : props,\n          !!(process.env.NODE_ENV !== \"production\") ? {\n            get attrs() {\n              markAttrsAccessed();\n              return shallowReadonly(attrs);\n            },\n            slots,\n            emit\n          } : { attrs, slots, emit }\n        ) : render2(\n          !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(props) : props,\n          null\n        )\n      );\n      fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs);\n    }\n  } catch (err) {\n    blockStack.length = 0;\n    handleError(err, instance, 1);\n    result = createVNode(Comment);\n  }\n  let root = result;\n  let setRoot = void 0;\n  if (!!(process.env.NODE_ENV !== \"production\") && result.patchFlag > 0 && result.patchFlag & 2048) {\n    [root, setRoot] = getChildRoot(result);\n  }\n  if (fallthroughAttrs && inheritAttrs !== false) {\n    const keys = Object.keys(fallthroughAttrs);\n    const { shapeFlag } = root;\n    if (keys.length) {\n      if (shapeFlag & (1 | 6)) {\n        if (propsOptions && keys.some(isModelListener)) {\n          fallthroughAttrs = filterModelListeners(\n            fallthroughAttrs,\n            propsOptions\n          );\n        }\n        root = cloneVNode(root, fallthroughAttrs, false, true);\n      } else if (!!(process.env.NODE_ENV !== \"production\") && !accessedAttrs && root.type !== Comment) {\n        const allAttrs = Object.keys(attrs);\n        const eventAttrs = [];\n        const extraAttrs = [];\n        for (let i = 0, l = allAttrs.length; i < l; i++) {\n          const key = allAttrs[i];\n          if (isOn(key)) {\n            if (!isModelListener(key)) {\n              eventAttrs.push(key[2].toLowerCase() + key.slice(3));\n            }\n          } else {\n            extraAttrs.push(key);\n          }\n        }\n        if (extraAttrs.length) {\n          warn$1(\n            `Extraneous non-props attributes (${extraAttrs.join(\", \")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes.`\n          );\n        }\n        if (eventAttrs.length) {\n          warn$1(\n            `Extraneous non-emits event listeners (${eventAttrs.join(\", \")}) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the \"emits\" option.`\n          );\n        }\n      }\n    }\n  }\n  if (vnode.dirs) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isElementRoot(root)) {\n      warn$1(\n        `Runtime directive used on component with non-element root node. The directives will not function as intended.`\n      );\n    }\n    root = cloneVNode(root, null, false, true);\n    root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs;\n  }\n  if (vnode.transition) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !isElementRoot(root)) {\n      warn$1(\n        `Component inside <Transition> renders non-element root node that cannot be animated.`\n      );\n    }\n    setTransitionHooks(root, vnode.transition);\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && setRoot) {\n    setRoot(root);\n  } else {\n    result = root;\n  }\n  setCurrentRenderingInstance(prev);\n  return result;\n}\nconst getChildRoot = (vnode) => {\n  const rawChildren = vnode.children;\n  const dynamicChildren = vnode.dynamicChildren;\n  const childRoot = filterSingleRoot(rawChildren, false);\n  if (!childRoot) {\n    return [vnode, void 0];\n  } else if (!!(process.env.NODE_ENV !== \"production\") && childRoot.patchFlag > 0 && childRoot.patchFlag & 2048) {\n    return getChildRoot(childRoot);\n  }\n  const index = rawChildren.indexOf(childRoot);\n  const dynamicIndex = dynamicChildren ? dynamicChildren.indexOf(childRoot) : -1;\n  const setRoot = (updatedRoot) => {\n    rawChildren[index] = updatedRoot;\n    if (dynamicChildren) {\n      if (dynamicIndex > -1) {\n        dynamicChildren[dynamicIndex] = updatedRoot;\n      } else if (updatedRoot.patchFlag > 0) {\n        vnode.dynamicChildren = [...dynamicChildren, updatedRoot];\n      }\n    }\n  };\n  return [normalizeVNode(childRoot), setRoot];\n};\nfunction filterSingleRoot(children, recurse = true) {\n  let singleRoot;\n  for (let i = 0; i < children.length; i++) {\n    const child = children[i];\n    if (isVNode(child)) {\n      if (child.type !== Comment || child.children === \"v-if\") {\n        if (singleRoot) {\n          return;\n        } else {\n          singleRoot = child;\n          if (!!(process.env.NODE_ENV !== \"production\") && recurse && singleRoot.patchFlag > 0 && singleRoot.patchFlag & 2048) {\n            return filterSingleRoot(singleRoot.children);\n          }\n        }\n      }\n    } else {\n      return;\n    }\n  }\n  return singleRoot;\n}\nconst getFunctionalFallthrough = (attrs) => {\n  let res;\n  for (const key in attrs) {\n    if (key === \"class\" || key === \"style\" || isOn(key)) {\n      (res || (res = {}))[key] = attrs[key];\n    }\n  }\n  return res;\n};\nconst filterModelListeners = (attrs, props) => {\n  const res = {};\n  for (const key in attrs) {\n    if (!isModelListener(key) || !(key.slice(9) in props)) {\n      res[key] = attrs[key];\n    }\n  }\n  return res;\n};\nconst isElementRoot = (vnode) => {\n  return vnode.shapeFlag & (6 | 1) || vnode.type === Comment;\n};\nfunction shouldUpdateComponent(prevVNode, nextVNode, optimized) {\n  const { props: prevProps, children: prevChildren, component } = prevVNode;\n  const { props: nextProps, children: nextChildren, patchFlag } = nextVNode;\n  const emits = component.emitsOptions;\n  if (!!(process.env.NODE_ENV !== \"production\") && (prevChildren || nextChildren) && isHmrUpdating) {\n    return true;\n  }\n  if (nextVNode.dirs || nextVNode.transition) {\n    return true;\n  }\n  if (optimized && patchFlag >= 0) {\n    if (patchFlag & 1024) {\n      return true;\n    }\n    if (patchFlag & 16) {\n      if (!prevProps) {\n        return !!nextProps;\n      }\n      return hasPropsChanged(prevProps, nextProps, emits);\n    } else if (patchFlag & 8) {\n      const dynamicProps = nextVNode.dynamicProps;\n      for (let i = 0; i < dynamicProps.length; i++) {\n        const key = dynamicProps[i];\n        if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) {\n          return true;\n        }\n      }\n    }\n  } else {\n    if (prevChildren || nextChildren) {\n      if (!nextChildren || !nextChildren.$stable) {\n        return true;\n      }\n    }\n    if (prevProps === nextProps) {\n      return false;\n    }\n    if (!prevProps) {\n      return !!nextProps;\n    }\n    if (!nextProps) {\n      return true;\n    }\n    return hasPropsChanged(prevProps, nextProps, emits);\n  }\n  return false;\n}\nfunction hasPropsChanged(prevProps, nextProps, emitsOptions) {\n  const nextKeys = Object.keys(nextProps);\n  if (nextKeys.length !== Object.keys(prevProps).length) {\n    return true;\n  }\n  for (let i = 0; i < nextKeys.length; i++) {\n    const key = nextKeys[i];\n    if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) {\n      return true;\n    }\n  }\n  return false;\n}\nfunction updateHOCHostEl({ vnode, parent }, el) {\n  while (parent) {\n    const root = parent.subTree;\n    if (root.suspense && root.suspense.activeBranch === vnode) {\n      root.el = vnode.el;\n    }\n    if (root === vnode) {\n      (vnode = parent.vnode).el = el;\n      parent = parent.parent;\n    } else {\n      break;\n    }\n  }\n}\n\nconst isSuspense = (type) => type.__isSuspense;\nlet suspenseId = 0;\nconst SuspenseImpl = {\n  name: \"Suspense\",\n  // In order to make Suspense tree-shakable, we need to avoid importing it\n  // directly in the renderer. The renderer checks for the __isSuspense flag\n  // on a vnode's type and calls the `process` method, passing in renderer\n  // internals.\n  __isSuspense: true,\n  process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) {\n    if (n1 == null) {\n      mountSuspense(\n        n2,\n        container,\n        anchor,\n        parentComponent,\n        parentSuspense,\n        namespace,\n        slotScopeIds,\n        optimized,\n        rendererInternals\n      );\n    } else {\n      if (parentSuspense && parentSuspense.deps > 0 && !n1.suspense.isInFallback) {\n        n2.suspense = n1.suspense;\n        n2.suspense.vnode = n2;\n        n2.el = n1.el;\n        return;\n      }\n      patchSuspense(\n        n1,\n        n2,\n        container,\n        anchor,\n        parentComponent,\n        namespace,\n        slotScopeIds,\n        optimized,\n        rendererInternals\n      );\n    }\n  },\n  hydrate: hydrateSuspense,\n  normalize: normalizeSuspenseChildren\n};\nconst Suspense = SuspenseImpl ;\nfunction triggerEvent(vnode, name) {\n  const eventListener = vnode.props && vnode.props[name];\n  if (isFunction(eventListener)) {\n    eventListener();\n  }\n}\nfunction mountSuspense(vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals) {\n  const {\n    p: patch,\n    o: { createElement }\n  } = rendererInternals;\n  const hiddenContainer = createElement(\"div\");\n  const suspense = vnode.suspense = createSuspenseBoundary(\n    vnode,\n    parentSuspense,\n    parentComponent,\n    container,\n    hiddenContainer,\n    anchor,\n    namespace,\n    slotScopeIds,\n    optimized,\n    rendererInternals\n  );\n  patch(\n    null,\n    suspense.pendingBranch = vnode.ssContent,\n    hiddenContainer,\n    null,\n    parentComponent,\n    suspense,\n    namespace,\n    slotScopeIds\n  );\n  if (suspense.deps > 0) {\n    triggerEvent(vnode, \"onPending\");\n    triggerEvent(vnode, \"onFallback\");\n    patch(\n      null,\n      vnode.ssFallback,\n      container,\n      anchor,\n      parentComponent,\n      null,\n      // fallback tree will not have suspense context\n      namespace,\n      slotScopeIds\n    );\n    setActiveBranch(suspense, vnode.ssFallback);\n  } else {\n    suspense.resolve(false, true);\n  }\n}\nfunction patchSuspense(n1, n2, container, anchor, parentComponent, namespace, slotScopeIds, optimized, { p: patch, um: unmount, o: { createElement } }) {\n  const suspense = n2.suspense = n1.suspense;\n  suspense.vnode = n2;\n  n2.el = n1.el;\n  const newBranch = n2.ssContent;\n  const newFallback = n2.ssFallback;\n  const { activeBranch, pendingBranch, isInFallback, isHydrating } = suspense;\n  if (pendingBranch) {\n    suspense.pendingBranch = newBranch;\n    if (isSameVNodeType(newBranch, pendingBranch)) {\n      patch(\n        pendingBranch,\n        newBranch,\n        suspense.hiddenContainer,\n        null,\n        parentComponent,\n        suspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n      if (suspense.deps <= 0) {\n        suspense.resolve();\n      } else if (isInFallback) {\n        if (!isHydrating) {\n          patch(\n            activeBranch,\n            newFallback,\n            container,\n            anchor,\n            parentComponent,\n            null,\n            // fallback tree will not have suspense context\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n          setActiveBranch(suspense, newFallback);\n        }\n      }\n    } else {\n      suspense.pendingId = suspenseId++;\n      if (isHydrating) {\n        suspense.isHydrating = false;\n        suspense.activeBranch = pendingBranch;\n      } else {\n        unmount(pendingBranch, parentComponent, suspense);\n      }\n      suspense.deps = 0;\n      suspense.effects.length = 0;\n      suspense.hiddenContainer = createElement(\"div\");\n      if (isInFallback) {\n        patch(\n          null,\n          newBranch,\n          suspense.hiddenContainer,\n          null,\n          parentComponent,\n          suspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        if (suspense.deps <= 0) {\n          suspense.resolve();\n        } else {\n          patch(\n            activeBranch,\n            newFallback,\n            container,\n            anchor,\n            parentComponent,\n            null,\n            // fallback tree will not have suspense context\n            namespace,\n            slotScopeIds,\n            optimized\n          );\n          setActiveBranch(suspense, newFallback);\n        }\n      } else if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {\n        patch(\n          activeBranch,\n          newBranch,\n          container,\n          anchor,\n          parentComponent,\n          suspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        suspense.resolve(true);\n      } else {\n        patch(\n          null,\n          newBranch,\n          suspense.hiddenContainer,\n          null,\n          parentComponent,\n          suspense,\n          namespace,\n          slotScopeIds,\n          optimized\n        );\n        if (suspense.deps <= 0) {\n          suspense.resolve();\n        }\n      }\n    }\n  } else {\n    if (activeBranch && isSameVNodeType(newBranch, activeBranch)) {\n      patch(\n        activeBranch,\n        newBranch,\n        container,\n        anchor,\n        parentComponent,\n        suspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n      setActiveBranch(suspense, newBranch);\n    } else {\n      triggerEvent(n2, \"onPending\");\n      suspense.pendingBranch = newBranch;\n      if (newBranch.shapeFlag & 512) {\n        suspense.pendingId = newBranch.component.suspenseId;\n      } else {\n        suspense.pendingId = suspenseId++;\n      }\n      patch(\n        null,\n        newBranch,\n        suspense.hiddenContainer,\n        null,\n        parentComponent,\n        suspense,\n        namespace,\n        slotScopeIds,\n        optimized\n      );\n      if (suspense.deps <= 0) {\n        suspense.resolve();\n      } else {\n        const { timeout, pendingId } = suspense;\n        if (timeout > 0) {\n          setTimeout(() => {\n            if (suspense.pendingId === pendingId) {\n              suspense.fallback(newFallback);\n            }\n          }, timeout);\n        } else if (timeout === 0) {\n          suspense.fallback(newFallback);\n        }\n      }\n    }\n  }\n}\nlet hasWarned = false;\nfunction createSuspenseBoundary(vnode, parentSuspense, parentComponent, container, hiddenContainer, anchor, namespace, slotScopeIds, optimized, rendererInternals, isHydrating = false) {\n  if (!!(process.env.NODE_ENV !== \"production\") && true && !hasWarned) {\n    hasWarned = true;\n    console[console.info ? \"info\" : \"log\"](\n      `<Suspense> is an experimental feature and its API will likely change.`\n    );\n  }\n  const {\n    p: patch,\n    m: move,\n    um: unmount,\n    n: next,\n    o: { parentNode, remove }\n  } = rendererInternals;\n  let parentSuspenseId;\n  const isSuspensible = isVNodeSuspensible(vnode);\n  if (isSuspensible) {\n    if (parentSuspense && parentSuspense.pendingBranch) {\n      parentSuspenseId = parentSuspense.pendingId;\n      parentSuspense.deps++;\n    }\n  }\n  const timeout = vnode.props ? toNumber(vnode.props.timeout) : void 0;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    assertNumber(timeout, `Suspense timeout`);\n  }\n  const initialAnchor = anchor;\n  const suspense = {\n    vnode,\n    parent: parentSuspense,\n    parentComponent,\n    namespace,\n    container,\n    hiddenContainer,\n    deps: 0,\n    pendingId: suspenseId++,\n    timeout: typeof timeout === \"number\" ? timeout : -1,\n    activeBranch: null,\n    pendingBranch: null,\n    isInFallback: !isHydrating,\n    isHydrating,\n    isUnmounted: false,\n    effects: [],\n    resolve(resume = false, sync = false) {\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        if (!resume && !suspense.pendingBranch) {\n          throw new Error(\n            `suspense.resolve() is called without a pending branch.`\n          );\n        }\n        if (suspense.isUnmounted) {\n          throw new Error(\n            `suspense.resolve() is called on an already unmounted suspense boundary.`\n          );\n        }\n      }\n      const {\n        vnode: vnode2,\n        activeBranch,\n        pendingBranch,\n        pendingId,\n        effects,\n        parentComponent: parentComponent2,\n        container: container2\n      } = suspense;\n      let delayEnter = false;\n      if (suspense.isHydrating) {\n        suspense.isHydrating = false;\n      } else if (!resume) {\n        delayEnter = activeBranch && pendingBranch.transition && pendingBranch.transition.mode === \"out-in\";\n        if (delayEnter) {\n          activeBranch.transition.afterLeave = () => {\n            if (pendingId === suspense.pendingId) {\n              move(\n                pendingBranch,\n                container2,\n                anchor === initialAnchor ? next(activeBranch) : anchor,\n                0\n              );\n              queuePostFlushCb(effects);\n            }\n          };\n        }\n        if (activeBranch) {\n          if (parentNode(activeBranch.el) === container2) {\n            anchor = next(activeBranch);\n          }\n          unmount(activeBranch, parentComponent2, suspense, true);\n        }\n        if (!delayEnter) {\n          move(pendingBranch, container2, anchor, 0);\n        }\n      }\n      setActiveBranch(suspense, pendingBranch);\n      suspense.pendingBranch = null;\n      suspense.isInFallback = false;\n      let parent = suspense.parent;\n      let hasUnresolvedAncestor = false;\n      while (parent) {\n        if (parent.pendingBranch) {\n          parent.effects.push(...effects);\n          hasUnresolvedAncestor = true;\n          break;\n        }\n        parent = parent.parent;\n      }\n      if (!hasUnresolvedAncestor && !delayEnter) {\n        queuePostFlushCb(effects);\n      }\n      suspense.effects = [];\n      if (isSuspensible) {\n        if (parentSuspense && parentSuspense.pendingBranch && parentSuspenseId === parentSuspense.pendingId) {\n          parentSuspense.deps--;\n          if (parentSuspense.deps === 0 && !sync) {\n            parentSuspense.resolve();\n          }\n        }\n      }\n      triggerEvent(vnode2, \"onResolve\");\n    },\n    fallback(fallbackVNode) {\n      if (!suspense.pendingBranch) {\n        return;\n      }\n      const { vnode: vnode2, activeBranch, parentComponent: parentComponent2, container: container2, namespace: namespace2 } = suspense;\n      triggerEvent(vnode2, \"onFallback\");\n      const anchor2 = next(activeBranch);\n      const mountFallback = () => {\n        if (!suspense.isInFallback) {\n          return;\n        }\n        patch(\n          null,\n          fallbackVNode,\n          container2,\n          anchor2,\n          parentComponent2,\n          null,\n          // fallback tree will not have suspense context\n          namespace2,\n          slotScopeIds,\n          optimized\n        );\n        setActiveBranch(suspense, fallbackVNode);\n      };\n      const delayEnter = fallbackVNode.transition && fallbackVNode.transition.mode === \"out-in\";\n      if (delayEnter) {\n        activeBranch.transition.afterLeave = mountFallback;\n      }\n      suspense.isInFallback = true;\n      unmount(\n        activeBranch,\n        parentComponent2,\n        null,\n        // no suspense so unmount hooks fire now\n        true\n        // shouldRemove\n      );\n      if (!delayEnter) {\n        mountFallback();\n      }\n    },\n    move(container2, anchor2, type) {\n      suspense.activeBranch && move(suspense.activeBranch, container2, anchor2, type);\n      suspense.container = container2;\n    },\n    next() {\n      return suspense.activeBranch && next(suspense.activeBranch);\n    },\n    registerDep(instance, setupRenderEffect, optimized2) {\n      const isInPendingSuspense = !!suspense.pendingBranch;\n      if (isInPendingSuspense) {\n        suspense.deps++;\n      }\n      const hydratedEl = instance.vnode.el;\n      instance.asyncDep.catch((err) => {\n        handleError(err, instance, 0);\n      }).then((asyncSetupResult) => {\n        if (instance.isUnmounted || suspense.isUnmounted || suspense.pendingId !== instance.suspenseId) {\n          return;\n        }\n        instance.asyncResolved = true;\n        const { vnode: vnode2 } = instance;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          pushWarningContext(vnode2);\n        }\n        handleSetupResult(instance, asyncSetupResult, false);\n        if (hydratedEl) {\n          vnode2.el = hydratedEl;\n        }\n        const placeholder = !hydratedEl && instance.subTree.el;\n        setupRenderEffect(\n          instance,\n          vnode2,\n          // component may have been moved before resolve.\n          // if this is not a hydration, instance.subTree will be the comment\n          // placeholder.\n          parentNode(hydratedEl || instance.subTree.el),\n          // anchor will not be used if this is hydration, so only need to\n          // consider the comment placeholder case.\n          hydratedEl ? null : next(instance.subTree),\n          suspense,\n          namespace,\n          optimized2\n        );\n        if (placeholder) {\n          remove(placeholder);\n        }\n        updateHOCHostEl(instance, vnode2.el);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          popWarningContext();\n        }\n        if (isInPendingSuspense && --suspense.deps === 0) {\n          suspense.resolve();\n        }\n      });\n    },\n    unmount(parentSuspense2, doRemove) {\n      suspense.isUnmounted = true;\n      if (suspense.activeBranch) {\n        unmount(\n          suspense.activeBranch,\n          parentComponent,\n          parentSuspense2,\n          doRemove\n        );\n      }\n      if (suspense.pendingBranch) {\n        unmount(\n          suspense.pendingBranch,\n          parentComponent,\n          parentSuspense2,\n          doRemove\n        );\n      }\n    }\n  };\n  return suspense;\n}\nfunction hydrateSuspense(node, vnode, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, rendererInternals, hydrateNode) {\n  const suspense = vnode.suspense = createSuspenseBoundary(\n    vnode,\n    parentSuspense,\n    parentComponent,\n    node.parentNode,\n    // eslint-disable-next-line no-restricted-globals\n    document.createElement(\"div\"),\n    null,\n    namespace,\n    slotScopeIds,\n    optimized,\n    rendererInternals,\n    true\n  );\n  const result = hydrateNode(\n    node,\n    suspense.pendingBranch = vnode.ssContent,\n    parentComponent,\n    suspense,\n    slotScopeIds,\n    optimized\n  );\n  if (suspense.deps === 0) {\n    suspense.resolve(false, true);\n  }\n  return result;\n}\nfunction normalizeSuspenseChildren(vnode) {\n  const { shapeFlag, children } = vnode;\n  const isSlotChildren = shapeFlag & 32;\n  vnode.ssContent = normalizeSuspenseSlot(\n    isSlotChildren ? children.default : children\n  );\n  vnode.ssFallback = isSlotChildren ? normalizeSuspenseSlot(children.fallback) : createVNode(Comment);\n}\nfunction normalizeSuspenseSlot(s) {\n  let block;\n  if (isFunction(s)) {\n    const trackBlock = isBlockTreeEnabled && s._c;\n    if (trackBlock) {\n      s._d = false;\n      openBlock();\n    }\n    s = s();\n    if (trackBlock) {\n      s._d = true;\n      block = currentBlock;\n      closeBlock();\n    }\n  }\n  if (isArray(s)) {\n    const singleChild = filterSingleRoot(s);\n    if (!!(process.env.NODE_ENV !== \"production\") && !singleChild && s.filter((child) => child !== NULL_DYNAMIC_COMPONENT).length > 0) {\n      warn$1(`<Suspense> slots expect a single root node.`);\n    }\n    s = singleChild;\n  }\n  s = normalizeVNode(s);\n  if (block && !s.dynamicChildren) {\n    s.dynamicChildren = block.filter((c) => c !== s);\n  }\n  return s;\n}\nfunction queueEffectWithSuspense(fn, suspense) {\n  if (suspense && suspense.pendingBranch) {\n    if (isArray(fn)) {\n      suspense.effects.push(...fn);\n    } else {\n      suspense.effects.push(fn);\n    }\n  } else {\n    queuePostFlushCb(fn);\n  }\n}\nfunction setActiveBranch(suspense, branch) {\n  suspense.activeBranch = branch;\n  const { vnode, parentComponent } = suspense;\n  let el = branch.el;\n  while (!el && branch.component) {\n    branch = branch.component.subTree;\n    el = branch.el;\n  }\n  vnode.el = el;\n  if (parentComponent && parentComponent.subTree === vnode) {\n    parentComponent.vnode.el = el;\n    updateHOCHostEl(parentComponent, el);\n  }\n}\nfunction isVNodeSuspensible(vnode) {\n  const suspensible = vnode.props && vnode.props.suspensible;\n  return suspensible != null && suspensible !== false;\n}\n\nconst Fragment = Symbol.for(\"v-fgt\");\nconst Text = Symbol.for(\"v-txt\");\nconst Comment = Symbol.for(\"v-cmt\");\nconst Static = Symbol.for(\"v-stc\");\nconst blockStack = [];\nlet currentBlock = null;\nfunction openBlock(disableTracking = false) {\n  blockStack.push(currentBlock = disableTracking ? null : []);\n}\nfunction closeBlock() {\n  blockStack.pop();\n  currentBlock = blockStack[blockStack.length - 1] || null;\n}\nlet isBlockTreeEnabled = 1;\nfunction setBlockTracking(value) {\n  isBlockTreeEnabled += value;\n  if (value < 0 && currentBlock) {\n    currentBlock.hasOnce = true;\n  }\n}\nfunction setupBlock(vnode) {\n  vnode.dynamicChildren = isBlockTreeEnabled > 0 ? currentBlock || EMPTY_ARR : null;\n  closeBlock();\n  if (isBlockTreeEnabled > 0 && currentBlock) {\n    currentBlock.push(vnode);\n  }\n  return vnode;\n}\nfunction createElementBlock(type, props, children, patchFlag, dynamicProps, shapeFlag) {\n  return setupBlock(\n    createBaseVNode(\n      type,\n      props,\n      children,\n      patchFlag,\n      dynamicProps,\n      shapeFlag,\n      true\n    )\n  );\n}\nfunction createBlock(type, props, children, patchFlag, dynamicProps) {\n  return setupBlock(\n    createVNode(\n      type,\n      props,\n      children,\n      patchFlag,\n      dynamicProps,\n      true\n    )\n  );\n}\nfunction isVNode(value) {\n  return value ? value.__v_isVNode === true : false;\n}\nfunction isSameVNodeType(n1, n2) {\n  if (!!(process.env.NODE_ENV !== \"production\") && n2.shapeFlag & 6 && n1.component) {\n    const dirtyInstances = hmrDirtyComponents.get(n2.type);\n    if (dirtyInstances && dirtyInstances.has(n1.component)) {\n      n1.shapeFlag &= ~256;\n      n2.shapeFlag &= ~512;\n      return false;\n    }\n  }\n  return n1.type === n2.type && n1.key === n2.key;\n}\nlet vnodeArgsTransformer;\nfunction transformVNodeArgs(transformer) {\n  vnodeArgsTransformer = transformer;\n}\nconst createVNodeWithArgsTransform = (...args) => {\n  return _createVNode(\n    ...vnodeArgsTransformer ? vnodeArgsTransformer(args, currentRenderingInstance) : args\n  );\n};\nconst normalizeKey = ({ key }) => key != null ? key : null;\nconst normalizeRef = ({\n  ref,\n  ref_key,\n  ref_for\n}) => {\n  if (typeof ref === \"number\") {\n    ref = \"\" + ref;\n  }\n  return ref != null ? isString(ref) || isRef(ref) || isFunction(ref) ? { i: currentRenderingInstance, r: ref, k: ref_key, f: !!ref_for } : ref : null;\n};\nfunction createBaseVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, shapeFlag = type === Fragment ? 0 : 1, isBlockNode = false, needFullChildrenNormalization = false) {\n  const vnode = {\n    __v_isVNode: true,\n    __v_skip: true,\n    type,\n    props,\n    key: props && normalizeKey(props),\n    ref: props && normalizeRef(props),\n    scopeId: currentScopeId,\n    slotScopeIds: null,\n    children,\n    component: null,\n    suspense: null,\n    ssContent: null,\n    ssFallback: null,\n    dirs: null,\n    transition: null,\n    el: null,\n    anchor: null,\n    target: null,\n    targetStart: null,\n    targetAnchor: null,\n    staticCount: 0,\n    shapeFlag,\n    patchFlag,\n    dynamicProps,\n    dynamicChildren: null,\n    appContext: null,\n    ctx: currentRenderingInstance\n  };\n  if (needFullChildrenNormalization) {\n    normalizeChildren(vnode, children);\n    if (shapeFlag & 128) {\n      type.normalize(vnode);\n    }\n  } else if (children) {\n    vnode.shapeFlag |= isString(children) ? 8 : 16;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && vnode.key !== vnode.key) {\n    warn$1(`VNode created with invalid key (NaN). VNode type:`, vnode.type);\n  }\n  if (isBlockTreeEnabled > 0 && // avoid a block node from tracking itself\n  !isBlockNode && // has current parent block\n  currentBlock && // presence of a patch flag indicates this node needs patching on updates.\n  // component nodes also should always be patched, because even if the\n  // component doesn't need to update, it needs to persist the instance on to\n  // the next vnode so that it can be properly unmounted later.\n  (vnode.patchFlag > 0 || shapeFlag & 6) && // the EVENTS flag is only for hydration and if it is the only flag, the\n  // vnode should not be considered dynamic due to handler caching.\n  vnode.patchFlag !== 32) {\n    currentBlock.push(vnode);\n  }\n  return vnode;\n}\nconst createVNode = !!(process.env.NODE_ENV !== \"production\") ? createVNodeWithArgsTransform : _createVNode;\nfunction _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) {\n  if (!type || type === NULL_DYNAMIC_COMPONENT) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !type) {\n      warn$1(`Invalid vnode type when creating vnode: ${type}.`);\n    }\n    type = Comment;\n  }\n  if (isVNode(type)) {\n    const cloned = cloneVNode(\n      type,\n      props,\n      true\n      /* mergeRef: true */\n    );\n    if (children) {\n      normalizeChildren(cloned, children);\n    }\n    if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock) {\n      if (cloned.shapeFlag & 6) {\n        currentBlock[currentBlock.indexOf(type)] = cloned;\n      } else {\n        currentBlock.push(cloned);\n      }\n    }\n    cloned.patchFlag = -2;\n    return cloned;\n  }\n  if (isClassComponent(type)) {\n    type = type.__vccOpts;\n  }\n  if (props) {\n    props = guardReactiveProps(props);\n    let { class: klass, style } = props;\n    if (klass && !isString(klass)) {\n      props.class = normalizeClass(klass);\n    }\n    if (isObject(style)) {\n      if (isProxy(style) && !isArray(style)) {\n        style = extend({}, style);\n      }\n      props.style = normalizeStyle(style);\n    }\n  }\n  const shapeFlag = isString(type) ? 1 : isSuspense(type) ? 128 : isTeleport(type) ? 64 : isObject(type) ? 4 : isFunction(type) ? 2 : 0;\n  if (!!(process.env.NODE_ENV !== \"production\") && shapeFlag & 4 && isProxy(type)) {\n    type = toRaw(type);\n    warn$1(\n      `Vue received a Component that was made a reactive object. This can lead to unnecessary performance overhead and should be avoided by marking the component with \\`markRaw\\` or using \\`shallowRef\\` instead of \\`ref\\`.`,\n      `\nComponent that was made reactive: `,\n      type\n    );\n  }\n  return createBaseVNode(\n    type,\n    props,\n    children,\n    patchFlag,\n    dynamicProps,\n    shapeFlag,\n    isBlockNode,\n    true\n  );\n}\nfunction guardReactiveProps(props) {\n  if (!props) return null;\n  return isProxy(props) || isInternalObject(props) ? extend({}, props) : props;\n}\nfunction cloneVNode(vnode, extraProps, mergeRef = false, cloneTransition = false) {\n  const { props, ref, patchFlag, children, transition } = vnode;\n  const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props;\n  const cloned = {\n    __v_isVNode: true,\n    __v_skip: true,\n    type: vnode.type,\n    props: mergedProps,\n    key: mergedProps && normalizeKey(mergedProps),\n    ref: extraProps && extraProps.ref ? (\n      // #2078 in the case of <component :is=\"vnode\" ref=\"extra\"/>\n      // if the vnode itself already has a ref, cloneVNode will need to merge\n      // the refs so the single vnode can be set on multiple refs\n      mergeRef && ref ? isArray(ref) ? ref.concat(normalizeRef(extraProps)) : [ref, normalizeRef(extraProps)] : normalizeRef(extraProps)\n    ) : ref,\n    scopeId: vnode.scopeId,\n    slotScopeIds: vnode.slotScopeIds,\n    children: !!(process.env.NODE_ENV !== \"production\") && patchFlag === -1 && isArray(children) ? children.map(deepCloneVNode) : children,\n    target: vnode.target,\n    targetStart: vnode.targetStart,\n    targetAnchor: vnode.targetAnchor,\n    staticCount: vnode.staticCount,\n    shapeFlag: vnode.shapeFlag,\n    // if the vnode is cloned with extra props, we can no longer assume its\n    // existing patch flag to be reliable and need to add the FULL_PROPS flag.\n    // note: preserve flag for fragments since they use the flag for children\n    // fast paths only.\n    patchFlag: extraProps && vnode.type !== Fragment ? patchFlag === -1 ? 16 : patchFlag | 16 : patchFlag,\n    dynamicProps: vnode.dynamicProps,\n    dynamicChildren: vnode.dynamicChildren,\n    appContext: vnode.appContext,\n    dirs: vnode.dirs,\n    transition,\n    // These should technically only be non-null on mounted VNodes. However,\n    // they *should* be copied for kept-alive vnodes. So we just always copy\n    // them since them being non-null during a mount doesn't affect the logic as\n    // they will simply be overwritten.\n    component: vnode.component,\n    suspense: vnode.suspense,\n    ssContent: vnode.ssContent && cloneVNode(vnode.ssContent),\n    ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback),\n    el: vnode.el,\n    anchor: vnode.anchor,\n    ctx: vnode.ctx,\n    ce: vnode.ce\n  };\n  if (transition && cloneTransition) {\n    setTransitionHooks(\n      cloned,\n      transition.clone(cloned)\n    );\n  }\n  return cloned;\n}\nfunction deepCloneVNode(vnode) {\n  const cloned = cloneVNode(vnode);\n  if (isArray(vnode.children)) {\n    cloned.children = vnode.children.map(deepCloneVNode);\n  }\n  return cloned;\n}\nfunction createTextVNode(text = \" \", flag = 0) {\n  return createVNode(Text, null, text, flag);\n}\nfunction createStaticVNode(content, numberOfNodes) {\n  const vnode = createVNode(Static, null, content);\n  vnode.staticCount = numberOfNodes;\n  return vnode;\n}\nfunction createCommentVNode(text = \"\", asBlock = false) {\n  return asBlock ? (openBlock(), createBlock(Comment, null, text)) : createVNode(Comment, null, text);\n}\nfunction normalizeVNode(child) {\n  if (child == null || typeof child === \"boolean\") {\n    return createVNode(Comment);\n  } else if (isArray(child)) {\n    return createVNode(\n      Fragment,\n      null,\n      // #3666, avoid reference pollution when reusing vnode\n      child.slice()\n    );\n  } else if (isVNode(child)) {\n    return cloneIfMounted(child);\n  } else {\n    return createVNode(Text, null, String(child));\n  }\n}\nfunction cloneIfMounted(child) {\n  return child.el === null && child.patchFlag !== -1 || child.memo ? child : cloneVNode(child);\n}\nfunction normalizeChildren(vnode, children) {\n  let type = 0;\n  const { shapeFlag } = vnode;\n  if (children == null) {\n    children = null;\n  } else if (isArray(children)) {\n    type = 16;\n  } else if (typeof children === \"object\") {\n    if (shapeFlag & (1 | 64)) {\n      const slot = children.default;\n      if (slot) {\n        slot._c && (slot._d = false);\n        normalizeChildren(vnode, slot());\n        slot._c && (slot._d = true);\n      }\n      return;\n    } else {\n      type = 32;\n      const slotFlag = children._;\n      if (!slotFlag && !isInternalObject(children)) {\n        children._ctx = currentRenderingInstance;\n      } else if (slotFlag === 3 && currentRenderingInstance) {\n        if (currentRenderingInstance.slots._ === 1) {\n          children._ = 1;\n        } else {\n          children._ = 2;\n          vnode.patchFlag |= 1024;\n        }\n      }\n    }\n  } else if (isFunction(children)) {\n    children = { default: children, _ctx: currentRenderingInstance };\n    type = 32;\n  } else {\n    children = String(children);\n    if (shapeFlag & 64) {\n      type = 16;\n      children = [createTextVNode(children)];\n    } else {\n      type = 8;\n    }\n  }\n  vnode.children = children;\n  vnode.shapeFlag |= type;\n}\nfunction mergeProps(...args) {\n  const ret = {};\n  for (let i = 0; i < args.length; i++) {\n    const toMerge = args[i];\n    for (const key in toMerge) {\n      if (key === \"class\") {\n        if (ret.class !== toMerge.class) {\n          ret.class = normalizeClass([ret.class, toMerge.class]);\n        }\n      } else if (key === \"style\") {\n        ret.style = normalizeStyle([ret.style, toMerge.style]);\n      } else if (isOn(key)) {\n        const existing = ret[key];\n        const incoming = toMerge[key];\n        if (incoming && existing !== incoming && !(isArray(existing) && existing.includes(incoming))) {\n          ret[key] = existing ? [].concat(existing, incoming) : incoming;\n        }\n      } else if (key !== \"\") {\n        ret[key] = toMerge[key];\n      }\n    }\n  }\n  return ret;\n}\nfunction invokeVNodeHook(hook, instance, vnode, prevVNode = null) {\n  callWithAsyncErrorHandling(hook, instance, 7, [\n    vnode,\n    prevVNode\n  ]);\n}\n\nconst emptyAppContext = createAppContext();\nlet uid = 0;\nfunction createComponentInstance(vnode, parent, suspense) {\n  const type = vnode.type;\n  const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext;\n  const instance = {\n    uid: uid++,\n    vnode,\n    type,\n    parent,\n    appContext,\n    root: null,\n    // to be immediately set\n    next: null,\n    subTree: null,\n    // will be set synchronously right after creation\n    effect: null,\n    update: null,\n    // will be set synchronously right after creation\n    job: null,\n    scope: new EffectScope(\n      true\n      /* detached */\n    ),\n    render: null,\n    proxy: null,\n    exposed: null,\n    exposeProxy: null,\n    withProxy: null,\n    provides: parent ? parent.provides : Object.create(appContext.provides),\n    ids: parent ? parent.ids : [\"\", 0, 0],\n    accessCache: null,\n    renderCache: [],\n    // local resolved assets\n    components: null,\n    directives: null,\n    // resolved props and emits options\n    propsOptions: normalizePropsOptions(type, appContext),\n    emitsOptions: normalizeEmitsOptions(type, appContext),\n    // emit\n    emit: null,\n    // to be set immediately\n    emitted: null,\n    // props default value\n    propsDefaults: EMPTY_OBJ,\n    // inheritAttrs\n    inheritAttrs: type.inheritAttrs,\n    // state\n    ctx: EMPTY_OBJ,\n    data: EMPTY_OBJ,\n    props: EMPTY_OBJ,\n    attrs: EMPTY_OBJ,\n    slots: EMPTY_OBJ,\n    refs: EMPTY_OBJ,\n    setupState: EMPTY_OBJ,\n    setupContext: null,\n    // suspense related\n    suspense,\n    suspenseId: suspense ? suspense.pendingId : 0,\n    asyncDep: null,\n    asyncResolved: false,\n    // lifecycle hooks\n    // not using enums here because it results in computed properties\n    isMounted: false,\n    isUnmounted: false,\n    isDeactivated: false,\n    bc: null,\n    c: null,\n    bm: null,\n    m: null,\n    bu: null,\n    u: null,\n    um: null,\n    bum: null,\n    da: null,\n    a: null,\n    rtg: null,\n    rtc: null,\n    ec: null,\n    sp: null\n  };\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    instance.ctx = createDevRenderContext(instance);\n  } else {\n    instance.ctx = { _: instance };\n  }\n  instance.root = parent ? parent.root : instance;\n  instance.emit = emit.bind(null, instance);\n  if (vnode.ce) {\n    vnode.ce(instance);\n  }\n  return instance;\n}\nlet currentInstance = null;\nconst getCurrentInstance = () => currentInstance || currentRenderingInstance;\nlet internalSetCurrentInstance;\nlet setInSSRSetupState;\n{\n  const g = getGlobalThis();\n  const registerGlobalSetter = (key, setter) => {\n    let setters;\n    if (!(setters = g[key])) setters = g[key] = [];\n    setters.push(setter);\n    return (v) => {\n      if (setters.length > 1) setters.forEach((set) => set(v));\n      else setters[0](v);\n    };\n  };\n  internalSetCurrentInstance = registerGlobalSetter(\n    `__VUE_INSTANCE_SETTERS__`,\n    (v) => currentInstance = v\n  );\n  setInSSRSetupState = registerGlobalSetter(\n    `__VUE_SSR_SETTERS__`,\n    (v) => isInSSRComponentSetup = v\n  );\n}\nconst setCurrentInstance = (instance) => {\n  const prev = currentInstance;\n  internalSetCurrentInstance(instance);\n  instance.scope.on();\n  return () => {\n    instance.scope.off();\n    internalSetCurrentInstance(prev);\n  };\n};\nconst unsetCurrentInstance = () => {\n  currentInstance && currentInstance.scope.off();\n  internalSetCurrentInstance(null);\n};\nconst isBuiltInTag = /* @__PURE__ */ makeMap(\"slot,component\");\nfunction validateComponentName(name, { isNativeTag }) {\n  if (isBuiltInTag(name) || isNativeTag(name)) {\n    warn$1(\n      \"Do not use built-in or reserved HTML elements as component id: \" + name\n    );\n  }\n}\nfunction isStatefulComponent(instance) {\n  return instance.vnode.shapeFlag & 4;\n}\nlet isInSSRComponentSetup = false;\nfunction setupComponent(instance, isSSR = false, optimized = false) {\n  isSSR && setInSSRSetupState(isSSR);\n  const { props, children } = instance.vnode;\n  const isStateful = isStatefulComponent(instance);\n  initProps(instance, props, isStateful, isSSR);\n  initSlots(instance, children, optimized);\n  const setupResult = isStateful ? setupStatefulComponent(instance, isSSR) : void 0;\n  isSSR && setInSSRSetupState(false);\n  return setupResult;\n}\nfunction setupStatefulComponent(instance, isSSR) {\n  var _a;\n  const Component = instance.type;\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    if (Component.name) {\n      validateComponentName(Component.name, instance.appContext.config);\n    }\n    if (Component.components) {\n      const names = Object.keys(Component.components);\n      for (let i = 0; i < names.length; i++) {\n        validateComponentName(names[i], instance.appContext.config);\n      }\n    }\n    if (Component.directives) {\n      const names = Object.keys(Component.directives);\n      for (let i = 0; i < names.length; i++) {\n        validateDirectiveName(names[i]);\n      }\n    }\n    if (Component.compilerOptions && isRuntimeOnly()) {\n      warn$1(\n        `\"compilerOptions\" is only supported when using a build of Vue that includes the runtime compiler. Since you are using a runtime-only build, the options should be passed via your build tool config instead.`\n      );\n    }\n  }\n  instance.accessCache = /* @__PURE__ */ Object.create(null);\n  instance.proxy = new Proxy(instance.ctx, PublicInstanceProxyHandlers);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    exposePropsOnRenderContext(instance);\n  }\n  const { setup } = Component;\n  if (setup) {\n    pauseTracking();\n    const setupContext = instance.setupContext = setup.length > 1 ? createSetupContext(instance) : null;\n    const reset = setCurrentInstance(instance);\n    const setupResult = callWithErrorHandling(\n      setup,\n      instance,\n      0,\n      [\n        !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(instance.props) : instance.props,\n        setupContext\n      ]\n    );\n    const isAsyncSetup = isPromise(setupResult);\n    resetTracking();\n    reset();\n    if ((isAsyncSetup || instance.sp) && !isAsyncWrapper(instance)) {\n      markAsyncBoundary(instance);\n    }\n    if (isAsyncSetup) {\n      setupResult.then(unsetCurrentInstance, unsetCurrentInstance);\n      if (isSSR) {\n        return setupResult.then((resolvedResult) => {\n          handleSetupResult(instance, resolvedResult, isSSR);\n        }).catch((e) => {\n          handleError(e, instance, 0);\n        });\n      } else {\n        instance.asyncDep = setupResult;\n        if (!!(process.env.NODE_ENV !== \"production\") && !instance.suspense) {\n          const name = (_a = Component.name) != null ? _a : \"Anonymous\";\n          warn$1(\n            `Component <${name}>: setup function returned a promise, but no <Suspense> boundary was found in the parent component tree. A component with async setup() must be nested in a <Suspense> in order to be rendered.`\n          );\n        }\n      }\n    } else {\n      handleSetupResult(instance, setupResult, isSSR);\n    }\n  } else {\n    finishComponentSetup(instance, isSSR);\n  }\n}\nfunction handleSetupResult(instance, setupResult, isSSR) {\n  if (isFunction(setupResult)) {\n    if (instance.type.__ssrInlineRender) {\n      instance.ssrRender = setupResult;\n    } else {\n      instance.render = setupResult;\n    }\n  } else if (isObject(setupResult)) {\n    if (!!(process.env.NODE_ENV !== \"production\") && isVNode(setupResult)) {\n      warn$1(\n        `setup() should not return VNodes directly - return a render function instead.`\n      );\n    }\n    if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n      instance.devtoolsRawSetupState = setupResult;\n    }\n    instance.setupState = proxyRefs(setupResult);\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      exposeSetupStateOnRenderContext(instance);\n    }\n  } else if (!!(process.env.NODE_ENV !== \"production\") && setupResult !== void 0) {\n    warn$1(\n      `setup() should return an object. Received: ${setupResult === null ? \"null\" : typeof setupResult}`\n    );\n  }\n  finishComponentSetup(instance, isSSR);\n}\nlet compile;\nlet installWithProxy;\nfunction registerRuntimeCompiler(_compile) {\n  compile = _compile;\n  installWithProxy = (i) => {\n    if (i.render._rc) {\n      i.withProxy = new Proxy(i.ctx, RuntimeCompiledPublicInstanceProxyHandlers);\n    }\n  };\n}\nconst isRuntimeOnly = () => !compile;\nfunction finishComponentSetup(instance, isSSR, skipOptions) {\n  const Component = instance.type;\n  if (!instance.render) {\n    if (!isSSR && compile && !Component.render) {\n      const template = Component.template || resolveMergedOptions(instance).template;\n      if (template) {\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          startMeasure(instance, `compile`);\n        }\n        const { isCustomElement, compilerOptions } = instance.appContext.config;\n        const { delimiters, compilerOptions: componentCompilerOptions } = Component;\n        const finalCompilerOptions = extend(\n          extend(\n            {\n              isCustomElement,\n              delimiters\n            },\n            compilerOptions\n          ),\n          componentCompilerOptions\n        );\n        Component.render = compile(template, finalCompilerOptions);\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          endMeasure(instance, `compile`);\n        }\n      }\n    }\n    instance.render = Component.render || NOOP;\n    if (installWithProxy) {\n      installWithProxy(instance);\n    }\n  }\n  if (__VUE_OPTIONS_API__ && true) {\n    const reset = setCurrentInstance(instance);\n    pauseTracking();\n    try {\n      applyOptions(instance);\n    } finally {\n      resetTracking();\n      reset();\n    }\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && !Component.render && instance.render === NOOP && !isSSR) {\n    if (!compile && Component.template) {\n      warn$1(\n        `Component provided template option but runtime compilation is not supported in this build of Vue.` + (` Configure your bundler to alias \"vue\" to \"vue/dist/vue.esm-bundler.js\".` )\n      );\n    } else {\n      warn$1(`Component is missing template or render function: `, Component);\n    }\n  }\n}\nconst attrsProxyHandlers = !!(process.env.NODE_ENV !== \"production\") ? {\n  get(target, key) {\n    markAttrsAccessed();\n    track(target, \"get\", \"\");\n    return target[key];\n  },\n  set() {\n    warn$1(`setupContext.attrs is readonly.`);\n    return false;\n  },\n  deleteProperty() {\n    warn$1(`setupContext.attrs is readonly.`);\n    return false;\n  }\n} : {\n  get(target, key) {\n    track(target, \"get\", \"\");\n    return target[key];\n  }\n};\nfunction getSlotsProxy(instance) {\n  return new Proxy(instance.slots, {\n    get(target, key) {\n      track(instance, \"get\", \"$slots\");\n      return target[key];\n    }\n  });\n}\nfunction createSetupContext(instance) {\n  const expose = (exposed) => {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      if (instance.exposed) {\n        warn$1(`expose() should be called only once per setup().`);\n      }\n      if (exposed != null) {\n        let exposedType = typeof exposed;\n        if (exposedType === \"object\") {\n          if (isArray(exposed)) {\n            exposedType = \"array\";\n          } else if (isRef(exposed)) {\n            exposedType = \"ref\";\n          }\n        }\n        if (exposedType !== \"object\") {\n          warn$1(\n            `expose() should be passed a plain object, received ${exposedType}.`\n          );\n        }\n      }\n    }\n    instance.exposed = exposed || {};\n  };\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    let attrsProxy;\n    let slotsProxy;\n    return Object.freeze({\n      get attrs() {\n        return attrsProxy || (attrsProxy = new Proxy(instance.attrs, attrsProxyHandlers));\n      },\n      get slots() {\n        return slotsProxy || (slotsProxy = getSlotsProxy(instance));\n      },\n      get emit() {\n        return (event, ...args) => instance.emit(event, ...args);\n      },\n      expose\n    });\n  } else {\n    return {\n      attrs: new Proxy(instance.attrs, attrsProxyHandlers),\n      slots: instance.slots,\n      emit: instance.emit,\n      expose\n    };\n  }\n}\nfunction getComponentPublicInstance(instance) {\n  if (instance.exposed) {\n    return instance.exposeProxy || (instance.exposeProxy = new Proxy(proxyRefs(markRaw(instance.exposed)), {\n      get(target, key) {\n        if (key in target) {\n          return target[key];\n        } else if (key in publicPropertiesMap) {\n          return publicPropertiesMap[key](instance);\n        }\n      },\n      has(target, key) {\n        return key in target || key in publicPropertiesMap;\n      }\n    }));\n  } else {\n    return instance.proxy;\n  }\n}\nconst classifyRE = /(?:^|[-_])(\\w)/g;\nconst classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, \"\");\nfunction getComponentName(Component, includeInferred = true) {\n  return isFunction(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name;\n}\nfunction formatComponentName(instance, Component, isRoot = false) {\n  let name = getComponentName(Component);\n  if (!name && Component.__file) {\n    const match = Component.__file.match(/([^/\\\\]+)\\.\\w+$/);\n    if (match) {\n      name = match[1];\n    }\n  }\n  if (!name && instance && instance.parent) {\n    const inferFromRegistry = (registry) => {\n      for (const key in registry) {\n        if (registry[key] === Component) {\n          return key;\n        }\n      }\n    };\n    name = inferFromRegistry(\n      instance.components || instance.parent.type.components\n    ) || inferFromRegistry(instance.appContext.components);\n  }\n  return name ? classify(name) : isRoot ? `App` : `Anonymous`;\n}\nfunction isClassComponent(value) {\n  return isFunction(value) && \"__vccOpts\" in value;\n}\n\nconst computed = (getterOrOptions, debugOptions) => {\n  const c = computed$1(getterOrOptions, debugOptions, isInSSRComponentSetup);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    const i = getCurrentInstance();\n    if (i && i.appContext.config.warnRecursiveComputed) {\n      c._warnRecursive = true;\n    }\n  }\n  return c;\n};\n\nfunction h(type, propsOrChildren, children) {\n  const l = arguments.length;\n  if (l === 2) {\n    if (isObject(propsOrChildren) && !isArray(propsOrChildren)) {\n      if (isVNode(propsOrChildren)) {\n        return createVNode(type, null, [propsOrChildren]);\n      }\n      return createVNode(type, propsOrChildren);\n    } else {\n      return createVNode(type, null, propsOrChildren);\n    }\n  } else {\n    if (l > 3) {\n      children = Array.prototype.slice.call(arguments, 2);\n    } else if (l === 3 && isVNode(children)) {\n      children = [children];\n    }\n    return createVNode(type, propsOrChildren, children);\n  }\n}\n\nfunction initCustomFormatter() {\n  if (!!!(process.env.NODE_ENV !== \"production\") || typeof window === \"undefined\") {\n    return;\n  }\n  const vueStyle = { style: \"color:#3ba776\" };\n  const numberStyle = { style: \"color:#1677ff\" };\n  const stringStyle = { style: \"color:#f5222d\" };\n  const keywordStyle = { style: \"color:#eb2f96\" };\n  const formatter = {\n    __vue_custom_formatter: true,\n    header(obj) {\n      if (!isObject(obj)) {\n        return null;\n      }\n      if (obj.__isVue) {\n        return [\"div\", vueStyle, `VueInstance`];\n      } else if (isRef(obj)) {\n        return [\n          \"div\",\n          {},\n          [\"span\", vueStyle, genRefFlag(obj)],\n          \"<\",\n          // avoid debugger accessing value affecting behavior\n          formatValue(\"_value\" in obj ? obj._value : obj),\n          `>`\n        ];\n      } else if (isReactive(obj)) {\n        return [\n          \"div\",\n          {},\n          [\"span\", vueStyle, isShallow(obj) ? \"ShallowReactive\" : \"Reactive\"],\n          \"<\",\n          formatValue(obj),\n          `>${isReadonly(obj) ? ` (readonly)` : ``}`\n        ];\n      } else if (isReadonly(obj)) {\n        return [\n          \"div\",\n          {},\n          [\"span\", vueStyle, isShallow(obj) ? \"ShallowReadonly\" : \"Readonly\"],\n          \"<\",\n          formatValue(obj),\n          \">\"\n        ];\n      }\n      return null;\n    },\n    hasBody(obj) {\n      return obj && obj.__isVue;\n    },\n    body(obj) {\n      if (obj && obj.__isVue) {\n        return [\n          \"div\",\n          {},\n          ...formatInstance(obj.$)\n        ];\n      }\n    }\n  };\n  function formatInstance(instance) {\n    const blocks = [];\n    if (instance.type.props && instance.props) {\n      blocks.push(createInstanceBlock(\"props\", toRaw(instance.props)));\n    }\n    if (instance.setupState !== EMPTY_OBJ) {\n      blocks.push(createInstanceBlock(\"setup\", instance.setupState));\n    }\n    if (instance.data !== EMPTY_OBJ) {\n      blocks.push(createInstanceBlock(\"data\", toRaw(instance.data)));\n    }\n    const computed = extractKeys(instance, \"computed\");\n    if (computed) {\n      blocks.push(createInstanceBlock(\"computed\", computed));\n    }\n    const injected = extractKeys(instance, \"inject\");\n    if (injected) {\n      blocks.push(createInstanceBlock(\"injected\", injected));\n    }\n    blocks.push([\n      \"div\",\n      {},\n      [\n        \"span\",\n        {\n          style: keywordStyle.style + \";opacity:0.66\"\n        },\n        \"$ (internal): \"\n      ],\n      [\"object\", { object: instance }]\n    ]);\n    return blocks;\n  }\n  function createInstanceBlock(type, target) {\n    target = extend({}, target);\n    if (!Object.keys(target).length) {\n      return [\"span\", {}];\n    }\n    return [\n      \"div\",\n      { style: \"line-height:1.25em;margin-bottom:0.6em\" },\n      [\n        \"div\",\n        {\n          style: \"color:#476582\"\n        },\n        type\n      ],\n      [\n        \"div\",\n        {\n          style: \"padding-left:1.25em\"\n        },\n        ...Object.keys(target).map((key) => {\n          return [\n            \"div\",\n            {},\n            [\"span\", keywordStyle, key + \": \"],\n            formatValue(target[key], false)\n          ];\n        })\n      ]\n    ];\n  }\n  function formatValue(v, asRaw = true) {\n    if (typeof v === \"number\") {\n      return [\"span\", numberStyle, v];\n    } else if (typeof v === \"string\") {\n      return [\"span\", stringStyle, JSON.stringify(v)];\n    } else if (typeof v === \"boolean\") {\n      return [\"span\", keywordStyle, v];\n    } else if (isObject(v)) {\n      return [\"object\", { object: asRaw ? toRaw(v) : v }];\n    } else {\n      return [\"span\", stringStyle, String(v)];\n    }\n  }\n  function extractKeys(instance, type) {\n    const Comp = instance.type;\n    if (isFunction(Comp)) {\n      return;\n    }\n    const extracted = {};\n    for (const key in instance.ctx) {\n      if (isKeyOfType(Comp, key, type)) {\n        extracted[key] = instance.ctx[key];\n      }\n    }\n    return extracted;\n  }\n  function isKeyOfType(Comp, key, type) {\n    const opts = Comp[type];\n    if (isArray(opts) && opts.includes(key) || isObject(opts) && key in opts) {\n      return true;\n    }\n    if (Comp.extends && isKeyOfType(Comp.extends, key, type)) {\n      return true;\n    }\n    if (Comp.mixins && Comp.mixins.some((m) => isKeyOfType(m, key, type))) {\n      return true;\n    }\n  }\n  function genRefFlag(v) {\n    if (isShallow(v)) {\n      return `ShallowRef`;\n    }\n    if (v.effect) {\n      return `ComputedRef`;\n    }\n    return `Ref`;\n  }\n  if (window.devtoolsFormatters) {\n    window.devtoolsFormatters.push(formatter);\n  } else {\n    window.devtoolsFormatters = [formatter];\n  }\n}\n\nfunction withMemo(memo, render, cache, index) {\n  const cached = cache[index];\n  if (cached && isMemoSame(cached, memo)) {\n    return cached;\n  }\n  const ret = render();\n  ret.memo = memo.slice();\n  ret.cacheIndex = index;\n  return cache[index] = ret;\n}\nfunction isMemoSame(cached, memo) {\n  const prev = cached.memo;\n  if (prev.length != memo.length) {\n    return false;\n  }\n  for (let i = 0; i < prev.length; i++) {\n    if (hasChanged(prev[i], memo[i])) {\n      return false;\n    }\n  }\n  if (isBlockTreeEnabled > 0 && currentBlock) {\n    currentBlock.push(cached);\n  }\n  return true;\n}\n\nconst version = \"3.5.12\";\nconst warn = !!(process.env.NODE_ENV !== \"production\") ? warn$1 : NOOP;\nconst ErrorTypeStrings = ErrorTypeStrings$1 ;\nconst devtools = !!(process.env.NODE_ENV !== \"production\") || true ? devtools$1 : void 0;\nconst setDevtoolsHook = !!(process.env.NODE_ENV !== \"production\") || true ? setDevtoolsHook$1 : NOOP;\nconst _ssrUtils = {\n  createComponentInstance,\n  setupComponent,\n  renderComponentRoot,\n  setCurrentRenderingInstance,\n  isVNode: isVNode,\n  normalizeVNode,\n  getComponentPublicInstance,\n  ensureValidVNode,\n  pushWarningContext,\n  popWarningContext\n};\nconst ssrUtils = _ssrUtils ;\nconst resolveFilter = null;\nconst compatUtils = null;\nconst DeprecationTypes = null;\n\nexport { BaseTransition, BaseTransitionPropsValidators, Comment, DeprecationTypes, ErrorCodes, ErrorTypeStrings, Fragment, KeepAlive, Static, Suspense, Teleport, Text, assertNumber, callWithAsyncErrorHandling, callWithErrorHandling, cloneVNode, compatUtils, computed, createBlock, createCommentVNode, createElementBlock, createBaseVNode as createElementVNode, createHydrationRenderer, createPropsRestProxy, createRenderer, createSlots, createStaticVNode, createTextVNode, createVNode, defineAsyncComponent, defineComponent, defineEmits, defineExpose, defineModel, defineOptions, defineProps, defineSlots, devtools, getCurrentInstance, getTransitionRawChildren, guardReactiveProps, h, handleError, hasInjectionContext, hydrateOnIdle, hydrateOnInteraction, hydrateOnMediaQuery, hydrateOnVisible, initCustomFormatter, inject, isMemoSame, isRuntimeOnly, isVNode, mergeDefaults, mergeModels, mergeProps, nextTick, onActivated, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onDeactivated, onErrorCaptured, onMounted, onRenderTracked, onRenderTriggered, onServerPrefetch, onUnmounted, onUpdated, openBlock, popScopeId, provide, pushScopeId, queuePostFlushCb, registerRuntimeCompiler, renderList, renderSlot, resolveComponent, resolveDirective, resolveDynamicComponent, resolveFilter, resolveTransitionHooks, setBlockTracking, setDevtoolsHook, setTransitionHooks, ssrContextKey, ssrUtils, toHandlers, transformVNodeArgs, useAttrs, useId, useModel, useSSRContext, useSlots, useTemplateRef, useTransitionState, version, warn, watch, watchEffect, watchPostEffect, watchSyncEffect, withAsyncContext, withCtx, withDefaults, withDirectives, withMemo, withScopeId };\n","/**\n* @vue/runtime-dom v3.5.12\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { warn, h, BaseTransition, assertNumber, BaseTransitionPropsValidators, getCurrentInstance, onBeforeMount, watchPostEffect, onMounted, onUnmounted, Fragment, Static, camelize, callWithAsyncErrorHandling, defineComponent, nextTick, unref, createVNode, useTransitionState, onUpdated, toRaw, getTransitionRawChildren, setTransitionHooks, resolveTransitionHooks, Text, isRuntimeOnly, createRenderer, createHydrationRenderer } from '@vue/runtime-core';\nexport * from '@vue/runtime-core';\nimport { extend, isObject, toNumber, isArray, isString, hyphenate, capitalize, includeBooleanAttr, isSymbol, isSpecialBooleanAttr, isFunction, NOOP, isOn, isModelListener, camelize as camelize$1, isPlainObject, hasOwn, EMPTY_OBJ, looseToNumber, looseIndexOf, isSet, looseEqual, invokeArrayFns, isHTMLTag, isSVGTag, isMathMLTag } from '@vue/shared';\n\nlet policy = void 0;\nconst tt = typeof window !== \"undefined\" && window.trustedTypes;\nif (tt) {\n  try {\n    policy = /* @__PURE__ */ tt.createPolicy(\"vue\", {\n      createHTML: (val) => val\n    });\n  } catch (e) {\n    !!(process.env.NODE_ENV !== \"production\") && warn(`Error creating trusted types policy: ${e}`);\n  }\n}\nconst unsafeToTrustedHTML = policy ? (val) => policy.createHTML(val) : (val) => val;\nconst svgNS = \"http://www.w3.org/2000/svg\";\nconst mathmlNS = \"http://www.w3.org/1998/Math/MathML\";\nconst doc = typeof document !== \"undefined\" ? document : null;\nconst templateContainer = doc && /* @__PURE__ */ doc.createElement(\"template\");\nconst nodeOps = {\n  insert: (child, parent, anchor) => {\n    parent.insertBefore(child, anchor || null);\n  },\n  remove: (child) => {\n    const parent = child.parentNode;\n    if (parent) {\n      parent.removeChild(child);\n    }\n  },\n  createElement: (tag, namespace, is, props) => {\n    const el = namespace === \"svg\" ? doc.createElementNS(svgNS, tag) : namespace === \"mathml\" ? doc.createElementNS(mathmlNS, tag) : is ? doc.createElement(tag, { is }) : doc.createElement(tag);\n    if (tag === \"select\" && props && props.multiple != null) {\n      el.setAttribute(\"multiple\", props.multiple);\n    }\n    return el;\n  },\n  createText: (text) => doc.createTextNode(text),\n  createComment: (text) => doc.createComment(text),\n  setText: (node, text) => {\n    node.nodeValue = text;\n  },\n  setElementText: (el, text) => {\n    el.textContent = text;\n  },\n  parentNode: (node) => node.parentNode,\n  nextSibling: (node) => node.nextSibling,\n  querySelector: (selector) => doc.querySelector(selector),\n  setScopeId(el, id) {\n    el.setAttribute(id, \"\");\n  },\n  // __UNSAFE__\n  // Reason: innerHTML.\n  // Static content here can only come from compiled templates.\n  // As long as the user only uses trusted templates, this is safe.\n  insertStaticContent(content, parent, anchor, namespace, start, end) {\n    const before = anchor ? anchor.previousSibling : parent.lastChild;\n    if (start && (start === end || start.nextSibling)) {\n      while (true) {\n        parent.insertBefore(start.cloneNode(true), anchor);\n        if (start === end || !(start = start.nextSibling)) break;\n      }\n    } else {\n      templateContainer.innerHTML = unsafeToTrustedHTML(\n        namespace === \"svg\" ? `<svg>${content}</svg>` : namespace === \"mathml\" ? `<math>${content}</math>` : content\n      );\n      const template = templateContainer.content;\n      if (namespace === \"svg\" || namespace === \"mathml\") {\n        const wrapper = template.firstChild;\n        while (wrapper.firstChild) {\n          template.appendChild(wrapper.firstChild);\n        }\n        template.removeChild(wrapper);\n      }\n      parent.insertBefore(template, anchor);\n    }\n    return [\n      // first\n      before ? before.nextSibling : parent.firstChild,\n      // last\n      anchor ? anchor.previousSibling : parent.lastChild\n    ];\n  }\n};\n\nconst TRANSITION = \"transition\";\nconst ANIMATION = \"animation\";\nconst vtcKey = Symbol(\"_vtc\");\nconst DOMTransitionPropsValidators = {\n  name: String,\n  type: String,\n  css: {\n    type: Boolean,\n    default: true\n  },\n  duration: [String, Number, Object],\n  enterFromClass: String,\n  enterActiveClass: String,\n  enterToClass: String,\n  appearFromClass: String,\n  appearActiveClass: String,\n  appearToClass: String,\n  leaveFromClass: String,\n  leaveActiveClass: String,\n  leaveToClass: String\n};\nconst TransitionPropsValidators = /* @__PURE__ */ extend(\n  {},\n  BaseTransitionPropsValidators,\n  DOMTransitionPropsValidators\n);\nconst decorate$1 = (t) => {\n  t.displayName = \"Transition\";\n  t.props = TransitionPropsValidators;\n  return t;\n};\nconst Transition = /* @__PURE__ */ decorate$1(\n  (props, { slots }) => h(BaseTransition, resolveTransitionProps(props), slots)\n);\nconst callHook = (hook, args = []) => {\n  if (isArray(hook)) {\n    hook.forEach((h2) => h2(...args));\n  } else if (hook) {\n    hook(...args);\n  }\n};\nconst hasExplicitCallback = (hook) => {\n  return hook ? isArray(hook) ? hook.some((h2) => h2.length > 1) : hook.length > 1 : false;\n};\nfunction resolveTransitionProps(rawProps) {\n  const baseProps = {};\n  for (const key in rawProps) {\n    if (!(key in DOMTransitionPropsValidators)) {\n      baseProps[key] = rawProps[key];\n    }\n  }\n  if (rawProps.css === false) {\n    return baseProps;\n  }\n  const {\n    name = \"v\",\n    type,\n    duration,\n    enterFromClass = `${name}-enter-from`,\n    enterActiveClass = `${name}-enter-active`,\n    enterToClass = `${name}-enter-to`,\n    appearFromClass = enterFromClass,\n    appearActiveClass = enterActiveClass,\n    appearToClass = enterToClass,\n    leaveFromClass = `${name}-leave-from`,\n    leaveActiveClass = `${name}-leave-active`,\n    leaveToClass = `${name}-leave-to`\n  } = rawProps;\n  const durations = normalizeDuration(duration);\n  const enterDuration = durations && durations[0];\n  const leaveDuration = durations && durations[1];\n  const {\n    onBeforeEnter,\n    onEnter,\n    onEnterCancelled,\n    onLeave,\n    onLeaveCancelled,\n    onBeforeAppear = onBeforeEnter,\n    onAppear = onEnter,\n    onAppearCancelled = onEnterCancelled\n  } = baseProps;\n  const finishEnter = (el, isAppear, done) => {\n    removeTransitionClass(el, isAppear ? appearToClass : enterToClass);\n    removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass);\n    done && done();\n  };\n  const finishLeave = (el, done) => {\n    el._isLeaving = false;\n    removeTransitionClass(el, leaveFromClass);\n    removeTransitionClass(el, leaveToClass);\n    removeTransitionClass(el, leaveActiveClass);\n    done && done();\n  };\n  const makeEnterHook = (isAppear) => {\n    return (el, done) => {\n      const hook = isAppear ? onAppear : onEnter;\n      const resolve = () => finishEnter(el, isAppear, done);\n      callHook(hook, [el, resolve]);\n      nextFrame(() => {\n        removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass);\n        addTransitionClass(el, isAppear ? appearToClass : enterToClass);\n        if (!hasExplicitCallback(hook)) {\n          whenTransitionEnds(el, type, enterDuration, resolve);\n        }\n      });\n    };\n  };\n  return extend(baseProps, {\n    onBeforeEnter(el) {\n      callHook(onBeforeEnter, [el]);\n      addTransitionClass(el, enterFromClass);\n      addTransitionClass(el, enterActiveClass);\n    },\n    onBeforeAppear(el) {\n      callHook(onBeforeAppear, [el]);\n      addTransitionClass(el, appearFromClass);\n      addTransitionClass(el, appearActiveClass);\n    },\n    onEnter: makeEnterHook(false),\n    onAppear: makeEnterHook(true),\n    onLeave(el, done) {\n      el._isLeaving = true;\n      const resolve = () => finishLeave(el, done);\n      addTransitionClass(el, leaveFromClass);\n      addTransitionClass(el, leaveActiveClass);\n      forceReflow();\n      nextFrame(() => {\n        if (!el._isLeaving) {\n          return;\n        }\n        removeTransitionClass(el, leaveFromClass);\n        addTransitionClass(el, leaveToClass);\n        if (!hasExplicitCallback(onLeave)) {\n          whenTransitionEnds(el, type, leaveDuration, resolve);\n        }\n      });\n      callHook(onLeave, [el, resolve]);\n    },\n    onEnterCancelled(el) {\n      finishEnter(el, false);\n      callHook(onEnterCancelled, [el]);\n    },\n    onAppearCancelled(el) {\n      finishEnter(el, true);\n      callHook(onAppearCancelled, [el]);\n    },\n    onLeaveCancelled(el) {\n      finishLeave(el);\n      callHook(onLeaveCancelled, [el]);\n    }\n  });\n}\nfunction normalizeDuration(duration) {\n  if (duration == null) {\n    return null;\n  } else if (isObject(duration)) {\n    return [NumberOf(duration.enter), NumberOf(duration.leave)];\n  } else {\n    const n = NumberOf(duration);\n    return [n, n];\n  }\n}\nfunction NumberOf(val) {\n  const res = toNumber(val);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    assertNumber(res, \"<transition> explicit duration\");\n  }\n  return res;\n}\nfunction addTransitionClass(el, cls) {\n  cls.split(/\\s+/).forEach((c) => c && el.classList.add(c));\n  (el[vtcKey] || (el[vtcKey] = /* @__PURE__ */ new Set())).add(cls);\n}\nfunction removeTransitionClass(el, cls) {\n  cls.split(/\\s+/).forEach((c) => c && el.classList.remove(c));\n  const _vtc = el[vtcKey];\n  if (_vtc) {\n    _vtc.delete(cls);\n    if (!_vtc.size) {\n      el[vtcKey] = void 0;\n    }\n  }\n}\nfunction nextFrame(cb) {\n  requestAnimationFrame(() => {\n    requestAnimationFrame(cb);\n  });\n}\nlet endId = 0;\nfunction whenTransitionEnds(el, expectedType, explicitTimeout, resolve) {\n  const id = el._endId = ++endId;\n  const resolveIfNotStale = () => {\n    if (id === el._endId) {\n      resolve();\n    }\n  };\n  if (explicitTimeout != null) {\n    return setTimeout(resolveIfNotStale, explicitTimeout);\n  }\n  const { type, timeout, propCount } = getTransitionInfo(el, expectedType);\n  if (!type) {\n    return resolve();\n  }\n  const endEvent = type + \"end\";\n  let ended = 0;\n  const end = () => {\n    el.removeEventListener(endEvent, onEnd);\n    resolveIfNotStale();\n  };\n  const onEnd = (e) => {\n    if (e.target === el && ++ended >= propCount) {\n      end();\n    }\n  };\n  setTimeout(() => {\n    if (ended < propCount) {\n      end();\n    }\n  }, timeout + 1);\n  el.addEventListener(endEvent, onEnd);\n}\nfunction getTransitionInfo(el, expectedType) {\n  const styles = window.getComputedStyle(el);\n  const getStyleProperties = (key) => (styles[key] || \"\").split(\", \");\n  const transitionDelays = getStyleProperties(`${TRANSITION}Delay`);\n  const transitionDurations = getStyleProperties(`${TRANSITION}Duration`);\n  const transitionTimeout = getTimeout(transitionDelays, transitionDurations);\n  const animationDelays = getStyleProperties(`${ANIMATION}Delay`);\n  const animationDurations = getStyleProperties(`${ANIMATION}Duration`);\n  const animationTimeout = getTimeout(animationDelays, animationDurations);\n  let type = null;\n  let timeout = 0;\n  let propCount = 0;\n  if (expectedType === TRANSITION) {\n    if (transitionTimeout > 0) {\n      type = TRANSITION;\n      timeout = transitionTimeout;\n      propCount = transitionDurations.length;\n    }\n  } else if (expectedType === ANIMATION) {\n    if (animationTimeout > 0) {\n      type = ANIMATION;\n      timeout = animationTimeout;\n      propCount = animationDurations.length;\n    }\n  } else {\n    timeout = Math.max(transitionTimeout, animationTimeout);\n    type = timeout > 0 ? transitionTimeout > animationTimeout ? TRANSITION : ANIMATION : null;\n    propCount = type ? type === TRANSITION ? transitionDurations.length : animationDurations.length : 0;\n  }\n  const hasTransform = type === TRANSITION && /\\b(transform|all)(,|$)/.test(\n    getStyleProperties(`${TRANSITION}Property`).toString()\n  );\n  return {\n    type,\n    timeout,\n    propCount,\n    hasTransform\n  };\n}\nfunction getTimeout(delays, durations) {\n  while (delays.length < durations.length) {\n    delays = delays.concat(delays);\n  }\n  return Math.max(...durations.map((d, i) => toMs(d) + toMs(delays[i])));\n}\nfunction toMs(s) {\n  if (s === \"auto\") return 0;\n  return Number(s.slice(0, -1).replace(\",\", \".\")) * 1e3;\n}\nfunction forceReflow() {\n  return document.body.offsetHeight;\n}\n\nfunction patchClass(el, value, isSVG) {\n  const transitionClasses = el[vtcKey];\n  if (transitionClasses) {\n    value = (value ? [value, ...transitionClasses] : [...transitionClasses]).join(\" \");\n  }\n  if (value == null) {\n    el.removeAttribute(\"class\");\n  } else if (isSVG) {\n    el.setAttribute(\"class\", value);\n  } else {\n    el.className = value;\n  }\n}\n\nconst vShowOriginalDisplay = Symbol(\"_vod\");\nconst vShowHidden = Symbol(\"_vsh\");\nconst vShow = {\n  beforeMount(el, { value }, { transition }) {\n    el[vShowOriginalDisplay] = el.style.display === \"none\" ? \"\" : el.style.display;\n    if (transition && value) {\n      transition.beforeEnter(el);\n    } else {\n      setDisplay(el, value);\n    }\n  },\n  mounted(el, { value }, { transition }) {\n    if (transition && value) {\n      transition.enter(el);\n    }\n  },\n  updated(el, { value, oldValue }, { transition }) {\n    if (!value === !oldValue) return;\n    if (transition) {\n      if (value) {\n        transition.beforeEnter(el);\n        setDisplay(el, true);\n        transition.enter(el);\n      } else {\n        transition.leave(el, () => {\n          setDisplay(el, false);\n        });\n      }\n    } else {\n      setDisplay(el, value);\n    }\n  },\n  beforeUnmount(el, { value }) {\n    setDisplay(el, value);\n  }\n};\nif (!!(process.env.NODE_ENV !== \"production\")) {\n  vShow.name = \"show\";\n}\nfunction setDisplay(el, value) {\n  el.style.display = value ? el[vShowOriginalDisplay] : \"none\";\n  el[vShowHidden] = !value;\n}\nfunction initVShowForSSR() {\n  vShow.getSSRProps = ({ value }) => {\n    if (!value) {\n      return { style: { display: \"none\" } };\n    }\n  };\n}\n\nconst CSS_VAR_TEXT = Symbol(!!(process.env.NODE_ENV !== \"production\") ? \"CSS_VAR_TEXT\" : \"\");\nfunction useCssVars(getter) {\n  const instance = getCurrentInstance();\n  if (!instance) {\n    !!(process.env.NODE_ENV !== \"production\") && warn(`useCssVars is called without current active component instance.`);\n    return;\n  }\n  const updateTeleports = instance.ut = (vars = getter(instance.proxy)) => {\n    Array.from(\n      document.querySelectorAll(`[data-v-owner=\"${instance.uid}\"]`)\n    ).forEach((node) => setVarsOnNode(node, vars));\n  };\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    instance.getCssVars = () => getter(instance.proxy);\n  }\n  const setVars = () => {\n    const vars = getter(instance.proxy);\n    if (instance.ce) {\n      setVarsOnNode(instance.ce, vars);\n    } else {\n      setVarsOnVNode(instance.subTree, vars);\n    }\n    updateTeleports(vars);\n  };\n  onBeforeMount(() => {\n    watchPostEffect(setVars);\n  });\n  onMounted(() => {\n    const ob = new MutationObserver(setVars);\n    ob.observe(instance.subTree.el.parentNode, { childList: true });\n    onUnmounted(() => ob.disconnect());\n  });\n}\nfunction setVarsOnVNode(vnode, vars) {\n  if (vnode.shapeFlag & 128) {\n    const suspense = vnode.suspense;\n    vnode = suspense.activeBranch;\n    if (suspense.pendingBranch && !suspense.isHydrating) {\n      suspense.effects.push(() => {\n        setVarsOnVNode(suspense.activeBranch, vars);\n      });\n    }\n  }\n  while (vnode.component) {\n    vnode = vnode.component.subTree;\n  }\n  if (vnode.shapeFlag & 1 && vnode.el) {\n    setVarsOnNode(vnode.el, vars);\n  } else if (vnode.type === Fragment) {\n    vnode.children.forEach((c) => setVarsOnVNode(c, vars));\n  } else if (vnode.type === Static) {\n    let { el, anchor } = vnode;\n    while (el) {\n      setVarsOnNode(el, vars);\n      if (el === anchor) break;\n      el = el.nextSibling;\n    }\n  }\n}\nfunction setVarsOnNode(el, vars) {\n  if (el.nodeType === 1) {\n    const style = el.style;\n    let cssText = \"\";\n    for (const key in vars) {\n      style.setProperty(`--${key}`, vars[key]);\n      cssText += `--${key}: ${vars[key]};`;\n    }\n    style[CSS_VAR_TEXT] = cssText;\n  }\n}\n\nconst displayRE = /(^|;)\\s*display\\s*:/;\nfunction patchStyle(el, prev, next) {\n  const style = el.style;\n  const isCssString = isString(next);\n  let hasControlledDisplay = false;\n  if (next && !isCssString) {\n    if (prev) {\n      if (!isString(prev)) {\n        for (const key in prev) {\n          if (next[key] == null) {\n            setStyle(style, key, \"\");\n          }\n        }\n      } else {\n        for (const prevStyle of prev.split(\";\")) {\n          const key = prevStyle.slice(0, prevStyle.indexOf(\":\")).trim();\n          if (next[key] == null) {\n            setStyle(style, key, \"\");\n          }\n        }\n      }\n    }\n    for (const key in next) {\n      if (key === \"display\") {\n        hasControlledDisplay = true;\n      }\n      setStyle(style, key, next[key]);\n    }\n  } else {\n    if (isCssString) {\n      if (prev !== next) {\n        const cssVarText = style[CSS_VAR_TEXT];\n        if (cssVarText) {\n          next += \";\" + cssVarText;\n        }\n        style.cssText = next;\n        hasControlledDisplay = displayRE.test(next);\n      }\n    } else if (prev) {\n      el.removeAttribute(\"style\");\n    }\n  }\n  if (vShowOriginalDisplay in el) {\n    el[vShowOriginalDisplay] = hasControlledDisplay ? style.display : \"\";\n    if (el[vShowHidden]) {\n      style.display = \"none\";\n    }\n  }\n}\nconst semicolonRE = /[^\\\\];\\s*$/;\nconst importantRE = /\\s*!important$/;\nfunction setStyle(style, name, val) {\n  if (isArray(val)) {\n    val.forEach((v) => setStyle(style, name, v));\n  } else {\n    if (val == null) val = \"\";\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      if (semicolonRE.test(val)) {\n        warn(\n          `Unexpected semicolon at the end of '${name}' style value: '${val}'`\n        );\n      }\n    }\n    if (name.startsWith(\"--\")) {\n      style.setProperty(name, val);\n    } else {\n      const prefixed = autoPrefix(style, name);\n      if (importantRE.test(val)) {\n        style.setProperty(\n          hyphenate(prefixed),\n          val.replace(importantRE, \"\"),\n          \"important\"\n        );\n      } else {\n        style[prefixed] = val;\n      }\n    }\n  }\n}\nconst prefixes = [\"Webkit\", \"Moz\", \"ms\"];\nconst prefixCache = {};\nfunction autoPrefix(style, rawName) {\n  const cached = prefixCache[rawName];\n  if (cached) {\n    return cached;\n  }\n  let name = camelize(rawName);\n  if (name !== \"filter\" && name in style) {\n    return prefixCache[rawName] = name;\n  }\n  name = capitalize(name);\n  for (let i = 0; i < prefixes.length; i++) {\n    const prefixed = prefixes[i] + name;\n    if (prefixed in style) {\n      return prefixCache[rawName] = prefixed;\n    }\n  }\n  return rawName;\n}\n\nconst xlinkNS = \"http://www.w3.org/1999/xlink\";\nfunction patchAttr(el, key, value, isSVG, instance, isBoolean = isSpecialBooleanAttr(key)) {\n  if (isSVG && key.startsWith(\"xlink:\")) {\n    if (value == null) {\n      el.removeAttributeNS(xlinkNS, key.slice(6, key.length));\n    } else {\n      el.setAttributeNS(xlinkNS, key, value);\n    }\n  } else {\n    if (value == null || isBoolean && !includeBooleanAttr(value)) {\n      el.removeAttribute(key);\n    } else {\n      el.setAttribute(\n        key,\n        isBoolean ? \"\" : isSymbol(value) ? String(value) : value\n      );\n    }\n  }\n}\n\nfunction patchDOMProp(el, key, value, parentComponent, attrName) {\n  if (key === \"innerHTML\" || key === \"textContent\") {\n    if (value != null) {\n      el[key] = key === \"innerHTML\" ? unsafeToTrustedHTML(value) : value;\n    }\n    return;\n  }\n  const tag = el.tagName;\n  if (key === \"value\" && tag !== \"PROGRESS\" && // custom elements may use _value internally\n  !tag.includes(\"-\")) {\n    const oldValue = tag === \"OPTION\" ? el.getAttribute(\"value\") || \"\" : el.value;\n    const newValue = value == null ? (\n      // #11647: value should be set as empty string for null and undefined,\n      // but <input type=\"checkbox\"> should be set as 'on'.\n      el.type === \"checkbox\" ? \"on\" : \"\"\n    ) : String(value);\n    if (oldValue !== newValue || !(\"_value\" in el)) {\n      el.value = newValue;\n    }\n    if (value == null) {\n      el.removeAttribute(key);\n    }\n    el._value = value;\n    return;\n  }\n  let needRemove = false;\n  if (value === \"\" || value == null) {\n    const type = typeof el[key];\n    if (type === \"boolean\") {\n      value = includeBooleanAttr(value);\n    } else if (value == null && type === \"string\") {\n      value = \"\";\n      needRemove = true;\n    } else if (type === \"number\") {\n      value = 0;\n      needRemove = true;\n    }\n  }\n  try {\n    el[key] = value;\n  } catch (e) {\n    if (!!(process.env.NODE_ENV !== \"production\") && !needRemove) {\n      warn(\n        `Failed setting prop \"${key}\" on <${tag.toLowerCase()}>: value ${value} is invalid.`,\n        e\n      );\n    }\n  }\n  needRemove && el.removeAttribute(attrName || key);\n}\n\nfunction addEventListener(el, event, handler, options) {\n  el.addEventListener(event, handler, options);\n}\nfunction removeEventListener(el, event, handler, options) {\n  el.removeEventListener(event, handler, options);\n}\nconst veiKey = Symbol(\"_vei\");\nfunction patchEvent(el, rawName, prevValue, nextValue, instance = null) {\n  const invokers = el[veiKey] || (el[veiKey] = {});\n  const existingInvoker = invokers[rawName];\n  if (nextValue && existingInvoker) {\n    existingInvoker.value = !!(process.env.NODE_ENV !== \"production\") ? sanitizeEventValue(nextValue, rawName) : nextValue;\n  } else {\n    const [name, options] = parseName(rawName);\n    if (nextValue) {\n      const invoker = invokers[rawName] = createInvoker(\n        !!(process.env.NODE_ENV !== \"production\") ? sanitizeEventValue(nextValue, rawName) : nextValue,\n        instance\n      );\n      addEventListener(el, name, invoker, options);\n    } else if (existingInvoker) {\n      removeEventListener(el, name, existingInvoker, options);\n      invokers[rawName] = void 0;\n    }\n  }\n}\nconst optionsModifierRE = /(?:Once|Passive|Capture)$/;\nfunction parseName(name) {\n  let options;\n  if (optionsModifierRE.test(name)) {\n    options = {};\n    let m;\n    while (m = name.match(optionsModifierRE)) {\n      name = name.slice(0, name.length - m[0].length);\n      options[m[0].toLowerCase()] = true;\n    }\n  }\n  const event = name[2] === \":\" ? name.slice(3) : hyphenate(name.slice(2));\n  return [event, options];\n}\nlet cachedNow = 0;\nconst p = /* @__PURE__ */ Promise.resolve();\nconst getNow = () => cachedNow || (p.then(() => cachedNow = 0), cachedNow = Date.now());\nfunction createInvoker(initialValue, instance) {\n  const invoker = (e) => {\n    if (!e._vts) {\n      e._vts = Date.now();\n    } else if (e._vts <= invoker.attached) {\n      return;\n    }\n    callWithAsyncErrorHandling(\n      patchStopImmediatePropagation(e, invoker.value),\n      instance,\n      5,\n      [e]\n    );\n  };\n  invoker.value = initialValue;\n  invoker.attached = getNow();\n  return invoker;\n}\nfunction sanitizeEventValue(value, propName) {\n  if (isFunction(value) || isArray(value)) {\n    return value;\n  }\n  warn(\n    `Wrong type passed as event handler to ${propName} - did you forget @ or : in front of your prop?\nExpected function or array of functions, received type ${typeof value}.`\n  );\n  return NOOP;\n}\nfunction patchStopImmediatePropagation(e, value) {\n  if (isArray(value)) {\n    const originalStop = e.stopImmediatePropagation;\n    e.stopImmediatePropagation = () => {\n      originalStop.call(e);\n      e._stopped = true;\n    };\n    return value.map(\n      (fn) => (e2) => !e2._stopped && fn && fn(e2)\n    );\n  } else {\n    return value;\n  }\n}\n\nconst isNativeOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // lowercase letter\nkey.charCodeAt(2) > 96 && key.charCodeAt(2) < 123;\nconst patchProp = (el, key, prevValue, nextValue, namespace, parentComponent) => {\n  const isSVG = namespace === \"svg\";\n  if (key === \"class\") {\n    patchClass(el, nextValue, isSVG);\n  } else if (key === \"style\") {\n    patchStyle(el, prevValue, nextValue);\n  } else if (isOn(key)) {\n    if (!isModelListener(key)) {\n      patchEvent(el, key, prevValue, nextValue, parentComponent);\n    }\n  } else if (key[0] === \".\" ? (key = key.slice(1), true) : key[0] === \"^\" ? (key = key.slice(1), false) : shouldSetAsProp(el, key, nextValue, isSVG)) {\n    patchDOMProp(el, key, nextValue);\n    if (!el.tagName.includes(\"-\") && (key === \"value\" || key === \"checked\" || key === \"selected\")) {\n      patchAttr(el, key, nextValue, isSVG, parentComponent, key !== \"value\");\n    }\n  } else if (\n    // #11081 force set props for possible async custom element\n    el._isVueCE && (/[A-Z]/.test(key) || !isString(nextValue))\n  ) {\n    patchDOMProp(el, camelize$1(key), nextValue, parentComponent, key);\n  } else {\n    if (key === \"true-value\") {\n      el._trueValue = nextValue;\n    } else if (key === \"false-value\") {\n      el._falseValue = nextValue;\n    }\n    patchAttr(el, key, nextValue, isSVG);\n  }\n};\nfunction shouldSetAsProp(el, key, value, isSVG) {\n  if (isSVG) {\n    if (key === \"innerHTML\" || key === \"textContent\") {\n      return true;\n    }\n    if (key in el && isNativeOn(key) && isFunction(value)) {\n      return true;\n    }\n    return false;\n  }\n  if (key === \"spellcheck\" || key === \"draggable\" || key === \"translate\") {\n    return false;\n  }\n  if (key === \"form\") {\n    return false;\n  }\n  if (key === \"list\" && el.tagName === \"INPUT\") {\n    return false;\n  }\n  if (key === \"type\" && el.tagName === \"TEXTAREA\") {\n    return false;\n  }\n  if (key === \"width\" || key === \"height\") {\n    const tag = el.tagName;\n    if (tag === \"IMG\" || tag === \"VIDEO\" || tag === \"CANVAS\" || tag === \"SOURCE\") {\n      return false;\n    }\n  }\n  if (isNativeOn(key) && isString(value)) {\n    return false;\n  }\n  return key in el;\n}\n\nconst REMOVAL = {};\n/*! #__NO_SIDE_EFFECTS__ */\n// @__NO_SIDE_EFFECTS__\nfunction defineCustomElement(options, extraOptions, _createApp) {\n  const Comp = defineComponent(options, extraOptions);\n  if (isPlainObject(Comp)) extend(Comp, extraOptions);\n  class VueCustomElement extends VueElement {\n    constructor(initialProps) {\n      super(Comp, initialProps, _createApp);\n    }\n  }\n  VueCustomElement.def = Comp;\n  return VueCustomElement;\n}\n/*! #__NO_SIDE_EFFECTS__ */\nconst defineSSRCustomElement = /* @__NO_SIDE_EFFECTS__ */ (options, extraOptions) => {\n  return /* @__PURE__ */ defineCustomElement(options, extraOptions, createSSRApp);\n};\nconst BaseClass = typeof HTMLElement !== \"undefined\" ? HTMLElement : class {\n};\nclass VueElement extends BaseClass {\n  constructor(_def, _props = {}, _createApp = createApp) {\n    super();\n    this._def = _def;\n    this._props = _props;\n    this._createApp = _createApp;\n    this._isVueCE = true;\n    /**\n     * @internal\n     */\n    this._instance = null;\n    /**\n     * @internal\n     */\n    this._app = null;\n    /**\n     * @internal\n     */\n    this._nonce = this._def.nonce;\n    this._connected = false;\n    this._resolved = false;\n    this._numberProps = null;\n    this._styleChildren = /* @__PURE__ */ new WeakSet();\n    this._ob = null;\n    if (this.shadowRoot && _createApp !== createApp) {\n      this._root = this.shadowRoot;\n    } else {\n      if (!!(process.env.NODE_ENV !== \"production\") && this.shadowRoot) {\n        warn(\n          `Custom element has pre-rendered declarative shadow root but is not defined as hydratable. Use \\`defineSSRCustomElement\\`.`\n        );\n      }\n      if (_def.shadowRoot !== false) {\n        this.attachShadow({ mode: \"open\" });\n        this._root = this.shadowRoot;\n      } else {\n        this._root = this;\n      }\n    }\n    if (!this._def.__asyncLoader) {\n      this._resolveProps(this._def);\n    }\n  }\n  connectedCallback() {\n    if (!this.isConnected) return;\n    if (!this.shadowRoot) {\n      this._parseSlots();\n    }\n    this._connected = true;\n    let parent = this;\n    while (parent = parent && (parent.parentNode || parent.host)) {\n      if (parent instanceof VueElement) {\n        this._parent = parent;\n        break;\n      }\n    }\n    if (!this._instance) {\n      if (this._resolved) {\n        this._setParent();\n        this._update();\n      } else {\n        if (parent && parent._pendingResolve) {\n          this._pendingResolve = parent._pendingResolve.then(() => {\n            this._pendingResolve = void 0;\n            this._resolveDef();\n          });\n        } else {\n          this._resolveDef();\n        }\n      }\n    }\n  }\n  _setParent(parent = this._parent) {\n    if (parent) {\n      this._instance.parent = parent._instance;\n      this._instance.provides = parent._instance.provides;\n    }\n  }\n  disconnectedCallback() {\n    this._connected = false;\n    nextTick(() => {\n      if (!this._connected) {\n        if (this._ob) {\n          this._ob.disconnect();\n          this._ob = null;\n        }\n        this._app && this._app.unmount();\n        if (this._instance) this._instance.ce = void 0;\n        this._app = this._instance = null;\n      }\n    });\n  }\n  /**\n   * resolve inner component definition (handle possible async component)\n   */\n  _resolveDef() {\n    if (this._pendingResolve) {\n      return;\n    }\n    for (let i = 0; i < this.attributes.length; i++) {\n      this._setAttr(this.attributes[i].name);\n    }\n    this._ob = new MutationObserver((mutations) => {\n      for (const m of mutations) {\n        this._setAttr(m.attributeName);\n      }\n    });\n    this._ob.observe(this, { attributes: true });\n    const resolve = (def, isAsync = false) => {\n      this._resolved = true;\n      this._pendingResolve = void 0;\n      const { props, styles } = def;\n      let numberProps;\n      if (props && !isArray(props)) {\n        for (const key in props) {\n          const opt = props[key];\n          if (opt === Number || opt && opt.type === Number) {\n            if (key in this._props) {\n              this._props[key] = toNumber(this._props[key]);\n            }\n            (numberProps || (numberProps = /* @__PURE__ */ Object.create(null)))[camelize$1(key)] = true;\n          }\n        }\n      }\n      this._numberProps = numberProps;\n      if (isAsync) {\n        this._resolveProps(def);\n      }\n      if (this.shadowRoot) {\n        this._applyStyles(styles);\n      } else if (!!(process.env.NODE_ENV !== \"production\") && styles) {\n        warn(\n          \"Custom element style injection is not supported when using shadowRoot: false\"\n        );\n      }\n      this._mount(def);\n    };\n    const asyncDef = this._def.__asyncLoader;\n    if (asyncDef) {\n      this._pendingResolve = asyncDef().then(\n        (def) => resolve(this._def = def, true)\n      );\n    } else {\n      resolve(this._def);\n    }\n  }\n  _mount(def) {\n    if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) && !def.name) {\n      def.name = \"VueElement\";\n    }\n    this._app = this._createApp(def);\n    if (def.configureApp) {\n      def.configureApp(this._app);\n    }\n    this._app._ceVNode = this._createVNode();\n    this._app.mount(this._root);\n    const exposed = this._instance && this._instance.exposed;\n    if (!exposed) return;\n    for (const key in exposed) {\n      if (!hasOwn(this, key)) {\n        Object.defineProperty(this, key, {\n          // unwrap ref to be consistent with public instance behavior\n          get: () => unref(exposed[key])\n        });\n      } else if (!!(process.env.NODE_ENV !== \"production\")) {\n        warn(`Exposed property \"${key}\" already exists on custom element.`);\n      }\n    }\n  }\n  _resolveProps(def) {\n    const { props } = def;\n    const declaredPropKeys = isArray(props) ? props : Object.keys(props || {});\n    for (const key of Object.keys(this)) {\n      if (key[0] !== \"_\" && declaredPropKeys.includes(key)) {\n        this._setProp(key, this[key]);\n      }\n    }\n    for (const key of declaredPropKeys.map(camelize$1)) {\n      Object.defineProperty(this, key, {\n        get() {\n          return this._getProp(key);\n        },\n        set(val) {\n          this._setProp(key, val, true, true);\n        }\n      });\n    }\n  }\n  _setAttr(key) {\n    if (key.startsWith(\"data-v-\")) return;\n    const has = this.hasAttribute(key);\n    let value = has ? this.getAttribute(key) : REMOVAL;\n    const camelKey = camelize$1(key);\n    if (has && this._numberProps && this._numberProps[camelKey]) {\n      value = toNumber(value);\n    }\n    this._setProp(camelKey, value, false, true);\n  }\n  /**\n   * @internal\n   */\n  _getProp(key) {\n    return this._props[key];\n  }\n  /**\n   * @internal\n   */\n  _setProp(key, val, shouldReflect = true, shouldUpdate = false) {\n    if (val !== this._props[key]) {\n      if (val === REMOVAL) {\n        delete this._props[key];\n      } else {\n        this._props[key] = val;\n        if (key === \"key\" && this._app) {\n          this._app._ceVNode.key = val;\n        }\n      }\n      if (shouldUpdate && this._instance) {\n        this._update();\n      }\n      if (shouldReflect) {\n        if (val === true) {\n          this.setAttribute(hyphenate(key), \"\");\n        } else if (typeof val === \"string\" || typeof val === \"number\") {\n          this.setAttribute(hyphenate(key), val + \"\");\n        } else if (!val) {\n          this.removeAttribute(hyphenate(key));\n        }\n      }\n    }\n  }\n  _update() {\n    render(this._createVNode(), this._root);\n  }\n  _createVNode() {\n    const baseProps = {};\n    if (!this.shadowRoot) {\n      baseProps.onVnodeMounted = baseProps.onVnodeUpdated = this._renderSlots.bind(this);\n    }\n    const vnode = createVNode(this._def, extend(baseProps, this._props));\n    if (!this._instance) {\n      vnode.ce = (instance) => {\n        this._instance = instance;\n        instance.ce = this;\n        instance.isCE = true;\n        if (!!(process.env.NODE_ENV !== \"production\")) {\n          instance.ceReload = (newStyles) => {\n            if (this._styles) {\n              this._styles.forEach((s) => this._root.removeChild(s));\n              this._styles.length = 0;\n            }\n            this._applyStyles(newStyles);\n            this._instance = null;\n            this._update();\n          };\n        }\n        const dispatch = (event, args) => {\n          this.dispatchEvent(\n            new CustomEvent(\n              event,\n              isPlainObject(args[0]) ? extend({ detail: args }, args[0]) : { detail: args }\n            )\n          );\n        };\n        instance.emit = (event, ...args) => {\n          dispatch(event, args);\n          if (hyphenate(event) !== event) {\n            dispatch(hyphenate(event), args);\n          }\n        };\n        this._setParent();\n      };\n    }\n    return vnode;\n  }\n  _applyStyles(styles, owner) {\n    if (!styles) return;\n    if (owner) {\n      if (owner === this._def || this._styleChildren.has(owner)) {\n        return;\n      }\n      this._styleChildren.add(owner);\n    }\n    const nonce = this._nonce;\n    for (let i = styles.length - 1; i >= 0; i--) {\n      const s = document.createElement(\"style\");\n      if (nonce) s.setAttribute(\"nonce\", nonce);\n      s.textContent = styles[i];\n      this.shadowRoot.prepend(s);\n      if (!!(process.env.NODE_ENV !== \"production\")) {\n        if (owner) {\n          if (owner.__hmrId) {\n            if (!this._childStyles) this._childStyles = /* @__PURE__ */ new Map();\n            let entry = this._childStyles.get(owner.__hmrId);\n            if (!entry) {\n              this._childStyles.set(owner.__hmrId, entry = []);\n            }\n            entry.push(s);\n          }\n        } else {\n          (this._styles || (this._styles = [])).push(s);\n        }\n      }\n    }\n  }\n  /**\n   * Only called when shadowRoot is false\n   */\n  _parseSlots() {\n    const slots = this._slots = {};\n    let n;\n    while (n = this.firstChild) {\n      const slotName = n.nodeType === 1 && n.getAttribute(\"slot\") || \"default\";\n      (slots[slotName] || (slots[slotName] = [])).push(n);\n      this.removeChild(n);\n    }\n  }\n  /**\n   * Only called when shadowRoot is false\n   */\n  _renderSlots() {\n    const outlets = (this._teleportTarget || this).querySelectorAll(\"slot\");\n    const scopeId = this._instance.type.__scopeId;\n    for (let i = 0; i < outlets.length; i++) {\n      const o = outlets[i];\n      const slotName = o.getAttribute(\"name\") || \"default\";\n      const content = this._slots[slotName];\n      const parent = o.parentNode;\n      if (content) {\n        for (const n of content) {\n          if (scopeId && n.nodeType === 1) {\n            const id = scopeId + \"-s\";\n            const walker = document.createTreeWalker(n, 1);\n            n.setAttribute(id, \"\");\n            let child;\n            while (child = walker.nextNode()) {\n              child.setAttribute(id, \"\");\n            }\n          }\n          parent.insertBefore(n, o);\n        }\n      } else {\n        while (o.firstChild) parent.insertBefore(o.firstChild, o);\n      }\n      parent.removeChild(o);\n    }\n  }\n  /**\n   * @internal\n   */\n  _injectChildStyle(comp) {\n    this._applyStyles(comp.styles, comp);\n  }\n  /**\n   * @internal\n   */\n  _removeChildStyle(comp) {\n    if (!!(process.env.NODE_ENV !== \"production\")) {\n      this._styleChildren.delete(comp);\n      if (this._childStyles && comp.__hmrId) {\n        const oldStyles = this._childStyles.get(comp.__hmrId);\n        if (oldStyles) {\n          oldStyles.forEach((s) => this._root.removeChild(s));\n          oldStyles.length = 0;\n        }\n      }\n    }\n  }\n}\nfunction useHost(caller) {\n  const instance = getCurrentInstance();\n  const el = instance && instance.ce;\n  if (el) {\n    return el;\n  } else if (!!(process.env.NODE_ENV !== \"production\")) {\n    if (!instance) {\n      warn(\n        `${caller || \"useHost\"} called without an active component instance.`\n      );\n    } else {\n      warn(\n        `${caller || \"useHost\"} can only be used in components defined via defineCustomElement.`\n      );\n    }\n  }\n  return null;\n}\nfunction useShadowRoot() {\n  const el = !!(process.env.NODE_ENV !== \"production\") ? useHost(\"useShadowRoot\") : useHost();\n  return el && el.shadowRoot;\n}\n\nfunction useCssModule(name = \"$style\") {\n  {\n    const instance = getCurrentInstance();\n    if (!instance) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(`useCssModule must be called inside setup()`);\n      return EMPTY_OBJ;\n    }\n    const modules = instance.type.__cssModules;\n    if (!modules) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(`Current instance does not have CSS modules injected.`);\n      return EMPTY_OBJ;\n    }\n    const mod = modules[name];\n    if (!mod) {\n      !!(process.env.NODE_ENV !== \"production\") && warn(`Current instance does not have CSS module named \"${name}\".`);\n      return EMPTY_OBJ;\n    }\n    return mod;\n  }\n}\n\nconst positionMap = /* @__PURE__ */ new WeakMap();\nconst newPositionMap = /* @__PURE__ */ new WeakMap();\nconst moveCbKey = Symbol(\"_moveCb\");\nconst enterCbKey = Symbol(\"_enterCb\");\nconst decorate = (t) => {\n  delete t.props.mode;\n  return t;\n};\nconst TransitionGroupImpl = /* @__PURE__ */ decorate({\n  name: \"TransitionGroup\",\n  props: /* @__PURE__ */ extend({}, TransitionPropsValidators, {\n    tag: String,\n    moveClass: String\n  }),\n  setup(props, { slots }) {\n    const instance = getCurrentInstance();\n    const state = useTransitionState();\n    let prevChildren;\n    let children;\n    onUpdated(() => {\n      if (!prevChildren.length) {\n        return;\n      }\n      const moveClass = props.moveClass || `${props.name || \"v\"}-move`;\n      if (!hasCSSTransform(\n        prevChildren[0].el,\n        instance.vnode.el,\n        moveClass\n      )) {\n        return;\n      }\n      prevChildren.forEach(callPendingCbs);\n      prevChildren.forEach(recordPosition);\n      const movedChildren = prevChildren.filter(applyTranslation);\n      forceReflow();\n      movedChildren.forEach((c) => {\n        const el = c.el;\n        const style = el.style;\n        addTransitionClass(el, moveClass);\n        style.transform = style.webkitTransform = style.transitionDuration = \"\";\n        const cb = el[moveCbKey] = (e) => {\n          if (e && e.target !== el) {\n            return;\n          }\n          if (!e || /transform$/.test(e.propertyName)) {\n            el.removeEventListener(\"transitionend\", cb);\n            el[moveCbKey] = null;\n            removeTransitionClass(el, moveClass);\n          }\n        };\n        el.addEventListener(\"transitionend\", cb);\n      });\n    });\n    return () => {\n      const rawProps = toRaw(props);\n      const cssTransitionProps = resolveTransitionProps(rawProps);\n      let tag = rawProps.tag || Fragment;\n      prevChildren = [];\n      if (children) {\n        for (let i = 0; i < children.length; i++) {\n          const child = children[i];\n          if (child.el && child.el instanceof Element) {\n            prevChildren.push(child);\n            setTransitionHooks(\n              child,\n              resolveTransitionHooks(\n                child,\n                cssTransitionProps,\n                state,\n                instance\n              )\n            );\n            positionMap.set(\n              child,\n              child.el.getBoundingClientRect()\n            );\n          }\n        }\n      }\n      children = slots.default ? getTransitionRawChildren(slots.default()) : [];\n      for (let i = 0; i < children.length; i++) {\n        const child = children[i];\n        if (child.key != null) {\n          setTransitionHooks(\n            child,\n            resolveTransitionHooks(child, cssTransitionProps, state, instance)\n          );\n        } else if (!!(process.env.NODE_ENV !== \"production\") && child.type !== Text) {\n          warn(`<TransitionGroup> children must be keyed.`);\n        }\n      }\n      return createVNode(tag, null, children);\n    };\n  }\n});\nconst TransitionGroup = TransitionGroupImpl;\nfunction callPendingCbs(c) {\n  const el = c.el;\n  if (el[moveCbKey]) {\n    el[moveCbKey]();\n  }\n  if (el[enterCbKey]) {\n    el[enterCbKey]();\n  }\n}\nfunction recordPosition(c) {\n  newPositionMap.set(c, c.el.getBoundingClientRect());\n}\nfunction applyTranslation(c) {\n  const oldPos = positionMap.get(c);\n  const newPos = newPositionMap.get(c);\n  const dx = oldPos.left - newPos.left;\n  const dy = oldPos.top - newPos.top;\n  if (dx || dy) {\n    const s = c.el.style;\n    s.transform = s.webkitTransform = `translate(${dx}px,${dy}px)`;\n    s.transitionDuration = \"0s\";\n    return c;\n  }\n}\nfunction hasCSSTransform(el, root, moveClass) {\n  const clone = el.cloneNode();\n  const _vtc = el[vtcKey];\n  if (_vtc) {\n    _vtc.forEach((cls) => {\n      cls.split(/\\s+/).forEach((c) => c && clone.classList.remove(c));\n    });\n  }\n  moveClass.split(/\\s+/).forEach((c) => c && clone.classList.add(c));\n  clone.style.display = \"none\";\n  const container = root.nodeType === 1 ? root : root.parentNode;\n  container.appendChild(clone);\n  const { hasTransform } = getTransitionInfo(clone);\n  container.removeChild(clone);\n  return hasTransform;\n}\n\nconst getModelAssigner = (vnode) => {\n  const fn = vnode.props[\"onUpdate:modelValue\"] || false;\n  return isArray(fn) ? (value) => invokeArrayFns(fn, value) : fn;\n};\nfunction onCompositionStart(e) {\n  e.target.composing = true;\n}\nfunction onCompositionEnd(e) {\n  const target = e.target;\n  if (target.composing) {\n    target.composing = false;\n    target.dispatchEvent(new Event(\"input\"));\n  }\n}\nconst assignKey = Symbol(\"_assign\");\nconst vModelText = {\n  created(el, { modifiers: { lazy, trim, number } }, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    const castToNumber = number || vnode.props && vnode.props.type === \"number\";\n    addEventListener(el, lazy ? \"change\" : \"input\", (e) => {\n      if (e.target.composing) return;\n      let domValue = el.value;\n      if (trim) {\n        domValue = domValue.trim();\n      }\n      if (castToNumber) {\n        domValue = looseToNumber(domValue);\n      }\n      el[assignKey](domValue);\n    });\n    if (trim) {\n      addEventListener(el, \"change\", () => {\n        el.value = el.value.trim();\n      });\n    }\n    if (!lazy) {\n      addEventListener(el, \"compositionstart\", onCompositionStart);\n      addEventListener(el, \"compositionend\", onCompositionEnd);\n      addEventListener(el, \"change\", onCompositionEnd);\n    }\n  },\n  // set value on mounted so it's after min/max for type=\"range\"\n  mounted(el, { value }) {\n    el.value = value == null ? \"\" : value;\n  },\n  beforeUpdate(el, { value, oldValue, modifiers: { lazy, trim, number } }, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    if (el.composing) return;\n    const elValue = (number || el.type === \"number\") && !/^0\\d/.test(el.value) ? looseToNumber(el.value) : el.value;\n    const newValue = value == null ? \"\" : value;\n    if (elValue === newValue) {\n      return;\n    }\n    if (document.activeElement === el && el.type !== \"range\") {\n      if (lazy && value === oldValue) {\n        return;\n      }\n      if (trim && el.value.trim() === newValue) {\n        return;\n      }\n    }\n    el.value = newValue;\n  }\n};\nconst vModelCheckbox = {\n  // #4096 array checkboxes need to be deep traversed\n  deep: true,\n  created(el, _, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    addEventListener(el, \"change\", () => {\n      const modelValue = el._modelValue;\n      const elementValue = getValue(el);\n      const checked = el.checked;\n      const assign = el[assignKey];\n      if (isArray(modelValue)) {\n        const index = looseIndexOf(modelValue, elementValue);\n        const found = index !== -1;\n        if (checked && !found) {\n          assign(modelValue.concat(elementValue));\n        } else if (!checked && found) {\n          const filtered = [...modelValue];\n          filtered.splice(index, 1);\n          assign(filtered);\n        }\n      } else if (isSet(modelValue)) {\n        const cloned = new Set(modelValue);\n        if (checked) {\n          cloned.add(elementValue);\n        } else {\n          cloned.delete(elementValue);\n        }\n        assign(cloned);\n      } else {\n        assign(getCheckboxValue(el, checked));\n      }\n    });\n  },\n  // set initial checked on mount to wait for true-value/false-value\n  mounted: setChecked,\n  beforeUpdate(el, binding, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    setChecked(el, binding, vnode);\n  }\n};\nfunction setChecked(el, { value, oldValue }, vnode) {\n  el._modelValue = value;\n  let checked;\n  if (isArray(value)) {\n    checked = looseIndexOf(value, vnode.props.value) > -1;\n  } else if (isSet(value)) {\n    checked = value.has(vnode.props.value);\n  } else {\n    if (value === oldValue) return;\n    checked = looseEqual(value, getCheckboxValue(el, true));\n  }\n  if (el.checked !== checked) {\n    el.checked = checked;\n  }\n}\nconst vModelRadio = {\n  created(el, { value }, vnode) {\n    el.checked = looseEqual(value, vnode.props.value);\n    el[assignKey] = getModelAssigner(vnode);\n    addEventListener(el, \"change\", () => {\n      el[assignKey](getValue(el));\n    });\n  },\n  beforeUpdate(el, { value, oldValue }, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n    if (value !== oldValue) {\n      el.checked = looseEqual(value, vnode.props.value);\n    }\n  }\n};\nconst vModelSelect = {\n  // <select multiple> value need to be deep traversed\n  deep: true,\n  created(el, { value, modifiers: { number } }, vnode) {\n    const isSetModel = isSet(value);\n    addEventListener(el, \"change\", () => {\n      const selectedVal = Array.prototype.filter.call(el.options, (o) => o.selected).map(\n        (o) => number ? looseToNumber(getValue(o)) : getValue(o)\n      );\n      el[assignKey](\n        el.multiple ? isSetModel ? new Set(selectedVal) : selectedVal : selectedVal[0]\n      );\n      el._assigning = true;\n      nextTick(() => {\n        el._assigning = false;\n      });\n    });\n    el[assignKey] = getModelAssigner(vnode);\n  },\n  // set value in mounted & updated because <select> relies on its children\n  // <option>s.\n  mounted(el, { value }) {\n    setSelected(el, value);\n  },\n  beforeUpdate(el, _binding, vnode) {\n    el[assignKey] = getModelAssigner(vnode);\n  },\n  updated(el, { value }) {\n    if (!el._assigning) {\n      setSelected(el, value);\n    }\n  }\n};\nfunction setSelected(el, value) {\n  const isMultiple = el.multiple;\n  const isArrayValue = isArray(value);\n  if (isMultiple && !isArrayValue && !isSet(value)) {\n    !!(process.env.NODE_ENV !== \"production\") && warn(\n      `<select multiple v-model> expects an Array or Set value for its binding, but got ${Object.prototype.toString.call(value).slice(8, -1)}.`\n    );\n    return;\n  }\n  for (let i = 0, l = el.options.length; i < l; i++) {\n    const option = el.options[i];\n    const optionValue = getValue(option);\n    if (isMultiple) {\n      if (isArrayValue) {\n        const optionType = typeof optionValue;\n        if (optionType === \"string\" || optionType === \"number\") {\n          option.selected = value.some((v) => String(v) === String(optionValue));\n        } else {\n          option.selected = looseIndexOf(value, optionValue) > -1;\n        }\n      } else {\n        option.selected = value.has(optionValue);\n      }\n    } else if (looseEqual(getValue(option), value)) {\n      if (el.selectedIndex !== i) el.selectedIndex = i;\n      return;\n    }\n  }\n  if (!isMultiple && el.selectedIndex !== -1) {\n    el.selectedIndex = -1;\n  }\n}\nfunction getValue(el) {\n  return \"_value\" in el ? el._value : el.value;\n}\nfunction getCheckboxValue(el, checked) {\n  const key = checked ? \"_trueValue\" : \"_falseValue\";\n  return key in el ? el[key] : checked;\n}\nconst vModelDynamic = {\n  created(el, binding, vnode) {\n    callModelHook(el, binding, vnode, null, \"created\");\n  },\n  mounted(el, binding, vnode) {\n    callModelHook(el, binding, vnode, null, \"mounted\");\n  },\n  beforeUpdate(el, binding, vnode, prevVNode) {\n    callModelHook(el, binding, vnode, prevVNode, \"beforeUpdate\");\n  },\n  updated(el, binding, vnode, prevVNode) {\n    callModelHook(el, binding, vnode, prevVNode, \"updated\");\n  }\n};\nfunction resolveDynamicModel(tagName, type) {\n  switch (tagName) {\n    case \"SELECT\":\n      return vModelSelect;\n    case \"TEXTAREA\":\n      return vModelText;\n    default:\n      switch (type) {\n        case \"checkbox\":\n          return vModelCheckbox;\n        case \"radio\":\n          return vModelRadio;\n        default:\n          return vModelText;\n      }\n  }\n}\nfunction callModelHook(el, binding, vnode, prevVNode, hook) {\n  const modelToUse = resolveDynamicModel(\n    el.tagName,\n    vnode.props && vnode.props.type\n  );\n  const fn = modelToUse[hook];\n  fn && fn(el, binding, vnode, prevVNode);\n}\nfunction initVModelForSSR() {\n  vModelText.getSSRProps = ({ value }) => ({ value });\n  vModelRadio.getSSRProps = ({ value }, vnode) => {\n    if (vnode.props && looseEqual(vnode.props.value, value)) {\n      return { checked: true };\n    }\n  };\n  vModelCheckbox.getSSRProps = ({ value }, vnode) => {\n    if (isArray(value)) {\n      if (vnode.props && looseIndexOf(value, vnode.props.value) > -1) {\n        return { checked: true };\n      }\n    } else if (isSet(value)) {\n      if (vnode.props && value.has(vnode.props.value)) {\n        return { checked: true };\n      }\n    } else if (value) {\n      return { checked: true };\n    }\n  };\n  vModelDynamic.getSSRProps = (binding, vnode) => {\n    if (typeof vnode.type !== \"string\") {\n      return;\n    }\n    const modelToUse = resolveDynamicModel(\n      // resolveDynamicModel expects an uppercase tag name, but vnode.type is lowercase\n      vnode.type.toUpperCase(),\n      vnode.props && vnode.props.type\n    );\n    if (modelToUse.getSSRProps) {\n      return modelToUse.getSSRProps(binding, vnode);\n    }\n  };\n}\n\nconst systemModifiers = [\"ctrl\", \"shift\", \"alt\", \"meta\"];\nconst modifierGuards = {\n  stop: (e) => e.stopPropagation(),\n  prevent: (e) => e.preventDefault(),\n  self: (e) => e.target !== e.currentTarget,\n  ctrl: (e) => !e.ctrlKey,\n  shift: (e) => !e.shiftKey,\n  alt: (e) => !e.altKey,\n  meta: (e) => !e.metaKey,\n  left: (e) => \"button\" in e && e.button !== 0,\n  middle: (e) => \"button\" in e && e.button !== 1,\n  right: (e) => \"button\" in e && e.button !== 2,\n  exact: (e, modifiers) => systemModifiers.some((m) => e[`${m}Key`] && !modifiers.includes(m))\n};\nconst withModifiers = (fn, modifiers) => {\n  const cache = fn._withMods || (fn._withMods = {});\n  const cacheKey = modifiers.join(\".\");\n  return cache[cacheKey] || (cache[cacheKey] = (event, ...args) => {\n    for (let i = 0; i < modifiers.length; i++) {\n      const guard = modifierGuards[modifiers[i]];\n      if (guard && guard(event, modifiers)) return;\n    }\n    return fn(event, ...args);\n  });\n};\nconst keyNames = {\n  esc: \"escape\",\n  space: \" \",\n  up: \"arrow-up\",\n  left: \"arrow-left\",\n  right: \"arrow-right\",\n  down: \"arrow-down\",\n  delete: \"backspace\"\n};\nconst withKeys = (fn, modifiers) => {\n  const cache = fn._withKeys || (fn._withKeys = {});\n  const cacheKey = modifiers.join(\".\");\n  return cache[cacheKey] || (cache[cacheKey] = (event) => {\n    if (!(\"key\" in event)) {\n      return;\n    }\n    const eventKey = hyphenate(event.key);\n    if (modifiers.some(\n      (k) => k === eventKey || keyNames[k] === eventKey\n    )) {\n      return fn(event);\n    }\n  });\n};\n\nconst rendererOptions = /* @__PURE__ */ extend({ patchProp }, nodeOps);\nlet renderer;\nlet enabledHydration = false;\nfunction ensureRenderer() {\n  return renderer || (renderer = createRenderer(rendererOptions));\n}\nfunction ensureHydrationRenderer() {\n  renderer = enabledHydration ? renderer : createHydrationRenderer(rendererOptions);\n  enabledHydration = true;\n  return renderer;\n}\nconst render = (...args) => {\n  ensureRenderer().render(...args);\n};\nconst hydrate = (...args) => {\n  ensureHydrationRenderer().hydrate(...args);\n};\nconst createApp = (...args) => {\n  const app = ensureRenderer().createApp(...args);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    injectNativeTagCheck(app);\n    injectCompilerOptionsCheck(app);\n  }\n  const { mount } = app;\n  app.mount = (containerOrSelector) => {\n    const container = normalizeContainer(containerOrSelector);\n    if (!container) return;\n    const component = app._component;\n    if (!isFunction(component) && !component.render && !component.template) {\n      component.template = container.innerHTML;\n    }\n    if (container.nodeType === 1) {\n      container.textContent = \"\";\n    }\n    const proxy = mount(container, false, resolveRootNamespace(container));\n    if (container instanceof Element) {\n      container.removeAttribute(\"v-cloak\");\n      container.setAttribute(\"data-v-app\", \"\");\n    }\n    return proxy;\n  };\n  return app;\n};\nconst createSSRApp = (...args) => {\n  const app = ensureHydrationRenderer().createApp(...args);\n  if (!!(process.env.NODE_ENV !== \"production\")) {\n    injectNativeTagCheck(app);\n    injectCompilerOptionsCheck(app);\n  }\n  const { mount } = app;\n  app.mount = (containerOrSelector) => {\n    const container = normalizeContainer(containerOrSelector);\n    if (container) {\n      return mount(container, true, resolveRootNamespace(container));\n    }\n  };\n  return app;\n};\nfunction resolveRootNamespace(container) {\n  if (container instanceof SVGElement) {\n    return \"svg\";\n  }\n  if (typeof MathMLElement === \"function\" && container instanceof MathMLElement) {\n    return \"mathml\";\n  }\n}\nfunction injectNativeTagCheck(app) {\n  Object.defineProperty(app.config, \"isNativeTag\", {\n    value: (tag) => isHTMLTag(tag) || isSVGTag(tag) || isMathMLTag(tag),\n    writable: false\n  });\n}\nfunction injectCompilerOptionsCheck(app) {\n  if (isRuntimeOnly()) {\n    const isCustomElement = app.config.isCustomElement;\n    Object.defineProperty(app.config, \"isCustomElement\", {\n      get() {\n        return isCustomElement;\n      },\n      set() {\n        warn(\n          `The \\`isCustomElement\\` config option is deprecated. Use \\`compilerOptions.isCustomElement\\` instead.`\n        );\n      }\n    });\n    const compilerOptions = app.config.compilerOptions;\n    const msg = `The \\`compilerOptions\\` config option is only respected when using a build of Vue.js that includes the runtime compiler (aka \"full build\"). Since you are using the runtime-only build, \\`compilerOptions\\` must be passed to \\`@vue/compiler-dom\\` in the build setup instead.\n- For vue-loader: pass it via vue-loader's \\`compilerOptions\\` loader option.\n- For vue-cli: see https://cli.vuejs.org/guide/webpack.html#modifying-options-of-a-loader\n- For vite: pass it via @vitejs/plugin-vue options. See https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#example-for-passing-options-to-vuecompiler-sfc`;\n    Object.defineProperty(app.config, \"compilerOptions\", {\n      get() {\n        warn(msg);\n        return compilerOptions;\n      },\n      set() {\n        warn(msg);\n      }\n    });\n  }\n}\nfunction normalizeContainer(container) {\n  if (isString(container)) {\n    const res = document.querySelector(container);\n    if (!!(process.env.NODE_ENV !== \"production\") && !res) {\n      warn(\n        `Failed to mount app: mount target selector \"${container}\" returned null.`\n      );\n    }\n    return res;\n  }\n  if (!!(process.env.NODE_ENV !== \"production\") && window.ShadowRoot && container instanceof window.ShadowRoot && container.mode === \"closed\") {\n    warn(\n      `mounting on a ShadowRoot with \\`{mode: \"closed\"}\\` may lead to unpredictable bugs`\n    );\n  }\n  return container;\n}\nlet ssrDirectiveInitialized = false;\nconst initDirectivesForSSR = () => {\n  if (!ssrDirectiveInitialized) {\n    ssrDirectiveInitialized = true;\n    initVModelForSSR();\n    initVShowForSSR();\n  }\n} ;\n\nexport { Transition, TransitionGroup, VueElement, createApp, createSSRApp, defineCustomElement, defineSSRCustomElement, hydrate, initDirectivesForSSR, render, useCssModule, useCssVars, useHost, useShadowRoot, vModelCheckbox, vModelDynamic, vModelRadio, vModelSelect, vModelText, vShow, withKeys, withModifiers };\n","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => {\n  __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n  return value;\n};\nimport { inject, proxyRefs, markRaw, ref, reactive, getCurrentInstance, provide, computed, unref, onActivated, onMounted, queuePostFlushCb, onBeforeUnmount, onBeforeMount, onUpdated, warn, h, setTransitionHooks, callWithAsyncErrorHandling, ErrorCodes, shallowRef, resolveComponent, openBlock, createElementBlock, createElementVNode, createVNode, defineComponent, Transition, withCtx, createBlock, createCommentVNode, customRef, onScopeDispose, TransitionGroup, Fragment, renderList, isRef, onDeactivated, normalizeClass, normalizeStyle } from \"vue\";\nconst _UrlHelper = class _UrlHelper {\n  constructor(url, localFixedPrefix) {\n    __publicField(this, \"url\");\n    __publicField(this, \"localFixedPrefix\");\n    this.url = new URL(url ?? window.location.href);\n    this.localFixedPrefix = localFixedPrefix ?? null;\n  }\n  get path() {\n    return this.url.pathname;\n  }\n  get hash() {\n    return this.url.hash;\n  }\n  get href() {\n    return this.url.href;\n  }\n  get fullPrefix() {\n    let prefix = _UrlHelper.fixedPrefix ? _UrlHelper.trim(_UrlHelper.fixedPrefix) : null;\n    if (this.localFixedPrefix) {\n      if (prefix) {\n        prefix += \"/\" + _UrlHelper.trim(this.localFixedPrefix);\n      } else {\n        prefix = _UrlHelper.trim(this.localFixedPrefix);\n      }\n    }\n    return prefix;\n  }\n  setPath(path) {\n    this.url.pathname = path;\n  }\n  setDomain(domain, protocol = \"https\") {\n    this.url.host = domain;\n    this.url.protocol = protocol;\n  }\n  /**\n   * Get full path, with the locale removed by default\n   * /your-path/test?q=t#hash\n   */\n  getPath(options) {\n    const search = new URL(this.href ?? \"/\", \"https://\" + window.location.hostname).search;\n    return \"/\" + this.getParts(options).join(\"/\") + search + this.hash;\n  }\n  getHostWithProtocol() {\n    const url = new URL(this.href ?? \"/\", \"https://\" + window.location.hostname);\n    return url.protocol + \"//\" + url.host;\n  }\n  getFullHref(options) {\n    const url = new URL(this.href ?? \"/\", \"https://\" + window.location.hostname);\n    return url.protocol + \"//\" + ((options == null ? void 0 : options.host) ?? url.host) + this.getPath(options);\n  }\n  getParts(options) {\n    var _a;\n    const parts = ((_a = this.path) == null ? void 0 : _a.substring(1).split(\"/\")) ?? [];\n    if (parts.length > 0 && parts[parts.length - 1] === \"\") {\n      parts.pop();\n    }\n    if (parts.length > 0 && ((options == null ? void 0 : options.removeLocale) === void 0 || (options == null ? void 0 : options.removeLocale) === true) && (parts[0].length == 5 && parts[0].substring(2, 3) === \"-\" || parts[0].length == 2)) {\n      parts.shift();\n    }\n    if (((options == null ? void 0 : options.removePrefix) === void 0 || (options == null ? void 0 : options.removePrefix) === true) && this.fullPrefix) {\n      for (const part of this.fullPrefix.split(\"/\") ?? []) {\n        if (parts.length > 0 && parts[0] === part) {\n          parts.shift();\n        } else {\n          break;\n        }\n      }\n    }\n    if (options == null ? void 0 : options.appendPrefix) {\n      parts.unshift(options.appendPrefix);\n    }\n    return parts;\n  }\n  getSearchParams() {\n    return this.url.searchParams;\n  }\n  getHashParams() {\n    var _a;\n    return new URLSearchParams(\n      ((_a = this.hash) == null ? void 0 : _a.substr(1)) ?? \"\"\n      // skip the first char (#)\n    );\n  }\n  clear() {\n    this.url = new URL(\"/\", \"https://\" + window.location.hostname);\n  }\n  /**\n   * override params\n   */\n  static setSearchParams(params) {\n    const helper = new _UrlHelper();\n    const url = new URL(helper.getFullHref());\n    url.search = params.toString();\n    this.setUrl(url.pathname + url.search + url.hash);\n  }\n  /**\n   * override params\n   */\n  static addSearchParam(key, value) {\n    const helper = new _UrlHelper();\n    const url = new URL(helper.getFullHref());\n    url.searchParams.set(key, value);\n    url.search = url.searchParams.toString();\n    this.setUrl(url.pathname + url.search + url.hash);\n  }\n  /**\n   * Return a transformed url (adds locale and fixed prefix to it)\n   */\n  static transformUrl(url, localFixedPrefix) {\n    let prefix = this.fixedPrefix ? \"/\" + _UrlHelper.trim(this.fixedPrefix) : \"\";\n    if (localFixedPrefix) {\n      prefix += \"/\" + _UrlHelper.trim(localFixedPrefix);\n    }\n    if (this.localePrefix) {\n      return \"/\" + _UrlHelper.trim(this.localePrefix) + prefix + \"/\" + _UrlHelper.trim(url);\n    }\n    return prefix + \"/\" + _UrlHelper.trim(url);\n  }\n  /**\n   * @deprecated\n   * setURL, but add locale\n   */\n  static setUrl(url) {\n    console.warn(\"Used UrlHelper.setUrl\", url, \"which should be replaced with this.setUrl()\");\n  }\n  static trim(url) {\n    return url.replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n  }\n  match(template, params) {\n    return matchPath(this.getParts(), this.getSearchParams(), template, params);\n  }\n};\n/** \n * Use this for the universal fixed prefix\n * \n * Always remove this prefix when getting an url, and add it when doing setUrl.\n * When you want to host an app in a subdirectory\n * Slashes are added automatically on the sides if needed\n*/\n__publicField(_UrlHelper, \"fixedPrefix\", null);\n__publicField(_UrlHelper, \"localePrefix\", null);\n__publicField(_UrlHelper, \"shared\", new _UrlHelper(window.location.href));\n/**\n * The original values when loading the page. Do not modify this one.\n */\n__publicField(_UrlHelper, \"initial\", new _UrlHelper(window.location.href));\nlet UrlHelper = _UrlHelper;\nfunction matchPath(path, query, template, params) {\n  const parts = Array.isArray(path) ? path : UrlHelper.trim(path).split(\"/\");\n  const templateParts = UrlHelper.trim(template).split(\"/\");\n  if (parts.length < templateParts.length) {\n    return;\n  }\n  const resultParams = {};\n  for (let index = 0; index < templateParts.length; index++) {\n    const templatePart = templateParts[index];\n    const part = parts[index];\n    if (templatePart !== part) {\n      if (templatePart[0] === \"@\") {\n        const param = templatePart.substr(1);\n        if (params[param]) {\n          resultParams[param] = params[param](part);\n          if (typeof resultParams[param] === \"number\") {\n            if (!Number.isInteger(resultParams[param])) {\n              return;\n            }\n          }\n          continue;\n        }\n      }\n      return;\n    }\n  }\n  return {\n    params: resultParams,\n    url: parts.slice(0, templateParts.length).join(\"/\"),\n    query\n  };\n}\nfunction matchQuery() {\n}\nfunction templateToUrl(template, params) {\n  const templateParts = UrlHelper.trim(template).split(\"/\");\n  for (let index = 0; index < templateParts.length; index++) {\n    const templatePart = templateParts[index];\n    if (templatePart[0] === \"@\") {\n      const param = templatePart.substr(1);\n      if (params[param]) {\n        templateParts[index] = params[param].toString();\n      } else {\n        throw new Error(\"Missing param: \" + param);\n      }\n    }\n  }\n  return templateParts.slice(0, templateParts.length).join(\"/\");\n}\nclass HistoryManagerStatic {\n  constructor() {\n    // undoActions: Map<number, (animate: boolean) => void> = new Map();\n    __publicField(this, \"states\", []);\n    __publicField(this, \"counter\", 0);\n    __publicField(this, \"active\", false);\n    __publicField(this, \"animateHistoryPop\", true);\n    __publicField(this, \"isAdjustingState\", false);\n    __publicField(this, \"manualStateAction\", false);\n    // Manipulating the history is async and can cause issues when fast calls happen without awaiting the previous one\n    __publicField(this, \"historyQueue\", []);\n    __publicField(this, \"isQueueRunning\", false);\n    __publicField(this, \"changeUrlTimeout\", null);\n    __publicField(this, \"titleSuffix\", \"\");\n    __publicField(this, \"pageLoadedAt\", Date.now());\n    __publicField(this, \"listeners\", /* @__PURE__ */ new Map());\n  }\n  addListener(owner, handler) {\n    this.listeners.set(owner, handler);\n  }\n  removeListener(owner) {\n    this.listeners.delete(owner);\n  }\n  callListeners() {\n    for (const [_, handler] of this.listeners) {\n      handler();\n    }\n  }\n  addToQueue(action) {\n    this.historyQueue.push(action);\n    if (!this.isQueueRunning) {\n      this.runQueue();\n    }\n  }\n  runQueue() {\n    this.isQueueRunning = true;\n    const action = this.historyQueue.shift();\n    if (action) {\n      const p = action();\n      if (p) {\n        p.finally(() => this.runQueue()).catch(console.error);\n      } else {\n        this.runQueue();\n      }\n    } else {\n      this.isQueueRunning = false;\n      this.callListeners();\n    }\n  }\n  go(delta) {\n    this.addToQueue(async () => {\n      return new Promise((resolve) => {\n        this.manualStateAction = true;\n        history.go(delta);\n        let timer = void 0;\n        let called = false;\n        const listener = () => {\n          if (called)\n            return;\n          called = true;\n          clearTimeout(timer);\n          window.removeEventListener(\"popstate\", listener);\n          setTimeout(() => {\n            this.manualStateAction = false;\n            resolve();\n          }, 0);\n        };\n        window.addEventListener(\"popstate\", listener);\n        timer = setTimeout(() => {\n          console.warn(\"Timeout while waiting for history.go\");\n          listener();\n        }, 200);\n      });\n    });\n  }\n  getStateUrl(index) {\n    if (index < 0) {\n      return \"\";\n    }\n    if (!this.states[index]) {\n      return this.getStateUrl(index - 1);\n    }\n    if (this.states[index].url !== null) {\n      return this.states[index].url;\n    }\n    return this.getStateUrl(index - 1);\n  }\n  resolveUrl(index) {\n    return \"/\" + UrlHelper.trim(UrlHelper.transformUrl(this.getStateUrl(index)));\n  }\n  /// Set the current URL without modifying states\n  setUrl(url, title, index) {\n    if (!this.active) {\n      return;\n    }\n    if (index === void 0 || index === this.counter) {\n      const state = this.states[this.states.length - 1];\n      const count = state.index;\n      if (this.changeUrlTimeout) {\n        clearTimeout(this.changeUrlTimeout);\n      }\n      const didJustLoadPage = Date.now() - this.pageLoadedAt < 1e3 * 5;\n      this.changeUrlTimeout = setTimeout(() => {\n        if (this.counter !== count || state.url !== url) {\n          return;\n        }\n        this.addToQueue(() => {\n          if (this.counter !== count || state.url !== url) {\n            return;\n          }\n          const formattedUrl = this.resolveUrl(count);\n          history.replaceState({ counter: count }, \"\", formattedUrl);\n          if (state.title) {\n            window.document.title = this.formatTitle(state.title);\n          }\n        });\n      }, didJustLoadPage ? 1e3 : 20);\n      state.url = url;\n      if (title) {\n        state.title = title;\n      }\n    } else {\n      const state = this.states[index];\n      if (!state) {\n        console.error(\"Search state with index \", index, \"but no such state found\");\n        return;\n      }\n      if (state.index !== index) {\n        console.error(\"Search state with index \", index, \"but received state with index\", state.index);\n        return;\n      }\n      if (state.url !== url)\n        ;\n      state.url = url;\n      if (title) {\n        state.title = title;\n      }\n    }\n  }\n  // Call this when url formatting or prefix has changed\n  updateUrl() {\n    if (!this.active) {\n      return;\n    }\n    if (this.changeUrlTimeout) {\n      return;\n    }\n    this.addToQueue(() => {\n      const lastState = this.states[this.states.length - 1];\n      const formattedUrl = this.resolveUrl(lastState.index);\n      history.replaceState({ counter: this.counter }, \"\", formattedUrl);\n    });\n  }\n  formatTitle(title) {\n    return title + (this.titleSuffix ? \" | \" + this.titleSuffix : \"\");\n  }\n  /**\n   * Set the saved title for a given state. If that state is the current one, it will also get set immediately\n   */\n  setTitle(title, index) {\n    if (!this.active) {\n      return;\n    }\n    if (index === void 0 || index === this.counter) {\n      const state = this.states[this.states.length - 1];\n      window.document.title = this.formatTitle(title);\n      state.title = title;\n    } else {\n      const state = this.states[index];\n      if (state.index !== index) {\n        console.error(\"Search state with index \", index, \"but received state with index\", state.index);\n        return;\n      }\n      state.title = title;\n    }\n  }\n  getCurrentState() {\n    return this.states[this.counter];\n  }\n  getState(index) {\n    if (index < 0) {\n      return null;\n    }\n    const s = this.states[index];\n    if (s && s.index === index) {\n      return s;\n    }\n    return this.getState(index - 1);\n  }\n  pushState(url, undoAction, options) {\n    if (!this.active) {\n      return;\n    }\n    this.counter++;\n    if (this.counter !== this.states.length) {\n      console.error(\"Invalid initial history item when pushing state\");\n    }\n    const state = {\n      url: url ?? null,\n      index: this.counter,\n      adjustHistory: true,\n      undoAction,\n      invalid: false,\n      ...options\n    };\n    this.states.push(state);\n    const c = this.counter;\n    if (state.adjustHistory) {\n      this.addToQueue(() => {\n        const formattedUrl = url === void 0 ? void 0 : \"/\" + UrlHelper.trim(UrlHelper.transformUrl(url));\n        history.pushState({ counter: c }, \"\", formattedUrl);\n      });\n    } else {\n      this.addToQueue(() => {\n        history.replaceState({ counter: c }, \"\", void 0);\n      });\n    }\n  }\n  /**\n   * Call when an action is performed that breaks back/forward navigation\n   */\n  invalidateHistory() {\n    for (const state of this.states) {\n      state.undoAction = null;\n      state.invalid = state.index !== this.counter;\n    }\n  }\n  /**\n   * Return to a given history point in time, if needed\n   */\n  returnToHistoryIndex(counter) {\n    if (counter > this.counter) {\n      console.warn(\"Performed non-compatible navigation. Probably because side-by-side views navigating\");\n      this.invalidateHistory();\n      for (let i = this.counter + 1; i <= counter; i++) {\n        if (i !== this.states.length) {\n          console.error(\"Invalid history item at index\", i, \"when returning to history index\");\n        }\n        this.states.push({\n          index: i,\n          adjustHistory: false,\n          url: null,\n          title: void 0,\n          invalid: true,\n          undoAction: null\n        });\n      }\n      this.counter = counter;\n    }\n    if (counter < this.counter) {\n      this.counter = counter;\n      const deletedStates = this.states.splice(this.counter + 1);\n      console.log(\"Deleted states\", deletedStates.length);\n      const adjustHistoryCount = deletedStates.filter((state) => state.adjustHistory).length;\n      if (adjustHistoryCount > 0) {\n        this.go(-adjustHistoryCount);\n      }\n    }\n    if (this.states[this.counter].url) {\n      this.setUrl(this.states[this.counter].url, this.states[this.counter].title);\n    }\n    return this.counter;\n  }\n  activate() {\n    history.scrollRestoration = \"manual\";\n    async function onPopState(event) {\n      var _a;\n      if (this.isAdjustingState) {\n        console.warn(\"Duplicate popstate\");\n        return;\n      }\n      if (this.manualStateAction) {\n        return;\n      }\n      this.isAdjustingState = true;\n      const newCounter = (_a = event.state) == null ? void 0 : _a.counter;\n      if (newCounter !== void 0) {\n        if (newCounter > this.counter) {\n          const amount = newCounter - this.counter;\n          this.go(-amount);\n        } else {\n          const animate = this.counter - newCounter == 1 && this.animateHistoryPop;\n          this.counter = newCounter;\n          const deletedStates = this.states.splice(this.counter + 1).reverse();\n          const newState = this.states[this.counter];\n          if (newState.invalid) {\n            console.warn(\"Reloading page bacause of invalid history\", newState);\n            window.location.reload();\n            return;\n          }\n          for (const state of deletedStates) {\n            if (state.invalid) {\n              console.warn(\"Reloading page bacause of invalid history\", state);\n              window.location.reload();\n              return;\n            }\n          }\n          for (const state of deletedStates) {\n            if (state.undoAction) {\n              await state.undoAction(animate);\n            } else {\n              if (state.adjustHistory) {\n                break;\n              }\n            }\n          }\n        }\n      }\n      this.isAdjustingState = false;\n    }\n    window.addEventListener(\"popstate\", (event) => {\n      onPopState.call(this, event).catch(console.error);\n    });\n    const clickHandler = () => {\n      this.pageLoadedAt = 0;\n    };\n    document.addEventListener(\"pointerdown\", clickHandler, { once: true, passive: true });\n    this.active = true;\n    if (history.state && history.state.counter !== void 0 && typeof history.state.counter === \"number\") {\n      for (let i = 0; i < history.state.counter; i++) {\n        if (i !== this.states.length) {\n          console.error(\"Invalid history item at index\", i, \"when activating history manager\");\n        }\n        this.states.push({\n          index: i,\n          adjustHistory: false,\n          url: null,\n          title: void 0,\n          invalid: true,\n          undoAction: null\n        });\n      }\n      this.counter = history.state.counter;\n    }\n    history.replaceState({ counter: this.counter }, \"\");\n    if (this.counter !== this.states.length) {\n      console.error(\"Invalid initial history item when activating history manager\");\n    }\n    this.states.push({\n      index: this.counter,\n      adjustHistory: false,\n      url: null,\n      title: void 0,\n      invalid: false,\n      undoAction: null\n    });\n  }\n}\n__publicField(HistoryManagerStatic, \"debug\", false);\nconst HistoryManager = new HistoryManagerStatic();\nfunction useCurrentComponent() {\n  return inject(\"navigation_currentComponent\", null);\n}\nfunction getExposeProxy(instance) {\n  if (!instance) {\n    return;\n  }\n  if (!instance.exposed) {\n    return;\n  }\n  if (instance.exposeProxy) {\n    return instance.exposeProxy;\n  }\n  const extendingProxy = instance.proxy;\n  instance.exposeProxy = new Proxy(proxyRefs(markRaw(instance.exposed)), {\n    get(target, key) {\n      if (key in target) {\n        return target[key];\n      }\n      return extendingProxy[key];\n    },\n    has(target, key) {\n      return key in target || key in extendingProxy;\n    }\n  });\n  return instance.exposeProxy;\n}\nfunction forAllRoots(root, handler, alreadyProcessed) {\n  const handled = alreadyProcessed ?? /* @__PURE__ */ new Set();\n  handler(root);\n  handled.add(root);\n  for (const key in root.properties) {\n    const v = root.properties[key];\n    if (v instanceof ComponentWithProperties) {\n      forAllRoots(v, handler, handled);\n    }\n    if (Array.isArray(v) && v.length) {\n      const lastItem = v[v.length - 1];\n      if (lastItem instanceof ComponentWithProperties) {\n        forAllRoots(lastItem, handler, handled);\n      }\n    }\n  }\n}\nconst _ComponentWithProperties = class _ComponentWithProperties {\n  constructor(component, properties = {}, options) {\n    /// Name of component or component Options. Currently no way to force type\n    __publicField(this, \"component\");\n    __publicField(this, \"properties\");\n    __publicField(this, \"provide\");\n    __publicField(this, \"inheritedDisplayerProvide\", {});\n    __publicField(this, \"inheritedParentProvide\", {});\n    __publicField(this, \"key\");\n    __publicField(this, \"type\", null);\n    /// Saved vnode of this instance\n    __publicField(this, \"vnode\", null);\n    __publicField(this, \"unmount\", null);\n    // Keep the vnode alive when it is removed from the VDOM\n    __publicField(this, \"keepAlive\", false);\n    __publicField(this, \"isKeptAlive\", false);\n    /// Cover whole screen. Other style = popup\n    __publicField(this, \"modalDisplayStyle\", \"cover\");\n    // If the display animation should be animated\n    __publicField(this, \"animated\", true);\n    __publicField(this, \"checkRoutes\", false);\n    // Setting this will allow the component to check the routes on the next activation\n    __publicField(this, \"isDismissing\", ref(false));\n    // Custom state for stack items that need to navigate way without being removed from the dom\n    // Hisotry index\n    __publicField(this, \"historyIndex\", null);\n    __publicField(this, \"forceCanHaveFocus\", false);\n    this.component = component;\n    this.key = _ComponentWithProperties.keyCounter++;\n    this.properties = reactive(properties);\n    this.provide = (options == null ? void 0 : options.provide) || {};\n    this.inheritedDisplayerProvide = (options == null ? void 0 : options.inheritedDisplayerProvide) || {};\n    this.inheritedParentProvide = (options == null ? void 0 : options.inheritedParentProvide) || {};\n    this.forceCanHaveFocus = (options == null ? void 0 : options.forceCanHaveFocus) || false;\n    markRaw(this);\n  }\n  // Automatically true if it has a history state\n  // private static ignoreActivate: ComponentWithProperties | null = null\n  setCheckRoutes() {\n    forAllRoots(this, (c) => {\n      c.checkRoutes = true;\n    });\n    return this;\n  }\n  get combinedProvide() {\n    return {\n      ...this.inheritedParentProvide,\n      ...this.inheritedDisplayerProvide,\n      // has priority\n      ...this.provide\n    };\n  }\n  inheritFromDisplayer(component) {\n    this.inheritedDisplayerProvide = {\n      ...component.combinedProvide\n    };\n  }\n  inheritFromParent(component) {\n    this.inheritedParentProvide = {\n      ...component.combinedProvide\n    };\n  }\n  clone() {\n    return new _ComponentWithProperties(this.component, this.properties, { provide: this.provide, inheritedParentProvide: this.inheritedParentProvide, inheritedDisplayerProvide: this.inheritedDisplayerProvide });\n  }\n  beforeMount() {\n    if (this.vnode) {\n      if (this.isKeptAlive) {\n        this.isKeptAlive = false;\n        _ComponentWithProperties.keepAliveCounter--;\n        if (_ComponentWithProperties.debug)\n          console.log(\"Total components kept alive: \" + _ComponentWithProperties.keepAliveCounter);\n      } else {\n        if (_ComponentWithProperties.debug)\n          console.warn(\"About to mount a component that was not destroyed properly \" + this.component.name);\n        this.destroy(this.vnode);\n      }\n    }\n  }\n  getHistoryIndex() {\n    if (this.component)\n      return this.historyIndex;\n  }\n  deleteHistoryIndex() {\n    this.historyIndex = null;\n  }\n  hasHistoryIndex() {\n    return this.historyIndex !== null;\n  }\n  canHaveFocus() {\n    return this.hasHistoryIndex() || this.forceCanHaveFocus;\n  }\n  /**\n   * This will get called when the component has been pushed somewhere that should count as a new history state\n   */\n  assignHistoryIndex() {\n    if (!HistoryManager.active) {\n      return;\n    }\n    if (this.historyIndex !== null) {\n      this.returnToHistoryIndex();\n      return;\n    }\n    const state = HistoryManager.getCurrentState();\n    this.historyIndex = state.index;\n    _ComponentWithProperties.historyIndexOwners.set(state.index, this);\n  }\n  inheritHistoryIndex(index) {\n    if (this.historyIndex === null) {\n      this.historyIndex = index;\n    }\n  }\n  ownsHistoryIndex() {\n    return this.historyIndex !== null && _ComponentWithProperties.historyIndexOwners.get(this.historyIndex) === this;\n  }\n  overrideUrl(url, title) {\n    this.provide.reactive_navigation_url = url;\n    this.setUrl(url, title);\n  }\n  setUrl(url, title) {\n    if (this.historyIndex === null) {\n      if (_ComponentWithProperties.debug)\n        console.warn(\"Tried calling .setUrl on a component that was never assigned a history index. Check if you displayed this component using .show or .present\");\n      return;\n    }\n    if (!HistoryManager.active) {\n      return;\n    }\n    if (!this.ownsHistoryIndex()) {\n      return;\n    }\n    HistoryManager.setUrl(url, title, this.historyIndex);\n  }\n  setTitle(title) {\n    if (!title) {\n      return;\n    }\n    if (this.historyIndex === null) {\n      if (_ComponentWithProperties.debug)\n        console.warn(\"Tried calling .setTitle on a component that was never assigned a history index. Check if you displayed this component using .show or .present\");\n      return;\n    }\n    if (!HistoryManager.active) {\n      return;\n    }\n    HistoryManager.setTitle(title, this.historyIndex);\n  }\n  /**\n   * This will get called when the user returned to this component\n   */\n  returnToHistoryIndex() {\n    if (!HistoryManager.active) {\n      return false;\n    }\n    const instance = this.componentInstance();\n    if (instance == null ? void 0 : instance.returnToHistoryIndex) {\n      const worked = instance == null ? void 0 : instance.returnToHistoryIndex();\n      if (_ComponentWithProperties.debug)\n        console.log(\"returning to instance that has an instance with custom returnToHistoryIndex method\", this.component.name, worked);\n      if (worked === true) {\n        return true;\n      }\n    }\n    if (this.historyIndex === null) {\n      if (_ComponentWithProperties.debug)\n        console.warn(\"Returning to a component that has no history index assigned. Has this component been pushed to a navigation controller properly before returning to it?\", this.component.name);\n      return false;\n    }\n    _ComponentWithProperties.historyIndexOwners.set(this.historyIndex, this);\n    if (_ComponentWithProperties.debug)\n      console.log(\"New owner of history index \", this.historyIndex, this.component.name);\n    HistoryManager.returnToHistoryIndex(this.historyIndex);\n    return true;\n  }\n  componentInstance() {\n    var _a, _b, _c, _d;\n    if (!((_a = this.vnode) == null ? void 0 : _a.component)) {\n      return null;\n    }\n    return getExposeProxy((_b = this.vnode) == null ? void 0 : _b.component) || ((_d = (_c = this.vnode) == null ? void 0 : _c.component) == null ? void 0 : _d.proxy);\n  }\n  async shouldNavigateAway() {\n    const instance = this.componentInstance();\n    if (instance && instance.shouldNavigateAway) {\n      const promise = instance.shouldNavigateAway();\n      if (typeof promise === \"boolean\") {\n        if (!promise) {\n          return false;\n        }\n      } else if (promise.then && promise.catch) {\n        const r = await promise;\n        if (!r) {\n          return false;\n        }\n      }\n    }\n    return true;\n  }\n  destroy(vnode) {\n    if (this.vnode) {\n      if (vnode !== this.vnode) {\n        if (_ComponentWithProperties.debug)\n          console.warn(\"Received destroy event from old/different vnode\", this.vnode, vnode);\n        return;\n      }\n      if (this.keepAlive) {\n        this.keepAlive = false;\n        if (!this.isKeptAlive) {\n          this.isKeptAlive = true;\n          _ComponentWithProperties.keepAliveCounter++;\n          if (_ComponentWithProperties.debug)\n            console.log(\"Kept component alive \" + this.component.name);\n          if (_ComponentWithProperties.debug)\n            console.log(\"Total components kept alive: \" + _ComponentWithProperties.keepAliveCounter);\n        }\n        return;\n      }\n      if (this.isKeptAlive) {\n        this.isKeptAlive = false;\n        _ComponentWithProperties.keepAliveCounter--;\n        if (_ComponentWithProperties.debug)\n          console.log(\"Freed component from alive stack \" + this.component.name);\n        if (_ComponentWithProperties.debug)\n          console.log(\"Total components kept alive: \" + _ComponentWithProperties.keepAliveCounter);\n      }\n      if (_ComponentWithProperties.debug)\n        console.log(\"Destroyed component \" + this.component.name, this.vnode);\n      if (this.unmount) {\n        this.unmount(this.vnode);\n        this.unmount = null;\n      } else {\n        console.error(\"No unmount function for component \" + this.vnode);\n      }\n      this.vnode = null;\n    }\n  }\n  setDisplayStyle(style) {\n    this.modalDisplayStyle = style;\n    return this;\n  }\n  setAnimated(animated) {\n    this.animated = animated;\n    return this;\n  }\n};\n// Counter for debugging. Count of components that are kept alive but are not mounted.\n__publicField(_ComponentWithProperties, \"keepAliveCounter\", 0);\n__publicField(_ComponentWithProperties, \"keyCounter\", 0);\n__publicField(_ComponentWithProperties, \"debug\", false);\n__publicField(_ComponentWithProperties, \"historyIndexOwners\", /* @__PURE__ */ new Map());\nlet ComponentWithProperties = _ComponentWithProperties;\n/**\n* @vue/shared v3.5.12\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\n!!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\n!!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst invokeArrayFns = (fns, ...arg) => {\n  for (let i = 0; i < fns.length; i++) {\n    fns[i](...arg);\n  }\n};\nconst ShapeFlags = {\n  \"ELEMENT\": 1,\n  \"1\": \"ELEMENT\",\n  \"FUNCTIONAL_COMPONENT\": 2,\n  \"2\": \"FUNCTIONAL_COMPONENT\",\n  \"STATEFUL_COMPONENT\": 4,\n  \"4\": \"STATEFUL_COMPONENT\",\n  \"TEXT_CHILDREN\": 8,\n  \"8\": \"TEXT_CHILDREN\",\n  \"ARRAY_CHILDREN\": 16,\n  \"16\": \"ARRAY_CHILDREN\",\n  \"SLOTS_CHILDREN\": 32,\n  \"32\": \"SLOTS_CHILDREN\",\n  \"TELEPORT\": 64,\n  \"64\": \"TELEPORT\",\n  \"SUSPENSE\": 128,\n  \"128\": \"SUSPENSE\",\n  \"COMPONENT_SHOULD_KEEP_ALIVE\": 256,\n  \"256\": \"COMPONENT_SHOULD_KEEP_ALIVE\",\n  \"COMPONENT_KEPT_ALIVE\": 512,\n  \"512\": \"COMPONENT_KEPT_ALIVE\",\n  \"COMPONENT\": 6,\n  \"6\": \"COMPONENT\"\n};\nfunction invokeVNodeHook(hook, instance, vnode, prevVNode = null) {\n  callWithAsyncErrorHandling(hook, instance, ErrorCodes.VNODE_HOOK, [\n    vnode,\n    prevVNode\n  ]);\n}\nfunction getInnerChild(vnode) {\n  return vnode.shapeFlag & ShapeFlags.SUSPENSE ? vnode.ssContent : vnode;\n}\nfunction resetShapeFlag(vnode) {\n  vnode.shapeFlag &= ~ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE;\n  vnode.shapeFlag &= ~ShapeFlags.COMPONENT_KEPT_ALIVE;\n}\nfunction makeProvidesParentReactive(instance) {\n  var _a;\n  const reactiveInstance = shallowRef(instance);\n  const originalProvides = instance.provides;\n  const ownProvides = instance.provides === ((_a = instance.parent) == null ? void 0 : _a.provides) ? [] : Object.getOwnPropertyNames(originalProvides);\n  const proxyProvider = new Proxy({}, {\n    get(_target, key) {\n      if (typeof key !== \"string\" || !key.startsWith(\"reactive_\")) {\n        return originalProvides[key];\n      }\n      if (key in ownProvides) {\n        return originalProvides[key];\n      }\n      return computed(() => {\n        var _a2;\n        return unref((_a2 = reactiveInstance.value.parent) == null ? void 0 : _a2.provides[key]);\n      });\n    },\n    // Vue valides keys using 'a' in obj, so we need to handle this correctly\n    has(target, key) {\n      return true;\n    }\n  });\n  instance.provides = Object.create(proxyProvider);\n  return reactiveInstance;\n}\nconst ComponentWithPropertiesInstance = {\n  name: \"ComponentWithPropertiesInstance\",\n  props: {\n    component: {\n      type: ComponentWithProperties,\n      required: true\n    },\n    customProvide: {\n      required: false,\n      type: Object,\n      default: null\n    }\n  },\n  __isKeepAlive: true,\n  setup(props) {\n    const instance = getCurrentInstance();\n    const sharedContext = instance.ctx;\n    const reactiveInstance = makeProvidesParentReactive(instance);\n    if (props.customProvide) {\n      for (const key in props.customProvide) {\n        if (key.startsWith(\"reactive_\")) {\n          provide(key, computed(() => {\n            var _a;\n            return unref((_a = props.customProvide) == null ? void 0 : _a[key]);\n          }));\n        } else {\n          provide(key, props.customProvide[key]);\n        }\n      }\n    }\n    provide(\"navigation_currentComponent\", props.component);\n    const parentHistory = inject(\"navigation_historyIndex\", null);\n    if (parentHistory !== null) {\n      props.component.inheritHistoryIndex(parentHistory);\n    }\n    const parent = inject(\"navigation_parent\", null);\n    if (parent !== null) {\n      props.component.inheritFromParent(parent);\n    }\n    provide(\"navigation_historyIndex\", props.component.historyIndex);\n    provide(\"navigation_parent\", props.component);\n    const combinedProvide = props.component.combinedProvide;\n    for (const key in combinedProvide) {\n      provide(key, combinedProvide[key]);\n    }\n    const disableUrl = inject(\"reactive_navigation_disable_url\", null);\n    const inheritedUrlRaw = inject(\"reactive_navigation_url\", null);\n    const updateUrl = () => {\n      const url = unref(props.component.combinedProvide.reactive_navigation_url) ?? unref(inheritedUrlRaw) ?? null;\n      const disableUrlUnwrapped = unref(disableUrl) ?? false;\n      if (!disableUrlUnwrapped) {\n        props.component.setUrl(url);\n      }\n    };\n    onActivated(() => {\n      updateUrl();\n    });\n    onMounted(() => {\n      updateUrl();\n    });\n    const {\n      renderer: {\n        p: patch,\n        m: move,\n        um: _unmount\n      }\n    } = sharedContext;\n    const parentSuspense = instance.suspense;\n    sharedContext.activate = (vnode, container, anchor, namespace, optimized) => {\n      const instance2 = vnode.component;\n      move(vnode, container, anchor, 0, parentSuspense);\n      patch(\n        instance2.vnode,\n        vnode,\n        container,\n        anchor,\n        instance2,\n        parentSuspense,\n        namespace,\n        vnode.slotScopeIds,\n        optimized\n      );\n      queuePostFlushCb(() => {\n        instance2.isDeactivated = false;\n        if (instance2.a) {\n          invokeArrayFns(instance2.a);\n        }\n        const vnodeHook = vnode.props && vnode.props.onVnodeMounted;\n        if (vnodeHook) {\n          invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n        }\n      });\n    };\n    sharedContext.deactivate = (vnode) => {\n      const instance2 = vnode.component;\n      queuePostFlushCb(() => {\n        if (instance2.da) {\n          invokeArrayFns(instance2.da);\n        }\n        const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;\n        if (vnodeHook) {\n          invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n        }\n        instance2.isDeactivated = true;\n      });\n    };\n    function unmount(vnode) {\n      if (current) {\n        const { subTree } = instance;\n        const _innerVnode = getInnerChild(subTree);\n        if (vnode.type === _innerVnode.type && vnode.key === _innerVnode.key) {\n          resetShapeFlag(_innerVnode);\n          const da = _innerVnode.component.da;\n          da && queuePostFlushCb(da);\n          return;\n        }\n      }\n      resetShapeFlag(vnode);\n      _unmount(vnode, instance, parentSuspense, true);\n    }\n    let current = null;\n    function getChildVNode() {\n      var _a, _b, _c, _d;\n      return (_d = (_c = (_b = (_a = instance.vnode) == null ? void 0 : _a.component) == null ? void 0 : _b.subTree) == null ? void 0 : _c.component) == null ? void 0 : _d.vnode;\n    }\n    onBeforeUnmount(() => {\n      if (!current) {\n        return;\n      }\n      const child = getChildVNode();\n      if (!child) {\n        console.error(\"No child found in ComponentWithPropertiesInstance.beforeUnmount\");\n        return;\n      }\n      if (props.component.unmount === unmount) {\n        props.component.destroy(getChildVNode());\n      } else {\n        console.warn(\"ComponentWithPropertiesInstance unmount called with different unmount function\");\n      }\n      current = null;\n    });\n    onBeforeMount(() => {\n      props.component.beforeMount();\n    });\n    let pendingCacheKey = null;\n    const cacheSubtree = () => {\n      if (current && pendingCacheKey != null) {\n        const child = getChildVNode();\n        if (!child) {\n          console.error(\"No child found in ComponentWithPropertiesInstance.cacheSubtree\");\n          return;\n        }\n        props.component.vnode = child;\n        props.component.unmount = unmount;\n        if (!child._reactiveInstance) {\n          child._reactiveInstance = reactiveInstance;\n        }\n      }\n    };\n    onMounted(cacheSubtree);\n    onUpdated(cacheSubtree);\n    return () => {\n      pendingCacheKey = null;\n      if (!props.component) {\n        warn(\"No component provided to ComponentWithPropertiesInstance\");\n        current = null;\n        return null;\n      }\n      props.component.component.inheritAttrs = false;\n      const vnode = h(props.component.component, props.component.properties);\n      const comp = vnode.type;\n      const key = vnode.key == null ? comp : vnode.key;\n      pendingCacheKey = key;\n      if (props.component.vnode) {\n        const cachedVNode = props.component.vnode;\n        const parent2 = instance;\n        vnode.el = cachedVNode.el;\n        vnode.component = cachedVNode.component;\n        if (!cachedVNode._reactiveInstance) {\n          console.warn(\"Missing _reactiveInstance on vnode\");\n        } else {\n          cachedVNode._reactiveInstance.value = parent2;\n        }\n        if (vnode.transition) {\n          setTransitionHooks(vnode, vnode.transition);\n        }\n        vnode.shapeFlag |= ShapeFlags.COMPONENT_KEPT_ALIVE;\n      }\n      vnode.shapeFlag |= ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE;\n      current = vnode;\n      return vnode;\n    };\n  }\n};\nconst _sfc_main$5 = {\n  name: \"FramedComponent\",\n  components: {\n    ComponentWithPropertiesInstance\n  },\n  provide() {\n    return {\n      ...this.customProvide ?? {}\n    };\n  },\n  props: {\n    root: {\n      type: ComponentWithProperties,\n      required: true\n    },\n    customProvide: {\n      type: Object,\n      default: null\n    }\n  },\n  emits: [\"show\", \"push\", \"pop\"]\n};\nconst _export_sfc = (sfc, props) => {\n  const target = sfc.__vccOpts || sfc;\n  for (const [key, val] of props) {\n    target[key] = val;\n  }\n  return target;\n};\nfunction _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {\n  const _component_ComponentWithPropertiesInstance = resolveComponent(\"ComponentWithPropertiesInstance\");\n  return openBlock(), createElementBlock(\"div\", null, [\n    createElementVNode(\"div\", null, [\n      createVNode(_component_ComponentWithPropertiesInstance, { component: $props.root }, null, 8, [\"component\"])\n    ])\n  ]);\n}\nconst FramedComponent = /* @__PURE__ */ _export_sfc(_sfc_main$5, [[\"render\", _sfc_render$2]]);\nfunction useNavigationController() {\n  const c = inject(\"reactive_navigationController\");\n  return shallowRef(c);\n}\nconst NavigationController$1 = defineComponent({\n  name: \"NavigationController\",\n  components: {\n    FramedComponent\n  },\n  inject: {\n    reactive_navigation_pop: {\n      default: null\n    },\n    reactive_navigation_can_pop: {\n      default: false\n    },\n    reactive_navigation_can_dismiss: {\n      default: false\n    }\n  },\n  provide() {\n    let extra = {};\n    if (this.animationType === \"modal\") {\n      extra = {\n        reactive_navigation_dismiss: computed(() => this.components.length > 1 ? this.pop : unref(this.reactive_navigation_pop)),\n        reactive_navigation_can_dismiss: computed(() => this.components.length > 1),\n        reactive_navigation_can_pop: false\n      };\n    } else {\n      extra = {\n        reactive_navigation_can_pop: computed(() => this.components.length > 1 || unref(this.reactive_navigation_can_pop))\n      };\n    }\n    return {\n      reactive_navigationController: this,\n      reactive_navigation_show: this.push,\n      reactive_navigation_pop: computed(() => this.components.length > 1 ? this.pop : unref(this.reactive_navigation_pop)),\n      ...extra,\n      ...this.customProvide ?? {}\n    };\n  },\n  props: {\n    root: {\n      default: null,\n      type: Object\n    },\n    initialComponents: {\n      default: null,\n      type: Object\n    },\n    animationType: {\n      default: \"default\",\n      type: String\n    },\n    customProvide: {\n      type: Object,\n      default: null\n    }\n  },\n  emits: [\"didPush\", \"didPop\", \"showDetail\", \"present\"],\n  data() {\n    const savedInternalScrollPositions = [];\n    const savedScrollPositions = [];\n    const components = [];\n    return {\n      components,\n      mainComponent: null,\n      transitionName: \"none\",\n      savedScrollPositions,\n      nextScrollPosition: 0,\n      previousScrollPosition: 0,\n      nextInternalScrollPosition: 0,\n      savedInternalScrollPositions,\n      // Because push/pop is async, it can cause issues if we call it multiple times after each other\n      // all push/pop operations should be queued\n      asyncQueue: [],\n      asyncQueueRunning: false,\n      cachedProvides: /* @__PURE__ */ new Map()\n    };\n  },\n  watch: {\n    // whenever question changes, this function will run\n    mainComponent(newComponent) {\n      if (!newComponent) {\n        return;\n      }\n      this.cacheComponentProvides(newComponent);\n    }\n  },\n  beforeMount() {\n    if (this.initialComponents && this.initialComponents.length > 0) {\n      this.mainComponent = this.initialComponents[this.initialComponents.length - 1];\n      this.components = this.initialComponents.slice(0);\n    } else {\n      if (!this.root) {\n        throw new Error(\"No root component provided for navigation controller\");\n      }\n      this.mainComponent = this.root;\n      this.components = [this.root];\n    }\n    for (const [index, component] of this.components.entries()) {\n      this.cacheComponentProvides(component);\n      if (index < this.components.length - 1) {\n        HistoryManager.pushState(void 0, null, { adjustHistory: false });\n      }\n      component.assignHistoryIndex();\n    }\n  },\n  beforeUnmount() {\n    for (const component of this.components) {\n      if (component.isKeptAlive && component.vnode) {\n        component.destroy(component.vnode);\n      }\n    }\n    this.components = [];\n    this.mainComponent = null;\n  },\n  methods: {\n    cacheComponentProvides(newComponent) {\n      if (this.animationType === \"modal\") {\n        this.cachedProvides.set(newComponent.key, {\n          reactive_navigation_can_dismiss: this.components.length > 1\n        });\n      } else {\n        this.cachedProvides.set(newComponent.key, {\n          reactive_navigation_can_pop: this.components.length > 1 || unref(this.reactive_navigation_can_pop)\n        });\n      }\n    },\n    provideForComponent(key) {\n      return this.cachedProvides.get(key) ?? {};\n    },\n    runQueue(run) {\n      return new Promise((resolve, reject) => {\n        this.asyncQueue.push(async () => {\n          try {\n            const r = await run();\n            resolve(r);\n          } catch (e) {\n            reject(e);\n          }\n        });\n        this.runQueueIfNeeded();\n      });\n    },\n    runQueueIfNeeded() {\n      if (this.asyncQueueRunning) {\n        return;\n      }\n      if (this.asyncQueue.length == 0) {\n        return;\n      }\n      this.asyncQueueRunning = true;\n      const next = this.asyncQueue.shift();\n      if (!next) {\n        this.asyncQueueRunning = false;\n        this.runQueueIfNeeded();\n        return;\n      }\n      next().catch((e) => {\n        console.error(\"Error in async queue\", e);\n      }).finally(() => {\n        this.asyncQueueRunning = false;\n        this.runQueueIfNeeded();\n      });\n    },\n    freezeSize() {\n      const el = this.$el;\n      const w = el.offsetWidth;\n      const h2 = el.offsetHeight;\n      el.style.width = w + \"px\";\n      el.style.height = h2 + \"px\";\n    },\n    growSize(width, height) {\n      const el = this.$el;\n      el.style.height = height + \"px\";\n      el.style.width = width + \"px\";\n    },\n    unfreezeSize() {\n      const el = this.$el;\n      el.style.width = \"\";\n      el.style.height = \"\";\n    },\n    getInternalScrollElement(element = null) {\n      var _a;\n      const mightBe = (_a = element ?? this.$el) == null ? void 0 : _a.querySelector(\"main\");\n      return mightBe ? mightBe : null;\n    },\n    getScrollElement(element = null) {\n      return document.documentElement;\n    },\n    shouldAnimate() {\n      return this.$el && this.$el.offsetWidth <= 1e3 && !window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n    },\n    returnToHistoryIndex() {\n      const lastComponent = this.components[this.components.length - 1];\n      if (lastComponent && lastComponent.hasHistoryIndex()) {\n        return lastComponent.returnToHistoryIndex();\n      }\n      return false;\n    },\n    async push(options) {\n      return await this.runQueue(async () => {\n        var _a;\n        if (options.components.length == 0) {\n          console.error(\"Missing component when pushing\");\n          return;\n        }\n        (_a = document.activeElement) == null ? void 0 : _a.blur();\n        const components = options.components;\n        const component = components[components.length - 1];\n        const destroy = options.destroy ?? true;\n        const force = options.force ?? false;\n        const animated = this.shouldAnimate() ? options.animated === void 0 ? component.animated : options.animated : false;\n        let replace = options.replace ?? 0;\n        if (replace > this.components.length) {\n          replace = this.components.length;\n        }\n        if (ComponentWithProperties.debug)\n          console.log(\"Pushing new component on navigation controller: \" + component.component.name);\n        if (replace > 0) {\n          if (destroy && !force) {\n            for (let index = this.components.length - 1; index >= this.components.length - replace; index--) {\n              const component2 = this.components[index];\n              const r = await component2.shouldNavigateAway();\n              if (!r) {\n                return;\n              }\n            }\n          }\n        }\n        if (!animated) {\n          this.transitionName = \"none\";\n        } else {\n          this.transitionName = this.animationType == \"modal\" ? \"modal-push\" : options.reverse ? \"pop\" : \"push\";\n        }\n        const internalScrollElement = this.getInternalScrollElement();\n        const w = window;\n        let clientHeight = document.documentElement.clientHeight;\n        if (w.visualViewport) {\n          clientHeight = w.visualViewport.height;\n        }\n        const internalClientHeight = internalScrollElement == null ? void 0 : internalScrollElement.clientHeight;\n        this.previousScrollPosition = 0;\n        this.savedScrollPositions.push(this.previousScrollPosition + clientHeight);\n        this.savedInternalScrollPositions.push(((internalScrollElement == null ? void 0 : internalScrollElement.scrollTop) ?? 0) + (internalClientHeight ?? 0));\n        this.nextScrollPosition = 0;\n        this.nextInternalScrollPosition = 0;\n        if (animated) {\n          this.freezeSize();\n        }\n        if (replace > 0) {\n          const popped = this.components.splice(this.components.length - replace, replace, ...components);\n          if (!destroy) {\n            for (const comp of popped) {\n              comp.keepAlive = true;\n            }\n          }\n          if (this.components.length !== components.length) {\n            HistoryManager.invalidateHistory();\n          }\n        } else {\n          this.components.push(...components);\n        }\n        if (this.mainComponent) {\n          this.mainComponent.keepAlive = !replace;\n        }\n        const adjustHistory = (options == null ? void 0 : options.adjustHistory) ?? true;\n        if (adjustHistory) {\n          for (const component2 of components) {\n            HistoryManager.pushState(void 0, async (canAnimate) => {\n              if (!this.mainComponent) {\n                console.error(\"Tried to pop NavigationController, but it was already unmounted\");\n                return;\n              }\n              await this.pop({ animated: animated && canAnimate });\n            }, {\n              adjustHistory,\n              invalid: options.invalidHistory ?? !!replace\n            });\n            component2.assignHistoryIndex();\n          }\n        } else {\n          for (const component2 of components) {\n            if (!replace || this.components.length !== components.length) {\n              HistoryManager.pushState(void 0, null, {\n                adjustHistory,\n                invalid: options.invalidHistory ?? !!replace\n              });\n            }\n            component2.assignHistoryIndex();\n          }\n        }\n        this.mainComponent = component;\n        this.$emit(\"didPush\");\n        await this.$nextTick();\n      });\n    },\n    async shouldNavigateAway() {\n      for (let index = this.components.length - 1; index >= 0; index--) {\n        const component = this.components[index];\n        const r = await component.shouldNavigateAway();\n        if (!r) {\n          return false;\n        }\n      }\n      return true;\n    },\n    popToRoot(options = {}) {\n      options.count = this.components.length - 1;\n      return this.pop(options);\n    },\n    getPoppableParent() {\n      let prev = this.$;\n      let start = this.$.parent;\n      while (start) {\n        if (prev.props.onPop) {\n          return prev;\n        }\n        prev = start;\n        start = start.parent;\n      }\n      return null;\n    },\n    async pop(options = {}) {\n      return await this.runQueue(async () => {\n        var _a;\n        (_a = document.activeElement) == null ? void 0 : _a.blur();\n        const animated = this.shouldAnimate() ? options.animated ?? true : false;\n        const destroy = options.destroy ?? true;\n        const count = options.count ?? 1;\n        const force = options.force ?? false;\n        if (this.components.length <= count) {\n          const parentPop = unref(this.reactive_navigation_pop);\n          options.count = 1;\n          if (!parentPop) {\n            console.error(\"Tried to pop an empty navigation controller, but couldn't find a parent to pop\");\n            return;\n          }\n          return await parentPop(options);\n        }\n        if (count === 0) {\n          return;\n        }\n        if (destroy && !force) {\n          for (let index = this.components.length - 1; index >= this.components.length - count; index--) {\n            const component = this.components[index];\n            const r = await component.shouldNavigateAway();\n            if (!r) {\n              return;\n            }\n          }\n        }\n        this.previousScrollPosition = 0;\n        if (!animated) {\n          this.transitionName = \"none\";\n        } else {\n          this.transitionName = this.animationType == \"modal\" ? \"modal-pop\" : \"pop\";\n          this.freezeSize();\n        }\n        const popped = this.components.splice(this.components.length - count, count);\n        if (!destroy) {\n          for (const comp of popped) {\n            comp.keepAlive = true;\n          }\n        }\n        this.nextScrollPosition = 0;\n        this.nextInternalScrollPosition = Math.max(0, this.savedInternalScrollPositions.pop() ?? 0);\n        this.mainComponent = this.components[this.components.length - 1];\n        this.mainComponent.returnToHistoryIndex();\n        await this.$nextTick();\n        this.$emit(\"didPop\");\n        return popped;\n      });\n    },\n    beforeEnter(insertedElement) {\n      if (this.transitionName == \"none\") {\n        return;\n      }\n      insertedElement.className = this.transitionName + \"-enter-active \" + this.transitionName + \"-enter-from\";\n    },\n    beforeLeave(leavingElement) {\n      if (this.transitionName == \"none\") {\n        return;\n      }\n      leavingElement.className = this.transitionName + \"-leave-active \";\n    },\n    beforeBeforeEnterAnimation() {\n      if (this.mainComponent) {\n        const instance = this.mainComponent.componentInstance();\n        if (instance && instance.beforeBeforeEnterAnimation) {\n          instance.beforeBeforeEnterAnimation();\n        }\n      }\n    },\n    finishedEnterAnimation() {\n      if (this.mainComponent) {\n        const instance = this.mainComponent.componentInstance();\n        if (instance && instance.finishedEnterAnimation) {\n          instance.finishedEnterAnimation();\n        }\n      }\n    },\n    enter(element, done) {\n      if (this.transitionName == \"none\") {\n        this.getScrollElement().scrollTop = this.nextScrollPosition;\n        const internal = this.getInternalScrollElement(element);\n        if (internal) {\n          internal.scrollTop = Math.max(0, this.nextInternalScrollPosition - internal.clientHeight);\n        }\n        done();\n        return;\n      }\n      requestAnimationFrame(() => {\n        const w = element.firstElementChild.firstElementChild.offsetWidth;\n        const h2 = element.firstElementChild.offsetHeight;\n        const internal = this.getInternalScrollElement(element);\n        let nextInternal = this.nextInternalScrollPosition;\n        if (internal) {\n          nextInternal = Math.max(0, this.nextInternalScrollPosition - internal.clientHeight);\n          const scrollOuterHeight = this.getScrollOuterHeight(internal);\n          const h22 = internal.scrollHeight;\n          if (nextInternal > h22 - scrollOuterHeight) {\n            nextInternal = Math.max(0, h22 - scrollOuterHeight);\n          }\n        }\n        const childElement = element.firstElementChild;\n        let transitionDuration = 300;\n        if (this.transitionName === \"pop\" || this.transitionName == \"modal-pop\") {\n          transitionDuration = 250;\n        }\n        if (this.transitionName == \"push\" || this.transitionName == \"pop\" || this.transitionName == \"modal-push\") {\n          childElement.style.willChange = \"transform\";\n        }\n        if (internal) {\n          internal.style.willChange = \"scroll-position\";\n        }\n        this.growSize(w, h2);\n        requestAnimationFrame(() => {\n          if (internal) {\n            internal.scrollTop = nextInternal;\n          }\n          element.className = this.transitionName + \"-enter-active \" + this.transitionName + \"-enter-to\";\n          setTimeout(() => {\n            element.style.willChange = \"\";\n            childElement.style.willChange = \"\";\n            if (internal) {\n              internal.style.willChange = \"\";\n            }\n            done();\n          }, transitionDuration + 25);\n        });\n      });\n    },\n    getScrollOuterHeight(scrollElement) {\n      let h2 = scrollElement.clientHeight;\n      if (scrollElement === document.documentElement) {\n        const w = window;\n        if (w.visualViewport) {\n          h2 = w.visualViewport.height;\n        }\n      }\n      return h2;\n    },\n    leave(element, done) {\n      if (this.transitionName == \"none\") {\n        done();\n        return;\n      }\n      const childElement = element.firstElementChild;\n      childElement.style.willChange = \"transform\";\n      let transitionDuration = 300;\n      if (this.transitionName === \"pop\" || this.transitionName == \"modal-pop\") {\n        transitionDuration = 250;\n      }\n      requestAnimationFrame(() => {\n        const h2 = this.$el.offsetHeight;\n        const w = this.$el.offsetWidth;\n        const height = h2 + \"px\";\n        const width = w + \"px\";\n        element.className = this.transitionName + \"-leave-active \" + this.transitionName + \"-leave-from\";\n        element.style.top = \"0px\";\n        element.style.height = height;\n        element.style.width = width;\n        element.style.bottom = \"auto\";\n        element.style.overflow = \"hidden\";\n        childElement.style.overflow = \"hidden\";\n        childElement.style.height = height;\n        childElement.style.width = width;\n        requestAnimationFrame(() => {\n          element.className = this.transitionName + \"-leave-active \" + this.transitionName + \"-leave-to\";\n          setTimeout(() => {\n            element.style.overflow = \"\";\n            element.style.top = \"\";\n            element.style.height = \"\";\n            element.style.bottom = \"\";\n            childElement.style.overflow = \"\";\n            childElement.style.willChange = \"\";\n            done();\n          }, transitionDuration + 25);\n        });\n      });\n    },\n    afterLeave(element) {\n      if (this.transitionName == \"none\") {\n        return;\n      }\n      element.className = \"\";\n    },\n    afterEnter(element) {\n      if (this.transitionName == \"none\") {\n        return;\n      }\n      this.unfreezeSize();\n      element.className = \"\";\n    },\n    enterCancelled(_element) {\n      this.unfreezeSize();\n    }\n  }\n});\nconst _sfc_main$4 = NavigationController$1;\nconst _hoisted_1$3 = {\n  key: 0,\n  class: \"navigation-controller\"\n};\nfunction _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {\n  const _component_FramedComponent = resolveComponent(\"FramedComponent\");\n  return _ctx.mainComponent ? (openBlock(), createElementBlock(\"div\", _hoisted_1$3, [\n    createVNode(Transition, {\n      css: false,\n      onBeforeEnter: _ctx.beforeEnter,\n      onBeforeLeave: _ctx.beforeLeave,\n      onEnter: _ctx.enter,\n      onLeave: _ctx.leave,\n      onAfterLeave: _ctx.afterLeave,\n      onAfterEnter: _ctx.afterEnter,\n      onEnterCancelled: _ctx.enterCancelled\n    }, {\n      default: withCtx(() => [\n        (openBlock(), createBlock(_component_FramedComponent, {\n          key: _ctx.mainComponent.key,\n          ref: \"child\",\n          root: _ctx.mainComponent,\n          \"custom-provide\": _ctx.provideForComponent(_ctx.mainComponent.key)\n        }, null, 8, [\"root\", \"custom-provide\"]))\n      ]),\n      _: 1\n    }, 8, [\"onBeforeEnter\", \"onBeforeLeave\", \"onEnter\", \"onLeave\", \"onAfterLeave\", \"onAfterEnter\", \"onEnterCancelled\"])\n  ])) : createCommentVNode(\"\", true);\n}\nconst NavigationController = /* @__PURE__ */ _export_sfc(_sfc_main$4, [[\"render\", _sfc_render$1]]);\nfunction usePop() {\n  const rawPop = inject(\"reactive_navigation_pop\", null);\n  return (options) => {\n    const pop = unref(rawPop);\n    if (!pop) {\n      console.warn(\"Failed to perform pop\");\n      return;\n    }\n    return pop(options);\n  };\n}\nfunction useNavigate() {\n  const instance = getCurrentInstance();\n  const present = usePresent();\n  const show = useShow();\n  const showDetail = useShowDetail();\n  const toRoute = async function(route, options) {\n    let componentProperties = (options == null ? void 0 : options.properties) ?? (options == null ? void 0 : options.params) ?? {};\n    let params = (options == null ? void 0 : options.params) ?? {};\n    if (!(options == null ? void 0 : options.properties) && route.paramsToProps) {\n      componentProperties = route.paramsToProps(params, options == null ? void 0 : options.query);\n    }\n    if (!(options == null ? void 0 : options.params) && route.propsToParams && componentProperties) {\n      const { params: p } = route.propsToParams(await componentProperties);\n      params = p;\n    }\n    const url = templateToUrl(route.url, params ?? {});\n    if (\"handler\" in route) {\n      await route.handler({\n        url,\n        adjustHistory: (options == null ? void 0 : options.adjustHistory) ?? true,\n        animated: (options == null ? void 0 : options.animated) ?? true,\n        modalDisplayStyle: \"present\" in route && typeof route.present === \"string\" ? route.present : void 0,\n        checkRoutes: (options == null ? void 0 : options.checkRoutes) ?? false,\n        componentProperties: await componentProperties\n      });\n      return;\n    }\n    let component;\n    if (typeof route.component === \"function\" || componentProperties.then) {\n      const method = typeof route.component === \"function\" ? route.component : () => route.component;\n      const originalProperties = componentProperties;\n      if (!(\"PromiseComponent\" in window)) {\n        throw new Error(\"Required PromiseComponent window variable to make async components work in routes\");\n      }\n      component = window.PromiseComponent;\n      componentProperties = {\n        promise: async () => {\n          const realComponent = await method();\n          return new ComponentWithProperties(realComponent, await originalProperties);\n        }\n      };\n    } else {\n      component = route.component === \"self\" ? instance == null ? void 0 : instance.type : route.component;\n    }\n    if (!component) {\n      throw new Error(\"Component not found\");\n    }\n    if (route.present) {\n      await present({\n        url,\n        adjustHistory: (options == null ? void 0 : options.adjustHistory) ?? true,\n        animated: (options == null ? void 0 : options.animated) ?? true,\n        components: [\n          new ComponentWithProperties(NavigationController, {\n            root: new ComponentWithProperties(component, componentProperties)\n          })\n        ],\n        modalDisplayStyle: typeof route.present === \"string\" ? route.present : void 0,\n        checkRoutes: (options == null ? void 0 : options.checkRoutes) ?? false\n      });\n    } else if (route.show === \"detail\") {\n      await showDetail({\n        url,\n        adjustHistory: (options == null ? void 0 : options.adjustHistory) ?? true,\n        animated: (options == null ? void 0 : options.animated) ?? true,\n        components: [\n          new ComponentWithProperties(NavigationController, {\n            root: new ComponentWithProperties(component, componentProperties)\n          })\n        ],\n        checkRoutes: (options == null ? void 0 : options.checkRoutes) ?? false\n      });\n    } else {\n      await show({\n        url,\n        adjustHistory: (options == null ? void 0 : options.adjustHistory) ?? true,\n        animated: (options == null ? void 0 : options.animated) ?? true,\n        components: [\n          new ComponentWithProperties(component, componentProperties)\n        ],\n        checkRoutes: (options == null ? void 0 : options.checkRoutes) ?? false\n      });\n    }\n  };\n  const currentRoutes = getCurrentRoutes();\n  const toId = async function(urlOrName, options) {\n    const route = currentRoutes.value.find((r) => r.name === urlOrName || r.url === urlOrName);\n    if (!route) {\n      throw new Error(\"Route \" + urlOrName + \" not found in \" + (instance == null ? void 0 : instance.type.name));\n    }\n    return await toRoute(route, options);\n  };\n  return async function(prop1, prop2) {\n    if (typeof prop1 === \"string\") {\n      return await toId(prop1, prop2);\n    }\n    await toRoute(prop1, prop2);\n  };\n}\nfunction getCurrentRoutes() {\n  const instance = getCurrentInstance();\n  return customRef(() => {\n    return {\n      get() {\n        return instance._navigationRoutes ?? [];\n      },\n      set(newValue) {\n        instance._navigationRoutes = newValue;\n      }\n    };\n  });\n}\nfunction onCheckRoutes(handler) {\n  const instance = getCurrentInstance();\n  instance._navigationCheckRoutesHandlers = [...instance._navigationCheckRoutes ?? [], handler];\n  addCheckRoutesMountedHandler();\n}\nfunction onNotCheckRoutes(handler) {\n  const instance = getCurrentInstance();\n  instance._navigationNotCheckRoutesHandlers = [...instance._navigationNotCheckRoutesHandlers ?? [], handler];\n  addCheckRoutesMountedHandler();\n}\nfunction addCheckRoutesMountedHandler() {\n  const instance = getCurrentInstance();\n  const component = useCurrentComponent();\n  if (instance._didAddCheckRoutesMountedHandler) {\n    return;\n  }\n  instance._didAddCheckRoutesMountedHandler = true;\n  onMounted(async () => {\n    if (component && component.checkRoutes) {\n      component.checkRoutes = false;\n      if (\"_navigationCheckRoutesHandlers\" in instance && Array.isArray(instance._navigationCheckRoutesHandlers)) {\n        for (const handler of instance._navigationCheckRoutesHandlers) {\n          if (typeof handler === \"function\") {\n            await handler();\n          } else {\n            console.error(\"Invalid checkRoutes handler\", handler);\n          }\n        }\n      }\n    } else {\n      if (\"_navigationNotCheckRoutesHandlers\" in instance && Array.isArray(instance._navigationNotCheckRoutesHandlers)) {\n        for (const handler of instance._navigationNotCheckRoutesHandlers) {\n          if (typeof handler === \"function\") {\n            await handler();\n          } else {\n            console.error(\"Invalid not checkRoutes handler\", handler);\n          }\n        }\n      }\n    }\n  });\n}\nfunction defineRoutes(routes) {\n  const urlhelpers = useUrl();\n  const navigate = useNavigate();\n  const currentRoutes = getCurrentRoutes();\n  const provideDefaultHandler = inject(\"reactive_provide_default_handler\", null);\n  if (currentRoutes.value.length) {\n    console.error(\"Multiple calls to defineRoutes: routes will get overwritten\");\n  }\n  currentRoutes.value = Array.isArray(routes) ? routes : [];\n  async function handleRoutes(routes2) {\n    for (const route of routes2) {\n      const result = urlhelpers.match(route.url, route.params);\n      if (result) {\n        try {\n          await navigate(route, {\n            params: result.params,\n            animated: false,\n            adjustHistory: false,\n            query: result.query,\n            checkRoutes: true\n          });\n          return true;\n        } catch (e) {\n          console.error(\"Failed to navigate to route\", route, e);\n        }\n      }\n    }\n    try {\n      if (await defaultHandler({ allowDetail: false })) {\n        return true;\n      }\n    } catch (e) {\n      console.error(\"Failed to navigate to default (non-detail) route\", e);\n    }\n    return false;\n  }\n  const getDefaultRoute = ({ allowDetail } = { allowDetail: true }) => {\n    if (!Array.isArray(routes)) {\n      return null;\n    }\n    return routes.find((route) => route.isDefault && (allowDetail || !(\"show\" in route) || route.show !== \"detail\")) ?? null;\n  };\n  const defaultHandler = async ({ allowDetail } = { allowDetail: true }) => {\n    const defaultRoute = getDefaultRoute({ allowDetail });\n    if (defaultRoute) {\n      try {\n        await navigate(defaultRoute, {\n          ...defaultRoute.isDefault,\n          adjustHistory: false,\n          checkRoutes: false\n        });\n        return true;\n      } catch (e) {\n        console.error(\"Failed to navigate to default route\", defaultRoute, e);\n      }\n    }\n    return false;\n  };\n  const setDefaultHandler = () => {\n    const dr = getDefaultRoute();\n    if (dr) {\n      const unreffedProvideDefaultHandler = unref(provideDefaultHandler);\n      if (unreffedProvideDefaultHandler) {\n        unreffedProvideDefaultHandler(defaultHandler);\n      }\n    }\n  };\n  onCheckRoutes(async () => {\n    if (Array.isArray(routes)) {\n      if (await handleRoutes(routes)) {\n        setDefaultHandler();\n        return;\n      }\n    } else {\n      const extraRoutes = await routes();\n      if (Array.isArray(extraRoutes)) {\n        if (await handleRoutes(extraRoutes)) {\n          setDefaultHandler();\n          return;\n        }\n      } else {\n        if (extraRoutes) {\n          setDefaultHandler();\n          return;\n        }\n      }\n    }\n    setDefaultHandler();\n  });\n  onNotCheckRoutes(async () => {\n    await defaultHandler({ allowDetail: false });\n    setDefaultHandler();\n  });\n}\nconst checkRouteCache = {\n  lastUrl: null,\n  results: /* @__PURE__ */ new Map()\n};\nfunction useCurrentHref() {\n  const state = ref(window.location.href);\n  const owner = {};\n  HistoryManager.addListener(owner, () => {\n    state.value = window.location.href;\n  });\n  onScopeDispose(() => {\n    HistoryManager.removeListener(owner);\n  });\n  return state;\n}\nfunction useCheckRoute() {\n  const urlhelpers = useUrl();\n  const currentRoutes = getCurrentRoutes();\n  const instance = getCurrentInstance();\n  const currentPath = useCurrentHref();\n  const checkMatchResult = function(route, result, options) {\n    if (!result) {\n      return false;\n    }\n    if (options) {\n      for (const key in options.params) {\n        if (result.params[key] !== options.params[key]) {\n          return false;\n        }\n      }\n      for (const key in options.query) {\n        if (result.query.get(key) !== options.query.get(key)) {\n          return false;\n        }\n      }\n      if (!(options == null ? void 0 : options.params) && route.propsToParams && options.properties) {\n        const { params } = route.propsToParams(options.properties);\n        for (const key in params) {\n          if (result.params[key] !== params[key]) {\n            return false;\n          }\n        }\n      }\n    }\n    return true;\n  };\n  const quickCheckCache = function(id, options) {\n    if (checkRouteCache.lastUrl !== currentPath.value) {\n      checkRouteCache.results.clear();\n      checkRouteCache.lastUrl = currentPath.value;\n    } else {\n      const result = checkRouteCache.results.get(id);\n      if (result) {\n        return checkMatchResult(result.route, result.result, options);\n      }\n    }\n  };\n  const checkRoute = function(route, options) {\n    const result = urlhelpers.matchCurrent(route.url, route.params);\n    checkRouteCache.results.set(route.url, { result, route });\n    if (route.name) {\n      checkRouteCache.results.set(route.name, { result, route });\n    }\n    return checkMatchResult(route, result, options);\n  };\n  const checkId = function(urlOrName, options) {\n    const result = quickCheckCache(urlOrName, options);\n    if (result !== void 0) {\n      return result;\n    }\n    const route = currentRoutes.value.find((r) => r.name === urlOrName || r.url === urlOrName);\n    if (!route) {\n      throw new Error(\"Route \" + urlOrName + \" not found in \" + (instance == null ? void 0 : instance.type.name));\n    }\n    return checkRoute(route, options);\n  };\n  return function(prop1, prop2) {\n    if (typeof prop1 === \"string\") {\n      return checkId(prop1, prop2);\n    }\n    const result = quickCheckCache(prop1.name || prop1.url, prop2);\n    if (result !== void 0) {\n      return result;\n    }\n    return checkRoute(prop1, prop2);\n  };\n}\nfunction normalizePushOptions(o, currentComponent, urlHelpers) {\n  let options;\n  if (!o.components) {\n    options = { components: [o] };\n  } else {\n    options = o;\n  }\n  if (options.checkRoutes) {\n    options.components[options.components.length - 1].setCheckRoutes();\n  }\n  if (currentComponent) {\n    for (const component of options.components) {\n      component.inheritFromDisplayer(currentComponent);\n    }\n  } else {\n    console.warn(\"Using show or present outside of a component: Inherited properties will not be set.\");\n  }\n  if (options.url !== void 0) {\n    const url = options.url;\n    for (const component of options.components) {\n      component.provide.reactive_navigation_url = computed(() => url === null ? null : urlHelpers.extendUrl(url, { returnHistory: options.replace ?? 0 }));\n    }\n  }\n  return options;\n}\nfunction useManualPresent() {\n  const currentComponent = useCurrentComponent();\n  const urlHelpers = useUrl();\n  return (present, options) => {\n    return present(normalizePushOptions(options, currentComponent, urlHelpers));\n  };\n}\nfunction useShow() {\n  const currentComponent = useCurrentComponent();\n  const rawShow = inject(\"reactive_navigation_show\", null);\n  const urlHelpers = useUrl();\n  return (options) => {\n    const show = unref(rawShow);\n    if (!show) {\n      console.warn(\"Failed to perform show\");\n      return Promise.resolve();\n    }\n    return show(normalizePushOptions(options, currentComponent, urlHelpers));\n  };\n}\nfunction useShowDetail() {\n  const currentComponent = useCurrentComponent();\n  const rawShowDetail = inject(\"reactive_navigation_show_detail\", null);\n  const urlHelpers = useUrl();\n  return (options) => {\n    const showDetail = unref(rawShowDetail);\n    if (!showDetail) {\n      console.warn(\"Failed to perform showDetail\");\n      return Promise.resolve();\n    }\n    return showDetail(normalizePushOptions(options, currentComponent, urlHelpers));\n  };\n}\nfunction usePresent() {\n  const currentComponent = useCurrentComponent();\n  const rawPresent = inject(\"reactive_navigation_present\", null);\n  const urlHelpers = useUrl();\n  return async (options) => {\n    const present = unref(rawPresent);\n    if (!present) {\n      console.warn(\"Failed to perform present\");\n      return Promise.resolve();\n    }\n    return present(normalizePushOptions(options, currentComponent, urlHelpers));\n  };\n}\nfunction useDismiss() {\n  const rawDismiss = inject(\"reactive_navigation_dismiss\", null);\n  return (options) => {\n    const dismiss = unref(rawDismiss);\n    if (!dismiss) {\n      console.warn(\"Failed to perform dismiss\");\n      return Promise.resolve();\n    }\n    return dismiss(options);\n  };\n}\nfunction useCanPop() {\n  const rawPop = inject(\"reactive_navigation_can_pop\", false);\n  return computed(() => {\n    return !!unref(rawPop);\n  });\n}\nfunction useCanDismiss() {\n  const rawDismiss = inject(\"reactive_navigation_can_dismiss\", false);\n  return computed(() => !!unref(rawDismiss));\n}\nfunction useFocused() {\n  const rawFocused = inject(\"reactive_navigation_focused\", true);\n  return computed(() => !!unref(rawFocused));\n}\nfunction extendUrl(url) {\n  const urlHelpers = useUrl();\n  provide(\"reactive_navigation_url\", computed(() => {\n    return urlHelpers.extendUrl(unref(url));\n  }));\n}\nfunction setTitleSuffix(title) {\n  HistoryManager.titleSuffix = title;\n}\nfunction setTitle(title) {\n  if (!title) {\n    return;\n  }\n  const urlHelpers = useUrl();\n  onActivated(() => {\n    urlHelpers.setTitle(title);\n  });\n}\nfunction setUrl(url, title) {\n  const urlHelpers = useUrl();\n  onMounted(() => {\n    urlHelpers.overrideUrl(url, title);\n  });\n}\nfunction useUrl() {\n  const currentComponent = useCurrentComponent();\n  const navigationUrl = inject(\"reactive_navigation_url\", null);\n  const disableUrl = inject(\"reactive_navigation_disable_url\", null);\n  const historyIndex = inject(\"navigation_historyIndex\", null);\n  return {\n    getUrl() {\n      return unref(navigationUrl) ?? \"\";\n    },\n    /**\n     * Ideally call this after you've processed all the .match() calls (and awaited async stuff)\n     */\n    setTitle(title) {\n      if (!currentComponent) {\n        console.error(\"No current component while setting title\", title);\n        return;\n      }\n      if (unref(disableUrl)) {\n        return;\n      }\n      if (title) {\n        currentComponent.setTitle(title);\n      }\n    },\n    extendUrl(url, options = {}) {\n      let prefix = this.getUrl();\n      if (options.returnHistory) {\n        const index = unref(historyIndex);\n        if (index !== null && index !== void 0) {\n          prefix = HistoryManager.getStateUrl(index - options.returnHistory);\n        } else {\n          console.error(\"Failed to get history index\");\n        }\n      }\n      if (prefix && prefix !== \"/\") {\n        return prefix + \"/\" + UrlHelper.trim(url);\n      }\n      return UrlHelper.trim(url);\n    },\n    match(template, params) {\n      const shared = UrlHelper.shared;\n      const helper = new UrlHelper(shared.url, this.getUrl());\n      return helper.match(template, params);\n    },\n    matchCurrent(template, params) {\n      const helper = new UrlHelper(void 0, this.getUrl());\n      return helper.match(template, params);\n    },\n    overrideUrl(url, title) {\n      if (!currentComponent) {\n        console.error(\"No current component while setting title\", title);\n        return;\n      }\n      if (unref(disableUrl)) {\n        return;\n      }\n      currentComponent == null ? void 0 : currentComponent.overrideUrl(url, title);\n    }\n  };\n}\nconst _hoisted_1$2 = { class: \"stack-component\" };\nconst _sfc_main$3 = /* @__PURE__ */ defineComponent({\n  __name: \"StackComponent\",\n  emits: [\"returnToHistoryIndex\"],\n  setup(__props, { expose: __expose, emit: __emit }) {\n    const children = ref([]);\n    const parentIsFocused = useFocused();\n    const emit = __emit;\n    function getCustomProvide(index, key) {\n      return {\n        reactive_navigation_pop: () => {\n          removeAt(index, key);\n        },\n        reactive_navigation_can_pop: true,\n        reactive_navigation_dismiss: () => {\n          console.warn(\"Avoid calling dismiss in components on the StackComponent, since options are not supported here\");\n          removeAt(index, key);\n        },\n        reactive_navigation_can_dismiss: false,\n        reactive_navigation_focused: parentIsFocused.value && getFocusedComponent() === children.value[index]\n      };\n    }\n    function removeAt(index, key) {\n      if (!children.value[index]) {\n        for (const [i, comp] of children.value.entries()) {\n          if (comp.key === key) {\n            console.warn(\"Corrected index from \" + index + \" to \" + i);\n            index = i;\n            break;\n          }\n        }\n      }\n      if (children.value[index] !== void 0 && children.value[index].key === key) {\n        const hadFocus = children.value[index].hasHistoryIndex();\n        children.value.splice(index, 1);\n        if (hadFocus) {\n          const newFocused = getComponentWithHistory();\n          if (!newFocused) {\n            emit(\"returnToHistoryIndex\");\n          } else {\n            newFocused.returnToHistoryIndex();\n          }\n        }\n      } else {\n        console.warn(\"Expected component with key \" + key + \" at index \" + index);\n      }\n    }\n    function getComponentWithHistory() {\n      for (let i = children.value.length - 1; i >= 0; i--) {\n        if (children.value[i].hasHistoryIndex() && !children.value[i].isDismissing.value) {\n          return children.value[i];\n        }\n      }\n      return null;\n    }\n    function getFocusedComponent() {\n      for (let i = children.value.length - 1; i >= 0; i--) {\n        if (children.value[i].canHaveFocus() && !children.value[i].isDismissing.value) {\n          return children.value[i];\n        }\n      }\n      return null;\n    }\n    function show(component) {\n      children.value.push(component);\n    }\n    onBeforeUnmount(() => {\n      children.value = [];\n    });\n    __expose({\n      show,\n      getFocusedComponent,\n      removeAt,\n      children\n    });\n    return (_ctx, _cache) => {\n      return openBlock(), createElementBlock(\"div\", _hoisted_1$2, [\n        createVNode(TransitionGroup, {\n          name: \"show\",\n          duration: 300\n        }, {\n          default: withCtx(() => [\n            (openBlock(true), createElementBlock(Fragment, null, renderList(children.value, (component, index) => {\n              return openBlock(), createBlock(unref(ComponentWithPropertiesInstance), {\n                key: component.key,\n                component,\n                \"custom-provide\": getCustomProvide(index, component.key)\n              }, null, 8, [\"component\", \"custom-provide\"]);\n            }), 128))\n          ]),\n          _: 1\n        })\n      ]);\n    };\n  }\n});\nconst _sfc_main$2 = /* @__PURE__ */ defineComponent({\n  __name: \"ModalStackComponent\",\n  props: {\n    root: {},\n    initialComponents: { default: null },\n    initialPresents: { default: null }\n  },\n  setup(__props, { expose: __expose }) {\n    const props = __props;\n    const navigationController = ref(null);\n    const stackComponent = ref(null);\n    const parentIsFocused = useFocused();\n    const instance = getCurrentInstance();\n    provide(\"reactive_modalStackComponent\", computed(() => getExposeProxy(instance)));\n    provide(\"reactive_navigation_present\", present);\n    onMounted(() => {\n      var _a;\n      if (props.initialPresents) {\n        for (const p of props.initialPresents) {\n          (_a = navigationController.value) == null ? void 0 : _a.push(p);\n        }\n      }\n    });\n    function returnToHistoryIndex() {\n      var _a;\n      return (_a = navigationController.value) == null ? void 0 : _a.returnToHistoryIndex();\n    }\n    const navigationFocused = computed(() => {\n      var _a;\n      return parentIsFocused.value && !((_a = stackComponent.value) == null ? void 0 : _a.getFocusedComponent());\n    });\n    const customProvide = computed(() => {\n      return {\n        reactive_navigation_focused: navigationFocused\n      };\n    });\n    async function present(options) {\n      var _a, _b, _c, _d, _e;\n      const component = options.components[options.components.length - 1];\n      if (options.animated !== void 0) {\n        component.animated = options.animated;\n      }\n      const style = options.modalDisplayStyle ?? component.modalDisplayStyle ?? \"cover\";\n      component.setDisplayStyle(style);\n      if ((style === \"popup\" || style === \"sheet\" || style === \"side-view\") && ((_a = stackComponent.value) == null ? void 0 : _a.$el).offsetWidth > 800 || style === \"sheet\" && ((_b = stackComponent.value) == null ? void 0 : _b.$el).offsetWidth > 700) {\n        const c = new ComponentWithProperties(_sfc_main, {\n          root: component,\n          className: options.modalClass ?? style,\n          style: options.modalCssStyle ?? void 0\n        });\n        c.inheritFromDisplayer(component);\n        const adjustHistory = (options == null ? void 0 : options.adjustHistory) ?? true;\n        HistoryManager.pushState(void 0, adjustHistory ? async (canAnimate) => {\n          var _a2;\n          await ((_a2 = c.componentInstance()) == null ? void 0 : _a2.pop({ animated: canAnimate }));\n        } : null, {\n          adjustHistory,\n          invalid: options.invalidHistory ?? false\n        });\n        c.assignHistoryIndex();\n        (_c = stackComponent.value) == null ? void 0 : _c.show(c);\n        return;\n      }\n      if (style === \"overlay\") {\n        (_d = stackComponent.value) == null ? void 0 : _d.show(component);\n        return;\n      }\n      await ((_e = navigationController.value) == null ? void 0 : _e.push(options));\n    }\n    function replace(component, animated = true) {\n      var _a;\n      const nav = navigationController.value;\n      nav == null ? void 0 : nav.push({ components: [component], animated, replace: ((_a = nav == null ? void 0 : nav.components) == null ? void 0 : _a.length) ?? 0 });\n    }\n    __expose({\n      present: shallowRef(present),\n      stackComponent,\n      replace\n    });\n    return (_ctx, _cache) => {\n      return openBlock(), createElementBlock(\"div\", null, [\n        createVNode(NavigationController, {\n          ref_key: \"navigationController\",\n          ref: navigationController,\n          \"animation-type\": \"modal\",\n          root: _ctx.root,\n          \"initial-components\": _ctx.initialComponents,\n          \"custom-provide\": customProvide.value\n        }, null, 8, [\"root\", \"initial-components\", \"custom-provide\"]),\n        createVNode(_sfc_main$3, {\n          ref_key: \"stackComponent\",\n          ref: stackComponent,\n          onReturnToHistoryIndex: returnToHistoryIndex\n        }, null, 512)\n      ]);\n    };\n  }\n});\nconst ModalStackComponentFinderMixin = defineComponent({\n  computed: {\n    modalStackComponent() {\n      let start = this.$parent;\n      while (start) {\n        if (start instanceof _sfc_main$2) {\n          return start;\n        }\n        start = start.$parent;\n      }\n      return null;\n    }\n  }\n});\nfunction injectHooks(instanceProxy, definitions) {\n  const ctx = instanceProxy.$.ctx;\n  for (const key in definitions) {\n    if (!isRef(definitions[key])) {\n      ctx[key] = definitions[key];\n    } else {\n      const val = definitions[key];\n      Object.defineProperty(ctx, key, {\n        enumerable: true,\n        configurable: true,\n        get: () => {\n          return val.value;\n        },\n        set: () => {\n          warn(`Cannot assign to '${key}' of navigation mixin. This is a read-only property.`);\n        }\n      });\n    }\n  }\n}\nconst throttle = (func, limit) => {\n  let lastFunc;\n  let lastRan;\n  return function() {\n    const context = this;\n    const args = arguments;\n    if (!lastRan) {\n      func.apply(context, args);\n      lastRan = Date.now();\n    } else {\n      clearTimeout(lastFunc);\n      lastFunc = setTimeout(function() {\n        if (Date.now() - lastRan >= limit) {\n          func.apply(context, args);\n          lastRan = Date.now();\n        }\n      }, limit - (Date.now() - lastRan));\n    }\n  };\n};\nfunction useSplitViewController() {\n  const c = inject(\"reactive_splitViewController\");\n  return shallowRef(c);\n}\nconst SplitViewController$1 = defineComponent({\n  name: \"SplitViewController\",\n  components: {\n    NavigationController,\n    FramedComponent\n  },\n  provide() {\n    return {\n      reactive_splitViewController: this,\n      reactive_navigation_show_detail: this.showDetail\n    };\n  },\n  props: {\n    root: {\n      required: true,\n      type: Object\n    },\n    detailWidth: {\n      default: null,\n      type: String\n    }\n  },\n  data() {\n    return {\n      detail: null,\n      detailKey: null,\n      defaultHandler: null,\n      isChangingComponents: false\n    };\n  },\n  computed: {\n    masterProvide() {\n      return {\n        // The master cannot make changes to the url or title if there is a detail\n        reactive_navigation_disable_url: computed(() => !!this.detail),\n        reactive_provide_default_handler: (defaultHandler) => {\n          this.defaultHandler = defaultHandler;\n          this.onResize();\n        }\n      };\n    },\n    lastIsDetail() {\n      var _a, _b;\n      return this.detailKey != null && ((_b = (_a = this.navigationController) == null ? void 0 : _a.mainComponent) == null ? void 0 : _b.key) == this.detailKey;\n    },\n    navigationController() {\n      return this.$refs[\"navigationController\"];\n    },\n    masterElement() {\n      return this.$refs[\"masterElement\"];\n    }\n  },\n  created() {\n    const definitions = {\n      $url: useUrl()\n    };\n    injectHooks(this, definitions);\n  },\n  mounted() {\n    if (this.detailWidth) {\n      this.$el.style.setProperty(\"--split-view-width\", this.detailWidth);\n    }\n  },\n  activated() {\n    this.listener = throttle(this.onResize, 100);\n    window.addEventListener(\"resize\", this.listener, { passive: true });\n    this.onResize();\n  },\n  deactivated() {\n    window.removeEventListener(\"resize\", this.listener, { passive: true });\n  },\n  methods: {\n    returnToHistoryIndex() {\n      if (this.detail) {\n        return this.detail.returnToHistoryIndex();\n      }\n      return this.navigationController.returnToHistoryIndex();\n    },\n    onResize() {\n      if (this.shouldCollapse()) {\n        if (this.detail) {\n          this.collapse().catch(console.error);\n        }\n      } else {\n        if (this.canExpand()) {\n          this.expand().catch(console.error);\n        }\n      }\n    },\n    getScrollElement(element = null) {\n      if (!element) {\n        element = this.$el;\n      }\n      const style = window.getComputedStyle(element);\n      if (style.overflowY == \"scroll\" || style.overflow == \"scroll\" || style.overflow == \"auto\" || style.overflowY == \"auto\") {\n        return element;\n      } else {\n        if (!element.parentElement) {\n          return document.documentElement;\n        }\n        return this.getScrollElement(element.parentElement);\n      }\n    },\n    async shouldNavigateAway() {\n      if (this.detail) {\n        const r = await this.detail.shouldNavigateAway();\n        if (!r) {\n          return false;\n        }\n      }\n      if (this.navigationController) {\n        return await this.navigationController.shouldNavigateAway();\n      }\n      return true;\n    },\n    async showDetail(options) {\n      if (this.isChangingComponents) {\n        console.error(\"Show detail called on a splitViewController that is busy\");\n        return false;\n      }\n      const component = options.components[options.components.length - 1];\n      this.detailKey = component.key;\n      this.isChangingComponents = true;\n      try {\n        if (this.shouldCollapse()) {\n          if (this.lastIsDetail || this.detail) {\n            console.error(\"Pushing a detail when a detail is already presented is not allowed\");\n            this.isChangingComponents = false;\n            return false;\n          }\n          await this.navigationController.push(options);\n        } else {\n          if (this.detail) {\n            const r = await this.detail.shouldNavigateAway();\n            if (!r) {\n              this.isChangingComponents = false;\n              return false;\n            }\n          }\n          this.getScrollElement().scrollTop = 0;\n          HistoryManager.pushState(void 0, null, {\n            adjustHistory: options.adjustHistory ?? true,\n            invalid: options.invalidHistory ?? !!this.detail\n          });\n          this.detail = component;\n          this.detail.assignHistoryIndex();\n        }\n      } finally {\n        this.isChangingComponents = false;\n      }\n      return true;\n    },\n    shouldCollapse() {\n      return this.$el.offsetWidth < 850;\n    },\n    async collapse() {\n      if (!this.navigationController) {\n        console.error(\"Cannot collapse without navigation controller\");\n        return;\n      }\n      if (this.lastIsDetail) {\n        console.error(\"Cannot collapse when the detail is already collaped\");\n        return;\n      }\n      if (!this.detail) {\n        console.error(\"Cannot collapse without detail\");\n        return;\n      }\n      if (this.isChangingComponents) {\n        console.error(\"Cannot collapse while already isChangingComponents\");\n        return;\n      }\n      this.isChangingComponents = true;\n      try {\n        this.detail.keepAlive = true;\n        const detail = this.detail;\n        this.detail = null;\n        await this.navigationController.push({ components: [detail], animated: false });\n        HistoryManager.invalidateHistory();\n      } finally {\n        this.isChangingComponents = false;\n      }\n    },\n    canExpand() {\n      if (!this.navigationController) {\n        return false;\n      }\n      if (this.detail) {\n        return false;\n      }\n      if (this.isChangingComponents) {\n        return false;\n      }\n      if (!this.lastIsDetail) {\n        if (this.defaultHandler) {\n          return true;\n        }\n        return false;\n      }\n      return true;\n    },\n    async expand() {\n      if (!this.navigationController) {\n        console.error(\"Cannot expand without navigation controller\");\n        return;\n      }\n      if (this.detail) {\n        console.error(\"Cannot expand when detail is already visible\");\n        return;\n      }\n      if (this.isChangingComponents) {\n        console.error(\"Cannot expand while already isChangingComponents\");\n        return false;\n      }\n      if (!this.lastIsDetail) {\n        if (!this.defaultHandler) {\n          console.error(\"Cannot expand when there is no defaultHandler\");\n          return;\n        }\n        HistoryManager.invalidateHistory();\n        this.isChangingComponents = false;\n        try {\n          const succeeded = await this.defaultHandler();\n          if (succeeded && !this.detail) {\n            console.warn(\"Did call defaultHandler but no detail was set. Are all mounts properly awaited?\");\n          }\n          if (!succeeded) {\n            console.warn(\"Failed to show default handler\");\n          }\n          console.info(\"Used default handler for split view controller\");\n        } finally {\n          this.isChangingComponents = false;\n        }\n        return;\n      }\n      this.isChangingComponents = true;\n      try {\n        const popped = await this.navigationController.pop({\n          animated: false,\n          destroy: false\n        });\n        if (!popped || popped.length == 0) {\n          this.isChangingComponents = false;\n          return;\n        }\n        await this.$nextTick();\n        HistoryManager.pushState(void 0, null, {\n          adjustHistory: false,\n          invalid: true\n        });\n        this.detailKey = popped[0].key;\n        this.detail = popped[0];\n        this.detail.assignHistoryIndex();\n      } finally {\n        this.isChangingComponents = false;\n      }\n    }\n  }\n});\nconst _sfc_main$1 = SplitViewController$1;\nconst _hoisted_1$1 = [\"data-has-detail\"];\nconst _hoisted_2 = {\n  ref: \"masterElement\",\n  class: \"master\"\n};\nconst _hoisted_3 = {\n  key: 0,\n  class: \"detail\"\n};\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n  const _component_NavigationController = resolveComponent(\"NavigationController\");\n  const _component_FramedComponent = resolveComponent(\"FramedComponent\");\n  return openBlock(), createElementBlock(\"div\", {\n    class: \"split-view-controller\",\n    \"data-has-detail\": _ctx.detail ? \"true\" : \"false\"\n  }, [\n    createElementVNode(\"div\", _hoisted_2, [\n      createVNode(_component_NavigationController, {\n        ref: \"navigationController\",\n        root: _ctx.root,\n        \"custom-provide\": _ctx.masterProvide\n      }, null, 8, [\"root\", \"custom-provide\"])\n    ], 512),\n    _ctx.detail ? (openBlock(), createElementBlock(\"div\", _hoisted_3, [\n      (openBlock(), createBlock(_component_FramedComponent, {\n        key: _ctx.detail.key,\n        root: _ctx.detail\n      }, null, 8, [\"root\"]))\n    ])) : createCommentVNode(\"\", true)\n  ], 8, _hoisted_1$1);\n}\nconst SplitViewController = /* @__PURE__ */ _export_sfc(_sfc_main$1, [[\"render\", _sfc_render]]);\nfunction useModalStackComponent() {\n  const c = inject(\"reactive_modalStackComponent\");\n  return c;\n}\nfunction usePopup() {\n  return inject(\"reactive_popup\", null);\n}\nconst navigationMethods = {\n  setTitle() {\n    var _a;\n    const navigationOptions = (_a = this.$options) == null ? void 0 : _a.navigation;\n    if (!navigationOptions)\n      return;\n    const title = navigationOptions.title;\n    if (typeof title === \"function\") {\n      this.$url.setTitle(title.call(this));\n    } else {\n      this.$url.setTitle(title ?? \"\");\n    }\n  }\n};\nconst NavigationMixin = {\n  created() {\n    var _a;\n    const definitions = {\n      pop: usePop(),\n      showDetail: useShowDetail(),\n      show: useShow(),\n      present: usePresent(),\n      dismiss: useDismiss(),\n      canPop: useCanPop(),\n      canDismiss: useCanDismiss(),\n      isFocused: useFocused(),\n      emitParents: () => {\n        throw new Error(\"emitParents has been removed and should no longer be needed\");\n      },\n      popup: usePopup(),\n      modalStackComponent: useModalStackComponent(),\n      navigationController: useNavigationController(),\n      splitViewController: useSplitViewController(),\n      $url: useUrl(),\n      $navigate: useNavigate()\n    };\n    const navigationOptions = (_a = this.$options) == null ? void 0 : _a.navigation;\n    if (navigationOptions || this.customRoutes) {\n      defineRoutes((navigationOptions == null ? void 0 : navigationOptions.routes) ?? (this.customRoutes ? this.customRoutes.bind(this) : null) ?? []);\n    }\n    injectHooks(this, definitions);\n  },\n  computed: {\n    modalNavigationController() {\n      return this.modalStackComponent.navigationController;\n    }\n  },\n  activated() {\n    navigationMethods.setTitle.call(this);\n  }\n  // eslint-disable-next-line @typescript-eslint/ban-types\n};\nconst _hoisted_1 = { class: \"scrollable-container\" };\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n  __name: \"Popup\",\n  props: {\n    root: {},\n    className: { default: \"popup\" },\n    style: { default: \"\" }\n  },\n  setup(__props, { expose: __expose }) {\n    const instance = getCurrentInstance();\n    const Popup = instance.type;\n    const props = __props;\n    const hide = ref(false);\n    const modalStackComponent = useModalStackComponent();\n    const pop = usePop();\n    const mainContent = ref(null);\n    const component = useCurrentComponent();\n    provide(\"reactive_navigation_dismiss\", async (options) => {\n      return await dismiss(options);\n    });\n    provide(\"reactive_navigation_pop\", async (options) => {\n      console.warn(\"Using .pop() inside a Popup without a NavigationController dismisses the Popup. It is recommended to use .dismiss() instead.\");\n      return await dismiss(options);\n    });\n    provide(\"reactive_navigation_can_pop\", false);\n    provide(\"reactive_navigation_can_dismiss\", true);\n    provide(\"reactive_popup\", computed(() => getExposeProxy(instance)));\n    const pushDown = computed(() => {\n      var _a, _b;\n      const popups = ((_b = (_a = modalStackComponent.value) == null ? void 0 : _a.stackComponent) == null ? void 0 : _b.children.filter((c) => c.component === Popup && (c.properties.className ?? \"popup\") === (props.className ?? \"popup\") && !c.isDismissing.value)) ?? [];\n      if (popups.length > 0 && popups[popups.length - 1] !== component) {\n        if (popups.length > 1 && popups[popups.length - 2] === component) {\n          return 1;\n        }\n        return 2;\n      }\n      return 0;\n    });\n    const buildClass = computed(() => {\n      const vvv = { \"push-down\": pushDown.value == 1, \"push-down-full\": pushDown.value > 1 };\n      const j = Object.keys(vvv).filter((p) => !!vvv[p]).join(\" \");\n      return j + (j ? \" \" : \"\") + (props.className ? props.className : \"popup\") + (props.root.animated ? \" animated\" : \"\") + (isFocused.value ? \" focused\" : \"\");\n    });\n    const isFocused = useFocused();\n    const onKey = (event) => {\n      if (event.defaultPrevented || event.repeat) {\n        return;\n      }\n      if (!isFocused.value) {\n        return;\n      }\n      const key = event.key || event.keyCode;\n      if (key === \"Escape\" || key === \"Esc\" || key === 27) {\n        dismiss().catch(console.error);\n        event.preventDefault();\n      }\n    };\n    const shouldNavigateAway = () => {\n      return props.root.shouldNavigateAway();\n    };\n    const dismiss = async (options) => {\n      var _a;\n      if (hide.value) {\n        return;\n      }\n      if (!(options == null ? void 0 : options.force)) {\n        const r = await shouldNavigateAway();\n        if (!r) {\n          return false;\n        }\n      }\n      component.isDismissing.value = true;\n      (_a = pop(options)) == null ? void 0 : _a.catch(console.error);\n    };\n    const onClick = (event) => {\n      if (mainContent.value && !mainContent.value.contains(event.target) && document.body.contains(event.target)) {\n        dismiss().catch(console.error);\n        event.preventDefault();\n      }\n    };\n    onActivated(() => {\n      document.addEventListener(\"keydown\", onKey);\n    });\n    onDeactivated(() => {\n      document.removeEventListener(\"keydown\", onKey);\n    });\n    __expose({\n      dismiss: shallowRef(dismiss),\n      pop: shallowRef(dismiss)\n    });\n    return (_ctx, _cache) => {\n      return openBlock(), createElementBlock(\"div\", {\n        class: normalizeClass(buildClass.value),\n        style: normalizeStyle(_ctx.style),\n        onClick\n      }, [\n        createElementVNode(\"div\", {\n          ref_key: \"mainContent\",\n          ref: mainContent\n        }, [\n          createElementVNode(\"div\", _hoisted_1, [\n            (openBlock(), createBlock(unref(ComponentWithPropertiesInstance), {\n              key: _ctx.root.key,\n              component: _ctx.root\n            }, null, 8, [\"component\"]))\n          ])\n        ], 512)\n      ], 6);\n    };\n  }\n});\nexport {\n  ComponentWithProperties,\n  ComponentWithPropertiesInstance,\n  FramedComponent,\n  HistoryManager,\n  _sfc_main$2 as ModalStackComponent,\n  ModalStackComponentFinderMixin,\n  NavigationController,\n  NavigationMixin,\n  _sfc_main as Popup,\n  SplitViewController,\n  _sfc_main$3 as StackComponent,\n  UrlHelper,\n  defineRoutes,\n  extendUrl,\n  forAllRoots,\n  getExposeProxy,\n  injectHooks,\n  matchPath,\n  matchQuery,\n  normalizePushOptions,\n  onCheckRoutes,\n  onNotCheckRoutes,\n  setTitle,\n  setTitleSuffix,\n  setUrl,\n  templateToUrl,\n  useCanDismiss,\n  useCanPop,\n  useCheckRoute,\n  useCurrentComponent,\n  useCurrentHref,\n  useDismiss,\n  useFocused,\n  useManualPresent,\n  useModalStackComponent,\n  useNavigate,\n  useNavigationController,\n  usePop,\n  usePopup,\n  usePresent,\n  useShow,\n  useShowDetail,\n  useSplitViewController,\n  useUrl\n};\n","export const countries = ['BE', 'NL', 'FR'];\nexport const languages = ['nl', 'en'];\n//# sourceMappingURL=index.js.map","// i18n-setup.js\nimport { HistoryManager } from '@simonbackx/vue-app-navigation';\nimport { countries, languages } from '@stamhoofd/locales';\nimport { SessionContext, Storage, UrlHelper } from '@stamhoofd/networking';\nimport { Address, Country, CountryCode, countryToCode } from '@stamhoofd/structures';\nimport { I18n } from './I18n';\n\nexport function useTranslate(): typeof I18n.prototype.$t {\n    const i18n = I18nController.getI18n();\n    return i18n ? i18n.$t.bind(i18n) : k => 'i18n missing';\n}\n\nfunction setGlobalTranslateFunction(i18n: I18n) {\n    if (i18n) {\n        (window as any).$t = (key: string, replace?: Record<string, string>) => i18n.$t.bind(i18n)(key, replace);\n        (window as any).$getLanguage = () => i18n.language;\n        (window as any).$getCountry = () => i18n.country;\n        return;\n    }\n\n    (window as any).$t = (_key: string, _replace?: Record<string, string>) => 'i18n missing';\n    return;\n}\n\nexport class I18nController {\n    static i18n: I18n = import.meta.hot?.data?.i18n ?? undefined;\n    static shared: I18nController = import.meta.hot?.data?.shared ?? undefined;\n    static addUrlPrefix = true;\n    static skipUrlPrefixForLocale?: string;\n\n    /**\n     * Whether only one country is enabled for the whole domain\n     * -> use for webshops and registration pages\n     * -> affects the generated SEO meta tags\n     */\n    static fixedCountry = false;\n\n    namespace = '';\n    language = '';\n    countryCode: CountryCode = Country.Belgium;\n\n    // Used for SEO\n    defaultCountryCode: CountryCode = Country.Belgium;\n    defaultLanguage = 'nl';\n\n    // Allows you to set and remove meta data\n    // vueMetaApp?: VueMetaApp\n\n    $context: SessionContext | null | undefined;\n\n    get locale() {\n        return this.language + '-' + this.countryCode;\n    }\n\n    constructor($context: SessionContext | undefined | null, language: string, country: Country, namespace: string) {\n        this.$context = $context;\n        this.namespace = namespace;\n        this.language = language;\n        this.setCountryCode(country);\n        this.correctLocale();\n        // app.config.globalProperties.$country = this.country\n    }\n\n    private setCountryCode(country: Country) {\n        this.countryCode = countryToCode({ country, defaultCountryCode: this.defaultCountryCode });\n    }\n\n    static getI18n(): I18n {\n        if (this.i18n) {\n            return this.i18n;\n        }\n        const i18n = new I18n();\n        setGlobalTranslateFunction(i18n);\n        this.i18n = i18n;\n\n        if (import.meta.hot) {\n            import.meta.hot.data.i18n = this.i18n;\n        }\n        return this.i18n;\n    }\n\n    async switchToLocale(options: {\n        language?: string;\n        country?: Country;\n    }) {\n        if ((options.country ?? this.countryCode) == this.countryCode && (options.language ?? this.language) == this.language) {\n            return;\n        }\n        this.setCountryCode(options.country ?? this.countryCode);\n        this.language = options.language ?? this.language;\n        this.correctLocale();\n\n        // Update url's\n        this.updateUrl();\n\n        // Load locale\n        await this.loadLocale();\n\n        this.saveLocaleToStorage().catch(console.error);\n    }\n\n    transformUrlForLocale(url: string, language: string, country: string, addPrefix = true) {\n        const prefix = UrlHelper.fixedPrefix && addPrefix ? '/' + UrlHelper.fixedPrefix : '';\n        const locale = language + '-' + country;\n        if (I18nController.shared && I18nController.addUrlPrefix && (I18nController.skipUrlPrefixForLocale === undefined || I18nController.skipUrlPrefixForLocale !== locale)) {\n            if (I18nController.fixedCountry || STAMHOOFD.fixedCountry) {\n                return '/' + language + prefix + url;\n            }\n            else {\n                return '/' + language + '-' + country + prefix + url;\n            }\n        }\n        else {\n            return prefix + url;\n        }\n    }\n\n    updateUrl() {\n        if (I18nController.shared && I18nController.addUrlPrefix && (I18nController.skipUrlPrefixForLocale === undefined || I18nController.skipUrlPrefixForLocale !== I18nController.shared.locale)) {\n            if (I18nController.fixedCountry || STAMHOOFD.fixedCountry) {\n                UrlHelper.localePrefix = I18nController.shared.language;\n            }\n            else {\n                UrlHelper.localePrefix = I18nController.shared.locale;\n            }\n        }\n        else {\n            UrlHelper.localePrefix = '';\n        }\n        HistoryManager.updateUrl();\n    }\n\n    correctLocale() {\n        // Some locales are invalid\n        const validLocales: Record<string, undefined | string[]> = {\n            [Country.Belgium]: ['nl', 'en'],\n            [Country.Netherlands]: ['nl', 'en'],\n        };\n\n        if (!(this.countryCode in validLocales)) {\n            // Find first coutnry with same language\n            for (const country of countries) {\n                if (validLocales[country]?.includes(this.language)) {\n                    this.setCountryCode(country as Country);\n                    console.info('[I18n] Corrected country to ' + country);\n                    return;\n                }\n            }\n\n            // Fallback\n            this.setCountryCode(countries[0] as Country);\n            this.language = validLocales[this.countryCode]![0];\n            console.info('[I18n] Corrected country to ' + this.countryCode + ' and language to ' + this.language);\n            return;\n        }\n\n        if (!validLocales[this.countryCode]?.includes(this.language)) {\n            if (validLocales[this.countryCode]?.includes('en')) {\n                this.language = 'en';\n                console.info('[I18n] Corrected language to en');\n                return;\n            }\n\n            this.language = validLocales[this.countryCode]![0];\n            console.info('[I18n] Corrected language to ' + this.language);\n        }\n    }\n\n    async loadLocale() {\n        // app.config.globalProperties.$country = this.country\n\n        const locale = this.locale;\n        console.info('[I18n] Loading locale ' + locale);\n        // If the same language\n\n        const i18n = I18nController.getI18n();\n        const namespace = this.namespace;\n\n        if (!i18n.isLocaleLoaded(namespace, locale)) {\n            // If the language hasn't been loaded yet\n            const messages = await import(/* webpackChunkName: \"lang-[request]\" */ `../../../shared/locales/dist/${namespace}/${locale}.json`);\n            i18n.loadLocale(namespace, locale, messages.default);\n            console.log('[I18n] Successfully loaded locale', namespace, locale);\n        }\n\n        i18n.setLocale(locale, this.language, this.countryCode);\n    }\n\n    static async getLocaleFromStorage(): Promise<{ language?: string; country?: string }> {\n        const country = await Storage.keyValue.getItem('country');\n        const language = await Storage.keyValue.getItem('language');\n\n        return {\n            country: country && countries.includes(country) ? country : undefined,\n            language: language && languages.includes(language) ? language : undefined,\n        };\n    }\n\n    async saveLocaleToStorage() {\n        await Storage.keyValue.setItem('language', this.language);\n        await Storage.keyValue.setItem('country', this.countryCode);\n\n        console.info('[I18n] Saved locale to storage', this.locale);\n    }\n\n    static isValidLocale(locale: string) {\n        if (locale.length == 5 && locale.substr(2, 1) == '-') {\n            const l = locale.substr(0, 2).toLowerCase();\n            const c = locale.substr(3, 2).toUpperCase();\n\n            return languages.includes(l) && countries.includes(c);\n        }\n        return false;\n    }\n\n    static isValidLanguage(language: string) {\n        return languages.includes(language);\n    }\n\n    static isValidCountry(country: string): country is Country {\n        return countries.includes(country);\n    }\n\n    static async loadDefault($context: SessionContext | null | undefined, defaultCountry?: Country, defaultLanguage?: string, country?: Country) {\n        const namespace = STAMHOOFD.translationNamespace;\n        let language: string | undefined = undefined;\n        let needsSave = false;\n\n        // Check country if passed\n        if (country && !this.isValidCountry(country)) {\n            console.error('[I18n] Invalid forced country', country);\n            country = undefined;\n        }\n\n        // 1: check the URL. Does it start with a locale or not?\n        const parts = UrlHelper.initial.getParts({ removeLocale: false });\n        if (parts.length >= 1 && this.isValidLocale(parts[0])) {\n            const l = parts[0].substr(0, 2).toLowerCase();\n            const c = parts[0].substr(3, 2).toUpperCase();\n\n            if (!language) {\n                console.info('[I18n] Using language from url', l);\n                language = l;\n                needsSave = true;\n            }\n\n            if (!country && this.isValidCountry(c)) {\n                console.info('[I18n] Using country from url', c);\n                country = c;\n                needsSave = true;\n            }\n            else {\n                if (country !== c) {\n                    console.warn('[I18n] Ignored country from url', c);\n                }\n            }\n        }\n        else if (parts.length >= 1 && (this.fixedCountry || STAMHOOFD.fixedCountry) && parts[0].length == 2) {\n            const l = parts[0].substr(0, 2).toLowerCase();\n\n            if (!language && languages.includes(l)) {\n                console.info('[I18n] Using language from url', l);\n                language = l;\n                needsSave = true;\n            }\n        }\n\n        // 2. Get by storage\n        const isPrerender = navigator.userAgent.toLowerCase().indexOf('prerender') !== -1;\n\n        if (!isPrerender) {\n            // We never resolve the localstorage or browser language for crawlers, because that might mess up canonical urls\n\n            if (!language || !country) {\n                const storage = await I18nController.getLocaleFromStorage();\n\n                if (!language && storage.language) {\n                    console.info('Using stored language', storage.language);\n                    language = storage.language;\n                }\n\n                if (!country && storage.country && this.isValidCountry(storage.country)) {\n                    console.info('Using stored country', storage.country);\n                    country = storage.country;\n                }\n            }\n        }\n\n        // 3. Get country by TLD\n        if (!country && !defaultCountry) {\n            // try to get country from domain name\n            const splitted = window.location.hostname.split('.');\n            const tld = splitted[splitted.length - 1].toLowerCase();\n\n            switch (tld) {\n                case 'be': {\n                    country = Country.Belgium;\n                    break;\n                }\n                case 'nl': {\n                    country = Country.Netherlands;\n                    break;\n                }\n                case 'de': {\n                    country = Country.Germany;\n                    break;\n                }\n                case 'lu': {\n                    country = Country.Luxembourg;\n                    break;\n                }\n                case 'fr': {\n                    country = Country.France;\n                    break;\n                }\n                // We used .shop before, but were only active in Belgium\n                case 'shop': {\n                    country = Country.Belgium;\n                    break;\n                }\n            }\n\n            if (country) {\n                console.info('Using country from TLD', '.' + tld, country);\n            }\n        }\n\n        // 4. Use the browesr language and/or country\n        if (!isPrerender) {\n            if (!language && navigator.language && navigator.language.length >= 2) {\n                const l = navigator.language.substr(0, 2).toLowerCase();\n                if (languages.includes(l)) {\n                    language = l;\n                    console.info('[I18n] Using browser language', l);\n                }\n                else {\n                    console.warn('[I18n] Browser language ' + language + ' is not supported');\n                }\n            }\n\n            if (!country && navigator.language && navigator.language.length === 5) {\n                const c = navigator.language.substr(3, 2).toUpperCase();\n                if (this.isValidCountry(c)) {\n                    console.info('[I18n] Using browser country', c);\n                    country = c;\n                }\n                else {\n                    console.warn('[I18n] Browser country ' + c + ' is not supported');\n                }\n            }\n        }\n\n        // Default language\n        if (!language) {\n            if (!defaultLanguage) {\n                // try to get country from domain name\n                const splitted = window.location.hostname.split('.');\n                const tld = splitted[splitted.length - 1].toLowerCase();\n\n                switch (tld) {\n                    case 'be': {\n                        language = 'nl';\n                        break;\n                    }\n                    case 'nl': {\n                        language = 'nl';\n                        break;\n                    }\n                }\n\n                if (language) {\n                    console.info('[I18n] Using default language from TLD', '.' + tld, language);\n                }\n                else {\n                    console.info('[I18n] Using fallback language nl');\n                    language = 'nl';\n                }\n            }\n            else {\n                console.info('[I18n] Using default language', defaultLanguage);\n                language = defaultLanguage;\n            }\n        }\n\n        // Default country\n        if (!country) {\n            console.log('[I18n] Using default country', defaultCountry ?? Country.Belgium);\n            country = defaultCountry ?? Country.Belgium;\n        }\n\n        if (I18nController.shared) {\n            // Remove listeners\n            I18nController.shared.$context?.removeListener(I18nController.shared);\n        }\n\n        if (STAMHOOFD.fixedCountry) {\n            // Not allowed to change country locale\n            country = STAMHOOFD.fixedCountry;\n        }\n\n        const def = new I18nController($context, language, country, namespace);\n        def.defaultCountryCode = defaultCountry ? countryToCode({ country: defaultCountry, defaultCountryCode: def.defaultCountryCode }) : def.defaultCountryCode;\n        def.defaultLanguage = defaultLanguage ?? def.defaultLanguage;\n        I18nController.shared = def;\n        if (import.meta.hot) {\n            import.meta.hot.data.shared = def;\n        }\n\n        // Automatically set country when the organization is loaded\n        $context?.addListener(def, (changed) => {\n            if (!$context?.organization) {\n                return;\n            }\n            if (changed == 'organization') {\n                def.switchToLocale({ country: $context?.organization.address.country }).catch(console.error);\n            }\n        });\n\n        // Update already pushed urls\n        // this can't work: should remove locale first and then add it\n        // for (const state of HistoryManager.states) {\n        //    if (state.url) {\n        //        state.url = UrlHelper.transformUrlForLocale(state.url, def.language, def.country)\n        //    }\n        // }\n\n        // If we go back, we might need to update the path of previous urls if the language has changed since then\n        // window.addEventListener(\"popstate\", (event) => {\n        //     I18nController.shared?.updateUrl()\n        // })\n\n        if (needsSave) {\n            def.saveLocaleToStorage().catch(console.error);\n        }\n\n        // Update meta data\n        def.updateMetaData();\n        def.updateUrl();\n\n        await def.loadLocale();\n    }\n\n    static getDomain(localizedDomain: LocalizedDomain) {\n        const country = I18nController.shared.countryCode;\n        return localizedDomain[country] ?? localizedDomain[''];\n    }\n\n    // Used to make metaInfo responsive\n    currentUrl: UrlHelper = UrlHelper.initial;\n\n    updateMetaData() {\n        // Sadly, setting meta tags forces a layout step in the browser\n        // This causes dropped frames during animations and makes the app feels unresponsive\n        // This is mainly noticeable on older devices\n        // this.vueMetaApp?.set(this.metaInfo)\n    }\n\n    /**\n     * @todo\n     * This builds metadata info only for vue-meta, which is no longer maintained\n     */\n    get metaInfo(): any {\n        const listCountries = I18nController.fixedCountry ? [this.countryCode] : countries;\n        const url = new UrlHelper();\n        const path = url.getPath();\n        const hostProtocol = url.getHostWithProtocol();\n        const addPrefix = true;\n\n        const links: any['link'] = [];\n        const meta: any['meta'] = [];\n\n        // Add og:locale tag\n        meta.push({\n            hid: 'i18n-og',\n            property: 'og:locale',\n            // Replace dash with underscore as defined in spec: language_TERRITORY\n            content: this.language + '_' + this.countryCode,\n        });\n\n        // Alternate locations\n        for (const country of listCountries) {\n            for (const language of languages) {\n                const locale = language + '-' + country;\n                links.push({\n                    hid: `i18n-alt-${locale}`,\n                    rel: 'alternate',\n                    href: hostProtocol + this.transformUrlForLocale(path, language, country, addPrefix),\n                    hreflang: locale,\n                });\n\n                // Add og:locale:alternate\n                if (language !== this.language || country != this.countryCode) {\n                    // Only list if not the same as current\n                    meta.push({\n                        hid: `i18n-og-alt-${locale}`,\n                        property: 'og:locale:alternate',\n                        content: language + '_' + country,\n                    });\n                }\n            }\n        }\n\n        // Add default locale\n        if (this.defaultCountryCode && this.defaultLanguage) {\n            links.push({\n                hid: `i18n-alt-default`,\n                rel: 'alternate',\n                href: hostProtocol + this.transformUrlForLocale(path, this.defaultLanguage, this.defaultCountryCode, addPrefix),\n                hreflang: 'x-default',\n            });\n        }\n\n        // Add canonical url\n        // For now, we keep all query parameters\n        links.push({\n            hid: 'i18n-can',\n            rel: 'canonical',\n            href: hostProtocol + this.transformUrlForLocale(path, this.language, this.countryCode, addPrefix),\n        });\n\n        // If we are in prerender mode, we also want to redirect the crawler if needed\n        /*\n         <meta name=\"prerender-status-code\" content=\"302\">\n         <meta name=\"prerender-header\" content=\"Location: https://www.google.com\">\n        */\n\n        const isPrerender = navigator.userAgent.toLowerCase().indexOf('prerender') !== -1;\n\n        if (isPrerender) {\n            const currentPath = this.transformUrlForLocale(path, this.language, this.countryCode);\n\n            let redirected = false;\n            if (currentPath !== UrlHelper.initial.path) {\n                redirected = true;\n            }\n            meta.push({\n                hid: `prerender-status-code`,\n                name: 'prerender-status-code',\n                content: redirected ? '302' : '200',\n            });\n\n            if (redirected) {\n            // Don't use canonical host (for now)\n                meta.push({\n                    hid: `prerender-header`,\n                    name: 'prerender-header',\n                    content: 'Location: ' + url.getHostWithProtocol() + currentPath,\n                });\n            }\n        }\n\n        return {\n            htmlAttrs: {\n                lang: this.locale,\n            },\n            link: links,\n            meta,\n        };\n    }\n}\n","import { I18nController } from '.';\n\nexport class LocalizedDomains {\n    static getDomain(localizedDomain: LocalizedDomain) {\n        return I18nController.getDomain(localizedDomain);\n    }\n\n    static get adminUrl() {\n        return 'https://' + STAMHOOFD.domains.dashboard + '/administratie';\n    }\n\n    static get dashboard() {\n        return STAMHOOFD.domains.dashboard;\n    }\n\n    static get marketing() {\n        return this.getDomain(STAMHOOFD.domains.marketing);\n    }\n\n    static get documentation() {\n        return this.getDomain(STAMHOOFD.domains.documentation ?? STAMHOOFD.domains.marketing);\n    }\n\n    static getDocs(path: string) {\n        return 'https://' + this.documentation + '/' + path + '/';\n    }\n}\n","import { SimpleErrors } from '@simonbackx/simple-errors';\nimport { Request, RequestMiddleware, Server } from '@simonbackx/simple-networking';\nimport { Toast } from '@stamhoofd/components';\nimport { I18nController } from '@stamhoofd/frontend-i18n';\nimport { Version } from '@stamhoofd/structures';\n\nimport { AppManager } from './AppManager';\nimport { UrlHelper } from './UrlHelper';\n\nexport function sleep(ms: number) {\n    return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nexport class NetworkManagerStatic implements RequestMiddleware {\n    networkErrorToast: Toast | null = null\n    platformLatestVersion: number | null = null\n\n    /**\n     * Total request with a network error that are being retried\n     */\n    retryingRequestsCount = 0\n\n    /**\n     * Normal, non authenticated requests\n     */\n    get server() {\n        const server = new Server(\"https://\"+STAMHOOFD.domains.api)\n        server.middlewares.push(this)\n\n        // Set the version in which we decode the responses\n        server.setVersionHeaders(['X-Version'])\n        return server\n    }\n\n    /**\n     * Normal, non authenticated requests\n     */\n    get rendererServer() {\n        const server = new Server(\"https://\"+STAMHOOFD.domains.rendererApi)\n        server.middlewares.push(this)\n\n        // Set the version in which we decode the responses\n        server.setVersionHeaders(['X-Version'])\n        return server\n    }\n\n    onBeforeRequest(request: Request<any>): Promise<void> {\n        request.version = Version;\n        (request as any).retryCount = ((request as any).retryCount ?? 0) + 1\n\n        request.headers[\"X-Platform\"] = AppManager.shared.platform\n\n        if (I18nController.shared) {\n            request.headers[\"X-Locale\"] = I18nController.shared.locale\n        }\n        return Promise.resolve()\n    }\n\n    /**\n     * Wait 10 seconds or shorter if the network becomes online in those 10 seconds\n     */\n    networkOnlinePromise(timeout = 10000): Promise<void> {\n        return new Promise((resolve) => {\n            let resolved = false\n            const listener = function() { \n                if (resolved) {\n                    return\n                }\n                resolved = true\n\n                // Self reference to always remote the listener\n                window.removeEventListener('online', listener)\n                resolve()\n            }\n            window.addEventListener('online', listener)\n            setTimeout(listener, timeout)\n        })\n    }\n\n    async shouldRetryNetworkError(request: Request<any>, error: Error): Promise<boolean> {\n        console.error(\"network error\", error)\n        if (!(request as any).isRetrying) {\n            (request as any).isRetrying = true\n            this.retryingRequestsCount++\n        }\n\n        if ((request as any).retryCount > 1 && !this.networkErrorToast) {\n            // Only on second try\n            this.networkErrorToast = new Toast(\"Bezig met verbinden met internet...\", \"spinner\").setHide(null).show()\n        }\n\n        if (navigator.onLine) {\n            // Normal timeout behaviour: browser probably doesn't know about network issues, so we need to 'poll'\n            await sleep(Math.min(((request as any).retryCount ?? 0) * 1000, 10 * 1000));\n            return Promise.resolve(true);\n        } else {\n            // Wait for network or 10 seconds (the fastest one)\n            await this.networkOnlinePromise(10000)\n            return Promise.resolve(true);\n        }\n    }\n\n    async shouldRetryServerError(request: Request<any>, response: XMLHttpRequest, error: Error): Promise<boolean> {\n        console.error(\"server error\", error)\n        console.error(error)\n        console.error(response)\n        return Promise.resolve(false);\n    }\n\n    async shouldRetryError(request: Request<any>, response: XMLHttpRequest, error: SimpleErrors): Promise<boolean> {\n        console.error(\"response error\")\n        console.error(error)\n\n        try {\n            if (error.hasCode(\"client_update_required\")) {\n                Toast.fromError(error).show()\n\n                if (!AppManager.shared.isNative && !UrlHelper.initial.getSearchParams().has(\"forceClientUpdate\")) {\n                    const url = new URL(window.location.href);\n                    url.searchParams.set(\"forceClientUpdate\", new Date().getTime()+\"\")\n                    window.location.href = url.toString()\n                } else {\n                    AppManager.shared.checkUpdates({\n                        visibleCheck: 'text',\n                        visibleDownload: true,\n                        installAutomatically: true\n                    }).catch(console.error)\n                }\n            }\n        } catch (e) {\n            console.error(e)\n        }\n\n        return Promise.resolve(false);\n    }\n\n    onFatalNetworkError(request: Request<any>, error: Error) {\n        if ((request as any).isRetrying) {\n            (request as any).isRetrying = false\n            this.retryingRequestsCount--\n        }\n\n        if (this.networkErrorToast && this.retryingRequestsCount == 0) {\n            this.networkErrorToast.hide()\n            this.networkErrorToast = null;\n        }\n    }\n\n    onNetworkResponse(request: Request<any>, response: XMLHttpRequest) {\n        if ((request as any).isRetrying) {\n            (request as any).isRetrying = false\n            this.retryingRequestsCount--\n        }\n\n        if (this.networkErrorToast && this.retryingRequestsCount == 0) {\n            this.networkErrorToast.hide()\n            this.networkErrorToast = null;\n        }\n\n        // Check headers\n        const str = response.getResponseHeader(\"X-Platform-Latest-Version\")\n        if (str) {\n            const latestVersion = parseInt(str);\n            if (!this.platformLatestVersion || this.platformLatestVersion < latestVersion) {\n                console.log(\"Latest platform version is \"+latestVersion)\n                this.platformLatestVersion = latestVersion\n\n                if (this.platformLatestVersion > Version) {\n                    if (AppManager.shared.isNative) {\n                        new Toast(\"Er is een update beschikbaar. Update de app om te vermijden dat bepaalde zaken stoppen met werken. Tip: houd automatische updates ingeschakeld.\", \"yellow download\").setHide(null).show()\n                        AppManager.shared.checkUpdates({\n                            checkTimeout: 20 * 1000\n                        }).catch(console.error)\n                    } else {\n                        console.info('Received latest version: ', latestVersion, 'got', Version)\n                        new Toast(\"Er is een update beschikbaar. Herlaad de pagina zodra het kan om te vermijden dat bepaalde zaken stoppen met werken.\", \"yellow download\").setHide(null).show()\n                    }\n                }\n            }  \n        }\n    }\n}\n\nexport const NetworkManager = new NetworkManagerStatic()\n","import { AccessRight, Event, EventPermissionChecker, Group, GroupCategory, GroupType, LoadedPermissions, Organization, OrganizationForPermissionCalculation, OrganizationTag, PaymentGeneral, PermissionLevel, Permissions, PermissionsResourceType, Platform, PlatformMember, Registration, UserWithMembers } from '@stamhoofd/structures';\nimport { Ref, toRaw, unref } from 'vue';\n\nexport class ContextPermissions {\n    reactiveUser: UserWithMembers | null | Ref<UserWithMembers | null>;\n    reactiveOrganization: Organization | null | Ref<Organization | null>;\n    reactivePlatform: Platform | Ref<Platform>;\n\n    /**\n     * Whether to allow inheriting platoform permissions\n     * (mosty disabled when editing permissions)\n     */\n    allowInheritingPermissions = true;\n\n    constructor(\n        user: UserWithMembers | null | undefined | Ref<UserWithMembers | null>,\n        organization: Organization | null | undefined | Ref<Organization | null>,\n        platform: Platform | Ref<Platform>,\n        options?: { allowInheritingPermissions?: boolean },\n    ) {\n        this.reactiveUser = user ?? null;\n        this.reactiveOrganization = organization ?? null;\n        this.reactivePlatform = platform;\n        if (options?.allowInheritingPermissions !== undefined) {\n            this.allowInheritingPermissions = options.allowInheritingPermissions;\n        }\n    }\n\n    get user() {\n        return unref(this.reactiveUser);\n    }\n\n    get userPermissions() {\n        return this.user?.permissions ?? null;\n    }\n\n    get organization() {\n        // We mark organization as raw, because the permission calculation is too expensive to run on every change of an organization\n        // to reload permissions, a user needs to reload the page or app\n        return toRaw(unref(this.reactiveOrganization));\n    }\n\n    get platform() {\n        // We mark platform as raw, because the permission calculation is too expensive to run on every change of the platform\n        // to reload permissions, a user needs to reload the page or app\n        return toRaw(unref(this.reactivePlatform));\n    }\n\n    _cachedPlatformPermissions: LoadedPermissions | null = null;\n    get platformPermissions() {\n        if (this._cachedPlatformPermissions) {\n            return this._cachedPlatformPermissions;\n        }\n\n        const c = this._platformPermissions;\n        this._cachedPlatformPermissions = c;\n        return c;\n    }\n\n    get _platformPermissions() {\n        return unref(this.userPermissions)?.forPlatform(this.platform) ?? null;\n    }\n\n    _cachedPermissions: LoadedPermissions | null = null;\n    get permissions() {\n        if (this._cachedPermissions) {\n            return this._cachedPermissions;\n        }\n\n        const c = this._permissions;\n        this._cachedPermissions = c;\n        return c;\n    }\n\n    get _permissions() {\n        if (!this.organization) {\n            return this.platformPermissions;\n        }\n        return unref(this.userPermissions)?.forOrganization(this.organization, this.allowInheritingPermissions ? Platform.shared : null) ?? null;\n    }\n\n    getPermissionsForOrganization(organization: OrganizationForPermissionCalculation) {\n        return unref(this.userPermissions)?.forOrganization(organization, this.allowInheritingPermissions ? Platform.shared : null) ?? null;\n    }\n\n    get unloadedPermissions(): Permissions | null {\n        if (!this.organization) {\n            return unref(this.userPermissions)?.globalPermissions ?? null;\n        }\n        return unref(this.userPermissions)?.organizationPermissions.get(this.organization.id) ?? null;\n    }\n\n    hasFullAccess() {\n        return this.permissions?.hasFullAccess() ?? false;\n    }\n\n    /**\n     * @deprecated\n     * Use hasPlatformFullAccess instead\n     */\n    hasFullPlatformAccess() {\n        return this.platformPermissions?.hasFullAccess() ?? false;\n    }\n\n    hasAccessRight(right: AccessRight) {\n        return this.permissions?.hasAccessRight(right) ?? false;\n    }\n\n    hasResourceAccessRight(resourceType: PermissionsResourceType, resourceId: string, right: AccessRight) {\n        return this.permissions?.hasResourceAccessRight(resourceType, resourceId, right) ?? false;\n    }\n\n    hasAccessRightForSomeResourceOfType(resourceType: PermissionsResourceType, right: AccessRight) {\n        return this.permissions?.hasAccessRightForSomeResourceOfType(resourceType, right) ?? false;\n    }\n\n    canManagePayments() {\n        return this.hasAccessRight(AccessRight.OrganizationManagePayments) || this.hasAccessRight(AccessRight.OrganizationFinanceDirector);\n    }\n\n    canAccessGroup(group: Group, permissionLevel: PermissionLevel = PermissionLevel.Read) {\n        if (!this.organization || group.organizationId !== this.organization.id) {\n            return this.hasFullPlatformAccess();\n        }\n\n        if (group.hasAccess(this.permissions, this.organization.period.settings.categories, permissionLevel)) {\n            return true;\n        }\n\n        if (group.type === GroupType.EventRegistration && group.event && group.event.organizationId === this.organization.id) {\n            // we'll need to check the event permissions\n            return this.canWriteEventForOrganization(group.event, this.organization);\n        }\n\n        return false;\n    }\n\n    canRegisterMembersInGroup(group: Group) {\n        if (this.canAccessGroup(group, PermissionLevel.Write)) {\n            return true;\n        }\n        if (this.organization) {\n            if (group.settings.allowRegistrationsByOrganization && !group.closed) {\n                return this.hasFullAccess();\n            }\n        }\n        return false;\n    }\n\n    canCreateGroupInCategory(category: GroupCategory) {\n        if (!this.organization) {\n            return this.hasFullPlatformAccess();\n        }\n\n        return category.canCreate(this.permissions, this.organization.period.settings.categories);\n    }\n\n    canAccessRegistration(registration: Registration, organization: Organization, permissionLevel: PermissionLevel = PermissionLevel.Read) {\n        if (registration.group.hasAccess(this.getPermissionsForOrganization(organization), organization.period.settings.categories, permissionLevel)) {\n            return true;\n        }\n        return false;\n    }\n\n    canAccessPlatformMember(member: PlatformMember, permissionLevel: PermissionLevel = PermissionLevel.Read) {\n        if (this.hasFullPlatformAccess()) {\n            return true;\n        }\n\n        if (this.user && 'members' in this.user && this.user.members.members.some(m => m.id === member.id)) {\n            return true;\n        }\n\n        if (this.getPlatformAccessibleOrganizationTags(permissionLevel) === 'all') {\n            // Can access all members: even members without any registration\n            return true;\n        }\n\n        for (const registration of member.filterRegistrations({ currentPeriod: true })) {\n            const organization = member.family.getOrganization(registration.organizationId);\n            if (organization) {\n                if (this.canAccessRegistration(registration, organization, permissionLevel)) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n\n    canAccessPayment(payment: PaymentGeneral | null | undefined, level: PermissionLevel) {\n        if (!payment) {\n            return false;\n        }\n\n        if (this.organization && payment.organizationId !== this.organization.id) {\n            return false;\n        }\n\n        if (this.canManagePayments() || this.hasFullAccess()) {\n            return true;\n        }\n\n        if (this.organization) {\n            for (const webshopId of payment.webshopIds) {\n                const webshop = this.organization.webshops.find(w => w.id === webshopId);\n                if (webshop && webshop.privateMeta.permissions.hasAccess(this.permissions, level)) {\n                    return true;\n                }\n            }\n\n            for (const groupId of payment.groupIds) {\n                const group = this.organization.groups.find(w => w.id === groupId);\n\n                if (group && group.privateSettings?.permissions.hasAccess(this.permissions, level)) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n\n    canAccessMemberPayments(member: PlatformMember, level: PermissionLevel) {\n        if (this.canManagePayments()) {\n            return true;\n        }\n\n        if (this.canAccessPlatformMember(member, level)) {\n            return true;\n        }\n\n        return false;\n    }\n\n    canAccessWebshop(webshop: { id: string }, permissionLevel: PermissionLevel = PermissionLevel.Read, autoIncludeScanTickets = true) {\n        if (!this.permissions) {\n            return false;\n        }\n\n        if (this.permissions.hasResourceAccess(PermissionsResourceType.Webshops, webshop.id, permissionLevel)) {\n            return true;\n        }\n\n        if (autoIncludeScanTickets && permissionLevel === PermissionLevel.Read && this.permissions.hasResourceAccessRight(PermissionsResourceType.Webshops, webshop.id, AccessRight.WebshopScanTickets)) {\n            return true;\n        }\n\n        return false;\n    }\n\n    canAccessWebshopTickets(webshop: { id: string }, permissionLevel: PermissionLevel = PermissionLevel.Read) {\n        if (!this.permissions) {\n            return false;\n        }\n\n        if (this.permissions.hasResourceAccess(PermissionsResourceType.Webshops, webshop.id, permissionLevel)) {\n            return true;\n        }\n\n        if ((permissionLevel === PermissionLevel.Read || permissionLevel === PermissionLevel.Write) && this.permissions.hasResourceAccessRight(PermissionsResourceType.Webshops, webshop.id, AccessRight.WebshopScanTickets)) {\n            return true;\n        }\n\n        return false;\n    }\n\n    hasSomePlatformAccess(): boolean {\n        return !!this.platformPermissions;\n    }\n\n    hasPlatformFullAccess(): boolean {\n        return !!this.platformPermissions && !!this.platformPermissions.hasFullAccess();\n    }\n\n    getPlatformAccessibleOrganizationTags(level: PermissionLevel): OrganizationTag[] | 'all' {\n        if (!this.hasSomePlatformAccess()) {\n            return [];\n        }\n\n        if (this.hasPlatformFullAccess()) {\n            return 'all';\n        }\n\n        if (this.platformPermissions?.hasResourceAccess(PermissionsResourceType.OrganizationTags, '', level)) {\n            return 'all';\n        }\n\n        const allTags = this.platform.config.tags;\n        const tags: OrganizationTag[] = [];\n\n        for (const tag of allTags) {\n            if (this.platformPermissions?.hasResourceAccess(PermissionsResourceType.OrganizationTags, tag.id, level)) {\n                tags.push(tag);\n            }\n        }\n\n        if (tags.length === allTags.length) {\n            return 'all';\n        }\n\n        return tags;\n    }\n\n    canWriteEventForCurrentOrganization(event: Event) {\n        return this.canWriteEventForOrganization(event, this.organization);\n    }\n\n    canWriteEventForOrganization(event: Event, organization: Organization | null) {\n        return EventPermissionChecker.hasPermissionToWriteEvent(\n            event,\n            {\n                userPermissions: this.userPermissions,\n                platform: this.platform,\n                organization,\n            });\n    }\n}\n","import { Request, Server } from '@simonbackx/simple-networking';\nimport { Token } from '@stamhoofd/structures';\n\nimport { NetworkManager } from './NetworkManager';\n\n/**\n * A token that can get saved and refreshed\n */\nexport class ManagedToken {\n    token: Token;\n    private refreshPromise?: Promise<void>;\n    onChange: () => Promise<void>|void\n\n    constructor(token: Token, onChange: () => Promise<void>|void) {\n        this.token = token;\n        this.onChange = onChange\n    }\n\n    /**\n     * Refresh the token itself, without generating a new token. Everyone who had the token has a new token now\n     */\n    private async doRefresh(server: Server): Promise<void> {\n        const result = await server.request({\n            method: \"POST\",\n            path: \"/oauth/token\",\n            body: {\n                grant_type: \"refresh_token\",\n                refresh_token: this.token.refreshToken\n            },\n            decoder: Token,\n            shouldRetry: false\n        })\n\n        this.token = result.data\n        await this.onChange()\n    }\n\n    needsRefresh(): boolean {\n        return this.token.needsRefresh()\n    }\n\n    isRefreshing(): boolean {\n        return this.refreshPromise !== undefined\n    }\n\n    /**\n     * Refreshes the token and sets a new acces token. Throws on failure.\n     * Multiple calls only do one refresh at a time and resolve simultaneously\n     */\n    async refresh(server: Server, shouldRetry?: () => boolean): Promise<void> {\n        try {\n            if (this.refreshPromise) {\n                return this.refreshPromise\n            }\n\n            try {\n                this.refreshPromise = this.doRefresh(server)\n                await this.refreshPromise\n            } finally {\n                this.refreshPromise = undefined\n            }\n        } catch (e) {\n            if (shouldRetry && Request.isNetworkError(e)) {\n                const should = shouldRetry()\n                if (!should) {\n                    throw e;\n                }\n                console.log(\"Retry token refresh due to network error\")\n                await NetworkManager.networkOnlinePromise(7000)\n\n                // Check again, the value could have changed\n                const should2 = shouldRetry()\n                if (!should2) {\n                    throw e;\n                }\n                return await this.refresh(server, shouldRetry)\n            }\n            throw e;\n        }\n    }\n}\n","export interface KeyValueContainer {\n    setItem(key: string, value: string): Promise<void>\n    getItem(key: string): Promise<string | null>\n    removeItem(key: string): Promise<void>\n}\n\nexport class LocalStorage implements KeyValueContainer {\n    setItem(key: string, value: string) {\n        localStorage.setItem(key, value)\n        return Promise.resolve()\n    }\n\n    getItem(key: string) {\n        return Promise.resolve(localStorage.getItem(key))\n    }\n\n    removeItem(key: string) {\n        return Promise.resolve(localStorage.removeItem(key))\n    }\n}\n\n/**\n * Allow to explicitly override storage container depending on environment\n */\nexport class Storage {\n    /**\n     * For general data that could be lost\n     */\n    static keyValue: KeyValueContainer = new LocalStorage()\n    \n    /**\n     * Use for access tokens and keys\n     */\n    static secure: KeyValueContainer = new LocalStorage()\n\n    /**\n     * Use for lots of keys\n     */\n    static keychain: KeyValueContainer = new LocalStorage()\n\n    // TODO: database storage here for caching data and keeping it available offline\n}","import { Decoder, ObjectData, VersionBox, VersionBoxDecoder } from '@simonbackx/simple-encoding';\nimport { isSimpleError, isSimpleErrors, SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\nimport { Request, RequestMiddleware } from '@simonbackx/simple-networking';\nimport { Toast } from '@stamhoofd/components';\nimport { LoginProviderType, OpenIDAuthTokenResponse, Organization, Platform, Token, UserWithMembers, Version } from '@stamhoofd/structures';\nimport { isReactive, reactive } from 'vue';\n\nimport { SessionManager, UrlHelper } from '..';\nimport { ContextPermissions } from './ContextPermissions';\nimport { ManagedToken } from './ManagedToken';\nimport { NetworkManager } from './NetworkManager';\nimport { Storage } from './Storage';\n\ntype AuthenticationStateListener = (changed: 'user' | 'organization' | 'token' | 'preventComplete') => void;\n\n// dec2hex :: Integer -> String\n// i.e. 0-255 -> '00'-'ff'\nfunction dec2hex(dec) {\n    return dec.toString(16).padStart(2, '0');\n}\n\n// generateId :: Integer -> String\nfunction generateId(len) {\n    const arr = new Uint8Array((len || 40) / 2);\n    window.crypto.getRandomValues(arr);\n    return Array.from(arr, dec2hex).join('');\n}\n\nexport class SessionContext implements RequestMiddleware {\n    /**\n     * This will become optional in the future\n     */\n    organization: Organization | null = null;\n    user: UserWithMembers | null = null;\n    loadingError: Error | null = null;\n\n    /**\n     * Manually mark the session as incomplete by setting this to true\n     * Not using #private syntax because that messes with Vue proxies\n    */\n    _preventComplete = false;\n\n    protected token: ManagedToken | null = null;\n    protected usedPlatformStorage = false;\n\n    // Stored: encryption key to obtain the private keys (valid token needed in order to have any meaning => revokable in case of leakage, lost device, theft)\n    // Storage is required since otherwise you would have to enter your password again every time you reload the page\n    // protected authEncryptionKey: string | null = null\n\n    // We can store the private key in the browser, because on password change it will get changed\n    // protected userPrivateKey: string | null = null // Used to decrypt messages for this user\n\n    protected listeners: Map<any, AuthenticationStateListener> = new Map();\n\n    isStorageDisabled = false;\n\n    constructor(organization: Organization | null) {\n        this.organization = organization;\n        this.usedPlatformStorage = this.organization === null;\n\n        // Reactive hack: always force creating reactive SessionContext\n        return reactive(this) as unknown as SessionContext;\n    }\n\n    disableStorage() {\n        this.isStorageDisabled = true;\n    }\n\n    enableStorage() {\n        this.isStorageDisabled = false;\n        this.saveToStorage().catch(console.error);\n    }\n\n    /**\n     * @deprecated\n     */\n    get organizationId() {\n        return this.organization?.id ?? null;\n    }\n\n    /**\n     * @deprecated\n     * Use auth.permissions\n     */\n    get organizationPermissions() {\n        if (!this.organization) {\n            return null;\n        }\n        return this.user?.permissions?.forOrganization(this.organization, Platform.shared) ?? null;\n    }\n\n    /**\n     * @deprecated\n     * Use auth\n     */\n    get organizationAuth() {\n        return this.auth;\n    }\n\n    _auth: ContextPermissions | null = null;\n    get auth() {\n        if (!this._auth) {\n            this._auth = new ContextPermissions(this.user, this.organization, Platform.shared);\n        }\n        return this._auth;\n    }\n\n    clearAuthCache() {\n        this._auth = null;\n    }\n\n    static async createFrom(data: ({ organization: Organization } | { organizationId: string })) {\n        let organization: Organization;\n        if ('organizationId' in data) {\n            // If we have the token, we better do an authenticated request\n            const response = await SessionContext.serverForOrganization(data.organizationId).request({\n                method: 'GET',\n                path: '/organization',\n                decoder: Organization as Decoder<Organization>,\n                shouldRetry: false,\n            });\n            organization = response.data;\n        }\n        else {\n            organization = data.organization;\n        }\n\n        return new SessionContext(organization);\n    }\n\n    get preventComplete() {\n        return this._preventComplete;\n    }\n\n    set preventComplete(preventComplete: boolean) {\n        this._preventComplete = preventComplete;\n        this.callListeners('preventComplete');\n    }\n\n    async loadTokenFromStorage() {\n        if (this.isStorageDisabled) {\n            return;\n        }\n\n        console.log('[SessionContext] Loading Token from Storage');\n\n        // Check localstorage\n        try {\n            let usePlatformStorage = !this.organization || STAMHOOFD.userMode === 'platform';\n            const json = await Storage.secure.getItem('token-' + (!usePlatformStorage ? this.organization!.id : 'platform'));\n            if (json) {\n                try {\n                    const parsed = JSON.parse(json);\n                    const token = Token.decode(new ObjectData(parsed, { version: Version }));\n                    this.setTokenWithoutSaving(token, usePlatformStorage);\n                    return;\n                }\n                catch (e) {\n                    console.error(e);\n                }\n            }\n\n            if (!usePlatformStorage) {\n                usePlatformStorage = true;\n                // Also try platform token\n                const json2 = await Storage.secure.getItem('token-' + 'platform');\n                if (json2) {\n                    try {\n                        const parsed = JSON.parse(json2);\n                        const token = Token.decode(new ObjectData(parsed, { version: Version }));\n                        this.setTokenWithoutSaving(token, usePlatformStorage);\n                    }\n                    catch (e) {\n                        console.error(e);\n                    }\n                }\n            }\n        }\n        catch (e) {\n            console.error('Localstorage error');\n            console.error(e);\n        }\n    }\n\n    async loadFromStorage() {\n        if (this.isStorageDisabled) {\n            return;\n        }\n\n        // Check localstorage\n        try {\n            await this.loadTokenFromStorage();\n\n            if (this.token) {\n                // Also check if we have the user (optional)\n                const json = await Storage.secure.getItem('user-' + (!this.usedPlatformStorage ? this.organization!.id : 'platform'));\n                if (json) {\n                    try {\n                        const parsed = JSON.parse(json);\n                        this.user = new ObjectData(parsed, { version: 0 }).decode(new VersionBoxDecoder(UserWithMembers as Decoder<UserWithMembers>) as Decoder<VersionBox<UserWithMembers>>).data;\n                        this.callListeners('user');\n                        return;\n                    }\n                    catch (e) {\n                        console.error(e);\n                    }\n                }\n            }\n        }\n        catch (e) {\n            console.error('Localstorage error');\n            console.error(e);\n        }\n    }\n\n    async saveToStorage() {\n        if (this.isStorageDisabled) {\n            return;\n        }\n\n        try {\n            // Save token to localStorage\n            if (this.token) {\n                const suffix = (this.user\n                    ? (this.user.organizationId ? this.user.organizationId : 'platform')\n                    : (\n                            this.usedPlatformStorage ? 'platform' : (this.organization!.id)\n                        ));\n\n                if (suffix == 'platform' && this.organization) {\n                    await Storage.secure.removeItem('token-' + this.organization.id);\n                    await Storage.secure.removeItem('user-' + this.organization.id);\n                }\n\n                if (suffix !== 'platform') {\n                    await Storage.secure.removeItem('token-platform');\n                    await Storage.secure.removeItem('user-platform');\n                }\n\n                await Storage.secure.setItem('token-' + suffix, JSON.stringify(this.token.token.encode({ version: Version })));\n\n                if (this.user) {\n                    await Storage.secure.setItem('user-' + suffix, JSON.stringify(new VersionBox(this.user).encode({ version: Version })));\n                }\n                else {\n                    await Storage.secure.removeItem('user-' + suffix);\n                }\n\n                console.log('[SessionContext] Saved token to storage, suffix: ' + suffix);\n            }\n        }\n        catch (e) {\n            console.error('Storage error when saving session');\n            console.error(e);\n        }\n    }\n\n    deleteFromStorage() {\n        if (this.isStorageDisabled) {\n            return;\n        }\n\n        try {\n            if (this.organization) {\n                void Storage.secure.removeItem('token-' + this.organization.id);\n                void Storage.secure.removeItem('user-' + this.organization.id);\n            }\n            if (this.usedPlatformStorage || STAMHOOFD.userMode === 'platform') {\n                void Storage.secure.removeItem('token-platform');\n                void Storage.secure.removeItem('user-platform');\n            }\n        }\n        catch (e) {\n            console.error('Storage error when saving session');\n            console.error(e);\n        }\n\n        console.log('Deleted token to storage');\n    }\n\n    removeFromStorage() {\n        if (this.isStorageDisabled) {\n            return;\n        }\n        try {\n            void Storage.secure.removeItem('token-' + this.organizationId);\n            void Storage.secure.removeItem('user-' + this.organizationId);\n\n            // Deprecated: but best to delete it for now\n            void Storage.secure.removeItem('key-' + this.organizationId);\n        }\n        catch (e) {\n            console.error('Storage error when deleting session');\n            console.error(e);\n        }\n\n        console.log('Deleted token to storage');\n    }\n\n    async checkSSO() {\n        const search = UrlHelper.initial.getSearchParams();\n        const oid_rt = search.get('oid_rt');\n        const state = search.get('s');\n        const error = search.get('error');\n        const msg = search.get('msg');\n\n        console.log('Checking SSO', oid_rt, state, error);\n\n        if (oid_rt && state) {\n            // Delete initial url\n            search.delete('oid_rt');\n            search.delete('s');\n\n            // Check valid state\n            try {\n                const savedState = await Storage.secure.getItem('oid-state');\n                if (savedState !== state) {\n                    console.warn('SSO state didn\\'t match');\n\n                    if (!this.canGetCompleted()) {\n                        new Toast('Er is een fout opgetreden bij het inloggen. Probeer het opnieuw.', 'error red').setHide(20000).show();\n                    }\n                    return;\n                }\n                Storage.secure.removeItem('oid-state').catch(console.error);\n            }\n            catch (e) {\n                console.error(e);\n\n                if (!this.canGetCompleted()) {\n                    new Toast('Er is een fout opgetreden bij het inloggen. Probeer het opnieuw.', 'error red').setHide(20000).show();\n                }\n                return;\n            }\n\n            await this.setToken(new Token({\n                accessToken: '',\n                refreshToken: oid_rt,\n                accessTokenValidUntil: new Date(0),\n            }));\n\n            try {\n                // We successfull logged in, so clear the tried login - will make sure we'll log in automatically next time\n                sessionStorage.removeItem('triedLogin');\n            }\n            catch (e) {\n                console.error(e);\n            }\n        }\n\n        if (state && error) {\n            search.delete('error');\n            search.delete('s');\n\n            // Check valid state\n            try {\n                const savedState = await Storage.secure.getItem('oid-state');\n                if (savedState !== state) {\n                    console.warn('SSO state didn\\'t match');\n\n                    if (!this.canGetCompleted()) {\n                        new Toast('Er is een fout opgetreden bij het inloggen. Probeer het opnieuw.', 'error red').setHide(20000).show();\n                    }\n                    return;\n                }\n                Storage.secure.removeItem('oid-state').catch(console.error);\n            }\n            catch (e) {\n                console.error(e);\n                if (!this.canGetCompleted()) {\n                    new Toast('Er is een fout opgetreden bij het inloggen. Probeer het opnieuw.', 'error red').setHide(20000).show();\n                }\n                return;\n            }\n\n            new Toast(error, 'error red').setHide(20000).show();\n        }\n        else {\n            if (error) {\n                search.delete('error');\n\n                // Message not authorized\n                new Toast('Er is een fout opgetreden bij het inloggen. Probeer het opnieuw.', 'error red').setHide(20000).show();\n            }\n        }\n\n        if (state && msg) {\n            search.delete('msg');\n            search.delete('s');\n\n            // Check valid state\n            try {\n                const savedState = await Storage.secure.getItem('oid-state');\n                if (savedState !== state) {\n                    console.warn('SSO state didn\\'t match');\n                    // Don't show msg\n                    return;\n                }\n                Toast.success(msg).show();\n                Storage.secure.removeItem('oid-state').catch(console.error);\n            }\n            catch (e) {\n                console.error(e);\n                return;\n            }\n        }\n    }\n\n    async startSSO(data: { webshopId?: string; prompt?: string; providerType: LoginProviderType }) {\n        const spaState = generateId(40);\n        try {\n            await Storage.secure.setItem('oid-state', spaState);\n        }\n        catch (e) {\n            console.error('Could not save state in local storage');\n            new Toast('Jouw browser ondersteunt geen lokale opslag, wat noodzakelijk is om in te kunnen loggen. Kijk na of je de browser niet in incognito/prive mode gebruikt. Schakel het indien mogelijk uit, of probeer in een andere browser.', 'error red').setHide(20000).show();\n            return;\n        }\n\n        // Generate code verifier\n        // const codeVerifier = await this.generateCodeVerifier();\n        // Generate code challenge from code verifier\n        // const codeChallenge = await this.generateCodeChallenge(codeVerifier);\n        // code_challenge_method = S256\n\n        const url = new URL((STAMHOOFD.environment === 'development' ? 'http://localhost:9091' : this.server.host) + '/openid/start');\n        url.searchParams.set('spaState', spaState);\n        url.searchParams.set('provider', data.providerType);\n        if (data.webshopId) {\n            url.searchParams.set('webshopId', data.webshopId);\n        }\n        if (data.prompt) {\n            url.searchParams.set('prompt', data.prompt);\n        }\n\n        const redirectUri = new URL(window.location.href);\n        if (redirectUri.protocol === 'capacitor:') {\n            // On the iOS app, we'll need to rewrite the schema\n            redirectUri.protocol = 'https:';\n        }\n        if (STAMHOOFD.REDIRECT_LOGIN_DOMAIN) {\n            redirectUri.searchParams.set('skipRedirect', 'true');\n        }\n        url.searchParams.set('redirectUri', redirectUri.href);\n\n        if (this.hasToken()) {\n            // Request a one-time auth token to connect an external account\n            const respponse = await this.authenticatedServer.request({\n                method: 'POST',\n                path: '/openid/auth-token',\n                decoder: OpenIDAuthTokenResponse as Decoder<OpenIDAuthTokenResponse>,\n            });\n            url.searchParams.set('authToken', respponse.data.ssoAuthToken);\n        }\n\n        // Redirect / open url\n        window.location.href = url.toString();\n    }\n\n    addListener(owner: any, listener: AuthenticationStateListener) {\n        this.listeners.set(owner, listener);\n    }\n\n    removeListener(owner: any) {\n        this.listeners.delete(owner);\n    }\n\n    callListeners(changed: 'user' | 'organization' | 'token' | 'preventComplete') {\n        for (const listener of this.listeners.values()) {\n            listener(changed);\n        }\n    }\n\n    hasToken(): boolean {\n        return !!this.token;\n    }\n\n    canGetCompleted(): boolean {\n        // console.log(\"canGetCompleted\", this.token, this.user, this.organization, this.preventComplete, this.user?.permissions, this.organization?.privateMeta)\n        return !!this.token;\n    }\n\n    hasPermissions(): boolean {\n        // console.log(\"canGetCompleted\", this.token, this.user, this.organization, this.preventComplete, this.user?.permissions, this.organization?.privateMeta)\n        return !!this.auth?.permissions;\n    }\n\n    isComplete(): boolean {\n        if (!this.token) {\n            return false;\n        }\n\n        if (!this.user) {\n            return false;\n        }\n\n        if (this.preventComplete) {\n            return false;\n        }\n\n        if (this.organization) {\n            if (this.auth.permissions && !this.organization.privateMeta) {\n                // Private meta is missing while we have permissions for this organization: requires a refetch\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    static serverForOrganization(organizationId: string | null | undefined) {\n        const server = NetworkManager.server;\n        if (!organizationId) {\n            return server;\n        }\n\n        server.host = 'https://' + organizationId + '.' + STAMHOOFD.domains.api;\n        return server;\n    }\n\n    get server() {\n        return SessionContext.serverForOrganization(this.organization?.id);\n    }\n\n    /**\n     * Doing authenticated requests\n     */\n    get authenticatedServer() {\n        if (!this.hasToken()) {\n            throw new Error('Could not get authenticated server without token');\n        }\n        const server = this.server;\n        server.middlewares.push(this);\n        return server;\n    }\n\n    getAuthenticatedServerForOrganization(organizationId: string | null) {\n        if (!this.hasToken()) {\n            throw new Error('Could not get authenticated server without token');\n        }\n        const server = SessionContext.serverForOrganization(organizationId);\n        server.middlewares.push(this);\n        return server;\n    }\n\n    get optionalAuthenticatedServer() {\n        if (this.hasToken()) {\n            return this.authenticatedServer;\n        }\n        return this.server;\n    }\n\n    protected async onTokenChanged() {\n        await this.saveToStorage();\n        this.callListeners('token');\n    }\n\n    setTokenWithoutSaving(token: Token, usedPlatformStorage?: boolean) {\n        console.log('[SessionContext] Setting Token. Platform: ' + usedPlatformStorage);\n\n        if (this.token) {\n            // Disable listener before clearing the token\n            this.token.onChange = () => {\n                // emtpy\n            };\n        }\n        this.token = new ManagedToken(token, async () => {\n            await this.onTokenChanged();\n        });\n\n        if (usedPlatformStorage !== undefined) {\n            this.usedPlatformStorage = usedPlatformStorage;\n        }\n        this.callListeners('token');\n    }\n\n    async setToken(token: Token, usedPlatformStorage?: boolean) {\n        this.setTokenWithoutSaving(token, usedPlatformStorage);\n        await this.onTokenChanged();\n    }\n\n    _lastFetchedUser: Date | null = null;\n    _lastFetchedOrganization: Date | null = null;\n\n    async fetchUser(shouldRetry = true): Promise<UserWithMembers> {\n        console.log('Fetching session user...');\n\n        if (!isReactive(this)) {\n            console.error('SessionContext is not reactive while fetching user!');\n        }\n\n        const response = await this.authenticatedServer.request({\n            method: 'GET',\n            path: '/user',\n            decoder: UserWithMembers as Decoder<UserWithMembers>,\n            shouldRetry,\n        });\n        this._lastFetchedUser = new Date();\n\n        if (this.user) {\n            this.user.deepSet(response.data);\n        }\n        else {\n            this.user = response.data;\n        }\n        console.log('Fetched session user');\n\n        if (!isReactive(this.user)) {\n            console.error('SessionContext.user is not reactive after fetching user!');\n        }\n\n        // Auto copy organization data from the response\n        if (this.organization) {\n            const returnedOrganization = this.user.members.organizations.find(o => o.id == this.organization?.id);\n            if (returnedOrganization) {\n                this._lastFetchedOrganization = new Date();\n                this.updateOrganization(returnedOrganization);\n            }\n            else {\n                console.warn('Did not find organization in user response');\n            }\n        }\n\n        await this.saveToStorage();\n        this.callListeners('user');\n        return this.user;\n    }\n\n    /**\n     * Set the organization, including the reference\n     */\n    setOrganization(organization: Organization) {\n        this.organization = organization;\n        this.callListeners('organization');\n    }\n\n    /**\n     * Set the organization, but keep the same reference and update\n     * other references (like groups) correctly to keep the app reactive\n     */\n    updateOrganization(organization: Organization) {\n        if (!this.organization) {\n            this.setOrganization(organization);\n            this.clearAuthCache();\n        }\n        else {\n            const oldAdmins = this.organization.admins;\n\n            this.organization.deepSet(organization);\n\n            if (oldAdmins && !this.organization.admins) {\n                this.organization.admins = oldAdmins;\n            }\n            this.clearAuthCache();\n            this.callListeners('organization');\n        }\n    }\n\n    async fetchOrganization(shouldRetry = true): Promise<Organization> {\n        if (!this.organization) {\n            throw new Error('Cannot fetch organization in a context with no organization');\n        }\n        console.log('Fetching session organization...');\n\n        const response = await (this.hasToken() ? this.authenticatedServer : this.server).request({\n            method: 'GET',\n            path: '/organization',\n            decoder: Organization as Decoder<Organization>,\n            shouldRetry,\n        });\n\n        if (this.hasToken() && this.organizationPermissions && !response.data.privateMeta) {\n            console.error('Missing privateMeta in authenticated organization response');\n\n            // Critical issue: log out\n            this.setLoadingError(new SimpleError({\n                code: 'failed',\n                message: 'Something went wrong',\n                human: 'Er ging iets mis. Je hebt geen toegang tot deze vereniging.',\n            }));\n            throw new Error('Missing privateMeta in authenticated organization response');\n        }\n\n        this.updateOrganization(response.data);\n        this._lastFetchedOrganization = new Date();\n        this.callListeners('organization');\n        return this.organization!;\n    }\n\n    isOutdated(date: Date | null) {\n        return date === null || date < new Date(new Date().getTime() - 10 * 1000);\n    }\n\n    /**\n     *\n     * @param force Always fetch new information, even when it is available\n     * @param shouldRetry Keep retrying on network or server issues\n     * @param background If we don't need to update the data right away, initiate a forced background update\n     */\n    async updateData(force = false, shouldRetry = true, background = false, skipIfNotOutdated = false) {\n        if (force) {\n            console.log('SessionContext force update data, background: ', background, skipIfNotOutdated);\n        }\n        else {\n            console.log('SessionContext update data, background: ', background, skipIfNotOutdated);\n        }\n\n        if (skipIfNotOutdated) {\n            if (!this.isOutdated(this._lastFetchedUser) && !this.isOutdated(this._lastFetchedOrganization)) {\n                console.log('Data is not outdated, skipping update');\n                return;\n            }\n\n            console.log('Data is outdated, updating...', this._lastFetchedUser, this._lastFetchedOrganization);\n        }\n\n        try {\n            let fetchedUser = false;\n            let fetchedOrganization = false;\n\n            if (force || !this.user) {\n                fetchedUser = true;\n                await this.fetchUser(shouldRetry);\n\n                // The user also includes the organization, so we don't need to fetch it again\n                fetchedOrganization = true;\n            }\n\n            if (this.organization && ((force && !fetchedOrganization) || (this.organizationPermissions && !this.organization.privateMeta))) {\n                fetchedOrganization = true;\n                await this.fetchOrganization(shouldRetry);\n            }\n\n            if (((!fetchedOrganization && this.organization) || (!fetchedUser)) && background) {\n                // Initiate a slow background update without retry\n                // = we don't need to block the UI for this ;)\n                this.updateData(true, false, false).catch((e) => {\n                    // Ignore network errors\n                    console.error(e);\n                });\n            }\n        }\n        catch (e) {\n            console.error('Error while updating session data', e);\n            throw e;\n        }\n    }\n\n    // Logout without clearing this token\n    temporaryLogout() {\n        console.log('temporary logout');\n\n        // We do not call ontoken changed -> prevent saving!!!!\n        // Might still be able to login after a reload (because the error was caused by data errors)\n        if (this.token) {\n            this.token.onChange = () => {\n                // emtpy\n            };\n            this.token = null;\n            this.callListeners('token');\n        }\n        this.user = null;\n        this.callListeners('user');\n    }\n\n    // Logout without clearing this token\n    setLoadingError(error: Error | null) {\n        this.loadingError = error;\n        this.callListeners('token');\n        this.callListeners('user');\n    }\n\n    isLoggingOut = false;\n\n    async logout(updateUIForLogout = true) {\n        if (this.isLoggingOut) {\n            // Prevents loops when refreshing inside the logout endpoint\n            return;\n        }\n\n        if (this.token) {\n            this.isLoggingOut = true;\n            console.log('Logout');\n\n            // Delete first to prevent loops (could be already invalid so the deletion might fail)\n            try {\n                await this.authenticatedServer.request({\n                    method: 'DELETE',\n                    path: '/oauth/token',\n                    shouldRetry: false,\n                    allowErrorRetry: true, // sometimes we need to refresh a token before we can delete it\n                });\n            }\n            catch (e) {\n                if (Request.isNetworkError(e) || Request.isAbortError(e)) {\n                    // Network access is required for a reliable logout\n                    this.isLoggingOut = false;\n                    throw e;\n                }\n                console.error('Failed to delete token. Probably already deleted?', e);\n            }\n\n            this.isLoggingOut = false;\n            this.token.onChange = () => {\n                // emtpy\n            };\n            this.token = null;\n            this.user = null; // force refetch in the future\n            await this.deleteFromStorage();\n\n            if (updateUIForLogout) {\n                await this.onTokenChanged();\n            }\n        }\n    }\n\n    async deleteAccount() {\n        if (this.isLoggingOut) {\n            // Prevents loops when refreshing inside the logout endpoint\n            return;\n        }\n\n        if (this.token) {\n            this.isLoggingOut = true;\n            console.log('Logout');\n\n            // Delete first to prevent loops (could be already invalid so the deletion might fail)\n            try {\n                await this.authenticatedServer.request({\n                    method: 'DELETE',\n                    path: '/user',\n                    shouldRetry: false,\n                    allowErrorRetry: true, // sometimes we need to refresh a token before we can delete it\n                });\n            }\n            catch (e) {\n                if (Request.isNetworkError(e) || Request.isAbortError(e)) {\n                    // Network access is required for a reliable logout\n                    this.isLoggingOut = false;\n                    throw e;\n                }\n                console.error('Failed to delete token. Probably already deleted?', e);\n            }\n\n            this.isLoggingOut = false;\n            this.token.onChange = () => {\n                // emtpy\n            };\n            this.token = null;\n            this.user = null; // force refetch in the future\n            await this.deleteFromStorage();\n            await this.onTokenChanged();\n        }\n    }\n\n    // -- Implementation for requestMiddleware ----\n\n    async onBeforeRequest(request: Request<any>): Promise<void> {\n        // Check if we have an updated token in storage (other browser tab refreshed the token)\n        await this.loadTokenFromStorage();\n\n        if (!this.token) {\n            // Euhm? The user is not signed in!\n            throw new Error('Could not authenticate request without token');\n        }\n\n        if (this.token.isRefreshing() || this.token.needsRefresh()) {\n            // Already expired.\n            console.log('Request started with expired access token, refreshing before starting request...');\n            try {\n                await this.token.refresh(this.server, () => request.shouldRetry);\n            }\n            catch (e) {\n                if (isSimpleError(e) || isSimpleErrors(e)) {\n                    if (e.hasCode('invalid_refresh_token')) {\n                        await this.logout();\n                        throw new SimpleError({\n                            code: '',\n                            message: '',\n                            human: 'Je bent niet langer ingelogd. Log opnieuw in om verder te gaan.',\n                        });\n                    }\n                }\n                throw e;\n            }\n        }\n\n        request.headers['Authorization'] = 'Bearer ' + this.token.token.accessToken;\n    }\n\n    async shouldRetryError(request: Request<any>, response: XMLHttpRequest, error: SimpleErrors): Promise<boolean> {\n        if (!this.token) {\n            // Euhm? The user is not signed in!\n            return false;\n        }\n\n        if (error.hasCode('invalid_organization') && this.organization) {\n            // Clear from session storage\n            await SessionManager.removeOrganizationFromStorage(this.organization.id);\n            this.setLoadingError(error);\n            window.location.reload();\n            return false;\n        }\n\n        if (error.hasCode('not_activated') && !this.isStorageDisabled) {\n            // The user is not activated, logout\n            await this.logout();\n            return false;\n        }\n\n        if (response.status !== 401) {\n            return false;\n        }\n\n        if (error.hasCode('expired_access_token')) {\n            if (request.headers.Authorization !== 'Bearer ' + this.token.token.accessToken) {\n                console.log('This request started with an old token that might not be valid anymore. Retry with new token before doing a refresh');\n                return true;\n            }\n\n            // Try to refresh\n            try {\n                console.log('Request failed due to expired access token, refreshing...');\n                await this.token.refresh(this.server, () => request.shouldRetry);\n                console.log('Retrying request...');\n            }\n            catch (e) {\n                if (isSimpleError(e) || isSimpleErrors(e)) {\n                    if (e.hasCode('invalid_refresh_token')) {\n                        console.log('Refresh token is invalid, logout');\n                        this.setLoadingError(e);\n                        await this.logout();\n                        return false;\n                    }\n                }\n\n                if (Request.isNetworkError(e) || Request.isAbortError(e)) {\n                    return false;\n                }\n\n                // Something went wrong\n                this.setLoadingError(e);\n                return false;\n            }\n            return true;\n        }\n        else {\n            if (request.headers.Authorization !== 'Bearer ' + this.token.token.accessToken) {\n                console.log('This request started with an old token that might not be valid anymore. Retry with new token');\n                return true;\n            }\n            else {\n                if (error.hasCode('invalid_access_token')) {\n                    await this.logout();\n                }\n                else {\n                    this.setLoadingError(error);\n                }\n            }\n        }\n\n        return false;\n    }\n}\n","import { ArrayDecoder, AutoEncoder, Decoder, field, ObjectData, StringDecoder, VersionBox, VersionBoxDecoder } from '@simonbackx/simple-encoding';\nimport { isSimpleError, isSimpleErrors, SimpleError } from '@simonbackx/simple-errors';\nimport { Request } from '@simonbackx/simple-networking';\nimport { Organization, Version } from '@stamhoofd/structures';\n\nimport { SessionContext } from './SessionContext';\nimport { Storage } from './Storage';\nimport { isReactive } from 'vue';\n\nclass SessionStorage extends AutoEncoder {\n    @field({ decoder: new ArrayDecoder(Organization) })\n        organizations: Organization[] = []\n\n    @field({ decoder: StringDecoder, nullable: true })\n        lastOrganizationId: string | null = null\n}\n\ntype AuthenticationStateListener = (changed: \"precentComplete\" | \"user\" | \"organization\" | \"token\" | \"session\") => void\n\n/**\n * The SessionManager manages the storage of Sessions for different organizations. You can request the session for a given organization.\n * If a token is present, it will automatically allow the user to be kept logged in.\n * You can also request the available sessions, so you can hint the user in which organizations he is already signed in.\n */\nexport class SessionManagerStatic {\n    // currentSession: SessionContext | null = null\n\n    protected cachedStorage?: SessionStorage\n    protected listeners: Map<any, AuthenticationStateListener> = new Map()\n\n    async getLastSession() {\n        const storage = await this.getSessionStorage(false)\n        const id = storage.lastOrganizationId\n        if (id) {\n            const session = await this.getContextForOrganization(id)\n            if (session && session.canGetCompleted()) {\n                return session\n            } else {\n                console.log(\"session can not get completed, no autosignin\")\n                console.log(session)\n            }\n        }\n\n        return this.getLastGlobalSession()\n    }\n\n    async getLastGlobalSession() {\n        const session = new SessionContext(null)\n        await session.loadFromStorage()\n        return session\n    }\n\n    addListener(owner: any, listener: AuthenticationStateListener) {\n        this.listeners.set(owner, listener)\n    }\n\n    removeListener(owner: any) {\n        this.listeners.delete(owner)\n    }\n\n    protected callListeners(changed: \"user\" | \"organization\" | \"token\" | \"session\" | \"preventComplete\") {\n        for (const listener of this.listeners.values()) {\n            listener(changed)\n        }\n    }\n\n    async addOrganizationToStorage(organization: Organization, options: {updateOnly?: boolean} = {}) {\n        const storage = await this.getSessionStorage(false)\n        const index = storage.organizations.findIndex(o => o.id === organization.id)\n\n        if (index !== -1) {\n            storage.organizations.splice(index, 1)\n        } else {\n            if (options.updateOnly) {\n                return\n            }\n        }\n        storage.organizations.unshift(organization)\n        this.saveSessionStorage(storage)\n    }\n\n    async removeOrganizationFromStorage(organizationId: string) {\n        const storage = await this.getSessionStorage(false)\n        const index = storage.organizations.map(o => o.id).indexOf(organizationId)\n\n        // TODO: improve this a lot\n        if (index !== -1) {\n            storage.organizations.splice(index, 1)\n        }\n        this.saveSessionStorage(storage)\n    }\n\n    async prepareSessionForUsage(session: SessionContext, shouldRetry = true) {      \n        console.log('prepareSessionForUsage')\n        session.enableStorage();\n         \n        if (!isReactive(session)) {\n            console.error('Passing around a non-reactive session can cause issues. Prevent using a session that is not reactive.')\n        }\n\n        // WARNING: currently there is a bug that for the first session is loaded before\n        // the platform is loaded\n        // -> responsibilities not loaded\n        // -> thinks you don't have permission for the current organization\n        // -> the session is complete because privateMeta is not a requirement\n        // -> later, the platform is loaded\n        // -> suddenly you have permissions and the session is no longer considered complete\n        if (session.canGetCompleted() && !session.isComplete()) {\n            // Always request a new user (the organization is not needed)\n            // session.user = null\n            if (!session.user) {\n                console.log(\"Doing a sync session update because user is missing\")\n            }\n\n            if (session.preventComplete) {\n                console.log(\"Doing a sync session update because preventComplete\")\n            }\n\n            if (session.user && !session.preventComplete) {\n                console.log(\"Doing a sync session update other\")\n            }\n\n            try {\n                await session.updateData(true, shouldRetry, true)\n            } catch (e) {\n                console.error('Failed to update data in preparation of session', e);\n\n                if (isSimpleErrors(e) || isSimpleError(e)) {\n                    if (e.hasCode(\"invalid_organization\")) {\n                        // Clear from session storage\n                        if (session.organization) {\n                            await this.removeOrganizationFromStorage(session.organization.id)\n                        }\n                        throw new SimpleError({\n                            code: \"invalid_organization\",\n                            message: e.message,\n                            human: \"Deze vereniging bestaat niet (meer)\"\n                        })\n                    }\n                }\n\n                if (!shouldRetry && Request.isNetworkError(e)) {\n                    // Undo setting the session\n                    throw new SimpleError({\n                        code: \"network_error\",\n                        message: e.message,\n                        human: \"We konden geen verbinding maken met internet. Kijk jouw internetverbinding na en probeer opnieuw.\"\n                    })\n                }\n\n                // still set the current session, but logout that session\n                throw e;\n            }\n        } else {\n            if (session.canGetCompleted()) {\n                // Already complete\n                // Initiate a slow background update without retry\n                // = we don't need to block the UI for this ;)\n                session.updateData(true, false, false, true).catch(e => {\n                    // Ignore network errors\n                    console.error(\"Background fetch session error\", e, session)\n                    session.callListeners(\"preventComplete\")\n\n                    if (!session.isComplete()) {\n                        session.setLoadingError(e)\n                    }\n                })\n            } else {\n                // Update organization\n                if (session.organization) {\n                    await session.fetchOrganization(shouldRetry)\n                }\n            }\n        }\n\n        const storage = await this.getSessionStorage(false)\n        storage.lastOrganizationId = session.organization?.id ?? null\n        this.saveSessionStorage(storage)\n\n        if (session.organization) {\n            this.addOrganizationToStorage(session.organization).catch(console.error)\n        }\n\n        this.callListeners(\"session\")\n\n        session.addListener(this, (changed: \"user\" | \"organization\" | \"token\" | \"preventComplete\") => {\n            if (session.organization) {\n                this.addOrganizationToStorage(session.organization).catch(console.error)\n            }\n            this.callListeners(changed)\n        })\n\n        await session.saveToStorage();\n        return session\n    }\n\n    /**\n     * Try to create a session, and support offline mode so we don't need to fetch if network is offline\n     */\n    async getContextForOrganization(id: string) {\n        const sessionStorage = await this.getSessionStorage(false)\n        const organization = sessionStorage.organizations.find(o => o.id === id)\n\n        if (organization) {\n            const session = new SessionContext(organization)\n            await session.loadFromStorage()\n            return session\n        }\n\n        const session = await SessionContext.createFrom({organizationId: id})\n        await session.loadFromStorage()\n        return session\n    }\n\n    saveSessionStorage(storage: SessionStorage, retryWithLess = true) {\n        try {\n            this.cachedStorage = storage\n\n            // keep this method fast, we don't need to wait because we use cached storage\n            Storage.keyValue.setItem('organizations', JSON.stringify(new VersionBox(storage).encode({ version: Version }))).catch(console.error)\n        } catch (e) {\n            console.error(e)\n\n            // Possible out of storage: delete one organization and try again\n            if (retryWithLess && storage.organizations.length > 1) {\n                storage.organizations.pop()\n                this.saveSessionStorage(storage, false)\n            }\n        }\n    }\n\n    async getSessionStorage(allowCache = true): Promise<SessionStorage> {\n        if (this.cachedStorage && allowCache) {\n            return this.cachedStorage\n        }\n        // Loop through organizations\n        try {\n            const json = await Storage.keyValue.getItem('organizations')\n            if (json) {\n                try {\n                    const parsed = JSON.parse(json)\n                    const cache = new ObjectData(parsed, { version: Version }).decode(new VersionBoxDecoder(SessionStorage as Decoder<SessionStorage>)).data\n                    this.cachedStorage = cache\n                    return cache\n                } catch (e) {\n                    console.error(e)\n                }\n            }\n        } catch (e) {\n            console.error(e)\n        }\n        const cache = SessionStorage.create({})\n        this.cachedStorage = cache\n        return cache\n    }\n\n    async availableSessions(): Promise<SessionContext[]> {\n        const sessionStorage = await this.getSessionStorage(false)\n        const sessions: SessionContext[] = []\n\n        for (const o of sessionStorage.organizations) {\n            const session = new SessionContext(o)\n            await session.loadFromStorage()\n            sessions.push(session)\n        }\n\n        return sessions\n    }\n\n    async getPreparedContextForOrganization(organization: Organization) {\n        if (document.activeElement) {\n            // Blur currently focused element, to prevent from opening the login view multiple times\n            (document.activeElement as HTMLElement).blur()\n        }\n\n        try {\n            const session = await this.getContextForOrganization(organization.id)\n            session.setOrganization(organization)\n            await this.prepareSessionForUsage(session, false)\n            return session;\n        } catch (e) {\n            if (e.hasCode(\"invalid_organization\")) {\n                // Clear from session storage\n                await this.removeOrganizationFromStorage(organization.id)\n                throw new SimpleError({\n                    code: \"invalid_organization\",\n                    message: e.message,\n                    human: \"Deze vereniging bestaat niet (meer)\"\n                })\n            }\n            throw e;\n        }\n    }\n}\n\nexport const SessionManager = new SessionManagerStatic();\n\n(window as any).SessionManager = SessionManager\n","import { AutoEncoderPatchType, Decoder, ObjectData } from '@simonbackx/simple-encoding';\nimport { isSimpleError, isSimpleErrors } from '@simonbackx/simple-errors';\nimport { RequestResult } from '@simonbackx/simple-networking';\nimport { CreateOrganization, NewUser, Organization, OrganizationAdmins, PollEmailVerificationRequest, PollEmailVerificationResponse, SignupResponse, Token, User, VerifyEmailRequest, Version } from '@stamhoofd/structures';\n\nimport { NetworkManager } from './NetworkManager';\nimport { SessionContext } from './SessionContext';\nimport { SessionManager } from './SessionManager';\n\nexport class LoginHelper {\n    /**\n     * Resend the email verification email (if it is still valid)\n     * @returns stop: close the modal - the token is expired and you need to login again\n     */\n    static async retryEmail(session: SessionContext, token: string): Promise<boolean> {\n        const response = await session.server.request({\n            method: 'POST',\n            path: '/verify-email/retry',\n            body: PollEmailVerificationRequest.create({\n                token,\n            }),\n            decoder: PollEmailVerificationResponse as Decoder<PollEmailVerificationResponse>,\n        });\n\n        if (!response.data.valid) {\n            // the code has been used or is expired\n\n            // Check if we are now logged in (link might have been opened in a new tab)\n            await session.loadFromStorage();\n            if (session.canGetCompleted()) {\n                // yay! We are signed in\n                await SessionManager.prepareSessionForUsage(session, false);\n                return true;\n            }\n\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * Return true when the polling should end + confirmation should stop\n     */\n    static async pollEmail(session: SessionContext, token: string): Promise<boolean> {\n        const response = await session.server.request({\n            method: 'POST',\n            path: '/verify-email/poll',\n            body: PollEmailVerificationRequest.create({\n                token,\n            }),\n            decoder: PollEmailVerificationResponse as Decoder<PollEmailVerificationResponse>,\n        });\n\n        if (!response.data.valid) {\n            // Check if we are now logged in (link might have been opened in a new tab)\n            await session.loadFromStorage();\n            await SessionManager.prepareSessionForUsage(session, false);\n            return true;\n        }\n        return false;\n    }\n\n    static async verifyEmail(session: SessionContext, code: string, token: string) {\n        const response = await session.server.request({\n            method: 'POST',\n            path: '/verify-email',\n            body: VerifyEmailRequest.create({\n                code,\n                token,\n            }),\n            decoder: Token as Decoder<Token>,\n        });\n\n        try {\n            session.preventComplete = true;\n            await session.setToken(response.data);\n            await SessionManager.prepareSessionForUsage(session, false);\n        }\n        finally {\n            session.preventComplete = false;\n        }\n    }\n\n    static async login(\n        session: SessionContext,\n        email: string,\n        password: string,\n    ): Promise<{ verificationToken?: string }> {\n        let tokenResponse: RequestResult<Token>;\n        try {\n            session.setLoadingError(null);\n            tokenResponse = await session.server.request({\n                method: 'POST',\n                path: '/oauth/token',\n                body: { grant_type: 'password', username: email, password },\n                decoder: Token as Decoder<Token>,\n                shouldRetry: false,\n            });\n        }\n        catch (e) {\n            if ((isSimpleError(e) || isSimpleErrors(e))) {\n                const error = e.getCode('verify_email');\n                if (error) {\n                    const meta = SignupResponse.decode(new ObjectData(error.meta, { version: Version }));\n\n                    return {\n                        verificationToken: meta.token,\n                    };\n                }\n            }\n            throw e;\n        }\n\n        session.preventComplete = true;\n        try {\n            await session.setToken(tokenResponse.data);\n            await session.fetchUser();\n\n            // if user / orgaznization got cleared due to an invite\n            if (!session.isComplete()) {\n                await session.updateData(false, false);\n                // need to wait on this because it changes the permissions\n            }\n\n            await SessionManager.prepareSessionForUsage(session);\n            session.preventComplete = false;\n        }\n        catch (e) {\n            session.preventComplete = false;\n            throw e;\n        }\n\n        return {};\n    }\n\n    static async signUpOrganization(organization: Organization, email: string, password: string, firstName: string | null = null, lastName: string | null = null, registerCode: string | null = null): Promise<string> {\n        const user = NewUser.create({\n            email,\n            organizationId: organization.id,\n            firstName,\n            lastName,\n            password,\n        });\n\n        // Do netwowrk request to create organization\n        const response = await NetworkManager.server.request({\n            method: 'POST',\n            path: '/organizations',\n            body: CreateOrganization.create({\n                organization,\n                user,\n                registerCode,\n            }),\n            decoder: SignupResponse as Decoder<SignupResponse>,\n        });\n\n        return response.data.token;\n    }\n\n    static async loadAdmins(session: SessionContext, shouldRetry = true, owner?: any): Promise<OrganizationAdmins> {\n        const response = await session.authenticatedServer.request({\n            method: 'GET',\n            path: '/organization/admins',\n            decoder: OrganizationAdmins as Decoder<OrganizationAdmins>,\n            shouldRetry,\n            owner,\n        });\n\n        return response.data;\n    }\n\n    static async changePassword(session: SessionContext, password: string, email?: string) {\n        console.log('Change password. Start.');\n\n        const patch = NewUser.patch({\n            id: session.user!.id,\n            password,\n            email,\n        });\n\n        return await this.patchUser(session, patch);\n    }\n\n    static async patchUser(session: SessionContext, patch: AutoEncoderPatchType<NewUser | User>): Promise<{ verificationToken?: string }> {\n        // Do netwowrk request to create organization\n        try {\n            await session.authenticatedServer.request({\n                method: 'PATCH',\n                path: '/user/' + patch.id,\n                body: patch,\n                decoder: User,\n                shouldRetry: false,\n            });\n        }\n        catch (e) {\n            if ((isSimpleError(e) || isSimpleErrors(e))) {\n                const error = e.getCode('verify_email');\n                if (error) {\n                    const meta = SignupResponse.decode(new ObjectData(error.meta, { version: Version }));\n                    return {\n                        verificationToken: meta.token,\n                    };\n                }\n            }\n            throw e;\n        }\n\n        if (session.user!.id === patch.id) {\n            await session.updateData(true, false);\n        }\n        return {};\n    }\n\n    static async signUp(session: SessionContext, email: string, password: string, firstName: string | null = null, lastName: string | null = null): Promise<string> {\n        const user = NewUser.create({\n            email,\n            organizationId: session.organization?.id ?? null,\n            firstName,\n            lastName,\n            password,\n        });\n\n        // Do netwowrk request to create organization\n        const response = await session.server.request({\n            method: 'POST',\n            path: '/sign-up',\n            body: user,\n            decoder: SignupResponse as Decoder<SignupResponse>,\n        });\n\n        if (session.user) {\n            // Clear user\n            session.user = null;\n        }\n\n        return response.data.token;\n    }\n}\n","import { ArrayDecoder, AutoEncoderPatchType, Decoder, PatchableArray, PatchableArrayAutoEncoder, deepSetArray } from '@simonbackx/simple-encoding';\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { GlobalEventBus } from '@stamhoofd/components';\nimport { LoginHelper, SessionContext, SessionManager } from '@stamhoofd/networking';\nimport { Group, Organization, OrganizationAdmins, OrganizationPatch, OrganizationRegistrationPeriod, RegistrationPeriodList } from '@stamhoofd/structures';\nimport { Ref, inject, toRef } from 'vue';\n\nexport function useOrganizationManager(): Ref<OrganizationManager> {\n    return toRef(inject<OrganizationManager>('$organizationManager') as OrganizationManager) as Ref<OrganizationManager>;\n}\n\n/**\n * Convenient access to the organization of the current session\n */\nexport class OrganizationManager {\n    $context: SessionContext;\n\n    constructor($context: SessionContext) {\n        // Make reactive\n        this.$context = $context;\n    }\n\n    get organization() {\n        return this.$context.organization!;\n    }\n\n    set organization(organization: Organization) {\n        this.$context.updateOrganization(organization);\n    }\n\n    get user() {\n        return this.$context.user!;\n    }\n\n    getPatch() {\n        return OrganizationPatch.create({\n            id: this.organization.id,\n        });\n    }\n\n    async forceUpdate() {\n        await this.$context.fetchOrganization(false);\n    }\n\n    async patch(patch: AutoEncoderPatchType<Organization>, options: { shouldRetry?: boolean; owner?: any } = {}) {\n        if (!this.$context.organization) {\n            throw new SimpleError({\n                code: 'no_organization',\n                message: 'No organization loaded',\n            });\n        }\n\n        patch.id = this.$context.organization.id;\n\n        const response = await this.$context.authenticatedServer.request({\n            method: 'PATCH',\n            path: '/organization',\n            body: patch,\n            decoder: Organization as Decoder<Organization>,\n            shouldRetry: options.shouldRetry ?? false,\n            owner: options.owner,\n        });\n\n        // Keep admins\n        const admins = this.$context.organization.admins;\n\n        this.$context.updateOrganization(response.data);\n\n        if (admins && !response.data.admins && patch.admins) {\n            this.$context.organization.admins = patch.admins.applyTo(admins);\n        }\n\n        // Call handlers: also update the stored organization in localstorage\n        // + handle other listeners\n        this.$context.callListeners('organization');\n\n        // Save organization in localstorage\n        this.save().catch(console.error);\n\n        await GlobalEventBus.sendEvent('organization-updated', this.$context.organization);\n    }\n\n    async patchPeriods(patch: PatchableArrayAutoEncoder<OrganizationRegistrationPeriod>, options: { shouldRetry?: boolean; owner?: any } = {}) {\n        const response = await this.$context.authenticatedServer.request({\n            method: 'PATCH',\n            path: '/organization/registration-periods',\n            body: patch,\n            decoder: new ArrayDecoder(OrganizationRegistrationPeriod as Decoder<OrganizationRegistrationPeriod>),\n            shouldRetry: options.shouldRetry ?? false,\n            owner: options.owner,\n        });\n\n        this.updatePeriods(response.data);\n    }\n\n    async patchPeriod(patch: AutoEncoderPatchType<OrganizationRegistrationPeriod>, options: { shouldRetry?: boolean; owner?: any } = {}) {\n        const arr = new PatchableArray() as PatchableArrayAutoEncoder<OrganizationRegistrationPeriod>;\n        arr.addPatch(patch);\n\n        await this.patchPeriods(arr, options);\n    }\n\n    updatePeriods(periods: OrganizationRegistrationPeriod[]) {\n        // Update in memory\n        for (const period of this.organization.periods?.organizationPeriods ?? []) {\n            const updated = periods.find(p => p.id === period.id);\n            if (updated) {\n                period.deepSet(updated);\n            }\n        }\n\n        const updated = periods.find(p => p.id === this.organization.period.id);\n        if (updated) {\n            this.organization.period.deepSet(updated);\n        }\n    }\n\n    async patchGroup(organizationPeriod: OrganizationRegistrationPeriod, patch: AutoEncoderPatchType<Group>, options: { shouldRetry?: boolean; owner?: any } = {}) {\n        const periodPatch = OrganizationRegistrationPeriod.patch({\n            id: organizationPeriod.id,\n        });\n        periodPatch.groups.addPatch(patch);\n        await this.patchPeriod(periodPatch, options);\n    }\n\n    async loadAdmins(force = false, shouldRetry = true, owner?: any): Promise<OrganizationAdmins> {\n        if (!force && this.organization.admins) {\n            return this.organization as any;\n        }\n\n        const loaded = await LoginHelper.loadAdmins(this.$context, shouldRetry, owner);\n\n        if (this.organization.admins) {\n            deepSetArray(this.organization.admins, loaded.users);\n        }\n        else {\n            this.organization.admins = loaded.users;\n        }\n\n        // Save organization in localstorage\n        this.save().catch(console.error);\n\n        return this.organization as any;\n    }\n\n    async loadPeriods(force = false, shouldRetry?: boolean, owner?: any) {\n        if (!force && this.organization.periods) {\n            return this.organization.periods;\n        }\n\n        const response = await this.$context.authenticatedServer.request({\n            method: 'GET',\n            path: '/organization/registration-periods',\n            decoder: RegistrationPeriodList as Decoder<RegistrationPeriodList>,\n            owner,\n            shouldRetry: shouldRetry ?? false,\n        });\n        if (this.organization.periods) {\n            this.organization.periods?.deepSet(response.data);\n        }\n        else {\n            this.organization.periods = response.data;\n        }\n        return response.data;\n    }\n\n    async loadArchivedGroups({ owner }: { owner?: any }) {\n        const response = await this.$context.authenticatedServer.request({\n            method: 'GET',\n            path: '/organization/archived-groups',\n            decoder: new ArrayDecoder(Group as Decoder<Group>),\n            owner,\n        });\n\n        return response.data.sort((a, b) => b.settings.endDate.getTime() - a.settings.endDate.getTime());\n    }\n\n    /**\n     * Save organization in localstorage\n     */\n    async save() {\n        // Save organization in localstorage\n        if (this.$context.organization) {\n            await SessionManager.addOrganizationToStorage(this.$context.organization);\n        }\n    }\n}\n","import { ArrayDecoder, AutoEncoderPatchType, Decoder, deepSetArray, ObjectData, VersionBox, VersionBoxDecoder } from '@simonbackx/simple-encoding';\nimport { AppType, ColorHelper, GlobalEventBus } from '@stamhoofd/components';\nimport { SessionContext, Storage } from '@stamhoofd/networking';\nimport { Platform, RegistrationPeriod, UserWithMembers, Version, Webshop } from '@stamhoofd/structures';\nimport { Sorter } from '@stamhoofd/utility';\nimport { inject, reactive, Ref, toRef } from 'vue';\n\nexport function usePlatformManager(): Ref<PlatformManager> {\n    return toRef(inject<PlatformManager>('$platformManager', null as unknown as PlatformManager) as PlatformManager) as Ref<PlatformManager>;\n}\n\n/**\n * Convenient access to the organization of the current session\n */\nexport class PlatformManager {\n    $context: SessionContext;\n    $platform: Platform;\n    $app: AppType | 'auto';\n\n    constructor($context: SessionContext, $platform: Platform, app: AppType | 'auto') {\n        this.$context = $context;\n        this.$platform = $platform;\n        this.$app = app;\n\n        $platform.setShared();\n\n        this.updateStyles();\n    }\n\n    updateStyles() {\n        // Set color\n        if (this.$platform.config.color && this.$app !== 'webshop') {\n            ColorHelper.setColor(this.$platform.config.color);\n        }\n        this.setFavicon();\n    }\n\n    /**\n     * Create one from cache, otherwise load it using the network\n     */\n    static async createFromCache($context: SessionContext, app: AppType | 'auto', backgroundFetch = true, requirePrivateConfig = false): Promise<PlatformManager> {\n        const fromStorage = await PlatformManager.loadPlatform();\n\n        if (fromStorage && (fromStorage.privateConfig || !requirePrivateConfig)) {\n            const manager = new PlatformManager($context, reactive(fromStorage as any) as Platform, app);\n\n            if (backgroundFetch) {\n                manager.forceUpdate().catch(console.error);\n            }\n\n            return manager;\n        }\n\n        const platform = reactive(await PlatformManager.fetchPlatform($context)) as Platform;\n        const platformManager = new PlatformManager($context, platform, app);\n        await platformManager.savePlatform();\n        await GlobalEventBus.sendEvent('platform-updated', platformManager.$platform);\n        return platformManager;\n    }\n\n    setFavicon() {\n        if (!this.$platform.config.squareLogo) {\n            return;\n        }\n        if (this.$app === 'webshop') {\n            return;\n        }\n\n        const linkElement = document.querySelector(\"link[rel='icon']\") as HTMLLinkElement;\n        if (linkElement) {\n            return;\n        }\n\n        const href = this.$platform.config.squareLogo?.getPathForSize(256, 256);\n        const link = document.createElement('link');\n        link.rel = 'icon';\n        link.type = href.endsWith('.svg') ? 'image/svg+xml' : (href.endsWith('.png') ? 'image/png' : 'image/jpeg');\n        link.href = href;\n\n        document.head.appendChild(link);\n    }\n\n    static async fetchPlatform($context: SessionContext) {\n        const pResponse = await $context.optionalAuthenticatedServer.request({\n            method: 'GET',\n            path: '/platform',\n            decoder: Platform as Decoder<Platform>,\n        });\n        return pResponse.data;\n    }\n\n    async forceUpdate() {\n        this.$platform.deepSet(await PlatformManager.fetchPlatform(this.$context));\n        this.updateStyles();\n        await this.savePlatform();\n        await GlobalEventBus.sendEvent('platform-updated', this.$platform);\n    }\n\n    async patch(patch: AutoEncoderPatchType<Platform>, shouldRetry = false) {\n        const response = await this.$context.authenticatedServer.request({\n            method: 'PATCH',\n            path: '/platform',\n            body: patch,\n            decoder: Platform as Decoder<Platform>,\n            shouldRetry,\n        });\n\n        // Keep admins\n        const admins = this.$platform.admins;\n\n        this.$platform.deepSet(response.data);\n\n        if (admins && !response.data.admins && patch.admins) {\n            this.$platform.admins = patch.admins.applyTo(admins);\n        }\n        else if (admins && !response.data.admins && !patch.admins) {\n            this.$platform.admins = admins;\n        }\n\n        // Save platform in localstorage\n        this.savePlatform().catch(console.error);\n        this.updateStyles();\n        await GlobalEventBus.sendEvent('platform-updated', this.$platform);\n    }\n\n    async loadAdmins(force = false, shouldRetry?: boolean, owner?: any): Promise<void> {\n        if (!force && this.$platform.admins) {\n            return;\n        }\n\n        const response = await this.$context.authenticatedServer.request({\n            method: 'GET',\n            path: '/platform/admins',\n            decoder: new ArrayDecoder(UserWithMembers as Decoder<UserWithMembers>),\n            shouldRetry: shouldRetry ?? false,\n            owner,\n        });\n\n        if (this.$platform.admins) {\n            deepSetArray(this.$platform.admins, response.data);\n        }\n        else {\n            this.$platform.admins = response.data;\n        }\n    }\n\n    _pendingLoadPeriods: Promise<RegistrationPeriod[]> | null = null;\n\n    async loadPeriods(force = false, shouldRetry?: boolean, owner?: any) {\n        if (!force && this._pendingLoadPeriods && !this.$platform.periods) {\n            await this._pendingLoadPeriods;\n        }\n\n        if (!force && this.$platform.periods) {\n            return this.$platform.periods;\n        }\n\n        this._pendingLoadPeriods = (async () => {\n            const response = await this.$context.optionalAuthenticatedServer.request({\n                method: 'GET',\n                path: '/registration-periods',\n                decoder: new ArrayDecoder(RegistrationPeriod as Decoder<RegistrationPeriod>),\n                owner,\n                shouldRetry: shouldRetry ?? false,\n            });\n            this.$platform.periods = response.data.sort((a, b) => Sorter.byDateValue(a.startDate, b.startDate));\n            return response.data;\n        })();\n\n        const awaited = await this._pendingLoadPeriods;\n        this._pendingLoadPeriods = null;\n        return awaited;\n    }\n\n    /**\n     * Save organization in localstorage\n     */\n    async savePlatform() {\n        await Storage.keyValue.setItem('platform', JSON.stringify(new VersionBox(this.$platform).encode({ version: Version })));\n    }\n\n    static async loadPlatform() {\n        try {\n            const value = await Storage.keyValue.getItem('platform');\n            if (!value) {\n                return null;\n            }\n            const decoder = new VersionBoxDecoder(Platform as Decoder<Platform>);\n            const result = decoder.decode(new ObjectData(JSON.parse(value), { version: 0 }));\n            return result.data;\n        }\n        catch (e) {\n            console.error(e);\n            return null;\n        }\n    }\n}\n","import { Request } from '@simonbackx/simple-networking';\nimport { GlobalEventBus } from '@stamhoofd/components';\nimport { markRaw, onBeforeUnmount } from 'vue';\n\nexport function useRequestOwner(custom: any = undefined): object {\n    const owner = markRaw(custom === undefined ? {} : custom);\n\n    onBeforeUnmount(() => {\n        Request.cancelAll(owner);\n        GlobalEventBus.removeListener(owner);\n    });\n\n    return owner;\n}\n","import { ArrayDecoder, Decoder, ObjectData, VersionBox, VersionBoxDecoder } from '@simonbackx/simple-encoding';\nimport { SessionContext, Storage } from '@stamhoofd/networking';\nimport { BalanceItem, DetailedPayableBalanceCollection, Document as DocumentStruct, GroupsWithOrganizations, IDRegisterCheckout, MembersBlob, Platform, PlatformFamily, Version } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { inject, reactive, watch } from 'vue';\n\nexport function useMemberManager() {\n    return inject<MemberManager>('$memberManager', null as unknown as MemberManager) as MemberManager;\n}\n\n/**\n * Controls the fetching and decrypting of members\n */\nexport class MemberManager {\n    /// Currently saved members\n    $context: SessionContext;\n    family: PlatformFamily;\n\n    _unwatch: any;\n    _unwatchUser: any;\n\n    constructor($context: SessionContext, platform: Platform) {\n        this.$context = $context;\n        this.family = reactive(\n            new PlatformFamily({\n                contextOrganization: $context.organization,\n                platform,\n            }) as any,\n        ) as PlatformFamily;\n        this.watchCheckout();\n        this.watchUser();\n\n        // Reactive hack: always force creating reactive MemberManager\n        return reactive(this) as unknown as MemberManager;\n    }\n\n    watchUser() {\n        if (this._unwatchUser) {\n            this._unwatchUser();\n        }\n\n        // If the user is refetched, also reload the members that we've received\n        let lastUpdatedAt = new Date(0);\n        this._unwatchUser = watch(() => this.$context.user, () => {\n            if (this.$context._lastFetchedUser && this.$context._lastFetchedUser > lastUpdatedAt) {\n                if (this.$context.user && this.$context.user.members && !this.$context.user.members.isStale) {\n                    lastUpdatedAt = new Date();\n                    this.loadMembers().catch(console.error);\n                }\n            }\n        }, { deep: true });\n    }\n\n    watchCheckout() {\n        if (this._unwatch) {\n            this._unwatch();\n        }\n\n        this._unwatch = watch(() => this.family.checkout, () => {\n            this.saveCheckout().catch(console.error);\n        }, { deep: true });\n    }\n\n    async loadGroupsById(groupIds: string[], skipOrganizationIds: string[] = [], { owner, shouldRetry }: { owner?: any; shouldRetry?: boolean } = {}) {\n        if (groupIds.length === 0) {\n            return GroupsWithOrganizations.create({\n                groups: [],\n                organizations: [],\n            });\n        }\n\n        const response = await this.$context.authenticatedServer.request({\n            method: 'GET',\n            path: '/groups',\n            query: {\n                ids: groupIds.join(','),\n                excludeOrganizationIds: skipOrganizationIds.length ? Formatter.uniqueArray(skipOrganizationIds).join(',') : undefined,\n            },\n            decoder: GroupsWithOrganizations as Decoder<GroupsWithOrganizations>,\n            owner,\n            shouldRetry: shouldRetry ?? false,\n        });\n\n        return response.data;\n    }\n\n    get storageKey() {\n        return 'register_checkout_' + (STAMHOOFD.userMode === 'platform' ? 'platform' : (this.$context.organization?.id ?? 'platform'));\n    }\n\n    async loadCheckout() {\n        console.log('Loading checkout');\n\n        try {\n            // Note: we should always use the platform one for platforms, since the focused organization isn't a hard requirement\n            const storedData = await Storage.keyValue.getItem(this.storageKey);\n            if (storedData) {\n                const json = JSON.parse(storedData);\n                const data = new ObjectData(json, { version: 0 });\n                const decoder = new VersionBoxDecoder(IDRegisterCheckout as Decoder<IDRegisterCheckout>);\n                const idCheckout = data.decode(decoder).data;\n\n                const groupIds = idCheckout.groupIds;\n\n                const knownGroups = this.family.organizations.flatMap(o => o.period.groups);\n                const requestGroupIds = groupIds.filter(id => !knownGroups.some(g => g.id == id));\n\n                const groupsWithOrganizations = await this.loadGroupsById(requestGroupIds, this.family.organizations.map(o => o.id), {\n                    owner: {},\n                    shouldRetry: true,\n                });\n\n                const checkout = idCheckout.hydrate({\n                    members: this.family.members,\n                    groups: [...knownGroups, ...groupsWithOrganizations.groups],\n                    organizations: [...this.family.organizations, ...groupsWithOrganizations.organizations],\n                });\n\n                try {\n                    let balanceItems: BalanceItem[] = [];\n                    if (checkout.cart.balanceItems.length) {\n                        const response = await this.$context.authenticatedServer.request({\n                            method: 'GET',\n                            path: `/user/payable-balance/detailed`,\n                            decoder: DetailedPayableBalanceCollection as Decoder<DetailedPayableBalanceCollection>,\n                            shouldRetry: true,\n                            owner: this,\n                            timeout: 60 * 1000,\n                        });\n\n                        const payableBalanceCollection = response.data;\n                        balanceItems = payableBalanceCollection.organizations.flatMap(o => o.balanceItems);\n                    }\n                    else {\n                        console.log('No balance items in cart');\n                    }\n\n                    console.log('Validating checkout');\n                    checkout.validate({\n                        memberBalanceItems: balanceItems,\n                    });\n                }\n                catch (e) {\n                    // Invalid cehckout\n                    console.error('Error validating checkout', e);\n                }\n\n                this.family.checkout = checkout;\n                this.watchCheckout();\n            }\n        }\n        catch (e) {\n            console.error(e);\n        }\n    }\n\n    async saveCheckout() {\n        console.log('Saving checkout');\n        try {\n            const versionBox = new VersionBox(this.family.checkout.convert());\n            const encoded = JSON.stringify(versionBox.encode({ version: Version }));\n            await Storage.keyValue.setItem(this.storageKey, encoded);\n        }\n        catch (e) {\n            console.error(e);\n        }\n    }\n\n    get isAcceptingNewMembers() {\n        return STAMHOOFD.userMode === 'platform' ? true : (this.$context.organization?.isAcceptingNewMembers(this.$context.hasPermissions()) ?? true);\n    }\n\n    async loadMembers() {\n        console.log('MemberManager.loadMembers');\n        if (this.$context.user?.members && !this.$context.user.members.isStale) {\n            this.family.insertFromBlob(this.$context.user.members, true);\n            return;\n        }\n\n        const response = await this.$context.authenticatedServer.request({\n            method: 'GET',\n            path: '/user/members',\n            decoder: MembersBlob as Decoder<MembersBlob>,\n        });\n        const blob = response.data;\n        blob.markReceivedFromBackend();\n        this.family.insertFromBlob(blob, true);\n\n        if (this.$context.user) {\n            this.$context.user.members = blob;\n        }\n    }\n\n    async loadDocuments() {\n        const response = await this.$context.authenticatedServer.request({\n            method: 'GET',\n            path: '/documents',\n            decoder: new ArrayDecoder(DocumentStruct as Decoder<DocumentStruct>),\n        });\n\n        this.family.setDocuments(response.data);\n    }\n}\n","import { AppManager } from \"@stamhoofd/networking\";\n\nexport class ViewportHelper {\n    static currentVh: number | null = null\n    static modern = false\n    static supportsDvh = this.checkDvh();\n\n    static checkDvh() {\n        const element = document.createElement(\"div\");\n        element.style.height = \"100dvh\";\n        //element.inert = true;\n\n        document.body.appendChild(element);\n        const height = parseInt(getComputedStyle(element, null).height, 10);\n        document.body.removeChild(element);\n        return height > 0;\n    }\n\n    static getScrollElement(element: HTMLElement): HTMLElement {\n        const style = window.getComputedStyle(element);\n        if (style.overflowY == \"scroll\" || style.overflow == \"scroll\" || style.overflow == \"auto\" || style.overflowY == \"auto\" || style.overflow == \"overlay\" || style.overflowY == \"overlay\") {\n            return element;\n        } else {\n            if (!element.parentElement) {\n                return document.documentElement;\n            }\n            return this.getScrollElement(element.parentElement);\n        }\n    }\n\n    static setup(modern = true) {\n        this.modern = modern\n        const isPrerender = navigator.userAgent.toLowerCase().indexOf('prerender') !== -1;\n\n        if (isPrerender) {\n            return\n        }        \n        // First we get the viewport height and we multiple it by 1% to get a value for a vh unit\n        this.setVh(window.innerHeight ?? document.body.clientHeight)\n\n        if ('virtualKeyboard' in navigator) {\n            // The VirtualKeyboard API is supported!\n            (navigator as any).virtualKeyboard.overlaysContent = true;\n        }\n\n        const w = window as any;\n        if (w.visualViewport) {\n            let pendingUpdate = false;\n            const viewportHandler = (event) => {\n                //if (pendingUpdate) return;\n                pendingUpdate = true;\n\n                requestAnimationFrame(() => {\n                    pendingUpdate = false;\n                    const viewport = event.target;\n                    const height = w.visualViewport?.height;\n\n                    this.setVh(height);\n                });\n            };\n            //w.visualViewport.addEventListener('scroll', viewportHandler);\n            w.visualViewport.addEventListener('resize', viewportHandler);\n\n            // on iPad resize is not called so we cannot reliably calculate the keyboard height\n            // const resizeObserver = new ResizeObserver(viewportHandler);\n            // resizeObserver.observe(document.body);\n        } else {\n            // We listen to the resize event\n            window.addEventListener(\n                \"resize\",\n                () => {\n                    // We execute the same script as before\n                    this.setVh(window.innerHeight ?? document.body.clientHeight);\n                },\n                { passive: true } as EventListenerOptions\n            );\n\n            // We listen to the resize event\n            window.addEventListener(\n                \"focus\",\n                () => {\n                    // We execute the same script as before\n                    this.setVh(window.innerHeight ?? document.body.clientHeight);\n                },\n                { passive: true } as EventListenerOptions\n            );\n        }\n\n        if (modern) {\n            // Disable scrolling the body\n            // + force overflow contain on browsers that doen't support the property\n\n            // on iOS, when the keyboard is visible, and when the user already scrolled to the bottom of the scroll views\n            // the user can scroll further to scroll on the body, even if overflow is hidden. To prevent this\n            // we correct the scroll position\n            window.addEventListener(\"scroll\", () => {\n                // Disalbe scrolling the body\n                requestAnimationFrame(() => {\n                    if (document.documentElement.scrollTop > 0) {\n                        document.documentElement.scrollTop = 0\n                    }\n\n                    // Fixes an iOS bug where documentElement is not scrolled, but body is\n                    if (document.body.scrollTop > 0) {\n                        document.body.scrollTop = 0\n                    }\n                });\n            }, { passive: true });\n\n            if (AppManager.shared.getOS() === \"iOS\") {\n                let clickedElement: HTMLElement | null = null;\n                \n                document.body.addEventListener(\"touchstart\", (event) => {\n                    if (!event.target) {\n                        clickedElement = null\n                        return;\n                    }\n                    const scrollElement = this.getScrollElement(event.target as HTMLElement)\n\n                    if (scrollElement === document.documentElement || scrollElement.tagName !== \"MAIN\") {\n                        clickedElement = null\n                        return\n                    }\n\n                    clickedElement = scrollElement;\n                    // Show bottom scroll if we are idle at the bottom\n\n                    if (scrollElement.scrollTop == 0 && scrollElement.scrollHeight > scrollElement.clientHeight) {\n                        let paddingTop = parseInt(window.getComputedStyle(scrollElement, null).getPropertyValue('padding-top'))\n                        paddingTop = isNaN(paddingTop) ? 0 : paddingTop\n\n                        scrollElement.style.paddingTop = `${paddingTop + 1}px`\n                        scrollElement.scrollTop = 1\n                    } else if (scrollElement.scrollTop == scrollElement.scrollHeight - scrollElement.clientHeight) {\n                        let paddingBottom = parseInt(window.getComputedStyle(scrollElement, null).getPropertyValue('padding-bottom'))\n                        paddingBottom = isNaN(paddingBottom) ? 0 : paddingBottom\n\n                        const scrollPosition = scrollElement.scrollTop\n                        scrollElement.style.paddingBottom = `${paddingBottom + 1}px`\n\n                        // Prevent the browser from keepign the scroll position at the bottom.\n                        // We need 1 pixel outside the scroll view, so the browser thinks it can scroll in this view,\n                        // so we can prevent that the browser will scroll a different view than this one\n                        scrollElement.scrollTop = scrollPosition\n                    }\n                }, { passive: true })\n\n                document.body.addEventListener(\"touchend\", (event) => {\n                    // Scrollby fixes it on iOS\n                    // setTimeout(() => {\n                    //     requestAnimationFrame(() => {\n                    //         window.scrollBy({\n                    //             top: -1000\n                    //         })\n                    //     });\n                    // }, 200)\n\n                    if (!clickedElement) {\n                        // Force scroll back to top\n                        document.body.scrollTop = 0; // window.scrollTo doesn't work on iOS (not always)\n                        return\n                    }\n\n                    clickedElement.style.paddingTop = \"\"\n                    clickedElement.style.paddingBottom = \"\"\n\n                    if (clickedElement.scrollTop == 1) {\n                        clickedElement.scrollTop = 0\n                    }\n\n                    // Force scroll back to top\n                    document.body.scrollTop = 0; // window.scrollTo doesn't work on iOS (not always)\n\n                    clickedElement = null\n                }, { passive: true })\n            }\n        } else {\n            // eslint-disable-next-line @typescript-eslint/no-empty-function\n            document.body.addEventListener(\"touchstart\", () => { }, { passive: true });\n        }\n    }\n\n    static setVh(viewportHeight: number) {\n        \n        const vh = Math.floor(viewportHeight) / 100;\n        if (!this.currentVh || vh.toFixed(2) != this.currentVh.toFixed(2)) {\n            this.currentVh = vh\n  \n            if (!this.supportsDvh) {\n                document.documentElement.style.setProperty(\"--vh\", `${vh.toFixed(2)}px`);  \n            }\n        }\n\n        if ('virtualKeyboard' in navigator) {\n            // The VirtualKeyboard API is supported!\n            // AWESOME!!!\n            return;\n        }\n\n        // Calculate bottom padding\n        // In modern mode, the body is set to 100dvh / 100vh, and we need to calculate the difference between 100vh and the viewport height\n        // This can be used to calculate the keyboard height\n        if (AppManager.shared.getOS() === \"iOS\") {\n            if (window.visualViewport && this.modern) {\n                const bodyHeight = (window.innerHeight ?? document.body.clientHeight) + window.scrollY;\n                const bottomPadding = bodyHeight - window.visualViewport.height\n\n                if (bottomPadding > 200) {\n                    // We are showing the keyboard\n                    document.documentElement.style.setProperty(\"--keyboard-height\", `${bottomPadding.toFixed(2)}px`);\n                    document.documentElement.style.setProperty(\"--bottom-padding\", `0px`);\n\n                    document.documentElement.style.setProperty(\"--keyboard-open\", `1`);\n                    document.documentElement.style.setProperty(\"--keyboard-closed\", `0`);\n\n                } else {\n                    document.documentElement.style.setProperty(\"--bottom-padding\", `${bottomPadding.toFixed(2)}px`);\n                    document.documentElement.style.setProperty(\"--keyboard-height\", `0px`);\n\n                    document.documentElement.style.setProperty(\"--keyboard-open\", `0`);\n                    document.documentElement.style.setProperty(\"--keyboard-closed\", `1`);\n                }\n            }\n        }\n    }\n\n    static getBottomPadding() {\n        if (window.visualViewport && this.modern) {\n            const bodyHeight = window.innerHeight ?? document.body.clientHeight;\n            const bottomPadding = bodyHeight - window.visualViewport.height\n\n            return Math.round(bottomPadding)\n        }\n        return 0\n\n    }\n\n    static scrollIntoView(element: HTMLElement) {\n        // default scrollIntoView is broken on Safari and sometimes causes the scrollview to scroll too far and get stuck\n        const scrollElement = ViewportHelper.getScrollElement(element)\n        const elRect = element.getBoundingClientRect()\n        const scrollRect = scrollElement.getBoundingClientRect()\n\n        let scrollPosition = elRect.bottom - scrollRect.top - scrollElement.clientHeight + scrollElement.scrollTop\n        // TODO: add the bottom padding of scrollRect as an extra offset (e.g. for the keyboard of st-view)\n\n        let bottomPadding = parseInt(window.getComputedStyle(scrollElement, null).getPropertyValue('padding-bottom'))\n        if (isNaN(bottomPadding)) {\n            bottomPadding = 25\n        }\n        let elBottomPadding = parseInt(window.getComputedStyle(element, null).getPropertyValue('padding-bottom'))\n        if (isNaN(elBottomPadding)) {\n            elBottomPadding = 0\n        }\n        scrollPosition += Math.max(0, bottomPadding - elBottomPadding)\n        scrollPosition = Math.max(0, Math.min(scrollPosition, scrollElement.scrollHeight - scrollElement.clientHeight))\n\n        const exponential = function(x: number): number {\n            return x === 1 ? 1 : 1 - Math.pow(1.5, -20 * x);\n        }\n\n        ViewportHelper.scrollTo(scrollElement, scrollPosition, Math.min(600, Math.max(300, Math.abs(element.scrollTop - scrollPosition) / 2)), exponential)\n    }\n\n    /**\n     * Smooth scroll polyfill for Safari\n     */\n    static scrollTo(element: HTMLElement, endPosition: number, duration: number, easingFunction: (t: number) => number) {\n        //const duration = Math.min(600, Math.max(300, element.scrollTop / 2)) // ms\n        let start: number\n        let previousTimeStamp: number\n\n        const startPosition = element.scrollTop\n\n        let previousPosition = element.scrollTop\n\n        element.style.willChange = \"scroll-position\";\n        (element.style as any).webkitOverflowScrolling = \"auto\"\n        element.style.overflow = \"hidden\"\n\n        // animate scrollTop of element to zero\n        const step = function (timestamp) {\n            if (start === undefined) {\n                start = timestamp;\n\n            }\n            const elapsed = timestamp - start;\n\n            if (element.scrollTop !== previousPosition && start !== timestamp){\n                // The user has scrolled the page: stop animation\n                element.style.overflow = \"\"\n                element.style.willChange = \"\";\n                (element.style as any).webkitOverflowScrolling = \"\"\n                return\n            }\n\n            if (previousTimeStamp !== timestamp) {\n                // Math.min() is used here to make sure the element stops at exactly 200px\n                element.scrollTop = Math.round((startPosition - endPosition) * (1 - easingFunction(elapsed / duration)) + endPosition)\n                element.style.overflow = \"\"\n            }\n\n            if (elapsed < duration) { // Stop the animation after 2 seconds\n                previousTimeStamp = timestamp\n                previousPosition = element.scrollTop\n                window.requestAnimationFrame(step);\n            } else {\n                element.scrollTop = endPosition\n                element.style.overflow = \"\"\n                element.style.willChange = \"\";\n                (element.style as any).webkitOverflowScrolling = \"\"\n            }\n        }\n\n        window.requestAnimationFrame(step);\n    }\n}\n","import { isSimpleError, isSimpleErrors, SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\n\nimport { ViewportHelper } from '../ViewportHelper';\n/***\n * Distributes errors to components that ask for it. The first that asks receives\n */\nexport class ErrorBox {\n    /// Remaining errors to distribute\n    errors: SimpleErrors\n    scrollToElements: [any[], HTMLElement][] = []\n    scrollTimer?: number\n\n    constructor(errors: unknown) {\n        if (isSimpleError(errors)) {\n            this.errors = new SimpleErrors(errors)\n        } else if (isSimpleErrors(errors)) {\n            this.errors = errors\n        } else {\n            this.errors = new SimpleErrors(new SimpleError({\n                code: \"unknown_error\",\n                message: (errors as Error).message\n            }))\n        }\n    }\n\n    /// Register a handler for field.\n    /// Returns a reference to SimpleErrors that will get adjusted when arrays are distrubuted (this is not yet implemented)\n    forFields(fields: string[]): SimpleErrors {\n        const errors = new SimpleErrors()\n\n        for (let index = this.errors.errors.length - 1; index >= 0; index--) {\n            const error = this.errors.errors[index];\n            if (error.doesMatchFields(fields)) {\n                errors.unshiftError(error)\n                this.errors.removeErrorAt(index)\n            }\n        }\n\n        return errors\n    }\n\n    get remaining(): SimpleErrors {\n        // note that this is a reference! So the errors can still change\n        return this.errors\n    }\n\n\n    scrollIntoView(element: HTMLElement) {\n        ViewportHelper.scrollIntoView(element)\n    }\n\n    private fireScroll() {\n        // Take the highest element\n        let minimum: number | undefined\n        let firstElement: HTMLElement | undefined\n\n        for (const [arr, element] of this.scrollToElements) {\n            if (arr.length == 0) {\n                continue;\n            }\n            const pos = element.getBoundingClientRect().top\n            if (minimum === undefined || pos < minimum) {\n                minimum = pos\n                firstElement = element\n            }\n        }\n\n        if (firstElement) {\n            this.scrollIntoView(firstElement)\n        }\n        this.scrollToElements = []\n        this.scrollTimer = undefined\n    }\n\n    /// Scroll to an element, errorBox will decide which one if it is called multiple times\n    // You need to provide the array of errors because it is possible to change the errors after this call\n    // So we need to detect if the errors are empty or not\n    scrollTo(errors: any[], el: HTMLElement) {\n        this.scrollToElements.push([errors, el])\n\n        if (!this.scrollTimer) {\n            this.scrollTimer = window.setTimeout(this.fireScroll.bind(this), 250);\n        }\n    }\n}\n","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => {\n  __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n  return value;\n};\nimport \"vue\";\nclass VueComponent {\n  // This will allow us to pass the vue proxy inside the component\n  constructor() {\n    return new Proxy(this, {\n      get: (object, key, proxy) => {\n        return this.__getter(object, key, proxy);\n      }\n    });\n  }\n  __getter(object, key, _proxy) {\n    return object[key];\n  }\n}\nconst $internalHooks = [\n  \"data\",\n  \"beforeCreate\",\n  \"created\",\n  \"beforeMount\",\n  \"mounted\",\n  \"beforeUnmount\",\n  \"unmounted\",\n  \"beforeUpdate\",\n  \"updated\",\n  \"activated\",\n  \"deactivated\",\n  \"render\",\n  \"errorCaptured\",\n  // 2.5\n  \"serverPrefetch\"\n  // 2.6\n];\nfunction createDecorator(factory) {\n  return (target, key, index) => {\n    const Ctor = typeof target === \"function\" ? target : target.constructor;\n    if (!Ctor.__decorators__) {\n      Ctor.__decorators__ = [];\n    }\n    if (typeof index !== \"number\") {\n      index = void 0;\n    }\n    Ctor.__decorators__.push((options) => factory(options, key, index));\n  };\n}\nfunction buildComponent(OriginalClass, decoratorOptions) {\n  var _a;\n  const mixins = ((_a = OriginalClass.__mixins) == null ? void 0 : _a.slice()) ?? [];\n  if (decoratorOptions && decoratorOptions.mixins) {\n    mixins.push(...decoratorOptions.mixins);\n    delete decoratorOptions.mixins;\n  }\n  if (decoratorOptions && decoratorOptions.data) {\n    mixins.push({\n      data: decoratorOptions.data\n    });\n    delete decoratorOptions.data;\n  }\n  if (decoratorOptions && decoratorOptions.props) {\n    mixins.push({\n      props: decoratorOptions.props\n    });\n    delete decoratorOptions.props;\n  }\n  const options = {\n    ...decoratorOptions ?? {},\n    name: (decoratorOptions == null ? void 0 : decoratorOptions.name) || OriginalClass._componentTag || OriginalClass.name,\n    mixins\n  };\n  const decorators = OriginalClass.__decorators__;\n  if (decorators) {\n    decorators.forEach((fn) => fn(options));\n    delete OriginalClass.__decorators__;\n  }\n  options.data = function() {\n    let vm = this;\n    if (!OriginalClass.prototype.__getter) {\n      throw new Error(\"Component \" + options.name + \" should either extend VueComponent or extend Mixins.\");\n    }\n    OriginalClass.prototype.__getter = function(object, key, proxy) {\n      const v = Reflect.get(object, key, proxy);\n      if (v === void 0) {\n        return vm[key];\n      }\n      return v;\n    };\n    const defaultData = {};\n    const instance = new OriginalClass();\n    vm = {};\n    for (const key of Object.getOwnPropertyNames(instance)) {\n      if (instance[key] !== void 0) {\n        if (options.props && key in options.props) {\n          console.error(\"Setting the default property value via normal properties is not supported. Please use @Prop({default: 123})\", { component: options.name, key, value: instance[key] });\n        } else {\n          defaultData[key] = instance[key];\n        }\n      }\n    }\n    return defaultData;\n  };\n  const proto = OriginalClass.prototype;\n  Object.getOwnPropertyNames(proto).forEach(function(key) {\n    if (key === \"constructor\") {\n      return;\n    }\n    if ($internalHooks.indexOf(key) > -1) {\n      options[key] = proto[key];\n      return;\n    }\n    const descriptor = Object.getOwnPropertyDescriptor(proto, key);\n    if (descriptor.value !== void 0) {\n      if (typeof descriptor.value === \"function\") {\n        (options.methods || (options.methods = {}))[key] = descriptor.value;\n      } else {\n        (options.mixins || (options.mixins = [])).push({\n          data() {\n            return { [key]: descriptor.value };\n          }\n        });\n      }\n    } else if (descriptor.get || descriptor.set) {\n      (options.computed || (options.computed = {}))[key] = {\n        get: descriptor.get,\n        set: descriptor.set\n      };\n    }\n  });\n  return options;\n}\nfunction Component(options) {\n  if (typeof options === \"function\") {\n    return buildComponent(options);\n  }\n  return (OriginalClass) => buildComponent(OriginalClass, options);\n}\nfunction Mixins(...mixins) {\n  var _a;\n  return _a = class extends VueComponent {\n  }, __publicField(_a, \"__mixins\", mixins), _a;\n}\nfunction injectPropertyDecorator(target, key, options) {\n  createDecorator((componentOptions, k) => {\n    if (!componentOptions.props) {\n      componentOptions.props = {};\n    }\n    componentOptions.props[k] = options ?? {};\n  })(target, key);\n}\nfunction Prop(optionsOrTarget, key) {\n  if (key) {\n    return injectPropertyDecorator(optionsOrTarget, key, {});\n  }\n  return (target, key2) => {\n    return injectPropertyDecorator(target, key2, optionsOrTarget);\n  };\n}\nfunction Ref(refKey) {\n  return createDecorator((options, key) => {\n    options.computed = options.computed || {};\n    options.computed[key] = {\n      cache: false,\n      get() {\n        return this.$refs[refKey || key];\n      }\n    };\n  });\n}\nfunction Watch(path, watchOptions = {}) {\n  return createDecorator((componentOptions, handler) => {\n    componentOptions.watch || (componentOptions.watch = /* @__PURE__ */ Object.create(null));\n    const watch = componentOptions.watch;\n    if (typeof watch[path] === \"object\" && !Array.isArray(watch[path])) {\n      watch[path] = [watch[path]];\n    } else if (typeof watch[path] === \"undefined\") {\n      watch[path] = [];\n    }\n    watch[path].push({ handler, ...watchOptions });\n  });\n}\nclass Vue extends VueComponent {\n  constructor() {\n    super();\n    console.warn(\"Vue constructor is still used. Please replace all extends Vue from code with extends VueComponent\");\n  }\n}\nexport {\n  Component,\n  Mixins,\n  Prop,\n  Ref,\n  Vue,\n  VueComponent,\n  Watch\n};\n","<template>\n    <transition\n        appear\n        name=\"error-box-transition\"\n        @before-enter=\"beforeEnter\"\n        @enter=\"enter\"\n        @after-enter=\"afterEnter\"\n        @leave=\"leave\"\n    >\n        <div>\n            <div class=\"error-box-parent\">\n                <div class=\"error-box\">\n                    <slot />\n                </div>\n            </div>\n        </div>\n    </transition>\n</template>\n\n<script lang=\"ts\">\nimport { Component, VueComponent } from \"@simonbackx/vue-app-navigation/classes\";\n\n@Component({})\nexport default class STErrorBox extends VueComponent {\n    beforeEnter(el: HTMLElement) {\n        el.style.opacity = \"0\";\n    }\n\n    enter(el: HTMLElement) {\n        const height = el.offsetHeight;\n        el.style.height = \"0\";\n\n        requestAnimationFrame(() => {\n            el.style.height = height+\"px\";\n            el.style.opacity = \"1\";\n        });\n\n    }\n\n    afterEnter(el: HTMLElement) {\n        el.style.height = \"\";\n    }\n\n\n    leave(el: HTMLElement) {\n        const height = el.offsetHeight;\n        el.style.height = height+\"px\";\n\n        requestAnimationFrame(() => {\n            el.style.height = \"0px\";\n            el.style.opacity = \"0\";\n        });\n\n    }\n}\n</script>\n\n<style lang=\"scss\">\n    @use '@stamhoofd/scss/base/variables' as *;\n\n    .error-box-transition-enter-active, .error-box-transition-leave-active {\n        transition: height 0.2s, opacity 0.2s;\n\n        @media (prefers-reduced-motion: reduce) {\n            transition: none;\n        }\n    }\n\n    .error-box-parent > .error-box {\n        animation: shake 0.82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;\n        transform: translate3d(0, 0, 0);\n        backface-visibility: hidden;\n        perspective: 1000px;\n\n        @media (prefers-reduced-motion: reduce) {\n            animation: none;\n        }\n    }\n\n    .error-box-parent {\n        padding: 5px 0;\n    }\n\n    @keyframes shake {\n        10%,\n        90% {\n            transform: translate3d(-1px, 0, 0);\n        }\n\n        20%,\n        80% {\n            transform: translate3d(2px, 0, 0);\n        }\n\n        30%,\n        50%,\n        70% {\n            transform: translate3d(-4px, 0, 0);\n        }\n\n        40%,\n        60% {\n            transform: translate3d(4px, 0, 0);\n        }\n    }\n</style>\n","<template>\n    <div ref=\"errors\">\n        <template v-for=\"error in errors\" :key=\"error.id\">\n            <STErrorBox>\n                {{ getErrorMessage(error) }}\n            </STErrorBox>\n        </template>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { Component, Prop, VueComponent, Watch } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport { ErrorBox } from \"./ErrorBox\"\nimport STErrorBox from \"./STErrorBox.vue\"\nimport { Ref, unref } from 'vue';\n\n@Component({\n    components: {\n        STErrorBox\n    }\n})\nexport default class STErrorsDefault extends VueComponent {\n    @Prop() \n        errorBox!: ErrorBox | Ref<ErrorBox> | null;\n    \n    errors: SimpleError[] = [];\n\n    mounted() {\n        this.onNewErrors(unref(this.errorBox))\n    }\n\n    getErrorMessage(error: SimpleError) {\n        if (error.hasCode(\"network_error\") || error.hasCode(\"network_timeout\")) {\n            return \"Geen of slechte internetverbinding\"\n        }\n        return error.getHuman()\n    }\n\n    @Watch('errorBox')\n    onNewErrors(val: ErrorBox | Ref<ErrorBox> | null ) {\n        if (!val) {\n            this.errors = [];\n            return;\n        }\n        // Wait for next tick, to prevent a useless rerender of errors that will get removed by other inputs\n        this.$nextTick(() => {\n            const errors = unref(val).remaining\n            this.errors = errors.errors\n\n            unref(val).scrollTo(this.errors, this.$refs.errors as HTMLElement)\n        });\n        \n    }\n}\n</script>\n\n<style lang=\"scss\">\n    .error {\n        color: red;\n    }\n</style>\n","<template>\n    <div ref=\"errors\" :class=\"{'input-errors': errors.length > 0}\">\n        <slot />\n        <div>\n            <template v-for=\"error in errors\" :key=\"error.id\">\n                <STErrorBox>\n                    {{ error.human || error.message }}\n                </STErrorBox>\n            </template>\n        </div>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\nimport { Component, Prop, VueComponent, Watch } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport { ErrorBox } from \"./ErrorBox\"\nimport STErrorBox from \"./STErrorBox.vue\"\n\n@Component({\n    components: {\n        STErrorBox\n    }\n})\nexport default class STErrorsInput extends VueComponent {\n    @Prop({ default: \"\" }) errorFields: string;\n    @Prop({ default: null }) errorBox: ErrorBox | null;\n    errors: SimpleError[] = [];\n\n    @Watch('errorBox')\n    onNewErrors(val: ErrorBox) {\n        if (!val) {\n            this.errors = [];\n            return;\n        }\n        let errors: SimpleErrors\n        \n        if (this.errorFields === \"*\") {\n            errors = val.remaining\n        } else {\n            errors = val.forFields(this.errorFields.split(\",\"))\n        }\n        \n        this.errors = errors.errors\n        val.scrollTo(this.errors, this.$refs.errors as HTMLElement)\n    }\n}\n</script>\n","import { nextTick } from 'vue';\n\nexport type Validation = () => Promise<boolean> | boolean;\n/***\n * Pass a Validator instance to mutliple components so you can validate the state of multiple input components at once.\n * This is usefull because some validation already happens on the fly in components, that way we can reuse that behaviour\n *  in a final validation before submitting a form.\n * Components are responsible for their own error showing\n */\nexport class Validator {\n    validations: Map<any, Validation> = new Map();\n    keyMap: Map<string, Set<any>> = new Map();\n\n    addValidation(owner: any, validation: Validation, key?: string) {\n        this.validations.set(owner, validation);\n        if (key) {\n            const set = this.keyMap.get(key);\n            if (set) {\n                set.add(owner);\n            }\n            else {\n                this.keyMap.set(key, new Set([owner]));\n            }\n        }\n    }\n\n    removeValidation(owner: any, key?: string) {\n        this.validations.delete(owner);\n\n        if (key) {\n            const set = this.keyMap.get(key);\n            if (set) {\n                set.delete(owner);\n                if (set.size === 0) {\n                    this.keyMap.delete(key);\n                }\n            }\n        }\n    }\n\n    /**\n     * Validate all fields\n     */\n    async validate(): Promise<boolean> {\n        let valid = true;\n\n        // Because the async validation can cause Vue performance issues (a validator updates a value -> vue update caused due to async validation so all the updates don't happen in one go)\n        // we need to be very careful with async validation and try to perform them in one go.\n        const promises: Promise<boolean>[] = [];\n        for (const [_, validation] of this.validations) {\n            const result = validation();\n\n            if (typeof result === 'boolean') {\n                if (!result) {\n                    valid = false;\n                    // we do not return yet, since validation method can have side effects in UI\n                }\n            }\n            else {\n                promises.push(result);\n            }\n        }\n\n        if (promises.length > 0) {\n            const results = await Promise.all(promises);\n            valid = valid && results.every(r => r);\n        }\n\n        // Process vue updates before returning value\n        await nextTick();\n        return valid;\n    }\n\n    async validateByKey(key: string): Promise<boolean> {\n        const validationKeys = this.keyMap.get(key);\n        if (!validationKeys) {\n            // No validators for this key, which means it is valid\n            return true;\n        }\n\n        let isValid = true;\n\n        for (const key of validationKeys) {\n            const validation = this.validations.get(key);\n            if (validation && !await validation()) {\n                isValid = false;\n            }\n        }\n\n        await nextTick();\n        return isValid;\n    }\n}\n","import { reactive } from \"vue\";\n\nimport { ErrorBox } from \"./ErrorBox\";\nimport { Validator } from \"./Validator\";\n\nexport function useErrors(options?: {validator?: Validator|null}) {\n    return reactive({\n        errorBox: null as ErrorBox | null,\n        validator: options?.validator ?? new Validator()\n    }) as {\n        errorBox: ErrorBox | null,\n        validator: Validator\n    }\n}\n","import { onBeforeUnmount } from 'vue';\nimport { Validation, Validator } from './Validator';\n\nexport function useValidation(validator: Validator, validation: Validation, key?: string) {\n    const owner = {};\n    validator.addValidation(owner, validation, key);\n\n    onBeforeUnmount(() => {\n        validator.removeValidation(owner);\n    });\n}\n","export class EmailStyler {\n    static async format(html: string, subject: string): Promise<{ text: string; html: string }> {\n        const imported = ((await import(/* webpackChunkName: \"email-css\" */ './email.url.scss?inline')).default);\n\n        // Force replacement value\n        const primaryColor = '{{primaryColor}}';\n        const primaryColorContrast = '{{primaryColorContrast}}';\n        const scss = imported.replaceAll('#0053ff', primaryColor) as string;\n\n        let styles = scss;\n        const hrCSS = 'height: 2px;background: #e7e7e7; border-radius: 1px; padding: 0; margin: 20px 0; outline: none; border: 0;';\n        styles += ' hr {' + hrCSS + '}';\n\n        const buttonCSS = 'margin: 0; text-decoration: none; font-size: 16px; font-weight: bold; color: ' + primaryColorContrast + '; padding: 0 27px; line-height: 42px; background: ' + primaryColor + '; text-align: center; border-radius: 7px; touch-action: manipulation; display: inline-block; transition: 0.2s transform, 0.2s opacity;';\n        styles += ' .button.primary { ' + buttonCSS + ' } .button.primary:active { transform: scale(0.95, 0.95); } ';\n\n        const inlineLinkCSS = 'margin: 0; text-decoration: underline; font-size: inherit; font-weight: inherit; color: inherit; touch-action: manipulation;';\n        styles += ' .inline-link, .inline-link:link, .inline-link:visited, .inline-link:active, .inline-link:hover { ' + inlineLinkCSS + ' } .inline-link:active { opacity: 0.5; } ';\n\n        const descriptionCSS = 'color: #5e5e5e;';\n        styles += ' .description { ' + descriptionCSS + ' } ';\n\n        // Transform HTML into text + do replacements\n        const element = document.createElement('div.email-style-apply-here');\n        element.innerHTML = html;\n\n        const elements = element.querySelectorAll('span[data-type=\"smartVariable\"]');\n        for (const el of elements) {\n            el.parentElement!.replaceChild(document.createTextNode('{{' + el.getAttribute('data-id') + '}}'), el);\n        }\n\n        const blockSmartVariables = element.querySelectorAll('div[data-type=\"smartVariableBlock\"]');\n        for (const el of blockSmartVariables) {\n            (el as HTMLElement).innerText = '{{' + el.getAttribute('data-id') + '}}';\n        }\n\n        const buttonElements = element.querySelectorAll('span.button');\n        for (const el of buttonElements) {\n            const button = document.createElement('a');\n            button.innerText = (el as HTMLElement).innerText;\n            button.className = el.className;\n            button.setAttribute('href', el.getAttribute('href') ?? '');\n            button.setAttribute('target', el.getAttribute('target') ?? '');\n            el.parentElement!.replaceChild(button, el);\n        }\n\n        const inlineButtons = element.querySelectorAll('span[data-type=\"smartButtonInline\"]');\n        for (const el of inlineButtons) {\n            const button = document.createElement('a');\n            button.innerHTML = (el as HTMLElement).innerHTML;\n            button.className = 'inline-link';\n            button.setAttribute('href', el.getAttribute('href') ?? '');\n            button.setAttribute('target', el.getAttribute('target') ?? '');\n            el.parentElement!.replaceChild(button, el);\n        }\n\n        // add force add padding and margin inline\n        const blocks = element.querySelectorAll('h1,h2,h3,h4');\n        for (const el of blocks) {\n            (el as any).setAttribute('style', 'margin: 0; padding: 0;');\n        }\n\n        const ps = element.querySelectorAll('p');\n        for (const el of ps) {\n            (el as any).setAttribute('style', 'margin: 0; padding: 0; line-height: 1.4;');\n        }\n\n        // Force HR\n        const hrElements = element.querySelectorAll('hr');\n        for (const el of hrElements) {\n            (el as any).setAttribute('style', hrCSS); // style.cssText doesn't work reliably (skips some properties)\n        }\n\n        // Force HR\n        const inlineLinkElements = element.querySelectorAll('.inline-link');\n        for (const el of inlineLinkElements) {\n            (el as any).setAttribute('style', inlineLinkCSS); // style.cssText doesn't work reliably (skips some properties)\n        }\n\n        // Replace all buttons with tables\n        const buttons = element.querySelectorAll('.button.primary');\n        for (const el of buttons) {\n            (el as any).setAttribute('style', buttonCSS); // style.cssText doesn't work reliably (skips some properties)\n\n            // Old e-mail client fix for buttons\n            el.insertAdjacentHTML('beforebegin', `<table width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" style=\"margin: 5px 0;\">\n<tr>\n    <td>\n        <table cellspacing=\"0\" cellpadding=\"0\">\n            <tr>\n                <td style=\"border-radius: 7px;\" bgcolor=\"${primaryColor}\">\n                ${el.outerHTML}\n                </td>\n            </tr>\n        </table>\n    </td>\n</tr>\n</table>`);\n            el.parentElement!.removeChild(el);\n        }\n\n        // Force button\n        const buttonDescriptionElements = element.querySelectorAll('.description');\n        for (const el of buttonDescriptionElements) {\n            (el as any).setAttribute('style', descriptionCSS); // style.cssText doesn't work reliably (skips some properties)\n        }\n\n        // add empty paragraph <br>'s\n        const emptyP = element.querySelectorAll('p:empty');\n        for (const el of emptyP) {\n            el.appendChild(document.createElement('br'));\n        }\n\n        const escapeSubject = document.createElement('div');\n        escapeSubject.innerText = subject;\n\n        html = `<!DOCTYPE html>\n<html>\n\n<head>\n<meta charset=\"utf-8\" />\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\" />\n<title>${escapeSubject.innerHTML}</title>\n<style type=\"text/css\">${styles}</style>\n</head>\n\n<body>\n${element.innerHTML}\n</body>\n\n</html>`;\n\n        return {\n            html,\n            text: element.innerText,\n        };\n    }\n}\n","import { isReactive, markRaw } from 'vue';\n\ntype Listener<E, Value> = (value: Value, type: E) => Promise<void>;\n\n/**\n * Controls the fetching and decrypting of members\n */\nexport class EventBus<E, Value> {\n    protected listeners: Map<any, { type: E; listener: Listener<E, Value> }[]> = markRaw(new Map());\n\n    addListener<T extends E>(owner: any, type: T, listener: Listener<T, Value>) {\n        if (isReactive(owner)) {\n            console.warn('Adding a listener with a proxy object. This is not recommended and can cause bugs.');\n        }\n\n        const existing = this.listeners.get(owner);\n        if (existing) {\n            existing.push({ type, listener });\n        }\n        else {\n            this.listeners.set(owner, [{ type, listener }]);\n        }\n    }\n\n    removeListener(owner: any) {\n        if (isReactive(owner)) {\n            console.warn('Removing a listener with a proxy object. This is not recommended and can cause bugs.');\n        }\n\n        this.listeners.delete(owner);\n    }\n\n    async sendEvent(type: E, value: Value) {\n        const values: Promise<any>[] = [];\n        for (const owner of this.listeners.values()) {\n            for (const listener of owner) {\n                if (listener.type == type) {\n                    values.push(listener.listener(value, type));\n                }\n            }\n        }\n        return await Promise.all(values);\n    }\n}\n\nexport const GlobalEventBus = new EventBus<string, any>();\n","import { useFocused } from '@simonbackx/vue-app-navigation';\nimport { onActivated, onBeforeUnmount, onDeactivated, onMounted, unref } from 'vue';\n\nexport type KeyMatcher = (key: string, modifiers: { shift: boolean; ctrl: boolean; alt: boolean; meta: boolean }) => boolean;\n\nexport function useKeyDown(keyHandler: KeyMatcher) {\n    const isFocused = useFocused();\n    const onKey = (event: KeyboardEvent) => {\n        if (event.defaultPrevented || event.repeat) {\n            return;\n        }\n\n        if (!unref(isFocused)) {\n            return;\n        }\n\n        const key = event.key;\n\n        if (keyHandler(key, {\n            shift: event.shiftKey,\n            ctrl: event.ctrlKey,\n            alt: event.altKey,\n            meta: event.metaKey,\n        }) === true) {\n            event.preventDefault();\n        }\n    };\n\n    const remove = () => {\n        document.removeEventListener('keydown', onKey);\n    };\n\n    const add = () => {\n        remove();\n        document.addEventListener('keydown', onKey);\n    };\n\n    onActivated(() => {\n        add();\n    });\n\n    onMounted(() => {\n        add();\n    });\n\n    onBeforeUnmount(() => {\n        remove();\n    });\n\n    onDeactivated(() => {\n        remove();\n    });\n}\n","import { useKeyDown } from './useKeyDown';\n\nexport function useArrowUpDown(actions: { up: () => unknown | Promise<void>; down: () => unknown | Promise<void> }) {\n    return useKeyDown((key) => {\n        if (key === 'ArrowLeft' || key === 'ArrowUp' || key === 'PageUp') {\n            void actions.up();\n            return true;\n        }\n        else if (key === 'ArrowRight' || key === 'ArrowDown' || key === 'PageDown') {\n            void actions.down();\n            return true;\n        }\n        return false;\n    });\n}\n","import { SessionContext } from \"@stamhoofd/networking\";\nimport { inject, Ref, toRef } from \"vue\";\n\nexport function useContext(): Ref<SessionContext> {\n    const refOrReal = inject('$context', null) as SessionContext|null;\n    return toRef(refOrReal) as Ref<SessionContext>\n}\n","import { ContextPermissions } from \"@stamhoofd/networking\";\nimport { useContext } from \"./useContext\";\n\nexport function useAuth(): ContextPermissions {\n    const context = useContext()\n    return context.value.auth;\n}\n","import { ComponentWithProperties, useShow } from '@simonbackx/vue-app-navigation';\nimport { computed, getCurrentInstance, Ref } from 'vue';\nimport { useArrowUpDown } from './useArrowUpDown';\n\nexport function useBackForward<T extends { id: string }, Name extends string, Props>(name: Name, props: Props & {\n    getPrevious: ((current: T) => T | null) | null;\n    getNext: ((current: T) => T | null) | null;\n} & Record<Name, T>, otherProps?: Ref<Partial<Props>>) {\n    useArrowUpDown({\n        up: goBack,\n        down: goForward,\n    });\n    const show = useShow();\n\n    const hasPrevious = computed(() => {\n        if (!props.getPrevious) {\n            return false;\n        }\n        return !!props.getPrevious(props[name]);\n    });\n\n    const hasNext = computed(() => {\n        if (!props.getNext) {\n            return false;\n        }\n        return !!props.getNext(props[name]);\n    });\n\n    const instance = getCurrentInstance();\n    async function seek(previous = true) {\n        const object = previous ? props.getPrevious?.(props[name]) : props.getNext?.(props[name]);\n\n        if (!object) {\n            return;\n        }\n        const component = new ComponentWithProperties(instance!.type, {\n            ...props,\n            ...otherProps?.value,\n            [name]: object,\n        });\n\n        await show({\n            components: [component],\n            replace: 1,\n            adjustHistory: false,\n            reverse: previous,\n            animated: false,\n            url: object.id,\n        });\n    }\n\n    async function goBack() {\n        await seek(true);\n    }\n\n    async function goForward() {\n        await seek(false);\n    }\n\n    return {\n        hasNext,\n        hasPrevious,\n        goBack,\n        goForward,\n    };\n}\n","import { I18nController } from '@stamhoofd/frontend-i18n';\nimport { Country } from '@stamhoofd/structures';\nimport { Ref, computed } from 'vue';\n\nexport function useCountry(): Ref<Country> {\n    return computed(() => I18nController.shared?.countryCode ?? Country.Belgium);\n}\n","import { Ref, ref } from \"vue\";\n\nconst width = ref(0);\nlet added = false;\nfunction add() {\n    added = true;\n    width.value = document.documentElement.clientWidth;\n\n    window.addEventListener('resize', () => {\n        width.value = document.documentElement.clientWidth;\n    }, { passive: true })\n}\n\nexport function useDeviceWidth(): Ref<number> {\n    if (!added) {\n        add();\n    }\n    return width;\n}\n","import { AutoEncoder, NonScalarIdentifiable, PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { computed } from 'vue';\n\nexport function useDraggableArray<T extends AutoEncoder & NonScalarIdentifiable<any>>(getter: () => T[], addPatch: (newPatch: PatchableArrayAutoEncoder<T>) => void) {\n    return computed({\n        get: getter,\n        set: (records: T[]) => {\n            // Create move patch\n            const recordsPatch = new PatchableArray() as PatchableArrayAutoEncoder<T>;\n            const original = getter();\n\n            for (const record of records.slice().reverse()) {\n                if (!record) {\n                    console.warn('Received undefined value in draggable patch');\n                    continue;\n                }\n\n                // Check if records exists\n                if (original.find(o => o.id === record.id)) {\n                    recordsPatch.addMove(record.id, null);\n                }\n                else {\n                    // This is a new one (happens when dragging between lists)\n                    recordsPatch.addPut(record, null);\n                }\n            }\n\n            // Check deleted\n            for (const r of original) {\n                if (!records.find(rr => rr.id === r.id)) {\n                    recordsPatch.addDelete(r.id);\n                }\n            }\n\n            addPatch(recordsPatch);\n        },\n    });\n}\n\nexport function useDraggableArrayIds<T extends AutoEncoder & NonScalarIdentifiable<any>>(getter: () => T[], addPatch: (newPatch: PatchableArray<string, string, string>) => void) {\n    return computed({\n        get: getter,\n        set: (records: T[]) => {\n            // Create move patch\n            const recordsPatch = new PatchableArray<string, string, string>();\n            const original = getter();\n\n            for (const record of records.slice().reverse()) {\n                if (!record) {\n                    console.warn('Received undefined value in draggable patch');\n                    continue;\n                }\n\n                // Check if records exists\n                if (original.find(o => o.id === record.id)) {\n                    recordsPatch.addMove(record.id, null);\n                }\n                else {\n                    // This is a new one (happens when dragging between lists)\n                    recordsPatch.addPut(record.id, null);\n                }\n            }\n\n            // Check deleted\n            for (const r of original) {\n                if (!records.find(rr => rr.id === r.id)) {\n                    recordsPatch.addDelete(r.id);\n                }\n            }\n\n            addPatch(recordsPatch);\n        },\n    });\n}\n","import { AutoEncoder, AutoEncoderPatchType, PartialWithoutMethods } from '@simonbackx/simple-encoding';\nimport { Ref, computed } from 'vue';\n\nexport function useEmitPatch<T extends AutoEncoder>(props: any, emit: any, propName: string): {\n    createPatch: () => AutoEncoderPatchType<T>;\n    patched: Ref<T>;\n    addPatch: (newPatch: PartialWithoutMethods<AutoEncoderPatchType<T>>) => void;\n} {\n    const createPatch = () => {\n        return ('id' in props[propName] ? props[propName].static.patch({ id: props[propName].id }) : props[propName].static.patch({})) as AutoEncoderPatchType<T>;\n    };\n\n    return {\n        createPatch,\n        patched: computed(() => props[propName]) as Ref<T>,\n        addPatch: (newPatch: PartialWithoutMethods<AutoEncoderPatchType<T>>) => {\n            emit('patch:' + propName, createPatch().patch(props[propName].static.patch(newPatch)));\n        },\n    } as any;\n}\n","import { AutoEncoder, NonScalarIdentifiable, PatchableArrayAutoEncoder, AutoEncoderPatchType, PatchableArray } from \"@simonbackx/simple-encoding\"\n\nexport function usePatchableArray<T extends AutoEncoder & NonScalarIdentifiable<string|number>>(patchArray: (array: PatchableArrayAutoEncoder<T>) => void) {\n    return {\n        addPatch: (patch: AutoEncoderPatchType<T>) => {\n            if (!patch.id) {\n                throw new Error('Expected a patch with an id at usePatchItemInArray.patchItem for ' + patch)\n            }\n            const arr = new PatchableArray() as PatchableArrayAutoEncoder<T>\n            arr.addPatch(patch)\n            patchArray(arr)\n        },\n\n        addPut: (put: T, after?: string | number | null | undefined) => {\n            const arr = new PatchableArray() as PatchableArrayAutoEncoder<T>\n            arr.addPut(put, after)\n            patchArray(arr)\n        },\n\n        addDelete: (id: string | number) => {\n            const arr = new PatchableArray() as PatchableArrayAutoEncoder<T>\n            arr.addDelete(id)\n            patchArray(arr)\n        }\n    }\n}\n","import { AutoEncoder, NonScalarIdentifiable, AutoEncoderPatchType, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { Ref, computed } from 'vue';\nimport { usePatchableArray } from './usePatchableArray';\n\nexport function useEmitPatchArray<Props, PropName extends string & keyof Props, T extends AutoEncoder & NonScalarIdentifiable<any>>(props: Props, emit: ((d: `patch:${PropName}`, value: PatchableArrayAutoEncoder<T>) => unknown), propName: PropName): {\n    addArrayPatch: (newPatch: PatchableArrayAutoEncoder<T>) => void;\n    addPatch: (newPatch: AutoEncoderPatchType<T>) => void;\n    addPut: (p: T) => void;\n    addDelete: (id: string) => void;\n    patched: Ref<T[]>;\n} {\n    const addArrayPatch = (newPatch: PatchableArrayAutoEncoder<T>) => {\n        emit(('patch:' + propName) as `patch:${PropName}`, newPatch);\n    };\n\n    const { addPatch, addPut, addDelete } = usePatchableArray(addArrayPatch);\n\n    return {\n        addArrayPatch,\n        addPatch,\n        addPut,\n        addDelete,\n        patched: computed(() => props[propName]) as Ref<T[]>,\n    };\n}\n","import { Organization } from '@stamhoofd/structures';\nimport { Ref, computed } from 'vue';\nimport { useContext } from './useContext';\n\nexport function useOrganization(): Ref<Organization | null> {\n    const context = useContext();\n    return computed(() => context.value.organization);\n}\n\nexport function useRequiredOrganization(): Ref<Organization> {\n    const context = useContext();\n    return computed(() => context.value.organization!);\n}\n","import { usePlatformManager } from \"@stamhoofd/networking\";\nimport { Platform } from \"@stamhoofd/structures\";\nimport { Ref, computed } from \"vue\";\n\nexport function usePlatform(): Ref<Platform> {\n    const platformManager = usePlatformManager();\n    return computed(() => platformManager.value.$platform)\n}\n","import { Organization, Platform } from '@stamhoofd/structures';\nimport { useOrganization } from './useOrganization';\nimport { usePlatform } from './usePlatform';\nimport { useContext } from './useContext';\nimport { SessionContext } from '@stamhoofd/networking';\n\nfunction checkFeatureFlag(flag: string, context: SessionContext, platform: Platform, organization?: Organization | null): boolean {\n    if (context.user && context.user.email.endsWith('@stamhoofd.be') && STAMHOOFD.environment === 'production') {\n        return true;\n    }\n    if (platform.config.featureFlags.includes(flag)) {\n        return true;\n    }\n    return organization?.privateMeta?.featureFlags.includes(flag) ?? false;\n}\n\nexport function useFeatureFlag(): (flag: string) => boolean {\n    const organization = useOrganization();\n    const platform = usePlatform();\n    const context = useContext();\n\n    return (flag: string) => {\n        return checkFeatureFlag(flag, context.value, platform.value, organization.value);\n    };\n}\n\nexport function manualFeatureFlag(flag: string, context: SessionContext, organization?: Organization | null): boolean {\n    return checkFeatureFlag(flag, context, Platform.shared, organization ?? context.organization ?? null);\n}\n","import { onMounted, onUnmounted } from \"vue\";\nimport { GlobalEventBus } from \"../EventBus\";\n\nexport function useGlobalEventListener<Value>(eventName: string, handler: (value: Value) => Promise<void>) {\n    const owner = {};\n\n    onMounted(() => {\n        GlobalEventBus.addListener(owner, eventName, handler);\n    });\n\n    onUnmounted(() => {\n        GlobalEventBus.removeListener(owner);\n    });\n}\n","import { onBeforeUnmount, ref } from \"vue\";\n\nexport function useInterval(method: (data: {stop: () => void}) => unknown, ms: number) {\n    const data = {\n        stop: () => {\n            clearInterval(interval);\n        }\n    }\n\n    const running = ref(false);\n    const handler = async () => {\n        if (running.value) {\n            return;\n        }\n        running.value = true;\n        try {\n            await method(data)\n        } catch (e) {\n            console.error('Error in useInterval', e)\n        }\n        running.value = false;\n    }\n    \n    const interval = setInterval(() => {\n        handler().catch(console.error)\n    }, ms);\n\n    onBeforeUnmount(() => {\n        clearInterval(interval);\n    });\n}\n","import { getCurrentInstance } from 'vue';\n\nexport function useIsIOS(): boolean {\n    const app = getCurrentInstance()!;\n    return app.appContext.config.globalProperties.$isIOS;\n}\n","import { getCurrentInstance } from \"vue\";\n\nexport function useIsMobile(): boolean {\n    const app = getCurrentInstance()!;\n    return app.appContext.config.globalProperties.$isMobile;\n}\n","import { AutoEncoder, AutoEncoderPatchType, PartialWithoutMethods, patchContainsChanges, PatchType } from '@simonbackx/simple-encoding';\nimport { Version } from '@stamhoofd/structures';\nimport { computed, Ref, ref, unref } from 'vue';\n\nexport function usePatch<T extends AutoEncoder>(obj: T | Ref<T>): {\n    createPatch: () => AutoEncoderPatchType<T>;\n    patched: Ref<T>;\n    patch: Ref<AutoEncoderPatchType<T>>;\n    addPatch: (newPatch: PartialWithoutMethods<AutoEncoderPatchType<T>>) => void;\n    hasChanges: Ref<boolean>;\n    reset: () => void;\n} {\n    const initialValue = unref(obj);\n    if (!initialValue) {\n        throw new Error('Expected a reference with an initial value at usePatch');\n    }\n    const patch = ref('id' in initialValue ? initialValue.static.patch({ id: initialValue.id }) : initialValue.static.patch({})) as Ref<AutoEncoderPatchType<T>>;\n\n    const createPatch = () => {\n        const iv = unref(obj);\n        return ('id' in iv ? iv.static.patch({ id: iv.id }) : iv.static.patch({})) as AutoEncoderPatchType<T>;\n    };\n\n    return {\n        createPatch,\n        patch,\n        patched: computed(() => {\n            return unref(obj).patch(patch.value);\n        }),\n        addPatch: (newPatch: PartialWithoutMethods<AutoEncoderPatchType<T>>) => {\n            patch.value = patch.value.patch(unref(obj).static.patch(newPatch));\n        },\n        hasChanges: computed(() => {\n            return patchContainsChanges(patch.value as PatchType<T>, unref(obj), { version: Version });\n        }),\n        reset: () => {\n            patch.value = createPatch();\n        },\n    };\n}\n","import { AutoEncoder, AutoEncoderPatchType, NonScalarIdentifiable, PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { computed, ref, Ref, unref } from 'vue';\n\nexport function usePatchArray<T extends AutoEncoder & NonScalarIdentifiable<any>>(obj: T[] | Ref<T[]>): {\n    patched: Ref<T[]>;\n    patch: Ref<PatchableArrayAutoEncoder<T>>;\n    addArrayPatch: (newPatch: PatchableArrayAutoEncoder<T>) => void;\n    addPatch: (newPatch: AutoEncoderPatchType<T>) => void;\n    addPut: (p: T) => void;\n    addDelete: (id: string) => void;\n    hasChanges: Ref<boolean>;\n} {\n    const patch = ref(new PatchableArray()) as Ref<PatchableArrayAutoEncoder<T>>;\n\n    return {\n        patch,\n        patched: computed(() => {\n            return patch.value.applyTo(unref(obj)) as T[];\n        }),\n        addArrayPatch: (newPatch: PatchableArrayAutoEncoder<T>) => {\n            patch.value = patch.value.patch(newPatch);\n        },\n        addPatch: (newPatch: AutoEncoderPatchType<T>) => {\n            patch.value.addPatch(newPatch);\n        },\n        addPut: (p: T) => {\n            patch.value.addPut(p);\n        },\n        addDelete: (id: string) => {\n            patch.value.addDelete(id);\n        },\n        hasChanges: computed(() => {\n            return patch.value.changes.length > 0;\n        }),\n    };\n}\n","import { AutoEncoder, NonScalarIdentifiable, PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { computed, Ref, unref } from 'vue';\n\nexport function usePatchMoveUpDown<T extends AutoEncoder & NonScalarIdentifiable<any>>(\n    inList: Ref<T[]> | T[],\n    addPatch: (arrPatch: PatchableArrayAutoEncoder<T>) => void,\n) {\n    return {\n        up: (movingItemId: string | number) => {\n            const list = unref(inList);\n            const index = list.findIndex(c => c.id === movingItemId);\n            if (index === -1 || index === 0) {\n                return;\n            }\n\n            const moveTo = index - 2;\n            const p = new PatchableArray() as PatchableArrayAutoEncoder<T>;\n            p.addMove(movingItemId, list[moveTo]?.id ?? null);\n            addPatch(p);\n        },\n        down: (movingItemId: string | number) => {\n            const list = unref(inList);\n            const index = list.findIndex(c => c.id === movingItemId);\n            if (index === -1 || index >= list.length - 1) {\n                return;\n            }\n\n            const moveTo = index + 1;\n            const p = new PatchableArray() as PatchableArrayAutoEncoder<T>;\n            p.addMove(movingItemId, list[moveTo]?.id ?? null);\n            addPatch(p);\n        },\n        canMoveUp: (movingItemId: string | number) => {\n            const list = unref(inList);\n            const index = list.findIndex(c => c.id === movingItemId);\n            return index > 0;\n        },\n        canMoveDown: (movingItemId: string | number) => {\n            const list = unref(inList);\n            const index = list.findIndex(c => c.id === movingItemId);\n            return index !== -1 && index < list.length - 1;\n        },\n    };\n}\n\nexport function usePatchMoveUpDownSingle<T extends AutoEncoder & NonScalarIdentifiable<any>>(\n    movingItemId: string | number,\n    inList: Ref<T[]> | T[],\n    addPatch: (arrPatch: PatchableArrayAutoEncoder<T>) => void,\n) {\n    const d = usePatchMoveUpDown(inList, addPatch);\n\n    return {\n        up: () => {\n            d.up(movingItemId);\n        },\n        down: () => {\n            d.down(movingItemId);\n        },\n        canMoveUp: computed(() => {\n            return d.canMoveUp(movingItemId);\n        }),\n        canMoveDown: computed(() => {\n            return d.canMoveDown(movingItemId);\n        }),\n    };\n}\n\nexport function usePatchMoveUpDownIds<T extends string | number>(\n    movingItemId: T,\n    inList: Ref<T[]> | T[],\n    addPatch: (arrPatch: PatchableArray<T, T, T>) => void,\n) {\n    return {\n        up: () => {\n            const list = unref(inList);\n            const index = list.findIndex(c => c === movingItemId);\n            if (index == -1 || index == 0) {\n                return;\n            }\n\n            const moveTo = index - 2;\n            const p = new PatchableArray() as PatchableArray<T, T, T>;\n            p.addMove(movingItemId, list[moveTo] ?? null);\n            addPatch(p);\n        },\n        down: () => {\n            const list = unref(inList);\n            const index = list.findIndex(c => c === movingItemId);\n            if (index == -1 || index >= list.length - 1) {\n                return;\n            }\n\n            const moveTo = index + 1;\n            const p = new PatchableArray() as PatchableArray<T, T, T>;\n            p.addMove(movingItemId, list[moveTo] ?? null);\n            addPatch(p);\n        },\n    };\n}\n","import { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { SetupStepType } from '@stamhoofd/structures';\n\nexport function useSetupStepTranslations(): {\n    getReviewTitle: (type: SetupStepType) => string;\n    getReviewDescription: (type: SetupStepType) => string;\n    getReviewCheckboxTitle: (type: SetupStepType) => string;\n    getTodoTitle: (type: SetupStepType) => string;\n    getTodoDescription: (type: SetupStepType) => string;\n} {\n    const $t = useTranslate();\n\n    const reviewTitleMap: Record<SetupStepType, string> = {\n        [SetupStepType.Responsibilities]: $t('1d0d59b8-d7bf-4f04-846f-5025d7de7b4e'),\n        [SetupStepType.Companies]: $t('31df7737-2a25-4a6c-9766-39acc3ccdbc8'),\n        [SetupStepType.Groups]: $t('11ad8aa2-5aea-400b-8fe1-90e8495c1395'),\n        [SetupStepType.Premises]: $t('19cc6e71-9cd7-41d8-84d0-2c8828bd92c4'),\n        [SetupStepType.Emails]: $t('7e68086e-0dcc-445a-a639-984f1a7298ad'),\n        [SetupStepType.Payment]: $t('db69887c-b23a-4779-b945-cbe5d02856a7'),\n        [SetupStepType.Registrations]: $t('ca88e88f-d859-4445-a13a-4b73c359cd6f'),\n    };\n\n    const reviewDescriptionMap: Record<SetupStepType, string> = {\n        [SetupStepType.Responsibilities]: $t('96c10e6b-3974-40d4-8844-70b0b2fa110e'),\n        [SetupStepType.Companies]: $t('0712bc3b-15d5-4678-be41-8d168e5d52cf'),\n        [SetupStepType.Groups]: $t('c965f4a7-4dc3-4201-961e-65f1a9eb7f89'),\n        [SetupStepType.Premises]: $t('03ffd28c-99d4-4bae-8494-5def382d826e'),\n        [SetupStepType.Emails]: $t('9eb28669-42a5-4211-b72f-3335c0d4b329'),\n        [SetupStepType.Payment]: $t('70894bb8-da5a-4f1a-929d-08f4479c4de3'),\n        [SetupStepType.Registrations]: $t('d14ea349-afa8-49f3-bdb0-aac23a41887f'),\n    };\n\n    const reviewCheckboxTitleMap: Record<SetupStepType, string> = {\n        [SetupStepType.Responsibilities]: $t('1ee738ae-a91d-474e-a495-996bf431126a'),\n        [SetupStepType.Companies]: $t('f5404f0c-96f7-4f6a-834d-7616bfbedaf3'),\n        [SetupStepType.Groups]: $t('3124147c-09cf-4a87-8ae8-9545b90c1ba4'),\n        [SetupStepType.Premises]: $t('0d7093d6-d3c0-412e-af8a-d44a5d2394d9'),\n        [SetupStepType.Emails]: $t('c136101a-cd7e-4b04-9c81-e17f03a511d1'),\n        [SetupStepType.Payment]: $t('b831d108-6aa9-4e6e-97ce-9f50a1cab9e1'),\n        [SetupStepType.Registrations]: $t('ca88e88f-d859-4445-a13a-4b73c359cd6f'),\n    };\n\n    const todoTitleMap: Record<SetupStepType, string> = {\n        [SetupStepType.Responsibilities]: $t('268546f2-5dd0-492c-8680-e93b5d40807d'),\n        [SetupStepType.Companies]: $t('5a8403bb-90f8-4722-8cad-b275ffa781d9'),\n        [SetupStepType.Groups]: '',\n        [SetupStepType.Premises]: $t('5c37d309-63da-44af-8eec-fb593b8bad31'),\n        [SetupStepType.Emails]: $t('da415fb3-06f2-45eb-9230-ef56bcd52970'),\n        [SetupStepType.Payment]: $t('8587ff64-b9b5-4e57-84b1-4afd342ffec3'),\n        [SetupStepType.Registrations]: $t('ca88e88f-d859-4445-a13a-4b73c359cd6f'),\n    };\n\n    const todoDescriptionMap: Record<SetupStepType, string> = {\n        [SetupStepType.Responsibilities]: $t('f3236c83-b7ba-453f-981a-3e06925c9b7a'),\n        [SetupStepType.Companies]: $t('457fc4b2-9145-45c8-aba3-1fd629317330'),\n        [SetupStepType.Groups]: '',\n        [SetupStepType.Premises]: $t('05afcd20-5dda-4e01-88a7-e58d46487d30'),\n        [SetupStepType.Emails]: $t('9ef3cbb3-93bb-4f77-93af-3752ff869894'),\n        [SetupStepType.Payment]: $t('953003c6-6653-4cef-a2ca-09723658b828'),\n        [SetupStepType.Registrations]: $t('d14ea349-afa8-49f3-bdb0-aac23a41887f'),\n    };\n\n    const getReviewTitle = (type: SetupStepType): string => {\n        return reviewTitleMap[type];\n    };\n\n    const getReviewDescription = (type: SetupStepType): string => {\n        return reviewDescriptionMap[type];\n    };\n\n    const getReviewCheckboxTitle = (type: SetupStepType): string => {\n        return reviewCheckboxTitleMap[type];\n    };\n\n    const getTodoTitle = (type: SetupStepType): string => {\n        return todoTitleMap[type];\n    };\n\n    const getTodoDescription = (type: SetupStepType): string => {\n        return todoDescriptionMap[type];\n    };\n\n    return {\n        getReviewTitle,\n        getReviewDescription,\n        getReviewCheckboxTitle,\n        getTodoTitle,\n        getTodoDescription,\n    };\n}\n","import { UserWithMembers } from \"@stamhoofd/structures\";\nimport { Ref, computed } from \"vue\";\nimport { useContext } from \"./useContext\";\n\nexport function useUser(): Ref<UserWithMembers | null> {\n    const context = useContext()\n    return computed(() => context.value.user);\n}\n","import { ContextPermissions } from \"@stamhoofd/networking\"\nimport { Organization, Platform, UserWithMembers } from \"@stamhoofd/structures\"\nimport { Ref } from \"vue\"\nimport { useOrganization } from \"./useOrganization\"\nimport { usePlatform } from \"./usePlatform\"\nimport { useUser } from \"./useUser\"\n\n/**\n * Allows you to use the ContextPermissions object in a specific context (editing user permissions mostly)\n * without inheriting permissions if the user is also a global admin (which gives them full access to everything, but breaks editing permissions)\n */\nexport function useUninheritedPermissions(overrides?: {patchedUser?: UserWithMembers|Ref<UserWithMembers>, patchedOrganization?: Organization|Ref<Organization|null>, patchedPlatform?: Platform|Ref<Platform>}): ContextPermissions {\n    const user = overrides?.patchedUser ?? useUser()\n    const organization = overrides?.patchedOrganization ?? useOrganization()\n    const platform = overrides?.patchedPlatform ?? usePlatform()\n\n    return new ContextPermissions(user, organization, platform, {allowInheritingPermissions: false})\n}\n","import { Decoder } from '@simonbackx/simple-encoding';\nimport { Request } from '@simonbackx/simple-networking';\nimport { useContext } from '@stamhoofd/components';\nimport { useRequestOwner } from '@stamhoofd/networking';\nimport { CountResponse, StamhoofdFilter } from '@stamhoofd/structures';\n\nexport function useCount(path: string) {\n    const context = useContext();\n    const owner = useRequestOwner();\n\n    const count = async (filter: StamhoofdFilter): Promise<number | null> => {\n        Request.cancelAll(owner);\n\n        try {\n            const response = await context.value.authenticatedServer.request({\n                method: 'GET',\n                path,\n                query: {\n                    filter: JSON.stringify(filter),\n                },\n                decoder: CountResponse as Decoder<CountResponse>,\n                owner,\n            });\n\n            return response.data.count;\n        }\n        catch (error) {\n            console.error(error);\n        }\n\n        return null;\n    };\n\n    return {\n        count,\n    };\n}\n","import { useTranslate } from \"@stamhoofd/frontend-i18n\";\nimport { SetupStepReview } from \"@stamhoofd/structures\";\nimport { Formatter } from \"@stamhoofd/utility\";\n\nexport function useSetupStepReviewDescription(): { getDescription: (review: SetupStepReview | null, short?: boolean, textIfNotReviewed?: string) => string } {\n    const $t = useTranslate();\n\n    function getDescription(review: SetupStepReview | null, short = false, textIfNotReviewed = $t('586cb220-498a-496a-8db5-89a4f10ba3df')): string {\n        if(review) {\n            const reviewedAtString = Formatter.date(review.date, true);\n            const userName = review.userName;\n\n            if(short) {\n                // todo: translate\n                return `Nagekeken op ${reviewedAtString}`;\n            }\n            // todo: translate\n            return `Gemarkeerd als nagekeken op ${reviewedAtString} door ${userName}`;\n        }\n\n        return textIfNotReviewed;\n    }\n\n    return {\n        getDescription\n    }\n}\n","import { onActivated, onBeforeUnmount, onDeactivated, onMounted } from 'vue';\n\nexport function useVisibilityChange(callback: () => void | Promise<void>) {\n    let wasVisible = false;\n\n    function isVisible() {\n        return document.visibilityState === 'visible' && !document.hidden;\n    }\n\n    function onVisibilityChange() {\n        const v = isVisible();\n        if (v === wasVisible) {\n            return;\n        }\n        wasVisible = v;\n        if (v) {\n            console.log('[useVisibilityChange] visible');\n            const result = callback();\n            if (result instanceof Promise) {\n                result.catch(console.error);\n            }\n        }\n    }\n\n    let listener = false;\n\n    function addListeners() {\n        if (listener) {\n            return;\n        }\n        listener = true;\n        document.addEventListener('visibilitychange', onVisibilityChange, { passive: true });\n\n        // extra event listeners for better behaviour\n        document.addEventListener('focus', onVisibilityChange, { passive: true });\n        document.addEventListener('blur', onVisibilityChange, { passive: true });\n        window.addEventListener('focus', onVisibilityChange, { passive: true });\n        window.addEventListener('blur', onVisibilityChange, { passive: true });\n    }\n\n    function removeListeners() {\n        if (!listener) {\n            return;\n        }\n        listener = false;\n        document.removeEventListener('visibilitychange', onVisibilityChange);\n\n        // extra event listeners for better behaviour\n        document.removeEventListener('focus', onVisibilityChange);\n        document.removeEventListener('blur', onVisibilityChange);\n        window.removeEventListener('focus', onVisibilityChange);\n        window.removeEventListener('blur', onVisibilityChange);\n    }\n\n    onMounted(() => {\n        addListeners();\n    });\n\n    onActivated(() => {\n        addListeners();\n    });\n\n    onDeactivated(() => {\n        removeListeners();\n    });\n\n    onBeforeUnmount(() => {\n        removeListeners();\n    });\n}\n","import { onActivated, ref } from 'vue';\nimport { useVisibilityChange } from '../composables';\n\n// todo: consider caching this system wide (need to think about the temporary listeners created in useVisibilityChange)\nexport function useNow() {\n    const now = ref(new Date());\n\n    onActivated(() => {\n        now.value = new Date();\n    });\n\n    useVisibilityChange(() => {\n        now.value = new Date();\n    });\n\n    return now;\n}\n","import { LoginMethod, LoginMethodConfig } from '@stamhoofd/structures';\nimport { Ref, computed } from 'vue';\nimport { usePlatform } from './usePlatform';\n\nexport function useLoginMethods(): Ref<Map<LoginMethod, LoginMethodConfig>> {\n    const platform = usePlatform();\n    return computed(() => {\n        if (STAMHOOFD.userMode === 'platform') {\n            return platform.value.config.loginMethods;\n        }\n        return new Map<LoginMethod, LoginMethodConfig>([[LoginMethod.Password, LoginMethodConfig.create({})]]);\n    });\n}\n\nexport function useLoginMethod(method: LoginMethod): Ref<LoginMethodConfig | null> {\n    const loginMethods = useLoginMethods();\n    return computed(() => loginMethods.value.get(method) ?? null);\n}\n\nexport function useLoginMethodEnabled(email: Ref<string> | string, method: LoginMethod): Ref<boolean> {\n    const loginMethod = useLoginMethod(method);\n    return computed(() => {\n        if (!loginMethod.value) {\n            return false;\n        }\n        return loginMethod.value.isEnabledForEmail(typeof email === 'string' ? email : email.value);\n    });\n}\n","import { assertSort, CountFilteredRequest, CountResponse, LimitedFilteredRequest, MembersBlob, PaginatedResponseDecoder, PlatformFamily, PlatformMember, SortItemDirection, SortList } from '@stamhoofd/structures';\nimport { ObjectFetcher } from '../tables';\nimport { Decoder } from '@simonbackx/simple-encoding';\nimport { useContext, usePlatform } from '../hooks';\n\ntype ObjectType = PlatformMember;\n\nfunction extendSort(list: SortList): SortList {\n    // Map 'age' to 'birthDay' + reverse direction\n    list = list.flatMap((l) => {\n        if (l.key === 'age') {\n            return [\n                { key: 'birthDay', order: l.order === SortItemDirection.ASC ? SortItemDirection.DESC : SortItemDirection.ASC },\n            ];\n        }\n\n        if (l.key === 'name') {\n            return [\n                { key: 'firstName', order: l.order },\n                { key: 'lastName', order: l.order },\n            ];\n        }\n\n        return [l];\n    });\n\n    return assertSort(list, [{ key: 'id' }]);\n}\n\nexport function useMembersObjectFetcher(overrides?: Partial<ObjectFetcher<ObjectType>>): ObjectFetcher<ObjectType> {\n    const context = useContext();\n    const platform = usePlatform();\n\n    return {\n        extendSort,\n        async fetch(data: LimitedFilteredRequest): Promise<{ results: ObjectType[]; next?: LimitedFilteredRequest }> {\n            console.log('Members.fetch', data);\n            const response = await context.value.authenticatedServer.request({\n                method: 'GET',\n                path: '/members',\n                decoder: new PaginatedResponseDecoder(MembersBlob as Decoder<MembersBlob>, LimitedFilteredRequest as Decoder<LimitedFilteredRequest>),\n                query: data,\n                shouldRetry: false,\n                owner: this,\n                timeout: 30 * 1000,\n            });\n\n            console.log('[Done] Members.fetch', data, response.data);\n\n            const blob = response.data.results;\n\n            return {\n                results: PlatformFamily.createSingles(blob, {\n                    contextOrganization: context.value.organization,\n                    platform: platform.value,\n                }),\n                next: response.data.next,\n            };\n        },\n\n        async fetchCount(data: CountFilteredRequest): Promise<number> {\n            console.log('Members.fetchCount', data);\n\n            const response = await context.value.authenticatedServer.request({\n                method: 'GET',\n                path: '/members/count',\n                decoder: CountResponse as Decoder<CountResponse>,\n                query: data,\n                shouldRetry: false,\n                owner: this,\n                timeout: 30 * 1000,\n            });\n\n            console.log('[Done] Members.fetchCount', data, response.data.count);\n            return response.data.count;\n        },\n\n        ...overrides,\n    };\n}\n","export class SelectableColumn {\n    enabled: boolean = true\n    id: string;\n\n    name: string;\n    description: string = ''\n    category?: string|null = null\n\n    constructor(data: {\n        enabled?: boolean;\n        id: string;\n        name: string;\n        description?: string;\n        category?: string|null;\n    }) {\n        Object.assign(this, data);\n    }\n}\n","import { SelectableColumn } from \"./SelectableColumn\";\n\nexport class SelectableSheet {\n    id: string;\n\n    name: string;\n    description: string;\n    columns: SelectableColumn[];\n\n    constructor(data: {\n        id: string;\n        name: string;\n        description?: string;\n        columns: SelectableColumn[];\n    }) {\n        Object.assign(this, data);\n    }\n\n    disableAll() {\n        for (const column of this.columns) {\n            column.enabled = false;\n        }\n    }\n\n    get enabled() {\n        return this.columns.some(c => c.enabled);\n    }\n\n    get enabledCount() {\n        return this.columns.filter(c => c.enabled).length;\n    }\n}\n\n","import { ExcelSheetColumnFilter, ExcelSheetFilter, ExcelWorkbookFilter } from '@stamhoofd/structures';\nimport { SelectableSheet } from './SelectableSheet';\n\nexport class SelectableWorkbook {\n    sheets: SelectableSheet[] = [];\n\n    constructor(data: { sheets: SelectableSheet[] }) {\n        this.sheets = data.sheets;\n    }\n\n    disableAll() {\n        for (const sheet of this.sheets) {\n            sheet.disableAll();\n        }\n    }\n\n    from(filter: ExcelWorkbookFilter) {\n        this.disableAll();\n\n        for (const s of filter.sheets) {\n            const sheet = this.sheets.find(sheet => sheet.id === s.id);\n            if (!sheet) {\n                continue;\n            }\n\n            for (const { id } of s.columns) {\n                const column = sheet.columns.find(c => c.id === id);\n                if (column) {\n                    column.enabled = true;\n                }\n            }\n        }\n    }\n\n    getFilter(): ExcelWorkbookFilter {\n        return ExcelWorkbookFilter.create({\n            sheets: this.sheets.flatMap((sheet) => {\n                if (!sheet.enabled) {\n                    return [];\n                }\n\n                return [\n                    ExcelSheetFilter.create({\n                        id: sheet.id,\n                        name: sheet.name,\n                        columns: sheet.columns.filter(c => c.enabled).map(c => (ExcelSheetColumnFilter.create({ id: c.id, name: c.name }))),\n                    }),\n                ];\n            }),\n        });\n    }\n}\n","<template>\n    <SaveView :loading=\"exporting\" save-icon=\"download\" @save=\"startExport\">\n        <h1>Exporteren naar Excel</h1>\n\n        <ScrollableSegmentedControl v-if=\"workbook.sheets.length > 1\" v-model=\"visibleSheet\" :items=\"workbook.sheets\">\n            <template #item=\"{item}\">\n                <span>{{ item.name }}</span>\n\n                <span v-if=\"item.enabledCount === 0\" v-tooltip=\"'Dit werkblad wordt niet mee geëxporteerd'\" class=\"icon disabled small\" />\n            </template>\n        </ScrollableSegmentedControl>\n\n        <p v-if=\"visibleSheet.description\" class=\"style-description-block\">\n            {{ visibleSheet.description }}\n        </p>\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <div v-for=\"({categoryName, columns}, index) in groupedColumns\" :key=\"visibleSheet.name + '-' + categoryName\" class=\"container\">\n            <hr v-if=\"index > 0\">\n            <h2>{{ categoryName }}</h2>\n\n            <STList>\n                <STListItem element-name=\"label\" :selectable=\"true\" class=\"full-border\">\n                    <template #left>\n                        <Checkbox :model-value=\"getAllSelected(columns)\" :indeterminate=\"getAllSelectedindeterminate(columns)\" @update:model-value=\"setAllSelected($event, columns)\" />\n                    </template>\n\n                    <div class=\"style-table-head\">\n                        {{ 'Alles selecteren' }}\n                    </div>\n                </STListItem>\n\n                <STListItem v-for=\"column of columns\" :key=\"column.id\" element-name=\"label\" :selectable=\"true\">\n                    <template #left>\n                        <Checkbox v-model=\"column.enabled\" />\n                    </template>\n\n                    <h3 class=\"style-title-list\">\n                        {{ column.name }}\n                    </h3>\n                    <p v-if=\"column.description\" class=\"style-description-small\">\n                        {{ column.description }}\n                    </p>\n                </STListItem>\n            </STList>\n        </div>\n    </SaveView>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Decoder, ObjectData, VersionBox, VersionBoxDecoder } from '@simonbackx/simple-encoding';\nimport { usePop } from '@simonbackx/vue-app-navigation';\nimport { ErrorBox, ScrollableSegmentedControl, Toast, ToastButton, useContext, useErrors } from '@stamhoofd/components';\nimport { AppManager, Storage } from '@stamhoofd/networking';\nimport { ExcelExportRequest, ExcelExportResponse, ExcelExportType, ExcelWorkbookFilter, LimitedFilteredRequest, Version } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed, onMounted, ref } from 'vue';\nimport { SelectableColumn } from './SelectableColumn';\nimport { SelectableWorkbook } from './SelectableWorkbook';\n\nconst props = defineProps<{\n    type: ExcelExportType;\n    filter: LimitedFilteredRequest;\n    workbook: SelectableWorkbook;\n    configurationId: string; // How to store the filters for easy reuse\n}>();\n\nconst visibleSheet = ref(props.workbook.sheets[0]);\nconst exporting = ref(false);\nconst errors = useErrors();\nconst context = useContext();\nconst pop = usePop();\n\nconst groupedColumns = computed(() => {\n    const categories: Map<string, { columns: SelectableColumn[]; categoryName: string }> = new Map();\n\n    for (const column of visibleSheet.value.columns) {\n        const category = column.category || '';\n\n        if (!categories.has(category)) {\n            categories.set(category, {\n                columns: [],\n                categoryName: category,\n            });\n        }\n        categories.get(category)!.columns.push(column);\n    }\n\n    return Array.from(categories.values());\n});\n\nfunction getAllSelected(columns: SelectableColumn[]) {\n    return columns.every(c => c.enabled);\n}\n\nfunction getAllSelectedindeterminate(columns: SelectableColumn[]) {\n    return !getAllSelected(columns) && columns.some(c => c.enabled);\n}\n\nfunction setAllSelected(selected: boolean, columns: SelectableColumn[]) {\n    for (const column of columns) {\n        column.enabled = selected;\n    }\n}\n\nonMounted(async () => {\n    // Load from storage\n    try {\n        const savedFilter = await Storage.keyValue.getItem('excel-filter-' + props.configurationId);\n\n        if (savedFilter) {\n            const decodedJson = JSON.parse(savedFilter);\n            const decoder = new VersionBoxDecoder(ExcelWorkbookFilter as Decoder<ExcelWorkbookFilter>);\n            const filter = decoder.decode(new ObjectData(decodedJson, { version: 0 }));\n\n            if (filter) {\n                console.log('Loaded filter', filter);\n                props.workbook.from(filter.data);\n            }\n        }\n    }\n    catch (e) {\n        console.error('Failed to load filter', e);\n    }\n});\n\nasync function saveFilter() {\n    const filter = props.workbook.getFilter();\n    const encoded = new VersionBox(filter).encode({ version: Version });\n\n    try {\n        await Storage.keyValue.setItem('excel-filter-' + props.configurationId, JSON.stringify(encoded));\n    }\n    catch (e) {\n        console.error('Failed to save filter', e);\n    }\n}\n\nasync function startExport() {\n    if (exporting.value) {\n        return;\n    }\n    exporting.value = true;\n    errors.errorBox = null;\n\n    try {\n        await saveFilter();\n        await doExport();\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n\n    exporting.value = false;\n}\n\nasync function doExport() {\n    try {\n        const response = await context.value.authenticatedServer.request({\n            method: 'POST',\n            path: `/export/excel/${props.type}`,\n            body: ExcelExportRequest.create({\n                filter: props.filter,\n                workbookFilter: props.workbook.getFilter(),\n            }),\n            decoder: ExcelExportResponse as Decoder<ExcelExportResponse>,\n            shouldRetry: false,\n        });\n\n        if (response.data.url) {\n            const url = new URL(response.data.url);\n            const filename = Formatter.fileSlug(props.type) + '.xlsx';\n            new Toast('Jouw bestand is klaar, download het hier', 'download')\n                .setButton(\n                    new ToastButton('Downloaden', async () => {\n                        await AppManager.shared.downloadFile(url, filename);\n                    })\n                )\n                .setHide(null)\n                .setForceButtonClick()\n                .show();\n        }\n        else {\n            Toast.success('Je ontvang een e-mail met het bestand als jouw Excel export klaar is').setHide(15000).show();\n        }\n\n        await pop();\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n}\n\n</script>\n","import { ArrayDecoder, Decoder } from '@simonbackx/simple-encoding';\nimport { assertSort, CountFilteredRequest, CountResponse, LimitedFilteredRequest, Organization, PaginatedResponseDecoder, SortList } from '@stamhoofd/structures';\nimport { useContext } from '../hooks';\nimport { ObjectFetcher } from '../tables';\n\ntype ObjectType = Organization;\n\nfunction extendSort(list: SortList): SortList {\n    return assertSort(list, [{ key: 'id' }]);\n}\n\nexport function useOrganizationsObjectFetcher(overrides?: Partial<ObjectFetcher<ObjectType>>): ObjectFetcher<ObjectType> {\n    const context = useContext();\n\n    return {\n        extendSort,\n        async fetch(data: LimitedFilteredRequest) {\n            console.log('Organizations.fetch', data);\n\n            const response = await context.value.authenticatedServer.request({\n                method: 'GET',\n                path: '/admin/organizations',\n                decoder: new PaginatedResponseDecoder(new ArrayDecoder(Organization as Decoder<Organization>), LimitedFilteredRequest as Decoder<LimitedFilteredRequest>),\n                query: data,\n                shouldRetry: false,\n                owner: this,\n                timeout: 30 * 1000,\n            });\n\n            console.log('[Done] Organizations.fetch', data, response.data);\n\n            return response.data;\n        },\n\n        async fetchCount(data: CountFilteredRequest): Promise<number> {\n            console.log('Organizations.fetchCount', data);\n\n            const response = await context.value.authenticatedServer.request({\n                method: 'GET',\n                path: '/admin/organizations/count',\n                decoder: CountResponse as Decoder<CountResponse>,\n                query: data,\n                shouldRetry: false,\n                owner: this,\n                timeout: 30 * 1000,\n            });\n\n            console.log('[Done] Organizations.fetchCount', data, response.data.count);\n            return response.data.count;\n        },\n        ...overrides,\n    };\n}\n","import { ArrayDecoder, Decoder } from '@simonbackx/simple-encoding';\nimport { assertSort, CountFilteredRequest, CountResponse, LimitedFilteredRequest, PaginatedResponseDecoder, PaymentGeneral, SortList } from '@stamhoofd/structures';\nimport { useContext } from '../hooks';\nimport { ObjectFetcher } from '../tables';\nimport { SessionContext } from '@stamhoofd/networking';\nimport { Ref } from 'vue';\n\ntype ObjectType = PaymentGeneral;\n\nfunction extendSort(list: SortList): SortList {\n    return assertSort(list, [{ key: 'id' }]);\n}\n\nexport function getPaymentsObjectFetcher(context: Ref<SessionContext>, overrides?: Partial<ObjectFetcher<ObjectType>>): ObjectFetcher<ObjectType> {\n    return {\n        extendSort,\n        async fetch(data: LimitedFilteredRequest): Promise<{ results: ObjectType[]; next?: LimitedFilteredRequest }> {\n            const response = await context.value.authenticatedServer.request({\n                method: 'GET',\n                path: '/payments',\n                decoder: new PaginatedResponseDecoder(new ArrayDecoder(PaymentGeneral as Decoder<PaymentGeneral>), LimitedFilteredRequest as Decoder<LimitedFilteredRequest>),\n                query: data,\n                shouldRetry: false,\n                owner: this,\n                timeout: 30 * 1000,\n            });\n\n            return response.data;\n        },\n\n        async fetchCount(data: CountFilteredRequest): Promise<number> {\n            const response = await context.value.authenticatedServer.request({\n                method: 'GET',\n                path: '/payments/count',\n                decoder: CountResponse as Decoder<CountResponse>,\n                query: data,\n                shouldRetry: false,\n                owner: this,\n                timeout: 30 * 1000,\n            });\n\n            return response.data.count;\n        },\n\n        ...overrides,\n    };\n}\n\nexport function usePaymentsObjectFetcher(overrides?: Partial<ObjectFetcher<ObjectType>>): ObjectFetcher<ObjectType> {\n    const context = useContext();\n    return getPaymentsObjectFetcher(context, overrides);\n}\n","import { ArrayDecoder, Decoder } from '@simonbackx/simple-encoding';\nimport { assertSort, Event, LimitedFilteredRequest, PaginatedResponseDecoder, SortItemDirection, SortList } from '@stamhoofd/structures';\nimport { useContext } from '../hooks';\nimport { ObjectFetcher } from '../tables';\n\ntype ObjectType = Event;\n\nfunction extendSort(list: SortList): SortList {\n    return assertSort(list, [\n        { key: 'startDate', order: SortItemDirection.ASC },\n        { key: 'id' },\n    ]);\n}\n\nexport function useEventsObjectFetcher(overrides?: Partial<ObjectFetcher<ObjectType>>): ObjectFetcher<ObjectType> {\n    const context = useContext();\n\n    return {\n        extendSort,\n\n        async fetch(data: LimitedFilteredRequest): Promise<{ results: ObjectType[]; next?: LimitedFilteredRequest }> {\n            console.log('Events.fetch', data);\n            const response = await context.value.authenticatedServer.request({\n                method: 'GET',\n                path: '/events',\n                decoder: new PaginatedResponseDecoder(new ArrayDecoder(Event as Decoder<Event>), LimitedFilteredRequest as Decoder<LimitedFilteredRequest>),\n                query: data,\n                shouldRetry: false,\n                owner: this,\n                timeout: 30 * 1000,\n            });\n\n            console.log('[Done] Events.fetch', data, response.data);\n            return response.data;\n        },\n\n        async fetchCount(): Promise<number> {\n            throw new Error('Method not implemented.');\n        },\n\n        ...overrides,\n\n        get requiredFilter() {\n            return overrides?.requiredFilter ?? null;\n        },\n    };\n}\n","import { ArrayDecoder, Decoder } from '@simonbackx/simple-encoding';\nimport { assertSort, CountFilteredRequest, CountResponse, EventNotification, LimitedFilteredRequest, PaginatedResponseDecoder, SortList } from '@stamhoofd/structures';\nimport { useContext } from '../hooks';\nimport { ObjectFetcher } from '../tables';\n\ntype ObjectType = EventNotification;\n\nfunction extendSort(list: SortList): SortList {\n    return assertSort(list, [\n        { key: 'id' },\n    ]);\n}\n\nexport function useEventNotificationsObjectFetcher(overrides?: Partial<ObjectFetcher<ObjectType>>): ObjectFetcher<ObjectType> {\n    const context = useContext();\n\n    return {\n        extendSort,\n\n        async fetch(data: LimitedFilteredRequest, options?: { shouldRetry?: boolean }): Promise<{ results: ObjectType[]; next?: LimitedFilteredRequest }> {\n            console.log('EventNotifications.fetch', data);\n            const response = await context.value.authenticatedServer.request({\n                method: 'GET',\n                path: '/event-notifications',\n                decoder: new PaginatedResponseDecoder(new ArrayDecoder(EventNotification as Decoder<EventNotification>), LimitedFilteredRequest as Decoder<LimitedFilteredRequest>),\n                query: data,\n                shouldRetry: options?.shouldRetry ?? false,\n                owner: this,\n                timeout: 30 * 1000,\n            });\n\n            console.log('[Done] EventNotifications.fetch', data, response.data);\n            return response.data;\n        },\n\n        async fetchCount(data: CountFilteredRequest): Promise<number> {\n            console.log('EventNotifications.fetchCount', data);\n\n            const response = await context.value.authenticatedServer.request({\n                method: 'GET',\n                path: '/event-notifications/count',\n                decoder: CountResponse as Decoder<CountResponse>,\n                query: data,\n                shouldRetry: false,\n                owner: this,\n                timeout: 30 * 1000,\n            });\n\n            console.log('[Done] EventNotifications.fetchCount', data, response.data.count);\n            return response.data.count;\n        },\n\n        ...overrides,\n\n        get requiredFilter() {\n            return overrides?.requiredFilter ?? null;\n        },\n    };\n}\n","import { ArrayDecoder, Decoder } from '@simonbackx/simple-encoding';\nimport { assertSort, AuditLog, LimitedFilteredRequest, PaginatedResponseDecoder, SortItemDirection, SortList } from '@stamhoofd/structures';\nimport { useContext } from '../hooks';\nimport { ObjectFetcher } from '../tables';\n\ntype ObjectType = AuditLog;\n\nfunction extendSort(list: SortList): SortList {\n    return assertSort(list, [\n        { key: 'id', order: SortItemDirection.DESC },\n    ]);\n}\n\nexport function useAuditLogsObjectFetcher(overrides?: Partial<ObjectFetcher<ObjectType>>): ObjectFetcher<ObjectType> {\n    const context = useContext();\n\n    return {\n        extendSort,\n\n        async fetch(data: LimitedFilteredRequest): Promise<{ results: ObjectType[]; next?: LimitedFilteredRequest }> {\n            console.log('AuditLogs.fetch', data);\n            const response = await context.value.authenticatedServer.request({\n                method: 'GET',\n                path: '/audit-logs',\n                decoder: new PaginatedResponseDecoder(new ArrayDecoder(AuditLog as Decoder<AuditLog>), LimitedFilteredRequest as Decoder<LimitedFilteredRequest>),\n                query: data,\n                shouldRetry: false,\n                owner: this,\n            });\n\n            console.log('[Done] AuditLogs.fetch', data, response.data);\n            return response.data;\n        },\n\n        async fetchCount(): Promise<number> {\n            throw new Error('Method not implemented.');\n        },\n\n        ...overrides,\n\n        get requiredFilter() {\n            return overrides?.requiredFilter ?? null;\n        },\n    };\n}\n","<template>\n    <div v-if=\"visible\" ref=\"el\" class=\"container\">\n        <slot />\n    </div>\n</template>\n\n\n<script lang=\"ts\" setup>\nimport { nextTick, ref, watch } from 'vue';\nimport { ViewportHelper } from '../ViewportHelper';\n\nconst props = withDefaults(\n    defineProps<{\n        visible?: boolean\n    }>(),\n    {\n        visible: false\n    }\n);\n\nconst el = ref<HTMLElement|null>(null);\n\n// Scroll to the container if it becomes visible\nwatch(() => props.visible, async (newValue, oldValue) => {\n    await nextTick();\n\n    // Need a small delay because of the ImageComponent component which needs to calculate the width of the image after initial render\n    setTimeout(() => {\n        if (newValue && !oldValue) {\n            console.log(\"Scrolling to element\", el.value);\n            const element = el.value;\n            if (element) {\n                ViewportHelper.scrollIntoView(element)\n\n                // Focus\n                setTimeout(() => {\n                    const firstInputElement: HTMLInputElement|null = element.querySelector(\"input, textarea\");\n                    if (firstInputElement && firstInputElement.type !== 'file') {\n                        firstInputElement.focus();\n                    }\n                }, 200)\n            }\n        }\n    }, 25);\n});\n\n</script>\n","import { isSimpleError, isSimpleErrors, SimpleError, SimpleErrors } from '@simonbackx/simple-errors'\n\nexport type CenteredMessageListener = (centeredMessage: CenteredMessage) => unknown\n\nexport class CenteredMessageButton {\n    text: string\n    href?: string\n    action: (() => Promise<any>) | null = null\n    type: \"destructive\" | \"secundary\" | \"primary\"\n    icon: string | null = null\n    loading = false\n\n    constructor(text, settings?: {\n        action?: (() => Promise<any>);\n        type?: \"destructive\" | \"secundary\" | \"primary\";\n        icon?: string ;\n        href?: string\n    }) {\n        this.text = text\n        this.action = settings?.action ?? null\n        this.type = settings?.type ?? \"primary\"\n        this.icon = settings?.icon ?? null\n        this.href = settings?.href\n\n    }\n}\n\nexport class CenteredMessage {\n    protected static listeners: Map<any, CenteredMessageListener> = new Map()\n\n    type = \"none\"\n    title = \"\"\n    description = \"\"\n\n\n    buttons: CenteredMessageButton[] = []\n\n    doHide: (() => void) | null = null\n\n    constructor(title: string, description = \"\", type = \"none\") {\n        this.title = title\n        this.description = description\n        this.type = type\n    }\n\n    static fromError(errors: unknown) {\n        let simpleErrors: SimpleErrors\n        if (isSimpleError(errors)) {\n            simpleErrors = new SimpleErrors(errors)\n        } else if (isSimpleErrors(errors)) {\n            simpleErrors = errors\n        } else {\n            simpleErrors = new SimpleErrors(new SimpleError({\n                code: \"unknown_error\",\n                message: (errors as any).message\n            }))\n        }\n\n        if (simpleErrors.hasCode(\"network_error\") || simpleErrors.hasCode(\"network_timeout\")) {\n            return new CenteredMessage(\"Geen internetverbinding\", \"Kijk jouw verbinding na en probeer opnieuw\", \"error\")\n        }\n\n        return new CenteredMessage(simpleErrors.getHuman(), \"\", \"error\")\n    }\n\n    static addListener(owner: any, listener: CenteredMessageListener) {\n        this.listeners.set(owner, listener)\n    }\n\n    static removeListener(owner: any) {\n        this.listeners.delete(owner)\n    }\n\n    static callListeners(toast: CenteredMessage) {\n        for (const listener of this.listeners.values()) {\n            listener(toast)\n        }\n    }\n\n    addCloseButton(text = \"Sluiten\", action?: (() => Promise<any>) | undefined) {\n        this.buttons.push(new CenteredMessageButton(text, { type: \"secundary\", action }))\n        return this\n    }\n\n    addButton(button: CenteredMessageButton) {\n        this.buttons.push(button)\n        return this\n    }\n\n    show() {\n        CenteredMessage.callListeners(this)\n        return this\n    }\n\n    hide() {\n        if (this.doHide) {\n            this.doHide();\n            this.doHide = null;\n        }\n        return this\n    }\n\n    static confirm(text: string, confirmText: string, description = \"\", cancelText?: string, destructive = true): Promise<boolean> {\n        return new Promise((resolve) => {\n            new CenteredMessage(text, description).addButton(new CenteredMessageButton(confirmText, {\n                action: () => {\n                    resolve(true)\n                    return Promise.resolve()\n                },\n                type: destructive ? \"destructive\" : \"primary\"\n            })).addButton(new CenteredMessageButton(cancelText ?? \"Annuleren\", {\n                action: () => {\n                    resolve(false)\n                    return Promise.resolve()\n                },\n                type: \"secundary\"\n            })).show()\n        })\n    }\n}\n","import { isSimpleError, isSimpleErrors, SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\nimport { Request } from '@simonbackx/simple-networking';\nimport { reactive } from 'vue';\n\nexport type ToastListener = (toast: Toast) => void;\n\nexport class ToastButton {\n    text: string;\n    icon: string | null;\n    action: () => void;\n\n    href: string | null;\n    download: string | null;\n\n    constructor(text: string, action?: () => void, icon: string | null = null) {\n        this.text = text;\n        this.action = action ?? (() => {});\n        this.icon = icon;\n    }\n\n    setHref(href: string) {\n        this.href = href;\n        return this;\n    }\n\n    setDownload(download: string) {\n        this.download = download;\n        return this;\n    }\n}\n\nexport class Toast {\n    protected static listeners: Map<any, ToastListener> = new Map();\n    message: string;\n    icon: string | null;\n    withOffset = false;\n    progress: number | null = null;\n    button: ToastButton | null = null;\n    forceButtonClick = false;\n\n    autohideAfter: number | null = 7000;\n\n    doHide: (() => void) | null = null;\n    action: (() => void) | null = null;\n\n    constructor(message: string, icon: string | null = null) {\n        this.message = message;\n        this.icon = icon;\n\n        // Constructor hack: we override Toast with a reactive toast\n        // this fixes issues with editing the toast, because otherwise it would not get updated\n        return reactive(this);\n    }\n\n    static success(message: string): Toast {\n        return new Toast(message, 'success green');\n    }\n\n    static error(message: string): Toast {\n        return new Toast(message, 'error red');\n    }\n\n    static warning(message: string): Toast {\n        return new Toast(message, 'warning yellow');\n    }\n\n    static info(message: string): Toast {\n        return new Toast(message, 'info');\n    }\n\n    static fromError(errors: unknown): Toast {\n        let simpleErrors!: SimpleErrors;\n        if (isSimpleError(errors)) {\n            simpleErrors = new SimpleErrors(errors);\n        }\n        else if (isSimpleErrors(errors)) {\n            simpleErrors = errors;\n        }\n        else {\n            simpleErrors = new SimpleErrors(new SimpleError({\n                code: 'unknown_error',\n                message: (errors as Error).message,\n            }));\n        }\n\n        if (Request.isNetworkError((errors as Error))) {\n            return new Toast('Geen of slechte internetverbinding', 'error red');\n        }\n        return new Toast(simpleErrors.getHuman(), 'error red');\n    }\n\n    setProgress(progress: number | null) {\n        this.progress = progress;\n        return this;\n    }\n\n    setHide(ms: number | null) {\n        this.autohideAfter = ms;\n        return this;\n    }\n\n    setButton(button: ToastButton | null) {\n        this.button = button;\n        return this;\n    }\n\n    setForceButtonClick() {\n        this.forceButtonClick = true;\n        return this;\n    }\n\n    setAction(action: (() => void) | null) {\n        this.action = action;\n        return this;\n    }\n\n    setIcon(icon: string | null) {\n        this.icon = icon;\n        return this;\n    }\n\n    setWithOffset() {\n        this.withOffset = true;\n        return this;\n    }\n\n    static addListener(owner: any, listener: ToastListener) {\n        this.listeners.set(owner, listener);\n    }\n\n    static removeListener(owner: any) {\n        this.listeners.delete(owner);\n    }\n\n    static callListeners(toast: Toast) {\n        for (const listener of this.listeners.values()) {\n            listener(toast);\n        }\n    }\n\n    show() {\n        if (Toast.listeners.size == 0) {\n            console.log('Delayed Toast show');\n            // Delayed show\n            setTimeout(() => {\n                this.show();\n            }, 1000);\n        }\n        else {\n            Toast.callListeners(this);\n        }\n        return this;\n    }\n\n    hide() {\n        if (this.doHide) {\n            this.doHide();\n            this.doHide = null;\n        }\n        return this;\n    }\n}\n","<template>\n    <div class=\"stepper-input\" @pointerdown.prevent>\n        <button class=\"icon min\" type=\"button\" @click=\"step(-1)\" />\n        <hr>\n        <button class=\"icon plus\" type=\"button\" @click=\"step(1)\" /> \n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { Toast } from '../overlays/Toast';\n\nexport interface Props {\n    min: number | null,\n    max?: number | null\n}\n\nconst model = defineModel<number>({default: 1})\nconst props = withDefaults(defineProps<Props>(), {\n    min: 0,\n    max: null\n})\n\nconst constrain = (value: number): number => {\n    if (props.min !== null && value < props.min) {\n        value = props.min;\n    } else if (props.max !== null && value > props.max) {\n        value = props.max;\n    }\n    return value\n}\n\nconst step = (add: number) => {\n    const v = constrain(model.value + add)\n\n    if (v === model.value && add !== 0) {\n        Toast.warning(add > 0 ? \"Maximum bereikt\" : \"Minimum bereikt\").show()\n        return\n    }\n    model.value = v\n}\n\n</script>\n\n<!-- Add \"scoped\" attribute to limit CSS to this component only -->\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n\n.stepper-input {\n    display: inline-flex;\n    flex-direction: row;\n    background: $color-background-shade;\n    border-radius: $border-radius;\n    align-items: stretch;\n    height: $input-height;\n    vertical-align: middle;\n    contain: strict;\n    width: 52px * 2 - $border-width; \n\n    hr {\n        width: $border-width;\n        flex-basis: $border-width;\n        height: 19px;\n        background: $color-gray-2;\n        border-radius: calc($border-width / 2);\n        border: 0;\n        outline: 0;\n        transition: opacity 0.2s;\n        align-self: center;\n        margin: 0;\n        padding: 0;\n        display: block;\n    }\n\n    &:active {\n        hr {\n            transition: none;\n            opacity: 0;\n        }\n    }\n\n    button {\n        padding: 5px 14px;\n        border-radius: $border-radius;\n        -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n        transition: background-color 0.2s;\n        touch-action: manipulation;\n        user-select: none;\n        cursor: pointer;\n        outline: 0;\n        display: block;\n\n        &:active {\n            background: $color-gray-3;\n            transition: none;\n        }\n\n        &:last-child {\n            margin-left: -$border-width;\n        }\n\n        &:first-child {\n            margin-right: -$border-width;\n        }\n    }\n}\n</style>\n","<template>\n    <div>\n        <label :class=\"{'checkbox': !onlyLine, 'checkbox-line': onlyLine, manual, 'with-text': hasDefaultSlot }\">\n            <input ref=\"checkbox\" v-model=\"checkboxValue\" type=\"checkbox\" :disabled=\"disabled\" :indeterminate.prop=\"indeterminate\">\n            <div>\n                <div>\n                    <svg width=\"10\" height=\"9\" viewBox=\"0 0 10 9\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                        <path\n                            d=\"M1 4L4 8L9 1\"\n                            stroke=\"white\"\n                            stroke-width=\"2\"\n                            stroke-linecap=\"round\"\n                            stroke-linejoin=\"round\"\n                        />\n                    </svg>\n                </div>\n                <div><slot /></div>\n            </div>\n        </label>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { Component, Prop, VueComponent } from \"@simonbackx/vue-app-navigation/classes\";\n\n@Component({\n    emits: ['update:modelValue']\n})\nexport default class Checkbox extends VueComponent {\n    @Prop({ default: \"\", type: String })\n    name!: string;\n\n    @Prop({ default: false })\n    modelValue!: boolean;\n\n    @Prop({ default: false })\n    onlyLine!: boolean;\n\n    @Prop({ default: false })\n    disabled!: boolean;\n\n    // Set to true to only allow external changes\n    @Prop({ default: false })\n    manual!: boolean;\n\n    @Prop({ default: false })\n    indeterminate!: boolean;\n\n    get hasDefaultSlot() {\n        return !!this.$slots.default\n    }\n\n    get checkboxValue() {\n        return this.modelValue;\n    }\n\n    set checkboxValue(value) {\n        this.$emit(\"update:modelValue\", value)\n\n        // Add support for a model that doesn't change\n        this.$nextTick(() => {\n            if (this.checkboxValue !== value) {\n                if (this.$refs.checkbox) {\n                    (this.$refs.checkbox as any).checked = this.checkboxValue;\n                }\n            }\n        })\n    }\n}\n</script>\n\n<style lang=\"scss\">\n    .checkbox.manual {\n        pointer-events: none;\n    }\n</style>\n","<template>\n    <component :is=\"elementName\" class=\"context-menu-item\" type=\"button\" :class=\"[{ isOpen: isOpen, hover: isHovered }, $props.class]\" @click.stop=\"onClick\" @mouseover.passive=\"onMouseOver\" @mouseleave.passive=\"onMouseLeave\">\n        <div class=\"left\">\n            <slot name=\"left\" />\n        </div>\n        <div class=\"middle\">\n            <slot />\n        </div>\n        <div class=\"right\">\n            <slot name=\"right\" />\n        </div>\n    </component>\n</template>\n\n<script lang=\"ts\">\nimport { ComponentWithProperties, NavigationMixin } from '@simonbackx/vue-app-navigation';\nimport { Component, Mixins, Prop } from '@simonbackx/vue-app-navigation/classes';\nimport ContextMenuView from './ContextMenuView.vue';\n\n@Component({\n    inheritAttrs: false,\n})\nexport default class ContextMenuItemView extends Mixins(NavigationMixin) {\n    clicked = false;\n    isHovered = false;\n\n    @Prop({ default: 'button' })\n    elementName!: string;\n\n    @Prop({ default: '' })\n    class!: string;\n\n    @Prop({ default: null })\n    childContextMenu!: ComponentWithProperties | null;\n\n    @Prop({ required: true })\n    contextMenuView!: InstanceType<typeof ContextMenuView>;\n\n    get isOpen() {\n        return (this.contextMenuView)?.childMenu && (this.contextMenuView).childMenu === this.childContextMenu;\n    }\n\n    onMouseOver() {\n        (this.contextMenuView).onHoverItem(this);\n    }\n\n    onMouseLeave() {\n        (this.contextMenuView).onMouseLeaveItem(this);\n    }\n\n    onClick(event) {\n        (this.contextMenuView).onClickItem(this, event);\n    }\n}\n</script>\n","<template>\n    <hr class=\"context-menu-line\">\n</template>\n\n<script lang=\"ts\">\nimport { Component, VueComponent } from \"@simonbackx/vue-app-navigation/classes\";\n\n@Component\nexport default class ContextMenuLine extends VueComponent {}\n</script>\n","<template>\n    <div class=\"context-menu-container\" :class=\"{ hasParent: !!parentMenu, disableDismiss: !autoDismiss }\" @click=\"pop()\" @contextmenu.prevent>\n        <div\n            ref=\"context\"\n            class=\"context-menu\"\n            :class=\"usedXPlacement+' '+usedYPlacement\"\n            :style=\"{ transformOrigin, top: top !== null ? top + 'px' : undefined, left: left !== null ? (left + 'px') : undefined, right: right !== null ? (right + 'px') : undefined, bottom: bottom !== null ? (bottom + 'px') : undefined, width: usedPreferredWidth !== null ? (usedPreferredWidth + 'px') : undefined, height: usedPreferredHeight !== null ? (usedPreferredHeight + 'px') : undefined }\"\n            @click.stop=\"\"\n        >\n            <slot />\n        </div>\n\n        <div v-if=\"ignoreHoverTriangle && false\" class=\"triangle\" :style=\"{ 'clip-path': 'polygon('+ignoreHoverTriangle.p1.x+'px '+ignoreHoverTriangle.p1.y+'px, '+ignoreHoverTriangle.p2.x+'px '+ignoreHoverTriangle.p2.y+'px, '+ignoreHoverTriangle.p3.x+'px '+ignoreHoverTriangle.p3.y+'px)'}\" />\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { ComponentWithProperties, injectHooks, usePop } from '@simonbackx/vue-app-navigation';\n\nimport { Component, Prop, VueComponent } from '@simonbackx/vue-app-navigation/classes';\nimport { ViewportHelper } from '../ViewportHelper';\nimport ContextMenuItemView from './ContextMenuItemView.vue';\n\nfunction triangleContains(ax, ay, bx, by, cx, cy, x, y) {\n    let det = (bx - ax) * (cy - ay) - (by - ay) * (cx - ax);\n\n    return det * ((bx - ax) * (y - ay) - (by - ay) * (x - ax)) >= 0\n        && det * ((cx - bx) * (y - by) - (cy - by) * (x - bx)) >= 0\n        && det * ((ax - cx) * (y - cy) - (ay - cy) * (x - cx)) >= 0;\n}\n\n@Component({\n    inheritAttrs: false,\n})\nexport default class ContextMenuView extends VueComponent {\n    @Prop({\n        default: 0,\n    })\n    x!: number;\n\n    @Prop({\n        default: null,\n    })\n    preferredWidth!: number | null;\n\n    usedPreferredHeight: number | null = null;\n    usedPreferredWidth: number | null = this.preferredWidth;\n    hide = false;\n\n    @Prop({\n        default: 0,\n    })\n    y!: number;\n\n    top: number | null = null;\n    left: number | null = null;\n    right: number | null = null;\n    bottom: number | null = null;\n\n    transformOrigin = '0 0';\n\n    @Prop({\n        default: 'right',\n    })\n    xPlacement!: 'right' | 'left';\n\n    usedXPlacement: 'right' | 'left' = this.xPlacement;\n\n    @Prop({\n        default: 'bottom',\n    })\n    yPlacement!: 'bottom' | 'top';\n\n    usedYPlacement: 'bottom' | 'top' = this.yPlacement;\n\n    @Prop({\n        default: null,\n    })\n    parentMenu!: ContextMenuView | null;\n\n    /**\n     * In case a placement is not possible, instead of just swapping xPlacement, also affect the x position first with the wrapWidth (needed for e.g. context menu's)\n     */\n    @Prop({\n        default: null,\n    })\n    wrapWidth!: number | null;\n\n    /**\n     * In case a placement is not possible, instead of just swapping xPlacement, also affect the x position first with the wrapWidth (needed for e.g. context menu's)\n     */\n    @Prop({\n        default: null,\n    })\n    wrapHeight!: number | null;\n\n    @Prop({\n        default: true,\n    })\n    autoDismiss!: boolean;\n\n    isPopped = false;\n\n    disableHoverChildMenus = false;\n\n    created(this: any) {\n        // we cannot use setup in mixins, but we want to avoid having to duplicate the 'use' hooks logic.\n        // so this is a workaround\n        const definitions: any = {\n            parentPop: usePop(),\n        };\n\n        injectHooks(this, definitions);\n    }\n\n    mounted() {\n        // Calculate position\n        let width = (this.$refs.context as HTMLElement).offsetWidth;\n        let height = (this.$refs.context as HTMLElement).offsetHeight;\n\n        const win = window,\n            doc = document,\n            docElem = doc.documentElement,\n            body = doc.getElementsByTagName('body')[0],\n            clientWidth = win.innerWidth || docElem.clientWidth || body.clientWidth,\n            clientHeight = win.innerHeight || docElem.clientHeight || body.clientHeight;\n\n        const viewPadding = 15;\n        const viewPaddingBottom = Math.max(clientHeight < 900 ? 5 : 15, ViewportHelper.getBottomPadding());\n        const viewPaddingTop = clientHeight < 900 ? 5 : 15;\n\n        if (width > clientWidth - viewPadding * 2) {\n            this.usedPreferredWidth = clientWidth - viewPadding * 2;\n            width = this.usedPreferredWidth;\n        }\n\n        if (height > clientHeight - viewPaddingTop - viewPaddingBottom) {\n            this.usedPreferredHeight = clientHeight - viewPaddingTop - viewPaddingBottom;\n            height = this.usedPreferredHeight;\n        }\n\n        if (width > clientWidth / 2) {\n            // Screen is too small to fit multiple context menus\n            this.disableHoverChildMenus = true;\n        }\n\n        let usedX = this.x;\n\n        if (this.xPlacement === 'right') {\n            this.left = this.x;\n\n            // If the remaining space is too small, we need to wrap\n            if (width > clientWidth - viewPadding - this.x) {\n                this.left = null;\n                this.usedXPlacement = 'left';\n\n                if (this.wrapWidth !== null) {\n                    // Wrap instead of sticking to right\n                    usedX = usedX - this.wrapWidth;\n                    this.right = Math.min(clientWidth - usedX, clientWidth - viewPadding - width);\n\n                    if (this.right < viewPadding) {\n                        this.right = viewPadding;\n                    }\n                }\n                else {\n                    this.right = viewPadding;\n                }\n            }\n            else {\n                if (this.left < viewPadding) {\n                    this.left = viewPadding;\n                }\n            }\n            // - Math.max(0, width - (clientWidth - viewPadding - usedX);\n        }\n        else {\n            this.right = Math.min(clientWidth - usedX, clientWidth - viewPadding - width);\n\n            if (this.right < viewPadding) {\n                this.right = viewPadding;\n            }\n        }\n\n        let usedY = this.y;\n\n        if (this.yPlacement === 'bottom') {\n            this.top = this.y;// - Math.max(0, height - (clientHeight - viewPadding - this.y)); // remove border\n\n            // If the remaining space is too small, we need to wrap\n            if (height > clientHeight - viewPaddingBottom - this.y) {\n                this.top = null;\n                this.usedYPlacement = 'top';\n\n                if (this.wrapHeight !== null && height <= usedY - this.wrapHeight - viewPaddingTop) {\n                    // Wrap instead of sticking to bottom\n                    usedY = usedY - this.wrapHeight;\n                    this.bottom = Math.min(clientHeight - usedY, clientHeight - viewPaddingTop - height);\n\n                    if (this.bottom < viewPaddingBottom) {\n                        this.bottom = viewPaddingBottom;\n                    }\n                }\n                else {\n                    this.bottom = viewPaddingBottom;\n                }\n            }\n            else {\n                if (this.top < viewPaddingTop) {\n                    this.top = viewPaddingTop;\n                }\n            }\n        }\n        else {\n            this.bottom = Math.min(clientHeight - usedY, clientHeight - viewPaddingTop - height); // remove border\n\n            if (this.bottom < viewPaddingBottom) {\n                this.bottom = viewPaddingBottom;\n            }\n        }\n\n        const objLeft = this.left ? this.left : (clientWidth - this.right! - width);\n        const xTransform = ((usedX - objLeft) / width * 100).toFixed(2);\n\n        const objTop = this.top ? this.top : (clientHeight - this.bottom! - height);\n        const yTransform = ((usedY - objTop) / height * 100).toFixed(2);\n\n        this.transformOrigin = xTransform + '% ' + yTransform + '%';\n\n        if (!this.usedPreferredHeight) {\n            // Only assign drag selectors if we actually  have context items\n            if (this.$refs.context.querySelector('.context-menu-item')) {\n                // Allow scrolling if height is restricted, else add touch listeners to allow selection by dragging\n                window.addEventListener('touchstart', this.onTouchStart, { passive: false });\n                window.addEventListener('touchmove', this.onTouchMove, { passive: false });\n                window.addEventListener('touchend', this.onTouchUp, { passive: false });\n            }\n        }\n\n        if (this.isPopped || this.parentMenu?.isPopped || (this.parentMenu && (!this.parentMenu.$el || !this.parentMenu.$el.isConnected))) {\n            // Pop was dismissed before we could mount this context menu\n            console.error('Context menu lost its parent menu during mounting');\n            this.pop(false);\n        }\n    }\n\n    beforeUnmount() {\n        this.popChildMenu();\n        window.removeEventListener('touchstart', this.onTouchStart);\n        window.removeEventListener('touchmove', this.onTouchMove);\n        window.removeEventListener('touchend', this.onTouchUp);\n    }\n\n    childMenu: ComponentWithProperties | null = null;\n\n    popChildMenu() {\n        if (this.childMenu) {\n            const instance = this.childMenu.componentInstance() as any;\n\n            if (instance) {\n                console.log('Pop child menu');\n                instance.pop(false);\n            }\n            else (\n                console.warn('Missing instance for childMenu')\n            );\n        }\n        this.childMenu = null;\n    }\n\n    currentlyHoveredItem: ContextMenuItemView | null = null;\n\n    // When we hover an item that has a child menu, we need to cancel other hovers if the mouse moves to the child menu\n    ignoreHover = false;\n    ignoreHoverItem: ContextMenuItemView | null = null;\n    ignoreHoverTimeout: NodeJS.Timeout | null = null;\n    ignoreHoverTriangle: { p1: { x: number; y: number }; p2: { x: number; y: number }; p3: { x: number; y: number } } | null = null;\n\n    delayHover(ms: number) {\n        this.ignoreHover = true;\n        if (this.ignoreHoverTimeout) {\n            clearTimeout(this.ignoreHoverTimeout);\n        }\n\n        if (ms <= 0) {\n            if (this.currentlyHoveredItem && this.ignoreHoverItem === this.currentlyHoveredItem) {\n                // Ignore, and wait for next timer\n                return;\n            }\n            this.endIgnoreHover();\n            return;\n        }\n        this.ignoreHoverTimeout = setTimeout(() => {\n            if (this.currentlyHoveredItem && this.ignoreHoverItem === this.currentlyHoveredItem) {\n                // Ignore, and wait for next timer\n                return;\n            }\n            this.endIgnoreHover();\n        }, ms);\n    }\n\n    endIgnoreHover() {\n        this.ignoreHover = false;\n\n        // Remove listener\n        window.removeEventListener('mousemove', this.onMouseMove);\n\n        this.ignoreHoverTriangle = null;\n\n        const item = this.ignoreHoverItem;\n        this.ignoreHoverItem = null;\n\n        if (this.isPopped) {\n            return;\n        }\n\n        // Execute mouseover again: if we are above a different context menu item: close the popup and/or open a new one\n        if (this.currentlyHoveredItem && this.currentlyHoveredItem !== item) {\n            this.onHoverItem(this.currentlyHoveredItem);\n        }\n    }\n\n    hoverTimeout: NodeJS.Timeout | null = null;\n\n    onHoverItem(item: ContextMenuItemView) {\n        this.currentlyHoveredItem = item;\n\n        if (this.shouldIgnoreHover()) {\n            return;\n        }\n\n        // Update hover style\n        const wasHovered = item.isHovered;\n        item.isHovered = true;\n\n        if (this.disableHoverChildMenus) {\n            // Never automatically show a child menu\n            return;\n        }\n\n        if (!wasHovered && this.hoverTimeout) {\n            clearTimeout(this.hoverTimeout);\n            this.hoverTimeout = null;\n        }\n\n        if (item.childContextMenu) {\n            if (!wasHovered) {\n                this.setChildMenu(null);\n                this.hoverTimeout = setTimeout(() => {\n                    if (item.isHovered && this.currentlyHoveredItem === item && !this.shouldIgnoreHover() && item.childContextMenu && !item.childContextMenu.componentInstance()) {\n                        // TODO: Wait x ms hover delay, and check is the cursor is still hovered\n\n                        if (this.isPopped) {\n                            return;\n                        }\n                        // Present child context menu + send close event to parent\n                        const el = item.$el as HTMLElement;\n\n                        if (el.classList.contains('disabled')) {\n                            return;\n                        }\n                        const bounds = el.getBoundingClientRect();\n\n                        item.childContextMenu.properties.x = bounds.right;\n                        item.childContextMenu.properties.y = bounds.top;\n                        item.childContextMenu.properties.xPlacement = 'right';\n                        item.childContextMenu.properties.yPlacement = 'bottom';\n                        item.childContextMenu.properties.parentMenu = this;\n                        item.childContextMenu.properties.wrapWidth = el.clientWidth;\n\n                        this.setChildMenu(item.childContextMenu);\n                        item.present(item.childContextMenu.setDisplayStyle('overlay'));\n                    }\n                }, 150);\n            }\n        }\n        else {\n            this.setChildMenu(null);\n        }\n    }\n\n    onMouseLeaveItem(item: ContextMenuItemView) {\n        if (this.currentlyHoveredItem === item) {\n            this.currentlyHoveredItem = null;\n\n            if (item === this.ignoreHoverItem) {\n                this.delayHover(50);\n            }\n        }\n\n        // Update hover style if changed\n        item.isHovered = false;\n    }\n\n    onClickItem(item: ContextMenuItemView, event) {\n        if (item.clicked) {\n            return;\n        }\n        item.clicked = true;\n\n        if (item.childContextMenu) {\n            // No click actions\n            if (this.disableHoverChildMenus || (('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || ((navigator as any).msMaxTouchPoints > 0))) {\n                // Show child menu and replace self\n\n                if (!item.childContextMenu.componentInstance() && !this.shouldIgnoreHover()) {\n                    this.pop(true);\n\n                    // Present child context menu + send close event to parent\n                    const el = item.$el as HTMLElement;\n                    const bounds = el.getBoundingClientRect();\n\n                    // TODO: calculate better position\n                    item.childContextMenu.properties.x = bounds.left;\n                    item.childContextMenu.properties.y = bounds.top;\n                    item.childContextMenu.properties.xPlacement = 'right';\n                    item.childContextMenu.properties.yPlacement = 'bottom';\n                    item.childContextMenu.properties.parentMenu = null;\n                    item.present(item.childContextMenu.setDisplayStyle('overlay'));\n                }\n            }\n            return;\n        }\n\n        // We need to delay click events because otherwise for some unknown reason, it would trigger again on a 'popup' and close it immediately\n        setTimeout(() => {\n            item.$emit('click', event);\n        }, 10);\n\n        // Wait to pop to let the browser handle events (e.g. label > checkbox)\n        this.delayPop(true);\n    }\n\n    setChildMenu(component: ComponentWithProperties | null) {\n        if (this.childMenu === component) {\n            return;\n        }\n\n        this.popChildMenu();\n        this.childMenu = component;\n\n        // Capture initial mouse X + Y Position,\n        // calculate the triangle in which region we shouldn't hover\n        // keep adjusting the triangle as the mouse moves, but if the mouse stops too long, stop\n\n        if (component && this.currentlyHoveredItem && !this.ignoreHoverItem) {\n            // If the cursor now moves to the newly created context menu, we'll add a delay and prevent any other context menu hovering\n            this.ignoreHoverItem = this.currentlyHoveredItem;\n\n            // We cant calculate the triangle yet, because the child menu is not yet mounted\n            this.ignoreHoverTriangle = null;\n            this.delayHover(50);\n            window.addEventListener('mousemove', this.onMouseMove, { passive: true });\n        }\n    }\n\n    calculateHoverTriangle(mouseX, mouseY) {\n        if (!this.childMenu) {\n            return;\n        }\n        const instance = this.childMenu.componentInstance();\n        if (!instance) {\n            return;\n        }\n\n        // Get the child element, since the main element covers the whole window\n        const element = instance.$el.childNodes[0] as HTMLElement;\n\n        if (!element) {\n            return;\n        }\n\n        const bounds = element.getBoundingClientRect();\n\n        const contextX = bounds.left;\n        const contextY = bounds.top;\n        const contextY2 = bounds.bottom;\n        const contextX2 = bounds.right;\n\n        if (contextX < mouseX) {\n            // Menu is on the left side\n\n            return {\n                p1: { x: mouseX + 5, y: mouseY },\n                p2: { x: contextX2, y: contextY },\n                p3: { x: contextX2, y: contextY2 },\n            };\n        }\n        else {\n            return {\n                p1: { x: mouseX - 5, y: mouseY },\n                p2: { x: contextX, y: contextY },\n                p3: { x: contextX, y: contextY2 },\n            };\n        }\n    }\n\n    updateHoverTriangle(mouseX, mouseY) {\n        const triangle = this.calculateHoverTriangle(mouseX, mouseY);\n        if (triangle) {\n            this.ignoreHoverTriangle = triangle;\n        }\n    }\n\n    shouldIgnoreHover() {\n        return this.isPopped || (\n            this.childMenu && (\n                this.ignoreHover\n            )\n        );\n    }\n\n    onMouseMove(event) {\n        if (!this.childMenu) {\n            // Wait for timer to end\n            return;\n        }\n\n        const mouseX = event.clientX;\n        const mouseY = event.clientY;\n\n        const isStillHovered = this.currentlyHoveredItem && this.currentlyHoveredItem === this.ignoreHoverItem;\n\n        if (this.ignoreHoverTriangle === null || isStillHovered) {\n            // We don't have triangle yet, probably because we didn't yet have the position\n            // of the mouse and the context menu\n\n            // Just update the triangle for now, but don't expand the delay\n\n            this.updateHoverTriangle(mouseX, mouseY);\n\n            return;\n        }\n\n        // Check if mouse position is inside the triangle\n\n        const p1 = this.ignoreHoverTriangle.p1;\n        const p2 = this.ignoreHoverTriangle.p2;\n        const p3 = this.ignoreHoverTriangle.p3;\n\n        if (!triangleContains(p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, mouseX, mouseY)) {\n            // Outside triangle:\n            // stop delay if we aren't hovering any longer\n            this.delayHover(0);\n            return;\n        }\n\n        // Mouse is inside the triangle\n        // Expand\n\n        this.delayHover(50);\n\n        // TODO: adjust triangle\n\n        // if X position got closer, then we'll adjust the triangle again\n        const triangle = this.calculateHoverTriangle(mouseX, mouseY);\n        if (triangle && Math.abs(p1.x - p2.x) > Math.abs(triangle.p1.x - triangle.p2.x)) {\n            this.ignoreHoverTriangle = triangle;\n        }\n\n        return;\n    }\n\n    getSelectedElementAt(x: number, y: number): HTMLElement | null {\n        // Check which one is hovered, and manually add a hover state to it\n        let selectedElement = document.elementFromPoint(x, y);\n\n        // Get parent until class is context-menu-item or stop when parent is document, or context-menu-container class\n        while (selectedElement && !selectedElement.classList.contains('context-menu-item') && !selectedElement.classList.contains('context-menu-container')) {\n            selectedElement = selectedElement.parentElement;\n        }\n        if (selectedElement && selectedElement.classList.contains('context-menu-item')) {\n            return selectedElement as HTMLElement;\n        }\n        return null;\n    }\n\n    getSelectedElement(event: TouchEvent): HTMLElement | null {\n        // Check which one is hovered, and manually add a hover state to it\n        return this.getSelectedElementAt(event.changedTouches[0].clientX, event.changedTouches[0].clientY);\n    }\n\n    isInsideMenu(x: number, y: number): boolean {\n        // Check which one is hovered, and manually add a hover state to it\n        let selectedElement = document.elementFromPoint(x, y);\n\n        if (selectedElement && selectedElement.closest('.context-menu')) {\n            return true;\n        }\n\n        return false;\n    }\n\n    isEventInsideMenu(event: TouchEvent): boolean {\n        // Check which one is hovered, and manually add a hover state to it\n        return this.isInsideMenu(event.changedTouches[0].clientX, event.changedTouches[0].clientY);\n    }\n\n    onTouchMove(event: TouchEvent) {\n        // Check which one is hovered, and manually add a hover state to it\n        const selectedElement = this.getSelectedElement(event);\n\n        this.$el.querySelectorAll('.context-menu-item').forEach((item) => {\n            item.classList.remove('hover');\n            item.classList.add('disable-active');\n        });\n\n        if (selectedElement) {\n            selectedElement.classList.add('hover');\n        }\n\n        event.preventDefault();\n    }\n\n    onTouchStart(event: TouchEvent) {\n        if (!this.isEventInsideMenu(event)) {\n            // Allow to trigger 'click' to close the context menu\n            return;\n        }\n        event.preventDefault();\n    }\n\n    onTouchUp(event) {\n        if (this.isPopped) {\n            // We're already popped, so we don't need to do anything\n            return;\n        }\n\n        const selectedElement = this.getSelectedElement(event);\n        if (selectedElement) {\n            // Prevent the touch up event from triggering a click event later\n            event.preventDefault();\n\n            // Add a delay because the browser otherwise will trigger a click event on possible child menus\n            setTimeout(() => {\n                selectedElement.click();\n            }, 50);\n        }\n    }\n\n    delayPop(popParents = false) {\n        if (this.isPopped) {\n            // Ignore\n            return;\n        }\n\n        this.isPopped = true;\n\n        // Allow some time to let the browser handle some events (e.g. label > update checkbox)\n        setTimeout(() => {\n            // set isPopped to false again, to force pop\n            this.isPopped = false;\n            this.pop(popParents);\n        }, 80);\n    }\n\n    pop(popParents = false) {\n        if (this.isPopped || this.hide) {\n            // Ignore\n            return;\n        }\n        console.log('Popping ContextMenuView');\n        this.isPopped = true;\n        this.popChildMenu();\n\n        // Trigger hide animation\n        this.hide = true;\n        // setTimeout(() => {\n        (this as any).parentPop({ force: true });\n        // }, 200);\n\n        if (popParents && this.parentMenu) {\n            this.parentMenu.pop(true);\n        }\n    }\n\n    activated() {\n        document.addEventListener('keydown', this.onKey);\n    }\n\n    deactivated() {\n        document.removeEventListener('keydown', this.onKey);\n    }\n\n    onKey(event) {\n        if (event.defaultPrevented || event.repeat) {\n            return;\n        }\n\n        const key = event.key || event.keyCode;\n\n        if (key === 'Escape' || key === 'Esc' || key === 27) {\n            this.pop(true);\n            event.preventDefault();\n        }\n    }\n}\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use '@stamhoofd/scss/base/text-styles.scss';\n\n.context-menu-container {\n    position: fixed;\n    z-index: 10000;\n    left: 0;\n    top: 0;\n    bottom: 0;\n    right: 0;\n\n    // Allow dragging over the whole screen on touch devices\n    touch-action: none;\n    user-select: none;\n    -webkit-user-select: none;\n    -webkit-touch-callout: none;\n\n    &.disableDismiss {\n        pointer-events: none;\n\n        > * {\n            pointer-events: all;\n        }\n    }\n\n    &.hasParent {\n        pointer-events: none;\n\n        .context-menu {\n            pointer-events: auto;\n        }\n    }\n\n    .context-menu {\n        transform-origin: 0% 0%;\n        transition: transform 0.2s;\n\n        &.top {\n            transform-origin: 0% 100%;\n        }\n\n        &.left {\n            transform-origin: 100% 0%;\n\n            &.top {\n                transform-origin: 100% 100%;\n            }\n        }\n\n    }\n\n    &.show-enter-active,\n    &.show-leave-active {\n        transition: opacity 0.2s;\n    }\n\n    &.show-enter-from /* .fade-leave-active below version 2.1.8 */ {\n        // Instant appearing context menu! (only leave animation)\n        opacity: 0;\n\n        .context-menu {\n            transform: scale(0.8, 0.8);\n        }\n    }\n\n    &.show-leave-to /* .fade-leave-active below version 2.1.8 */ {\n        // Instant appearing context menu! (only leave animation)\n        opacity: 0;\n\n        .context-menu {\n            transform: scale(0.8, 0.8);\n        }\n    }\n\n    .triangle {\n        position: absolute;\n        left: 0;\n        right: 0;\n        bottom: 0;\n        top: 0;\n        background: red;\n        opacity: 0.5;\n        pointer-events: none;\n        z-index: 100000;\n    }\n}\n\n.context-menu {\n    position: fixed;\n    z-index: 10000;\n\n    background: $color-background-shade-darker;\n\n    --color-current-background: #{$color-background-shade-darker};\n    --color-current-background-shade: #{$color-border};\n\n    border: $border-width-thin solid $color-border-shade;\n    padding: 6px 15px;\n\n    @extend .style-overlay-shadow;\n    border-radius: $border-radius-modals;\n    box-sizing: border-box;\n    min-width: 200px;\n\n    @media (max-width: 450px) {\n        min-width: 70vw;\n    }\n\n    max-width: min(600px, 100vw);\n    max-width: min(600px, calc(100vw - 30px));\n    overflow: hidden;\n    overflow-y: auto;\n\n    // Hide carret in element below the context menu\n    transform: translate3d(0, 0, 0);\n\n    .context-menu-item {\n        @extend .style-context-menu-item;\n        cursor: pointer;\n        user-select: none;\n        touch-action: manipulation;\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n        min-height: 24px;\n        margin: 0 -9px;\n        padding: 4px 9px;\n        border-radius: $border-radius;\n\n        // Fix for button width\n        width: 100%;\n        text-align: left;\n        box-sizing: content-box;\n\n        @media (max-width: 450px) {\n            min-height: 38px;\n        }\n\n        &.with-description {\n            min-height: 42px;\n        }\n\n        .description {\n            @extend .style-context-menu-item-description;\n            padding-top: 3px;\n        }\n\n        > .left {\n            &:empty {\n                display: none;\n            }\n            flex-shrink: 0;\n            padding-right: 10px;\n        }\n\n        > .middle {\n            padding: 2px 0;\n            min-width: 0;\n            overflow: hidden;\n            text-overflow: ellipsis;\n            white-space: nowrap;\n        }\n\n        .icon:not(.arrow-right-small):not(.arrow-down-small):not(.arrow-up-small) {\n            width: 20px;\n            height: 20px;\n            font-size: 20px;\n\n            &:before {\n                font-size: 20px;\n            }\n        }\n\n        > .right {\n            &:empty {\n                display: none;\n            }\n            margin-left: auto;\n            flex-shrink: 0;\n            padding-left: 20px;\n        }\n\n        /** Note we use a class, because :disabled also disables hover events */\n        &.disabled {\n            opacity: 0.3;\n            cursor: not-allowed;\n        }\n\n        &.destructive {\n            color: $color-error;\n        }\n\n        &:not(.disabled) {\n            &.isOpen {\n                background: $color-gray-2;\n            }\n\n            &.hover {\n                background: $color-primary;\n                color: $color-primary-contrast;\n            }\n\n            &:active:not(.disable-active) {\n                background: $color-primary;\n                color: $color-primary-contrast;\n            }\n        }\n    }\n\n    .context-menu-line {\n        background: $color-border-shade;\n        border: 0;\n        outline: 0;\n        border-radius: $border-width-thin;\n        height: $border-width-thin;\n        margin: 6px 0;\n\n        @media (max-width: 450px) {\n            margin: 6px 0;\n        }\n    }\n}\n</style>\n","<template>\n    <div>\n    <ContextMenuView v-bind=\"$attrs\" @mousedown.native.prevent ref=\"contextMenuView\">\n        <template v-for=\"(items, groupIndex) of menu.items\" :key=\"groupIndex+'-group'\" >\n            <ContextMenuLine v-if=\"groupIndex > 0\" />\n\n            <ContextMenuItemView v-for=\"(item, index) of items\" :contextMenuView=\"$refs.contextMenuView\" :key=\"index\" v-tooltip=\"item.disabled\" :class=\"{'disabled': !!item.disabled, 'with-description': !!item.description}\" :child-context-menu=\"item.childMenu ? item.childMenu.getComponent() : undefined\" @click=\"handleAction(item, $event)\">\n                <template #left v-if=\"item.selected !== null || item.leftIcon !== null\">\n                    <Checkbox v-if=\"item.selected !== null\" :modelValue=\"item.selected\" :only-line=\"true\" />\n                    <span v-else :class=\"'icon '+item.leftIcon\" />\n                </template>\n\n                <p>{{ item.name }}</p>\n                <p v-if=\"item.description\" class=\"description\">\n                    {{ item.description }}\n                </p>\n\n                <template #right  v-if=\"item.childMenu || item.icon !== null || item.rightText !== null\">\n                    <span v-if=\"item.childMenu\"  class=\"icon arrow-right-small\" />\n                    <span v-else-if=\"item.icon !== null\" :class=\"'icon '+item.icon\" />\n                    <span v-else class=\"style-context-menu-item-description\">\n                        {{ item.rightText }}\n                    </span>\n                </template>\n            </ContextMenuItemView>\n        </template>\n    </ContextMenuView>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { Component, Prop, VueComponent } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport Checkbox from \"../inputs/Checkbox.vue\";\nimport { ContextMenu, ContextMenuItem } from \"./ContextMenu\";\nimport ContextMenuItemView from \"./ContextMenuItemView.vue\";\nimport ContextMenuLine from \"./ContextMenuLine.vue\";\nimport ContextMenuView from \"./ContextMenuView.vue\";\n\n@Component({\n    components: {\n        ContextMenuView,\n        ContextMenuItemView,\n        ContextMenuLine,\n        Checkbox\n    }\n})\nexport default class GeneralContextMenuView extends VueComponent {\n    @Prop({ required: false })\n        menu: ContextMenu;\n\n    handleAction(item: ContextMenuItem, event) {\n        if (!item.action || item.disabled) {\n            return\n        }\n        item.action.call(item, event)\n    }\n\n    pop(popParents = false) {\n        this.$refs.contextMenuView.pop(popParents);\n    }\n\n}\n</script>\n","import { ComponentWithProperties, PushOptions } from \"@simonbackx/vue-app-navigation\";\n\nimport { EventBus } from \"../EventBus\";\n\nexport const ModalStackEventBus = new EventBus<\"present\", PushOptions | ComponentWithProperties>()\nexport const ReplaceRootEventBus = new EventBus<\"replace\", ComponentWithProperties>()","import { ComponentWithProperties, NavigationMixin } from \"@simonbackx/vue-app-navigation\"\n\nimport GeneralContextMenuView from \"./GeneralContextMenuView.vue\"\nimport { ModalStackEventBus } from \"./ModalStackEventBus\"\nimport { markRaw } from \"vue\"\n\nexport class ContextMenuItem {\n    name: string\n    description?: string\n\n    leftIcon: string | null = null\n    rightText: string | null = null\n    icon: string | null = null\n\n    /**\n     * Shows a checkbox on the left if true/false.\n     * You can  alter the selected value in action() to adjust it.\n     */\n    selected: boolean | null = null\n    disabled: boolean | string = false\n\n    /**\n     * Return true when the context menu should get closed.\n     */\n    action: ((this: ContextMenuItem) => unknown|Promise<void>) | null = null\n\n    /**\n     * Context menu to show when hovered\n     */\n    childMenu: ContextMenu | null = null\n\n    constructor(settings: Partial<ContextMenuItem>) {\n        markRaw(this)\n        Object.assign(this, settings)\n    }\n}\n\nexport class ContextMenu {\n    /**\n     * Prevent the default behaviour of click on the item, e.g. to keep the focus on an input element\n     */\n    preventDefault = false\n\n    items: ContextMenuItem[][]\n\n    constructor(items: ContextMenuItem[][]) {\n        markRaw(this)\n        this.items = items.filter(i => i.length > 0)\n    }\n\n    getComponent() {\n        return new ComponentWithProperties(GeneralContextMenuView, { menu: this})\n    }\n\n    async show(position: { component?: NavigationMixin, clickEvent?: TouchEvent | MouseEvent, button?: HTMLElement, x?: number, y?: number, xPlacement?: \"right\" | \"left\", yPlacement?: \"bottom\" | \"top\" , wrapWidth?: number, wrapHeight?: number, yOffset?: number, xOffset?: number }) {\n        if (position.button) {\n            const bounds = position.button.getBoundingClientRect()\n\n            if (!position.xPlacement || position.xPlacement === \"right\") {\n                position.x = bounds.left\n            } else {\n                position.x = bounds.right\n            }\n\n            if (!position.yPlacement || position.yPlacement === \"bottom\") {\n                position.y = bounds.bottom\n            } else {\n                position.y = bounds.top\n            }\n\n            position.wrapWidth = bounds.width\n            position.wrapHeight = bounds.height\n        }\n\n        if (position.clickEvent) {\n            const event = position.clickEvent as any\n            position.x = event.changedTouches ? event.changedTouches[0].pageX : event.clientX\n            position.y = event.changedTouches ? event.changedTouches[0].pageY : event.clientY\n        }\n\n        if (position.y !== undefined && position.yOffset) {\n            position.y += position.yOffset\n        }\n\n        if (position.x !== undefined && position.xOffset) {\n            position.x += position.xOffset\n        }\n\n        const component = position.component;\n        delete position.component\n\n        const menuComponent = new ComponentWithProperties(GeneralContextMenuView, {\n            menu: this,\n            ...position\n        })\n        if (component) {\n            component.present({\n                components: [menuComponent],\n                modalDisplayStyle: \"overlay\",\n            })\n        } else {\n            await ModalStackEventBus.sendEvent(\"present\", {\n                components: [menuComponent],\n                modalDisplayStyle: \"overlay\",\n            })\n        }\n        return this\n    }\n}\n","import { DataPermissionsSettings, Group, OrganizationRecordsConfiguration } from \"@stamhoofd/structures\";\nimport { computed, Ref, unref } from \"vue\";\nimport { useOrganization, usePlatform } from \"../../hooks\";\n\nexport function useDataPermissionSettings(options?: {group?: Ref<Group|null>|Group|null}) {\n    const platform = usePlatform()\n    const organization = useOrganization()\n\n    const dataPermissionSettings = computed(() => platform.value.config.dataPermission ?? DataPermissionsSettings.create({}) )\n    const recordsConfiguration = computed(() => OrganizationRecordsConfiguration.build({\n        platform: platform.value,\n        organization: organization.value,\n        group: unref(options?.group),\n        includeGroup: true\n    }))\n\n    return {\n        enabled: computed(() => recordsConfiguration.value.dataPermission),\n        dataPermissionSettings\n    }\n}\n","import { Decoder } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, NavigationController, usePresent } from '@simonbackx/vue-app-navigation';\nimport { SessionContext, useRequestOwner } from '@stamhoofd/networking';\nimport { Organization } from '@stamhoofd/structures';\nimport { computed, ref, Ref, watchEffect } from 'vue';\nimport { ErrorBox } from '../../errors/ErrorBox';\nimport { useOrganization } from '../../hooks';\nimport { SearchOrganizationView } from '../../members';\nimport { NavigationActions } from '../../types/NavigationActions';\n\nexport function useExternalOrganization(organizationId: Ref<string | null>, organizationHint?: Organization | null) {\n    const organization = useOrganization();\n    const loadedOrganization = ref(null) as Ref<Organization | null>;\n    const errorBox = ref(null) as Ref<ErrorBox | null>;\n    const present = usePresent();\n\n    let loadingOrganizationId: string | null; // not reactive\n    let loadingCount = 0;\n\n    const owner = useRequestOwner();\n\n    const externalOrganization = computed(() => {\n        if (!organizationId.value) {\n            return null;\n        }\n\n        if (organizationId.value === organization.value?.id) {\n            return organization.value;\n        }\n\n        if (organizationHint && organizationHint.id === organizationId.value) {\n            return organizationHint;\n        }\n\n        return loadedOrganization.value;\n    });\n\n    function check() {\n        if (organizationId.value && (!externalOrganization.value || externalOrganization.value.id !== organizationId.value)) {\n            // Start loading\n            loadOrganization().catch(console.error);\n        }\n    }\n\n    watchEffect(() => {\n        check();\n    });\n\n    async function loadOrganization() {\n        const id = organizationId.value;\n        if (loadingOrganizationId === id) {\n            // Already loading\n            return;\n        }\n\n        loadingOrganizationId = id;\n        loadingCount++;\n        const currentCount = loadingCount;\n\n        try {\n            errorBox.value = null;\n            const response = await SessionContext.serverForOrganization(organizationId.value).request({\n                method: 'GET',\n                path: '/organization',\n                decoder: Organization as Decoder<Organization>,\n                shouldRetry: true,\n                owner,\n            });\n\n            if (loadingCount !== currentCount) {\n                // Ignore\n                return;\n            }\n\n            loadingOrganizationId = null;\n\n            if (response.data.id === organizationId.value) {\n                loadedOrganization.value = response.data;\n            }\n        }\n        catch (e) {\n            if (loadingCount !== currentCount) {\n                // Ignore\n                return;\n            }\n\n            loadingOrganizationId = null;\n            errorBox.value = new ErrorBox(e);\n        }\n    }\n\n    return {\n        loading: computed(() => externalOrganization.value === null && !!organizationId.value),\n        errorBox,\n        externalOrganization,\n        choose: async function chooseOrganizer(title: string, canSelect?: (organization: Organization) => Promise<boolean> | boolean) {\n            await present({\n                components: [\n                    new ComponentWithProperties(NavigationController, {\n                        root: new ComponentWithProperties(SearchOrganizationView, {\n                            title,\n                            selectOrganization: async (organization: Organization, { dismiss }: NavigationActions) => {\n                                if (canSelect && !(await canSelect(organization))) {\n                                    return;\n                                }\n                                await dismiss({ force: true });\n                                loadedOrganization.value = organization;\n                                organizationId.value = organization.id;\n                            },\n                        }),\n                    }),\n                ],\n                modalDisplayStyle: 'popup',\n            });\n        },\n    };\n}\n","<template>\n    <button v-if=\"$user\" class=\"button account-switcher\" type=\"button\" @click=\"showContextMenu\">\n        <figure>\n            <div v-color=\"$user.memberId\" class=\"letter-logo\" :data-length=\"letters.length\">\n                {{ letters }}\n                <span v-if=\"!letters\" class=\"icon user\" />\n            </div>\n\n            <span>\n                <span class=\"hide-medium\">{{ $user.name || 'Account' }}</span>\n                <span class=\"icon arrow-down-small\" />\n            </span>\n        </figure>\n    </button>\n    <template v-else-if=\"!isNative\">\n        <a class=\"button text only-icon-smartphone\" :href=\"'https://'+$domains.marketing+''\" rel=\"noopener\">\n            <span class=\"icon external\" />\n            <span>Terug naar website</span>\n        </a>\n\n        <a v-if=\"!isPlatform\" class=\"button primary\" href=\"/aansluiten\" @click.prevent=\"$navigate('join')\">\n            {{ $t(\"2cd40bd9-b158-42e3-81e2-c02c560ab2e5\") }}\n        </a>\n    </template>\n</template>\n\n<script setup lang=\"ts\" name=\"AccountSwitcher\">\nimport { defineRoutes, useNavigate } from '@simonbackx/vue-app-navigation';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed } from 'vue';\n\nimport { AppManager } from '@stamhoofd/networking';\nimport { useUser } from '../hooks';\n\nconst $user = useUser();\nconst $navigate = useNavigate();\nconst isNative = AppManager.shared.isNative\nconst isPlatform = STAMHOOFD.userMode === 'platform'\n\n// todo: this isn't working yet on start\ndefineRoutes([\n    {\n        url: 'account',\n        component: async () => (await import('../views/AccountSettingsView.vue')).default as any,\n        present: \"popup\"\n    }\n])\n\nconst letters = computed(() => {\n    return $user.value ? Formatter.firstLetters($user.value.name, 3) : ''\n});\n\nconst showContextMenu = async () => {\n    await $navigate('account');\n};\n\n</script>\n\n<style lang=\"scss\">\n@use '@stamhoofd/scss/base/variables' as *;\n@use '@stamhoofd/scss/base/text-styles' as *;\n\n.account-switcher {\n    --block-width: 35px;\n\n    .context-navigation-bar & {\n        --block-width: 25px;\n    }\n\n    @media (hover: hover) {\n        &:hover {\n            opacity: 0.8;\n        }\n    }\n\n    &:active {\n        opacity: 0.5;\n    }\n\n    > figure {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        gap: 15px;\n\n        @media (max-width: 800px) {\n            gap: 5px;\n        }\n\n        > span {\n            display: inline-block;\n        }\n\n        > span > span {\n            @extend .style-interactive-small;\n            display: inline-block;\n            vertical-align: middle;\n            max-width: 200px;\n            overflow: hidden;\n            text-overflow: ellipsis;\n            white-space: nowrap;\n        }\n    }\n\n    .letter-logo {\n        width: var(--block-width, 35px);\n        height: var(--block-width, 35px);\n        border-radius: calc(var(--block-width, 35px) / 2);\n        text-align: center;\n        background: $color-primary-light;\n        color: $color-primary-dark;\n        text-transform: uppercase;\n        line-height: var(--block-width, 35px);\n        font-size: calc(var(--block-width, 35px) * 0.40);\n        font-weight: bold;\n        position: relative;\n\n        &[data-length=\"2\"] {\n            font-size: calc(var(--block-width, 35px) * 0.32);\n        }\n\n        &[data-length=\"3\"] {\n            font-size: calc(var(--block-width, 35px) * 0.32);\n            letter-spacing: -0.5px;\n        }\n    }\n}\n</style>\n","import { I18nController, useTranslate } from '@stamhoofd/frontend-i18n';\nimport { Organization } from '@stamhoofd/structures';\nimport { inject } from 'vue';\n\nexport type AppType = 'registration' | 'dashboard' | 'admin' | 'webshop';\n\nexport function useAppContext(): AppType | 'auto' {\n    return inject('stamhoofd_app', 'dashboard') as AppType | 'auto';\n}\n\nexport const getAppName = (app: AppType, $t: ReturnType<typeof useTranslate>) => {\n    switch (app) {\n        case 'dashboard': return $t('d5d2e25f-588e-496e-925f-f7e375c3888a');\n        case 'registration': return $t('f02ad9a5-f0b4-483e-961c-491ddf7d6f6a');\n        case 'admin': return 'Administratieportaal';\n        case 'webshop': return 'Webshop';\n    }\n};\n\nexport function useAppData() {\n    const $t = useTranslate();\n\n    return {\n        getAppTitle: (app: AppType | 'auto', organization: Organization | undefined | null) => getAppTitle(app, organization, $t),\n        getAppDescription: (app: AppType | 'auto', organization: Organization | undefined | null) => getAppDescription(app, organization, $t),\n        getAppName: (app: AppType) => getAppName(app, $t),\n    };\n}\n\nexport const getAppTitle = (app: AppType | 'auto', organization: Organization | undefined | null, $t: ReturnType<typeof useTranslate>) => {\n    if (app === 'auto' || app === 'dashboard') {\n        if (!organization) {\n            return 'Onbekend';\n        }\n        return organization.name;\n    }\n    return getAppName(app, $t);\n};\n\nexport const getAppDescription = (app: AppType | 'auto', organization: Organization | undefined | null, $t: ReturnType<typeof useTranslate>) => {\n    if (app === 'auto') {\n        if (organization) {\n            return organization.address.anonymousString(I18nController.shared.countryCode);\n        }\n        return null;\n    }\n\n    if (app === 'dashboard') {\n        return getAppName(app, $t);\n    }\n\n    if (!organization) {\n        switch (app) {\n            case 'registration': return 'Jouw gegevens en inschrijvingen';\n            case 'admin': return 'Portaal voor beroepskrachten';\n        }\n        return null;\n    }\n    return organization.name;\n};\n","export default import.meta.ROLLUP_FILE_URL_DQ28s_VH;","<template>\n    <figure class=\"organization-avatar\">\n        <div v-if=\"logo\" class=\"logo\">\n            <ImageComponent :image=\"logo\" />\n        </div>\n        <div v-else v-color=\"organization.meta.color\" class=\"letter-logo\" :data-length=\"letters.length\">\n            {{ letters }}\n        </div>\n    </figure>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Organization } from \"@stamhoofd/structures\";\nimport { Formatter } from \"@stamhoofd/utility\";\n\nimport { ImageComponent } from \"@stamhoofd/components\";\nimport { computed } from \"vue\";\nconst props = defineProps<{\n    organization: Organization\n}>()\n\nconst letters = computed(() => Formatter.firstLetters(props.organization.name, 3))\nconst logo = computed(() => props.organization.meta.squareLogo)\n</script>\n\n<style lang=\"scss\">\n@use '@stamhoofd/scss/base/variables' as *;\n\n.organization-avatar {\n    .letter-logo {\n        width: var(--block-width, 40px);\n        height: var(--block-width, 40px);\n        border-radius: $border-radius;\n        text-align: center;\n        background: $color-primary-light;\n        color: $color-primary-dark;\n        text-transform: uppercase;\n        line-height: var(--block-width, 40px);\n        font-size: calc(var(--block-width, 40px) * 0.40);\n        font-weight: bold;\n        position: relative;\n\n        &[data-length=\"2\"] {\n            font-size: calc(var(--block-width, 40px) * 0.32);\n        }\n\n        &[data-length=\"3\"] {\n            font-size: calc(var(--block-width, 40px) * 0.32);\n            letter-spacing: -0.5px;\n        }\n    }\n\n    .logo {\n        .image-component {\n            width: var(--block-width, 40px);\n            height: var(--block-width, 40px);\n            object-fit: contain;\n        }\n        width: var(--block-width, 40px);\n        height: var(--block-width, 40px);\n        border-radius: $border-radius;\n        overflow: hidden;\n        position: relative;\n\n        &::after {\n            border-radius: 12px;\n            content: '';\n            display: block;\n            height: 100%;\n            position: absolute;\n            top: 0;\n            width: 100%;\n        }\n    }\n}\n</style>\n","<template>\n    <figure v-if=\"logo\" class=\"organization-avatar\">\n        <div class=\"logo\">\n            <ImageComponent :image=\"logo\" :image-dark=\"logoDark\" />\n        </div>\n    </figure>\n    <Logo v-else class=\"small\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport { ImageComponent, Logo, usePlatform } from \"@stamhoofd/components\";\nimport { computed } from \"vue\";\n\nconst platform = usePlatform()\nconst logo = computed(() => platform.value.config.squareLogo ?? platform.value.config.horizontalLogo)\nconst logoDark = computed(() => platform.value.config.squareLogoDark ?? platform.value.config.horizontalLogoDark)\n\n</script>\n","<template>\n    <ComponentWithPropertiesInstance v-if=\"root\" :key=\"root.key\" :component=\"root\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { ComponentWithProperties, ComponentWithPropertiesInstance } from '@simonbackx/vue-app-navigation';\nimport { computed, inject, Ref, unref } from 'vue';\n\n// The InheritComponent allows you to define comonents in the 'provide' context tree, and display one of those components if it is present\n// This allows you to keep logic outside of components and 'inject' them\n\nconst props = defineProps<{\n    name: string,\n    overrideProps?: Record<string, any>\n}>()\n\nconst injectedComponents = inject('reactive_components') as Ref<Record<string, ComponentWithProperties>|undefined> | undefined;\nconst root = computed(() => {\n    const injected = unref(injectedComponents);\n    if (injected && injected[props.name]) {\n        // We need to clone here, because the component might be in multiple places\n        const unreffed = unref(injected[props.name])\n        const c = unreffed?.clone() ?? null\n        if (c) {\n            if (props.overrideProps) {\n                c.properties = {\n                    ...c.properties,\n                    ...props.overrideProps\n                }\n            }\n            return c\n        }\n    }\n    return null\n})\n\n</script>\n","<template>\n    <div class=\"meta-logo\" :class=\"{expand: metaData.expandLogo}\">\n        <ImageComponent v-if=\"logo\" :image=\"logo\" :image-dark=\"logoDark\"/>\n        <template v-else>\n            <span class=\"organization-logo-text\">{{ name }}</span>\n        </template>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ImageComponent, useDeviceWidth } from '@stamhoofd/components';\nimport { OrganizationMetaData, WebshopMetaData } from '@stamhoofd/structures';\nimport { computed } from 'vue';\n\nconst props = defineProps<{\n    metaData: OrganizationMetaData | WebshopMetaData;\n    name: string;\n}>();\n\nconst width = useDeviceWidth();\n\nconst logo = computed(() => width.value > 800 ? (props.metaData.horizontalLogo ?? props.metaData.squareLogo) : (props.metaData.squareLogo ?? props.metaData.horizontalLogo));\nconst logoDark = computed(() => width.value > 800 ? (props.metaData.horizontalLogoDark ?? props.metaData.squareLogoDark) : (props.metaData.squareLogoDark ?? props.metaData.horizontalLogoDark));\n\n</script>\n\n<style lang=\"scss\">\n@use '@stamhoofd/scss/base/variables' as *;\n\n.organization-logo-text {\n    color: $color-dark;\n    font-weight: 600;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    overflow: hidden;\n    max-width: 40vw;\n    display: block;\n    font-size: 16px;\n}\n\n.meta-logo {\n    height: 40px;\n    width: 100%;\n    position: relative;\n    display: block;\n    max-width: 200px;\n    line-height: 40px;\n\n    &.expand {\n        height: 60px;\n        max-width: 50vw;\n        line-height: 60px;\n    }\n\n    > .image-component {\n        height: 100%;\n        width: 100%;\n        position: absolute;\n        left: 0;\n        top: 0;\n\n        img {\n            object-position: left center;\n        }\n    }\n}\n</style>\n","<template>\n    <MetaLogo :meta-data=\"metaData\" :name=\"name\" />\n</template>\n\n<script lang=\"ts\">\nimport { Organization, Webshop } from '@stamhoofd/structures';\nimport { Component, Prop, VueComponent } from '@simonbackx/vue-app-navigation/classes';\n\nimport MetaLogo from '../MetaLogo.vue';\n\n@Component({\n    components: {\n        MetaLogo,\n    },\n})\nexport default class OrganizationLogo extends VueComponent {\n    @Prop({ required: true })\n    organization!: Organization;\n\n    @Prop({ required: false, default: null })\n    webshop: Webshop | null;\n\n    get metaData() {\n        if (!this.webshop || !this.webshop.meta.useLogo) {\n            return this.organization.meta;\n        }\n        return this.webshop.meta;\n    }\n\n    get name() {\n        if (!this.webshop || !this.webshop.meta.useLogo) {\n            return this.organization.name;\n        }\n        return this.webshop.meta.name;\n    }\n}\n</script>\n","<template>\n    <a alt=\"Stamhoofd\" :href=\"'https://'+$domains.marketing+''\" rel=\"noopener\" class=\"platform-logo\" :class=\"{expand: platform.config.expandLogo}\">\n        <ImageComponent v-if=\"logo\" :image=\"logo\" :image-dark=\"logoDark\" />\n        <template v-else>\n            <Logo class=\"responsive\" />\n            <span v-if=\"!isPlatform\" class=\"logo-text horizontal hide-medium\">Beheerders</span>\n        </template>\n    </a>\n</template>\n\n<script setup lang=\"ts\">\nimport { ImageComponent, Logo, useDeviceWidth, usePlatform } from '@stamhoofd/components';\nimport { computed } from 'vue';\n\nconst isPlatform = STAMHOOFD.userMode === 'platform';\n\nconst platform = usePlatform()\nconst width = useDeviceWidth()\n\nconst logo = computed(() => width.value > 800 ? (platform.value.config.horizontalLogo ?? platform.value.config.squareLogo) : (platform.value.config.squareLogo ?? platform.value.config.horizontalLogo))\nconst logoDark = computed(() => width.value > 800 ? (platform.value.config.horizontalLogoDark ?? platform.value.config.squareLogoDark) : (platform.value.config.squareLogoDark ?? platform.value.config.horizontalLogoDark))\n\n</script>\n\n<style lang=\"scss\">\n.platform-logo {\n    height: 40px;\n    width: 100%;\n    position: relative;\n    display: block;\n\n    &.expand {\n        height: 60px;\n    }\n\n    > .image-component {\n        height: 100%;\n        width: 100%;\n        position: absolute;\n        left: 0;\n        top: 0;\n\n        img {\n            object-position: left center;\n        }\n    }\n}\n</style>\n","<template>\n    <div>\n        <label class=\"radio\" :class=\"{ 'with-text': hasDefaultSlot }\" :for=\"id\">\n            <input ref=\"radio\" v-model=\"radioButtonValue\" type=\"radio\" :name=\"name\" :value=\"value\" :autocomplete=\"autocomplete\" :disabled=\"disabled\" :id=\"id\">\n            <div>\n                <div />\n                <div><slot /></div>\n            </div>\n        </label>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { Component, Prop, VueComponent } from \"@simonbackx/vue-app-navigation/classes\";\n\n@Component({\n    emits: [\"update:modelValue\"]\n})\nexport default class Radio extends VueComponent {\n    @Prop({ default: \"\", type: String })\n    name!: string;\n\n    @Prop({ default: \"\", type: String })\n    autocomplete!: string;\n\n    @Prop({ default: \"\" })\n    value!: any;\n\n    @Prop({ default: undefined })\n    id!: any;\n\n    @Prop({})\n    modelValue!: any;\n\n    @Prop({ default: false })\n    disabled!: boolean;\n\n    get hasDefaultSlot() {\n        return !!this.$slots.default\n    }\n\n    get radioButtonValue() {\n        return this.modelValue;\n    }\n\n    set radioButtonValue(value) {\n        this.$emit(\"update:modelValue\", value)\n\n        // Add support for a model that doesn't change\n        this.$nextTick(() => {\n            if (this.radioButtonValue !== value) {\n                if (this.$refs.radio) {\n                    (this.$refs.radio as any).checked = (this.radioButtonValue === this.value);\n                }\n            }\n        })\n    }\n}\n</script>\n","/**!\n * Sortable 1.15.2\n * @author\tRubaXa   <trash@rubaxa.org>\n * @author\towenm    <owen23355@gmail.com>\n * @license MIT\n */\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    if (enumerableOnly) {\n      symbols = symbols.filter(function (sym) {\n        return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n      });\n    }\n    keys.push.apply(keys, symbols);\n  }\n  return keys;\n}\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n  return target;\n}\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function (obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function (obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n  return _typeof(obj);\n}\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n  return obj;\n}\nfunction _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n    return target;\n  };\n  return _extends.apply(this, arguments);\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n  return target;\n}\nfunction _objectWithoutProperties(source, excluded) {\n  if (source == null) return {};\n  var target = _objectWithoutPropertiesLoose(source, excluded);\n  var key, i;\n  if (Object.getOwnPropertySymbols) {\n    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n    for (i = 0; i < sourceSymbolKeys.length; i++) {\n      key = sourceSymbolKeys[i];\n      if (excluded.indexOf(key) >= 0) continue;\n      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n      target[key] = source[key];\n    }\n  }\n  return target;\n}\nfunction _toConsumableArray(arr) {\n  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _iterableToArray(iter) {\n  if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n  return arr2;\n}\nfunction _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar version = \"1.15.2\";\n\nfunction userAgent(pattern) {\n  if (typeof window !== 'undefined' && window.navigator) {\n    return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n  }\n}\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n  capture: false,\n  passive: false\n};\nfunction on(el, event, fn) {\n  el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction off(el, event, fn) {\n  el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction matches( /**HTMLElement*/el, /**String*/selector) {\n  if (!selector) return;\n  selector[0] === '>' && (selector = selector.substring(1));\n  if (el) {\n    try {\n      if (el.matches) {\n        return el.matches(selector);\n      } else if (el.msMatchesSelector) {\n        return el.msMatchesSelector(selector);\n      } else if (el.webkitMatchesSelector) {\n        return el.webkitMatchesSelector(selector);\n      }\n    } catch (_) {\n      return false;\n    }\n  }\n  return false;\n}\nfunction getParentOrHost(el) {\n  return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\nfunction closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {\n  if (el) {\n    ctx = ctx || document;\n    do {\n      if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n        return el;\n      }\n      if (el === ctx) break;\n      /* jshint boss:true */\n    } while (el = getParentOrHost(el));\n  }\n  return null;\n}\nvar R_SPACE = /\\s+/g;\nfunction toggleClass(el, name, state) {\n  if (el && name) {\n    if (el.classList) {\n      el.classList[state ? 'add' : 'remove'](name);\n    } else {\n      var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n      el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n    }\n  }\n}\nfunction css(el, prop, val) {\n  var style = el && el.style;\n  if (style) {\n    if (val === void 0) {\n      if (document.defaultView && document.defaultView.getComputedStyle) {\n        val = document.defaultView.getComputedStyle(el, '');\n      } else if (el.currentStyle) {\n        val = el.currentStyle;\n      }\n      return prop === void 0 ? val : val[prop];\n    } else {\n      if (!(prop in style) && prop.indexOf('webkit') === -1) {\n        prop = '-webkit-' + prop;\n      }\n      style[prop] = val + (typeof val === 'string' ? '' : 'px');\n    }\n  }\n}\nfunction matrix(el, selfOnly) {\n  var appliedTransforms = '';\n  if (typeof el === 'string') {\n    appliedTransforms = el;\n  } else {\n    do {\n      var transform = css(el, 'transform');\n      if (transform && transform !== 'none') {\n        appliedTransforms = transform + ' ' + appliedTransforms;\n      }\n      /* jshint boss:true */\n    } while (!selfOnly && (el = el.parentNode));\n  }\n  var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n  /*jshint -W056 */\n  return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction find(ctx, tagName, iterator) {\n  if (ctx) {\n    var list = ctx.getElementsByTagName(tagName),\n      i = 0,\n      n = list.length;\n    if (iterator) {\n      for (; i < n; i++) {\n        iterator(list[i], i);\n      }\n    }\n    return list;\n  }\n  return [];\n}\nfunction getWindowScrollingElement() {\n  var scrollingElement = document.scrollingElement;\n  if (scrollingElement) {\n    return scrollingElement;\n  } else {\n    return document.documentElement;\n  }\n}\n\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param  {HTMLElement} el                       The element whose boundingClientRect is wanted\r\n * @param  {[Boolean]} relativeToContainingBlock  Whether the rect should be relative to the containing block of (including) the container\r\n * @param  {[Boolean]} relativeToNonStaticParent  Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param  {[Boolean]} undoScale                  Whether the container's scale() should be undone\r\n * @param  {[HTMLElement]} container              The parent the element will be placed in\r\n * @return {Object}                               The boundingClientRect of el, with specified adjustments\r\n */\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n  if (!el.getBoundingClientRect && el !== window) return;\n  var elRect, top, left, bottom, right, height, width;\n  if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n    elRect = el.getBoundingClientRect();\n    top = elRect.top;\n    left = elRect.left;\n    bottom = elRect.bottom;\n    right = elRect.right;\n    height = elRect.height;\n    width = elRect.width;\n  } else {\n    top = 0;\n    left = 0;\n    bottom = window.innerHeight;\n    right = window.innerWidth;\n    height = window.innerHeight;\n    width = window.innerWidth;\n  }\n  if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n    // Adjust for translate()\n    container = container || el.parentNode;\n\n    // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n    // Not needed on <= IE11\n    if (!IE11OrLess) {\n      do {\n        if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n          var containerRect = container.getBoundingClientRect();\n\n          // Set relative to edges of padding box of container\n          top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n          left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n          bottom = top + elRect.height;\n          right = left + elRect.width;\n          break;\n        }\n        /* jshint boss:true */\n      } while (container = container.parentNode);\n    }\n  }\n  if (undoScale && el !== window) {\n    // Adjust for scale()\n    var elMatrix = matrix(container || el),\n      scaleX = elMatrix && elMatrix.a,\n      scaleY = elMatrix && elMatrix.d;\n    if (elMatrix) {\n      top /= scaleY;\n      left /= scaleX;\n      width /= scaleX;\n      height /= scaleY;\n      bottom = top + height;\n      right = left + width;\n    }\n  }\n  return {\n    top: top,\n    left: left,\n    bottom: bottom,\n    right: right,\n    width: width,\n    height: height\n  };\n}\n\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param  {HTMLElement}  el           The element who's side being scrolled out of view is in question\r\n * @param  {String}       elSide       Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param  {String}       parentSide   Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement}               The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */\nfunction isScrolledPast(el, elSide, parentSide) {\n  var parent = getParentAutoScrollElement(el, true),\n    elSideVal = getRect(el)[elSide];\n\n  /* jshint boss:true */\n  while (parent) {\n    var parentSideVal = getRect(parent)[parentSide],\n      visible = void 0;\n    if (parentSide === 'top' || parentSide === 'left') {\n      visible = elSideVal >= parentSideVal;\n    } else {\n      visible = elSideVal <= parentSideVal;\n    }\n    if (!visible) return parent;\n    if (parent === getWindowScrollingElement()) break;\n    parent = getParentAutoScrollElement(parent, false);\n  }\n  return false;\n}\n\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param  {HTMLElement} el       The parent element\r\n * @param  {Number} childNum      The index of the child\r\n * @param  {Object} options       Parent Sortable's options\r\n * @return {HTMLElement}          The child at index childNum, or null if not found\r\n */\nfunction getChild(el, childNum, options, includeDragEl) {\n  var currentChild = 0,\n    i = 0,\n    children = el.children;\n  while (i < children.length) {\n    if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n      if (currentChild === childNum) {\n        return children[i];\n      }\n      currentChild++;\n    }\n    i++;\n  }\n  return null;\n}\n\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param  {HTMLElement} el       Parent element\r\n * @param  {selector} selector    Any other elements that should be ignored\r\n * @return {HTMLElement}          The last child, ignoring ghostEl\r\n */\nfunction lastChild(el, selector) {\n  var last = el.lastElementChild;\n  while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n    last = last.previousElementSibling;\n  }\n  return last || null;\n}\n\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param  {HTMLElement} el\r\n * @param  {selector} selector\r\n * @return {number}\r\n */\nfunction index(el, selector) {\n  var index = 0;\n  if (!el || !el.parentNode) {\n    return -1;\n  }\n\n  /* jshint boss:true */\n  while (el = el.previousElementSibling) {\n    if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n      index++;\n    }\n  }\n  return index;\n}\n\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param  {HTMLElement} el\r\n * @return {Array}             Offsets in the format of [left, top]\r\n */\nfunction getRelativeScrollOffset(el) {\n  var offsetLeft = 0,\n    offsetTop = 0,\n    winScroller = getWindowScrollingElement();\n  if (el) {\n    do {\n      var elMatrix = matrix(el),\n        scaleX = elMatrix.a,\n        scaleY = elMatrix.d;\n      offsetLeft += el.scrollLeft * scaleX;\n      offsetTop += el.scrollTop * scaleY;\n    } while (el !== winScroller && (el = el.parentNode));\n  }\n  return [offsetLeft, offsetTop];\n}\n\n/**\r\n * Returns the index of the object within the given array\r\n * @param  {Array} arr   Array that may or may not hold the object\r\n * @param  {Object} obj  An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number}      The index of the object in the array, or -1\r\n */\nfunction indexOfObject(arr, obj) {\n  for (var i in arr) {\n    if (!arr.hasOwnProperty(i)) continue;\n    for (var key in obj) {\n      if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n    }\n  }\n  return -1;\n}\nfunction getParentAutoScrollElement(el, includeSelf) {\n  // skip to window\n  if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n  var elem = el;\n  var gotSelf = false;\n  do {\n    // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n    if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n      var elemCSS = css(elem);\n      if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n        if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n        if (gotSelf || includeSelf) return elem;\n        gotSelf = true;\n      }\n    }\n    /* jshint boss:true */\n  } while (elem = elem.parentNode);\n  return getWindowScrollingElement();\n}\nfunction extend(dst, src) {\n  if (dst && src) {\n    for (var key in src) {\n      if (src.hasOwnProperty(key)) {\n        dst[key] = src[key];\n      }\n    }\n  }\n  return dst;\n}\nfunction isRectEqual(rect1, rect2) {\n  return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar _throttleTimeout;\nfunction throttle(callback, ms) {\n  return function () {\n    if (!_throttleTimeout) {\n      var args = arguments,\n        _this = this;\n      if (args.length === 1) {\n        callback.call(_this, args[0]);\n      } else {\n        callback.apply(_this, args);\n      }\n      _throttleTimeout = setTimeout(function () {\n        _throttleTimeout = void 0;\n      }, ms);\n    }\n  };\n}\nfunction cancelThrottle() {\n  clearTimeout(_throttleTimeout);\n  _throttleTimeout = void 0;\n}\nfunction scrollBy(el, x, y) {\n  el.scrollLeft += x;\n  el.scrollTop += y;\n}\nfunction clone(el) {\n  var Polymer = window.Polymer;\n  var $ = window.jQuery || window.Zepto;\n  if (Polymer && Polymer.dom) {\n    return Polymer.dom(el).cloneNode(true);\n  } else if ($) {\n    return $(el).clone(true)[0];\n  } else {\n    return el.cloneNode(true);\n  }\n}\nfunction setRect(el, rect) {\n  css(el, 'position', 'absolute');\n  css(el, 'top', rect.top);\n  css(el, 'left', rect.left);\n  css(el, 'width', rect.width);\n  css(el, 'height', rect.height);\n}\nfunction unsetRect(el) {\n  css(el, 'position', '');\n  css(el, 'top', '');\n  css(el, 'left', '');\n  css(el, 'width', '');\n  css(el, 'height', '');\n}\nfunction getChildContainingRectFromElement(container, options, ghostEl) {\n  var rect = {};\n  Array.from(container.children).forEach(function (child) {\n    var _rect$left, _rect$top, _rect$right, _rect$bottom;\n    if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n    var childRect = getRect(child);\n    rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n    rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n    rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n    rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n  });\n  rect.width = rect.right - rect.left;\n  rect.height = rect.bottom - rect.top;\n  rect.x = rect.left;\n  rect.y = rect.top;\n  return rect;\n}\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n  var animationStates = [],\n    animationCallbackId;\n  return {\n    captureAnimationState: function captureAnimationState() {\n      animationStates = [];\n      if (!this.options.animation) return;\n      var children = [].slice.call(this.el.children);\n      children.forEach(function (child) {\n        if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n        animationStates.push({\n          target: child,\n          rect: getRect(child)\n        });\n        var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect);\n\n        // If animating: compensate for current animation\n        if (child.thisAnimationDuration) {\n          var childMatrix = matrix(child, true);\n          if (childMatrix) {\n            fromRect.top -= childMatrix.f;\n            fromRect.left -= childMatrix.e;\n          }\n        }\n        child.fromRect = fromRect;\n      });\n    },\n    addAnimationState: function addAnimationState(state) {\n      animationStates.push(state);\n    },\n    removeAnimationState: function removeAnimationState(target) {\n      animationStates.splice(indexOfObject(animationStates, {\n        target: target\n      }), 1);\n    },\n    animateAll: function animateAll(callback) {\n      var _this = this;\n      if (!this.options.animation) {\n        clearTimeout(animationCallbackId);\n        if (typeof callback === 'function') callback();\n        return;\n      }\n      var animating = false,\n        animationTime = 0;\n      animationStates.forEach(function (state) {\n        var time = 0,\n          target = state.target,\n          fromRect = target.fromRect,\n          toRect = getRect(target),\n          prevFromRect = target.prevFromRect,\n          prevToRect = target.prevToRect,\n          animatingRect = state.rect,\n          targetMatrix = matrix(target, true);\n        if (targetMatrix) {\n          // Compensate for current animation\n          toRect.top -= targetMatrix.f;\n          toRect.left -= targetMatrix.e;\n        }\n        target.toRect = toRect;\n        if (target.thisAnimationDuration) {\n          // Could also check if animatingRect is between fromRect and toRect\n          if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) &&\n          // Make sure animatingRect is on line between toRect & fromRect\n          (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n            // If returning to same place as started from animation and on same axis\n            time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n          }\n        }\n\n        // if fromRect != toRect: animate\n        if (!isRectEqual(toRect, fromRect)) {\n          target.prevFromRect = fromRect;\n          target.prevToRect = toRect;\n          if (!time) {\n            time = _this.options.animation;\n          }\n          _this.animate(target, animatingRect, toRect, time);\n        }\n        if (time) {\n          animating = true;\n          animationTime = Math.max(animationTime, time);\n          clearTimeout(target.animationResetTimer);\n          target.animationResetTimer = setTimeout(function () {\n            target.animationTime = 0;\n            target.prevFromRect = null;\n            target.fromRect = null;\n            target.prevToRect = null;\n            target.thisAnimationDuration = null;\n          }, time);\n          target.thisAnimationDuration = time;\n        }\n      });\n      clearTimeout(animationCallbackId);\n      if (!animating) {\n        if (typeof callback === 'function') callback();\n      } else {\n        animationCallbackId = setTimeout(function () {\n          if (typeof callback === 'function') callback();\n        }, animationTime);\n      }\n      animationStates = [];\n    },\n    animate: function animate(target, currentRect, toRect, duration) {\n      if (duration) {\n        css(target, 'transition', '');\n        css(target, 'transform', '');\n        var elMatrix = matrix(this.el),\n          scaleX = elMatrix && elMatrix.a,\n          scaleY = elMatrix && elMatrix.d,\n          translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n          translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n        target.animatingX = !!translateX;\n        target.animatingY = !!translateY;\n        css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n        this.forRepaintDummy = repaint(target); // repaint\n\n        css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n        css(target, 'transform', 'translate3d(0,0,0)');\n        typeof target.animated === 'number' && clearTimeout(target.animated);\n        target.animated = setTimeout(function () {\n          css(target, 'transition', '');\n          css(target, 'transform', '');\n          target.animated = false;\n          target.animatingX = false;\n          target.animatingY = false;\n        }, duration);\n      }\n    }\n  };\n}\nfunction repaint(target) {\n  return target.offsetWidth;\n}\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n  return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n  initializeByDefault: true\n};\nvar PluginManager = {\n  mount: function mount(plugin) {\n    // Set default static properties\n    for (var option in defaults) {\n      if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n        plugin[option] = defaults[option];\n      }\n    }\n    plugins.forEach(function (p) {\n      if (p.pluginName === plugin.pluginName) {\n        throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n      }\n    });\n    plugins.push(plugin);\n  },\n  pluginEvent: function pluginEvent(eventName, sortable, evt) {\n    var _this = this;\n    this.eventCanceled = false;\n    evt.cancel = function () {\n      _this.eventCanceled = true;\n    };\n    var eventNameGlobal = eventName + 'Global';\n    plugins.forEach(function (plugin) {\n      if (!sortable[plugin.pluginName]) return;\n      // Fire global events if it exists in this sortable\n      if (sortable[plugin.pluginName][eventNameGlobal]) {\n        sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n          sortable: sortable\n        }, evt));\n      }\n\n      // Only fire plugin event if plugin is enabled in this sortable,\n      // and plugin has event defined\n      if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n        sortable[plugin.pluginName][eventName](_objectSpread2({\n          sortable: sortable\n        }, evt));\n      }\n    });\n  },\n  initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n    plugins.forEach(function (plugin) {\n      var pluginName = plugin.pluginName;\n      if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n      var initialized = new plugin(sortable, el, sortable.options);\n      initialized.sortable = sortable;\n      initialized.options = sortable.options;\n      sortable[pluginName] = initialized;\n\n      // Add default options from plugin\n      _extends(defaults, initialized.defaults);\n    });\n    for (var option in sortable.options) {\n      if (!sortable.options.hasOwnProperty(option)) continue;\n      var modified = this.modifyOption(sortable, option, sortable.options[option]);\n      if (typeof modified !== 'undefined') {\n        sortable.options[option] = modified;\n      }\n    }\n  },\n  getEventProperties: function getEventProperties(name, sortable) {\n    var eventProperties = {};\n    plugins.forEach(function (plugin) {\n      if (typeof plugin.eventProperties !== 'function') return;\n      _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n    });\n    return eventProperties;\n  },\n  modifyOption: function modifyOption(sortable, name, value) {\n    var modifiedValue;\n    plugins.forEach(function (plugin) {\n      // Plugin must exist on the Sortable\n      if (!sortable[plugin.pluginName]) return;\n\n      // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n      if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n        modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n      }\n    });\n    return modifiedValue;\n  }\n};\n\nfunction dispatchEvent(_ref) {\n  var sortable = _ref.sortable,\n    rootEl = _ref.rootEl,\n    name = _ref.name,\n    targetEl = _ref.targetEl,\n    cloneEl = _ref.cloneEl,\n    toEl = _ref.toEl,\n    fromEl = _ref.fromEl,\n    oldIndex = _ref.oldIndex,\n    newIndex = _ref.newIndex,\n    oldDraggableIndex = _ref.oldDraggableIndex,\n    newDraggableIndex = _ref.newDraggableIndex,\n    originalEvent = _ref.originalEvent,\n    putSortable = _ref.putSortable,\n    extraEventProperties = _ref.extraEventProperties;\n  sortable = sortable || rootEl && rootEl[expando];\n  if (!sortable) return;\n  var evt,\n    options = sortable.options,\n    onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);\n  // Support for new CustomEvent feature\n  if (window.CustomEvent && !IE11OrLess && !Edge) {\n    evt = new CustomEvent(name, {\n      bubbles: true,\n      cancelable: true\n    });\n  } else {\n    evt = document.createEvent('Event');\n    evt.initEvent(name, true, true);\n  }\n  evt.to = toEl || rootEl;\n  evt.from = fromEl || rootEl;\n  evt.item = targetEl || rootEl;\n  evt.clone = cloneEl;\n  evt.oldIndex = oldIndex;\n  evt.newIndex = newIndex;\n  evt.oldDraggableIndex = oldDraggableIndex;\n  evt.newDraggableIndex = newDraggableIndex;\n  evt.originalEvent = originalEvent;\n  evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n  var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n  for (var option in allEventProperties) {\n    evt[option] = allEventProperties[option];\n  }\n  if (rootEl) {\n    rootEl.dispatchEvent(evt);\n  }\n  if (options[onName]) {\n    options[onName].call(sortable, evt);\n  }\n}\n\nvar _excluded = [\"evt\"];\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n  var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n    originalEvent = _ref.evt,\n    data = _objectWithoutProperties(_ref, _excluded);\n  PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n    dragEl: dragEl,\n    parentEl: parentEl,\n    ghostEl: ghostEl,\n    rootEl: rootEl,\n    nextEl: nextEl,\n    lastDownEl: lastDownEl,\n    cloneEl: cloneEl,\n    cloneHidden: cloneHidden,\n    dragStarted: moved,\n    putSortable: putSortable,\n    activeSortable: Sortable.active,\n    originalEvent: originalEvent,\n    oldIndex: oldIndex,\n    oldDraggableIndex: oldDraggableIndex,\n    newIndex: newIndex,\n    newDraggableIndex: newDraggableIndex,\n    hideGhostForTarget: _hideGhostForTarget,\n    unhideGhostForTarget: _unhideGhostForTarget,\n    cloneNowHidden: function cloneNowHidden() {\n      cloneHidden = true;\n    },\n    cloneNowShown: function cloneNowShown() {\n      cloneHidden = false;\n    },\n    dispatchSortableEvent: function dispatchSortableEvent(name) {\n      _dispatchEvent({\n        sortable: sortable,\n        name: name,\n        originalEvent: originalEvent\n      });\n    }\n  }, data));\n};\nfunction _dispatchEvent(info) {\n  dispatchEvent(_objectSpread2({\n    putSortable: putSortable,\n    cloneEl: cloneEl,\n    targetEl: dragEl,\n    rootEl: rootEl,\n    oldIndex: oldIndex,\n    oldDraggableIndex: oldDraggableIndex,\n    newIndex: newIndex,\n    newDraggableIndex: newDraggableIndex\n  }, info));\n}\nvar dragEl,\n  parentEl,\n  ghostEl,\n  rootEl,\n  nextEl,\n  lastDownEl,\n  cloneEl,\n  cloneHidden,\n  oldIndex,\n  newIndex,\n  oldDraggableIndex,\n  newDraggableIndex,\n  activeGroup,\n  putSortable,\n  awaitingDragStarted = false,\n  ignoreNextClick = false,\n  sortables = [],\n  tapEvt,\n  touchEvt,\n  lastDx,\n  lastDy,\n  tapDistanceLeft,\n  tapDistanceTop,\n  moved,\n  lastTarget,\n  lastDirection,\n  pastFirstInvertThresh = false,\n  isCircumstantialInvert = false,\n  targetMoveDistance,\n  // For positioning ghost absolutely\n  ghostRelativeParent,\n  ghostRelativeParentInitialScroll = [],\n  // (left, top)\n\n  _silent = false,\n  savedInputChecked = [];\n\n/** @const */\nvar documentExists = typeof document !== 'undefined',\n  PositionGhostAbsolutely = IOS,\n  CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n  // This will not pass for IE9, because IE9 DnD only works on anchors\n  supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n  supportCssPointerEvents = function () {\n    if (!documentExists) return;\n    // false when <= IE11\n    if (IE11OrLess) {\n      return false;\n    }\n    var el = document.createElement('x');\n    el.style.cssText = 'pointer-events:auto';\n    return el.style.pointerEvents === 'auto';\n  }(),\n  _detectDirection = function _detectDirection(el, options) {\n    var elCSS = css(el),\n      elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n      child1 = getChild(el, 0, options),\n      child2 = getChild(el, 1, options),\n      firstChildCSS = child1 && css(child1),\n      secondChildCSS = child2 && css(child2),\n      firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n      secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n    if (elCSS.display === 'flex') {\n      return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n    }\n    if (elCSS.display === 'grid') {\n      return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n    }\n    if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n      var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n      return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n    }\n    return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n  },\n  _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n    var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n      dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n      dragElOppLength = vertical ? dragRect.width : dragRect.height,\n      targetS1Opp = vertical ? targetRect.left : targetRect.top,\n      targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n      targetOppLength = vertical ? targetRect.width : targetRect.height;\n    return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n  },\n  /**\r\n   * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n   * @param  {Number} x      X position\r\n   * @param  {Number} y      Y position\r\n   * @return {HTMLElement}   Element of the first found nearest Sortable\r\n   */\n  _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n    var ret;\n    sortables.some(function (sortable) {\n      var threshold = sortable[expando].options.emptyInsertThreshold;\n      if (!threshold || lastChild(sortable)) return;\n      var rect = getRect(sortable),\n        insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n        insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n      if (insideHorizontally && insideVertically) {\n        return ret = sortable;\n      }\n    });\n    return ret;\n  },\n  _prepareGroup = function _prepareGroup(options) {\n    function toFn(value, pull) {\n      return function (to, from, dragEl, evt) {\n        var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n        if (value == null && (pull || sameGroup)) {\n          // Default pull value\n          // Default pull and put value if same group\n          return true;\n        } else if (value == null || value === false) {\n          return false;\n        } else if (pull && value === 'clone') {\n          return value;\n        } else if (typeof value === 'function') {\n          return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n        } else {\n          var otherGroup = (pull ? to : from).options.group.name;\n          return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n        }\n      };\n    }\n    var group = {};\n    var originalGroup = options.group;\n    if (!originalGroup || _typeof(originalGroup) != 'object') {\n      originalGroup = {\n        name: originalGroup\n      };\n    }\n    group.name = originalGroup.name;\n    group.checkPull = toFn(originalGroup.pull, true);\n    group.checkPut = toFn(originalGroup.put);\n    group.revertClone = originalGroup.revertClone;\n    options.group = group;\n  },\n  _hideGhostForTarget = function _hideGhostForTarget() {\n    if (!supportCssPointerEvents && ghostEl) {\n      css(ghostEl, 'display', 'none');\n    }\n  },\n  _unhideGhostForTarget = function _unhideGhostForTarget() {\n    if (!supportCssPointerEvents && ghostEl) {\n      css(ghostEl, 'display', '');\n    }\n  };\n\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif (documentExists && !ChromeForAndroid) {\n  document.addEventListener('click', function (evt) {\n    if (ignoreNextClick) {\n      evt.preventDefault();\n      evt.stopPropagation && evt.stopPropagation();\n      evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n      ignoreNextClick = false;\n      return false;\n    }\n  }, true);\n}\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n  if (dragEl) {\n    evt = evt.touches ? evt.touches[0] : evt;\n    var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n    if (nearest) {\n      // Create imitation event\n      var event = {};\n      for (var i in evt) {\n        if (evt.hasOwnProperty(i)) {\n          event[i] = evt[i];\n        }\n      }\n      event.target = event.rootEl = nearest;\n      event.preventDefault = void 0;\n      event.stopPropagation = void 0;\n      nearest[expando]._onDragOver(event);\n    }\n  }\n};\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n  if (dragEl) {\n    dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n  }\n};\n\n/**\r\n * @class  Sortable\r\n * @param  {HTMLElement}  el\r\n * @param  {Object}       [options]\r\n */\nfunction Sortable(el, options) {\n  if (!(el && el.nodeType && el.nodeType === 1)) {\n    throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n  }\n  this.el = el; // root element\n  this.options = options = _extends({}, options);\n\n  // Export instance\n  el[expando] = this;\n  var defaults = {\n    group: null,\n    sort: true,\n    disabled: false,\n    store: null,\n    handle: null,\n    draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n    swapThreshold: 1,\n    // percentage; 0 <= x <= 1\n    invertSwap: false,\n    // invert always\n    invertedSwapThreshold: null,\n    // will be set to same as swapThreshold if default\n    removeCloneOnHide: true,\n    direction: function direction() {\n      return _detectDirection(el, this.options);\n    },\n    ghostClass: 'sortable-ghost',\n    chosenClass: 'sortable-chosen',\n    dragClass: 'sortable-drag',\n    ignore: 'a, img',\n    filter: null,\n    preventOnFilter: true,\n    animation: 0,\n    easing: null,\n    setData: function setData(dataTransfer, dragEl) {\n      dataTransfer.setData('Text', dragEl.textContent);\n    },\n    dropBubble: false,\n    dragoverBubble: false,\n    dataIdAttr: 'data-id',\n    delay: 0,\n    delayOnTouchOnly: false,\n    touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n    forceFallback: false,\n    fallbackClass: 'sortable-fallback',\n    fallbackOnBody: false,\n    fallbackTolerance: 0,\n    fallbackOffset: {\n      x: 0,\n      y: 0\n    },\n    supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari,\n    emptyInsertThreshold: 5\n  };\n  PluginManager.initializePlugins(this, el, defaults);\n\n  // Set default options\n  for (var name in defaults) {\n    !(name in options) && (options[name] = defaults[name]);\n  }\n  _prepareGroup(options);\n\n  // Bind all private methods\n  for (var fn in this) {\n    if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n      this[fn] = this[fn].bind(this);\n    }\n  }\n\n  // Setup drag mode\n  this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n  if (this.nativeDraggable) {\n    // Touch start threshold cannot be greater than the native dragstart threshold\n    this.options.touchStartThreshold = 1;\n  }\n\n  // Bind events\n  if (options.supportPointer) {\n    on(el, 'pointerdown', this._onTapStart);\n  } else {\n    on(el, 'mousedown', this._onTapStart);\n    on(el, 'touchstart', this._onTapStart);\n  }\n  if (this.nativeDraggable) {\n    on(el, 'dragover', this);\n    on(el, 'dragenter', this);\n  }\n  sortables.push(this.el);\n\n  // Restore sorting\n  options.store && options.store.get && this.sort(options.store.get(this) || []);\n\n  // Add animation state manager\n  _extends(this, AnimationStateManager());\n}\nSortable.prototype = /** @lends Sortable.prototype */{\n  constructor: Sortable,\n  _isOutsideThisEl: function _isOutsideThisEl(target) {\n    if (!this.el.contains(target) && target !== this.el) {\n      lastTarget = null;\n    }\n  },\n  _getDirection: function _getDirection(evt, target) {\n    return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n  },\n  _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) {\n    if (!evt.cancelable) return;\n    var _this = this,\n      el = this.el,\n      options = this.options,\n      preventOnFilter = options.preventOnFilter,\n      type = evt.type,\n      touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n      target = (touch || evt).target,\n      originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n      filter = options.filter;\n    _saveInputCheckedState(el);\n\n    // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n    if (dragEl) {\n      return;\n    }\n    if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n      return; // only left button and enabled\n    }\n\n    // cancel dnd if original target is content editable\n    if (originalTarget.isContentEditable) {\n      return;\n    }\n\n    // Safari ignores further event handling after mousedown\n    if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n      return;\n    }\n    target = closest(target, options.draggable, el, false);\n    if (target && target.animated) {\n      return;\n    }\n    if (lastDownEl === target) {\n      // Ignoring duplicate `down`\n      return;\n    }\n\n    // Get the index of the dragged element within its parent\n    oldIndex = index(target);\n    oldDraggableIndex = index(target, options.draggable);\n\n    // Check filter\n    if (typeof filter === 'function') {\n      if (filter.call(this, evt, target, this)) {\n        _dispatchEvent({\n          sortable: _this,\n          rootEl: originalTarget,\n          name: 'filter',\n          targetEl: target,\n          toEl: el,\n          fromEl: el\n        });\n        pluginEvent('filter', _this, {\n          evt: evt\n        });\n        preventOnFilter && evt.cancelable && evt.preventDefault();\n        return; // cancel dnd\n      }\n    } else if (filter) {\n      filter = filter.split(',').some(function (criteria) {\n        criteria = closest(originalTarget, criteria.trim(), el, false);\n        if (criteria) {\n          _dispatchEvent({\n            sortable: _this,\n            rootEl: criteria,\n            name: 'filter',\n            targetEl: target,\n            fromEl: el,\n            toEl: el\n          });\n          pluginEvent('filter', _this, {\n            evt: evt\n          });\n          return true;\n        }\n      });\n      if (filter) {\n        preventOnFilter && evt.cancelable && evt.preventDefault();\n        return; // cancel dnd\n      }\n    }\n    if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n      return;\n    }\n\n    // Prepare `dragstart`\n    this._prepareDragStart(evt, touch, target);\n  },\n  _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) {\n    var _this = this,\n      el = _this.el,\n      options = _this.options,\n      ownerDocument = el.ownerDocument,\n      dragStartFn;\n    if (target && !dragEl && target.parentNode === el) {\n      var dragRect = getRect(target);\n      rootEl = el;\n      dragEl = target;\n      parentEl = dragEl.parentNode;\n      nextEl = dragEl.nextSibling;\n      lastDownEl = target;\n      activeGroup = options.group;\n      Sortable.dragged = dragEl;\n      tapEvt = {\n        target: dragEl,\n        clientX: (touch || evt).clientX,\n        clientY: (touch || evt).clientY\n      };\n      tapDistanceLeft = tapEvt.clientX - dragRect.left;\n      tapDistanceTop = tapEvt.clientY - dragRect.top;\n      this._lastX = (touch || evt).clientX;\n      this._lastY = (touch || evt).clientY;\n      dragEl.style['will-change'] = 'all';\n      dragStartFn = function dragStartFn() {\n        pluginEvent('delayEnded', _this, {\n          evt: evt\n        });\n        if (Sortable.eventCanceled) {\n          _this._onDrop();\n          return;\n        }\n        // Delayed drag has been triggered\n        // we can re-enable the events: touchmove/mousemove\n        _this._disableDelayedDragEvents();\n        if (!FireFox && _this.nativeDraggable) {\n          dragEl.draggable = true;\n        }\n\n        // Bind the events: dragstart/dragend\n        _this._triggerDragStart(evt, touch);\n\n        // Drag start event\n        _dispatchEvent({\n          sortable: _this,\n          name: 'choose',\n          originalEvent: evt\n        });\n\n        // Chosen item\n        toggleClass(dragEl, options.chosenClass, true);\n      };\n\n      // Disable \"draggable\"\n      options.ignore.split(',').forEach(function (criteria) {\n        find(dragEl, criteria.trim(), _disableDraggable);\n      });\n      on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n      on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n      on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n      on(ownerDocument, 'mouseup', _this._onDrop);\n      on(ownerDocument, 'touchend', _this._onDrop);\n      on(ownerDocument, 'touchcancel', _this._onDrop);\n\n      // Make dragEl draggable (must be before delay for FireFox)\n      if (FireFox && this.nativeDraggable) {\n        this.options.touchStartThreshold = 4;\n        dragEl.draggable = true;\n      }\n      pluginEvent('delayStart', this, {\n        evt: evt\n      });\n\n      // Delay is impossible for native DnD in Edge or IE\n      if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n        if (Sortable.eventCanceled) {\n          this._onDrop();\n          return;\n        }\n        // If the user moves the pointer or let go the click or touch\n        // before the delay has been reached:\n        // disable the delayed drag\n        on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n        on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n        on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n        on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n        on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n        options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n        _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n      } else {\n        dragStartFn();\n      }\n    }\n  },\n  _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) {\n    var touch = e.touches ? e.touches[0] : e;\n    if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n      this._disableDelayedDrag();\n    }\n  },\n  _disableDelayedDrag: function _disableDelayedDrag() {\n    dragEl && _disableDraggable(dragEl);\n    clearTimeout(this._dragStartTimer);\n    this._disableDelayedDragEvents();\n  },\n  _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n    var ownerDocument = this.el.ownerDocument;\n    off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n    off(ownerDocument, 'touchend', this._disableDelayedDrag);\n    off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n    off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n    off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n    off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n  },\n  _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) {\n    touch = touch || evt.pointerType == 'touch' && evt;\n    if (!this.nativeDraggable || touch) {\n      if (this.options.supportPointer) {\n        on(document, 'pointermove', this._onTouchMove);\n      } else if (touch) {\n        on(document, 'touchmove', this._onTouchMove);\n      } else {\n        on(document, 'mousemove', this._onTouchMove);\n      }\n    } else {\n      on(dragEl, 'dragend', this);\n      on(rootEl, 'dragstart', this._onDragStart);\n    }\n    try {\n      if (document.selection) {\n        // Timeout neccessary for IE9\n        _nextTick(function () {\n          document.selection.empty();\n        });\n      } else {\n        window.getSelection().removeAllRanges();\n      }\n    } catch (err) {}\n  },\n  _dragStarted: function _dragStarted(fallback, evt) {\n    awaitingDragStarted = false;\n    if (rootEl && dragEl) {\n      pluginEvent('dragStarted', this, {\n        evt: evt\n      });\n      if (this.nativeDraggable) {\n        on(document, 'dragover', _checkOutsideTargetEl);\n      }\n      var options = this.options;\n\n      // Apply effect\n      !fallback && toggleClass(dragEl, options.dragClass, false);\n      toggleClass(dragEl, options.ghostClass, true);\n      Sortable.active = this;\n      fallback && this._appendGhost();\n\n      // Drag start event\n      _dispatchEvent({\n        sortable: this,\n        name: 'start',\n        originalEvent: evt\n      });\n    } else {\n      this._nulling();\n    }\n  },\n  _emulateDragOver: function _emulateDragOver() {\n    if (touchEvt) {\n      this._lastX = touchEvt.clientX;\n      this._lastY = touchEvt.clientY;\n      _hideGhostForTarget();\n      var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n      var parent = target;\n      while (target && target.shadowRoot) {\n        target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n        if (target === parent) break;\n        parent = target;\n      }\n      dragEl.parentNode[expando]._isOutsideThisEl(target);\n      if (parent) {\n        do {\n          if (parent[expando]) {\n            var inserted = void 0;\n            inserted = parent[expando]._onDragOver({\n              clientX: touchEvt.clientX,\n              clientY: touchEvt.clientY,\n              target: target,\n              rootEl: parent\n            });\n            if (inserted && !this.options.dragoverBubble) {\n              break;\n            }\n          }\n          target = parent; // store last element\n        }\n        /* jshint boss:true */ while (parent = parent.parentNode);\n      }\n      _unhideGhostForTarget();\n    }\n  },\n  _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) {\n    if (tapEvt) {\n      var options = this.options,\n        fallbackTolerance = options.fallbackTolerance,\n        fallbackOffset = options.fallbackOffset,\n        touch = evt.touches ? evt.touches[0] : evt,\n        ghostMatrix = ghostEl && matrix(ghostEl, true),\n        scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n        scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n        relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n        dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n        dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n\n      // only set the status to dragging, when we are actually dragging\n      if (!Sortable.active && !awaitingDragStarted) {\n        if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n          return;\n        }\n        this._onDragStart(evt, true);\n      }\n      if (ghostEl) {\n        if (ghostMatrix) {\n          ghostMatrix.e += dx - (lastDx || 0);\n          ghostMatrix.f += dy - (lastDy || 0);\n        } else {\n          ghostMatrix = {\n            a: 1,\n            b: 0,\n            c: 0,\n            d: 1,\n            e: dx,\n            f: dy\n          };\n        }\n        var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n        css(ghostEl, 'webkitTransform', cssMatrix);\n        css(ghostEl, 'mozTransform', cssMatrix);\n        css(ghostEl, 'msTransform', cssMatrix);\n        css(ghostEl, 'transform', cssMatrix);\n        lastDx = dx;\n        lastDy = dy;\n        touchEvt = touch;\n      }\n      evt.cancelable && evt.preventDefault();\n    }\n  },\n  _appendGhost: function _appendGhost() {\n    // Bug if using scale(): https://stackoverflow.com/questions/2637058\n    // Not being adjusted for\n    if (!ghostEl) {\n      var container = this.options.fallbackOnBody ? document.body : rootEl,\n        rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n        options = this.options;\n\n      // Position absolutely\n      if (PositionGhostAbsolutely) {\n        // Get relatively positioned parent\n        ghostRelativeParent = container;\n        while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n          ghostRelativeParent = ghostRelativeParent.parentNode;\n        }\n        if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n          if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n          rect.top += ghostRelativeParent.scrollTop;\n          rect.left += ghostRelativeParent.scrollLeft;\n        } else {\n          ghostRelativeParent = getWindowScrollingElement();\n        }\n        ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n      }\n      ghostEl = dragEl.cloneNode(true);\n      toggleClass(ghostEl, options.ghostClass, false);\n      toggleClass(ghostEl, options.fallbackClass, true);\n      toggleClass(ghostEl, options.dragClass, true);\n      css(ghostEl, 'transition', '');\n      css(ghostEl, 'transform', '');\n      css(ghostEl, 'box-sizing', 'border-box');\n      css(ghostEl, 'margin', 0);\n      css(ghostEl, 'top', rect.top);\n      css(ghostEl, 'left', rect.left);\n      css(ghostEl, 'width', rect.width);\n      css(ghostEl, 'height', rect.height);\n      css(ghostEl, 'opacity', '0.8');\n      css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n      css(ghostEl, 'zIndex', '100000');\n      css(ghostEl, 'pointerEvents', 'none');\n      Sortable.ghost = ghostEl;\n      container.appendChild(ghostEl);\n\n      // Set transform-origin\n      css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n    }\n  },\n  _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) {\n    var _this = this;\n    var dataTransfer = evt.dataTransfer;\n    var options = _this.options;\n    pluginEvent('dragStart', this, {\n      evt: evt\n    });\n    if (Sortable.eventCanceled) {\n      this._onDrop();\n      return;\n    }\n    pluginEvent('setupClone', this);\n    if (!Sortable.eventCanceled) {\n      cloneEl = clone(dragEl);\n      cloneEl.removeAttribute(\"id\");\n      cloneEl.draggable = false;\n      cloneEl.style['will-change'] = '';\n      this._hideClone();\n      toggleClass(cloneEl, this.options.chosenClass, false);\n      Sortable.clone = cloneEl;\n    }\n\n    // #1143: IFrame support workaround\n    _this.cloneId = _nextTick(function () {\n      pluginEvent('clone', _this);\n      if (Sortable.eventCanceled) return;\n      if (!_this.options.removeCloneOnHide) {\n        rootEl.insertBefore(cloneEl, dragEl);\n      }\n      _this._hideClone();\n      _dispatchEvent({\n        sortable: _this,\n        name: 'clone'\n      });\n    });\n    !fallback && toggleClass(dragEl, options.dragClass, true);\n\n    // Set proper drop events\n    if (fallback) {\n      ignoreNextClick = true;\n      _this._loopId = setInterval(_this._emulateDragOver, 50);\n    } else {\n      // Undo what was set in _prepareDragStart before drag started\n      off(document, 'mouseup', _this._onDrop);\n      off(document, 'touchend', _this._onDrop);\n      off(document, 'touchcancel', _this._onDrop);\n      if (dataTransfer) {\n        dataTransfer.effectAllowed = 'move';\n        options.setData && options.setData.call(_this, dataTransfer, dragEl);\n      }\n      on(document, 'drop', _this);\n\n      // #1276 fix:\n      css(dragEl, 'transform', 'translateZ(0)');\n    }\n    awaitingDragStarted = true;\n    _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n    on(document, 'selectstart', _this);\n    moved = true;\n    if (Safari) {\n      css(document.body, 'user-select', 'none');\n    }\n  },\n  // Returns true - if no further action is needed (either inserted or another condition)\n  _onDragOver: function _onDragOver( /**Event*/evt) {\n    var el = this.el,\n      target = evt.target,\n      dragRect,\n      targetRect,\n      revert,\n      options = this.options,\n      group = options.group,\n      activeSortable = Sortable.active,\n      isOwner = activeGroup === group,\n      canSort = options.sort,\n      fromSortable = putSortable || activeSortable,\n      vertical,\n      _this = this,\n      completedFired = false;\n    if (_silent) return;\n    function dragOverEvent(name, extra) {\n      pluginEvent(name, _this, _objectSpread2({\n        evt: evt,\n        isOwner: isOwner,\n        axis: vertical ? 'vertical' : 'horizontal',\n        revert: revert,\n        dragRect: dragRect,\n        targetRect: targetRect,\n        canSort: canSort,\n        fromSortable: fromSortable,\n        target: target,\n        completed: completed,\n        onMove: function onMove(target, after) {\n          return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n        },\n        changed: changed\n      }, extra));\n    }\n\n    // Capture animation state\n    function capture() {\n      dragOverEvent('dragOverAnimationCapture');\n      _this.captureAnimationState();\n      if (_this !== fromSortable) {\n        fromSortable.captureAnimationState();\n      }\n    }\n\n    // Return invocation when dragEl is inserted (or completed)\n    function completed(insertion) {\n      dragOverEvent('dragOverCompleted', {\n        insertion: insertion\n      });\n      if (insertion) {\n        // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n        if (isOwner) {\n          activeSortable._hideClone();\n        } else {\n          activeSortable._showClone(_this);\n        }\n        if (_this !== fromSortable) {\n          // Set ghost class to new sortable's ghost class\n          toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n          toggleClass(dragEl, options.ghostClass, true);\n        }\n        if (putSortable !== _this && _this !== Sortable.active) {\n          putSortable = _this;\n        } else if (_this === Sortable.active && putSortable) {\n          putSortable = null;\n        }\n\n        // Animation\n        if (fromSortable === _this) {\n          _this._ignoreWhileAnimating = target;\n        }\n        _this.animateAll(function () {\n          dragOverEvent('dragOverAnimationComplete');\n          _this._ignoreWhileAnimating = null;\n        });\n        if (_this !== fromSortable) {\n          fromSortable.animateAll();\n          fromSortable._ignoreWhileAnimating = null;\n        }\n      }\n\n      // Null lastTarget if it is not inside a previously swapped element\n      if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n        lastTarget = null;\n      }\n\n      // no bubbling and not fallback\n      if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n        dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n\n        // Do not detect for empty insert if already inserted\n        !insertion && nearestEmptyInsertDetectEvent(evt);\n      }\n      !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n      return completedFired = true;\n    }\n\n    // Call when dragEl has been inserted\n    function changed() {\n      newIndex = index(dragEl);\n      newDraggableIndex = index(dragEl, options.draggable);\n      _dispatchEvent({\n        sortable: _this,\n        name: 'change',\n        toEl: el,\n        newIndex: newIndex,\n        newDraggableIndex: newDraggableIndex,\n        originalEvent: evt\n      });\n    }\n    if (evt.preventDefault !== void 0) {\n      evt.cancelable && evt.preventDefault();\n    }\n    target = closest(target, options.draggable, el, true);\n    dragOverEvent('dragOver');\n    if (Sortable.eventCanceled) return completedFired;\n    if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n      return completed(false);\n    }\n    ignoreNextClick = false;\n    if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\n    : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n      vertical = this._getDirection(evt, target) === 'vertical';\n      dragRect = getRect(dragEl);\n      dragOverEvent('dragOverValid');\n      if (Sortable.eventCanceled) return completedFired;\n      if (revert) {\n        parentEl = rootEl; // actualization\n        capture();\n        this._hideClone();\n        dragOverEvent('revert');\n        if (!Sortable.eventCanceled) {\n          if (nextEl) {\n            rootEl.insertBefore(dragEl, nextEl);\n          } else {\n            rootEl.appendChild(dragEl);\n          }\n        }\n        return completed(true);\n      }\n      var elLastChild = lastChild(el, options.draggable);\n      if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n        // Insert to end of list\n\n        // If already at end of list: Do not insert\n        if (elLastChild === dragEl) {\n          return completed(false);\n        }\n\n        // if there is a last element, it is the target\n        if (elLastChild && el === evt.target) {\n          target = elLastChild;\n        }\n        if (target) {\n          targetRect = getRect(target);\n        }\n        if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n          capture();\n          if (elLastChild && elLastChild.nextSibling) {\n            // the last draggable element is not the last node\n            el.insertBefore(dragEl, elLastChild.nextSibling);\n          } else {\n            el.appendChild(dragEl);\n          }\n          parentEl = el; // actualization\n\n          changed();\n          return completed(true);\n        }\n      } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n        // Insert to start of list\n        var firstChild = getChild(el, 0, options, true);\n        if (firstChild === dragEl) {\n          return completed(false);\n        }\n        target = firstChild;\n        targetRect = getRect(target);\n        if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n          capture();\n          el.insertBefore(dragEl, firstChild);\n          parentEl = el; // actualization\n\n          changed();\n          return completed(true);\n        }\n      } else if (target.parentNode === el) {\n        targetRect = getRect(target);\n        var direction = 0,\n          targetBeforeFirstSwap,\n          differentLevel = dragEl.parentNode !== el,\n          differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n          side1 = vertical ? 'top' : 'left',\n          scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n          scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n        if (lastTarget !== target) {\n          targetBeforeFirstSwap = targetRect[side1];\n          pastFirstInvertThresh = false;\n          isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n        }\n        direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n        var sibling;\n        if (direction !== 0) {\n          // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n          var dragIndex = index(dragEl);\n          do {\n            dragIndex -= direction;\n            sibling = parentEl.children[dragIndex];\n          } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n        }\n        // If dragEl is already beside target: Do not insert\n        if (direction === 0 || sibling === target) {\n          return completed(false);\n        }\n        lastTarget = target;\n        lastDirection = direction;\n        var nextSibling = target.nextElementSibling,\n          after = false;\n        after = direction === 1;\n        var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n        if (moveVector !== false) {\n          if (moveVector === 1 || moveVector === -1) {\n            after = moveVector === 1;\n          }\n          _silent = true;\n          setTimeout(_unsilent, 30);\n          capture();\n          if (after && !nextSibling) {\n            el.appendChild(dragEl);\n          } else {\n            target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n          }\n\n          // Undo chrome's scroll adjustment (has no effect on other browsers)\n          if (scrolledPastTop) {\n            scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n          }\n          parentEl = dragEl.parentNode; // actualization\n\n          // must be done before animation\n          if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n            targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n          }\n          changed();\n          return completed(true);\n        }\n      }\n      if (el.contains(dragEl)) {\n        return completed(false);\n      }\n    }\n    return false;\n  },\n  _ignoreWhileAnimating: null,\n  _offMoveEvents: function _offMoveEvents() {\n    off(document, 'mousemove', this._onTouchMove);\n    off(document, 'touchmove', this._onTouchMove);\n    off(document, 'pointermove', this._onTouchMove);\n    off(document, 'dragover', nearestEmptyInsertDetectEvent);\n    off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n    off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n  },\n  _offUpEvents: function _offUpEvents() {\n    var ownerDocument = this.el.ownerDocument;\n    off(ownerDocument, 'mouseup', this._onDrop);\n    off(ownerDocument, 'touchend', this._onDrop);\n    off(ownerDocument, 'pointerup', this._onDrop);\n    off(ownerDocument, 'touchcancel', this._onDrop);\n    off(document, 'selectstart', this);\n  },\n  _onDrop: function _onDrop( /**Event*/evt) {\n    var el = this.el,\n      options = this.options;\n\n    // Get the index of the dragged element within its parent\n    newIndex = index(dragEl);\n    newDraggableIndex = index(dragEl, options.draggable);\n    pluginEvent('drop', this, {\n      evt: evt\n    });\n    parentEl = dragEl && dragEl.parentNode;\n\n    // Get again after plugin event\n    newIndex = index(dragEl);\n    newDraggableIndex = index(dragEl, options.draggable);\n    if (Sortable.eventCanceled) {\n      this._nulling();\n      return;\n    }\n    awaitingDragStarted = false;\n    isCircumstantialInvert = false;\n    pastFirstInvertThresh = false;\n    clearInterval(this._loopId);\n    clearTimeout(this._dragStartTimer);\n    _cancelNextTick(this.cloneId);\n    _cancelNextTick(this._dragStartId);\n\n    // Unbind events\n    if (this.nativeDraggable) {\n      off(document, 'drop', this);\n      off(el, 'dragstart', this._onDragStart);\n    }\n    this._offMoveEvents();\n    this._offUpEvents();\n    if (Safari) {\n      css(document.body, 'user-select', '');\n    }\n    css(dragEl, 'transform', '');\n    if (evt) {\n      if (moved) {\n        evt.cancelable && evt.preventDefault();\n        !options.dropBubble && evt.stopPropagation();\n      }\n      ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n      if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n        // Remove clone(s)\n        cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n      }\n      if (dragEl) {\n        if (this.nativeDraggable) {\n          off(dragEl, 'dragend', this);\n        }\n        _disableDraggable(dragEl);\n        dragEl.style['will-change'] = '';\n\n        // Remove classes\n        // ghostClass is added in dragStarted\n        if (moved && !awaitingDragStarted) {\n          toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n        }\n        toggleClass(dragEl, this.options.chosenClass, false);\n\n        // Drag stop event\n        _dispatchEvent({\n          sortable: this,\n          name: 'unchoose',\n          toEl: parentEl,\n          newIndex: null,\n          newDraggableIndex: null,\n          originalEvent: evt\n        });\n        if (rootEl !== parentEl) {\n          if (newIndex >= 0) {\n            // Add event\n            _dispatchEvent({\n              rootEl: parentEl,\n              name: 'add',\n              toEl: parentEl,\n              fromEl: rootEl,\n              originalEvent: evt\n            });\n\n            // Remove event\n            _dispatchEvent({\n              sortable: this,\n              name: 'remove',\n              toEl: parentEl,\n              originalEvent: evt\n            });\n\n            // drag from one list and drop into another\n            _dispatchEvent({\n              rootEl: parentEl,\n              name: 'sort',\n              toEl: parentEl,\n              fromEl: rootEl,\n              originalEvent: evt\n            });\n            _dispatchEvent({\n              sortable: this,\n              name: 'sort',\n              toEl: parentEl,\n              originalEvent: evt\n            });\n          }\n          putSortable && putSortable.save();\n        } else {\n          if (newIndex !== oldIndex) {\n            if (newIndex >= 0) {\n              // drag & drop within the same list\n              _dispatchEvent({\n                sortable: this,\n                name: 'update',\n                toEl: parentEl,\n                originalEvent: evt\n              });\n              _dispatchEvent({\n                sortable: this,\n                name: 'sort',\n                toEl: parentEl,\n                originalEvent: evt\n              });\n            }\n          }\n        }\n        if (Sortable.active) {\n          /* jshint eqnull:true */\n          if (newIndex == null || newIndex === -1) {\n            newIndex = oldIndex;\n            newDraggableIndex = oldDraggableIndex;\n          }\n          _dispatchEvent({\n            sortable: this,\n            name: 'end',\n            toEl: parentEl,\n            originalEvent: evt\n          });\n\n          // Save sorting\n          this.save();\n        }\n      }\n    }\n    this._nulling();\n  },\n  _nulling: function _nulling() {\n    pluginEvent('nulling', this);\n    rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n    savedInputChecked.forEach(function (el) {\n      el.checked = true;\n    });\n    savedInputChecked.length = lastDx = lastDy = 0;\n  },\n  handleEvent: function handleEvent( /**Event*/evt) {\n    switch (evt.type) {\n      case 'drop':\n      case 'dragend':\n        this._onDrop(evt);\n        break;\n      case 'dragenter':\n      case 'dragover':\n        if (dragEl) {\n          this._onDragOver(evt);\n          _globalDragOver(evt);\n        }\n        break;\n      case 'selectstart':\n        evt.preventDefault();\n        break;\n    }\n  },\n  /**\r\n   * Serializes the item into an array of string.\r\n   * @returns {String[]}\r\n   */\n  toArray: function toArray() {\n    var order = [],\n      el,\n      children = this.el.children,\n      i = 0,\n      n = children.length,\n      options = this.options;\n    for (; i < n; i++) {\n      el = children[i];\n      if (closest(el, options.draggable, this.el, false)) {\n        order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n      }\n    }\n    return order;\n  },\n  /**\r\n   * Sorts the elements according to the array.\r\n   * @param  {String[]}  order  order of the items\r\n   */\n  sort: function sort(order, useAnimation) {\n    var items = {},\n      rootEl = this.el;\n    this.toArray().forEach(function (id, i) {\n      var el = rootEl.children[i];\n      if (closest(el, this.options.draggable, rootEl, false)) {\n        items[id] = el;\n      }\n    }, this);\n    useAnimation && this.captureAnimationState();\n    order.forEach(function (id) {\n      if (items[id]) {\n        rootEl.removeChild(items[id]);\n        rootEl.appendChild(items[id]);\n      }\n    });\n    useAnimation && this.animateAll();\n  },\n  /**\r\n   * Save the current sorting\r\n   */\n  save: function save() {\n    var store = this.options.store;\n    store && store.set && store.set(this);\n  },\n  /**\r\n   * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n   * @param   {HTMLElement}  el\r\n   * @param   {String}       [selector]  default: `options.draggable`\r\n   * @returns {HTMLElement|null}\r\n   */\n  closest: function closest$1(el, selector) {\n    return closest(el, selector || this.options.draggable, this.el, false);\n  },\n  /**\r\n   * Set/get option\r\n   * @param   {string} name\r\n   * @param   {*}      [value]\r\n   * @returns {*}\r\n   */\n  option: function option(name, value) {\n    var options = this.options;\n    if (value === void 0) {\n      return options[name];\n    } else {\n      var modifiedValue = PluginManager.modifyOption(this, name, value);\n      if (typeof modifiedValue !== 'undefined') {\n        options[name] = modifiedValue;\n      } else {\n        options[name] = value;\n      }\n      if (name === 'group') {\n        _prepareGroup(options);\n      }\n    }\n  },\n  /**\r\n   * Destroy\r\n   */\n  destroy: function destroy() {\n    pluginEvent('destroy', this);\n    var el = this.el;\n    el[expando] = null;\n    off(el, 'mousedown', this._onTapStart);\n    off(el, 'touchstart', this._onTapStart);\n    off(el, 'pointerdown', this._onTapStart);\n    if (this.nativeDraggable) {\n      off(el, 'dragover', this);\n      off(el, 'dragenter', this);\n    }\n    // Remove draggable attributes\n    Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n      el.removeAttribute('draggable');\n    });\n    this._onDrop();\n    this._disableDelayedDragEvents();\n    sortables.splice(sortables.indexOf(this.el), 1);\n    this.el = el = null;\n  },\n  _hideClone: function _hideClone() {\n    if (!cloneHidden) {\n      pluginEvent('hideClone', this);\n      if (Sortable.eventCanceled) return;\n      css(cloneEl, 'display', 'none');\n      if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n        cloneEl.parentNode.removeChild(cloneEl);\n      }\n      cloneHidden = true;\n    }\n  },\n  _showClone: function _showClone(putSortable) {\n    if (putSortable.lastPutMode !== 'clone') {\n      this._hideClone();\n      return;\n    }\n    if (cloneHidden) {\n      pluginEvent('showClone', this);\n      if (Sortable.eventCanceled) return;\n\n      // show clone at dragEl or original position\n      if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n        rootEl.insertBefore(cloneEl, dragEl);\n      } else if (nextEl) {\n        rootEl.insertBefore(cloneEl, nextEl);\n      } else {\n        rootEl.appendChild(cloneEl);\n      }\n      if (this.options.group.revertClone) {\n        this.animate(dragEl, cloneEl);\n      }\n      css(cloneEl, 'display', '');\n      cloneHidden = false;\n    }\n  }\n};\nfunction _globalDragOver( /**Event*/evt) {\n  if (evt.dataTransfer) {\n    evt.dataTransfer.dropEffect = 'move';\n  }\n  evt.cancelable && evt.preventDefault();\n}\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n  var evt,\n    sortable = fromEl[expando],\n    onMoveFn = sortable.options.onMove,\n    retVal;\n  // Support for new CustomEvent feature\n  if (window.CustomEvent && !IE11OrLess && !Edge) {\n    evt = new CustomEvent('move', {\n      bubbles: true,\n      cancelable: true\n    });\n  } else {\n    evt = document.createEvent('Event');\n    evt.initEvent('move', true, true);\n  }\n  evt.to = toEl;\n  evt.from = fromEl;\n  evt.dragged = dragEl;\n  evt.draggedRect = dragRect;\n  evt.related = targetEl || toEl;\n  evt.relatedRect = targetRect || getRect(toEl);\n  evt.willInsertAfter = willInsertAfter;\n  evt.originalEvent = originalEvent;\n  fromEl.dispatchEvent(evt);\n  if (onMoveFn) {\n    retVal = onMoveFn.call(sortable, evt, originalEvent);\n  }\n  return retVal;\n}\nfunction _disableDraggable(el) {\n  el.draggable = false;\n}\nfunction _unsilent() {\n  _silent = false;\n}\nfunction _ghostIsFirst(evt, vertical, sortable) {\n  var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true));\n  var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n  var spacer = 10;\n  return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction _ghostIsLast(evt, vertical, sortable) {\n  var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable));\n  var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n  var spacer = 10;\n  return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n  var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n    targetLength = vertical ? targetRect.height : targetRect.width,\n    targetS1 = vertical ? targetRect.top : targetRect.left,\n    targetS2 = vertical ? targetRect.bottom : targetRect.right,\n    invert = false;\n  if (!invertSwap) {\n    // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n    if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n      // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n      // check if past first invert threshold on side opposite of lastDirection\n      if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n        // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n        pastFirstInvertThresh = true;\n      }\n      if (!pastFirstInvertThresh) {\n        // dragEl shadow (target move distance shadow)\n        if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n        : mouseOnAxis > targetS2 - targetMoveDistance) {\n          return -lastDirection;\n        }\n      } else {\n        invert = true;\n      }\n    } else {\n      // Regular\n      if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n        return _getInsertDirection(target);\n      }\n    }\n  }\n  invert = invert || invertSwap;\n  if (invert) {\n    // Invert of regular\n    if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n      return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n    }\n  }\n  return 0;\n}\n\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param  {HTMLElement} target       The target whose position dragEl is being inserted at\r\n * @return {Number}                   Direction dragEl must be swapped\r\n */\nfunction _getInsertDirection(target) {\n  if (index(dragEl) < index(target)) {\n    return 1;\n  } else {\n    return -1;\n  }\n}\n\n/**\r\n * Generate id\r\n * @param   {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */\nfunction _generateId(el) {\n  var str = el.tagName + el.className + el.src + el.href + el.textContent,\n    i = str.length,\n    sum = 0;\n  while (i--) {\n    sum += str.charCodeAt(i);\n  }\n  return sum.toString(36);\n}\nfunction _saveInputCheckedState(root) {\n  savedInputChecked.length = 0;\n  var inputs = root.getElementsByTagName('input');\n  var idx = inputs.length;\n  while (idx--) {\n    var el = inputs[idx];\n    el.checked && savedInputChecked.push(el);\n  }\n}\nfunction _nextTick(fn) {\n  return setTimeout(fn, 0);\n}\nfunction _cancelNextTick(id) {\n  return clearTimeout(id);\n}\n\n// Fixed #973:\nif (documentExists) {\n  on(document, 'touchmove', function (evt) {\n    if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n      evt.preventDefault();\n    }\n  });\n}\n\n// Export utils\nSortable.utils = {\n  on: on,\n  off: off,\n  css: css,\n  find: find,\n  is: function is(el, selector) {\n    return !!closest(el, selector, el, false);\n  },\n  extend: extend,\n  throttle: throttle,\n  closest: closest,\n  toggleClass: toggleClass,\n  clone: clone,\n  index: index,\n  nextTick: _nextTick,\n  cancelNextTick: _cancelNextTick,\n  detectDirection: _detectDirection,\n  getChild: getChild\n};\n\n/**\r\n * Get the Sortable instance of an element\r\n * @param  {HTMLElement} element The element\r\n * @return {Sortable|undefined}         The instance of Sortable\r\n */\nSortable.get = function (element) {\n  return element[expando];\n};\n\n/**\r\n * Mount a plugin to Sortable\r\n * @param  {...SortablePlugin|SortablePlugin[]} plugins       Plugins being mounted\r\n */\nSortable.mount = function () {\n  for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n    plugins[_key] = arguments[_key];\n  }\n  if (plugins[0].constructor === Array) plugins = plugins[0];\n  plugins.forEach(function (plugin) {\n    if (!plugin.prototype || !plugin.prototype.constructor) {\n      throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n    }\n    if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n    PluginManager.mount(plugin);\n  });\n};\n\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement}  el\r\n * @param {Object}      [options]\r\n */\nSortable.create = function (el, options) {\n  return new Sortable(el, options);\n};\n\n// Export\nSortable.version = version;\n\nvar autoScrolls = [],\n  scrollEl,\n  scrollRootEl,\n  scrolling = false,\n  lastAutoScrollX,\n  lastAutoScrollY,\n  touchEvt$1,\n  pointerElemChangedInterval;\nfunction AutoScrollPlugin() {\n  function AutoScroll() {\n    this.defaults = {\n      scroll: true,\n      forceAutoScrollFallback: false,\n      scrollSensitivity: 30,\n      scrollSpeed: 10,\n      bubbleScroll: true\n    };\n\n    // Bind all private methods\n    for (var fn in this) {\n      if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n        this[fn] = this[fn].bind(this);\n      }\n    }\n  }\n  AutoScroll.prototype = {\n    dragStarted: function dragStarted(_ref) {\n      var originalEvent = _ref.originalEvent;\n      if (this.sortable.nativeDraggable) {\n        on(document, 'dragover', this._handleAutoScroll);\n      } else {\n        if (this.options.supportPointer) {\n          on(document, 'pointermove', this._handleFallbackAutoScroll);\n        } else if (originalEvent.touches) {\n          on(document, 'touchmove', this._handleFallbackAutoScroll);\n        } else {\n          on(document, 'mousemove', this._handleFallbackAutoScroll);\n        }\n      }\n    },\n    dragOverCompleted: function dragOverCompleted(_ref2) {\n      var originalEvent = _ref2.originalEvent;\n      // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n      if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n        this._handleAutoScroll(originalEvent);\n      }\n    },\n    drop: function drop() {\n      if (this.sortable.nativeDraggable) {\n        off(document, 'dragover', this._handleAutoScroll);\n      } else {\n        off(document, 'pointermove', this._handleFallbackAutoScroll);\n        off(document, 'touchmove', this._handleFallbackAutoScroll);\n        off(document, 'mousemove', this._handleFallbackAutoScroll);\n      }\n      clearPointerElemChangedInterval();\n      clearAutoScrolls();\n      cancelThrottle();\n    },\n    nulling: function nulling() {\n      touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n      autoScrolls.length = 0;\n    },\n    _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n      this._handleAutoScroll(evt, true);\n    },\n    _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n      var _this = this;\n      var x = (evt.touches ? evt.touches[0] : evt).clientX,\n        y = (evt.touches ? evt.touches[0] : evt).clientY,\n        elem = document.elementFromPoint(x, y);\n      touchEvt$1 = evt;\n\n      // IE does not seem to have native autoscroll,\n      // Edge's autoscroll seems too conditional,\n      // MACOS Safari does not have autoscroll,\n      // Firefox and Chrome are good\n      if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n        autoScroll(evt, this.options, elem, fallback);\n\n        // Listener for pointer element change\n        var ogElemScroller = getParentAutoScrollElement(elem, true);\n        if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n          pointerElemChangedInterval && clearPointerElemChangedInterval();\n          // Detect for pointer elem change, emulating native DnD behaviour\n          pointerElemChangedInterval = setInterval(function () {\n            var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n            if (newElem !== ogElemScroller) {\n              ogElemScroller = newElem;\n              clearAutoScrolls();\n            }\n            autoScroll(evt, _this.options, newElem, fallback);\n          }, 10);\n          lastAutoScrollX = x;\n          lastAutoScrollY = y;\n        }\n      } else {\n        // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n        if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n          clearAutoScrolls();\n          return;\n        }\n        autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n      }\n    }\n  };\n  return _extends(AutoScroll, {\n    pluginName: 'scroll',\n    initializeByDefault: true\n  });\n}\nfunction clearAutoScrolls() {\n  autoScrolls.forEach(function (autoScroll) {\n    clearInterval(autoScroll.pid);\n  });\n  autoScrolls = [];\n}\nfunction clearPointerElemChangedInterval() {\n  clearInterval(pointerElemChangedInterval);\n}\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n  // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n  if (!options.scroll) return;\n  var x = (evt.touches ? evt.touches[0] : evt).clientX,\n    y = (evt.touches ? evt.touches[0] : evt).clientY,\n    sens = options.scrollSensitivity,\n    speed = options.scrollSpeed,\n    winScroller = getWindowScrollingElement();\n  var scrollThisInstance = false,\n    scrollCustomFn;\n\n  // New scroll root, set scrollEl\n  if (scrollRootEl !== rootEl) {\n    scrollRootEl = rootEl;\n    clearAutoScrolls();\n    scrollEl = options.scroll;\n    scrollCustomFn = options.scrollFn;\n    if (scrollEl === true) {\n      scrollEl = getParentAutoScrollElement(rootEl, true);\n    }\n  }\n  var layersOut = 0;\n  var currentParent = scrollEl;\n  do {\n    var el = currentParent,\n      rect = getRect(el),\n      top = rect.top,\n      bottom = rect.bottom,\n      left = rect.left,\n      right = rect.right,\n      width = rect.width,\n      height = rect.height,\n      canScrollX = void 0,\n      canScrollY = void 0,\n      scrollWidth = el.scrollWidth,\n      scrollHeight = el.scrollHeight,\n      elCSS = css(el),\n      scrollPosX = el.scrollLeft,\n      scrollPosY = el.scrollTop;\n    if (el === winScroller) {\n      canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n      canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n    } else {\n      canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n      canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n    }\n    var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n    var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n    if (!autoScrolls[layersOut]) {\n      for (var i = 0; i <= layersOut; i++) {\n        if (!autoScrolls[i]) {\n          autoScrolls[i] = {};\n        }\n      }\n    }\n    if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n      autoScrolls[layersOut].el = el;\n      autoScrolls[layersOut].vx = vx;\n      autoScrolls[layersOut].vy = vy;\n      clearInterval(autoScrolls[layersOut].pid);\n      if (vx != 0 || vy != 0) {\n        scrollThisInstance = true;\n        /* jshint loopfunc:true */\n        autoScrolls[layersOut].pid = setInterval(function () {\n          // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n          if (isFallback && this.layer === 0) {\n            Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n          }\n          var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n          var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n          if (typeof scrollCustomFn === 'function') {\n            if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n              return;\n            }\n          }\n          scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n        }.bind({\n          layer: layersOut\n        }), 24);\n      }\n    }\n    layersOut++;\n  } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n  scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n  var originalEvent = _ref.originalEvent,\n    putSortable = _ref.putSortable,\n    dragEl = _ref.dragEl,\n    activeSortable = _ref.activeSortable,\n    dispatchSortableEvent = _ref.dispatchSortableEvent,\n    hideGhostForTarget = _ref.hideGhostForTarget,\n    unhideGhostForTarget = _ref.unhideGhostForTarget;\n  if (!originalEvent) return;\n  var toSortable = putSortable || activeSortable;\n  hideGhostForTarget();\n  var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n  var target = document.elementFromPoint(touch.clientX, touch.clientY);\n  unhideGhostForTarget();\n  if (toSortable && !toSortable.el.contains(target)) {\n    dispatchSortableEvent('spill');\n    this.onSpill({\n      dragEl: dragEl,\n      putSortable: putSortable\n    });\n  }\n};\nfunction Revert() {}\nRevert.prototype = {\n  startIndex: null,\n  dragStart: function dragStart(_ref2) {\n    var oldDraggableIndex = _ref2.oldDraggableIndex;\n    this.startIndex = oldDraggableIndex;\n  },\n  onSpill: function onSpill(_ref3) {\n    var dragEl = _ref3.dragEl,\n      putSortable = _ref3.putSortable;\n    this.sortable.captureAnimationState();\n    if (putSortable) {\n      putSortable.captureAnimationState();\n    }\n    var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n    if (nextSibling) {\n      this.sortable.el.insertBefore(dragEl, nextSibling);\n    } else {\n      this.sortable.el.appendChild(dragEl);\n    }\n    this.sortable.animateAll();\n    if (putSortable) {\n      putSortable.animateAll();\n    }\n  },\n  drop: drop\n};\n_extends(Revert, {\n  pluginName: 'revertOnSpill'\n});\nfunction Remove() {}\nRemove.prototype = {\n  onSpill: function onSpill(_ref4) {\n    var dragEl = _ref4.dragEl,\n      putSortable = _ref4.putSortable;\n    var parentSortable = putSortable || this.sortable;\n    parentSortable.captureAnimationState();\n    dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n    parentSortable.animateAll();\n  },\n  drop: drop\n};\n_extends(Remove, {\n  pluginName: 'removeOnSpill'\n});\n\nvar lastSwapEl;\nfunction SwapPlugin() {\n  function Swap() {\n    this.defaults = {\n      swapClass: 'sortable-swap-highlight'\n    };\n  }\n  Swap.prototype = {\n    dragStart: function dragStart(_ref) {\n      var dragEl = _ref.dragEl;\n      lastSwapEl = dragEl;\n    },\n    dragOverValid: function dragOverValid(_ref2) {\n      var completed = _ref2.completed,\n        target = _ref2.target,\n        onMove = _ref2.onMove,\n        activeSortable = _ref2.activeSortable,\n        changed = _ref2.changed,\n        cancel = _ref2.cancel;\n      if (!activeSortable.options.swap) return;\n      var el = this.sortable.el,\n        options = this.options;\n      if (target && target !== el) {\n        var prevSwapEl = lastSwapEl;\n        if (onMove(target) !== false) {\n          toggleClass(target, options.swapClass, true);\n          lastSwapEl = target;\n        } else {\n          lastSwapEl = null;\n        }\n        if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n          toggleClass(prevSwapEl, options.swapClass, false);\n        }\n      }\n      changed();\n      completed(true);\n      cancel();\n    },\n    drop: function drop(_ref3) {\n      var activeSortable = _ref3.activeSortable,\n        putSortable = _ref3.putSortable,\n        dragEl = _ref3.dragEl;\n      var toSortable = putSortable || this.sortable;\n      var options = this.options;\n      lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n      if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n        if (dragEl !== lastSwapEl) {\n          toSortable.captureAnimationState();\n          if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n          swapNodes(dragEl, lastSwapEl);\n          toSortable.animateAll();\n          if (toSortable !== activeSortable) activeSortable.animateAll();\n        }\n      }\n    },\n    nulling: function nulling() {\n      lastSwapEl = null;\n    }\n  };\n  return _extends(Swap, {\n    pluginName: 'swap',\n    eventProperties: function eventProperties() {\n      return {\n        swapItem: lastSwapEl\n      };\n    }\n  });\n}\nfunction swapNodes(n1, n2) {\n  var p1 = n1.parentNode,\n    p2 = n2.parentNode,\n    i1,\n    i2;\n  if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n  i1 = index(n1);\n  i2 = index(n2);\n  if (p1.isEqualNode(p2) && i1 < i2) {\n    i2++;\n  }\n  p1.insertBefore(n2, p1.children[i1]);\n  p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n  multiDragClones = [],\n  lastMultiDragSelect,\n  // for selection with modifier key down (SHIFT)\n  multiDragSortable,\n  initialFolding = false,\n  // Initial multi-drag fold when drag started\n  folding = false,\n  // Folding any other time\n  dragStarted = false,\n  dragEl$1,\n  clonesFromRect,\n  clonesHidden;\nfunction MultiDragPlugin() {\n  function MultiDrag(sortable) {\n    // Bind all private methods\n    for (var fn in this) {\n      if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n        this[fn] = this[fn].bind(this);\n      }\n    }\n    if (!sortable.options.avoidImplicitDeselect) {\n      if (sortable.options.supportPointer) {\n        on(document, 'pointerup', this._deselectMultiDrag);\n      } else {\n        on(document, 'mouseup', this._deselectMultiDrag);\n        on(document, 'touchend', this._deselectMultiDrag);\n      }\n    }\n    on(document, 'keydown', this._checkKeyDown);\n    on(document, 'keyup', this._checkKeyUp);\n    this.defaults = {\n      selectedClass: 'sortable-selected',\n      multiDragKey: null,\n      avoidImplicitDeselect: false,\n      setData: function setData(dataTransfer, dragEl) {\n        var data = '';\n        if (multiDragElements.length && multiDragSortable === sortable) {\n          multiDragElements.forEach(function (multiDragElement, i) {\n            data += (!i ? '' : ', ') + multiDragElement.textContent;\n          });\n        } else {\n          data = dragEl.textContent;\n        }\n        dataTransfer.setData('Text', data);\n      }\n    };\n  }\n  MultiDrag.prototype = {\n    multiDragKeyDown: false,\n    isMultiDrag: false,\n    delayStartGlobal: function delayStartGlobal(_ref) {\n      var dragged = _ref.dragEl;\n      dragEl$1 = dragged;\n    },\n    delayEnded: function delayEnded() {\n      this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n    },\n    setupClone: function setupClone(_ref2) {\n      var sortable = _ref2.sortable,\n        cancel = _ref2.cancel;\n      if (!this.isMultiDrag) return;\n      for (var i = 0; i < multiDragElements.length; i++) {\n        multiDragClones.push(clone(multiDragElements[i]));\n        multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n        multiDragClones[i].draggable = false;\n        multiDragClones[i].style['will-change'] = '';\n        toggleClass(multiDragClones[i], this.options.selectedClass, false);\n        multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n      }\n      sortable._hideClone();\n      cancel();\n    },\n    clone: function clone(_ref3) {\n      var sortable = _ref3.sortable,\n        rootEl = _ref3.rootEl,\n        dispatchSortableEvent = _ref3.dispatchSortableEvent,\n        cancel = _ref3.cancel;\n      if (!this.isMultiDrag) return;\n      if (!this.options.removeCloneOnHide) {\n        if (multiDragElements.length && multiDragSortable === sortable) {\n          insertMultiDragClones(true, rootEl);\n          dispatchSortableEvent('clone');\n          cancel();\n        }\n      }\n    },\n    showClone: function showClone(_ref4) {\n      var cloneNowShown = _ref4.cloneNowShown,\n        rootEl = _ref4.rootEl,\n        cancel = _ref4.cancel;\n      if (!this.isMultiDrag) return;\n      insertMultiDragClones(false, rootEl);\n      multiDragClones.forEach(function (clone) {\n        css(clone, 'display', '');\n      });\n      cloneNowShown();\n      clonesHidden = false;\n      cancel();\n    },\n    hideClone: function hideClone(_ref5) {\n      var _this = this;\n      var sortable = _ref5.sortable,\n        cloneNowHidden = _ref5.cloneNowHidden,\n        cancel = _ref5.cancel;\n      if (!this.isMultiDrag) return;\n      multiDragClones.forEach(function (clone) {\n        css(clone, 'display', 'none');\n        if (_this.options.removeCloneOnHide && clone.parentNode) {\n          clone.parentNode.removeChild(clone);\n        }\n      });\n      cloneNowHidden();\n      clonesHidden = true;\n      cancel();\n    },\n    dragStartGlobal: function dragStartGlobal(_ref6) {\n      var sortable = _ref6.sortable;\n      if (!this.isMultiDrag && multiDragSortable) {\n        multiDragSortable.multiDrag._deselectMultiDrag();\n      }\n      multiDragElements.forEach(function (multiDragElement) {\n        multiDragElement.sortableIndex = index(multiDragElement);\n      });\n\n      // Sort multi-drag elements\n      multiDragElements = multiDragElements.sort(function (a, b) {\n        return a.sortableIndex - b.sortableIndex;\n      });\n      dragStarted = true;\n    },\n    dragStarted: function dragStarted(_ref7) {\n      var _this2 = this;\n      var sortable = _ref7.sortable;\n      if (!this.isMultiDrag) return;\n      if (this.options.sort) {\n        // Capture rects,\n        // hide multi drag elements (by positioning them absolute),\n        // set multi drag elements rects to dragRect,\n        // show multi drag elements,\n        // animate to rects,\n        // unset rects & remove from DOM\n\n        sortable.captureAnimationState();\n        if (this.options.animation) {\n          multiDragElements.forEach(function (multiDragElement) {\n            if (multiDragElement === dragEl$1) return;\n            css(multiDragElement, 'position', 'absolute');\n          });\n          var dragRect = getRect(dragEl$1, false, true, true);\n          multiDragElements.forEach(function (multiDragElement) {\n            if (multiDragElement === dragEl$1) return;\n            setRect(multiDragElement, dragRect);\n          });\n          folding = true;\n          initialFolding = true;\n        }\n      }\n      sortable.animateAll(function () {\n        folding = false;\n        initialFolding = false;\n        if (_this2.options.animation) {\n          multiDragElements.forEach(function (multiDragElement) {\n            unsetRect(multiDragElement);\n          });\n        }\n\n        // Remove all auxiliary multidrag items from el, if sorting enabled\n        if (_this2.options.sort) {\n          removeMultiDragElements();\n        }\n      });\n    },\n    dragOver: function dragOver(_ref8) {\n      var target = _ref8.target,\n        completed = _ref8.completed,\n        cancel = _ref8.cancel;\n      if (folding && ~multiDragElements.indexOf(target)) {\n        completed(false);\n        cancel();\n      }\n    },\n    revert: function revert(_ref9) {\n      var fromSortable = _ref9.fromSortable,\n        rootEl = _ref9.rootEl,\n        sortable = _ref9.sortable,\n        dragRect = _ref9.dragRect;\n      if (multiDragElements.length > 1) {\n        // Setup unfold animation\n        multiDragElements.forEach(function (multiDragElement) {\n          sortable.addAnimationState({\n            target: multiDragElement,\n            rect: folding ? getRect(multiDragElement) : dragRect\n          });\n          unsetRect(multiDragElement);\n          multiDragElement.fromRect = dragRect;\n          fromSortable.removeAnimationState(multiDragElement);\n        });\n        folding = false;\n        insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n      }\n    },\n    dragOverCompleted: function dragOverCompleted(_ref10) {\n      var sortable = _ref10.sortable,\n        isOwner = _ref10.isOwner,\n        insertion = _ref10.insertion,\n        activeSortable = _ref10.activeSortable,\n        parentEl = _ref10.parentEl,\n        putSortable = _ref10.putSortable;\n      var options = this.options;\n      if (insertion) {\n        // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n        if (isOwner) {\n          activeSortable._hideClone();\n        }\n        initialFolding = false;\n        // If leaving sort:false root, or already folding - Fold to new location\n        if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n          // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n          var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n          multiDragElements.forEach(function (multiDragElement) {\n            if (multiDragElement === dragEl$1) return;\n            setRect(multiDragElement, dragRectAbsolute);\n\n            // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n            // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n            parentEl.appendChild(multiDragElement);\n          });\n          folding = true;\n        }\n\n        // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n        if (!isOwner) {\n          // Only remove if not folding (folding will remove them anyways)\n          if (!folding) {\n            removeMultiDragElements();\n          }\n          if (multiDragElements.length > 1) {\n            var clonesHiddenBefore = clonesHidden;\n            activeSortable._showClone(sortable);\n\n            // Unfold animation for clones if showing from hidden\n            if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n              multiDragClones.forEach(function (clone) {\n                activeSortable.addAnimationState({\n                  target: clone,\n                  rect: clonesFromRect\n                });\n                clone.fromRect = clonesFromRect;\n                clone.thisAnimationDuration = null;\n              });\n            }\n          } else {\n            activeSortable._showClone(sortable);\n          }\n        }\n      }\n    },\n    dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n      var dragRect = _ref11.dragRect,\n        isOwner = _ref11.isOwner,\n        activeSortable = _ref11.activeSortable;\n      multiDragElements.forEach(function (multiDragElement) {\n        multiDragElement.thisAnimationDuration = null;\n      });\n      if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n        clonesFromRect = _extends({}, dragRect);\n        var dragMatrix = matrix(dragEl$1, true);\n        clonesFromRect.top -= dragMatrix.f;\n        clonesFromRect.left -= dragMatrix.e;\n      }\n    },\n    dragOverAnimationComplete: function dragOverAnimationComplete() {\n      if (folding) {\n        folding = false;\n        removeMultiDragElements();\n      }\n    },\n    drop: function drop(_ref12) {\n      var evt = _ref12.originalEvent,\n        rootEl = _ref12.rootEl,\n        parentEl = _ref12.parentEl,\n        sortable = _ref12.sortable,\n        dispatchSortableEvent = _ref12.dispatchSortableEvent,\n        oldIndex = _ref12.oldIndex,\n        putSortable = _ref12.putSortable;\n      var toSortable = putSortable || this.sortable;\n      if (!evt) return;\n      var options = this.options,\n        children = parentEl.children;\n\n      // Multi-drag selection\n      if (!dragStarted) {\n        if (options.multiDragKey && !this.multiDragKeyDown) {\n          this._deselectMultiDrag();\n        }\n        toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n        if (!~multiDragElements.indexOf(dragEl$1)) {\n          multiDragElements.push(dragEl$1);\n          dispatchEvent({\n            sortable: sortable,\n            rootEl: rootEl,\n            name: 'select',\n            targetEl: dragEl$1,\n            originalEvent: evt\n          });\n\n          // Modifier activated, select from last to dragEl\n          if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n            var lastIndex = index(lastMultiDragSelect),\n              currentIndex = index(dragEl$1);\n            if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n              // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n              // (but previous selection existed)\n              var n, i;\n              if (currentIndex > lastIndex) {\n                i = lastIndex;\n                n = currentIndex;\n              } else {\n                i = currentIndex;\n                n = lastIndex + 1;\n              }\n              for (; i < n; i++) {\n                if (~multiDragElements.indexOf(children[i])) continue;\n                toggleClass(children[i], options.selectedClass, true);\n                multiDragElements.push(children[i]);\n                dispatchEvent({\n                  sortable: sortable,\n                  rootEl: rootEl,\n                  name: 'select',\n                  targetEl: children[i],\n                  originalEvent: evt\n                });\n              }\n            }\n          } else {\n            lastMultiDragSelect = dragEl$1;\n          }\n          multiDragSortable = toSortable;\n        } else {\n          multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n          lastMultiDragSelect = null;\n          dispatchEvent({\n            sortable: sortable,\n            rootEl: rootEl,\n            name: 'deselect',\n            targetEl: dragEl$1,\n            originalEvent: evt\n          });\n        }\n      }\n\n      // Multi-drag drop\n      if (dragStarted && this.isMultiDrag) {\n        folding = false;\n        // Do not \"unfold\" after around dragEl if reverted\n        if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n          var dragRect = getRect(dragEl$1),\n            multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n          if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n          toSortable.captureAnimationState();\n          if (!initialFolding) {\n            if (options.animation) {\n              dragEl$1.fromRect = dragRect;\n              multiDragElements.forEach(function (multiDragElement) {\n                multiDragElement.thisAnimationDuration = null;\n                if (multiDragElement !== dragEl$1) {\n                  var rect = folding ? getRect(multiDragElement) : dragRect;\n                  multiDragElement.fromRect = rect;\n\n                  // Prepare unfold animation\n                  toSortable.addAnimationState({\n                    target: multiDragElement,\n                    rect: rect\n                  });\n                }\n              });\n            }\n\n            // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n            // properly they must all be removed\n            removeMultiDragElements();\n            multiDragElements.forEach(function (multiDragElement) {\n              if (children[multiDragIndex]) {\n                parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n              } else {\n                parentEl.appendChild(multiDragElement);\n              }\n              multiDragIndex++;\n            });\n\n            // If initial folding is done, the elements may have changed position because they are now\n            // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n            // must be fired here as Sortable will not.\n            if (oldIndex === index(dragEl$1)) {\n              var update = false;\n              multiDragElements.forEach(function (multiDragElement) {\n                if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n                  update = true;\n                  return;\n                }\n              });\n              if (update) {\n                dispatchSortableEvent('update');\n                dispatchSortableEvent('sort');\n              }\n            }\n          }\n\n          // Must be done after capturing individual rects (scroll bar)\n          multiDragElements.forEach(function (multiDragElement) {\n            unsetRect(multiDragElement);\n          });\n          toSortable.animateAll();\n        }\n        multiDragSortable = toSortable;\n      }\n\n      // Remove clones if necessary\n      if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n        multiDragClones.forEach(function (clone) {\n          clone.parentNode && clone.parentNode.removeChild(clone);\n        });\n      }\n    },\n    nullingGlobal: function nullingGlobal() {\n      this.isMultiDrag = dragStarted = false;\n      multiDragClones.length = 0;\n    },\n    destroyGlobal: function destroyGlobal() {\n      this._deselectMultiDrag();\n      off(document, 'pointerup', this._deselectMultiDrag);\n      off(document, 'mouseup', this._deselectMultiDrag);\n      off(document, 'touchend', this._deselectMultiDrag);\n      off(document, 'keydown', this._checkKeyDown);\n      off(document, 'keyup', this._checkKeyUp);\n    },\n    _deselectMultiDrag: function _deselectMultiDrag(evt) {\n      if (typeof dragStarted !== \"undefined\" && dragStarted) return;\n\n      // Only deselect if selection is in this sortable\n      if (multiDragSortable !== this.sortable) return;\n\n      // Only deselect if target is not item in this sortable\n      if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n\n      // Only deselect if left click\n      if (evt && evt.button !== 0) return;\n      while (multiDragElements.length) {\n        var el = multiDragElements[0];\n        toggleClass(el, this.options.selectedClass, false);\n        multiDragElements.shift();\n        dispatchEvent({\n          sortable: this.sortable,\n          rootEl: this.sortable.el,\n          name: 'deselect',\n          targetEl: el,\n          originalEvent: evt\n        });\n      }\n    },\n    _checkKeyDown: function _checkKeyDown(evt) {\n      if (evt.key === this.options.multiDragKey) {\n        this.multiDragKeyDown = true;\n      }\n    },\n    _checkKeyUp: function _checkKeyUp(evt) {\n      if (evt.key === this.options.multiDragKey) {\n        this.multiDragKeyDown = false;\n      }\n    }\n  };\n  return _extends(MultiDrag, {\n    // Static methods & properties\n    pluginName: 'multiDrag',\n    utils: {\n      /**\r\n       * Selects the provided multi-drag item\r\n       * @param  {HTMLElement} el    The element to be selected\r\n       */\n      select: function select(el) {\n        var sortable = el.parentNode[expando];\n        if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n        if (multiDragSortable && multiDragSortable !== sortable) {\n          multiDragSortable.multiDrag._deselectMultiDrag();\n          multiDragSortable = sortable;\n        }\n        toggleClass(el, sortable.options.selectedClass, true);\n        multiDragElements.push(el);\n      },\n      /**\r\n       * Deselects the provided multi-drag item\r\n       * @param  {HTMLElement} el    The element to be deselected\r\n       */\n      deselect: function deselect(el) {\n        var sortable = el.parentNode[expando],\n          index = multiDragElements.indexOf(el);\n        if (!sortable || !sortable.options.multiDrag || !~index) return;\n        toggleClass(el, sortable.options.selectedClass, false);\n        multiDragElements.splice(index, 1);\n      }\n    },\n    eventProperties: function eventProperties() {\n      var _this3 = this;\n      var oldIndicies = [],\n        newIndicies = [];\n      multiDragElements.forEach(function (multiDragElement) {\n        oldIndicies.push({\n          multiDragElement: multiDragElement,\n          index: multiDragElement.sortableIndex\n        });\n\n        // multiDragElements will already be sorted if folding\n        var newIndex;\n        if (folding && multiDragElement !== dragEl$1) {\n          newIndex = -1;\n        } else if (folding) {\n          newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n        } else {\n          newIndex = index(multiDragElement);\n        }\n        newIndicies.push({\n          multiDragElement: multiDragElement,\n          index: newIndex\n        });\n      });\n      return {\n        items: _toConsumableArray(multiDragElements),\n        clones: [].concat(multiDragClones),\n        oldIndicies: oldIndicies,\n        newIndicies: newIndicies\n      };\n    },\n    optionListeners: {\n      multiDragKey: function multiDragKey(key) {\n        key = key.toLowerCase();\n        if (key === 'ctrl') {\n          key = 'Control';\n        } else if (key.length > 1) {\n          key = key.charAt(0).toUpperCase() + key.substr(1);\n        }\n        return key;\n      }\n    }\n  });\n}\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n  multiDragElements.forEach(function (multiDragElement, i) {\n    var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n    if (target) {\n      rootEl.insertBefore(multiDragElement, target);\n    } else {\n      rootEl.appendChild(multiDragElement);\n    }\n  });\n}\n\n/**\r\n * Insert multi-drag clones\r\n * @param  {[Boolean]} elementsInserted  Whether the multi-drag elements are inserted\r\n * @param  {HTMLElement} rootEl\r\n */\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n  multiDragClones.forEach(function (clone, i) {\n    var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n    if (target) {\n      rootEl.insertBefore(clone, target);\n    } else {\n      rootEl.appendChild(clone);\n    }\n  });\n}\nfunction removeMultiDragElements() {\n  multiDragElements.forEach(function (multiDragElement) {\n    if (multiDragElement === dragEl$1) return;\n    multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n  });\n}\n\nSortable.mount(new AutoScrollPlugin());\nSortable.mount(Remove, Revert);\n\nexport default Sortable;\nexport { MultiDragPlugin as MultiDrag, Sortable, SwapPlugin as Swap };\n","import { defineComponent, useAttrs, ref, computed, watch, onUnmounted, openBlock, createBlock, resolveDynamicComponent, normalizeClass, withCtx, renderSlot, createElementBlock, Fragment, renderList } from 'vue';\nimport Sortable from 'sortablejs';\n\nconst _sfc_main = /* @__PURE__ */ defineComponent({\n  __name: \"Sortable\",\n  props: {\n    /** All SortableJS options are supported; events are handled by the `defineEmits` below and should be used with v-on */\n    options: {\n      type: Object,\n      default: null,\n      required: false\n    },\n    /** Your list of items **/\n    list: {\n      type: [Array, Object],\n      default: [],\n      required: true\n    },\n    /** The name of the key present in each item in the list that corresponds to a unique value. */\n    itemKey: {\n      type: [String, Function],\n      default: \"\",\n      required: true\n    },\n    /** The element type to render as. */\n    tag: {\n      type: String,\n      default: \"div\",\n      required: false\n    }\n  },\n  emits: [\"choose\", \"unchoose\", \"start\", \"end\", \"add\", \"update\", \"sort\", \"remove\", \"filter\", \"move\", \"clone\", \"change\"],\n  setup(__props, { expose: __expose, emit: __emit }) {\n    const props = __props;\n    const emit = __emit;\n    const attrs = useAttrs();\n    const isDragging = ref(false);\n    const containerRef = ref(null);\n    const sortable = ref(null);\n    const getKey = computed(() => {\n      if (typeof props.itemKey === \"string\")\n        return (item) => item[props.itemKey];\n      return props.itemKey;\n    });\n    __expose({\n      containerRef,\n      sortable,\n      isDragging\n    });\n    watch(containerRef, (newDraggable) => {\n      if (newDraggable) {\n        sortable.value = new Sortable(newDraggable, {\n          ...props.options,\n          onChoose: (event) => emit(\"choose\", event),\n          onUnchoose: (event) => emit(\"unchoose\", event),\n          onStart: (event) => {\n            isDragging.value = true;\n            emit(\"start\", event);\n          },\n          onEnd: (event) => {\n            setTimeout(() => {\n              isDragging.value = false;\n              emit(\"end\", event);\n            });\n          },\n          onAdd: (event) => emit(\"add\", event),\n          onUpdate: (event) => emit(\"update\", event),\n          onSort: (event) => emit(\"sort\", event),\n          onRemove: (event) => emit(\"remove\", event),\n          onFilter: (event) => emit(\"filter\", event),\n          // See https://github.com/MaxLeiter/sortablejs-vue3/pull/56 for context on `attrs`.\n          onMove: (event, originalEvent) => \"onMoveCapture\" in attrs ? (\n            /**  eslint-disable-next-line */\n            attrs.onMoveCapture(event, originalEvent)\n          ) : emit(\"move\", event, originalEvent),\n          onClone: (event) => emit(\"clone\", event),\n          onChange: (event) => emit(\"change\", event)\n        });\n      }\n    });\n    watch(\n      () => props.options,\n      (options) => {\n        if (options && sortable?.value) {\n          for (const property in options) {\n            sortable.value.option(\n              property,\n              options[property]\n            );\n          }\n        }\n      }\n    );\n    onUnmounted(() => {\n      if (sortable.value) {\n        sortable.value.destroy();\n        containerRef.value = null;\n        sortable.value = null;\n      }\n    });\n    return (_ctx, _cache) => {\n      return openBlock(), createBlock(resolveDynamicComponent(_ctx.$props.tag), {\n        ref_key: \"containerRef\",\n        ref: containerRef,\n        class: normalizeClass(_ctx.$props.class)\n      }, {\n        default: withCtx(() => [\n          renderSlot(_ctx.$slots, \"header\"),\n          (openBlock(true), createElementBlock(Fragment, null, renderList(__props.list, (item, index) => {\n            return renderSlot(_ctx.$slots, \"item\", {\n              key: getKey.value(item),\n              element: item,\n              index\n            });\n          }), 128)),\n          renderSlot(_ctx.$slots, \"footer\")\n        ]),\n        _: 3\n      }, 8, [\"class\"]);\n    };\n  }\n});\n\nexport { _sfc_main as Sortable };\n","<template>\n    <Sortable v-if=\"draggable\" :list=\"listModel\" :item-key=\"itemKey\" tag=\"div\" class=\"st-list\" :class=\"{'is-dragging': isDrag}\" :options=\"options\" @start=\"onStart\" @update=\"onUpdate\">\n        <template #item=\"{element, index}\">\n            <slot name=\"item\" v-bind=\"{item: element as T, index}\" />\n        </template>\n    </Sortable>\n    <TransitionGroup v-else-if=\"withAnimation\" tag=\"div\" name=\"list\" class=\"st-list\">\n        <slot />\n    </TransitionGroup>\n    <div v-else class=\"st-list\">\n        <slot />\n    </div>\n</template>\n\n<script setup lang=\"ts\" generic=\"T\">\nimport { SortableEvent, SortableOptions } from 'sortablejs';\nimport { Sortable } from 'sortablejs-vue3';\nimport { computed, nextTick, ref } from 'vue';\n\nconst props = withDefaults(\n    // props\n    defineProps<{\n        draggable?: boolean;\n        group?: string;\n        withAnimation?: boolean;\n        itemKey?: string | ((item: any) => string | number | symbol);\n    }>(),\n    // default values\n    {\n        valueModel: null,\n        draggable: false,\n        group: undefined,\n        withAnimation: false,\n        itemKey: 'id',\n    },\n);\n\nconst listModel = defineModel<T[] | undefined>({ default: undefined });\n\nconst options = computed<SortableOptions>(() => {\n    return {\n        animation: 200,\n        group: props.group,\n        handle: '.drag',\n        ghostClass: 'is-dragging',\n        forceFallback: true,\n    };\n});\n\nconst isDrag = ref(false);\n\nconst onStart = () => {\n    isDrag.value = true;\n};\n\nconst onUpdate = async ({ from, to, oldIndex, newIndex, ...event }: SortableEvent) => {\n    if (from !== to) {\n        console.warn('Dragged between lists, not supported', from, to, event);\n\n        // On firefox we need to cancel all click events that happen after a drag\n        // otherwise it will click one of the elements that was dragged\n\n        setTimeout(() => {\n            isDrag.value = false;\n        }, 100);\n        return;\n    }\n\n    if (listModel.value !== undefined) {\n        if (oldIndex !== undefined && newIndex !== undefined) {\n            listModel.value = await moveItemInArray(listModel.value, oldIndex, newIndex);\n        }\n    }\n\n    // On firefox we need to cancel all click events that happen after a drag\n    // otherwise it will click one of the elements that was dragged\n\n    setTimeout(() => {\n        isDrag.value = false;\n    }, 100);\n};\n\nconst moveItemInArray = async <T>(array: T[], from: number, to: number) => {\n    const copy = [...array];\n    const item = copy.splice(from, 1)[0];\n\n    return await nextTick(() => {\n        copy.splice(to, 0, item);\n        return copy;\n    });\n};\n</script>\n\n<style lang=\"scss\">\n@use '@stamhoofd/scss/base/variables' as *;\n\n.st-list {\n    padding: 0;\n    margin: 0 calc(-1 * var(--st-horizontal-padding, 40px));\n    position: relative;\n\n    .st-list > & {\n        // Allow stacking if we need partial draggable area\n        margin: 0;\n    }\n\n    > .st-list-item {\n        &.list-move {\n            transition: transform 0.2s, opacity 0.2s !important;\n        }\n\n        &.list-enter-active,\n        &.list-leave-active {\n            transition: transform 0.2s, opacity 0.2s !important;\n        }\n\n        &.list-enter-from,\n        &.list-leave-to {\n            opacity: 0;\n            transform: translateX(30px);\n        }\n\n        &.list-leave-active {\n            position: absolute;\n        }\n\n        &.is-dragging {\n            .middle, .right, .left {\n                visibility: hidden;\n            }\n        }\n\n        &.sortable-drag {\n            opacity: 0.8 !important;\n            cursor: grabbing !important;\n        }\n    }\n\n    +.style-button-bar {\n        margin-top: 15px;\n    }\n\n    .icon.drag {\n        cursor: grab;\n\n        &:active {\n            cursor: grabbing;\n        }\n    }\n\n    &.is-dragging {\n        * {\n            cursor: grabbing !important;\n        }\n    }\n\n}\n</style>\n","<template>\n    <component\n        :is=\"dynamicElementName\"\n        class=\"st-list-item\"\n        :class=\"[{\n            selectable,\n            hoverable,\n            disabled,\n            button: dynamicElementName === 'button'\n        }, $attrs.class]\"\n        :type=\"dynamicElementName === 'button' ? 'button' : undefined\"\n        v-bind=\"$attrs\"\n        @click=\"onClick\"\n        @contextmenu=\"$emit('contextmenu', $event)\"\n    >\n        <div class=\"left\">\n            <slot name=\"left\" />\n        </div>\n        <div class=\"main\">\n            <div>\n                <div class=\"middle\">\n                    <slot />\n                </div>\n                <div class=\"right\">\n                    <slot name=\"right\" />\n                </div>\n            </div>\n            <hr>\n        </div>\n    </component>\n</template>\n\n<script lang=\"ts\">\nimport { Component, Prop, VueComponent } from '@simonbackx/vue-app-navigation/classes';\n\n@Component({\n    emits: ['click', 'contextmenu'],\n    inheritAttrs: false,\n})\nexport default class STListItem extends VueComponent {\n    @Prop({ default: 'article', type: String })\n    elementName!: string;\n\n    @Prop({ default: false, type: Boolean })\n    selectable!: boolean;\n\n    @Prop({ default: false, type: Boolean })\n    disabled!: boolean;\n\n    get dynamicElementName() {\n        if (this.elementName === 'article' && this.selectable && !this.disabled) {\n            return 'button';\n        }\n        return this.elementName;\n    }\n\n    get hoverable() {\n        return this.dynamicElementName === 'button' || this.dynamicElementName === 'label';\n    }\n\n    onClick(event) {\n        const isDragging = this.$parent?.$parent?.$el?.className?.indexOf('is-dragging') >= 0;\n        if (isDragging) {\n            console.log('canceled list item click because of drag');\n            return;\n        }\n        this.$emit('click', event);\n    }\n}\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables\" as *;\n@use \"@stamhoofd/scss/base/text-styles\" as *;\n\n.st-list-description {\n  @extend .style-description;\n  padding: 5px 0;\n}\n\na.st-list-item {\n  &,\n  &:hover,\n  &:active,\n  &:visited,\n  &:link {\n    color: inherit;\n    text-decoration: inherit;\n  }\n}\n\nbutton.st-list-item {\n  text-align: inherit;\n}\n\n.st-list-item {\n    --custom-st-horizontal-padding: max(15px, var(--st-horizontal-padding, 15px));\n    --added-st-horizontal-padding: calc(var(--custom-st-horizontal-padding) - var(--st-horizontal-padding, 15px));\n    padding-left: var(--st-horizontal-padding, 15px);\n    padding-right: 0;\n    padding-right: var(--st-horizontal-padding, 15px);\n    margin: 0;\n    display: flex !important;\n    flex-direction: row;\n    align-items: stretch;\n    width: 100%; // fix for buttons\n    box-sizing: border-box;\n    contain: style paint;\n\n    @extend .style-normal;\n\n    &.selected {\n        color: $color-primary;\n    }\n\n    > .left {\n        flex-shrink: 0;\n\n        padding-top: var(--st-list-padding-top, var(--st-list-padding, 15px));\n        padding-right: 15px;\n        padding-bottom: var(--st-list-padding-bottom, var(--st-list-padding, 15px));\n        min-width: 0; // flexbox disable becoming bigger than parent\n\n        &:empty {\n            display: none;\n        }\n    }\n\n    &.left-center {\n        > .left {\n            display: flex;\n            flex-direction: row;\n            align-items: center;\n        }\n    }\n\n    &.right-small {\n        > .main > div > .right {\n            @extend .style-description-small;\n            text-align: right;\n            padding-left: 10px;\n        }\n    }\n\n    &.right-description {\n        > .main > div > .right {\n            @extend .style-description;\n            text-align: right;\n            flex-shrink: 10;\n            padding-left: 15px;\n        }\n    }\n\n    &.right-price {\n        > .main > div > .right {\n            @extend .style-description;\n            text-align: right;\n            flex-shrink: 0;\n            padding-left: 15px;\n        }\n    }\n\n    &.right-description.wrap {\n        > .main > div > .right {\n            white-space: pre-wrap;\n        }\n    }\n\n    &.right-stack {\n        .right {\n            display: flex;\n            flex-direction: row;\n            align-items: center;\n            > * {\n                margin: 0 5px;\n\n                &:last-child {\n                margin-right: 0;\n                }\n\n                &:first-child {\n                margin-left: 0;\n                }\n            }\n\n            > .button {\n                margin: -5px 5px;\n\n                &:last-child {\n                margin-right: 0;\n                }\n\n                &:first-child {\n                margin-left: 0;\n                }\n            }\n        }\n\n        &.no-margin {\n            .right {\n                > * {\n                margin: 0;\n                }\n\n                > .button {\n                margin: -5px 0;\n                }\n            }\n        }\n    }\n\n    &.no-padding {\n        > .main > div > .middle {\n            padding: 0 !important;\n        }\n\n        > .main > div > .right {\n            padding: 0 !important;\n        }\n    }\n\n    > .main {\n        flex-grow: 1;\n\n        // Make sure the hr drops to the bottom if the left is longer\n        display: flex;\n        flex-direction: column;\n        justify-content: space-between;\n        min-width: 0; // flexbox disable becoming bigger than parent\n\n        > div {\n            display: flex;\n            flex-direction: row;\n            align-items: center;\n            flex-grow: 1;\n\n            > .middle {\n                padding-top: var(--st-list-padding-top, var(--st-list-padding, 15px));\n                padding-bottom: var(--st-list-padding-bottom, var(--st-list-padding, 15px));\n                flex-grow: 1;\n                min-width: 0; // flexbox disable becoming bigger than parent\n            }\n\n            > .right {\n                margin-left: auto;\n                min-width: 0; // flexbox disable becoming bigger than parent\n                flex-shrink: 0;\n\n                padding-top: var(--st-list-padding-top, var(--st-list-padding, 15px));\n                padding-bottom: var(--st-list-padding-bottom, var(--st-list-padding, 15px));\n                padding-left: 15px;\n\n                &:empty {\n                display: none;\n                }\n            }\n        }\n\n        > hr {\n            border: 0;\n            outline: 0;\n            height: $border-width-thin;\n            width: 100%;\n            background: $color-border;\n            border-radius: $border-width-thin/2;\n            margin: 0;\n            margin-right: calc(-1 * var(--custom-st-horizontal-padding, 15px));\n            z-index: -2;\n\n            // Increase width + horizontal padding\n            padding-right: var(--custom-st-horizontal-padding, 15px);\n        }\n    }\n\n    // Wrap on smartphones (because content is too long)\n    &.smartphone-wrap {\n        @media (max-width: 450px) {\n            > .main > div {\n                display: block;\n\n                > .middle {\n                padding-right: var(--custom-st-horizontal-padding, 15px);\n                padding-bottom: 0px;\n                }\n\n                > .right {\n                padding-top: 5px;\n                padding-bottom: 15px;\n                }\n            }\n        }\n    }\n\n    &.smartphone-wrap-left {\n        @media (max-width: 450px) {\n            display: block !important;\n\n            > .left {\n                padding-top: var(--st-list-padding, 15px);\n                padding-right: 0;\n                padding-bottom: 0;\n            }\n        }\n    }\n\n    &.full-border {\n        position: relative;\n\n        > .main > hr {\n            position: absolute;\n            left: 0;\n            right: 0;\n            bottom: 0;\n        }\n    }\n\n    &:last-child,\n    &.no-border {\n        > .main > hr {\n            display: none;\n        }\n    }\n\n    &.disabled {\n        opacity: 0.5;\n    }\n\n    &.selectable:not(.is-dragging) {\n        touch-action: manipulation;\n        user-select: none;\n        -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n        cursor: pointer;\n        overflow: visible;\n        position: relative;\n        contain: style;\n\n        &:after {\n            // This is the hover layer\n            content: '';\n            position: absolute;\n            top: -1px;\n            left: calc(-1 * var(--added-st-horizontal-padding, 0px));\n            right: calc(-1 * var(--added-st-horizontal-padding, 0px));\n            bottom: 1px;\n            background: $color-primary-lighter;\n            z-index: -3;\n            opacity: 0;\n            pointer-events: none;\n            border-radius: min($border-radius, var(--added-st-horizontal-padding, 0px));\n\n            transition: opacity 0.1s;\n        }\n\n        &:before {\n            // This is the click layer\n            content: '';\n            position: absolute;\n            top: -2px;\n            left: calc(-1 * var(--added-st-horizontal-padding, 0px));\n            right: calc(-1 * var(--added-st-horizontal-padding, 0px));\n            bottom: -2px;\n            background: $color-primary-light;\n            z-index: -1;\n            opacity: 0;\n            pointer-events: none;\n            border-radius: min($border-radius, var(--added-st-horizontal-padding, 0px));\n\n            // Slow fade out\n            transition: opacity 0.4s 0.1s;\n        }\n\n        &.hoverable:hover {\n            &:after {\n                opacity: 1;\n                transition: none;\n            }\n\n            &:has(button:hover), &:has(select:hover), &:has(textarea:hover), &:has(input:not([type=radio]):not([type=checkbox]):hover), &:has(label:hover), &:has(.input:hover) {\n                // Skip hover\n                &:after {\n                    opacity: 0;\n                }\n            }\n        }\n\n        &:active, &.hoverable:active {\n            &:before {\n                opacity: 1;\n                transition: none;\n            }\n\n            &:has(button:active), &:has(select:active), &:has(label:active), &:has(textarea:active), &:has(input:not([type=radio]):not([type=checkbox]):active), &:has(.input:active) {\n                &:before {\n                    opacity: 0;\n                }\n            }\n        }\n    }\n\n    &.sortable-chosen {\n        transition: none;\n        background: $color-background-shade;\n        background: var(--color-current-background-shade, $color-background-shade);\n    }\n\n    &.sortable-chosen.is-dragging {\n        touch-action: manipulation;\n        user-select: none;\n        transition: background-color 0.2s 0.1s;\n        -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n        cursor: pointer;\n\n        transition: none;\n        background: none;\n    }\n}\n</style>\n","<template>\n    <button class=\"button navigation\" type=\"button\">\n        <span class=\"icon arrow-back\" />\n        <span class=\"hide-android\">\n            <slot>Terug</slot>\n        </span>\n    </button>\n</template>\n","<template>\n    <header class=\"st-navigation-bar-container\">\n        <div v-if=\"!hasLeft && !hasRight && !popup\" class=\"st-navigation-bar-background\" :class=\"{ scrolled, large }\">\n            <InheritComponent name=\"tabbar-replacement\" />\n        </div>\n        <div class=\"st-navigation-bar\" :class=\"{ scrolled, large, 'show-title': showTitle}\" :style=\"{'grid-template-columns': templateColumns}\">\n            <div v-if=\"hasLeft || hasRight\" class=\"left\">\n                <BackButton v-if=\"canPop && !disablePop\" @click=\"pop()\" />\n                <button v-else-if=\"canDismiss && !disableDismiss && $isAndroid\" class=\"button navigation icon close\" type=\"button\" @click=\"dismiss()\" />\n                <slot name=\"left\" />\n            </div>\n\n            <slot v-if=\"hasMiddle\" name=\"middle\">\n                <h1>\n                    {{ title }}\n                </h1>\n            </slot>\n\n            <div v-if=\"hasRight || hasRight\" class=\"right\">\n                <slot name=\"right\" />\n                <button v-if=\"canDismiss && !disableDismiss && $isIOS\" class=\"button navigation\" type=\"button\" @click=\"dismiss()\">\n                    Sluiten\n                </button>\n                <button v-else-if=\"canDismiss && !disableDismiss && !$isAndroid\" class=\"button navigation icon close\" type=\"button\" @click=\"dismiss()\" />\n            </div>\n        </div>\n    </header>\n</template>\n\n<script lang=\"ts\">\nimport { NavigationMixin } from \"@simonbackx/vue-app-navigation\";\nimport { Component, Mixins, Prop } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport InheritComponent from \"../containers/InheritComponent.vue\";\nimport BackButton from \"./BackButton.vue\";\n\n@Component({\n    components: {\n        BackButton,\n        InheritComponent\n    }\n})\nexport default class STNavigationBar extends Mixins(NavigationMixin) {\n    @Prop({ default: \"\", type: String })\n        title!: string;\n\n    @Prop({ default: true, type: Boolean })\n        addShadow!: boolean;\n\n    /**\n     * Also show the title when not scrolled\n     */\n    @Prop({ default: false, type: Boolean })\n        showTitle!: boolean;\n\n    @Prop({ default: false, type: Boolean })\n        large!: boolean;\n\n    @Prop({ default: false, type: Boolean })\n        disableDismiss!: boolean;\n\n    @Prop({ default: false, type: Boolean })\n        disablePop!: boolean;\n\n    @Prop({ default: false, type: Boolean })\n        leftLogo!: boolean;\n\n    scrolled = false;\n    scrollElement!: HTMLElement | null;\n\n    get hasLeft() {\n        return (this.canPop  && !this.disablePop) || (this.canDismiss && !this.disableDismiss && (this as any).$isAndroid) || !!this.$slots['left']\n    }\n\n    get hasRight() {\n        return ((this.canDismiss  && !this.disableDismiss) && !(this as any).$isAndroid) || !!this.$slots['right']\n    }\n\n    get hasMiddle() {\n        return !!this.$slots['middle'] || this.title.length > 0\n    }\n\n    get templateColumns() {\n        if (this.hasMiddle && (this.hasLeft || this.hasRight)) {\n            if ((this as any).$isAndroid) {\n                return \"auto 1fr auto\"\n            }\n            return \"1fr auto 1fr\"\n        }\n\n        if (!this.hasMiddle) {\n            if (this.leftLogo) {\n                return \"1fr auto\"\n            }\n            return \"auto 1fr\"\n        }\n\n        return \"1fr\"\n    }\n\n\n    getScrollElement(element: HTMLElement | null = null): HTMLElement {\n        return this.$el.nextElementSibling as HTMLElement;\n    }\n\n    addListener() {\n        if (this.scrollElement) {\n            return;\n        }\n        this.scrollElement = this.getScrollElement();\n        \n        if (!this.scrollElement) {\n            console.error(\"No scroll element found for STNavigationBar\");\n            return;\n        }\n        \n        if (this.scrollElement === document.documentElement) {\n            window.addEventListener(\"scroll\", this.onScroll, { passive: true });\n        } else {\n            this.scrollElement.addEventListener(\"scroll\", this.onScroll, { passive: true });\n        }\n    }\n\n    mounted() {\n        if (this.title) {\n            this.$url.setTitle(this.title);\n        }\n\n        // fix for element not yet in dom\n        this.addListener();\n        this.onScroll();\n    }\n\n    activated() {\n        if (this.title) {\n            this.$url.setTitle(this.title);\n        }\n\n        // fix for element not yet in dom\n        this.addListener();\n        this.onScroll();\n    }\n\n    deactivated() {\n        if (!this.scrollElement) {\n            return;\n        }\n        if (this.scrollElement === document.documentElement) {\n            window.removeEventListener(\"scroll\", this.onScroll);\n        } else {\n            this.scrollElement.removeEventListener(\"scroll\", this.onScroll);\n        }\n        this.scrollElement = null;\n    }\n\n    onScroll() {\n        if (!this.scrollElement) {\n            return;\n        }\n        const scroll = this.scrollElement!.scrollTop;\n        if (scroll > 20) {\n            this.scrolled = true;\n        } else if (scroll < 15) {\n            this.scrolled = false;\n        }\n    }\n}\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use '@stamhoofd/scss/layout/split-inputs.scss';\n@use '@stamhoofd/scss/base/text-styles.scss';\n\n.st-navigation-bar-container {\n    position: relative;\n\n    &.transparent {\n        > .st-navigation-bar {\n            background: transparent;\n        }\n    }\n}\n\n.st-navigation-bar-background {\n    position: absolute;\n    display: grid;\n    padding: var(--st-safe-area-top, 0px) var(--navigation-bar-horizontal-padding, var(--st-horizontal-padding, 40px)) 0 var(--navigation-bar-horizontal-padding, var(--st-horizontal-padding, 40px));\n    box-sizing: border-box;\n    width: 100%;\n    height: 56px;\n    opacity: 1;\n    transition: opacity 0.2s;\n    z-index: 1;\n\n    @media (min-width: 550px) {\n        height: 55px;\n    }\n\n    &.large {\n        height: 80px;\n    }\n\n    body.native-iOS & {\n        height: 42px; // 44px - 2 x border width thin\n    }\n\n    &.scrolled {\n        opacity: 0;\n        pointer-events: none;\n    }\n}\n\n.st-navigation-bar {\n    margin: 0;\n    padding: var(--st-safe-area-top, 0px) var(--navigation-bar-horizontal-padding, var(--st-horizontal-padding, 40px)) 0 var(--navigation-bar-horizontal-padding, var(--st-horizontal-padding, 40px));\n\n    height: 56px;\n    word-break: normal;\n\n    @media (min-width: 550px) {\n        padding-top: max(var(--st-safe-area-top, 0px), 5px);\n        height: 55px;\n    }\n\n    body.native-iOS & {\n        height: 42px; // 44px - 2 x border width thin\n    }\n\n    &.large {\n        height: 80px;\n        //margin-top: calc(-1 * var(--st-vertical-padding, 20px) - var(--st-safe-area-top, 0px));\n        margin-bottom: 0px;\n        padding: var(--st-safe-area-top, 0px) 20px 0 20px;\n\n        @media (max-width: 450px) {\n            padding: var(--st-safe-area-top, 0px) 15px 0 15px;\n        }\n    }\n    -webkit-app-region: drag;\n\n    display: grid;\n    grid-template-columns: 1fr auto 1fr;\n    align-items: center;\n    background: $color-background;\n    background: var(--color-current-background, white);\n    transition: background-color 0.3s, border-color 0.3s;\n    z-index: 200;\n\n    > div {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n\n        &.left{\n            padding-right: 15px;\n\n            &:empty, &.empty {\n                min-width: 0;\n                + h1 {\n                    margin-left: -10px;\n                }\n                padding-right: 0px;;\n            }\n            \n            display: flex;\n            flex-direction: row;\n\n            align-items: center;\n            justify-content: flex-start;\n\n            > .button, > .loading-button {\n                margin-left: 10px;\n                margin-right: 10px;\n\n                &:first-child {\n                    margin-left: 0;\n                }\n\n                &:last-child {\n                    margin-right: 0;\n                }\n            }\n        }\n\n        &.right {\n            padding-left: 15px;\n            &:empty, &.empty {\n                min-width: 0;\n                padding-left: 0px;;\n            }\n\n            justify-content: flex-end;\n\n            display: flex;\n            flex-direction: row;\n\n            align-items: center;\n            justify-content: flex-end;\n\n            > .button, > .loading-button {\n                margin-left: 10px;\n                margin-right: 10px;\n\n                &:first-child {\n                    margin-left: 0;\n                }\n\n                &:last-child {\n                    margin-right: 0;\n                }\n            }\n        }\n    }\n\n    &.wrap {\n        height: auto;\n\n        > div {\n            &:last-child {\n                flex-wrap: wrap;\n                margin: -5px -10px;\n\n                > * {\n                    margin: 5px 10px;\n                }\n            }\n        }\n    }\n\n    > h1 {\n        min-width: 0;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        opacity: 0;\n        transition: opacity 0.2s;\n        @extend .style-title-small;\n\n        text-align: center;\n\n        body.web-android &, body.native-android & {\n            text-align: left;\n        }\n    }\n\n    body.web-android &, body.native-android & {\n        // Increase title size a bit\n        > h1 {\n            font-size: 19px;\n        }\n    }\n\n    body.web-iOS &, body.native-iOS & {\n        // Increase title size a bit\n        > h1 {\n            font-size: 17px;\n        }\n    }\n\n\n    &.show-title {\n        > h1 {\n            opacity: 1;\n        }\n    }\n\n    border-bottom: $border-width-thin solid transparent;\n\n    // also one at the top to fix centering\n    border-top: $border-width-thin solid transparent;\n\n    &.scrolled {\n        background: $color-background-shade;\n\n        //box-shadow: 0px 2px 3px $color-shadow;\n        border-bottom-color: $color-border-shade;\n\n        &.large, body.native-android &, body.web-android & {\n            box-shadow: 0px 2px 5px $color-shadow;\n            border-bottom-color: transparent;\n        }\n  \n        > h1 {\n            opacity: 1;\n        }\n    }\n    \n    // Other helper styles (need to revalidate)\n    .input {\n        width: 220px;\n        display: inline-block;\n        flex-shrink: 10000000;\n\n        @media (max-width: 500px) {\n            width: 100%;\n            min-width: 150px;\n        }\n    }\n\n    select.input {\n        width: auto;\n    }\n}\n</style>\n","import { ComponentWithProperties } from '@simonbackx/vue-app-navigation';\nimport { ComponentPublicInstance, markRaw, Ref, unref } from 'vue';\n\nexport class TabBarItem {\n    name: string | Ref<string> = '';\n    icon = '';\n    badge: string | Ref<string> | null = '';\n    component?: ComponentWithProperties;\n    action?: (this: ComponentPublicInstance) => Promise<void> | void;\n    savedScrollPositions: WeakMap<HTMLElement, number> = new WeakMap();\n\n    constructor(options: { name: string | Ref<string>; icon: string; badge?: string | Ref<string> | null; component?: ComponentWithProperties; action?: (this: ComponentPublicInstance) => Promise<void> | void }) {\n        this.name = options.name;\n        this.icon = options.icon;\n        this.component = options.component;\n        this.badge = options.badge ?? '';\n        this.action = options.action;\n\n        // Not reactive because we need === operator to know what the active tab is\n        markRaw(this);\n    }\n\n    get isGroup() {\n        return false;\n    }\n\n    /**\n     * Helper to treat groups and items the same\n     */\n    get items() {\n        return [this];\n    }\n\n    isSelected(selectedItem: TabBarItem | Ref<TabBarItem> | null) {\n        if (unref(selectedItem) === this) {\n            return true;\n        }\n        return false;\n    }\n}\n\nexport class TabBarItemGroup {\n    name = '';\n    icon = '';\n    badge: string | Ref<string> | null = '';\n    items: TabBarItem[] = [];\n\n    constructor(options: { name: string; icon: string; items: TabBarItem[] }) {\n        this.name = options.name;\n        this.icon = options.icon;\n        this.items = options.items;\n\n        // Not reactive because we need === operator to know what the active tab is\n        markRaw(this);\n    }\n\n    get isGroup() {\n        return true;\n    }\n\n    isSelected(selectedItem: TabBarItem | Ref<TabBarItem> | null) {\n        return this.items.some(item => item.isSelected(selectedItem));\n    }\n}\n","<template>\n    <nav class=\"st-view\">\n        <STNavigationBar v-if=\"!popup\" :title=\"group.name\" />\n\n        <main ref=\"box\">\n            <h1 v-if=\"!popup\">\n                {{ group.name }}\n            </h1>\n            <STList>\n                <STListItem v-for=\"(item, index) in group.items\" :key=\"index\" :selectable=\"true\" element-name=\"button\" class=\"left-center\" :class=\"{ selected: item.isSelected(selectedItem) }\" @click=\"selectTab(item)\">\n                    <template #left>\n                        <span :class=\"'icon '+item.icon\" />\n                    </template>\n                    <span>{{ item.name }}</span>\n                    <template #right>\n                        <span v-if=\"unref(item.badge)\" class=\"style-bubble\">{{ unref(item.badge) }}</span>\n                        <span v-if=\"item.isGroup\" class=\"icon arrow-down-small gray\" />\n                    </template>\n                </STListItem>\n            </STList>\n        </main>\n    </nav>\n</template>\n\n<script setup lang=\"ts\">\nimport { defineRoutes, useDismiss, useNavigate, usePopup, useShow } from '@simonbackx/vue-app-navigation';\nimport { Formatter } from '@stamhoofd/utility';\nimport { ComponentPublicInstance, computed, getCurrentInstance, ref, unref } from 'vue';\n\nimport { TabBarItem, TabBarItemGroup } from './TabBarItem';\n\nconst props = defineProps<{\n    group: TabBarItemGroup,\n    selectedItem: TabBarItem|null,\n    selectItem: (item: TabBarItem) => void,\n}>()\ntype TabBarItemWithComponent = TabBarItem & Required<Pick<TabBarItem, 'component'>>;\nconst flatTabs = computed<TabBarItemWithComponent[]>(() => props.group.items.flatMap(t => t.items as TabBarItemWithComponent[]).filter(t => !!t.component))\n\nconst dismiss = useDismiss()\nconst box = ref<HTMLElement|null>(null);\nconst popup = usePopup()\nconst $navigate = useNavigate()\nconst show = useShow()\nconst instance = getCurrentInstance()\n\ndefineRoutes(flatTabs.value.map(tab => {\n    return {\n        name: tab.name,\n        url: Formatter.slug(tab.name),\n        handler: async (options) => {\n            if (options.checkRoutes) {\n                tab.component.setCheckRoutes()\n            }\n            await show({\n                ...(options as any),\n                components: [tab.component]\n            })\n        }\n    }\n}))\n\nconst selectTab = async (item: TabBarItem) => {\n    if (item.action) {\n        await item.action.call(instance!.proxy as ComponentPublicInstance)\n        return;\n    }\n    if (!unref(popup)) {\n        await $navigate(item.name);\n        return;\n    }\n    await dismiss({force: true})\n    props.selectItem(item)\n}\n</script>\n","<template>\n    <div class=\"tab-bar-controller\">\n        <header v-if=\"showTopBar\">\n            <div class=\"left\">\n                <InheritComponent name=\"tabbar-left\" />\n            </div>\n            <div class=\"middle\">\n                <template v-if=\"tabs.length > 1\">\n                    <button v-for=\"(item, index) in tabs\" :key=\"index\" class=\"button item\" :class=\"{ selected: item.isSelected(selectedItem) }\" type=\"button\" @click=\"(event) => selectTab(event, item)\">\n                        <div class=\"button text\" :class=\"{ selected: item.isSelected(selectedItem) }\">\n                            <span :class=\"'icon '+item.icon\" />\n                            <span>{{ item.name }}</span>\n                            <span v-if=\"unref(item.badge)\" class=\"bubble\">{{ unref(item.badge) }}</span>\n                            <span v-if=\"item.isGroup\" class=\"icon arrow-down-small gray\" />\n                        </div>\n                    </button>\n                </template>\n            </div>\n            <div class=\"right\">\n                <InheritComponent name=\"tabbar-right\" />\n            </div>\n        </header>\n        <main ref=\"mainElement\" :class=\"{showTopBar, showBottomBar, shouldHideBottomBar: showBottomBar && shouldHideBottomBar}\">\n            <FramedComponent v-if=\"root\" :key=\"root.key\" :root=\"root\" />\n        </main>\n\n        <footer v-if=\"showBottomBar\" :class=\"{hidden: shouldHideBottomBar}\">\n            <button v-for=\"(item, index) in tabs\" :key=\"index\" class=\"button item\" :class=\"{ selected: item.isSelected(selectedItem) }\" type=\"button\" @click=\"(event) => selectTab(event, item)\">\n                <div class=\"button text small column\" :class=\"{ selected: item.isSelected(selectedItem) }\">\n                    <span :class=\"'icon '+item.icon\" />\n                    <span>\n                        {{ item.name }}\n                    </span>\n                    <span v-if=\"unref(item.badge)\" class=\"bubble\">{{ unref(item.badge) }}</span>\n                </div>\n            </button>\n        </footer>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { inject, shallowRef } from 'vue';\n\nimport { GlobalEventBus } from '../EventBus';\nimport { useDeviceWidth } from '../hooks';\nimport TabBarController from './TabBarController.vue';\nimport TabBarDropdownView from './TabBarDropdownView.vue';\n\nexport function useTabBarController(): Ref<InstanceType<typeof TabBarController>> {\n    const c = inject('reactive_tabBarController') as InstanceType<typeof TabBarController> | Ref<InstanceType<typeof TabBarController>>;\n    return shallowRef(c);\n}\n\nexport function useHideTabBar() {\n    const reference = {}; // new object reference\n    const injector = inject<any>('reactive_hide_tab_bar', null);\n\n    const register = () => {\n        const unwrapped = unref(injector);\n        if (unwrapped && unwrapped.register) {\n            unwrapped.register(reference);\n        }\n    };\n\n    const unregister = () => {\n        const unwrapped = unref(injector);\n        if (unwrapped && unwrapped.unregister) {\n            unwrapped.unregister(reference);\n        }\n    };\n\n    onMounted(register);\n    onActivated(register);\n    onDeactivated(unregister);\n    onBeforeUnmount(unregister);\n}\n\n</script>\n\n<script setup lang=\"ts\">\nimport { ComponentWithProperties, defineRoutes, FramedComponent, HistoryManager, NavigationController, PushOptions, usePresent, useUrl } from '@simonbackx/vue-app-navigation';\nimport { Formatter } from '@stamhoofd/utility';\nimport { ComponentPublicInstance, computed, getCurrentInstance, nextTick, onActivated, onBeforeUnmount, onDeactivated, onMounted, provide, Ref, ref, unref } from 'vue';\n\nimport InheritComponent from './InheritComponent.vue';\nimport { TabBarItem, TabBarItemGroup } from './TabBarItem';\n\nconst props = defineProps<{\n    tabs: ((TabBarItem | TabBarItemGroup)[]) | Ref<(TabBarItem | TabBarItemGroup)[]>;\n}>();\n\ndefineOptions({\n    name: 'TabBarController',\n});\n\ntype TabBarItemWithComponent = TabBarItem & Required<Pick<TabBarItem, 'component'>>;\nconst tabs = computed(() => {\n    const base = unref(props.tabs);\n\n    if (!showTopBar.value) {\n        // Replace groups with tabs\n        return base.flatMap((t) => {\n            if (t instanceof TabBarItemGroup) {\n                return [\n                    new TabBarItem({\n                        ...t,\n                        component: new ComponentWithProperties(NavigationController, {\n                            root: new ComponentWithProperties(TabBarDropdownView, {\n                                group: t,\n                                selectedItem: selectedItem,\n                                selectItem: selectItem,\n                            }),\n                        }),\n                    }),\n                ];\n            }\n            return [t];\n        });\n    }\n\n    return base;\n});\n\nconst flatTabs = computed<TabBarItemWithComponent[]>(() => unref(props.tabs).flatMap(t => t.items as TabBarItemWithComponent[]).filter(t => !!t.component));\nconst injectedComponents = inject('reactive_components') as Ref<Record<string, ComponentWithProperties> | undefined> | undefined;\nconst deviceWidth = useDeviceWidth();\nconst showTopBar = computed(() => deviceWidth.value > 1100);\nconst showBottomBar = computed(() => !showTopBar.value && tabs.value.length > 1);\n\nconst hieBottomBarRequesters = ref(new Set());\nconst shouldHideBottomBar = computed(() => {\n    return hieBottomBarRequesters.value.size > 0;\n});\n\nprovide('reactive_hide_tab_bar', {\n    register: (reference: any) => {\n        console.log('register');\n        hieBottomBarRequesters.value.add(reference);\n    },\n    unregister: (reference: any) => {\n        console.log('unregister');\n        hieBottomBarRequesters.value.delete(reference);\n    },\n});\n\nprovide('reactive_components', computed(() => {\n    if (!showTopBar.value) {\n        return unref(injectedComponents) ?? {};\n    }\n    // All displayed\n    return {\n        ...(unref(injectedComponents) ?? {}),\n        'tabbar-replacement': null,\n    };\n}));\n\nconst selectedItem: Ref<TabBarItem | null> = ref(null) as any as Ref<TabBarItem | null>; // TypeScript is unpacking the TabBarItem to {...} for some reason\n\n// Root is stored separately because we can also navigate to non-tabs\nconst root: Ref<ComponentWithProperties | null> = ref(null) as any as Ref<ComponentWithProperties | null>;\n\nconst mainElement = ref<HTMLElement | null>(null);\nconst urlHelpers = useUrl();\nconst present = usePresent();\n\ndefineRoutes(flatTabs.value.map((tab) => {\n    const name = unref(tab.name);\n    return {\n        name,\n        url: Formatter.slug(name),\n        isDefault: {\n            properties: {},\n        },\n        handler: async (options) => {\n            if (options.checkRoutes) {\n                tab.component.setCheckRoutes();\n            }\n            await selectItem(tab, options.adjustHistory);\n        },\n    };\n}));\n\nconst instance = getCurrentInstance();\nprovide('reactive_tabBarController', instance?.proxy); // Sadly the proxy does not include exposed properties - ComponentWithProperties has a workaround at getExposeProxy\n\nconst getInternalScrollElements = () => {\n    return (mainElement.value?.querySelectorAll('.st-view > main') ?? []) as NodeListOf<HTMLElement>;\n};\n\nconst saveCurrentItemState = () => {\n    const old = selectedItem.value;\n    if (old && old.component) {\n        // Keep current item alive\n        old.component.keepAlive = true;\n\n        // Save scroll position\n        const scrollElements = getInternalScrollElements();\n\n        // Clear already saved items\n        old.savedScrollPositions = new WeakMap();\n\n        for (const element of scrollElements) {\n            old.savedScrollPositions.set(element, element.scrollTop);\n        }\n    }\n};\n\nconst shouldNavigateAway = async () => {\n    const old = root.value;\n    if (old) {\n        return await old.shouldNavigateAway();\n    }\n    return true;\n};\n\nasync function selectItem(item: TabBarItem, appendHistory: boolean = true) {\n    if (item === selectedItem.value) {\n        // Try to scroll this item to the top\n        if (mainElement.value) {\n            const scrollElement = mainElement.value.querySelector('.st-view > main');\n            if (scrollElement) {\n                if (scrollElement.scrollTop !== 0) {\n                    // Scroll to top animated\n                    scrollElement.scrollTo({\n                        top: 0,\n                        behavior: 'smooth',\n                    });\n                }\n                else {\n                    // todo: try to pop\n                }\n            }\n        }\n        return;\n    }\n\n    if (!await shouldNavigateAway()) {\n        return;\n    }\n\n    if (!item.component) {\n        if (item.action) {\n            await item.action.call(instance!.proxy as ComponentPublicInstance);\n        }\n        return;\n    }\n\n    saveCurrentItemState();\n    const old = selectedItem.value;\n\n    // Set url namespace of the tab\n    const tabUrl = Formatter.slug(unref(item.name));\n    item.component.provide.reactive_navigation_url = computed(() => urlHelpers.extendUrl(tabUrl));\n\n    if (appendHistory) {\n        HistoryManager.pushState(undefined, old\n            ? async () => {\n                await selectItem(old, false);\n            }\n            : null, { adjustHistory: true });\n\n        item.component.assignHistoryIndex();\n    }\n    else {\n        item.component.returnToHistoryIndex();\n    }\n\n    // Switch\n    selectedItem.value = item;\n    root.value = item.component;\n\n    const positions = item.savedScrollPositions;\n    await nextTick();\n\n    const newScrollElements = getInternalScrollElements();\n\n    // Restore scroll position\n    // Let the OS rerender once so all the positions are okay after dom insertion\n\n    for (const element of newScrollElements) {\n        const position = positions.get(element);\n        if (!position) {\n            continue;\n        }\n        element.scrollTop = position;\n    }\n}\n\nconst selectTab = async (event: MouseEvent, tab: TabBarItem | TabBarItemGroup) => {\n    if (tab instanceof TabBarItem) {\n        return selectItem(tab);\n    }\n\n    if (!showTopBar.value) {\n        // Treat as a normal tab\n        return;\n    }\n\n    const padding = 15;\n    let width = 400;\n    const button = event.currentTarget as HTMLElement;\n    const bounds = button.getBoundingClientRect();\n    const win = window,\n        doc = document,\n        docElem = doc.documentElement,\n        body = doc.getElementsByTagName('body')[0],\n        clientWidth = win.innerWidth || docElem.clientWidth || body.clientWidth;\n\n    let left = bounds.left - padding;\n\n    if (left + width > clientWidth + padding) {\n        left = clientWidth - padding - width;\n\n        if (left < padding) {\n            left = padding;\n            width = clientWidth - padding * 2;\n        }\n    }\n\n    // Open dropdown menu\n    await present({\n        components: [\n            new ComponentWithProperties(NavigationController, {\n                root: new ComponentWithProperties(TabBarDropdownView, {\n                    group: tab,\n                    selectedItem: selectedItem,\n                    selectItem: selectItem,\n                }),\n            }, {\n                provide: {\n                    reactive_navigation_disable_url: true,\n                },\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n        modalClass: 'positionable-sheet',\n        modalCssStyle: '--sheet-position-left: ' + left.toFixed(1) + 'px; --sheet-position-top: 65px; --sheet-vertical-padding: 15px; --st-popup-width: ' + width.toFixed(1) + 'px; ',\n    });\n};\n\nconst selectTabByName = async (name: string) => {\n    const item = flatTabs.value.find(tab => Formatter.slug(unref(tab.name)) === Formatter.slug(name));\n    if (item) {\n        await selectItem(item);\n    }\n};\n\nconst show = async (options: PushOptions) => {\n    if (options.components.length > 1) {\n        throw new Error('Impossible to show more than 1 component from a direct child of the TabBarController');\n    }\n    if (!await shouldNavigateAway()) {\n        return;\n    }\n    const component = options.components[0];\n\n    const foundItem = flatTabs.value.find(tab => tab.component === component);\n    if (foundItem) {\n        return selectItem(foundItem);\n    }\n\n    if (!component || component === root.value) {\n        return;\n    }\n\n    saveCurrentItemState();\n\n    const old = selectedItem.value;\n    HistoryManager.pushState(undefined, old\n        ? async () => {\n            await selectItem(old, false);\n        }\n        : null, {\n        adjustHistory: options?.adjustHistory ?? true,\n        invalid: options?.invalidHistory ?? false,\n    });\n    component.assignHistoryIndex();\n\n    // Switch\n    selectedItem.value = null;\n    root.value = component;\n\n    // Wait for mount\n    await nextTick();\n};\nprovide('reactive_navigation_show', show);\n\nonMounted(() => {\n    GlobalEventBus.addListener(this, 'selectTabByName', selectTabByName);\n});\n\nonBeforeUnmount(() => {\n    GlobalEventBus.removeListener(this);\n\n    // Prevent memory issues by removing all references and destroying kept alive components\n    for (const { component } of flatTabs.value) {\n        // Destroy them one by one\n        if (component.isKeptAlive && component.vnode) {\n            component.destroy(component.vnode);\n        }\n    }\n});\n\nconst returnToHistoryIndex = () => {\n    return root.value?.returnToHistoryIndex();\n};\n\ndefineExpose({\n    returnToHistoryIndex,\n    show,\n    shouldNavigateAway,\n    selectTabByName,\n});\n\n</script>\n\n<style lang=\"scss\">\n@use '@stamhoofd/scss/base/variables' as *;\n\n.tab-bar-controller {\n    --tab-bar-header-height: 70px;\n    height: calc(var(--vh, 1vh) * 100);\n    max-height: 100vh;\n    max-height: 100dvh;\n    overflow: hidden;\n    overflow: clip; // More modern + disables scrolling\n    --saved-vh: var(--vh, 1vh);\n    --saved-keyboard-height: var(--keyboard-height, 0px);\n    --saved-st-safe-area-bottom: var(--st-safe-area-bottom, 0px);\n    --saved-st-safe-area-top: var(--st-safe-area-top, 0px);\n\n    > header {\n        box-sizing: border-box;\n        height: calc(var(--tab-bar-header-height) + var(--st-safe-area-top, 0px));\n        border-bottom: $border-width-thin solid $color-border;\n        background: $color-background;\n        padding-top: var(--st-safe-area-top, 0px);\n\n        display: grid;\n        grid-template-columns: 1fr auto 1fr;\n        align-items: center;\n\n        > .left {\n            padding-left: 20px;\n        }\n\n        > .right {\n            padding-right: 20px;\n\n            // Align grid items right\n            justify-self: end;\n        }\n\n        > .middle {\n            display: flex;\n            flex-direction: row;\n            gap: 45px;\n            justify-content: center;\n\n            > .item {\n                display: block;\n                height: var(--tab-bar-header-height);\n\n                > div {\n                    height: var(--tab-bar-header-height);\n\n                    display: flex;\n                    text-align: center;\n                    align-items: center;\n                    justify-content: center;\n                }\n            }\n        }\n    }\n\n    > main {\n        // Pass an update to the --vh because we removed some\n        background: var(--color-current-background);\n\n        &.showTopBar {\n            --vh: calc(var(--saved-vh, 1vh) - (var(--tab-bar-header-height) - var(--saved-st-safe-area-top, 0px)) / 100);\n            --st-safe-area-top: 0px; // Handled by header\n        }\n\n        &.showBottomBar {\n            --st-safe-area-bottom: calc(var(--saved-st-safe-area-bottom) + var(--tab-bar-header-height)); // Handled by footer\n\n            &.shouldHideBottomBar {\n                --st-safe-area-bottom: var(--saved-st-safe-area-bottom);\n            }\n        }\n\n        height: calc(var(--vh, 1vh) * 100);\n\n        // No scrolling here allowed. Child components should manage this\n        overflow: hidden;\n        overflow: clip; // More modern + disables scrolling\n    }\n\n    > footer {\n        height: var(--tab-bar-header-height);\n        border-top: $border-width-thin solid $color-border;\n        background: $color-background-shade;\n        background: color-mix(in srgb, $color-background-shade 70%, transparent);\n        padding-bottom: var(--st-safe-area-bottom, 0px);\n        user-select: none;\n\n        backdrop-filter: blur(10px);\n        -webkit-backdrop-filter: blur(10px);\n\n        transition: transform 0.2s, opacity 0.2s;\n\n        position: fixed;\n        left: 0;\n        right: 0;\n        bottom: 0;\n        z-index: 1000;\n\n        display: grid;\n        grid-template-columns: repeat(auto-fit, minmax(0, 1fr));\n\n        > button {\n            min-width: 0;\n            overflow: hidden;\n        }\n\n        &.hidden {\n            opacity: 0;\n            transform: translateY(100%);\n        }\n    }\n}\n\n</style>\n","<template>\n    <div class=\"st-toolbar sticky\">\n        <div>\n            <div>\n                <slot name=\"left\" />\n            </div>\n            <div>\n                <slot name=\"right\" />\n            </div>\n        </div>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useHideTabBar } from '../containers/TabBarController.vue';\n\nuseHideTabBar();\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use '@stamhoofd/scss/base/text-styles.scss';\n\n.st-toolbar {\n    margin: 0;\n    margin-bottom: calc(-1 * var(--st-vertical-padding, 40px));\n    margin-bottom: calc(-1 * var(--st-vertical-padding, 40px) - var(--st-safe-area-bottom, 0px));\n    padding-top: var(--st-vertical-padding, 20px);\n    bottom: 0;\n    overflow: hidden;\n    //pointer-events: none; // fix browser bug not able to click through\n\n    // If embedded inside of a box: add negative margins around\n    .box > & {\n        margin-left: calc(-1 * var(--st-horizontal-padding, 20px));\n        margin-right: calc(-1 * var(--st-horizontal-padding, 20px));\n    }\n\n    > div {\n        padding: 10px var(--st-horizontal-padding, 40px);\n        --default-footer-padding: 10px;\n\n        padding-bottom: calc(var(--st-safe-area-bottom, 0px) + 10px);\n        background: $color-current-background;\n        border-top: $border-width-thin solid $color-border;\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        //pointer-events: all;\n\n        > div:first-child {\n            @extend .style-description;\n            min-width: 0;\n        }\n\n        > div:last-child {\n            flex-shrink: 0;\n            display: flex;\n            flex-direction: row;\n            align-items: stretch;\n            min-width: 0;\n        }\n\n        > div:last-child > .button:not(:first-child), > div:last-child > .loading-button:not(:first-child)  {\n            margin-left: 10px;\n        }\n\n        @media (max-width: 500px) {\n            > div:first-child {\n                display: none;\n            }\n\n            > div:last-child > .button:not(:first-child), > div:last-child > .loading-button:not(:first-child)  {\n                margin-left: 0;\n            }\n\n            > div .button, > div .loading-button {\n                margin-left: 0;\n                margin-right: 0;\n                margin-top: 10px;\n\n                &:first-child {\n                    margin-top: 0;\n                }\n            }\n\n            > div:last-child {\n                flex-basis: 100%;\n                flex-direction: column;\n\n                &> .button {\n                    width: 100%;\n                    box-sizing: border-box;\n                    justify-content: center;\n                }\n            }\n        }\n    }\n}\n</style>\n","<template>\n    <form class=\"st-view\" data-submit-last-field @submit.prevent=\"applyFilter\">\n        <STNavigationBar v-if=\"!popup || canDelete || canPop\" :title=\"capitalizeFirstLetter(filter.name ? filter.name : filter.builder.name)\" :disable-dismiss=\"canPop\">\n            <template v-if=\"canDelete\" #right>\n                <button class=\"button icon trash\" type=\"button\" @click=\"deleteFilter\" />\n            </template>\n        </STNavigationBar>\n\n        <main>\n            <h1 v-if=\"!live\">\n                {{ capitalizeFirstLetter(filter.name ? filter.name : filter.builder.name) }}\n            </h1>\n\n            <FramedComponent :root=\"filterComponent\" />\n        </main>\n\n        <STToolbar v-if=\"!live || !popup\">\n            <template #right>\n                <button class=\"button primary full\" type=\"button\" @click=\"applyFilter\">\n                    Toepassen\n                </button>\n            </template>\n        </STToolbar>\n    </form>\n</template>\n\n<script lang=\"ts\">\nimport { FramedComponent, NavigationMixin } from '@simonbackx/vue-app-navigation';\nimport { Component, Mixins, Prop } from '@simonbackx/vue-app-navigation/classes';\n\nimport Radio from '../inputs/Radio.vue';\nimport STList from '../layout/STList.vue';\nimport STListItem from '../layout/STListItem.vue';\nimport STNavigationBar from '../navigation/STNavigationBar.vue';\nimport STToolbar from '../navigation/STToolbar.vue';\nimport { CenteredMessage } from '../overlays/CenteredMessage';\nimport { UIFilter } from './UIFilter';\n\n@Component({\n    components: {\n        STListItem,\n        STList,\n        Radio,\n        STNavigationBar,\n        STToolbar,\n        FramedComponent,\n    },\n})\nexport default class UIFilterEditor extends Mixins(NavigationMixin) {\n    @Prop({ required: true })\n    filter!: UIFilter;\n\n    @Prop({ required: false })\n    saveHandler!: ((filter: UIFilter) => void) | null;\n\n    @Prop({ required: false, default: null })\n    deleteHandler!: (() => void) | null;\n\n    clonedFilter: UIFilter | null = null;\n    filterComponent: any = null;\n\n    get live() {\n        return !this.saveHandler;\n    }\n\n    created() {\n        if (this.live) {\n            this.clonedFilter = this.filter;\n        }\n        else {\n            this.clonedFilter = this.filter.clone();\n        }\n\n        this.filterComponent = this.clonedFilter.getComponent();\n    }\n\n    applyFilter() {\n        if (!this.saveHandler) {\n            this.pop({ force: true });\n            return;\n        }\n\n        this.saveHandler(this.clonedFilter!);\n\n        this.$nextTick(() => {\n            this.pop({ force: true });\n        });\n    }\n\n    get canDelete() {\n        return !!this.deleteHandler;\n    }\n\n    deleteFilter() {\n        if (!this.deleteHandler) {\n            return;\n        }\n        this.deleteHandler();\n\n        this.$nextTick(() => {\n            this.pop({ force: true });\n        });\n    }\n\n    async shouldNavigateAway() {\n        if (this.live) {\n            return true;\n        }\n\n        const changed = JSON.stringify(this.filter.build()) !== JSON.stringify(this.clonedFilter!.build());\n        if (!changed) {\n            return true;\n        }\n        return await CenteredMessage.confirm('Filter niet opslaan?', 'Niet opslaan');\n    }\n}\n</script>\n","export class Column<T, ValueType> {\n    name: string\n    enabled = true\n    index = 100\n    id: string\n    align?: \"left\" | \"right\" | \"center\"\n    allowSorting = true\n\n    /**\n     * null means: generate width + save it,  based on grow property\n     */\n    width: number | null = null\n\n    /**\n     * renderWidth is floored version of width, to use in CSS\n     */\n    renderWidth: number | null = null\n\n    /**\n     * Minimum width in pixels. Best minimum is 100, because this is needed for sort icon + drag handle + padding\n     */\n    minimumWidth = 100\n\n    recommendedWidth = 100\n\n    /**\n     * When growing, columns with grow = true will only grow (if all other columns have reached the recommended size)\n     */\n    grow = false\n\n    private getValue: (val: T) => ValueType\n    private format: (val: ValueType, width: number) => string\n\n    /**\n     * Implement if you need the full object to compare\n     */\n    private compareObjects: ((a: T, b: T) => number) | null\n\n    /**\n     * Compare values using the return value of getValue\n     * This is more performant because we can use caching\n     */\n    private compare: ((a: ValueType, b: ValueType) => number) | null\n\n    private getStyleForObject: ((val: T, isPrefix: boolean) => string) | null = null\n    private getStyle: ((val: ValueType, isPrefix: boolean) => string) | null = null\n\n    constructor(settings: {\n        name: string, \n        id?: string,\n        index?: number,\n        align?: \"left\" | \"right\" | \"center\",\n        enabled?: boolean,\n        getValue: (val: T) => ValueType, \n        format?: (val: ValueType, width: number) => string, \n        compareObjects?: (a: T, b: T) => number,\n        compare?: (a: ValueType, b: ValueType) => number,\n        getStyle?: (val: ValueType, isPrefix: boolean) => string,\n        getStyleForObject?: (val: T, isPrefix: boolean) => string,\n        grow?: boolean,\n        minimumWidth?: number,\n        recommendedWidth?: number,\n        allowSorting?: boolean\n    }) {\n        this.enabled = settings.enabled ?? true\n        this.index = settings.index ?? 100\n        this.name = settings.name\n        this.id = settings.id ?? settings.name;\n\n        this.getValue = settings.getValue\n        this.format = settings.format ?? (val => val+\"\")\n\n        this.compare = settings.compare ?? null\n        this.compareObjects = settings.compareObjects ?? null\n        this.getStyle = settings.getStyle ?? null\n        this.getStyleForObject = settings.getStyleForObject ?? null\n\n        this.grow = settings?.grow ?? false\n        this.minimumWidth = settings?.minimumWidth ?? 100\n        this.recommendedWidth = settings?.recommendedWidth ?? 100\n        this.align = settings.align\n\n        this.width = this.recommendedWidth\n        this.allowSorting = settings.allowSorting ?? true\n    }\n\n    getFormattedValue(val: T) {\n        return this.format(this.getValue(val), this.renderWidth ?? this.recommendedWidth)\n    }\n\n    doCompare(a: T, b: T): number {\n        if (this.compare) {\n            return this.compare(this.getValue(a), this.getValue(b))\n        } else if (this.compareObjects) {\n            return this.compareObjects(a, b)\n        } else {\n            return 0\n        }\n    }\n\n    getStyleFor(val: T | null, isPrefix = false) {\n        if (val === null) {\n            return \"\"\n        }\n        return this.getStyleForObject ? this.getStyleForObject(val, isPrefix) : this.getStyle ? this.getStyle(this.getValue(val), isPrefix) : \"\"\n    }\n\n    didReachMinimum() {\n        return this.width && this.width <= this.minimumWidth\n    }\n}\n","import { ComponentWithProperties } from '@simonbackx/vue-app-navigation';\n\nimport { LimitedFilteredRequest } from '@stamhoofd/structures';\nimport { fetchAll, FetchAllOptions, ObjectFetcher } from '.';\nimport { Toast } from '../../..';\n\ntype ObjectWithId = { id: string };\n\nexport interface TableActionSelection<T extends ObjectWithId> {\n    /**\n     * If you want to manually use the filter, or query data\n     */\n    filter: LimitedFilteredRequest;\n    fetcher: ObjectFetcher<T>;\n\n    cachedAllValues?: T[];\n\n    // Manually selected rows that are already in memory\n    markedRows: Map<string, T>;\n\n    /**\n     * When true: only the marked rows are selected.\n     * When false: all rows are selected, except the marked rows\n     */\n    markedRowsAreSelected: boolean | null;\n}\n\nexport abstract class TableAction<T extends { id: string }> {\n    name: string;\n    description: string = '';\n    icon: string;\n    tooltip = '';\n    enabled = true;\n    destructive = false;\n\n    /// Determines order\n    priority: number;\n\n    /// For grouping\n    groupIndex: number;\n\n    /**\n     * Whether this table action is on a whole selection.\n     * Set to false if you don't need any selection.\n     * The action will be hidden if we are in selection modus on mobile\n     */\n    needsSelection = true;\n\n    /**\n     * If this action needs a selection, we will not automatically select all items if none is selected, or when selection mode is disabled\n     */\n    allowAutoSelectAll = true;\n\n    singleSelection = false;\n\n    childActions: (TableAction<T>[]) | (() => TableAction<T>[]) = [];\n    childMenu: ComponentWithProperties | null = null;\n\n    get hasChildActions() {\n        if (this.childMenu !== null) {\n            return true;\n        }\n        if (this.childActions instanceof Array) {\n            return this.childActions.length > 0;\n        }\n        else {\n            // function\n            return true;\n        }\n    }\n\n    isDisabled(hasSelection: boolean) {\n        if (!this.allowAutoSelectAll && !hasSelection && this.needsSelection) {\n            return true;\n        }\n        return false;\n    }\n\n    getChildActions(): TableAction<T>[] {\n        if (this.childActions instanceof Array) {\n            return this.childActions;\n        }\n        else {\n            return this.childActions();\n        }\n    }\n\n    constructor(settings: Partial<TableAction<T>>) {\n        this.name = settings.name ?? '';\n        this.description = settings.description ?? '';\n        this.icon = settings.icon ?? '';\n        this.priority = settings.priority ?? 0;\n        this.groupIndex = settings.groupIndex ?? 0;\n        this.needsSelection = settings.needsSelection ?? true;\n        this.singleSelection = settings.singleSelection ?? false;\n        this.tooltip = settings.tooltip ?? this.name;\n        this.enabled = settings.enabled ?? true;\n        this.allowAutoSelectAll = settings.allowAutoSelectAll ?? true;\n        this.childActions = settings.childActions ?? [];\n        this.childMenu = settings.childMenu ?? null;\n        this.destructive = settings.destructive ?? false;\n    }\n\n    setGroupIndex(index: number) {\n        this.groupIndex = index;\n        return this;\n    }\n\n    setPriority(priority: number) {\n        this.priority = priority;\n        return this;\n    }\n\n    abstract handle(data: TableActionSelection<T>): Promise<void>;\n}\n\nexport class MenuTableAction<T extends { id: string }> extends TableAction<T> {\n    async handle(data: TableActionSelection<T>) {\n        // Do nothing\n    }\n}\n\nexport class AsyncTableAction<T extends { id: string }> extends TableAction<T> {\n    handler: (selection: TableActionSelection<T>) => Promise<void> | void;\n\n    constructor(settings: Partial<TableAction<T>> & { handler: (selection: TableActionSelection<T>) => Promise<void> | void }) {\n        super(settings);\n        this.handler = settings.handler ?? (() => { throw new Error('No handler defined'); });\n    }\n\n    async handle(selection: TableActionSelection<T>) {\n        // todo\n        await this.handler(selection);\n    }\n}\n\nexport class InMemoryTableAction<T extends { id: string }> extends TableAction<T> {\n    handler: (item: T[]) => Promise<void> | void;\n\n    constructor(settings: Partial<TableAction<T>> & { handler: (item: T[]) => Promise<void> | void }) {\n        super(settings);\n        this.handler = settings.handler ?? (() => { throw new Error('No handler defined'); });\n    }\n\n    async fetchAll(initialRequest: LimitedFilteredRequest, objectFetcher: ObjectFetcher<T>, options?: FetchAllOptions<T>) {\n        return await fetchAll(initialRequest, objectFetcher, options);\n    }\n\n    async getSelection(selection: TableActionSelection<T>, options: FetchAllOptions<T>) {\n        if (selection.cachedAllValues) {\n            return selection.cachedAllValues;\n        }\n\n        if (selection.markedRows.size && selection.markedRowsAreSelected === true) {\n            // No async needed\n            return Array.from(selection.markedRows.values());\n        }\n        else {\n            return await this.fetchAll(selection.filter, selection.fetcher, options);\n        }\n    }\n\n    async handle(data: TableActionSelection<T>) {\n        const toast: Toast = new Toast('Ophalen...', 'spinner').setHide(null);\n        const timer = setTimeout(() => {\n            toast.show();\n        }, 1000);\n\n        try {\n            const items = this.needsSelection\n                ? (await this.getSelection(data, {\n                        onProgress(count, total) {\n                            toast.setProgress(total !== 0 ? (count / total) : 0);\n                        },\n                    }))\n                : [];\n            toast.setProgress(1);\n            toast.message = 'Actie uitvoeren...';\n            await this.handler(items);\n        }\n        finally {\n            clearTimeout(timer);\n            toast.hide();\n        }\n    }\n}\n","import { CountFilteredRequest, LimitedFilteredRequest, SortList, StamhoofdFilter } from '@stamhoofd/structures';\n\nexport interface ObjectFetcher<O> {\n    extendSort?(list: SortList): SortList;\n    requiredFilter?: StamhoofdFilter | null | undefined;\n    fetch(data: LimitedFilteredRequest, options?: { shouldRetry?: boolean }): Promise<{ results: O[]; next?: LimitedFilteredRequest }>;\n\n    fetchCount(data: CountFilteredRequest): Promise<number>;\n\n    destroy?(): void;\n}\n\nexport type FetchAllOptions<T> = {\n    onProgress?: (count: number, total: number) => void;\n    onResultsReceived?: (results: T[]) => void;\n};\n\nexport async function fetchAll<T>(initialRequest: LimitedFilteredRequest, objectFetcher: ObjectFetcher<T>, options?: FetchAllOptions<T>) {\n    // todo: check if we have all or nearly all already.\n    let next: LimitedFilteredRequest | null = initialRequest;\n\n    let totalFilteredCount: number | null = null;\n    if (options?.onProgress) {\n        totalFilteredCount = await objectFetcher.fetchCount(initialRequest);\n    }\n\n    const results: T[] = [];\n\n    while (next) {\n        // Override filter\n        // Because the filter could have been changed by the object fetcher, and we don't want to reapply any custom filters\n        // on the already custom filter that we got from the server\n        next.filter = initialRequest.filter;\n\n        // Same for sorting\n        next.sort = [];\n        if (objectFetcher.extendSort) {\n            next.sort = objectFetcher.extendSort(initialRequest.sort);\n        }\n\n        const data = await objectFetcher.fetch(next);\n        next = data.next ?? null;\n        results.push(...data.results);\n\n        if (data.results.length === 0) {\n            next = null;\n        }\n\n        if (options?.onProgress) {\n            options.onProgress(results.length, totalFilteredCount ?? results.length);\n        }\n\n        if (options?.onResultsReceived) {\n            options.onResultsReceived(results);\n        }\n    }\n\n    return results;\n}\n","import { Request } from '@simonbackx/simple-networking';\nimport { CountFilteredRequest, LimitedFilteredRequest, SortList, StamhoofdFilter, isEmptyFilter, isEqualFilter, mergeFilters } from '@stamhoofd/structures';\nimport { onBeforeUnmount, reactive } from 'vue';\nimport { useAuth } from '../../hooks';\nimport { ObjectFetcher } from './ObjectFetcher';\nimport { AutoEncoder } from '@simonbackx/simple-encoding';\n\nexport function useTableObjectFetcher<O extends { id: string }, OF extends ObjectFetcher<O> = ObjectFetcher<O>>(objectFetcher: OF): TableObjectFetcher<O> {\n    const auth = useAuth();\n    const fetcher = reactive(new TableObjectFetcher<O>({\n        objectFetcher,\n        maxLimit: auth.hasSomePlatformAccess() ? 1000 : 100,\n    })) as any;\n\n    onBeforeUnmount(() => {\n        fetcher.destroy();\n    });\n\n    return fetcher;\n}\n\nexport class TableObjectFetcher<O extends { id: string }> {\n    objectFetcher: ObjectFetcher<O>;\n\n    /**\n     * When the table reloads, try to reuse these references if possible\n     */\n    _objectReferenceCache: Map<string, O & AutoEncoder> = new Map();\n    objects: O[] = [];\n    baseFilter: StamhoofdFilter | null = null;\n    searchQuery = '';\n\n    currentStartIndex = 0;\n    currentEndIndex = 0;\n    fetchMargin = 0;\n\n    totalCount: number | null = null;\n    totalFilteredCount: number | null = null;\n\n    fetchingCount = false;\n    fetchingFilteredCount = false;\n    fetchingData = false;\n    delayFetchUntil: Date | null = null;\n\n    limit = STAMHOOFD.environment === 'development' ? 1 : 100; // To help catch bugs in pagination\n    maxLimit = 100;\n    minimumLimit = STAMHOOFD.environment === 'development' ? 1 : 20; // To help catch bugs in pagination\n    sort: SortList = [];\n\n    retryTimer: NodeJS.Timeout | null = null;\n    retryCount = 0;\n\n    errorState: Error | null = null;\n\n    // todo: add rate limits if scrolling too fast\n    _clearIndex = 0;\n\n    nextRequest: LimitedFilteredRequest | null = null;\n\n    constructor({ objectFetcher, maxLimit }: { objectFetcher: ObjectFetcher<O>; maxLimit?: number }) {\n        this.objectFetcher = objectFetcher;\n        this.maxLimit = maxLimit ?? this.maxLimit;\n    }\n\n    get filter() {\n        return mergeFilters([this.baseFilter, this.objectFetcher.requiredFilter ?? null]);\n    }\n\n    destroy() {\n        this._clearIndex += 1;\n        Request.cancelAll(this.objectFetcher);\n        if (this.objectFetcher.destroy) {\n            this.objectFetcher.destroy();\n        }\n        this._objectReferenceCache.clear();\n        this.objects = []; // Fast memory cleanup\n    }\n\n    resetRetryCount() {\n        this.retryCount = 0;\n    }\n\n    cancelRetry() {\n        if (this.retryTimer) {\n            clearTimeout(this.retryTimer);\n            this.retryTimer = null;\n        }\n    }\n\n    scheduleRetry(error: Error) {\n        if (this.retryTimer) {\n            return;\n        }\n\n        if (!Request.isNetworkError(error)) {\n            // Do not retry but display the message and ask a manual retry\n            this.errorState = error;\n            return;\n        }\n\n        this.retryCount += 1;\n\n        const waitTime = Math.min(this.retryCount * 5 * 1000, 20000);\n        const shorterWaitTime = Math.min(this.retryCount * 200, 20000);\n\n        // Require mininmum wait time, if a reset happens before the wait time\n        this.delayFetchUntil = new Date(new Date().getTime() + shorterWaitTime);\n\n        this.retryTimer = setTimeout(() => {\n            console.info('Retrying fetching after ' + waitTime / 1000 + 's: now');\n            this.fetchIfNeeded().catch(console.error);\n        }, waitTime);\n    }\n\n    reset(total = false, filteredCount = false) {\n        console.info('Reset');\n\n        this._clearIndex += 1;\n\n        // Save current objects in cache\n        for (const o of this.objects) {\n            if (o instanceof AutoEncoder) {\n                if (!this._objectReferenceCache.has(o.id)) {\n                    this._objectReferenceCache.set(o.id, o);\n                }\n            }\n        }\n\n        this.objects = [];\n\n        if (total) {\n            this.totalCount = null;\n        }\n        if (filteredCount) {\n            this.totalFilteredCount = null;\n        }\n\n        if (this.totalCount !== null && !this.filter && !this.searchQuery) {\n            this.totalFilteredCount = this.totalCount;\n        }\n\n        this.fetchingCount = false;\n        this.fetchingFilteredCount = false;\n        this.fetchingData = false;\n        this.errorState = null;\n        this.resetRetryCount();\n        this.cancelRetry();\n\n        this.nextRequest = new LimitedFilteredRequest({\n            filter: this.filter,\n            pageFilter: null,\n            sort: this.sort,\n            limit: this.minimumLimit,\n            search: this.searchQuery,\n        });\n        this.fetchIfNeeded().catch(console.error);\n    }\n\n    setSearchQuery(query: string) {\n        if (query === this.searchQuery) {\n            return;\n        }\n\n        if (this.searchQuery || query) {\n            // force debounce for search queries\n            this.delayFetchUntil = new Date(new Date().getTime() + 500);\n        }\n        else {\n            this.delayFetchUntil = null;\n        }\n\n        this.searchQuery = query;\n        this.reset(false, true);\n    }\n\n    setFilter(filter: StamhoofdFilter | null) {\n        if (isEqualFilter(filter, this.baseFilter)) {\n            return;\n        }\n\n        // Debounce when editing filters\n        if (!isEmptyFilter(filter)) {\n            this.delayFetchUntil = new Date(new Date().getTime() + 200);\n        }\n\n        this.baseFilter = filter;\n        this.reset(false, true);\n    }\n\n    setSort(sort: SortList) {\n        if (JSON.stringify(this.sort) == JSON.stringify(sort)) {\n            return;\n        }\n        console.log('setSort', this.sort);\n\n        this.sort = sort;\n        this.reset(false, false);\n    }\n\n    setVisible(startIndex: number, endIndex: number) {\n        if (this.currentStartIndex === startIndex && this.currentEndIndex === endIndex) {\n            return;\n        }\n        console.log('Set visible', startIndex, endIndex);\n\n        // Load more if needed\n        this.currentStartIndex = startIndex;\n        this.currentEndIndex = endIndex;\n        this.fetchIfNeeded().catch(console.error);\n    }\n\n    async fetchIfNeeded() {\n        if (this.fetchingData) {\n            console.warn('Already fetching data');\n            return;\n        }\n\n        if (this.errorState) {\n            console.info('Skipped fetching due to error state');\n            return;\n        }\n\n        if (this.currentEndIndex === 0) {\n            console.info('Skipped fetching: no visible index defined');\n            return;\n        }\n\n        if (this.delayFetchUntil) {\n            if (new Date() < this.delayFetchUntil) {\n                console.info('Delayed fetching');\n                if (!this.retryTimer) {\n                    this.retryTimer = setTimeout(() => {\n                        console.info('Run delayed fetching');\n                        this.fetchIfNeeded().catch(console.error);\n                    }, this.delayFetchUntil.getTime() - Date.now() + 5);\n                }\n                return;\n            }\n        }\n\n        if (!this.nextRequest) {\n            console.warn('No next request');\n            return;\n        }\n\n        console.info('Started fetching');\n        this.cancelRetry();\n\n        this.fetchingData = true;\n        const currentClearIndex = this._clearIndex;\n\n        try {\n            const hasFilter = !!this.baseFilter || !!this.searchQuery;\n            if ((!this.fetchingCount && this.totalCount === null) || (!hasFilter && !this.fetchingFilteredCount && this.totalFilteredCount === null)) {\n                this.fetchingCount = true;\n\n                if (!hasFilter) {\n                    this.fetchingFilteredCount = true;\n                }\n\n                // Fetch count in parallel\n                this.objectFetcher.fetchCount(new CountFilteredRequest({\n                    filter: this.objectFetcher.requiredFilter,\n                })).then((c) => {\n                    if (currentClearIndex !== this._clearIndex) {\n                        // Discard old requests\n                        return;\n                    }\n                    this.totalCount = c;\n                    this.fetchingCount = false;\n\n                    if (!hasFilter) {\n                        this.totalFilteredCount = c;\n                        this.fetchingFilteredCount = false;\n                    }\n\n                    this.fetchIfNeeded().catch(console.error);\n                }).catch(console.error);\n            }\n\n            if (!this.fetchingFilteredCount && this.totalFilteredCount === null && hasFilter) {\n                this.fetchingFilteredCount = true;\n\n                // Fetch count in parallel\n                this.objectFetcher.fetchCount(new CountFilteredRequest({ filter: this.filter, search: this.searchQuery })).then((c) => {\n                    if (currentClearIndex !== this._clearIndex) {\n                        // Discard old requests\n                        return;\n                    }\n                    this.totalFilteredCount = c;\n                    this.fetchingFilteredCount = false;\n                }).catch(console.error);\n            }\n\n            const fetchUntil = this.totalFilteredCount !== null ? Math.min(this.totalFilteredCount, this.currentEndIndex + 1 + this.fetchMargin) : (this.currentEndIndex + 1 + this.fetchMargin); // +1 is required to convert index to total items\n            if (fetchUntil > this.objects.length) {\n                console.log('has ', this.objects.length, 'objects', 'fetch until', fetchUntil);\n\n                // Fetch next page\n                const limit = Math.max(this.minimumLimit, Math.min(this.limit, fetchUntil - this.objects.length));\n\n                // Override limit\n                this.nextRequest.limit = limit;\n\n                // Override filter\n                // Because the filter could have been changed by the object fetcher, and we don't want to reapply any custom filters\n                // on the already custom filter that we got from the server\n                this.nextRequest.filter = this.filter;\n\n                // Same for sorting\n                this.nextRequest.sort = this.objectFetcher.extendSort ? this.objectFetcher.extendSort([...this.sort]) : this.sort;\n\n                const data = await this.objectFetcher.fetch(this.nextRequest);\n                if (currentClearIndex !== this._clearIndex) {\n                    // Discard old requests\n                    console.warn('Discarded fetch result');\n                    return;\n                }\n\n                this.resetRetryCount();\n\n                const objects = data.results.map((o) => {\n                    const cachedReference = this._objectReferenceCache.get(o.id);\n                    if (cachedReference && cachedReference instanceof AutoEncoder && o instanceof AutoEncoder) {\n                        cachedReference.deepSet(o);\n                        return cachedReference;\n                    }\n                    return o;\n                });\n                this.nextRequest = data.next ?? null;\n\n                if (STAMHOOFD.environment === 'development') {\n                    for (const o of this.objects) {\n                        for (const oo of objects) {\n                            if (oo.id === o.id) {\n                                console.warn('Duplicate objects found. Fetched ' + oo.id);\n                                break;\n                            }\n                        }\n                    }\n                }\n                this.objects.push(...objects);\n\n                if (objects.length < limit && (this.totalFilteredCount === null || this.objects.length < this.totalFilteredCount)) {\n                    console.warn('Unexpected end of data');\n                    this.totalFilteredCount = this.objects.length;\n                    console.info('Stopped fetching');\n                    this.fetchingData = false;\n\n                    if (!hasFilter) {\n                        this.totalCount = this.objects.length;\n                    }\n                    return;\n                }\n\n                console.info('Stopped fetching');\n                this.fetchingData = false;\n                this.fetchIfNeeded().catch(console.error);\n            }\n            else {\n                console.info('Stopped fetching');\n                this.fetchingData = false;\n                console.log('No fetch required.', this.objects.length, '/', this.totalFilteredCount);\n            }\n        }\n        catch (e) {\n            if (currentClearIndex === this._clearIndex) {\n                console.error('Stopped fetching due to error');\n                console.error(e);\n                this.fetchingData = false;\n                this.scheduleRetry(e as Error);\n            }\n            throw e;\n        }\n    }\n}\n","import { Request } from '@simonbackx/simple-networking';\nimport { LimitedFilteredRequest, SortList, StamhoofdFilter, isEmptyFilter, isEqualFilter, mergeFilters } from '@stamhoofd/structures';\nimport { onBeforeUnmount, reactive } from 'vue';\nimport { ObjectFetcher } from './ObjectFetcher';\n\nexport function useInfiniteObjectFetcher<O extends { id: string }, OF extends ObjectFetcher<O> = ObjectFetcher<O>>(objectFetcher: OF): InfiniteObjectFetcher<O> {\n    const fetcher = reactive(new InfiniteObjectFetcher<O>({\n        objectFetcher,\n    })) as any;\n\n    onBeforeUnmount(() => {\n        fetcher.destroy();\n    });\n\n    return fetcher;\n}\n\n/**\n * Fetch objects in an infinite list\n * -> instead of having a start and end index which can get calculated easily,\n * the external system should only notify the fetcher when it reached (almost) the end of the list\n *\n * The list doesn't fetch the total counts\n */\nexport class InfiniteObjectFetcher<O extends { id: string }> {\n    objectFetcher: ObjectFetcher<O>;\n\n    objects: O[] = [];\n    baseFilter: StamhoofdFilter | null = null;\n    searchQuery = '';\n\n    fetchingData = false;\n    delayFetchUntil: Date | null = null;\n\n    limit = 20;\n    sort: SortList = [];\n\n    /**\n     * Whether the end of the list has been reached, and we should fetch more if possible\n     */\n    hasReachedEnd = false;\n\n    /**\n     * Set to false if we know there are no more objects to fetch\n     */\n    hasMoreObjects = true;\n\n    retryTimer: NodeJS.Timeout | null = null;\n    retryCount = 0;\n\n    errorState: Error | null = null;\n\n    // todo: add rate limits if scrolling too fast\n    _clearIndex = 0;\n\n    nextRequest: LimitedFilteredRequest | null = null;\n\n    constructor({ objectFetcher }: { objectFetcher: ObjectFetcher<O> }) {\n        this.objectFetcher = objectFetcher;\n    }\n\n    get filter() {\n        return mergeFilters([this.baseFilter, this.objectFetcher.requiredFilter ?? null]);\n    }\n\n    destroy() {\n        this._clearIndex += 1;\n        Request.cancelAll(this.objectFetcher);\n        if (this.objectFetcher.destroy) {\n            this.objectFetcher.destroy();\n        }\n        this.objects = reactive([]); // Fast memory cleanup\n    }\n\n    resetRetryCount() {\n        this.retryCount = 0;\n    }\n\n    cancelRetry() {\n        if (this.retryTimer) {\n            clearTimeout(this.retryTimer);\n            this.retryTimer = null;\n        }\n    }\n\n    scheduleRetry(error: Error) {\n        if (this.retryTimer) {\n            return;\n        }\n\n        if (!Request.isNetworkError(error)) {\n            // Do not retry but display the message and ask a manual retry\n            this.errorState = error;\n            return;\n        }\n\n        this.retryCount += 1;\n\n        const waitTime = Math.min(this.retryCount * 5 * 1000, 20000);\n        const shorterWaitTime = Math.min(this.retryCount * 200, 20000);\n\n        // Require mininmum wait time, if a reset happens before the wait time\n        this.delayFetchUntil = new Date(new Date().getTime() + shorterWaitTime);\n\n        this.retryTimer = setTimeout(() => {\n            console.info('Retrying fetching after ' + waitTime / 1000 + 's: now');\n            this.fetchIfNeeded().catch(console.error);\n        }, waitTime);\n    }\n\n    reset() {\n        console.info('Reset');\n\n        this._clearIndex += 1;\n        this.objects = reactive([]);\n        this.hasMoreObjects = true;\n        this.fetchingData = false;\n        this.errorState = null;\n        this.hasReachedEnd = true;\n        this.resetRetryCount();\n        this.cancelRetry();\n\n        this.nextRequest = new LimitedFilteredRequest({\n            filter: this.filter,\n            pageFilter: null,\n            sort: this.sort,\n            limit: this.limit,\n            search: this.searchQuery,\n        });\n        this.fetchIfNeeded().catch(console.error);\n    }\n\n    setSearchQuery(query: string) {\n        if (query === this.searchQuery) {\n            return;\n        }\n\n        if (this.searchQuery || query) {\n            // force debounce for search queries\n            this.delayFetchUntil = new Date(new Date().getTime() + 500);\n        }\n        else {\n            this.delayFetchUntil = null;\n        }\n\n        this.searchQuery = query;\n        this.reset();\n    }\n\n    setFilter(filter: StamhoofdFilter | null) {\n        if (isEqualFilter(filter, this.baseFilter)) {\n            return;\n        }\n\n        // Debounce when editing filters\n        if (!isEmptyFilter(filter)) {\n            this.delayFetchUntil = new Date(new Date().getTime() + 200);\n        }\n\n        this.baseFilter = filter;\n        this.reset();\n    }\n\n    setSort(sort: SortList) {\n        if (JSON.stringify(this.sort) == JSON.stringify(sort)) {\n            return;\n        }\n        console.log('setSort', this.sort);\n\n        this.sort = sort;\n        this.reset();\n    }\n\n    setReachedEnd(hasReachedEnd: boolean) {\n        if (this.hasReachedEnd === hasReachedEnd) {\n            return;\n        }\n        console.log('Set hasReachedEnd', hasReachedEnd);\n\n        // Load more if needed\n        this.hasReachedEnd = hasReachedEnd;\n        this.fetchIfNeeded().catch(console.error);\n    }\n\n    async fetchIfNeeded() {\n        if (this.fetchingData) {\n            console.warn('Already fetching data');\n            return;\n        }\n\n        if (this.errorState) {\n            console.info('Skipped fetching due to error state');\n            return;\n        }\n\n        if (!this.hasReachedEnd && this.objects.length > 0) {\n            console.info('Skipped fetching: not at the end of the list');\n            return;\n        }\n\n        if (!this.hasMoreObjects) {\n            console.info('Skipped fetching: no more objects');\n            return;\n        }\n\n        if (this.delayFetchUntil) {\n            if (new Date() < this.delayFetchUntil) {\n                console.info('Delayed fetching');\n                if (!this.retryTimer) {\n                    this.retryTimer = setTimeout(() => {\n                        console.info('Run delayed fetching');\n                        this.fetchIfNeeded().catch(console.error);\n                    }, this.delayFetchUntil.getTime() - Date.now() + 5);\n                }\n                return;\n            }\n        }\n\n        if (!this.nextRequest) {\n            this.nextRequest = new LimitedFilteredRequest({\n                filter: this.filter,\n                pageFilter: null,\n                sort: this.sort,\n                limit: this.limit,\n                search: this.searchQuery,\n            });\n        }\n\n        console.info('Started fetching');\n        this.cancelRetry();\n\n        this.fetchingData = true;\n        const currentClearIndex = this._clearIndex;\n\n        try {\n            // Fetch next page\n            const limit = this.limit;\n\n            // Override limit\n            this.nextRequest.limit = limit;\n\n            // Override filter\n            // Because the filter could have been changed by the object fetcher, and we don't want to reapply any custom filters\n            // on the already custom filter that we got from the server\n            this.nextRequest.filter = this.filter;\n\n            // Same for sorting\n            this.nextRequest.sort = this.objectFetcher.extendSort ? this.objectFetcher.extendSort([...this.sort]) : this.sort;\n\n            const data = await this.objectFetcher.fetch(this.nextRequest);\n            if (currentClearIndex !== this._clearIndex) {\n                // Discard old requests\n                console.warn('Discarded fetch result');\n                return;\n            }\n\n            this.resetRetryCount();\n\n            const objects = data.results;\n            this.nextRequest = data.next ?? null;\n\n            if (STAMHOOFD.environment === 'development') {\n                for (const o of this.objects) {\n                    for (const oo of objects) {\n                        if (oo.id === o.id) {\n                            console.warn('Duplicate objects found. Fetched ' + oo.id);\n                            break;\n                        }\n                    }\n                }\n            }\n            this.objects.push(...objects);\n\n            if (objects.length < limit) {\n                console.warn('Reached end of data');\n                this.hasMoreObjects = false;\n\n                console.info('Stopped fetching');\n                this.fetchingData = false;\n                return;\n            }\n\n            console.info('Stopped fetching');\n            this.fetchingData = false;\n\n            // Fetch more if needed\n            // But first wait on UI to render the new objects\n            // and wait to notifiy the fetcher again\n\n            this.fetchIfNeeded().catch(console.error);\n\n            const shorterWaitTime = 150;\n\n            // Require mininmum wait time, if a reset happens before the wait time\n            this.delayFetchUntil = new Date(new Date().getTime() + shorterWaitTime);\n\n            this.retryTimer = setTimeout(() => {\n                console.info('Retrying fetching after ' + shorterWaitTime / 1000 + 's: now');\n                this.fetchIfNeeded().catch(console.error);\n            }, shorterWaitTime);\n        }\n        catch (e) {\n            if (currentClearIndex === this._clearIndex) {\n                console.error('Stopped fetching due to error');\n                console.error(e);\n                this.fetchingData = false;\n                this.scheduleRetry(e as Error);\n            }\n            throw e;\n        }\n    }\n}\n","<template>\n    <ContextMenuView v-bind=\"$attrs\" ref=\"contextMenuView\">\n        <ContextMenuItemView v-for=\"column of sortedColumns\" :key=\"column.id\" :contextMenuView=\"$refs.contextMenuView\" element-name=\"label\" @click=\"setColumnEnabled(column, !column.enabled)\">\n            <template #left><Checkbox :modelValue=\"column.enabled\" :only-line=\"true\" /></template>\n            {{ column.name }}\n        </ContextMenuItemView>\n    </ContextMenuView>\n</template>\n\n<script lang=\"ts\">\nimport { NavigationMixin } from \"@simonbackx/vue-app-navigation\";\nimport { Checkbox,ContextMenuItemView, ContextMenuLine,ContextMenuView } from \"@stamhoofd/components\";\nimport { Component, Mixins, Prop } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport { Column } from \"./classes\";\n\n@Component({\n    components: {\n        ContextMenuView,\n        ContextMenuItemView,\n        ContextMenuLine,\n        Checkbox\n    },\n})\nexport default class ColumnSelectorContextMenu extends Mixins(NavigationMixin) {\n    @Prop({ required: true })\n    columns: Column<any, any>[];\n\n    setColumnEnabled(column: Column<any, any>, enabled: boolean) {\n        column.width = null\n        column.renderWidth = null\n        column.enabled = enabled\n    }\n\n    get sortedColumns() {\n        return this.columns.slice().sort((a, b) => a.index - b.index)\n    }\n\n}\n</script>\n","<template>\n    <ContextMenuView v-bind=\"$attrs\" ref=\"contextMenuView\">\n        <ContextMenuItemView v-for=\"column of sortedColumns\" :key=\"column.id\" :context-menu-view=\"$refs.contextMenuView\" @click=\"setSortByColumn(column)\">\n            <template v-if=\"getSortByColumn(column)\" #left>\n                <span :class=\"'icon '+getSortDirectionIcon()\" />\n            </template>\n            <template v-else #left>\n                <span class=\"icon\" />\n            </template>\n            {{ column.name }}\n        </ContextMenuItemView>\n    </ContextMenuView>\n</template>\n\n<script lang=\"ts\">\nimport { NavigationMixin } from \"@simonbackx/vue-app-navigation\";\nimport { Component, Mixins, Prop } from \"@simonbackx/vue-app-navigation/classes\";\nimport { Checkbox, ContextMenuItemView, ContextMenuLine, ContextMenuView } from \"@stamhoofd/components\";\n\nimport { SortItemDirection } from \"@stamhoofd/structures\";\nimport { Column } from \"./classes\";\n\n@Component({\n    components: {\n        ContextMenuView,\n        ContextMenuItemView,\n        ContextMenuLine,\n        Checkbox\n    },\n})\nexport default class ColumnSortingContextMenu extends Mixins(NavigationMixin) {\n    @Prop({ required: true })\n        columns: Column<any, any>[];\n\n    @Prop({ required: true })\n        setSort: (column: Column<any, any>, direction: SortItemDirection) => void\n    \n    @Prop({ required: true })\n        sortBy: Column<any, any>;\n\n    @Prop({ required: true })\n        sortDirection: SortItemDirection\n\n    setSortByColumn(column: Column<any, any>) {\n        if (this.sortBy.id === column.id) {\n            this.setSort(column, this.sortDirection === SortItemDirection.ASC ? SortItemDirection.DESC : SortItemDirection.ASC)\n        } else {\n            this.setSort(column, this.sortDirection)\n        }\n    }\n\n    getSortByColumn(column: Column<any, any>) {\n        return this.sortBy.id === column.id ? true : false\n    }\n\n    getSortDirectionIcon() {\n        return this.sortDirection === \"ASC\" ? \"arrow-up-small\" : \"arrow-down-small\"\n    }\n\n    get sortedColumns() {\n        return this.columns.filter(c => c.allowSorting).sort((a, b) => a.index - b.index)\n    }\n\n}\n</script>\n","<template>\n    <ContextMenuView v-bind=\"$attrs\" ref=\"contextMenuView\">\n        <template v-for=\"(actions, groupIndex) of groupedActions\">\n            <ContextMenuLine v-if=\"groupIndex > 0\" :key=\"groupIndex+'-line'\" />\n            <ContextMenuItemView v-for=\"(action, index) of actions\" :key=\"groupIndex+'-'+index\" :context-menu-view=\"$refs.contextMenuView\" :class=\"{'disabled': isDisabled(action), destructive: action.destructive}\" :child-context-menu=\"getChildContextMenu(action)\" @click=\"handleAction(action, $event)\">\n                <p>{{ action.name }}</p>\n                <p v-if=\"action.description\" class=\"description\">\n                    {{ action.description }}\n                </p>\n\n                <template v-if=\"action.hasChildActions\" #right>\n                    <span class=\"icon arrow-right-small\" />\n                </template>\n                <template v-else-if=\"action.icon\" #right>\n                    <span :class=\"'icon '+action.icon\" />\n                </template>\n            </ContextMenuItemView>\n        </template>\n    </ContextMenuView>\n</template>\n\n<script lang=\"ts\">\nimport { ComponentWithProperties } from '@simonbackx/vue-app-navigation';\nimport { Component, Prop, VueComponent } from '@simonbackx/vue-app-navigation/classes';\nimport { Checkbox, ContextMenuItemView, ContextMenuLine, ContextMenuView, Toast } from '@stamhoofd/components';\n\nimport { TableAction, TableActionSelection } from './classes';\n\n@Component({\n    components: {\n        ContextMenuView,\n        ContextMenuItemView,\n        ContextMenuLine,\n        Checkbox,\n    },\n})\nexport default class TableActionsContextMenu extends VueComponent {\n    @Prop({ required: true })\n    actions: TableAction<any>[];\n\n    @Prop({ default: () => {\n        // Required to return a default method\n        return () => {};\n    } })\n    onDismiss!: (() => void);\n\n    /**\n     * Act only on selection given here\n     */\n    @Prop({ default: () => [] })\n    selection!: TableActionSelection<any>;\n\n    isDisabled(action: TableAction<any>) {\n        return action.isDisabled(this.hasSelection);\n    }\n\n    unmounted() {\n        this.onDismiss();\n    }\n\n    get hasSelection() {\n        return this.selection.markedRows.size > 0 || this.selection.markedRowsAreSelected === false;\n    }\n\n    get isSingleSelection() {\n        return this.selection.markedRows.size === 1 && this.selection.markedRowsAreSelected === true;\n    }\n\n    handleAction(action: TableAction<any>, event) {\n        if (this.isDisabled(action)) {\n            return;\n        }\n        action.handle(this.selection)?.catch((e) => {\n            console.error(e);\n            Toast.fromError(e).show();\n        });\n    }\n\n    get groupedActions() {\n        // Group all actions based on their groupIndex property, sorted by groupIndex\n        return this.actions\n            .filter((action) => {\n                if (!action.enabled) {\n                    return false;\n                }\n                if (action.singleSelection && !this.isSingleSelection) {\n                    return false;\n                }\n\n                if ((this as any).$isMobile && this.isDisabled(action)) {\n                    // On mobile, hide disabled actions, because we don't have enough room\n                    return false;\n                }\n                return true;\n            })\n            .sort((a, b) => {\n                if (a.groupIndex !== b.groupIndex) {\n                    return a.groupIndex - b.groupIndex;\n                }\n                return b.priority - a.priority;\n            })\n            .reduce((acc, action) => {\n                const group = acc[acc.length - 1];\n                if (group && group[0].groupIndex === action.groupIndex) {\n                    group.push(action);\n                }\n                else {\n                    acc.push([action]);\n                }\n                return acc;\n            }, [] as TableAction<any>[][]);\n    }\n\n    getChildContextMenu(action: TableAction<any>) {\n        if (action.childMenu) {\n            return action.childMenu;\n        }\n\n        if (!action.hasChildActions) {\n            return;\n        }\n\n        return new ComponentWithProperties(TableActionsContextMenu, {\n            actions: action.getChildActions(),\n            selection: this.selection,\n        });\n    }\n\n    pop(popParents = false) {\n        this.$refs.contextMenuView?.pop(popParents);\n    }\n}\n</script>\n","<template>\n    <div class=\"modern st-view table-view background\">\n        <STNavigationBar :add-shadow=\"wrapColumns\" :title=\"title\" :disable-pop=\"true\">\n            <template #left>\n                <button v-if=\"canLeaveSelectionMode && isMobile && showSelection && !isIOS\" type=\"button\" class=\"button icon navigation close\" @click=\"setShowSelection(false)\" />\n                <button v-else-if=\"canLeaveSelectionMode && showSelection && isIOS\" type=\"button\" class=\"button navigation\" @click=\"isAllSelected = !isAllSelected\">\n                    <template v-if=\"isAllSelected\">\n                        Deselecteer alles\n                    </template>\n                    <template v-else>\n                        Selecteer alles\n                    </template>\n                </button>\n                <BackButton v-else-if=\"canPop\" @click=\"pop\">\n                    {{ backHint || 'Terug' }}\n                </BackButton>\n            </template>\n            <template #right>\n                <template v-if=\"!(isIOS && showSelection)\">\n                    <button v-for=\"(action, index) of filteredActions\" :key=\"index\" v-tooltip=\"action.tooltip\" type=\"button\" :class=\"'button icon navigation '+action.icon\" :disabled=\"action.needsSelection && ((showSelection && isMobile) || !action.allowAutoSelectAll) && !hasSelection\" @click=\"handleAction(action, $event)\" />\n                </template>\n\n                <template v-if=\"showSelection && isIOS && canLeaveSelectionMode\">\n                    <button v-if=\"canLeaveSelectionMode\" key=\"iOSDone\" type=\"button\" class=\"button navigation highlight\" @click=\"setShowSelection(false)\">\n                        Gereed\n                    </button>\n                </template>\n                <button v-else-if=\"!showSelection && isIOS && false\" key=\"iOSSelect\" type=\"button\" class=\"button navigation\" @click=\"setShowSelection(true)\">\n                    Selecteer\n                </button>\n                <button v-else key=\"actions\" v-long-press=\"(e) => showActions(true, e)\" type=\"button\" class=\"button icon more navigation\" @click.prevent=\"showActions(true, $event)\" @contextmenu.prevent=\"showActions(true, $event)\" />\n            </template>\n        </STNavigationBar>\n\n        <main>\n            <div class=\"container\">\n                <h1 class=\"style-navigation-title\">\n                    {{ title }}\n                    <span v-if=\"titleSuffix\" class=\"title-suffix\">\n                        {{ titleSuffix }}\n                    </span>\n                </h1>\n                <slot />\n\n                <div class=\"input-with-buttons\">\n                    <div>\n                        <form class=\"input-icon-container icon search gray\" @submit.prevent=\"blurFocus\">\n                            <input v-model=\"searchQuery\" class=\"input\" name=\"search\" placeholder=\"Zoeken\" type=\"search\" inputmode=\"search\" enterkeyhint=\"search\" autocorrect=\"off\" autocomplete=\"off\" :spellcheck=\"false\" autocapitalize=\"off\">\n                        </form>\n                    </div>\n                    <div v-if=\"canFilter\">\n                        <button type=\"button\" class=\"button text\" @click=\"editFilter\">\n                            <span class=\"icon filter\" />\n                            <span class=\"hide-small\">Filter</span>\n                            <span v-if=\"!isEmptyFilter(tableObjectFetcher.baseFilter)\" class=\"icon dot primary\" />\n                        </button>\n                    </div>\n                </div>\n            </div>\n\n            <div ref=\"tableElement\" class=\"table-with-columns\" :class=\"{ wrap: wrapColumns, 'show-checkbox': showSelection, 'show-prefix': showPrefix }\">\n                <div class=\"inner-size\" :style=\"!wrapColumns ? { height: (totalHeight+50)+'px', width: totalRenderWidth+'px'} : {}\">\n                    <div class=\"table-head\" @contextmenu.prevent=\"onTableHeadRightClick($event)\">\n                        <div v-if=\"showSelection\" class=\"selection-column\">\n                            <Checkbox v-model=\"isAllSelected\" />\n                        </div>\n\n                        <div class=\"columns\">\n                            <div v-for=\"(column, index) of columns\" :key=\"column.id\" :class=\"{isDragging: isDraggingColumn === column && isColumnDragActive && dragType === 'order'}\" :data-align=\"column.align\">\n                                <button type=\"button\" @mouseup.left=\"toggleSort(column)\" @mousedown.left=\"(event) => columnDragStart(event, column)\" @touchstart=\"(event) => columnDragStart(event, column)\">\n                                    <span>{{ column.name }}</span>\n\n                                    <span\n                                        v-if=\"sortBy === column\"\n                                        class=\"sort-arrow icon\"\n                                        :class=\"{\n                                            'arrow-up-small': sortDirection === 'ASC',\n                                            'arrow-down-small': sortDirection === 'DESC',\n                                        }\"\n                                    />\n                                </button>\n                                <span v-if=\"index < columns.length - 1\" class=\"drag-handle-container\"><span class=\"drag-handle\" @mousedown=\"(event) => handleDragStart(event, column)\" @touchstart=\"(event) => handleDragStart(event, column)\" /></span>\n                                <button v-else-if=\"canCollapse\" v-tooltip=\"'Pas kolommen op het scherm'\" type=\"button\" class=\"button light-gray icon collapse-left\" @click=\"collapse\" />\n                            </div>\n                        </div>\n                    </div>\n\n                    <div ref=\"tableBody\" class=\"table-body\" :style=\"{ height: totalHeight+'px' }\">\n                        <div v-for=\"row of visibleRows\" :key=\"row.id\" v-long-press=\"(e) => onRightClickRow(row, e)\" class=\"table-row\" :class=\"{focused: isRowFocused(row) }\" :style=\"{ transform: 'translateY('+row.y+'px)', display: row.currentIndex === null ? 'none' : '' }\" @click=\"onClickRow(row, $event)\" @contextmenu.prevent=\"(event) => onRightClickRow(row, event)\">\n                            <label v-if=\"showSelection\" class=\"selection-column\" @click.stop>\n                                <Checkbox v-if=\"row.value\" :key=\"row.value.id\" :model-value=\"row.cachedSelectionValue\" @update:model-value=\"setSelectionValue(row, $event)\" />\n                                <Checkbox v-else :model-value=\"isAllSelected\" />\n                            </label>\n                            <div v-if=\"showPrefix && prefixColumn\" class=\"prefix-column\" :data-style=\"prefixColumn.getStyleFor(row.value, true)\" :data-align=\"prefixColumn.align\">\n                                <span v-if=\"row.value\" v-text=\"prefixColumn.getFormattedValue(row.value)\" />\n                                <span v-else class=\"placeholder-skeleton\" :style=\"{ width: Math.floor(row.skeletonPercentage*100) + '%'}\" />\n                            </div>\n                            <div class=\"columns\">\n                                <div v-for=\"column of columns\" :key=\"column.id\" :class=\"{isDragging: isDraggingColumn === column && isColumnDragActive && dragType === 'order' }\" :data-style=\"column.getStyleFor(row.value)\" :data-align=\"column.align\">\n                                    <span v-if=\"row.value\" v-text=\"column.getFormattedValue(row.value)\" />\n                                    <span v-else class=\"placeholder-skeleton\" :style=\"{ width: Math.floor(row.skeletonPercentage*(Math.min((!wrapColumns && column.width) ? column.width : 200, column.recommendedWidth)-30))+'px'}\" />\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n\n            <p v-if=\"errorMessage\" class=\"error-box with-button\">\n                {{ errorMessage }}\n\n                <button class=\"button text\" type=\"button\" @click=\"refresh\">\n                    Opnieuw\n                </button>\n            </p>\n\n            <p v-else-if=\"totalFilteredCount === 0 && totalItemsCount === 0\" class=\"info-box\">\n                <slot name=\"empty\" />\n            </p>\n            <p v-else-if=\"totalFilteredCount === 0\" class=\"info-box with-button\">\n                Geen resultaten gevonden\n\n                <button class=\"button text\" type=\"button\" @click=\"resetFilter\">\n                    Reset\n                </button>\n            </p>\n        </main>\n\n        <STButtonToolbar v-if=\"isIOS && isMobile && showSelection && filteredActions.length\">\n            <button v-for=\"(action, index) of filteredActions\" :key=\"index\" type=\"button\" class=\"button text small column selected\" :disabled=\"action.needsSelection && (showSelection || !action.allowAutoSelectAll) && !hasSelection\" @click=\"action.needsSelection && (showSelection || !action.allowAutoSelectAll) && !hasSelection ? undefined : handleAction(action, $event)\">\n                <span :class=\"'icon '+action.icon\" />\n            </button>\n\n            <button v-long-press=\"(e) => showActions(false, e)\" type=\"button\" class=\"button text small column selected\" @click=\"showActions(false, $event)\">\n                <span class=\"icon more\" />\n            </button>\n        </STButtonToolbar>\n    </div>\n</template>\n\n<script lang=\"ts\" setup generic=\"Value extends TableListable\">\nimport { ArrayDecoder, AutoEncoder, BooleanDecoder, Decoder, EnumDecoder, field, NumberDecoder, ObjectData, StringDecoder, VersionBox, VersionBoxDecoder } from '@simonbackx/simple-encoding';\nimport { isSimpleError, isSimpleErrors, SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\nimport { ComponentWithProperties, defineRoutes, NavigationController, useCanPop, useNavigate, usePop, usePresent } from '@simonbackx/vue-app-navigation';\nimport { BackButton, Checkbox, STButtonToolbar, STNavigationBar, Toast, UIFilter, UIFilterBuilders, useDeviceWidth, useIsIOS, usePositionableSheet, useVisibilityChange } from '@stamhoofd/components';\nimport { Storage } from '@stamhoofd/networking';\nimport { isEmptyFilter, LimitedFilteredRequest, mergeFilters, SortItemDirection, StamhoofdFilter, Version } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { v4 as uuidv4 } from 'uuid';\nimport { ComponentOptions, computed, ComputedRef, getCurrentInstance, onActivated, onBeforeUnmount, onDeactivated, onMounted, reactive, Ref, ref, watch, watchEffect } from 'vue';\n\nimport UIFilterEditor from '../filters/UIFilterEditor.vue';\nimport { AsyncTableAction, Column, MenuTableAction, TableAction, TableActionSelection, TableObjectFetcher } from './classes';\nimport ColumnSelectorContextMenu from './ColumnSelectorContextMenu.vue';\nimport ColumnSortingContextMenu from './ColumnSortingContextMenu.vue';\nimport TableActionsContextMenu from './TableActionsContextMenu.vue';\n\nexport interface TableListable {\n    id: string;\n}\n\nclass VisibleRow<T> {\n    id = uuidv4();\n    y = 0;\n\n    /**\n      * currentIndex = null -> available for reause\n      */\n    currentIndex: null | number = null;\n\n    /**\n      * value = null -> show loading indicator\n      */\n    value: T | null = null;\n\n    cachedSelectionValue = false;\n\n    skeletonPercentage = Math.random() * 0.5 + 0.5;\n}\n\nclass EnabledColumnConfiguration extends AutoEncoder {\n    @field({ decoder: StringDecoder })\n    id: string;\n\n    @field({ decoder: NumberDecoder })\n    width: number;\n}\n\n/**\n  * We store this configuration in storage, so we can reuse the previous configuration every time\n  */\nclass ColumnConfiguration extends AutoEncoder {\n    @field({ decoder: new ArrayDecoder(EnabledColumnConfiguration) })\n    columns: EnabledColumnConfiguration[] = [];\n\n    @field({ decoder: BooleanDecoder, optional: true })\n    canCollapse = false;\n\n    @field({ decoder: StringDecoder, optional: true })\n    sortColumnId?: string;\n\n    @field({ decoder: new EnumDecoder(SortItemDirection), optional: true })\n    sortDirection: SortItemDirection = SortItemDirection.ASC;\n}\n\nconst props = withDefaults(\n    defineProps<{\n        title: string;\n        backHint?: string | null;\n        actions?: TableAction<Value>[];\n        estimatedRows?: number | null;\n        tableObjectFetcher: TableObjectFetcher<Value>;\n        filterBuilders?: UIFilterBuilders | null;\n        columnConfigurationId: string;\n\n        // warning: do not use as these are not reactive\n        allColumns: Column<Value, any>[];\n        prefixColumn?: Column<Value, any> | null;\n        defaultSortColumn?: Column<Value, any> | null;\n        defaultSortDirection?: SortItemDirection | null;\n        defaultFilter?: StamhoofdFilter | null;\n        Route?: {\n            Component: unknown;\n            objectKey: string;\n            getProperties?: (object: Value) => Record<string, any>;\n        } | null;\n    }>(), {\n        backHint: null,\n        estimatedRows: null,\n        filterBuilders: null,\n        prefixColumn: null,\n        defaultSortColumn: null,\n        defaultSortDirection: null,\n        actions: () => [],\n        defaultFilter: null,\n        Route: null,\n    },\n);\n\nenum Routes {\n    Object = 'Object',\n}\n\nfunction getPropertiesForRoute(object: Value) {\n    return {\n        ...(props.Route!.getProperties?.(object) ?? {}),\n        [props.Route!.objectKey]: object,\n        getNext,\n        getPrevious,\n    };\n}\n\nif (props.Route) {\n    defineRoutes([{\n        name: Routes.Object,\n        url: '@id',\n        component: props.Route.Component as unknown as ComponentOptions,\n        params: {\n            id: String,\n        },\n        present: 'popup',\n        paramsToProps: async (params: { id: string }) => {\n            // Fetch event\n            const objects = await props.tableObjectFetcher.objectFetcher.fetch(\n                new LimitedFilteredRequest({\n                    filter: {\n                        id: params.id,\n                    },\n                    limit: 1,\n                    sort: [],\n                }),\n            );\n\n            if (objects.results.length === 1) {\n                return getPropertiesForRoute(objects.results[0]);\n            }\n            Toast.error('Niet gevonden').show();\n            throw new Error('Not found');\n        },\n\n        propsToParams(routeProps: any) {\n            if (!(props.Route!.objectKey in routeProps) || typeof routeProps[props.Route!.objectKey] !== 'object' || routeProps[props.Route!.objectKey] === null) {\n                throw new Error('Missing object');\n            }\n            const object = routeProps[props.Route!.objectKey];\n\n            return {\n                params: {\n                    id: object.id,\n                },\n            };\n        },\n    }]);\n}\n\nconst $navigate = useNavigate();\n\nconst reactiveColumns = reactive(props.allColumns) as Column<Value, any>[];\nconst showPrefix = computed(() => props.prefixColumn !== null && wrapColumns.value && props.prefixColumn.enabled);\nconst columns = computed(() => {\n    return reactiveColumns.filter(c => c.enabled && (!showPrefix.value || c.id !== props.prefixColumn?.id)).sort((a, b) => a.index - b.index);\n}) as ComputedRef<Column<Value, any>[]>;\n\nconst canPop = useCanPop();\nconst pop = usePop();\nconst present = usePresent();\nconst { presentPositionableSheet } = usePositionableSheet();\n\nconst deviceWidth = useDeviceWidth();\nconst isMobile = computed(() => deviceWidth.value < 600);\nconst wrapColumns = isMobile;\n\nconst showSelection = ref(!isMobile.value);\nconst isIOS = useIsIOS();\nconst titleSuffix = computed(() => {\n    if (props.tableObjectFetcher.totalCount === null) {\n        return '';\n    }\n\n    const count = Formatter.integer(props.tableObjectFetcher.totalCount);\n\n    if (props.tableObjectFetcher.totalFilteredCount !== null && props.tableObjectFetcher.totalFilteredCount !== props.tableObjectFetcher.totalCount) {\n        const filtered = Formatter.integer(props.tableObjectFetcher.totalFilteredCount);\n        return `${filtered} van ${count}`;\n    }\n\n    return count;\n});\n\nconst instance = getCurrentInstance();\nconst hasClickListener = computed(() => !!instance?.vnode.props?.onClick || props.Route !== null);\nconst canLeaveSelectionMode = computed(() => wrapColumns.value || !hasClickListener.value);\n\nconst sortBy = ref(props.defaultSortColumn ?? columns.value.find(c => c.allowSorting)) as Ref<Column<Value, any>>;\nconst sortDirection = ref(props.defaultSortDirection ?? SortItemDirection.ASC) as Ref<SortItemDirection>;\n\nconst values = computed(() => props.tableObjectFetcher.objects);\nconst visibleRows = ref([]) as Ref<VisibleRow<Value>[]>;\nconst searchQuery = ref('');\nconst selectedUIFilter = ref(props.filterBuilders?.length && props.defaultFilter ? props.filterBuilders[0]?.fromFilter(props.defaultFilter) : null) as Ref<null | UIFilter>;\n\nwatchEffect(() => {\n    props.tableObjectFetcher.setSearchQuery(searchQuery.value);\n    const filter = selectedUIFilter.value ? selectedUIFilter.value.build() : null;\n    props.tableObjectFetcher.setFilter(filter);\n});\n\nfunction blurFocus() {\n    (document.activeElement as HTMLElement)?.blur();\n}\n\n// If the user selects a row, we'll add it in the selectedRows. But if the user selects all rows,\n// we don't want to add them all, that would be a performance hit. So'ill invert it and only save the unselected values here.\nconst markedRows = ref(new Map<string, Value>());\nconst isRightClicking = ref(false);\nconst customFocusedRows = ref(null) as Ref<null | Set<string>>;\n\n/**\n * When true: only the marked rows are selected.\n * When false: all rows are selected, except the marked rows\n */\nconst markedRowsAreSelected = ref(true);\n\nconst isAllSelected = computed({\n    get: () => {\n        if (markedRowsAreSelected.value) {\n            return markedRows.value.size > 0 && markedRows.value.size === (props.tableObjectFetcher.totalFilteredCount ?? values.value.length);\n        }\n        else {\n            return markedRows.value.size === 0;\n        }\n    },\n    set: (selected: boolean) => {\n        markedRowsAreSelected.value = !selected;\n        markedRows.value.clear();\n\n        for (const visibleRow of visibleRows.value) {\n            visibleRow.cachedSelectionValue = selected;\n        }\n    },\n});\nconst hasSelection = computed(() => {\n    return markedRowsAreSelected.value ? markedRows.value.size > 0 : (((props.tableObjectFetcher.totalFilteredCount ?? values.value.length) - markedRows.value.size) > 0);\n});\n\nfunction setShowSelection(s: boolean) {\n    showSelection.value = s;\n    if (!s) {\n        isAllSelected.value = false;\n    }\n}\n\nconst sortedActions = computed(() => {\n    return props.actions.slice().sort((a, b) => {\n        if (a.groupIndex !== b.groupIndex) {\n            return a.groupIndex - b.groupIndex;\n        }\n        return b.priority - a.priority;\n    });\n});\n\nconst filteredActions = computed(() => {\n    let maximum = 3;\n\n    if (isIOS && isMobile.value && !showSelection.value) {\n        maximum = 1;\n    }\n\n    if (!isMobile.value || !showSelection.value) {\n        return sortedActions.value.filter(action => action.enabled && !action.singleSelection && (!action.needsSelection || action.allowAutoSelectAll)).slice(0, maximum);\n    }\n\n    return sortedActions.value.filter((action) => {\n        return action.enabled && action.needsSelection && !action.singleSelection && (!action.needsSelection || action.allowAutoSelectAll);\n    }).slice(0, maximum);\n});\n\nfunction getColumnContextMenu() {\n    return new ComponentWithProperties(ColumnSelectorContextMenu, {\n        columns: reactiveColumns,\n    });\n}\n\nfunction getSortingContextMenu() {\n    return new ComponentWithProperties(ColumnSortingContextMenu, {\n        columns: reactiveColumns,\n        sortBy: sortBy.value,\n        sortDirection: sortDirection.value,\n        setSort: (column: Column<Value, any>, direction: SortItemDirection) => {\n            sortBy.value = column;\n            sortDirection.value = direction;\n        },\n    });\n}\n\nfunction buildSelectionObject(customMarkedRows?: Value[], customMarkedRowsSelected?: boolean): TableActionSelection<Value> {\n    if (customMarkedRows === undefined) {\n        if (showSelection.value && hasSelection.value) {\n            customMarkedRows = [...markedRows.value.values()] as Value[];\n            customMarkedRowsSelected = markedRowsAreSelected.value;\n\n            // Try to invert if we already have everything in memory (optimization)\n            if (!customMarkedRowsSelected) {\n                if (props.tableObjectFetcher.totalFilteredCount === props.tableObjectFetcher.objects.length) {\n                    customMarkedRows = props.tableObjectFetcher.objects.filter(i => !markedRows.value.has(i.id));\n                    customMarkedRowsSelected = true;\n                }\n            }\n        }\n    }\n\n    if (customMarkedRows !== undefined) {\n        if (customMarkedRowsSelected === undefined) {\n            customMarkedRowsSelected = true;\n        }\n\n        const idFilter = {\n            id: {\n                $in: customMarkedRows.map(i => i.id),\n            },\n        };\n\n        const filter = customMarkedRowsSelected\n            ? idFilter\n            : (\n                    customMarkedRows.length\n                        ? mergeFilters([\n                            props.tableObjectFetcher.filter,\n                            {\n                                $not: idFilter,\n                            },\n                        ])\n                        : props.tableObjectFetcher.filter\n                );\n\n        return {\n            filter: new LimitedFilteredRequest({\n                filter,\n                sort: props.tableObjectFetcher.objectFetcher.extendSort ? props.tableObjectFetcher.objectFetcher.extendSort([...props.tableObjectFetcher.sort]) : props.tableObjectFetcher.sort,\n                limit: props.tableObjectFetcher.maxLimit,\n            }),\n            fetcher: props.tableObjectFetcher.objectFetcher,\n            markedRows: new Map(customMarkedRows.map(i => [i.id, i])),\n            markedRowsAreSelected: customMarkedRowsSelected ?? true,\n        };\n    }\n\n    // Optimization:\n    // Do we have everything in memory already?\n    if (props.tableObjectFetcher.totalFilteredCount === props.tableObjectFetcher.objects.length) {\n        return {\n            filter: new LimitedFilteredRequest({\n                filter: props.tableObjectFetcher.filter,\n                sort: props.tableObjectFetcher.objectFetcher.extendSort ? props.tableObjectFetcher.objectFetcher.extendSort([...props.tableObjectFetcher.sort]) : props.tableObjectFetcher.sort,\n                limit: props.tableObjectFetcher.maxLimit,\n                search: props.tableObjectFetcher.searchQuery,\n            }),\n            fetcher: props.tableObjectFetcher.objectFetcher,\n            cachedAllValues: props.tableObjectFetcher.objects,\n            markedRows: new Map(),\n            markedRowsAreSelected: null,\n        };\n    }\n\n    return {\n        filter: new LimitedFilteredRequest({\n            filter: props.tableObjectFetcher.filter,\n            sort: props.tableObjectFetcher.objectFetcher.extendSort ? props.tableObjectFetcher.objectFetcher.extendSort([...props.tableObjectFetcher.sort]) : props.tableObjectFetcher.sort,\n            limit: props.tableObjectFetcher.maxLimit,\n            search: props.tableObjectFetcher.searchQuery,\n        }),\n        fetcher: props.tableObjectFetcher.objectFetcher,\n        markedRows: new Map(),\n        markedRowsAreSelected: null,\n    };\n}\n\nasync function showActions(isOnTop: boolean, event: MouseEvent) {\n    const el = event.currentTarget as HTMLElement;\n    const bounds = el.getBoundingClientRect();\n\n    const actions = (isMobile.value && showSelection.value ? props.actions.filter(a => a.needsSelection) : props.actions.slice());\n\n    // Also add select all actions\n    if (!showSelection.value) {\n        // Add select action\n        actions.push(new AsyncTableAction({\n            name: 'Selecteer',\n            groupIndex: -1,\n            priority: 10,\n            needsSelection: false,\n            handler: () => {\n                showSelection.value = true;\n            },\n        }));\n    }\n\n    // Add select all action\n    if (!isAllSelected.value) {\n        actions.push(new AsyncTableAction({\n            name: 'Selecteer alles',\n            groupIndex: -1,\n            priority: 9,\n            needsSelection: false,\n            handler: () => {\n                showSelection.value = true;\n                isAllSelected.value = true;\n            },\n        }));\n    }\n    else {\n        actions.push(new AsyncTableAction({\n            name: 'Deselecteer alles',\n            groupIndex: -1,\n            priority: 9,\n            needsSelection: false,\n            handler: () => {\n                isAllSelected.value = false;\n            },\n        }));\n    }\n\n    // Add action to change visible columns\n    actions.push(new MenuTableAction({\n        name: wrapColumns.value ? 'Wijzig zichtbare gegevens' : 'Wijzig kolommen',\n        groupIndex: -1,\n        priority: 8,\n        childMenu: getColumnContextMenu(),\n    }));\n\n    actions.push(new MenuTableAction({\n        name: 'Sorteren',\n        groupIndex: -1,\n        priority: 7,\n        childMenu: getSortingContextMenu(),\n    }));\n\n    const displayedComponent = new ComponentWithProperties(TableActionsContextMenu, {\n        x: bounds.right,\n        y: bounds.top + (isOnTop ? el.offsetHeight : 0),\n        xPlacement: 'left',\n        yPlacement: isOnTop ? 'bottom' : 'top',\n        actions,\n        selection: buildSelectionObject(),\n    });\n    await present(displayedComponent.setDisplayStyle('overlay'));\n}\n\nasync function onTableHeadRightClick(event: MouseEvent) {\n    // Show a context menu to select the available columns\n    const displayedComponent = getColumnContextMenu();\n    displayedComponent.properties.x = event.clientX;\n    displayedComponent.properties.y = event.clientY;\n    await present(displayedComponent.setDisplayStyle('overlay'));\n}\n\nconst errorMessage = computed(() => {\n    if (props.tableObjectFetcher.errorState) {\n        const errors = props.tableObjectFetcher.errorState;\n\n        let simpleErrors!: SimpleErrors;\n        if (isSimpleError(errors)) {\n            simpleErrors = new SimpleErrors(errors);\n        }\n        else if (isSimpleErrors(errors)) {\n            simpleErrors = errors;\n        }\n        else {\n            simpleErrors = new SimpleErrors(new SimpleError({\n                code: 'unknown_error',\n                message: errors.message,\n            }));\n        }\n\n        return simpleErrors.getHuman();\n    }\n\n    return null;\n});\n\nconst lastRefresh = ref(new Date());\nfunction refresh() {\n    lastRefresh.value = new Date();\n    props.tableObjectFetcher.reset(true, true);\n}\n\nconst lastFilteredCount = ref(null) as Ref<number | null>;\n\n// the provisional total items used to calculate / update the visible rows when the total filtered count was not yet available\nlet cachedProvisionalTotalItems: number | null = null;\n\nwatchEffect(() => {\n    if (props.tableObjectFetcher.totalFilteredCount !== null) {\n        lastFilteredCount.value = props.tableObjectFetcher.totalFilteredCount;\n    }\n});\n\n// if the visible rows had been updated before the total filtered count was available, update them again if necessary\nwatch(() => props.tableObjectFetcher.totalFilteredCount, (totalFilteredCount: number | null) => {\n    if (cachedProvisionalTotalItems === null || totalFilteredCount === null) {\n        return;\n    }\n\n    // no need to update visible rows if the cached provisional total items is the same as the eventual total filtered count\n    if (totalFilteredCount === cachedProvisionalTotalItems\n    // if the cached total items is high, an update is not necessary because it will be updated on scroll anyways\n        || cachedProvisionalTotalItems > 200\n    ) {\n        cachedProvisionalTotalItems = null;\n        return;\n    }\n\n    console.log('Total filtered count changed after update visible rows. Updating visible rows again...');\n    updateVisibleRows();\n});\n\nconst totalFilteredCount = computed(() => {\n    if (errorMessage.value) {\n        return 0;\n    }\n    return props.tableObjectFetcher.totalFilteredCount ?? lastFilteredCount.value ?? Math.max(1, props.estimatedRows ?? 30);\n});\nconst totalItemsCount = computed(() => props.tableObjectFetcher.totalCount);\n\nfunction resetFilter() {\n    searchQuery.value = '';\n    selectedUIFilter.value = null;\n}\n\nconst isColumnDragActive = ref(false);\n\n// Column drag helpers:\nconst isDraggingColumn = ref(null) as Ref<Column<any, any> | null>;\nlet draggingStartX = 0;\nlet draggingInitialWidth = 0;\nlet draggingInitialColumns: Column<any, any>[] = [];\nconst dragType = ref('width') as Ref<'width' | 'order'>;\n\nfunction toggleSort(column: Column<any, any>) {\n    if (isColumnDragActive.value) {\n        // console.log(\"Ignored sort toggle due to drag\")\n        return;\n    }\n    if (column.allowSorting === false) {\n        return;\n    }\n    if (sortBy.value === column) {\n        if (sortDirection.value === SortItemDirection.ASC) {\n            sortDirection.value = SortItemDirection.DESC;\n        }\n        else {\n            sortDirection.value = SortItemDirection.ASC;\n        }\n    }\n    else {\n        sortBy.value = column;\n    }\n    saveColumnConfiguration();\n}\n\nwatchEffect(() => {\n    props.tableObjectFetcher.setSort([\n        {\n            key: sortBy.value.id,\n            order: sortDirection.value,\n        },\n    ]);\n});\n\nconst hiddenItemsCount = computed(() => {\n    if (props.tableObjectFetcher.totalCount === null || props.tableObjectFetcher.totalFilteredCount === null) {\n        return 0;\n    }\n    return props.tableObjectFetcher.totalCount - props.tableObjectFetcher.totalFilteredCount;\n});\n\nconst filteredText = computed(() => {\n    return props.tableObjectFetcher.totalFilteredCount !== null ? Formatter.integer(props.tableObjectFetcher.totalFilteredCount) : '';\n});\n\nfunction getEventX(event: any) {\n    let x = 0;\n    if (event.changedTouches) {\n        const touches = event.changedTouches;\n        for (const touch of touches) {\n            x = touch.pageX;\n        }\n    }\n    else {\n        x = event.pageX;\n    }\n    return x;\n}\n\nconst emit = defineEmits<{\n    click: [value: Value];\n}>();\n\nasync function onClickRow(row: VisibleRow<Value>, event: MouseEvent) {\n    if (event.metaKey || event.ctrlKey) {\n        // Multi select rows\n        setSelectionValue(row, !getSelectionValue(row));\n        return;\n    }\n\n    if (!hasClickListener.value || (wrapColumns.value && showSelection.value)) {\n        // On mobile, tapping a column means selecting it when we are in editing modus\n        setSelectionValue(row, !getSelectionValue(row));\n        return;\n    }\n\n    if (props.Route && row.value) {\n        await $navigate(Routes.Object, {\n            properties: getPropertiesForRoute(row.value),\n        });\n        return;\n    }\n\n    if (hasClickListener.value && row.value) {\n        emit('click', row.value);\n    }\n}\n\nasync function onRightClickRow(row: VisibleRow<Value>, event: MouseEvent | TouchEvent) {\n    if (!row.value) {\n        return;\n    }\n\n    if (isMobile.value && !showSelection.value && !isIOS) {\n        // On Android, the default long press action is switching to editing mode\n        setSelectionValue(row, true);\n        setShowSelection(true);\n        return;\n    }\n\n    isRightClicking.value = true;\n    const filteredActions = props.actions.filter(a => a.needsSelection);\n    let selection: TableActionSelection<Value>;\n\n    if (row.cachedSelectionValue && showSelection.value) {\n        // Use full selection\n        selection = buildSelectionObject();\n\n        filteredActions.push(new AsyncTableAction({\n            name: 'Deselecteer',\n            groupIndex: 1,\n            priority: 10,\n            handler: () => {\n                // Clear selection\n                isAllSelected.value = false;\n            },\n        }));\n\n        customFocusedRows.value = null;\n    }\n    else {\n        selection = buildSelectionObject([row.value!], true);\n\n        // Only focus this row\n        // Add select action\n        filteredActions.push(new AsyncTableAction({\n            name: 'Selecteer',\n            groupIndex: !showSelection.value ? -1 : 1,\n            priority: 10,\n            handler: () => {\n                setSelectionValue(row, true);\n                setShowSelection(true);\n            },\n        }));\n\n        customFocusedRows.value = new Set([row.value.id]);\n    }\n\n    // Show a context menu to select the available columns\n    const displayedComponent = new ComponentWithProperties(TableActionsContextMenu, {\n        x: 'changedTouches' in event ? event.changedTouches[0].pageX : event.clientX,\n        y: 'changedTouches' in event ? event.changedTouches[0].pageY : event.clientY,\n        actions: filteredActions,\n        onDismiss: () => {\n            isRightClicking.value = false;\n        },\n        selection,\n    });\n\n    await present(displayedComponent.setDisplayStyle('overlay'));\n}\n\nfunction columnDragStart(event: MouseEvent | TouchEvent, column: Column<any, any>) {\n    // Don't allow drag with right mouse or other buttons\n    if ('button' in event) {\n        if (event.button !== 0) {\n            return;\n        }\n        if (event.button === 0 && (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey)) {\n            // Don't allow drag with ctrl+click\n            return;\n        }\n    }\n    draggingStartX = getEventX(event);\n    isDraggingColumn.value = column;\n    dragType.value = 'order';\n    draggingInitialColumns = columns.value.slice() as Column<any, any>[];\n    isColumnDragActive.value = false;\n    attachDragHandlers();\n}\n\nfunction handleDragStart(event: MouseEvent | TouchEvent, column: Column<any, any>) {\n    // Don't allow drag with right mouse or other buttons\n    if ('button' in event) {\n        if (event.button !== 0) {\n            return;\n        }\n        if (event.button === 0 && (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey)) {\n            // Don't allow drag with ctrl+click\n            return;\n        }\n    }\n\n    draggingStartX = getEventX(event);\n    isDraggingColumn.value = column;\n    dragType.value = 'width';\n    draggingInitialWidth = column.width ?? 0;\n    isColumnDragActive.value = false;\n    attachDragHandlers();\n}\n\nconst horizontalPadding = ref(40);\nconst tableElement = ref(null) as Ref<HTMLElement | null>;\nconst tableBody = ref(null) as Ref<HTMLElement | null>;\nconst canCollapse = ref(false);\n\nconst selectionColumnWidth = computed(() => {\n    return showSelection.value ? (wrapColumns.value ? 40 : 50) : 0;\n});\n\nconst totalWidth = computed(() => {\n    const leftPadding = horizontalPadding.value;\n    const rightPadding = horizontalPadding.value;\n    return selectionColumnWidth.value + columns.value.reduce((acc, col) => acc + (col.width ?? 0), 0) + leftPadding + rightPadding;\n});\n\nfunction updatePaddingIfNeeded() {\n    if (horizontalPadding.value === 0) {\n        updatePadding();\n    }\n}\n\nfunction updatePadding() {\n    if (!tableElement.value) {\n        return;\n    }\n    const padding = getComputedStyle(tableElement.value)\n        .getPropertyValue('--st-horizontal-padding');\n\n    horizontalPadding.value = parseInt(padding);\n}\n\nfunction attachDragHandlers() {\n    updateRecommendedWidths();\n\n    if (isColumnDragActive.value) {\n        if (tableElement.value) {\n            tableElement.value.style.cursor = dragType.value === 'width' ? 'col-resize' : 'grabbing';\n        }\n    }\n    document.addEventListener('mousemove', mouseMove, {\n        passive: false,\n    });\n    document.addEventListener('touchmove', mouseMove, {\n        passive: false,\n    });\n\n    document.addEventListener('mouseup', mouseUp, { passive: false });\n    document.addEventListener('touchend', mouseUp, { passive: false });\n}\n\nfunction detachDragHandlers() {\n    if (tableElement.value) {\n        tableElement.value.style.cursor = '';\n    }\n\n    document.removeEventListener('mousemove', mouseMove);\n    document.removeEventListener('touchmove', mouseMove);\n\n    document.removeEventListener('mouseup', mouseUp);\n    document.removeEventListener('touchend', mouseUp);\n\n    saveColumnConfiguration();\n}\n\nfunction mouseMove(event: MouseEvent | TouchEvent) {\n    if (!isDraggingColumn.value) {\n        return;\n    }\n    const currentX = getEventX(event);\n    const difference = currentX - draggingStartX;\n\n    if (!isColumnDragActive.value) {\n        if (Math.abs(difference) > 5) {\n            isColumnDragActive.value = true;\n            if (tableElement.value) {\n                tableElement.value.style.cursor = dragType.value === 'width' ? 'col-resize' : 'grabbing';\n            }\n        }\n        else {\n            return;\n        }\n    }\n\n    if (dragType.value === 'width') {\n        const currentWidth = totalWidth.value;\n\n        const newWidth = draggingInitialWidth + difference;\n        isDraggingColumn.value.width = Math.max(newWidth, isDraggingColumn.value.minimumWidth);\n        isDraggingColumn.value.renderWidth = Math.floor(isDraggingColumn.value.width);\n\n        updateColumnWidth(isDraggingColumn.value, 'move', currentWidth);\n    }\n    else {\n        // We swap columns if the startX of the column moves over the middle of a different column\n        // Calculate how many columns we have moved in the X direction\n        const startIndex = draggingInitialColumns.findIndex(c => c.id === isDraggingColumn.value?.id);\n        let columnMoveIndex = 0;\n        let remainingDifference = difference;\n        while (Math.sign(remainingDifference) === Math.sign(difference)) {\n            const shouldMove = (remainingDifference < 0) ? -1 : 1;\n            const column = draggingInitialColumns[startIndex + shouldMove + columnMoveIndex];\n            if (!column || column.width === null) {\n                break;\n            }\n            // Move the column if they overlap at least 50%\n            const neededMove = column.width / 2;\n            if (Math.abs(remainingDifference) > neededMove) {\n                remainingDifference -= column.width * shouldMove;\n                columnMoveIndex += shouldMove;\n            }\n            else {\n                break;\n            }\n        }\n\n        const columns = draggingInitialColumns.slice();\n        columns.splice(startIndex, 1);\n        columns.splice(startIndex + columnMoveIndex, 0, isDraggingColumn.value);\n\n        // Update indexes\n        for (let i = 0; i < columns.length; i++) {\n            columns[i].index = i;\n        }\n\n        // Translate moving column with mouse\n        tableElement.value?.style.setProperty('--drag-x', `${remainingDifference}px`);\n    }\n\n    // Prevent scrolling (on mobile) and other stuff\n    event.preventDefault();\n    return false;\n}\n\nfunction mouseUp() {\n    if (isDraggingColumn.value) {\n        detachDragHandlers();\n        isDraggingColumn.value = null;\n    }\n    isColumnDragActive.value = false;\n}\n\nonMounted(() => {\n    loadColumnConfiguration().catch(console.error);\n\n    if (tableElement.value) {\n        getScrollElement(tableElement.value).addEventListener('scroll', onScroll, { passive: true });\n    }\n\n    if (!canLeaveSelectionMode.value) {\n        showSelection.value = true;\n    }\n\n    addListeners();\n});\n\nlet listenersAdded = false;\nfunction addListeners() {\n    if (listenersAdded) {\n        return;\n    }\n    listenersAdded = true;\n    if (!wrapColumns.value) {\n        window.addEventListener('resize', onResize, { passive: true });\n        onResize();\n    }\n}\n\nfunction removeListeners() {\n    listenersAdded = false;\n    // Better to remove event resize listener, because on resize, we don't need to rerender the table\n    window.removeEventListener('resize', onResize);\n}\n\n//\nonActivated(() => {\n    addListeners();\n});\n\nonDeactivated(() => {\n    removeListeners();\n});\n\nuseVisibilityChange(() => {\n    doRefresh();\n});\n\nonBeforeUnmount(() => {\n    // Remove event listeners\n    if (tableElement.value) {\n        getScrollElement(tableElement.value)?.removeEventListener('scroll', onScroll);\n    }\n\n    removeListeners();\n    props.tableObjectFetcher.destroy();\n});\n\nfunction doRefresh() {\n    if (document.visibilityState === 'visible') {\n        refresh();\n    }\n}\n\nlet ticking = false;\nfunction onScroll() {\n    if (!ticking) {\n        window.requestAnimationFrame(() => {\n            updateVisibleRows();\n            ticking = false;\n        });\n\n        ticking = true;\n    }\n}\n\nfunction onResize() {\n    console.log('Resize');\n    // Force padding update\n    updatePadding();\n\n    /* if (canCollapse.value) {\n        // Keep existing width\n        updateCanCollapse();\n    }\n    else { */\n    // shrink or grow width\n    updateColumnWidth();\n    // }\n    updateVisibleRows();\n}\n\n//\nasync function loadColumnConfiguration() {\n    try {\n        const json = await Storage.keyValue.getItem('column-configuration-' + props.columnConfigurationId);\n        if (json !== null) {\n            const parsed = new ObjectData(JSON.parse(json), { version: Version });\n            const decoded = (new VersionBoxDecoder(ColumnConfiguration as Decoder<ColumnConfiguration>).decode(parsed)).data;\n\n            for (const col of reactiveColumns) {\n                const i = decoded.columns.findIndex(c => c.id === col.id);\n                if (i === -1) {\n                    col.enabled = false;\n                }\n                else {\n                    const config = decoded.columns[i];\n                    col.enabled = true;\n                    col.width = config.width;\n                    col.renderWidth = Math.floor(col.width);\n                    col.index = i;\n                }\n            }\n\n            if (decoded.sortColumnId) {\n                const _sort = reactiveColumns.find(c => c.id === decoded.sortColumnId);\n                if (_sort) {\n                    sortBy.value = _sort;\n                    sortDirection.value = decoded.sortDirection ?? SortItemDirection.ASC;\n                }\n            }\n\n            updateVisibleRows();\n            updateRecommendedWidths();\n\n            updateColumnWidth();\n        }\n        else {\n            updateVisibleRows();\n            updateRecommendedWidths();\n            updateColumnWidth();\n        }\n    }\n    catch (error) {\n        console.error(error);\n    }\n}\n\nwatch(columns, () => {\n    updateVisibleRows();\n\n    if (canCollapse.value) {\n        // Update width of new columns, without adjusting the width of any column\n        fixColumnWidths(columns.value as any);\n        updateCanCollapse();\n\n        if (!canCollapse.value) {\n            // Redistribute\n            updateColumnWidth();\n        }\n    }\n    else {\n        updateColumnWidth();\n    }\n    saveColumnConfiguration();\n});\n\nfunction saveColumnConfiguration() {\n    const configuration = ColumnConfiguration.create({\n        // We also need to saveh  te prefix column\n        columns: [...columns.value, ...(showPrefix.value ? [props.prefixColumn!] : [])].map(c => EnabledColumnConfiguration.create({ id: c.id, width: c.width ?? 0 })),\n        canCollapse: canCollapse.value,\n        sortColumnId: sortBy.value.id,\n        sortDirection: sortDirection.value,\n    });\n\n    const versionBox = new VersionBox(configuration);\n    const json = JSON.stringify(versionBox.encode({ version: Version }));\n    Storage.keyValue.setItem('column-configuration-' + props.columnConfigurationId, json).catch(console.error);\n}\n\n/**\n * Loop all visible rows, and sets the recommended width of each column to the maximum width of the column.\n */\nfunction updateRecommendedWidths() {\n    // console.log(\"Update recommended width\")\n    const measureDiv = document.createElement('div');\n    measureDiv.style.position = 'absolute';\n    measureDiv.style.visibility = 'hidden';\n    measureDiv.className = 'table-column-content-style';\n    document.body.appendChild(measureDiv);\n\n    for (const column of columns.value) {\n        let maximum = column.minimumWidth;\n\n        // Title\n        const text = column.name;\n        measureDiv.innerText = text;\n        const width = measureDiv.clientWidth;\n        if (width > maximum) {\n            maximum = width;\n        }\n        let found = false;\n\n        for (const visibleRow of visibleRows.value) {\n            const value = visibleRow.value;\n\n            if (!value) {\n                continue;\n            }\n            found = true;\n\n            const text = column.getFormattedValue(value);\n\n            measureDiv.innerText = text;\n            const width = measureDiv.clientWidth;\n            if (width > maximum) {\n                maximum = width;\n            }\n        }\n\n        // Also add some padding\n        if (found) {\n            column.recommendedWidth = maximum + 15;\n        }\n    }\n\n    document.body.removeChild(measureDiv);\n}\n\nfunction fixColumnWidths(columns: Column<any, any>[]) {\n    // First fix columns without width and update distributeWidth accordongly, because this can change the sign whether we need to grow or shrink the other columns\n    // Also update columns that are smaller than the minimumWidth\n    let distributeWidth = 0;\n    for (const col of columns) {\n        if (col.renderWidth === null && col.width !== null) {\n            col.renderWidth = Math.floor(col.width);\n        }\n        if (col.width === null || col.width === 0) {\n            col.width = col.recommendedWidth;\n            distributeWidth -= col.recommendedWidth;\n            col.renderWidth = Math.floor(col.width);\n        }\n\n        if (col.width < col.minimumWidth) {\n            distributeWidth -= col.minimumWidth - col.width;\n            col.width = col.minimumWidth;\n            col.renderWidth = Math.floor(col.width);\n        }\n    }\n    return distributeWidth;\n}\n//\n/**\n * Update the width of the columns by distributing the available width across the columns, except the ignored column (optional)\n */\nfunction updateColumnWidth(afterColumn: Column<any, any> | null = null, strategy: 'grow' | 'move' = 'grow', forceWidth: number | null = null) {\n    updatePaddingIfNeeded();\n    // console.log(\"Update column width\")\n\n    if (wrapColumns.value) {\n        return;\n    }\n\n    if (!tableElement.value) {\n        return;\n    }\n\n    const leftPadding = horizontalPadding.value;\n    const rightPadding = horizontalPadding.value;\n\n    const availableWidth = (forceWidth ?? tableElement.value.clientWidth) - selectionColumnWidth.value - leftPadding - rightPadding;\n\n    if (isNaN(availableWidth) || availableWidth <= 0) {\n        console.warn('Available width is NaN or <= 0');\n        return;\n    }\n    const currentWidth = columns.value.reduce((acc, col) => acc + (col.width ?? 0), 0);\n    let distributeWidth = availableWidth - currentWidth;\n\n    const affectedColumns = afterColumn ? columns.value.slice(columns.value.findIndex(c => c === afterColumn) + 1) : columns.value;\n\n    // First fix columns without width and update distributeWidth accordongly, because this can change the sign whether we need to grow or shrink the other columns\n    // Also update columns that are smaller than the minimumWidth\n    distributeWidth += fixColumnWidths(affectedColumns);\n\n    if (strategy === 'grow') {\n        // Get columns with the highest priority for shrinking or growing\n        // growing: the ones with a width lower than the recommendedWidth\n        // shrinking: the ones with a width higher than the recommendedWidth\n\n        const shrinking = distributeWidth < 0;\n\n        const columnPriorities: ((col: Column<any, any>) => boolean)[] = shrinking ? [\n            // First, shrink all the columns that are larger than the recommendedWidth\n            c => c.width !== null && c.width > c.recommendedWidth,\n\n            // At last, only shrink columns larger than the minimum width\n            c => c.width !== null && c.width > c.minimumWidth,\n        ] : [\n            // First grow all the columns that are smaller than the recommendedWidth\n            c => c.width !== null && c.width < c.minimumWidth,\n            c => c.width !== null && c.width < c.recommendedWidth,\n\n            // Grow only columns that have grow = true (unless none of the columns have grow = true, in which case this step is skipped automatically)\n            c => c.width !== null && c.grow === true,\n\n            // At last, grow any column, exept when they don't have width yet\n            c => c.width !== null,\n        ];\n\n        const columnLimits: { minimum?: (col: Column<any, any>) => number; maximum?: (col: Column<any, any>) => number }[] = shrinking ? [\n            { minimum: c => c.recommendedWidth },\n            { minimum: c => c.minimumWidth },\n        ] : [\n            { maximum: c => c.minimumWidth }, // Grow to recommended size and continue to next step\n            { maximum: c => c.recommendedWidth }, // Grow to recommended size and continue to next step\n            { },\n            { },\n        ];\n\n        let columnPriorityIndex = 0;\n\n        let columns = affectedColumns; // use same type, and don't allocate a new array because we'll override it shortly\n\n        // console.log(\"Current column configuration\", columns.map(c => c.name+\" (\"+c.renderWidth+\")\"))\n\n        const updateColumns = () => {\n            columns = affectedColumns.filter(c => columnPriorities[columnPriorityIndex](c));\n        };\n        updateColumns();\n\n        while (distributeWidth !== 0 && (columns.length > 0 || columnPriorityIndex < columnPriorities.length - 1)) {\n            if (columns.length === 0) {\n                columnPriorityIndex++;\n\n                updateColumns();\n                // console.log(\"Moving to columnPriorityIndex\", columnPriorityIndex)\n                // console.log(\"Current column configuration\", columns.map(c => c.name+\" (\"+c.renderWidth+\")\"))\n\n                // Check loop conditions again, and if needed, jump to the next priority or start distributing\n                continue;\n            }\n\n            // Always try to grow with rounded numbers, because else we'll get rounding errors\n            let change = Math.round(distributeWidth / columns.length);\n\n            if (Math.abs(change) < 1) {\n                // Make sure change is never zero, or we'll have an infinite loop\n                change = Math.sign(distributeWidth);\n            }\n\n            // console.log(\"Distributing columns \", change, \"px\", \"of\", distributeWidth, \"px\")\n\n            // We'll make sure we never grow or shrink more than the distribute width\n\n            for (const col of columns) {\n                if (col.width === null) {\n                    throw new Error('Impossible. Typescript type checking error');\n                }\n\n                const start = col.width;\n\n                if ((shrinking && change < distributeWidth) || (!shrinking && change > distributeWidth)) {\n                    // Prevent growing more than the distributeWidth\n                    // console.log(\"Limited change to distributeWidth\", change, distributeWidth)\n                    change = distributeWidth;\n                }\n\n                col.width += change;\n\n                // A column can never shrink more than its recommended width, or it's start width, if that was already smaller (only in case of minimum)\n                const limits = columnLimits[columnPriorityIndex];\n\n                const min = limits.minimum ? Math.min(start, limits.minimum(col)) : undefined;\n                const max = limits.maximum ? Math.max(start, limits.maximum(col)) : undefined;\n\n                if (min !== undefined && col.width <= min) {\n                    // we hit the minimum width, so we need to distribute the width that we couldn't absorb\n                    col.width = min;\n                    // console.log(\"Column\", col.name, \"absorbed\", absorbed, \"of\", change, \"and is now at it's minimum\", col.width)\n                }\n                else if (max !== undefined && col.width >= max) {\n                    // we hit the minimum width, so we need to distribute the width that we couldn't absorb\n                    col.width = max;\n                    //\n                }\n\n                const absorbed = col.width - start;\n                distributeWidth -= absorbed;\n                // console.log(\"Column\", col.name, \"absorbed\", absorbed, \"of\", change, \"and is now at \", col.width)\n                col.renderWidth = Math.floor(col.width);\n            }\n\n            // Update columns\n            updateColumns();\n        }\n\n        // console.log(\"Done distributing with distributeWidth left: \", distributeWidth)\n    }\n    else {\n        // shrink or grow all following columns, until the recommended width is reached (when shrinking) and jump to the next one\n\n        for (const column of affectedColumns) {\n            if (column.width === null) {\n                continue;\n            }\n\n            if (distributeWidth < 0) {\n                if (column.width > column.recommendedWidth) {\n                    const shrinkAmount = Math.min(-distributeWidth, column.width - column.recommendedWidth);\n                    column.width -= shrinkAmount;\n                    column.renderWidth = Math.floor(column.width);\n                    distributeWidth += shrinkAmount;\n\n                    if (distributeWidth >= 0) {\n                        break;\n                    }\n                }\n            }\n            else {\n                column.width += distributeWidth;\n                column.renderWidth = Math.floor(column.width);\n                distributeWidth = 0;\n                break;\n            }\n        }\n\n        // Now same with minimum\n        for (const column of affectedColumns) {\n            if (column.width === null) {\n                continue;\n            }\n\n            if (distributeWidth < 0) {\n                if (column.width > column.minimumWidth) {\n                    const shrinkAmount = Math.min(-distributeWidth, column.width - column.minimumWidth);\n                    column.width -= shrinkAmount;\n                    column.renderWidth = Math.floor(column.width);\n                    distributeWidth += shrinkAmount;\n\n                    if (distributeWidth >= 0) {\n                        break;\n                    }\n                }\n            }\n            else {\n                column.width += distributeWidth;\n                column.renderWidth = Math.floor(column.width);\n                distributeWidth = 0;\n                break;\n            }\n        }\n\n        // Ignore remaining\n        if (distributeWidth !== 0) {\n            // Add back to afterColumn\n            if (afterColumn && afterColumn.width !== null) {\n                afterColumn.width += distributeWidth;\n                afterColumn.renderWidth = Math.floor(afterColumn.width);\n\n                updateColumnWidth(null, 'grow');\n            }\n        }\n    }\n\n    updateCanCollapse();\n}\n\nfunction updateCanCollapse() {\n    /* updatePaddingIfNeeded();\n\n    if (wrapColumns.value) {\n        return;\n    }\n    if (!tableElement.value) {\n        return;\n    }\n    const n = canCollapse.value;\n    canCollapse.value = Math.floor(totalWidth.value) > Math.floor(tableElement.value.clientWidth);\n\n    if (n !== canCollapse.value) {\n        saveColumnConfiguration();\n    } */\n}\n\nfunction collapse() {\n    updateColumnWidth(null, 'grow');\n    saveColumnConfiguration();\n}\n\nconst totalRenderWidth = computed(() => {\n    const leftPadding = horizontalPadding.value;\n    const rightPadding = horizontalPadding.value;\n    return selectionColumnWidth.value + columns.value.reduce((acc, col) => acc + (col.renderWidth ?? 0), 0) + leftPadding + rightPadding;\n});\n\nconst gridTemplateColumns = computed(() => {\n    return columns.value.map(col => `${(col.renderWidth ?? 0)}px`).join(' ');\n});\n\nwatchEffect(() => {\n    if (!wrapColumns.value) {\n        tableElement.value?.style.setProperty('--table-columns', gridTemplateColumns.value);\n    }\n});\n\nconst canFilter = computed(() => {\n    return !!props.filterBuilders;\n});\n\nasync function editFilter(event: MouseEvent) {\n    if (!props.filterBuilders) {\n        return;\n    }\n    const filter = selectedUIFilter.value ?? props.filterBuilders[0].create();\n    if (!selectedUIFilter.value) {\n        selectedUIFilter.value = filter;\n    }\n\n    await presentPositionableSheet(event, {\n        components: [\n            new ComponentWithProperties(NavigationController, {\n                root: new ComponentWithProperties(UIFilterEditor, {\n                    filter,\n                }),\n            }),\n        ],\n    });\n}\n\nfunction isValueSelected(value: Value) {\n    const found = markedRows.value.has(value.id);\n\n    if (markedRowsAreSelected.value) {\n        return found;\n    }\n    else {\n        return !found;\n    }\n}\n\nfunction isRowFocused(row: VisibleRow<Value>) {\n    if (!isRightClicking.value) {\n        return false;\n    }\n\n    if (customFocusedRows.value !== null) {\n        if (!row.value) {\n            return false;\n        }\n        return customFocusedRows.value.has(row.value.id);\n    }\n\n    return row.cachedSelectionValue;\n}\n\nfunction getSelectionValue(row: VisibleRow<Value>) {\n    const value = row.value;\n    if (!value) {\n        return isAllSelected.value;\n    }\n\n    return isValueSelected(value);\n}\n\nfunction setSelectionValue(row: VisibleRow<Value>, selected: boolean) {\n    const value = row.value;\n    if (!value) {\n        return;\n    }\n    if (selected) {\n        if (markedRowsAreSelected.value) {\n            markedRows.value.set(value.id, value);\n        }\n        else {\n            markedRows.value.delete(value.id);\n        }\n    }\n    else {\n        if (!markedRowsAreSelected.value) {\n            markedRows.value.set(value.id, value);\n        }\n        else {\n            markedRows.value.delete(value.id);\n        }\n    }\n\n    row.cachedSelectionValue = selected;\n}\n\nfunction getExpectedSelectionLength(): number {\n    if (!showSelection.value || !hasSelection.value) {\n        return props.tableObjectFetcher.totalFilteredCount ?? values.value.length ?? 0;\n    }\n\n    if (markedRowsAreSelected.value) {\n        return markedRows.value.size;\n    }\n    else {\n        return (props.tableObjectFetcher.totalFilteredCount ?? values.value.length ?? 0) - markedRows.value.size;\n    }\n}\n\nasync function handleAction(action: TableAction<Value>, event: MouseEvent) {\n    if (action.needsSelection && getExpectedSelectionLength() === 0) {\n        return;\n    }\n\n    const selection: TableActionSelection<Value> = buildSelectionObject();\n\n    if (action.hasChildActions) {\n        const el = event.currentTarget as HTMLElement;\n        const bounds = el.getBoundingClientRect();\n        const isOnTop = !(isIOS && isMobile.value);\n\n        const displayedComponent = new ComponentWithProperties(TableActionsContextMenu, {\n            x: bounds.left,\n            y: isOnTop ? bounds.bottom : bounds.top,\n            xPlacement: 'right',\n            yPlacement: isOnTop ? 'bottom' : 'top',\n            actions: action.getChildActions(),\n            selection,\n        });\n        await present(displayedComponent.setDisplayStyle('overlay'));\n        return;\n    }\n\n    action.handle(selection)?.catch((e) => {\n        console.error(e);\n        Toast.fromError(e).show();\n    });\n}\n\nwatch(values, () => {\n    console.log('Detected objects changed');\n    for (const visibleRow of visibleRows.value) {\n        // has this row changed and should it now display a different value? -> clear it and mark it for reuse\n        if (visibleRow.currentIndex !== null && (visibleRow.currentIndex >= values.value.length || visibleRow.value !== values.value[visibleRow.currentIndex])) {\n            // Mark this row to be reused\n            visibleRow.value = null;\n            visibleRow.currentIndex = null;\n        }\n    }\n\n    // Update all rows\n    updateVisibleRows();\n    updateRecommendedWidths();\n}, { deep: true });\n\nfunction getScrollElement(element: HTMLElement): HTMLElement {\n    const style = window.getComputedStyle(element);\n    if (\n        style.overflowY === 'scroll'\n        || style.overflow === 'scroll'\n        || style.overflow === 'auto'\n        || style.overflowY === 'auto'\n        // Windows fix\n        || style.overflow === 'overlay'\n        || style.overflowY === 'overlay'\n    ) {\n        return element;\n    }\n    else {\n        if (!element.parentElement) {\n            return document.documentElement;\n        }\n        return getScrollElement(element.parentElement);\n    }\n}\n\nlet cachedScrollElement: HTMLElement | null = null;\nlet cachedTableYPosition: number | null = 0;\n\nfunction updateVisibleRows() {\n    if (!tableElement.value) {\n        return;\n    }\n\n    let topOffset = 0;\n\n    const scrollElement = cachedScrollElement ?? getScrollElement(tableElement.value);\n    cachedScrollElement = scrollElement;\n\n    // innerHeight is a fix for animations, causing wrong initial bounding client rect\n    if (!cachedTableYPosition || cachedTableYPosition > window.innerHeight) {\n        if (!tableBody.value) {\n            return;\n        }\n\n        const rect = tableBody.value.getBoundingClientRect();\n\n        const top = rect.top;\n        cachedTableYPosition = top + scrollElement.scrollTop;\n    }\n\n    // During animations, the scrollTop often jumps temporarily to a negative value\n    topOffset = Math.max(0, (scrollElement.scrollTop - cachedTableYPosition));\n\n    let totalItems: number;\n\n    if (props.tableObjectFetcher.totalFilteredCount !== null) {\n        totalItems = props.tableObjectFetcher.totalFilteredCount;\n        cachedProvisionalTotalItems = null;\n    }\n    else if (lastFilteredCount.value !== null) {\n        totalItems = lastFilteredCount.value;\n        cachedProvisionalTotalItems = totalItems;\n    }\n    else {\n        totalItems = totalFilteredCount.value;\n        cachedProvisionalTotalItems = null;\n    }\n\n    const extraItems = 5;\n\n    const firstVisibleItemIndex = Math.max(0, Math.min(Math.floor(topOffset / rowHeight.value) - extraItems, totalItems - 1));\n\n    const vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);\n\n    const unBoundedLastVisibleItemIndex = Math.max(0, Math.floor((topOffset + vh) / rowHeight.value) + extraItems);\n\n    const lastVisibleItemIndex = Math.min(unBoundedLastVisibleItemIndex, totalItems - 1);\n\n    // Make all visible rows available if not visible any longer\n    for (const visibleRow of visibleRows.value) {\n        if (visibleRow.currentIndex === null || visibleRow.currentIndex < firstVisibleItemIndex || visibleRow.currentIndex > lastVisibleItemIndex) {\n            visibleRow.value = null;\n            visibleRow.currentIndex = null;\n        }\n    }\n\n    for (let index = firstVisibleItemIndex; index <= lastVisibleItemIndex; index++) {\n        // Is this already visible?\n        let visibleRow = visibleRows.value.find(r => r.currentIndex === index);\n        if (visibleRow) {\n            // Nothing to do, it's already visible\n            visibleRow.y = index * rowHeight.value;\n            continue;\n        }\n\n        visibleRow = visibleRows.value.find(r => r.currentIndex === null);\n\n        if (!visibleRow) {\n            visibleRow = new VisibleRow<Value>();\n            visibleRows.value.push(visibleRow);\n        }\n\n        const value = values.value[index] ?? null;\n\n        visibleRow.value = value;\n        visibleRow.y = index * rowHeight.value;\n        visibleRow.currentIndex = index;\n        visibleRow.cachedSelectionValue = getSelectionValue(visibleRow);\n    }\n\n    // console.log(\"Rendered rows: \"+visibleRows.value.length)\n    props.tableObjectFetcher.setVisible(firstVisibleItemIndex, unBoundedLastVisibleItemIndex);\n}\n\nconst rowHeight = computed(() => {\n    if (wrapColumns.value) {\n        const padding = 15;\n        const firstColumnHeight = 16;\n        const otherColumnsHeight = 14;\n        const borderHeight = 2;\n        const margin = 6;\n        return padding * 2 + firstColumnHeight + ((otherColumnsHeight + margin) * Math.max(columns.value.length - 1, 0)) + borderHeight;\n    }\n    return 60;\n});\n\nwatchEffect(() => {\n    tableElement.value?.style.setProperty('--table-row-height', `${rowHeight.value}px`);\n});\n\nconst totalHeight = computed(() => {\n    return rowHeight.value * totalFilteredCount.value;\n});\n\nfunction getPrevious(value: Value): Value | null {\n    for (let index = 0; index < values.value.length; index++) {\n        const _value = values.value[index];\n        if (_value.id === value.id) {\n            if (index === 0) {\n                return null;\n            }\n            return values.value[index - 1];\n        }\n    }\n    return null;\n}\n\nfunction getNext(value: Value): Value | null {\n    for (let index = 0; index < values.value.length; index++) {\n        const _value = values.value[index];\n        if (_value.id === value.id) {\n            if (index === values.value.length - 1) {\n                return null;\n            }\n            return values.value[index + 1];\n        }\n    }\n    return null;\n}\n\ndefineExpose({\n    getPrevious,\n    getNext,\n});\n\n</script>\n\n<style lang=\"scss\">\n@use '@stamhoofd/scss/base/variables' as *;\n@use '@stamhoofd/scss/base/text-styles' as *;\n\n.table-view {\n    --st-vertical-padding: 10px;\n    -webkit-user-select: none;\n    user-select: none;\n    -webkit-touch-callout: none;\n\n    > main {\n        overflow-y: auto;\n    }\n\n    // When scrolling horizontally, make sure the container doesn't scroll\n    > main > .container {\n        position: sticky;\n        left: 0;\n\n        > h1 + p {\n            padding-bottom: 15px;\n        }\n    }\n}\n\n.table-column-content-style {\n    font-size: 16px;\n}\n\n.column-style {\n    &[data-style=\"gray\"] {\n        color: $color-gray-5;\n    }\n\n    &[data-style=\"success\"], &[data-style=\"error\"], &[data-style=\"info\"], &[data-style=\"warn\"], &[data-style=\"secundary\"], &[data-style=\"tertiary\"], &[data-style=\"tag-gray\"] {\n        > span {\n            display: inline-block;\n            font-size: 11px;\n            text-transform: uppercase;\n            font-weight: $font-weight-bold;\n            padding: 7px 8px;\n            border-radius: $border-radius;\n\n            white-space: nowrap;\n            overflow: hidden;\n            text-overflow: ellipsis;\n            max-width: 100%;\n            box-sizing: border-box;\n        }\n\n    }\n\n    &[data-style=\"success\"] > span {\n        background: $color-success-background;\n        color: $color-success-dark;\n    }\n\n    &[data-style=\"error\"] > span {\n        background: $color-error-background;\n        color: $color-error-dark;\n    }\n\n    &[data-style=\"info\"] > span {\n        background: $color-primary-background;\n        color: $color-primary;\n\n        @media (prefers-color-scheme: dark) {\n            color: $color-primary-dark;\n        }\n    }\n\n    &[data-style=\"warn\"] > span {\n        color: $color-warning-dark;\n        background: $color-warning-background;\n    }\n\n    &[data-style=\"secundary\"] > span {\n        color: $color-secundary-dark;\n        background: $color-secundary-background;\n    }\n\n    &[data-style=\"tertiary\"] > span {\n        color: $color-tertiary-dark;\n        background: $color-tertiary-background;\n    }\n\n    &[data-style=\"tag-gray\"] > span {\n        color: $color-gray-1;\n        background: $color-background-shade;\n    }\n\n    &[data-style=\"code\"] > span {\n        font-family: monospace;\n    }\n}\n\n.table-with-columns {\n    margin: 0 calc(-1 * var(--st-horizontal-padding, 40px));\n    margin-bottom: calc(-1 * var(--st-vertical-padding, 40px));\n    padding-bottom: var(--st-vertical-padding, 40px);\n\n    .inner-size {\n        // This container determines the horizontal width and height.\n        // And this should always be fixed for efficient layout calculations.\n        // Why required? For the horizontal + vertical scrolling to work properly.\n\n        contain: layout;\n        // position: absolute;\n        // width: 150%;\n        // height: 100%;\n\n        @supports not (contain: layout) {\n            transform: translate3d(0, 0, 0);\n        }\n\n        // If the total width of all the columns is smaller than the total width, still force the table\n        // to be 100% width\n        min-width: 100%;\n    }\n\n    &.scroll {\n        overflow: auto;\n        flex-grow: 1;\n        position: relative;\n        z-index: 101;\n        overscroll-behavior: contain;\n        -webkit-overflow-scrolling: touch;\n\n        .inner-size {\n            // Should be absolute because the size of the parent should not be affected by the size\n            // of the child.\n            position: absolute;\n        }\n    }\n\n    .table-body {\n        contain: layout;\n        position: relative;\n        overflow: hidden;\n        width: 100%;\n\n        @supports not (contain: layout) {\n            transform: translate3d(0, 0, 0);\n        }\n    }\n\n    .table-row, .table-head {\n        width: 100%;\n        overflow: hidden;\n        position: relative;\n        box-sizing: border-box;\n\n        padding-left: var(--st-horizontal-padding, 40px);\n\n        .selection-column {\n            position: absolute;\n            box-sizing: border-box;\n            height: 100%;\n            top: 0;\n            display: flex;\n            flex-wrap: nowrap;\n            justify-content: flex-start;\n            align-items: center;\n            padding-bottom: 2px;\n            width: var(--selection-column-width, 50px);\n        }\n\n        .prefix-column {\n            position: absolute;\n            box-sizing: border-box;\n            height: 100%;\n            top: 0;\n            display: flex;\n            flex-wrap: nowrap;\n            justify-content: flex-start;\n            align-items: flex-start;\n            padding-top: 15px;\n            width: 50px;\n\n            transition: transform 0.2s;\n\n            @extend .column-style;\n\n        }\n\n        .columns {\n            box-sizing: border-box;\n            width: 100%;\n            height: 100%;\n            transform: translateX(0);\n            transition: transform 0.2s;\n\n        }\n    }\n\n    &.show-prefix {\n        .table-row, .table-head {\n            .columns {\n                width: calc(100% - 50px);\n                transform: translateX(50px);\n            }\n        }\n    }\n\n    &.show-checkbox {\n        .table-row, .table-head {\n            .prefix-column {\n                transform: translateX(var(--selection-column-width, 50px));\n            }\n\n            .columns {\n                width: calc(100% - var(--selection-column-width, 50px));\n                transform: translateX(var(--selection-column-width, 50px));\n            }\n        }\n    }\n\n    &.show-checkbox.show-prefix {\n        .table-row, .table-head {\n            .columns {\n                width: calc(100% - 50px - var(--selection-column-width, 50px));\n                transform: translateX(calc(50px + var(--selection-column-width, 50px)));\n            }\n        }\n    }\n\n    &:not(.wrap) {\n        padding-top: 20px;\n\n        .table-head, .table-row {\n            --selection-column-width: 50px;\n            .columns {\n                display: grid;\n                grid-template-columns: var(--table-columns, repeat(auto-fit, minmax(0, 1fr)));\n                align-items: center;\n            }\n        }\n\n        .table-row {\n            .columns {\n                > div {\n                    padding-right: 15px;\n\n                    // Give numbers equal width\n                    font-variant-numeric: tabular-nums;\n\n                    &.isDragging {\n                        opacity: 0.5;\n                    }\n\n                    @extend .column-style;\n\n                    &:last-child {\n                        padding-right: 0;\n                    }\n\n                    transition: transform 0.2s, opacity 0.2s;\n\n                    &.isDragging {\n                        transform: translateX(var(--drag-x, 0px));\n                        opacity: 0.5;\n\n                        // Don't animate transform during drags\n                        transition: opacity 0.2s;\n                    }\n                }\n            }\n        }\n    }\n\n    &.wrap {\n        padding-top: 10px;\n\n        .table-head {\n            display: none;\n        }\n\n        .table-row {\n            --selection-column-width: 40px;\n\n            .columns {\n                padding: 15px 0;\n                display: block;\n\n                > div {\n                    font-size: 14px;\n                    height: 14px;\n                    line-height: 14px;\n                    color: $color-gray-text;\n                    box-sizing: content-box;\n\n                    padding-top: 6px;\n\n                    &:first-child {\n                        font-size: 16px;\n                        height: 16px;\n                        line-height: 16px;\n                        font-weight: $font-weight-medium;\n                        color: $color-dark;\n                    }\n\n                    &:first-child {\n                        padding-top: 0;\n                    }\n\n                    &:empty {\n                        display: none;\n                    }\n                }\n\n            }\n        }\n    }\n\n    .table-head {\n        height: 50px;\n        border-bottom: $border-width-thin solid $color-border;\n        margin-bottom: calc(-1 * #{$border-width-thin});\n        position: sticky;\n        top: 0px;\n        z-index: 100;\n        background: var(--color-current-background, #{$color-background} );\n        padding-top: 0px;\n\n        .columns > div {\n            @extend .style-table-head;\n\n            user-select: none;\n\n            display: flex;\n            flex-direction: row;\n            align-items: center;\n            padding-right: 10px;\n\n            > button:first-child {\n                flex-grow: 1;\n                flex-shrink: 1;\n\n                display: flex;\n                flex-direction: row;\n                align-items: center;\n                min-width: 0;\n                height: 40px;\n\n                // This is the clickable part\n                cursor: pointer;\n                touch-action: manipulation;\n                -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n\n                // For drags\n                transition: transform 0.2s, opacity 0.2s;\n\n                &:active {\n                    opacity: 0.6;\n                }\n            }\n\n            &.isDragging {\n\n                // During drag, we move all, except the column drag indicator\n                > button:first-child {\n                    transform: translateX(var(--drag-x, 0px));\n                    opacity: 0.5;\n                    cursor: grabbing;\n\n                    // Don't animate transform during drags\n                    transition: opacity 0.2s;\n\n                    &:active {\n                        opacity: 0.5;\n                    }\n                }\n            }\n\n            span:first-child {\n                white-space: nowrap;\n                overflow: hidden;\n                text-overflow: ellipsis;\n            }\n\n            span {\n                vertical-align: middle;\n                min-width: 0;\n            }\n\n            .icon {\n                flex-shrink: 0;\n                margin-right: -8px;\n            }\n\n            .drag-handle-container {\n                width: $border-width-thin;\n                height: 20px;\n                display: inline-block;\n                position: relative;\n                padding-left: 10px;\n                flex-shrink: 0;\n\n                &:before {\n                    content: '';\n                    position: absolute;\n                    top: 0;\n                    left: 10px;\n                    width: $border-width-thin;\n                    height: 20px;\n                    background: $color-border;\n                    border-radius: $border-width-thin;\n                }\n\n                // The drag area\n                .drag-handle {\n                    content: '';\n                    position: absolute;\n                    top: -10px;\n                    left: 9px;\n                    bottom: -20px;\n                    right: -1px;\n                    cursor: col-resize;\n                    touch-action: pan-x;\n                    z-index: 1;\n                    background: rgb(0, 89, 255);\n                    opacity: 0;\n                    transition: opacity 0.2s;\n                    border-radius: 2px;\n\n                    &:hover {\n                        opacity: 1;\n                        transition: opacity 0.2s 0.6s;\n                    }\n\n                    @media (pointer: coarse) {\n                        left: 0px;\n                        right: -20px;\n\n                        &:hover {\n                            opacity: 0;\n                        }\n                    }\n\n                    &.reached-minimum {\n                        cursor: e-resize;\n                    }\n\n                    &:active {\n                         opacity: 1;\n                        transition: opacity 0.1s 0s;\n                    }\n                }\n            }\n\n            &:last-child {\n                padding-right: 0;\n            }\n        }\n    }\n\n    .table-row {\n        contain: layout;\n        position: absolute;\n\n        will-change: transform;\n        height: var(--table-row-height, 60px);\n\n        .columns {\n            border-top: $border-width-thin solid $color-border;\n\n            > div {\n                white-space: nowrap;\n                overflow: hidden;\n                text-overflow: ellipsis;\n                // will-change width makes column resizing a bit smoother on Safari (is more laggy in Safari)\n                will-change: contents, width;\n            }\n        }\n\n        .placeholder-skeleton {\n            @extend .style-placeholder-skeleton;\n            width: 10px;\n        }\n\n        will-change: transform, background-color;\n        transition: background-color 0.15s;\n        cursor: pointer;\n        touch-action: manipulation;\n        -webkit-tap-highlight-color: transparent;\n        -webkit-user-select: none;\n        -webkit-touch-callout: none;\n        user-select: none;\n\n        @media (hover: hover) {\n            &:hover {\n                background-color: $color-primary-lighter;\n\n                &.focused {\n                    background-color: $color-primary-light;\n                }\n            }\n        }\n\n        &:active {\n            background-color: $color-primary-light;\n        }\n\n        &.focused {\n            background-color: $color-primary-light;\n\n            &:after {\n                content: '';\n                position: absolute;\n                top: 0px;\n                right: 0;\n                bottom: 0;\n                width: 2px;\n                background-color: $color-primary;\n                z-index: 5;\n            }\n\n            &:before {\n                content: '';\n                position: absolute;\n                top: 0px;\n                left: 0;\n                bottom: 0;\n                width: 2px;\n                background-color: $color-primary;\n                z-index: 5;\n            }\n        }\n    }\n}\n</style>\n","<template>\n    <div class=\"spinner-container\">\n        <div class=\"spinner\">\n            <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <circle cx=\"12\" cy=\"12\" r=\"8\" stroke=\"#0053FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n            </svg>\n        </div>\n    </div>\n</template>\n\n<style lang=\"scss\">\n@use '@stamhoofd/scss/base/variables' as *;\n\n.spinner-container > div.spinner {\n    display: block;\n    animation: spinner-spin 2s linear infinite;\n    width: 24px;\n    height: 24px;\n    overflow: hidden;\n\n    > svg {\n        width: 24px;\n        height: 24px;\n        display: block;\n        animation: spinner-spin 2s infinite;\n        overflow: hidden;\n        \n        > circle {\n            stroke: $color-primary;\n            stroke: var(--color-primary, $color-primary);\n            animation: spinner-circle 4s infinite;\n        }\n    }\n}\n\n.spinner-container {\n    width: 24px;\n    height: 24px;\n\n    &.inline {\n        display: inline-block;\n        vertical-align: middle;\n    }\n\n    &.center {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        width: 100%;\n        height: auto;\n    }\n    \n    &.gray {\n        div.spinner > svg > circle {\n            stroke: $color-gray-1;\n        }\n    }\n}\n\n@keyframes spinner-spin {\n    0% { transform: rotate(0deg); }\n    100% { transform: rotate(360deg); }\n}\n\n@keyframes spinner-circle {\n    0% { stroke-dasharray: 15 100; }\n    50% { stroke-dasharray: 40 100; }\n    100% { stroke-dasharray: 15 100; }\n}\n\n@keyframes spinner-end {\n    to { stroke-dasharray: 0 100; }\n}\n</style>","<template>\n    <div ref=\"el\" class=\"infinite-object-fetcher-end\">\n        <p v-if=\"!fetcher.hasMoreObjects && fetcher.objects.length === 0\" class=\"info-box\">\n            {{ emptyMessage || 'Geen resultaten' }}\n        </p>\n\n        <div v-if=\"fetcher.hasMoreObjects\" class=\"spinner-container center\">\n            <Spinner />\n        </div>\n    </div>\n</template>\n\n<script setup lang=\"ts\" generic=\"ObjectType extends {id: string}\">\nimport { onMounted, onUnmounted, ref } from 'vue';\nimport Spinner from '../Spinner.vue';\nimport { InfiniteObjectFetcher } from './classes';\n\n\nconst props = defineProps<{\n    fetcher: InfiniteObjectFetcher<ObjectType>,\n    emptyMessage?: string,\n}>()\nconst el = ref<HTMLElement | null>(null);\n\n// Keep track whether the ref stays in view\nconst observer = new IntersectionObserver((entries) => {\n    props.fetcher.setReachedEnd(entries[0].isIntersecting)\n}, {\n    root: null,\n    rootMargin: '0px',\n    threshold: 0.1,\n});\n\nonMounted(() => {\n    observer.observe(el.value!);\n});\n\nonUnmounted(() => {\n    props.fetcher.setReachedEnd(false)\n    observer.disconnect();\n});\n</script>\n\n\n<style lang=\"scss\">\n.infinite-object-fetcher-end > .spinner-container {\n    margin-top: 20px;\n}\n\n</style>\n","import { PushOptions, usePresent } from \"@simonbackx/vue-app-navigation\";\n\nexport type PositionableSheetOptions = {\n    width?: number, padding?: number \n}\n\nfunction calculateModalPosition(event: MouseEvent, options?: PositionableSheetOptions) {\n    const padding = options?.padding ?? 15;\n    const innerPadding = 15;\n\n    let width = options?.width ?? 400;\n    const button = event.currentTarget as HTMLElement\n    const bounds = button.getBoundingClientRect()\n    const win = window,\n        doc = document,\n        docElem = doc.documentElement,\n        body = doc.getElementsByTagName(\"body\")[0],\n        clientWidth = win.innerWidth || docElem.clientWidth || body.clientWidth;\n\n    let left = bounds.left - innerPadding;\n\n    if (left + width > clientWidth + innerPadding) {\n        left = clientWidth - innerPadding - width;\n\n        if (left < innerPadding) {\n            left = innerPadding;\n            width = clientWidth - innerPadding * 2;\n        }\n    }\n\n    const top = bounds.top + bounds.height + padding;\n\n    return '--sheet-position-left: '+left.toFixed(1)+'px; --sheet-position-top: '+top.toFixed(1)+'px; --sheet-vertical-padding: 15px; --st-popup-width: ' + width.toFixed(1) + 'px; '\n}\n\nexport function usePositionableSheet() {\n    const present = usePresent();\n    \n    return {\n        presentPositionableSheet: async (event: MouseEvent, options: PushOptions, positionOptions?: PositionableSheetOptions) => {\n            await present({\n                modalDisplayStyle: 'popup',\n                modalClass: 'positionable-sheet',\n                modalCssStyle: calculateModalPosition(event, positionOptions),\n                ...options\n            })\n        }\n    }\n}\n","<template>\n    <div v-if=\"view\" class=\"st-view loading-view-container\">\n        <div v-if=\"errorBox\">\n            <STErrorsDefault :error-box=\"errorBox\" />\n        </div>\n        <div v-else class=\"loading-view\" v-if=\"show\">\n            <Spinner class=\"center gray\" />\n        </div>\n    </div>\n    <div v-else-if=\"errorBox\">\n        <STErrorsDefault :error-box=\"errorBox\" />\n    </div>\n    <div v-else class=\"loading-view\" v-if=\"show\">\n        <Spinner class=\"center gray\" />\n    </div>\n</template>\n\n\n<script lang=\"ts\" setup>\nimport { onMounted, ref } from \"vue\";\nimport { ErrorBox } from \"../errors/ErrorBox\";\nimport Spinner from \"../Spinner.vue\";\n\nwithDefaults(\n    defineProps<{\n        view?: boolean,\n        show?: boolean,\n        appear?: boolean,\n        errorBox?: ErrorBox|null;\n    }>(),\n    {\n        view: false,\n        show: true,\n        appear: true,\n        errorBox: null\n    }\n);\n\nconst mounted = ref(false);\n\nonMounted(() => {\n    setTimeout(() => {\n        mounted.value = true;\n    }, 100);\n});\n\n</script>\n\n<style lang=\"scss\">\n@use '@stamhoofd/scss/base/variables' as *;\n@use '@stamhoofd/scss/base/text-styles';\n\n.loading-view-container.fade-leave-active {\n    opacity: 1;\n    transition: opacity 0.2s;\n}\n.loading-view-container {\n    &.fade-leave-to {\n        opacity: 0;\n    }\n}\n\n.loading-view {\n    position: absolute !important;\n    left: 0;\n    right: 0;\n    top: 0;\n    height: 100%;\n    z-index: 12;\n    opacity: 1;\n    background: var(--color-current-background, #{$color-background});\n    min-height: 100vh;\n    min-height: 100dvh;\n    min-height: calc(var(--vh, 1vh) * 100);\n    //transition: opacity 0.2s;\n\n    .st-view > & {\n        position: absolute !important;\n    }\n\n    > .spinner-container {\n        opacity: 1;\n        position: absolute;\n        left: 0;\n        top: 0;\n        right: 0;\n        height: 100% !important;\n        transition: opacity 1s 0.5s; // Slow fading in spinner, with delay, to prevent showing it too fast (don't want to show it if everything loads fast)\n    }\n\n    &.fade-enter-from, .loading-view-container.fade-enter-from & {\n        //opacity: 1;\n\n        > .spinner-container {\n            opacity: 0;\n        }\n    }\n\n    &.fade-enter-from.mounted, .loading-view-container.fade-enter-from.mounted & {\n        //opacity: 0; // Fade in\n\n        // If already mounted: immediately show spinner\n        > .spinner-container {\n            opacity: 1;\n        }\n    }\n\n    &.fade-enter-to.mounted, .loading-view-container.fade-enter-to.mounted & {\n        //opacity: 1;\n    }\n\n    &.fade-leave-to, .loading-view-container.fade-leave-to & {\n        //opacity: 0;\n    }\n\n    &.fade-leave-active {\n        // Allow user interactino during fade\n        //pointer-events: none;\n    }\n}\n</style>\n","<template>\n    <div class=\"loading-box-container\">\n        <transition name=\"fade\" :appear=\"true\">\n            <div v-if=\"!loading && $slots.default && isValidVnodes($slots.default())\" key=\"a\" class=\"loading-box-transition\">\n                <slot />\n            </div>\n            <LoadingBox v-else :view=\"view\" :error-box=\"errorBox\" class=\"loading-box-transition\" />\n        </transition>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { Comment, Fragment, isVNode } from 'vue';\nimport { ErrorBox } from '../errors/ErrorBox';\nimport LoadingBox from './LoadingBox.vue';\n\nwithDefaults(\n    defineProps<{\n        loading?: boolean;\n        view?: boolean;\n        errorBox?: ErrorBox | null;\n    }>(),\n    {\n        loading: false,\n        errorBox: null,\n        view: false,\n    },\n);\n\n// Helps detect empty nodes\nfunction isValidVnodes(vnodes: any) {\n    return vnodes.some((child: any) => {\n        if (!isVNode(child)) return false;\n        if (child.type === Comment) return false;\n        if (child.type === Fragment && !isValidVnodes(child.children)) return false;\n        return true;\n    })\n        ? true\n        : false;\n}\n\n</script>\n\n<style lang=\"scss\">\n@use '@stamhoofd/scss/base/variables' as *;\n@use '@stamhoofd/scss/base/text-styles';\n\n.loading-box-container {\n    //position: relative;\n}\n\n.loading-box-transition {\n    opacity: 1;\n    transition: opacity 0.2s;\n\n    &.fade-leave-active {\n        position: absolute;\n        left: 0;\n        top: 0;\n        right: 0;\n        bottom: 0;\n        z-index: 100;\n    }\n\n    &.fade-enter-from {\n        opacity: 1;\n    }\n\n    &.fade-leave-to {\n        opacity: 0;\n    }\n}\n</style>\n","<template>\n    <!-- This div is not really needed, but causes bugs if we remove it from the DOM. Probably something Vue.js related (e.g. user keeps logged out, even if loggedIn = true and force reload is used) -->\n    <div class=\"promise-view\">\n        <LoadingViewTransition :errorBox=\"errorBox\">\n            <ComponentWithPropertiesInstance v-if=\"root\" :key=\"root.key\" :component=\"root\" />\n        </LoadingViewTransition>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { ComponentWithProperties, ComponentWithPropertiesInstance, NavigationMixin } from '@simonbackx/vue-app-navigation';\nimport { Component, Mixins, Prop } from '@simonbackx/vue-app-navigation/classes';\n\nimport { ErrorBox } from '../errors/ErrorBox';\nimport LoadingViewTransition from './LoadingViewTransition.vue';\n\n@Component({\n    components: {\n        ComponentWithPropertiesInstance,\n        LoadingViewTransition,\n    },\n})\nexport default class PromiseView extends Mixins(NavigationMixin) {\n    @Prop({ required: true })\n    promise!: (this: typeof PromiseView) => Promise<ComponentWithProperties>;\n\n    root: ComponentWithProperties | null = null;\n    passRoutes = false;\n    errorBox: ErrorBox | null = null;\n\n    mounted() {\n        this.run();\n    }\n\n    customRoutes() {\n        this.passRoutes = true;\n    }\n\n    run() {\n        this.errorBox = null;\n        this.promise.call(this).then((value) => {\n            if (!value) {\n                console.error('Promise view did not return a component.');\n                throw new Error('Missing component in promise');\n            }\n\n            const c = value;\n            if (this.passRoutes) {\n                this.passRoutes = false;\n                c.setCheckRoutes();\n            }\n            this.root = c;\n        }).catch((e) => {\n            console.error(e);\n            console.error('Promise error not caught, defaulting to dismiss behaviour in PromiseView');\n\n            if (this.canDismiss) {\n                this.dismiss({ force: true });\n            }\n            else {\n                this.errorBox = new ErrorBox(e);\n            }\n        });\n    }\n\n    reload() {\n        this.root = null;\n        this.run();\n    }\n\n    returnToHistoryIndex() {\n        if (this.root) {\n            return this.root.returnToHistoryIndex();\n        }\n        return false;\n    }\n\n    async shouldNavigateAway(): Promise<boolean> {\n        if (!this.root) {\n            return true;\n        }\n        return await (this.root.shouldNavigateAway());\n    }\n}\n</script>\n\n<style lang=\"scss\">\n\n.promise-view.st-view {\n    background: transparent; // Ticket scanning requires all views to be transparent\n}\n</style>\n","import { ComponentWithProperties } from \"@simonbackx/vue-app-navigation\"\n\nimport { sleep } from \"@stamhoofd/utility\"\nimport { AppManager } from \"../../../networking\"\nimport { Toast } from \"../overlays/Toast\"\nimport PromiseView from \"./PromiseView.vue\"\n\n/**\n * In the app, we don't need to wait for components to load (because they are present).\n * So pass the promise to prevent DOM updates\n */\nexport async function LoadComponent(component: () => Promise<any>, properties = {}, settings?: { instant: boolean}) {\n    try {\n        if (settings?.instant) {\n            return AsyncComponent(component, properties)\n        }\n        if (!AppManager.shared.isNative) {\n            // Instead of initiating a loading dom, we can wait maximum 50ms\n            // for the promise to resolve and decide if we need to show the loading dom or not\n            const promise = component()\n            const speedRun = sleep(50).then(() => null)\n            const result = await Promise.any([promise, speedRun])\n\n            if (result === null) {\n                return new ComponentWithProperties(PromiseView, {\n                    promise: async function() {\n                        try {\n                            const c = (await promise).default\n                            return new ComponentWithProperties(c, properties)\n                        } catch (e) {\n                            if (AppManager.shared.isNative) {\n                                new Toast(\"Geen internetverbinding. Herlaad de applicatie.\", \"error red\").show()\n                            } else {\n                                new Toast(\"Geen internetverbinding. Kijk jouw verbinding na en herlaad de website.\", \"error red\").show()\n                            }\n                            throw e\n                        }\n                    }\n                })\n            }\n            return new ComponentWithProperties(result.default, properties)\n        }\n        const c = (await component()).default\n        return new ComponentWithProperties(c, properties)\n    } catch (e) {\n        if (AppManager.shared.isNative) {\n            new Toast(\"Geen internetverbinding. Herlaad de applicatie.\", \"error red\").show()\n        } else {\n            new Toast(\"Geen internetverbinding. Kijk jouw verbinding na en herlaad de website.\", \"error red\").show()\n        }\n        throw e\n    }\n    \n}\n\nexport function PromiseComponent(component: () => Promise<ComponentWithProperties>) {\n    return new ComponentWithProperties(PromiseView, {\n        promise: async function() {\n            try {\n                const c = (await component())\n                return c\n            } catch (e) {\n                if (AppManager.shared.isNative) {\n                    new Toast(\"Geen internetverbinding. Herlaad de applicatie.\", \"error red\").show()\n                } else {\n                    new Toast(\"Geen internetverbinding. Kijk jouw verbinding na en herlaad de website.\", \"error red\").show()\n                }\n                throw e\n            }\n        }\n    })\n}\n\n\nexport function AsyncComponent(component: () => Promise<any>, properties = {}) {\n    return new ComponentWithProperties(PromiseView, {\n        promise: async function() {\n            try {\n                const c = (await component()).default\n                return new ComponentWithProperties(c, properties)\n            } catch (e) {\n                if (AppManager.shared.isNative) {\n                    new Toast(\"Geen internetverbinding. Herlaad de applicatie.\", \"error red\").show()\n                } else {\n                    new Toast(\"Geen internetverbinding. Kijk jouw verbinding na en herlaad de website.\", \"error red\").show()\n                }\n                throw e\n            }\n        }\n    })\n}\n","import { SessionContext, SessionManager, UrlHelper } from '@stamhoofd/networking';\nimport { Organization } from '@stamhoofd/structures';\n\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { PromiseComponent } from '../../containers/AsyncComponent';\nimport { useOrganization, usePlatform, useUser } from '../../hooks';\nimport { ReplaceRootEventBus } from '../../overlays/ModalStackEventBus';\nimport { AppType, useAppContext } from '../appContext';\n\nexport type Option = {\n    id: string;\n    app: AppType | 'auto';\n    organization: Organization | null;\n    context: SessionContext;\n    userDescription?: string;\n};\n\nexport function appToUri(app: AppType | 'auto') {\n    switch (app) {\n        case 'admin':\n            return 'administratie';\n        case 'dashboard':\n            return 'beheerders';\n        case 'registration':\n            return 'leden';\n        case 'auto':\n            return 'auto';\n    }\n}\n\nexport function uriToApp(uri: string) {\n    switch (uri) {\n        case 'administratie':\n            return 'admin';\n        case 'beheerders':\n            return 'dashboard';\n        case 'leden':\n            return 'registration';\n        default:\n            return 'auto';\n    }\n}\n\nexport function useContextOptions() {\n    const $user = useUser();\n    const $organization = useOrganization();\n    const app = useAppContext();\n    const $t = useTranslate();\n    const platform = usePlatform();\n\n    const getRegistrationOption = async (): Promise<Option> => {\n        const context = new SessionContext(null);\n        await context.loadFromStorage();\n\n        return {\n            id: 'registration',\n            organization: null,\n            app: 'registration',\n            context,\n        };\n    };\n\n    const getDefaultOptions = async () => {\n        const opts: Option[] = [];\n\n        if ($user.value && $user.value.organizationId === null && $user.value.permissions && $user.value.permissions.globalPermissions !== null) {\n            if ($user.value.permissions?.forPlatform(platform.value)?.isEmpty === false) {\n                const context = new SessionContext(null);\n                await context.loadFromStorage();\n\n                if (context.canGetCompleted()) {\n                    opts.push({\n                        id: 'admin',\n                        organization: null,\n                        app: 'admin',\n                        context,\n                    });\n                }\n            }\n        }\n\n        if (STAMHOOFD.userMode === 'platform') {\n            opts.push(await getRegistrationOption());\n        }\n\n        for (const organizationId of $user.value?.permissions?.organizationPermissions.keys() ?? []) {\n            const organization = $user.value!.members.organizations.find(o => o.id === organizationId) ?? ($organization.value?.id === organizationId ? $organization.value : null);\n            if (!organization || $user.value?.permissions?.forWithoutInherit(organization)?.isEmpty !== false) {\n                continue;\n            }\n            const context = new SessionContext(organization);\n            await context.loadFromStorage();\n\n            opts.push({\n                id: 'dashboard-' + organization.id,\n                organization,\n                app: 'dashboard',\n                context,\n            });\n        }\n\n        return opts;\n    };\n\n    const getOptionForOrganization = async (organization: Organization) => {\n        const context = new SessionContext(organization);\n        await context.loadFromStorage();\n\n        return {\n            id: 'org-' + organization.id,\n            organization,\n            app: 'auto',\n            context,\n            userDescription: context.user && (!$user.value || context.user.id !== $user.value.id) ? context.user.email : undefined,\n        };\n    };\n\n    const buildRootForOption = async (option: Option) => {\n        await SessionManager.prepareSessionForUsage(option.context);\n\n        if (option.app === 'auto') {\n            const admin = await import('@stamhoofd/dashboard');\n            return await admin.getScopedAutoRoot(option.context);\n        }\n\n        if (option.app === 'admin') {\n            const admin = await import('@stamhoofd/admin-frontend');\n            return await admin.getScopedAdminRoot(option.context, $t);\n        }\n\n        if (option.app === 'dashboard') {\n            const dashboard = await import('@stamhoofd/dashboard');\n            return await dashboard.getScopedDashboardRoot(option.context);\n        }\n\n        if (option.app === 'registration') {\n            const registration = await import('@stamhoofd/registration');\n            return await registration.getRootView(option.context);\n        }\n        throw new Error('This app is not yet supported');\n    };\n\n    const selectOption = (option: Option) => {\n        // Try to maintain the same URL for the new scope, to improve switching behaviour per tab\n        let href = window.location.href;\n        let oldPrefix = '';\n        if ($organization.value) {\n            oldPrefix = '/' + appToUri(app) + '/' + $organization.value.uri;\n        }\n        else {\n            oldPrefix = '/' + appToUri(app);\n        }\n        let newPrefix = '';\n        if (option.organization) {\n            newPrefix = '/' + appToUri(option.app) + '/' + option.organization.uri;\n        }\n        else {\n            newPrefix = '/' + appToUri(option.app);\n        }\n        console.log(href, oldPrefix, newPrefix);\n        if (oldPrefix) {\n            href = href.replace(oldPrefix, newPrefix);\n        }\n        UrlHelper.shared = new UrlHelper(href);\n\n        ReplaceRootEventBus.sendEvent('replace', PromiseComponent(async () => {\n            return await buildRootForOption(option);\n        })).catch(console.error);\n    };\n\n    const isCurrent = (option: Option) => {\n        return ((option.app === app || (option.app === 'auto' && option.organization)) && (option.organization?.id ?? null) === ($organization.value?.id ?? null));\n    };\n\n    return {\n        getDefaultOptions,\n        getRegistrationOption,\n        getOptionForOrganization,\n        buildRootForOption,\n        selectOption,\n        isCurrent,\n    };\n}\n","<template>\n    <nav class=\"st-view organization-app-switcher\">\n        <STNavigationBar v-if=\"!popup\" title=\"Kiezen\" />\n\n        <main>\n            <h1 v-if=\"!popup\">\n                {{ $t('34aff020-6017-4c23-85b1-44a692988ee6') }}\n            </h1>\n\n            <template v-if=\"currentOptions.length\">\n                <STList>\n                    <STListItem v-for=\"option in currentOptions\" :key=\"option.id\" :selectable=\"true\" element-name=\"button\" class=\"left-center\" @click=\"selectOption(option)\">\n                        <template #left>\n                            <ContextLogo :organization=\"option.organization\" :app=\"option.app\" />\n                        </template>\n                        <h1 class=\"style-title-list\">\n                            {{ getAppTitle(option.app, option.organization) }}\n                        </h1>\n                        <p v-if=\"getAppDescription(option.app, option.organization)\" class=\"style-description\">\n                            {{ getAppDescription(option.app, option.organization) }}\n                        </p>\n                        <p v-if=\"option.userDescription\" class=\"style-description-small style-em\">\n                            Ingelogd als {{ option.userDescription }}\n                        </p>\n\n                        <template v-if=\"isCurrent(option) || option.userDescription || (option.context.hasPermissions() && option.app === 'auto')\" #right>\n                            <span v-if=\"isCurrent(option)\" class=\"icon success primary floating\" />\n                            <span v-else-if=\"option.userDescription\" class=\"icon gray sync\" />\n                            <span v-else-if=\"option.context.hasPermissions() && option.app === 'auto'\" class=\"icon privacy gray floating\" />\n                        </template>\n                    </STListItem>\n                </STList>\n\n                <hr v-if=\"otherOptions.length\">\n            </template>\n\n            <STList v-if=\"otherOptions.length\">\n                <STListItem v-for=\"option in otherOptions\" :key=\"option.id\" :selectable=\"true\" element-name=\"button\" class=\"left-center\" @click=\"selectOption(option)\">\n                    <template #left>\n                        <ContextLogo :organization=\"option.organization\" :app=\"option.app\" />\n                    </template>\n                    <h1 class=\"style-title-list\">\n                        {{ getAppTitle(option.app, option.organization) }}\n                    </h1>\n                    <p v-if=\"getAppDescription(option.app, option.organization)\" class=\"style-description\">\n                        {{ getAppDescription(option.app, option.organization) }}\n                    </p>\n                    <p v-if=\"option.userDescription\" class=\"style-description-small style-em\">\n                        Ingelogd als {{ option.userDescription }}\n                    </p>\n\n                    <template v-if=\"isCurrent(option) || option.userDescription || (option.context.hasPermissions() && option.app === 'auto')\" #right>\n                        <span v-if=\"isCurrent(option)\" class=\"icon success primary floating\" />\n                        <span v-else-if=\"option.userDescription\" class=\"icon gray sync\" />\n                        <span v-else-if=\"option.context.hasPermissions() && option.app === 'auto'\" class=\"icon privacy gray floating\" />\n                    </template>\n                </STListItem>\n            </STList>\n\n            <hr v-if=\"currentOptions.length || otherOptions.length\">\n\n            <button class=\"button text\" type=\"button\" @click=\"searchOrganizations\">\n                <span class=\"icon search\" />\n                <span>Andere zoeken</span>\n            </button>\n        </main>\n    </nav>\n</template>\n\n<script setup lang=\"ts\">\nimport { usePopup } from '@simonbackx/vue-app-navigation';\nimport { computed, Ref, shallowRef } from 'vue';\n\nimport { SessionManager } from '@stamhoofd/networking';\nimport { PromiseComponent } from '../containers/AsyncComponent';\nimport { ReplaceRootEventBus } from '../overlays/ModalStackEventBus';\nimport { useAppData } from './appContext';\nimport ContextLogo from './ContextLogo.vue';\nimport { Option, useContextOptions } from './hooks/useContextOptions';\n\nconst options: Ref<Option[]> = shallowRef([]);\nconst popup = usePopup();\n\nconst { getDefaultOptions, selectOption, isCurrent } = useContextOptions();\nconst { getAppTitle, getAppDescription } = useAppData();\n\nconst currentOptions = computed(() => {\n    const list = options.value.filter(o => o.app !== 'auto');\n    if (list.length > 1) {\n        return list;\n    }\n    return [];\n});\nconst otherOptions = computed(() => currentOptions.value.length <= 0 ? options.value : options.value.filter(o => o.app === 'auto'));\n\ngetDefaultOptions().then((opts) => {\n    options.value = opts;\n}).catch(console.error);\n\nconst searchOrganizations = async () => {\n    await ReplaceRootEventBus.sendEvent('replace', PromiseComponent(async () => {\n        const dashboard = await import('@stamhoofd/dashboard');\n        return dashboard.getOrganizationSelectionRoot(await SessionManager.getLastGlobalSession());\n    }));\n};\n\n</script>\n\n<style lang=\"scss\">\n.organization-app-switcher {\n    --st-hr-margin: 15px;\n}\n</style>\n","<template>\n    <PlatformLogo v-if=\"app === 'auto'\" />\n    <button v-else v-long-press=\"($event) => open($event)\" class=\"organization-switcher\" :class=\"{small}\" type=\"button\" @click=\"open\" @contextmenu.prevent=\"open($event)\">\n        <ContextLogo :organization=\"organization\" :app=\"app\" />\n        <div>\n            <h1>\n                <span>{{ small && organization ? organization.name : getAppTitle(app, organization) }}</span><span v-if=\"small\" ref=\"arrow\" class=\"icon arrow-down-small gray\" />\n            </h1>\n            <h2 v-if=\"!small && getAppDescription(app, organization)\">\n                <span>{{ getAppDescription(app, organization) }}</span>\n                <span ref=\"arrow\" class=\"icon arrow-down-small gray\" />\n            </h2>\n        </div>\n    </button>\n</template>\n\n<script setup lang=\"ts\">\nimport { ComponentWithProperties, NavigationController } from '@simonbackx/vue-app-navigation';\n\nimport { useOrganization } from '../hooks';\nimport { usePositionableSheet } from '../tables';\nimport { useAppContext, useAppData } from './appContext';\nimport ContextLogo from './ContextLogo.vue';\nimport OrganizationAppSelector from './OrganizationAppSelector.vue';\nimport PlatformLogo from './PlatformLogo.vue';\n\nconst organization = useOrganization();\nconst app = useAppContext();\nconst { presentPositionableSheet } = usePositionableSheet();\nconst { getAppTitle, getAppDescription } = useAppData();\n\nwithDefaults(\n    defineProps<{\n        small?: boolean;\n    }>(),\n    {\n        small: false,\n    },\n);\n\nconst open = async (event: MouseEvent) => {\n    if (app === 'auto') {\n        return;\n    }\n\n    await presentPositionableSheet(event, {\n        components: [\n            new ComponentWithProperties(NavigationController, {\n                root: new ComponentWithProperties(OrganizationAppSelector, {}),\n            }, {\n                provide: {\n                    reactive_navigation_disable_url: true,\n                },\n            }),\n        ],\n    }, { padding: 25 });\n};\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use '@stamhoofd/scss/base/text-styles.scss';\n\n.organization-switcher {\n    display: grid;\n    grid-template-columns: calc(var(--block-width, 40px) + 15px) 1fr;\n    align-items: center;\n    text-align: left;\n\n    &:active {\n        opacity: 0.4;\n    }\n\n    touch-action: manipulation;\n    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n    user-select: none;\n    cursor: pointer;\n\n    > figure {\n        min-width: 0;\n        padding-right: 15px;\n    }\n\n    &.small {\n        --block-width: 30px;\n\n        > div h1 {\n            font-size: 16px;\n        }\n    }\n\n    > div {\n        min-width: 0;\n\n        h1 {\n            font-size: 16px;\n            line-height: 1;\n            font-weight: $font-weight-semibold;\n            max-width: auto;\n            width: 100%;\n            height: 20px;\n\n            overflow: hidden;\n            white-space: nowrap;\n            text-overflow: ellipsis;\n            min-width: 0;\n            max-width: auto;\n\n            @media (max-width: 600px) {\n                font-size: 21px;\n                margin-bottom: 3px;\n            }\n        }\n\n        h2 {\n            color: $color-gray-4;\n            font-size: 13px;\n            line-height: 1;\n            overflow: hidden;\n            display: flex;\n            align-items: center;\n            margin-bottom: -6px; // Fix alignment\n\n            > span:first-child {\n                overflow: hidden;\n                white-space: nowrap;\n                text-overflow: ellipsis;\n                max-width: auto;\n                min-width: none;\n            }\n\n            > span:last-child {\n                min-width: 24px;\n            }\n        }\n    }\n}\n</style>\n","<template>\n    <p class=\"style-description-small version-footer\" @click=\"tapVersion\">\n        v{{ version }} ({{ nativeVersion }}, {{ environment }})<br>\n        {{ STAMHOOFD.APP_UPDATE_SERVER_URL }}\n    </p>\n</template>\n\n<script lang=\"ts\">\nimport { ComponentWithProperties, NavigationController, NavigationMixin } from \"@simonbackx/vue-app-navigation\";\nimport { AsyncComponent } from \"@stamhoofd/components\";\nimport { AppManager } from '@stamhoofd/networking';\nimport { Component, Mixins } from \"@simonbackx/vue-app-navigation/classes\";\n\n@Component({})\nexport default class VersionFooter extends Mixins(NavigationMixin) {\n    get environment() {\n        return STAMHOOFD.environment\n    }\n\n    get nativeVersion() {\n        return AppManager.shared.nativeVersion ? ('App ' + AppManager.shared.nativeVersion) : \"web\"\n    }\n\n\n    get version() {\n        return STAMHOOFD.VERSION || '0.0.0'\n    }\n\n    tapVersion() {\n        this.openDevPanel(true)\n    }\n\n    openDevPanel(animated = true) {\n        this.present({\n            animated,\n            adjustHistory: true,\n            modalDisplayStyle: \"popup\",\n            components: [\n                new ComponentWithProperties(NavigationController, { \n                    root: AsyncComponent(() => import(\"./DevPanelView.vue\"))\n                })\n            ]\n        })\n    }\n}\n</script>\n\n<style lang=\"scss\">\n    .version-footer {\n        touch-action: manipulation;\n        -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n        user-select: none;\n    }\n</style>\n","import { FinancialSupportSettings, Group, OrganizationRecordsConfiguration } from \"@stamhoofd/structures\";\nimport { computed, Ref, unref } from \"vue\";\nimport { useAppContext } from \"../../context\";\nimport { useOrganization, usePlatform } from \"../../hooks\";\n\nexport function useFinancialSupportSettings(options?: {group?: Ref<Group|null>|Group|null}) {\n    const platform = usePlatform()\n    const organization = useOrganization()\n    const app = useAppContext()\n\n    const financialSupportSettings = computed(() => platform.value.config.financialSupport ?? FinancialSupportSettings.create({}) )\n    const recordsConfiguration = computed(() => OrganizationRecordsConfiguration.build({\n        platform: platform.value,\n        organization: organization.value,\n        group: unref(options?.group),\n        includeGroup: true\n    }));\n\n    return {\n        enabled: computed(() => {\n            const group = unref(options?.group);\n            if(!group) {\n                if (app === 'admin') {\n                    return true\n                }\n            }\n\n            return recordsConfiguration.value.financialSupport\n        }),\n        priceName: computed(() => financialSupportSettings.value.priceName),\n        financialSupportSettings\n    }\n}\n","import { usePlatformManager, useRequestOwner } from \"@stamhoofd/networking\";\nimport { computed, onMounted, Ref, unref } from \"vue\";\nimport { Toast } from \"../../overlays/Toast\";\n\nexport function useRegistrationPeriods() {\n    const platformManager = usePlatformManager()\n    const owner = useRequestOwner()\n\n    onMounted(async () => {\n        try {\n            await platformManager.value.loadPeriods(true, true, owner)\n        } catch (e) {\n            Toast.fromError(e).show()\n        }\n    });\n\n    return {\n        loading: computed(() => !platformManager.value.$platform.periods),\n        periods: computed(() => platformManager.value.$platform.periods),\n    }\n}   \n\nexport function useRegistrationPeriod(id: Ref<string>|string) {\n    const periods = useRegistrationPeriods()\n    return computed(() => periods.periods.value?.find(p => p.id == unref(id)) ?? null)\n}   \n","<template>\n    <SaveView :loading=\"saving\" :title=\"title\" :disabled=\"!hasChanges && !isNew\" :deleting=\"deleting\" @save=\"save\" v-on=\"!isNew && deleteHandler ? {delete: deleteMe} : {}\">\n        <h1>\n            {{ title }}\n        </h1>\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <GroupOptionMenuBox :option-menu=\"patched\" :group=\"group\" :errors=\"errors\" :level=\"1\" @patch:option-menu=\"addPatch\" @delete=\"deleteMe\" />\n    </SaveView>\n</template>\n\n<script setup lang=\"ts\">\nimport { AutoEncoderPatchType } from '@simonbackx/simple-encoding';\nimport { usePop } from '@simonbackx/vue-app-navigation';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { Group, GroupOptionMenu } from '@stamhoofd/structures';\nimport { computed, ref } from 'vue';\nimport { useErrors } from '../../errors/useErrors';\nimport { usePatch } from '../../hooks';\nimport { CenteredMessage } from '../../overlays/CenteredMessage';\nimport { Toast } from '../../overlays/Toast';\n\nimport GroupOptionMenuBox from './GroupOptionMenuBox.vue';\n\nconst props = withDefaults(\n    defineProps<{\n        optionMenu: GroupOptionMenu;\n        group: Group;\n        isNew: boolean;\n        saveHandler: (price: AutoEncoderPatchType<GroupOptionMenu>) => Promise<void>;\n        deleteHandler?: (() => Promise<void>)|null,\n        showToasts?: boolean\n    }>(),\n    {\n        deleteHandler: null,\n        showToasts: true\n    }\n);\n\nconst {patched, hasChanges, addPatch, patch} = usePatch(props.optionMenu);\nconst errors = useErrors();\nconst saving = ref(false);\nconst deleting = ref(false);\nconst $t = useTranslate();\nconst pop = usePop();\n\nconst title = computed(() => {\n    return props.isNew ? $t('a587b5d0-594e-421c-95a5-35c0c560938c') : $t('d7d3677f-6225-4769-a5b1-389a769bb84a');\n});\n\nasync function save() {\n    if (deleting.value || saving.value) {\n        return;\n    }\n\n    saving.value = true;\n    try {\n        await props.saveHandler(patch.value);\n        await pop({force: true})\n    } catch (e) {\n        Toast.fromError(e).show();\n    } finally {\n        saving.value = false;\n    }\n}\n\nasync function deleteMe() {\n    if (!await CenteredMessage.confirm($t('f58412a9-9db9-4aa3-ad68-fa089d4f345b'), $t('201437e3-f779-47b6-b4de-a0fa00f3863e'), $t('9f8c1ed0-371b-4c22-940c-57d624734c18'))) {\n        return;\n    }\n    if (deleting.value || saving.value || !props.deleteHandler) {\n        return;\n    }\n\n    deleting.value = true;\n    try {\n        await props.deleteHandler();\n        if (props.showToasts) {\n            await Toast.success($t('eb66ea67-3c37-40f2-8572-9589d71ffab6')).show();\n        }\n        await pop({force: true})\n    } catch (e) {\n        Toast.fromError(e).show();\n    } finally {\n        deleting.value = false;\n    }\n}\n\n\nconst shouldNavigateAway = async () => {\n    if (!hasChanges.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm($t('996a4109-5524-4679-8d17-6968282a2a75'), $t('106b3169-6336-48b8-8544-4512d42c4fd6'))\n}\n\ndefineExpose({\n    shouldNavigateAway\n})\n\n\n</script>\n","<template>\n    <STErrorsDefault :error-box=\"ownErrors.errorBox\" />\n    <div class=\"split-inputs\">\n        <STInputBox :title=\"title\" error-fields=\"price\" :error-box=\"errorBox\">\n            <PriceInput v-model=\"price\" placeholder=\"Gratis\" :min=\"min\" />\n            <p v-if=\"defaultMembershipTypeId\" class=\"style-description-small\">\n                {{ formatPriceForPlatform(defaultPrice, defaultPriceNow) }}\n            </p>\n        </STInputBox>\n\n        <STInputBox v-if=\"$showReducedPrice\" :title=\"financialSupportSettings.priceName\" error-fields=\"price\" :error-box=\"errorBox\">\n            <PriceInput v-model=\"reducedPrice\" :placeholder=\"formatPrice(price)\" :min=\"min\" :required=\"false\" />\n            <p v-if=\"defaultMembershipTypeId\" class=\"style-description-small\">\n                {{ formatPriceForPlatform(defaultReducedPrice, defaultReducedPriceNow) }}\n            </p>\n        </STInputBox>\n\n        <slot v-else-if=\"$slots.end\" name=\"end\" />\n    </div>\n\n    <div v-if=\"$slots.end && $showReducedPrice\" class=\"split-inputs\">\n        <slot name=\"end\" />\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { PriceInput, STErrorsDefault, useErrors, useOrganization, usePlatform, useValidation, Validator } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { Group, ReduceablePrice } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed } from 'vue';\nimport { ErrorBox } from '../../errors/ErrorBox';\nimport { useFinancialSupportSettings } from '../hooks';\n\nconst props = withDefaults(\n    defineProps<{\n        validator: Validator;\n        errorBox?: ErrorBox | null;\n        min?: number | null;\n        group?: Group | null;\n        title?: string;\n        defaultMembershipTypeId?: string | null;\n    }>(),\n    {\n        errorBox: null,\n        min: null,\n        title: 'Prijs',\n        group: null,\n        defaultMembershipTypeId: null,\n    },\n);\nconst model = defineModel<ReduceablePrice>({ required: true });\nconst ownErrors = useErrors();\nconst { enabled, financialSupportSettings } = useFinancialSupportSettings({\n    group: computed(() => props.group),\n});\nconst platform = usePlatform();\nconst organization = useOrganization();\nconst $t = useTranslate();\n\nconst $showReducedPrice = computed(() => enabled || reducedPrice.value !== null);\n\nconst defaultReducedPrice = computed(() => getDefaultPrice(true, new Date(0)));\nconst defaultPrice = computed(() => getDefaultPrice(false, new Date(0)));\n\nconst defaultReducedPriceNow = computed(() => getDefaultPrice(true, new Date()));\nconst defaultPriceNow = computed(() => getDefaultPrice(false, new Date()));\n\nconst minPriceDifference = computed(() =>\n    Math.max(0,\n        Math.min(\n            // It is possible that the difference changes over the year, so we should allow them to also alter it after this date\n            defaultPrice.value - defaultReducedPrice.value,\n            defaultPriceNow.value - defaultReducedPriceNow.value,\n        ),\n    ),\n);\n\nfunction getDefaultPrice(isReduced: boolean, date: Date) {\n    if (!props.defaultMembershipTypeId) {\n        return 0;\n    }\n\n    const defaultMembershipTypeId = props.defaultMembershipTypeId;\n    const defaultMembership = platform.value.config.membershipTypes.find(mt => mt.id === defaultMembershipTypeId);\n    if (!defaultMembership) {\n        return 0;\n    }\n\n    return defaultMembership.getPrice(platform.value.period.id, date, organization.value?.meta.tags ?? [], isReduced) ?? 0;\n}\n\nfunction formatPriceForPlatform(price: number, priceNow: number) {\n    if (priceNow < price) {\n        return $t('f6e06abd-3e58-4f99-bc8d-6cf6a44273b3', { price: Formatter.price(price), priceReduced: Formatter.price(priceNow) });\n    }\n    return $t('75815048-939a-4ac1-a81c-f23fc3ec5006', { price: Formatter.price(price) });\n}\n\nuseValidation(props.validator, () => {\n    if (!enabled.value && model.value.reducedPrice !== null) {\n        ownErrors.errorBox = new ErrorBox(new SimpleError({\n            code: 'invalid_reduced_price',\n            field: 'price',\n            message: 'Financial support is not enabled, but you have set a reduced price',\n            human: $t('a83523bb-ba90-4a6c-a73a-4d4f12defe7a', {\n                financialSupportTitle: financialSupportSettings.value.title,\n                financialSupportPriceName: financialSupportSettings.value.priceName,\n            }),\n        }));\n        return false;\n    }\n\n    if (model.value.reducedPrice !== null && model.value.reducedPrice !== 0\n        && (model.value.price - model.value.reducedPrice) < minPriceDifference.value\n    ) {\n        ownErrors.errorBox = new ErrorBox(new SimpleError({\n            code: 'invalid_reduced_price',\n            field: 'price',\n            message: 'Reduced price should be at least be the normal price minus the minimum difference between the normal and reduced price',\n            human: $t('77578f4e-049c-4d64-b63c-357fb6d0d7ac', {\n                financialSupportPriceName: financialSupportSettings.value.priceName,\n                minDifference: Formatter.price(minPriceDifference.value),\n            }),\n        }));\n        return false;\n    }\n\n    ownErrors.errorBox = null;\n    return true;\n}, 'price');\n\nconst price = computed({\n    get: () => model.value.price,\n    set: price => model.value = model.value.patch({ price }),\n});\nconst reducedPrice = computed({\n    get: () => model.value.reducedPrice,\n    set: reducedPrice => model.value = model.value.patch({ reducedPrice }),\n});\n</script>\n","<template>\n    <SaveView :loading=\"saving\" :title=\"title\" :disabled=\"!hasChanges\" :deleting=\"deleting\" @save=\"save\" v-on=\"!isNew && deleteHandler ? {delete: deleteMe} : {}\">\n        <h1>\n            {{ title }}\n        </h1>\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <STInputBox title=\"Naam\" error-fields=\"name\" :error-box=\"errors.errorBox\">\n            <input\n                v-model=\"name\"\n                class=\"input\"\n                type=\"text\"\n                placeholder=\"Naam van deze keuze\"\n                autocomplete=\"off\"\n            >\n        </STInputBox>\n\n        <ReduceablePriceInput v-model=\"price\" :group=\"group\" title=\"Meer of minkost\" :error-box=\"errors.errorBox\" :validator=\"errors.validator\" />\n\n        <STList>\n            <STListItem :selectable=\"true\" element-name=\"label\">\n                <template #left>\n                    <Checkbox v-model=\"hidden\" />\n                </template>\n\n                <h3 class=\"style-title-list\">\n                    Verborgen\n                </h3>\n                <p v-if=\"hidden\" class=\"style-description-small\">\n                    Deze keuze wordt onzichtbaar in het ledenportaal en is enkel manueel toe te voegen door een beheerder.\n                </p>\n            </STListItem>\n            \n            <STListItem :selectable=\"true\" element-name=\"label\">\n                <template #left>\n                    <Checkbox v-model=\"allowAmount\" />\n                </template>\n\n                <h3 class=\"style-title-list\">\n                    Meerdere stuks\n                </h3>\n                <p class=\"style-description-small\">\n                    Een lid kan zelf een aantal stuks kiezen met een invulveld en plus- en minknop bij deze keuze.\n                </p>\n            </STListItem>\n\n            <STListItem v-if=\"allowAmount\" :selectable=\"true\" element-name=\"label\">\n                <template #left>\n                    <Checkbox v-model=\"useMaximum\" />\n                </template>\n\n                <h3 class=\"style-title-list\">\n                    Beperk hoeveel stuks maximaal kunnen worden gekozen per inschrijving\n                </h3>\n\n                <div v-if=\"useMaximum\" class=\"split-inputs option\" @click.stop.prevent>\n                    <STInputBox title=\"Maximum aantal\" error-fields=\"maximum\" :error-box=\"errors.errorBox\">\n                        <NumberInput v-model=\"maximum\" suffix=\"stuks\" suffix-singular=\"stuk\" :required=\"false\" :placeholder=\"$t('c5562430-7c78-454c-8d61-7b4a98fbaf02')\" :min=\"2\" />\n                    </STInputBox>\n                </div>\n            </STListItem>\n\n            <STListItem :selectable=\"true\" element-name=\"label\">\n                <template #left>\n                    <Checkbox v-model=\"useStock\" />\n                </template>\n\n                <h3 class=\"style-title-list\">\n                    Beperk het totale beschikbare aantal stuks (waarvan nu {{ usedStock }} ingenomen of gereserveerd)\n                </h3>\n\n                <div v-if=\"useStock\" class=\"split-inputs option\" @click.stop.prevent>\n                    <STInputBox title=\"\" error-fields=\"stock\" :error-box=\"errors.errorBox\">\n                        <NumberInput v-model=\"stock\" suffix=\"stuks\" suffix-singular=\"stuk\" />\n                    </STInputBox>\n                </div>\n            </STListItem>\n        </STList>\n    </SaveView>\n</template>\n\n<script setup lang=\"ts\">\nimport { AutoEncoderPatchType } from '@simonbackx/simple-encoding';\nimport { usePop } from '@simonbackx/vue-app-navigation';\nimport { NumberInput } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { Group, GroupOption, GroupOptionMenu } from '@stamhoofd/structures';\nimport { computed, ref } from 'vue';\nimport { useErrors } from '../../errors/useErrors';\nimport { usePatch } from '../../hooks';\nimport { CenteredMessage } from '../../overlays/CenteredMessage';\nimport { Toast } from '../../overlays/Toast';\nimport ReduceablePriceInput from './ReduceablePriceInput.vue';\n\nconst props = withDefaults(\n    defineProps<{\n        option: GroupOption;\n        optionMenu: GroupOptionMenu;\n        group: Group;\n        isNew: boolean;\n        saveHandler: (price: AutoEncoderPatchType<GroupOption>) => Promise<void>;\n        deleteHandler?: (() => Promise<void>)|null,\n        showToasts?: boolean\n    }>(),\n    {\n        deleteHandler: null,\n        showToasts: true\n    }\n);\n\nconst {patched, hasChanges, addPatch, patch} = usePatch(props.option);\nconst errors = useErrors();\nconst saving = ref(false);\nconst deleting = ref(false);\nconst $t = useTranslate();\nconst pop = usePop();\n\nconst title = computed(() => {\n    return props.isNew ? $t('c4c91c69-3b09-4db5-b83f-170475a509f7') : $t('0dbd634f-8012-4d75-97a2-594f6dffe752');\n});\n\nconst name = computed({\n    get: () => patched.value.name,\n    set: (name) => addPatch({name})\n})\nconst price = computed({\n    get: () => patched.value.price,\n    set: (price) => addPatch({price})\n})\n\nconst hidden = computed({\n    get: () => patched.value.hidden,\n    set: (hidden) => addPatch({hidden})\n})\n\nconst stock = computed({\n    get: () => patched.value.stock,\n    set: (stock) => addPatch({stock})\n})\n\n\nconst usedStock = computed(() => patched.value.getUsedStock(props.group) || 0);\n\nconst useStock = computed({\n    get: () => patched.value.stock !== null,\n    set: (useStock) => addPatch({stock: useStock ? (patched.value.getUsedStock(props.group) || 10) : null})\n})\n\nconst maximum = computed({\n    get: () => patched.value.maximum,\n    set: (maximum) => addPatch({maximum})\n})\n\nconst useMaximum = computed({\n    get: () => patched.value.maximum !== null,\n    set: (useMaximum) => addPatch({maximum: useMaximum ? 10 : null})\n})\n\nconst allowAmount = computed({\n    get: () => patched.value.allowAmount,\n    set: (allowAmount) => addPatch({allowAmount})\n})\n\nasync function save() {\n    if (deleting.value || saving.value) {\n        return;\n    }\n\n    saving.value = true;\n    try {\n        await props.saveHandler(patch.value);\n        await pop({force: true})\n    } catch (e) {\n        Toast.fromError(e).show();\n    } finally {\n        saving.value = false;\n    }\n}\n\nasync function deleteMe() {\n    if (!await CenteredMessage.confirm($t('6e82b7fc-581f-43cb-8b3a-cff97b9820ed'), $t('201437e3-f779-47b6-b4de-a0fa00f3863e'), $t('659cbbac-a470-4ab6-803d-b45ac580ea68'))) {\n        return;\n    }\n    if (deleting.value || saving.value || !props.deleteHandler) {\n        return;\n    }\n\n    deleting.value = true;\n    try {\n        await props.deleteHandler();\n        if (props.showToasts) {\n            await Toast.success($t('eb66ea67-3c37-40f2-8572-9589d71ffab6')).show();\n        }\n        await pop({force: true})\n    } catch (e) {\n        Toast.fromError(e).show();\n    } finally {\n        deleting.value = false;\n    }\n}\n\n\nconst shouldNavigateAway = async () => {\n    if (!hasChanges.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm($t('996a4109-5524-4679-8d17-6968282a2a75'), $t('106b3169-6336-48b8-8544-4512d42c4fd6'))\n}\n\ndefineExpose({\n    shouldNavigateAway\n})\n\n\n</script>\n","<template>\n    <div class=\"container\">\n        <template v-if=\"level === 2\">\n            <h2 class=\"style-with-button\">\n                <div @contextmenu.prevent=\"showContextMenu\">\n                    {{ name }}\n                </div>\n                <div>\n                    <button class=\"button icon more\" type=\"button\" @click=\"showContextMenu\" />\n                    <button class=\"button icon add\" type=\"button\" @click=\"addOption\" />\n                </div>\n            </h2>\n            <p v-if=\"description\" class=\"style-description pre-wrap\" v-text=\"description\" />\n        </template>\n\n        <template v-if=\"level === 1\">\n            <STInputBox title=\"Naam\" error-fields=\"name\" :error-box=\"errors.errorBox\">\n                <input\n                    v-model=\"name\"\n                    class=\"input\"\n                    type=\"text\"\n                    placeholder=\"Naam van dit menu\"\n                    autocomplete=\"off\"\n                >\n            </STInputBox>\n\n            <STInputBox title=\"Beschrijving\" error-fields=\"description\" :error-box=\"errors.errorBox\" class=\"max\">\n                <textarea\n                    v-model=\"description\"\n                    class=\"input\"\n                    type=\"text\"\n                    placeholder=\"Optioneel. Meer info bij keuzes.\"\n                    autocomplete=\"off\"\n                    enterkeyhint=\"next\"\n                />\n            </STInputBox>\n\n            <STList>\n                <STListItem element-name=\"label\" :selectable=\"true\">\n                    <template #left>\n                        <Checkbox v-model=\"multipleChoice\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        Meerkeuze\n                    </h3>\n                    <p class=\"style-description-small\">\n                        Bij meerkeuze is het mogelijk om verschillende opties aan te duiden. In het andere geval moet er exact één keuze gemaakt worden (wil je het optioneel maken, voeg dan een optie 'Geen' toe).\n                    </p>\n                </STListItem>\n            </STList>\n\n            \n            <hr>\n            <h2 class=\"style-with-button\">\n                <div>Keuzes</div>\n                <div>\n                    <button class=\"button text only-icon-smartphone\" type=\"button\" @click=\"addOption\">\n                        <span class=\"icon add\" />\n                        <span>Keuze</span>\n                    </button>\n                </div>\n            </h2>\n        </template>\n\n        <STList v-model=\"draggableOptions\" :draggable=\"true\">\n            <template #item=\"{item: option, index}\">\n                <STListItem :selectable=\"true\" class=\"right-stack\" @click=\"editOption(option)\">\n                    <template #left>\n                        <Radio v-if=\"!optionMenu.multipleChoice\" :model-value=\"index === 0\" :value=\"true\" :disabled=\"true\" />\n                        <Checkbox v-else :disabled=\"true\" />\n                    </template>\n\n                    <h3 class=\"style-title-list\">\n                        {{ option.name }}\n                    </h3>\n\n                    <p class=\"style-description-small\">\n                        {{ formatPriceChange(option.price.price) }}\n                    </p>\n\n                    <p v-if=\"option.price.reducedPrice !== null\" class=\"style-description-small\">\n                        {{ reducedPriceName }}: <span>{{ formatPriceChange(option.price.reducedPrice) }}</span>\n                    </p>\n\n                    <p v-if=\"option.stock !== null\" class=\"style-description-small\">\n                        Nog {{ pluralText(option.getRemainingStock(group), 'stuk', 'stuks') }} beschikbaar\n                    </p>\n\n                    <p v-if=\"option.maximum !== null && option.allowAmount\" class=\"style-description-small\">\n                        Maximaal {{ pluralText(option.maximum, 'stuk', 'stuks') }} per inschrijving\n                    </p>\n\n                    <template #right>\n                        <StepperInput v-if=\"option.allowAmount\" />\n                        <span v-if=\"option.hidden\" v-tooltip=\"$t('aff982ed-0f1a-4838-af79-9e00cd53131b')\" class=\"icon gray eye-off\" />\n                        <span class=\"button icon drag gray\" @click.stop @contextmenu.stop />\n                        <span class=\"icon arrow-right-small gray\" />\n                    </template>\n                </STListItem>\n            </template>\n        </STList>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { AutoEncoderPatchType, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, usePresent } from '@simonbackx/vue-app-navigation';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { Group, GroupOption, GroupOptionMenu, GroupSettings } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { useErrors } from '../../errors/useErrors';\nimport { useDraggableArray, useEmitPatch, usePatchableArray, usePatchMoveUpDownSingle } from '../../hooks';\nimport StepperInput from '../../inputs/StepperInput.vue';\nimport { CenteredMessage } from '../../overlays/CenteredMessage';\nimport { ContextMenu, ContextMenuItem } from '../../overlays/ContextMenu';\nimport { useFinancialSupportSettings } from '../hooks';\nimport GroupOptionMenuView from './GroupOptionMenuView.vue';\nimport GroupOptionView from './GroupOptionView.vue';\n\nconst props = withDefaults(\n    defineProps<{\n        optionMenu: GroupOptionMenu,\n        group: Group,\n        errors: ReturnType<typeof useErrors>,\n        level: 1|2\n    }>(),\n    {\n        level: 2\n    }\n);\n\nconst emit = defineEmits(['patch:optionMenu', 'delete', 'patch:group'])\nconst {patched, addPatch} = useEmitPatch<GroupOptionMenu>(props, emit, 'optionMenu');\nconst present = usePresent();\nconst {priceName: reducedPriceName} = useFinancialSupportSettings({\n    group: computed(() => props.group)\n})\nconst {up, canMoveUp, canMoveDown, down} = usePatchMoveUpDownSingle(props.optionMenu.id, computed(() => props.group.settings.optionMenus), (patch) => {\n    emit('patch:group', Group.patch({\n        settings: GroupSettings.patch({\n            optionMenus: patch\n        })\n    }))\n})\n\nconst $t = useTranslate();\n\nconst patchOptionsArray = (options: PatchableArrayAutoEncoder<GroupOption>) => {\n    addPatch({\n        options\n    })\n}\nconst {addPatch: addOptionPatch, addPut: addOptionPut, addDelete: addOptionDelete} = usePatchableArray(patchOptionsArray)\nconst draggableOptions = useDraggableArray(() => patched.value.options, patchOptionsArray)\n\nconst name = computed({\n    get: () => patched.value.name,\n    set: (name) => addPatch({name})\n})\n\nconst description = computed({\n    get: () => patched.value.description,\n    set: (description) => addPatch({description})\n})\n\nconst multipleChoice = computed({\n    get: () => patched.value.multipleChoice,\n    set: (multipleChoice) => addPatch({multipleChoice})\n})\n\nfunction addOption() {\n    const price = GroupOption.create({\n        name: $t('9b0aebaf-d119-49df-955b-eb57654529e5'),\n        price: patched.value.options[0]?.price?.clone()\n    })\n    addOptionPut(price)\n}\n\nasync function editOption(option: GroupOption) {\n    await present({\n        components: [\n            new ComponentWithProperties(GroupOptionView, {\n                option,\n                optionMenu: patched.value,\n                group: props.group,\n                isNew: false,\n                saveHandler: async (patch: AutoEncoderPatchType<GroupOption>) => {\n                    addOptionPatch(patch)\n                },\n                deleteHandler: () => {\n                    addOptionDelete(option.id)\n                }\n            })\n        ],\n        modalDisplayStyle: \"popup\"\n    })\n}\n\nasync function editOptionMenu() {\n    await present({\n        components: [\n            new ComponentWithProperties(GroupOptionMenuView, {\n                optionMenu: patched.value,\n                group: props.group,\n                isNew: false,\n                saveHandler: async (patch: AutoEncoderPatchType<GroupOptionMenu>) => {\n                    addPatch(patch)\n                },\n                deleteHandler: () => {\n                    emit('delete')\n                }\n            })\n        ],\n        modalDisplayStyle: \"popup\"\n    })\n}\n\nasync function  showContextMenu(event: MouseEvent) {\n    const menu = new ContextMenu([\n        [\n            new ContextMenuItem({\n                name: \"Instellingen\",\n                icon: \"settings\",\n                action: async () => {\n                    await editOptionMenu()\n                    return true;\n                }\n            }),\n\n            new ContextMenuItem({\n                name: \"Verwijderen\",\n                icon: \"trash\",\n                action: async () => {\n                    if (!await CenteredMessage.confirm($t('f58412a9-9db9-4aa3-ad68-fa089d4f345b'), $t('201437e3-f779-47b6-b4de-a0fa00f3863e'), $t('9f8c1ed0-371b-4c22-940c-57d624734c18'))) {\n                        return;\n                    }\n                    emit('delete')\n                    return true;\n                }\n            }),\n        ],\n        [\n            new ContextMenuItem({\n                name: \"Omhoog verplaatsen\",\n                icon: \"arrow-up\",\n                disabled: !canMoveUp.value,\n                action: async () => {\n                    up()\n                    return true;\n                }\n            }),\n            new ContextMenuItem({\n                name: \"Omlaag verplaatsen\",\n                icon: \"arrow-down\",\n                disabled: !canMoveDown.value,\n                action: async () => {\n                    down()\n                    return true;\n                }\n            }),\n        ]\n    ])\n    menu.show({ clickEvent: event }).catch(console.error)\n}\n</script>\n","<template>\n    <div>\n        <STInputBox v-if=\"!isSingle\" title=\"Naam\" error-fields=\"name\" :error-box=\"errors.errorBox\">\n            <input\n                v-model=\"name\"\n                class=\"input\"\n                type=\"text\"\n                placeholder=\"Naam van dit tarief\"\n                autocomplete=\"off\"\n            >\n        </STInputBox>\n\n        <ReduceablePriceInput v-model=\"groupPrice\" :group=\"group\" :error-box=\"errors.errorBox\" :validator=\"errors.validator\" :default-membership-type-id=\"defaultMembershipTypeId\" />\n\n        <STList>\n            <STListItem v-if=\"!isSingle || hidden\" :selectable=\"true\" element-name=\"label\">\n                <template #left>\n                    <Checkbox v-model=\"hidden\" />\n                </template>\n\n                <h3 class=\"style-title-list\">\n                    Verborgen\n                </h3>\n                <p v-if=\"hidden\" class=\"style-description-small\">\n                    Deze keuze wordt onzichtbaar in het ledenportaal en is enkel manueel toe te voegen door een beheerder.\n                </p>\n            </STListItem>\n\n            <STListItem v-if=\"useStock || !isSingle\" :selectable=\"true\" element-name=\"label\">\n                <template #left>\n                    <Checkbox v-model=\"useStock\" />\n                </template>\n\n                <h3 class=\"style-title-list\">\n                    Beperk het beschikbare aantal stuks (waarvan nu {{ usedStock }} ingenomen of gereserveerd)\n                </h3>\n\n                <div v-if=\"useStock\" class=\"split-inputs option\" @click.stop.prevent>\n                    <STInputBox title=\"\" error-fields=\"stock\" :error-box=\"errors.errorBox\">\n                        <NumberInput v-model=\"stock\" suffix=\"stuks\" suffix-singular=\"stuk\" />\n                    </STInputBox>\n                </div>\n            </STListItem>\n        </STList>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { NumberInput } from '@stamhoofd/components';\nimport { Group, GroupPrice } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { ReduceablePriceInput } from '..';\nimport { useErrors } from '../../errors/useErrors';\nimport { useEmitPatch } from '../../hooks';\n\nconst props = withDefaults(defineProps<{\n    price: GroupPrice;\n    group: Group;\n    errors: ReturnType<typeof useErrors>;\n    defaultMembershipTypeId?: string | null;\n    showNameAlways?: boolean;\n}>(), {\n    defaultMembershipTypeId: null,\n    showNameAlways: false,\n});\n\nconst emit = defineEmits(['patch:price']);\nconst { patched, addPatch } = useEmitPatch<GroupPrice>(props, emit, 'price');\nconst isSingle = computed(() => !props.showNameAlways && props.group.settings.prices.length <= 1);\n\nconst name = computed({\n    get: () => patched.value.name,\n    set: name => addPatch({ name }),\n});\nconst groupPrice = computed({\n    get: () => patched.value.price,\n    set: price => addPatch({ price }),\n});\n\nconst hidden = computed({\n    get: () => patched.value.hidden,\n    set: hidden => addPatch({ hidden }),\n});\n\nconst stock = computed({\n    get: () => patched.value.stock,\n    set: stock => addPatch({ stock }),\n});\n\nconst usedStock = computed(() => patched.value.getUsedStock(props.group) || 0);\n\nconst useStock = computed({\n    get: () => patched.value.stock !== null,\n    set: useStock => addPatch({ stock: useStock ? (patched.value.getUsedStock(props.group) || 10) : null }),\n});\n\n</script>\n","<template>\n    <SaveView :loading=\"saving\" :title=\"title\" :disabled=\"!hasChanges\" :deleting=\"deleting\" @save=\"save\" v-on=\"!isNew && deleteHandler ? {delete: deleteMe} : {}\">\n        <h1>\n            {{ title }}\n        </h1>\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <GroupPriceBox :price=\"patched\" :group=\"group\" :errors=\"errors\" :default-membership-type-id=\"defaultMembershipTypeId\" :show-name-always=\"showNameAlways\" @patch:price=\"addPatch\" />\n    </SaveView>\n</template>\n\n<script setup lang=\"ts\">\nimport { AutoEncoderPatchType } from '@simonbackx/simple-encoding';\nimport { usePop } from '@simonbackx/vue-app-navigation';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { Group, GroupPrice } from '@stamhoofd/structures';\nimport { computed, ref } from 'vue';\nimport { useErrors } from '../../errors/useErrors';\nimport { usePatch } from '../../hooks';\nimport { CenteredMessage } from '../../overlays/CenteredMessage';\nimport { Toast } from '../../overlays/Toast';\n\nimport GroupPriceBox from './GroupPriceBox.vue';\n\nconst props = withDefaults(\n    defineProps<{\n        price: GroupPrice;\n        group: Group;\n        isNew: boolean;\n        saveHandler: (price: AutoEncoderPatchType<GroupPrice>) => Promise<void>;\n        deleteHandler?: (() => Promise<void>) | null;\n        showToasts?: boolean;\n        defaultMembershipTypeId?: string | null;\n        showNameAlways?: boolean;\n    }>(),\n    {\n        deleteHandler: null,\n        showToasts: true,\n        defaultMembershipTypeId: null,\n        showNameAlways: false,\n    },\n);\n\nconst { patched, hasChanges, addPatch, patch } = usePatch(props.price);\nconst errors = useErrors();\nconst saving = ref(false);\nconst deleting = ref(false);\nconst $t = useTranslate();\nconst pop = usePop();\n\nconst title = computed(() => {\n    return props.isNew ? $t('e70de836-abc7-4fba-ae39-866a3fd0f945') : $t('9470f402-a773-4907-9397-1c047fc96d7f');\n});\n\nasync function save() {\n    if (deleting.value || saving.value) {\n        return;\n    }\n\n    saving.value = true;\n    try {\n        if (!await errors.validator.validate()) {\n            saving.value = false;\n            return;\n        }\n        await props.saveHandler(patch.value);\n        await pop({ force: true });\n    }\n    catch (e) {\n        Toast.fromError(e).show();\n    }\n    finally {\n        saving.value = false;\n    }\n}\n\nasync function deleteMe() {\n    if (!await CenteredMessage.confirm($t('a4feed7d-2c8a-404a-a30d-b1035e3a9e42'), $t('201437e3-f779-47b6-b4de-a0fa00f3863e'), $t('8694b1af-38d0-46f5-a9e2-c70bf96488ec'))) {\n        return;\n    }\n    if (deleting.value || saving.value || !props.deleteHandler) {\n        return;\n    }\n\n    deleting.value = true;\n    try {\n        await props.deleteHandler();\n        if (props.showToasts) {\n            Toast.success($t('eb66ea67-3c37-40f2-8572-9589d71ffab6')).show();\n        }\n        await pop({ force: true });\n    }\n    catch (e) {\n        Toast.fromError(e).show();\n    }\n    finally {\n        deleting.value = false;\n    }\n}\n\nconst shouldNavigateAway = async () => {\n    if (!hasChanges.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm($t('996a4109-5524-4679-8d17-6968282a2a75'), $t('106b3169-6336-48b8-8544-4512d42c4fd6'));\n};\n\ndefineExpose({\n    shouldNavigateAway,\n});\n</script>\n","<template>\n    <LoadingViewTransition :error-box=\"loadingExternalOrganizerErrorBox\">\n        <SaveView v-if=\"!loadingOrganizer && period\" :loading=\"saving\" :title=\"title\" :disabled=\"!hasChanges && !isNew\" class=\"group-edit-view\" :deleting=\"deleting\" @save=\"save\" v-on=\"!isNew && deleteHandler ? {delete: deleteMe} : {}\">\n            <h1>\n                {{ title }}\n            </h1>\n\n            <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n            <template v-if=\"type === GroupType.Membership\">\n                <p v-if=\"isNew\" class=\"info-box\">\n                    Maak gebruik van de activiteitenmodule om leden in te schrijven voor activiteiten. Maak daarvoor geen inschrijvingsgroep aan.\n                </p>\n\n                <div class=\"split-inputs\">\n                    <STInputBox title=\"Naam\" error-fields=\"settings.name\" :error-box=\"errors.errorBox\">\n                        <input\n                            ref=\"firstInput\"\n                            v-model=\"name\"\n                            class=\"input\"\n                            type=\"text\"\n                            placeholder=\"Naam van deze groep\"\n                            autocomplete=\"off\"\n                        >\n                    </STInputBox>\n\n                    <STInputBox v-if=\"defaultAgeGroupsFiltered.length\" :title=\"$t('528545c4-028b-4711-9b16-f6fa990c3130')\" error-fields=\"settings.defaultAgeGroupId\" :error-box=\"errors.errorBox\">\n                        <Dropdown v-model=\"defaultAgeGroupId\">\n                            <option :value=\"null\">\n                                Geen automatische aansluiting of verzekeringen (!)\n                            </option>\n                            <option v-for=\"ageGroup of defaultAgeGroupsFiltered\" :key=\"ageGroup.id\" :value=\"ageGroup.id\">\n                                {{ getAgeGroupSelectionText(ageGroup) }}\n                            </option>\n                        </Dropdown>\n                    </STInputBox>\n                </div>\n                <p v-if=\"defaultAgeGroups.length\" class=\"style-description-small\">\n                    {{ $t('e99c7d31-f9fe-4e0f-8947-bdc30784de5b') }}\n                </p>\n            </template>\n\n            <template v-if=\"type === GroupType.WaitingList\">\n                <div class=\"split-inputs\">\n                    <STInputBox title=\"Naam\" error-fields=\"settings.name\" :error-box=\"errors.errorBox\">\n                        <input\n                            ref=\"firstInput\"\n                            v-model=\"name\"\n                            class=\"input\"\n                            type=\"text\"\n                            placeholder=\"bv. Wachtlijst nieuwe leden\"\n                            autocomplete=\"off\"\n                        >\n                    </STInputBox>\n                </div>\n            </template>\n\n            <STInputBox title=\"Beschrijving\" error-fields=\"settings.description\" :error-box=\"errors.errorBox\" class=\"max\">\n                <textarea\n                    v-model=\"description\"\n                    class=\"input\"\n                    type=\"text\"\n                    placeholder=\"Zichtbaar voor leden tijdens het inschrijven. Hier kan je bijvoorbeeld inschrijvinginstructies kwijt, of informatie geven over prijzen.\"\n                    autocomplete=\"off\"\n                />\n            </STInputBox>\n            <p v-if=\"patched.type === GroupType.EventRegistration\" class=\"style-description-small\">\n                De beschrijving is zichtbaar als leden doorklikken om in te schrijven voor de activiteit.\n            </p>\n\n            <template v-if=\"patched.type === GroupType.EventRegistration && isMultiOrganization\">\n                <hr>\n                <h2>Organisator</h2>\n                <p>Voor nationale activiteiten moet je kiezen via welke groep alle betalingen verlopen. De betaalinstellingen van die groep worden dan gebruikt en alle inschrijvingen worden dan ingeboekt in de boekhouding van die groep.</p>\n                <p class=\"style-description-block\">\n                    Daarnaast bepaalt de organisator ook instellingen die invloed hebben op de dataverzameling en andere subtielere zaken.\n                </p>\n\n                <STList>\n                    <STListItem v-if=\"externalOrganization\" :selectable=\"isNew\" @click=\"isNew ? chooseOrganizer('Kies een organisator') : undefined\">\n                        <template #left>\n                            <OrganizationAvatar :organization=\"externalOrganization\" />\n                        </template>\n\n                        <h3 class=\"style-title-list\">\n                            {{ externalOrganization.name }}\n                        </h3>\n                        <p class=\"style-description\">\n                            {{ externalOrganization.address.anonymousString(Country.Belgium) }}\n                        </p>\n\n                        <template v-if=\"isNew\" #right>\n                            <span class=\"icon arrow-right-small gray\" />\n                        </template>\n                    </STListItem>\n                </STList>\n            </template>\n\n            <div v-if=\"type !== GroupType.WaitingList || patched.settings.prices.length !== 1 || patched.settings.prices[0]?.price.price\" class=\"container\">\n                <hr>\n                <h2 class=\"style-with-button\">\n                    <div>{{ $t('0fb1a3a9-4ced-4097-b931-e865b3173cf9') }}</div>\n                    <div>\n                        <button class=\"button text only-icon-smartphone\" type=\"button\" @click=\"addGroupPrice\">\n                            <span class=\"icon add\" />\n                            <span>{{ $t('a5ecc2e0-c1f2-4cfb-b4b2-8a17782787bc') }}</span>\n                        </button>\n                    </div>\n                </h2>\n                <p>{{ $t(\"de2222d9-c934-4d06-8702-9527686de012\") }}</p>\n\n                <STList v-if=\"patched.settings.prices.length !== 1\" v-model=\"draggablePrices\" :draggable=\"true\">\n                    <template #item=\"{item: price}\">\n                        <STListItem :selectable=\"true\" class=\"right-stack\" @click=\"editGroupPrice(price)\">\n                            <h3 class=\"style-title-list\">\n                                {{ price.name }}\n                            </h3>\n\n                            <p class=\"style-description-small\">\n                                Prijs: {{ formatPrice(price.price.price) }}\n                            </p>\n\n                            <p v-if=\"price.price.reducedPrice !== null\" class=\"style-description-small\">\n                                {{ reducedPriceName }}: <span>{{ formatPrice(price.price.reducedPrice) }}</span>\n                            </p>\n\n                            <p v-if=\"price.isSoldOut(patched)\" class=\"style-description-small\">\n                                Uitverkocht\n                            </p>\n                            <p v-else-if=\"price.stock\" class=\"style-description-small\">\n                                Nog {{ pluralText(price.getRemainingStock(patched) ?? 0, 'stuk', 'stuks') }} beschikbaar\n                            </p>\n\n                            <template #right>\n                                <span v-if=\"price.hidden\" v-tooltip=\"$t('aff982ed-0f1a-4838-af79-9e00cd53131b')\" class=\"icon gray eye-off\" />\n                                <span class=\"button icon drag gray\" @click.stop @contextmenu.stop />\n                                <span class=\"icon arrow-right-small gray\" />\n                            </template>\n                        </STListItem>\n                    </template>\n                </STList>\n                <GroupPriceBox v-else :price=\"patched.settings.prices[0]\" :group=\"patched\" :errors=\"errors\" :default-membership-type-id=\"defaultMembershipTypeId\" @patch:price=\"addPricePatch\" />\n            </div>\n\n            <div v-for=\"optionMenu of patched.settings.optionMenus\" :key=\"optionMenu.id\" class=\"container\">\n                <hr>\n                <GroupOptionMenuBox :option-menu=\"optionMenu\" :group=\"patched\" :errors=\"errors\" :level=\"2\" @patch:group=\"addPatch\" @patch:option-menu=\"addOptionMenuPatch\" @delete=\"addOptionMenuDelete(optionMenu.id)\" />\n            </div>\n\n            <hr>\n\n            <STList>\n                <STListItem :selectable=\"true\" element-name=\"button\" @click=\"addGroupOptionMenu()\">\n                    <template #left>\n                        <span class=\"icon add gray\" />\n                    </template>\n\n                    <h3 class=\"style-title-list\">\n                        Vraag of keuzemenu toevoegen\n                    </h3>\n                </STListItem>\n            </STList>\n\n            <hr>\n            <h2>Inschrijvingen via ledenportaal</h2>\n            <p>Leden kunnen zelf inschrijven via het ledenportaal als je deze optie open zet. Ze betalen het opgegeven tarief dan zelf via de betaalmethodes die je hebt ingesteld bij de instellingen van jouw groep.</p>\n\n            <STList>\n                <STListItem :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio v-model=\"virtualOpenStatus\" :value=\"GroupStatus.Closed\" />\n                    </template>\n\n                    <h3 class=\"style-title-list\">\n                        Gesloten\n                    </h3>\n                    <p class=\"style-description-small\">\n                        De inschrijvingen zijn gesloten en openen niet automatisch.\n                    </p>\n                </STListItem>\n\n                <STListItem :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio v-model=\"virtualOpenStatus\" value=\"RegistrationStartDate\" />\n                    </template>\n\n                    <h3 class=\"style-title-list\">\n                        Vanaf datum\n                    </h3>\n                    <p class=\"style-description-small\">\n                        De inschrijvingen openen pas vanaf een bepaalde datum.\n                    </p>\n\n                    <div v-if=\"virtualOpenStatus === 'RegistrationStartDate'\" class=\"split-inputs option\" @click.stop.prevent>\n                        <STInputBox :title=\"$t('4f7cef46-0b46-4225-839e-510d8a8b95bc')\" error-fields=\"settings.registrationStartDate\" :error-box=\"errors.errorBox\">\n                            <DateSelection v-model=\"registrationStartDate\" />\n                        </STInputBox>\n                        <TimeInput v-if=\"registrationStartDate\" v-model=\"registrationStartDate\" :title=\"$t('1e43813a-f48e-436c-bb49-e9ebb0f27f58')\" :validator=\"errors.validator\" />\n                    </div>\n                </STListItem>\n\n                <STListItem :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio v-model=\"virtualOpenStatus\" :value=\"GroupStatus.Open\" />\n                    </template>\n\n                    <h3 class=\"style-title-list\">\n                        Open\n                    </h3>\n                    <p class=\"style-description-small\">\n                        De inschrijvingen zijn open\n                    </p>\n                </STListItem>\n\n                <STListItem v-if=\"virtualOpenStatus !== GroupStatus.Closed\" :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Checkbox v-model=\"useRegistrationEndDate\" />\n                    </template>\n\n                    <h3 class=\"style-title-list\">\n                        {{ $t('fd378bac-7d3d-4932-b511-851078805aff') }}\n                    </h3>\n\n                    <div v-if=\"useRegistrationEndDate\" class=\"split-inputs option\" @click.stop.prevent>\n                        <STInputBox :title=\"$t('6905dd1f-fe82-4ddc-bc6c-9ad496d34a71')\" error-fields=\"settings.registrationEndDate\" :error-box=\"errors.errorBox\">\n                            <DateSelection v-model=\"registrationEndDate\" />\n                        </STInputBox>\n                        <TimeInput v-if=\"registrationEndDate\" v-model=\"registrationEndDate\" :title=\"$t('1617abfe-8657-4a9f-9fe3-6e6d896c4ef6')\" :validator=\"errors.validator\" />\n                    </div>\n                </STListItem>\n            </STList>\n\n            <div v-if=\"patched.type === GroupType.Membership\" class=\"container\">\n                <hr>\n                <h2>Restricties</h2>\n\n                <template v-if=\"isPropertyEnabled('birthDay')\">\n                    <div class=\"split-inputs\">\n                        <STInputBox title=\"Minimum leeftijd* (optioneel)\" error-fields=\"settings.minAge\" :error-box=\"errors.errorBox\">\n                            <AgeInput v-model=\"minAge\" :year=\"period.startDate.getFullYear()\" placeholder=\"Onbeperkt\" :nullable=\"true\" />\n                        </STInputBox>\n\n                        <STInputBox title=\"Maximum leeftijd* (optioneel)\" error-fields=\"settings.maxAge\" :error-box=\"errors.errorBox\">\n                            <AgeInput v-model=\"maxAge\" :year=\"period.startDate.getFullYear()\" placeholder=\"Onbeperkt\" :nullable=\"true\" />\n                        </STInputBox>\n                    </div>\n                    <p class=\"st-list-description\">\n                        *Hoe oud het lid is op 31/12/{{ period.startDate.getFullYear() }}.<template v-if=\"externalOrganization?.address.country === Country.Belgium\">\n                            Ter referentie: leden uit het eerste leerjaar zijn 6 jaar op 31 december. Leden uit het eerste secundair zijn 12 jaar op 31 december.\n                        </template>\n                    </p>\n                </template>\n\n                <STInputBox v-if=\"isPropertyEnabled('gender')\" title=\"Jongens en meisjes\" error-fields=\"genderType\" :error-box=\"errors.errorBox\" class=\"max\">\n                    <STList>\n                        <STListItem v-for=\"_genderType in genderTypes\" :key=\"_genderType.value\" element-name=\"label\" :selectable=\"true\">\n                            <template #left>\n                                <Radio v-model=\"genderType\" :value=\"_genderType.value\" />\n                            </template>\n\n                            <h3 class=\"style-title-list\">\n                                {{ _genderType.name }}\n                            </h3>\n                        </STListItem>\n                    </STList>\n                </STInputBox>\n\n                <STInputBox title=\"Aansluiting\" error-fields=\"requirePlatformMembershipOnRegistrationDate\" :error-box=\"errors.errorBox\" class=\"max\">\n                    <STList>\n                        <STListItem :selectable=\"true\" element-name=\"label\">\n                            <template #left>\n                                <Checkbox v-model=\"requirePlatformMembershipOnRegistrationDate\" />\n                            </template>\n\n                            <h3 class=\"style-title-list\">\n                                Aansluiting is verplicht\n                            </h3>\n                            <p class=\"style-description-small\">\n                                Een lid moet een aansluiting hebben op de dag van de inschrijving.\n                            </p>\n                        </STListItem>\n                    </STList>\n                </STInputBox>\n\n                <button v-if=\"requireGroupIds.length === 0\" type=\"button\" class=\"button text only-icon-smartphone\" @click=\"addRequireGroupIds\">\n                    <span class=\"icon add\" />\n                    <span>Verplicht andere inschrijving</span>\n                </button>\n            </div>\n\n            <div v-if=\"showAllowRegistrationsByOrganization || showEnableMaxMembers\" class=\"container\">\n                <hr>\n                <h2>Beschikbaarheid</h2>\n                <STList>\n                    <STListItem v-if=\"showAllowRegistrationsByOrganization\" :selectable=\"true\" element-name=\"label\">\n                        <template #left>\n                            <Checkbox v-model=\"allowRegistrationsByOrganization\" />\n                        </template>\n                        <h3 class=\"style-title-list\">\n                            Groepinschrijvingen\n                        </h3>\n                        <p class=\"style-description-small\">\n                            Een hoofdbeheerder van een groep kan meerdere leden inschrijven en schiet de betaling voor. De leden betalen vervolgens via een openstaand bedrag het geld terug aan hun groep.\n                        </p>\n                    </STListItem>\n                    <STListItem v-if=\"showEnableMaxMembers\" :selectable=\"true\" element-name=\"label\">\n                        <template #left>\n                            <Checkbox v-model=\"enableMaxMembers\" />\n                        </template>\n                        <h3 class=\"style-title-list\">\n                            Limiteer maximum aantal inschrijvingen (waarvan nu {{ usedStock }} ingenomen of gereserveerd)\n                        </h3>\n                        <div v-if=\"enableMaxMembers\" class=\"option\" @click.stop.prevent>\n                            <STInputBox title=\"\" error-fields=\"maxMembers\" :error-box=\"errors.errorBox\">\n                                <NumberInput v-model=\"maxMembers\" :min=\"0\" suffix=\"leden\" suffix-singular=\"lid\" />\n                            </STInputBox>\n                            <p class=\"style-description-small\">\n                                Als er een wachtlijst is ingesteld kunnen de leden op de wachtlijst inschrijven als de groep volzet is.\n                            </p>\n                        </div>\n                    </STListItem>\n                </STList>\n            </div>\n\n            <div v-if=\"patched.waitingList || enableMaxMembers\" class=\"container\">\n                <hr>\n                <h2>Wachtlijst</h2>\n                <p>Je kan een wachtlijst delen tussen verschillende leeftijdsgroepen. Op die manier kan je de wachtlijst makkelijk meerdere jaren aanhouden. Kies hieronder welke wachtlijst van toepassing is voor deze groep.</p>\n                <p class=\"style-description-block\">\n                    Je kan indien gewenst ook nog vragen stellen aan leden die op de wachtlijst willen inschrijven.\n                </p>\n\n                <STList v-if=\"availableWaitingLists.length\">\n                    <STListItem :selectable=\"true\" element-name=\"label\">\n                        <template #left>\n                            <Radio v-model=\"waitingList\" :value=\"null\" />\n                        </template>\n\n                        <h3 class=\"style-title-list\">\n                            Geen wachtlijst\n                        </h3>\n                    </STListItem>\n\n                    <STListItem v-for=\"{list, description: waitingListDescription} of availableWaitingLists\" :key=\"list.id\" :selectable=\"true\" element-name=\"label\">\n                        <template #left>\n                            <Radio v-model=\"waitingList\" :value=\"list\" />\n                        </template>\n\n                        <h3 class=\"style-title-list\">\n                            {{ list.settings.name }}\n                        </h3>\n                        <p class=\"style-description-small\">\n                            {{ waitingListDescription }}\n                        </p>\n\n                        <template #right>\n                            <button class=\"button icon edit gray\" type=\"button\" @click=\"editWaitingList(list)\" />\n                        </template>\n                    </STListItem>\n                </STList>\n                <p v-else class=\"info-box\">\n                    Er zijn nog geen wachtlijsten aangemaakt.\n                </p>\n\n                <p class=\"style-button-bar\">\n                    <button type=\"button\" class=\"button text\" @click=\"addWaitingList\">\n                        <span class=\"icon add\" />\n                        <span>Nieuwe wachtlijst maken</span>\n                    </button>\n                </p>\n            </div>\n\n            <template v-if=\"waitingListType !== WaitingListType.None || (enableMaxMembers && type === GroupType.Membership)\">\n                <hr>\n                <h2>Voorrangsregeling online inschrijvingen</h2>\n                <p>Zorg ervoor dat bestaande leden voorrang krijgen op inschrijvingen (vooral als je met wachtlijsten werkt).</p>\n\n                <p v-if=\"waitingListType === WaitingListType.PreRegistrations || waitingListType === WaitingListType.ExistingMembersFirst\" class=\"info-box\">\n                    {{ $t('e2130593-e64d-4f3a-bb16-75ba4ed7604e') }}\n                </p>\n\n                <STList>\n                    <STListItem :selectable=\"true\" element-name=\"label\">\n                        <template #left>\n                            <Radio v-model=\"waitingListType\" :value=\"WaitingListType.None\" />\n                        </template>\n\n                        <h3 class=\"style-title-list\">\n                            Iedereen kan gelijk starten met inschrijven (tot het maximum)\n                        </h3>\n                    </STListItem>\n\n                    <STListItem :selectable=\"true\" element-name=\"label\" :disabled=\"!waitingList\">\n                        <template #left>\n                            <Radio v-model=\"waitingListType\" :value=\"WaitingListType.ExistingMembersFirst\" :disabled=\"!waitingList\" />\n                        </template>\n\n                        <h3 class=\"style-title-list\">\n                            Alle nieuwe leden op wachtlijst\n                        </h3>\n\n                        <p class=\"style-description-small\">\n                            Bestaande leden kunnen meteen inschrijven (tot het maximum). De rest en nieuwe leden kunnen inschrijven op de wachtlijst.\n                        </p>\n\n                        <p v-if=\"!waitingList\" class=\"style-description-small\">\n                            Maak eerst een wachtlijst aan om deze optie te gebruiken.\n                        </p>\n\n                        <div v-if=\"waitingListType === WaitingListType.ExistingMembersFirst\" class=\"option\">\n                            <Checkbox v-model=\"priorityForFamily\">\n                                Ook gezinsleden van bestaande leden rechtstreeks laten inschrijven\n                            </Checkbox>\n                        </div>\n                    </STListItem>\n\n                    <STListItem :selectable=\"true\" element-name=\"label\" :disabled=\"!waitingList\">\n                        <template #left>\n                            <Radio v-model=\"waitingListType\" :value=\"WaitingListType.All\" :disabled=\"!waitingList\" />\n                        </template>\n\n                        <h3 class=\"style-title-list\">\n                            Iedereen op wachtlijst\n                        </h3>\n\n                        <p class=\"style-description-small\">\n                            Iedereen moet manueel worden goedgekeurd. Betaling gebeurt pas bij de definitieve inschrijving.\n                        </p>\n\n                        <p v-if=\"!waitingList\" class=\"style-description-small\">\n                            Maak eerst een wachtlijst aan om deze optie te gebruiken.\n                        </p>\n                    </STListItem>\n\n                    <STListItem :selectable=\"true\" element-name=\"label\" :for=\"WaitingListType.PreRegistrations\" :disabled=\"(!registrationStartDate)\">\n                        <template #left>\n                            <Radio :id=\"WaitingListType.PreRegistrations\" v-model=\"waitingListType\" :value=\"WaitingListType.PreRegistrations\" :disabled=\"(!registrationStartDate)\" />\n                        </template>\n\n                        <h3 class=\"style-title-list\">\n                            Voorinschrijvingen gebruiken\n                        </h3>\n\n                        <p class=\"style-description-small\">\n                            Bestaande leden kunnen al vroeger beginnen met inschrijven.\n                        </p>\n\n                        <p v-if=\"!registrationStartDate\" class=\"style-description-small\">\n                            Stel eerst een startdatum in voor de inschrijvingen om deze optie te kunnen gebruiken.\n                        </p>\n\n                        <div v-if=\"waitingListType === WaitingListType.PreRegistrations\" class=\"option\">\n                            <div class=\"split-inputs\">\n                                <STInputBox title=\"Begindatum voorinschrijvingen\" error-fields=\"settings.preRegistrationsDate\" :error-box=\"errors.errorBox\">\n                                    <DateSelection v-model=\"preRegistrationsDate\" />\n                                </STInputBox>\n\n                                <TimeInput v-model=\"preRegistrationsDate\" title=\"Vanaf\" :validator=\"errors.validator\" />\n                            </div>\n\n                            <Checkbox v-model=\"priorityForFamily\">\n                                Ook gezinsleden van bestaande leden vroeger laten inschrijven\n                            </Checkbox>\n                        </div>\n                    </STListItem>\n                </STList>\n            </template>\n\n            <JumpToContainer v-if=\"patched.type === GroupType.Membership\" class=\"container\" :visible=\"forceShowRequireGroupIds || !!requireGroupIds.length\">\n                <GroupIdsInput v-model=\"requireGroupIds\" :default-period-id=\"patched.periodId\" title=\"Verplichte andere inschrijvingen\" />\n            </JumpToContainer>\n\n            <template v-if=\"$feature('member-trials')\">\n                <template v-if=\"patched.type === GroupType.Membership && (!defaultMembershipConfig || defaultMembershipConfig.trialDays)\">\n                    <hr>\n                    <h2>{{ $t('8265d9e0-32c1-453c-ab2f-d31f1eb244c3') }}</h2>\n                    <p>{{ $t('89a760d7-8995-458c-9635-da104971e95c') }}</p>\n\n                    <STInputBox :title=\"$t('f0ceba51-bad2-4454-9a9b-4b12f0983c82')\" error-fields=\"settings.trialDays\" :error-box=\"errors.errorBox\">\n                        <NumberInput v-model=\"trialDays\" suffix=\"dagen\" suffix-singular=\"dag\" :min=\"0\" :max=\"defaultMembershipConfig?.trialDays ?? null\" />\n                    </STInputBox>\n                    <p v-if=\"defaultMembershipConfig && defaultMembershipConfig.trialDays\" class=\"style-description-small\">\n                        {{ $t('d68a6d63-d782-49e2-84a5-4f77dbfa2977', {days: Formatter.days(defaultMembershipConfig.trialDays)}) }}\n                    </p>\n\n                    <STInputBox :title=\"$t('5ecd5e10-f233-4a6c-8acd-c1abff128a21')\" error-fields=\"settings.startDate\" :error-box=\"errors.errorBox\">\n                        <DateSelection v-model=\"startDate\" :placeholder=\"formatDate(patched.settings.startDate, true)\" :min=\"period?.startDate\" :max=\"period?.endDate\" />\n                    </STInputBox>\n                    <p class=\"style-description-small\">\n                        {{ $t('db636f2c-371d-4209-bd44-eaa6984c2813') }}\n                    </p>\n                </template>\n            </template>\n\n            <hr>\n            <h2>Persoonsgegevens verzamelen</h2>\n            <p>Deze persoonsgegevens zijn verplicht (soms optioneel) in te vullen voor leden die inschrijven. Let erop dat deze gegevens gedeeld zijn met andere inschrijvingen. Als dezelfde gegevens dus voor meerdere inschrijvingen verzameld worden, dan worden ze maar één keer gevraagd (anders kunnen leden de gegevens wel nog nakijken als het al even geleden werd ingevuld) en kan je niet per inschrijving andere gegevens invullen. Gebruik ze dus niet voor tijdelijke vragen.</p>\n            <p v-if=\"auth.hasFullAccess()\" class=\"info-box\">\n                Voeg nieuwe persoonsgegevens toe via Instellingen → Persoonsgegevens van leden.\n            </p>\n            <InheritedRecordsConfigurationBox :group-level=\"true\" :override-organization=\"externalOrganization\" :inherited-records-configuration=\"inheritedRecordsConfiguration\" :records-configuration=\"recordsConfiguration\" @patch:records-configuration=\"patchRecordsConfiguration\" />\n\n            <hr>\n            <h2>Eénmalige vragen</h2>\n            <p>Deze vragen zijn enkel van toepassing op deze specifieke inschrijving en gaan daarna verloren. <strong class=\"style-strong\">Bij elke inschrijving moeten ze opnieuw worden ingegeven:</strong> het antwoord hangt dus vast aan de inschrijving, niet het lid zelf. De antwoorden zijn enkel zichtbaar in de context van een inschrijving, niet tussen de gegevens van een lid.</p>\n\n            <p class=\"warning-box\">\n                <span>\n                    Gebruik dit <strong class=\"style-strong style-underline\">NIET</strong> om persoonsgegevens van leden te verzamelen (bv. GEEN allergieën, al dan niet kunnen zwemmen, dieetvoorkeur...) - anders moeten ze dit per inschrijving en elk jaar opnieuw ingeven en is het niet duidelijk welke gegevens nu de juiste zijn. Voeg hier enkel vragen toe die je éénmalig nodig hebt specifiek voor deze activiteit.\n                </span>\n            </p>\n\n            <EditRecordCategoriesBox :categories=\"patched.settings.recordCategories\" :settings=\"recordEditorSettings\" @patch:categories=\"addRecordCategoriesPatch\" />\n        </SaveView>\n    </LoadingViewTransition>\n</template>\n\n<script setup lang=\"ts\">\nimport { AutoEncoderPatchType, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, usePop, usePresent } from '@simonbackx/vue-app-navigation';\nimport { AgeInput, DateSelection, Dropdown, EditGroupView, EditRecordCategoriesBox, ErrorBox, GroupIdsInput, InheritedRecordsConfigurationBox, LoadingViewTransition, NumberInput, OrganizationAvatar, RecordEditorSettings, RecordEditorType, TimeInput, useRegisterItemFilterBuilders } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { BooleanStatus, Country, DefaultAgeGroup, Group, GroupGenderType, GroupOption, GroupOptionMenu, GroupPrice, GroupSettings, GroupStatus, GroupType, MemberDetails, MemberWithRegistrationsBlob, Organization, OrganizationRecordsConfiguration, Platform, PlatformFamily, PlatformMember, RecordCategory, RegisterItem, Registration, WaitingListType, type MemberProperty } from '@stamhoofd/structures';\nimport { Formatter, StringCompare } from '@stamhoofd/utility';\nimport { computed, ref } from 'vue';\nimport JumpToContainer from '../containers/JumpToContainer.vue';\nimport { useErrors } from '../errors/useErrors';\nimport { useAuth, useDraggableArray, useOrganization, usePatch, usePatchableArray, usePlatform } from '../hooks';\nimport { CenteredMessage } from '../overlays/CenteredMessage';\nimport { Toast } from '../overlays/Toast';\nimport GroupOptionMenuBox from './components/GroupOptionMenuBox.vue';\nimport GroupOptionMenuView from './components/GroupOptionMenuView.vue';\nimport GroupPriceBox from './components/GroupPriceBox.vue';\nimport GroupPriceView from './components/GroupPriceView.vue';\nimport { useExternalOrganization, useFinancialSupportSettings, useRegistrationPeriod } from './hooks';\n\nconst props = withDefaults(\n    defineProps<{\n        group: Group;\n        isMultiOrganization: boolean;\n        isNew: boolean;\n        saveHandler: (group: AutoEncoderPatchType<Group>) => Promise<void>;\n        deleteHandler?: (() => Promise<void>) | null;\n        showToasts?: boolean;\n        organizationHint?: Organization | null;\n    }>(),\n    {\n        deleteHandler: null,\n        showToasts: true,\n        isMultiOrganization: false,\n        organizationHint: null,\n    },\n);\n\nconst platform = usePlatform();\nconst organization = useOrganization();\nconst { patched, hasChanges, addPatch, patch } = usePatch(props.group);\nconst period = useRegistrationPeriod(computed(() => patched.value.periodId));\nconst forceShowRequireGroupIds = ref(false);\nconst usedStock = computed(() => patched.value.settings.getUsedStock(patched.value) || 0);\nconst auth = useAuth();\n\nfunction addRequireGroupIds() {\n    forceShowRequireGroupIds.value = true;\n}\n\nconst { externalOrganization: externalOrganization, choose: chooseOrganizer, loading: loadingOrganizer, errorBox: loadingExternalOrganizerErrorBox } = useExternalOrganization(\n    computed({\n        get: () => patched.value.organizationId,\n        set: (organizationId: string) => addPatch({\n            organizationId,\n        }),\n    }),\n    props.organizationHint\n);\n\nconst patchPricesArray = (prices: PatchableArrayAutoEncoder<GroupPrice>) => {\n    addPatch({\n        settings: GroupSettings.patch({\n            prices,\n        }),\n    });\n};\n\nfunction addRecordCategoriesPatch(categories: PatchableArrayAutoEncoder<RecordCategory>) {\n    addPatch({\n        settings: GroupSettings.patch({\n            recordCategories: categories,\n        }),\n    });\n}\n\nconst { addPatch: addPricePatch, addPut: addPricePut, addDelete: addPriceDelete } = usePatchableArray(patchPricesArray);\nconst draggablePrices = useDraggableArray(() => patched.value.settings.prices, patchPricesArray);\n\nconst { addPatch: addOptionMenuPatch, addPut: addOptionMenuPut, addDelete: addOptionMenuDelete } = usePatchableArray((optionMenus: PatchableArrayAutoEncoder<GroupOptionMenu>) => {\n    addPatch({\n        settings: GroupSettings.patch({\n            optionMenus,\n        }),\n    });\n});\n\nconst recordsConfiguration = computed(() => patched.value.settings.recordsConfiguration);\nconst patchRecordsConfiguration = (recordsConfiguration: AutoEncoderPatchType<OrganizationRecordsConfiguration>) => {\n    addPatch({\n        settings: GroupSettings.patch({\n            recordsConfiguration,\n        }),\n    });\n};\nconst inheritedRecordsConfiguration = computed(() => {\n    return OrganizationRecordsConfiguration.build({\n        platform: platform.value,\n        organization: externalOrganization.value,\n        group: patched.value,\n        includeGroup: false,\n    });\n});\n\nconst errors = useErrors();\nconst saving = ref(false);\nconst deleting = ref(false);\nconst $t = useTranslate();\nconst pop = usePop();\nconst { priceName: reducedPriceName } = useFinancialSupportSettings({\n    group: patched,\n});\nconst present = usePresent();\nconst didSetAutomaticGroup = ref(false);\n\nconst availableWaitingLists = computed(() => {\n    let base = externalOrganization?.value?.period?.waitingLists ?? [];\n\n    // Replace patched waiting lists\n    base = base.map((list) => {\n        if (list.id === patched.value.waitingList?.id) {\n            return patched.value.waitingList;\n        }\n        return list;\n    });\n\n    if (props.group.waitingList && props.group.waitingList.id !== patched.value.waitingList?.id) {\n        base.push(props.group.waitingList);\n    }\n\n    // Add patched waiting list and the end, to maintain ordering\n    if (patched.value.waitingList) {\n        base.push(patched.value.waitingList);\n    }\n\n    // Remove duplicates (removing last one)\n    base = base.filter((v, i, a) => a.findIndex(t => t.id === v.id) === i);\n\n    return base.map((list) => {\n        const usedByGroups = externalOrganization?.value?.period?.groups.filter(g => g.waitingList?.id === list.id);\n        return {\n            list,\n            description: usedByGroups?.length ? 'Deze wachtlijst wordt gebruikt door ' + Formatter.joinLast(usedByGroups.map(g => g.settings.name), ', ', ' en ') : 'Niet gebruikt',\n        };\n    });\n});\n\nconst defaultAgeGroups = computed(() => {\n    return platform.value.config.defaultAgeGroups;\n});\n\nconst defaultAgeGroupsFiltered = computed(() => {\n    const tags = organization.value?.meta.tags ?? [];\n    return defaultAgeGroups.value.filter(defaultAgeGroup => defaultAgeGroup.isEnabledForTags(tags));\n});\n\nconst defaultAgeGroup = computed(() => {\n    return defaultAgeGroups.value.find(g => g.id === patched.value.defaultAgeGroupId);\n});\n\nconst name = computed({\n    get: () => patched.value.settings.name,\n    set: (name) => {\n        addPatch({\n            settings: GroupSettings.patch({\n                name,\n            }),\n        });\n\n        if ((!defaultAgeGroupId.value || didSetAutomaticGroup.value)) {\n            const match = defaultAgeGroups.value.find(g => g.names.find(nn => StringCompare.typoCount(nn, name) === 0));\n            if (match) {\n                defaultAgeGroupId.value = match.id;\n                didSetAutomaticGroup.value = true;\n            }\n            else {\n                defaultAgeGroupId.value = null;\n                didSetAutomaticGroup.value = true;\n            }\n        }\n    },\n});\n\nconst virtualOpenStatus = computed({\n    get: () => {\n        if (patched.value.status !== GroupStatus.Open) {\n            return GroupStatus.Closed;\n        }\n\n        if (useRegistrationStartDate.value) {\n            if (registrationStartDate.value !== props.group.settings.registrationStartDate || (registrationStartDate.value && registrationStartDate.value > new Date())) {\n                return 'RegistrationStartDate' as const;\n            }\n        }\n\n        if (patched.value.status !== props.group.status) {\n            return patched.value.status;\n        }\n\n        if (patched.value.closed && props.group.closed) {\n            return GroupStatus.Closed;\n        }\n\n        return GroupStatus.Open;\n    },\n    set: (val) => {\n        if (val === 'RegistrationStartDate') {\n            addPatch({\n                status: GroupStatus.Open,\n            });\n            useRegistrationStartDate.value = true;\n\n            if (patched.value.settings.registrationEndDate && patched.value.settings.registrationEndDate.getTime() <= Date.now()) {\n                addPatch({\n                    settings: GroupSettings.patch({\n                        registrationEndDate: null,\n                    }),\n                });\n            }\n            return;\n        }\n\n        if (val === GroupStatus.Open) {\n            addPatch({\n                status: GroupStatus.Open,\n            });\n            useRegistrationStartDate.value = false;\n\n            if (patched.value.settings.registrationEndDate && patched.value.settings.registrationEndDate.getTime() <= Date.now()) {\n                addPatch({\n                    settings: GroupSettings.patch({\n                        registrationEndDate: null,\n                    }),\n                });\n            }\n            return;\n        }\n\n        if (val === GroupStatus.Closed) {\n            addPatch({\n                status: GroupStatus.Closed,\n            });\n        }\n    },\n});\n\nconst description = computed({\n    get: () => patched.value.settings.description,\n    set: description => addPatch({\n        settings: GroupSettings.patch({\n            description,\n        }),\n    }),\n});\n\nconst minAge = computed({\n    get: () => patched.value.settings.minAge,\n    set: minAge => addPatch({\n        settings: GroupSettings.patch({\n            minAge,\n        }),\n    }),\n});\n\nconst maxAge = computed({\n    get: () => patched.value.settings.maxAge,\n    set: maxAge => addPatch({\n        settings: GroupSettings.patch({\n            maxAge,\n        }),\n    }),\n});\n\nconst genderType = computed({\n    get: () => patched.value.settings.genderType,\n    set: genderType => addPatch({\n        settings: GroupSettings.patch({\n            genderType,\n        }),\n    }),\n});\n\nconst startDate = computed({\n    get: () => patched.value.settings.startDate,\n    set: startDate => addPatch({\n        settings: GroupSettings.patch({\n            startDate,\n        }),\n    }),\n});\n\nconst requireGroupIds = computed({\n    get: () => patched.value.settings.requireGroupIds,\n    set: requireGroupIds => addPatch({\n        settings: GroupSettings.patch({\n            requireGroupIds: requireGroupIds as any,\n        }),\n    }),\n});\n\nconst showAllowRegistrationsByOrganization = computed(() => props.isMultiOrganization || allowRegistrationsByOrganization.value);\n\nconst allowRegistrationsByOrganization = computed({\n    get: () => patched.value.settings.allowRegistrationsByOrganization,\n    set: allowRegistrationsByOrganization => addPatch({\n        settings: GroupSettings.patch({\n            allowRegistrationsByOrganization,\n        }),\n    }),\n});\n\nconst type = computed(() => patched.value.type);\n\nconst defaultAgeGroupId = computed({\n    get: () => patched.value.defaultAgeGroupId,\n    set: (defaultAgeGroupId) => {\n        addPatch({\n            defaultAgeGroupId,\n        });\n        didSetAutomaticGroup.value = false;\n    },\n});\n\nconst waitingListType = computed({\n    get: () => patched.value.settings.waitingListType,\n    set: (waitingListType) => {\n        addPatch({\n            settings: GroupSettings.patch({\n                waitingListType,\n            }),\n        });\n\n        if (waitingListType === WaitingListType.PreRegistrations) {\n            if (!preRegistrationsDate.value && registrationStartDate.value) {\n                const d = new Date(registrationStartDate.value);\n                d.setMonth(d.getMonth() - 1);\n                preRegistrationsDate.value = d;\n            }\n        }\n        else {\n            preRegistrationsDate.value = null;\n        }\n    },\n});\n\nconst maxMembers = computed({\n    get: () => patched.value.settings.maxMembers,\n    set: maxMembers => addPatch({\n        settings: GroupSettings.patch({\n            maxMembers,\n        }),\n    }),\n});\n\nconst showEnableMaxMembers = computed(() => enableMaxMembers.value || type.value !== GroupType.WaitingList);\n\nconst enableMaxMembers = computed({\n    get: () => patched.value.settings.maxMembers !== null,\n    set: (enableMaxMembers) => {\n        if (!enableMaxMembers) {\n            addPatch({\n                settings: GroupSettings.patch({\n                    maxMembers: null,\n                }),\n            });\n        }\n        else {\n            addPatch({\n                settings: GroupSettings.patch({\n                    maxMembers: props.group.settings.maxMembers ?? patched.value.settings.maxMembers ?? 200,\n                }),\n            });\n        }\n    },\n});\n\nconst requirePlatformMembershipOnRegistrationDate = computed({\n    get: () => patched.value.settings.requirePlatformMembershipOnRegistrationDate === true,\n    set: (value: boolean) => {\n        addPatch({\n            settings: GroupSettings.patch({\n                requirePlatformMembershipOnRegistrationDate: value,\n            }),\n        });\n    },\n});\n\nconst registrationStartDate = computed({\n    get: () => patched.value.settings.registrationStartDate,\n    set: registrationStartDate => addPatch({\n        settings: GroupSettings.patch({\n            registrationStartDate,\n        }),\n    }),\n});\n\nconst registrationEndDate = computed({\n    get: () => patched.value.settings.registrationEndDate,\n    set: registrationEndDate => addPatch({\n        settings: GroupSettings.patch({\n            registrationEndDate,\n        }),\n    }),\n});\n\nconst preRegistrationsDate = computed({\n    get: () => patched.value.settings.preRegistrationsDate,\n    set: preRegistrationsDate => addPatch({\n        settings: GroupSettings.patch({\n            preRegistrationsDate,\n        }),\n    }),\n});\n\nconst priorityForFamily = computed({\n    get: () => patched.value.settings.priorityForFamily,\n    set: priorityForFamily => addPatch({\n        settings: GroupSettings.patch({\n            priorityForFamily,\n        }),\n    }),\n});\n\nconst waitingList = computed({\n    get: () => patched.value.waitingList,\n    set: waitingList => addPatch({\n        waitingList,\n    }),\n});\n\nconst trialDays = computed({\n    get: () => patched.value.settings.trialDays,\n    set: trialDays => addPatch({\n        settings: GroupSettings.patch({\n            trialDays,\n        }),\n    }),\n});\n\nconst useRegistrationStartDate = computed({\n    get: () => !!patched.value.settings.registrationStartDate,\n    set: (useRegistrationStartDate) => {\n        if (!useRegistrationStartDate) {\n            addPatch({\n                settings: GroupSettings.patch({\n                    registrationStartDate: null,\n                }),\n            });\n        }\n        else {\n            addPatch({\n                settings: GroupSettings.patch({\n                    registrationStartDate: props.group.settings.registrationStartDate && props.group.settings.registrationStartDate > new Date() ? props.group.settings.registrationStartDate : new Date(Date.now() + 1000 * 60 * 60 * 24),\n                }),\n            });\n        }\n    },\n});\n\nconst useRegistrationEndDate = computed({\n    get: () => !!patched.value.settings.registrationEndDate,\n    set: (useRegistrationEndDate) => {\n        if (!useRegistrationEndDate) {\n            addPatch({\n                settings: GroupSettings.patch({\n                    registrationEndDate: null,\n                }),\n            });\n        }\n        else {\n            addPatch({\n                settings: GroupSettings.patch({\n                    registrationEndDate: props.group.settings.registrationEndDate ?? new Date(Date.now() + 1000 * 60 * 60 * 24 * 30),\n                }),\n            });\n        }\n    },\n});\n\nconst title = computed(() => {\n    if (props.group.type === GroupType.WaitingList) {\n        return props.isNew ? $t('5936be80-5f7a-429b-8bc2-7afdd47ff232') : $t('b3f49e49-2db8-46e3-8a9b-bc05a4b989c0');\n    }\n\n    if (props.group.type === GroupType.EventRegistration) {\n        return props.isNew ? $t('bd6ad13b-be70-4d03-a1a0-3578786f4df3') : $t('8fd3a74f-5dae-4a7e-bcd3-7ac1da2e7e6c');\n    }\n    return props.isNew ? $t('c7944f69-c772-4cc5-b7c8-2ef96272dfe0') : $t('d886e927-86d1-48ed-93ed-60e924484db1');\n});\n\nconst defaultMembershipTypeId = computed(() => defaultAgeGroup.value?.defaultMembershipTypeId ?? null);\n\nconst defaultMembership = computed(() => {\n    return platform.value.config.membershipTypes.find(t => t.id === defaultMembershipTypeId.value);\n});\nconst defaultMembershipConfig = computed(() => {\n    return defaultMembership.value?.periods.get(patched.value.periodId);\n});\n\nasync function save() {\n    if (deleting.value || saving.value) {\n        return;\n    }\n\n    saving.value = true;\n    try {\n        errors.errorBox = null;\n        if (!await errors.validator.validate()) {\n            saving.value = false;\n            return;\n        }\n        await props.saveHandler(patch.value);\n        if (props.showToasts) {\n            Toast.success($t('1e6b16bd-ca6e-49e2-9792-f8864a140d7b')).show();\n        }\n        await pop({ force: true });\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    finally {\n        saving.value = false;\n    }\n}\n\nasync function deleteMe() {\n    if (!await CenteredMessage.confirm(props.group.type === GroupType.EventRegistration ? $t('90ec517b-14e6-4436-8c91-fabac5c1bddf') : $t('11426f89-b2bf-4f7a-bd5a-a51c34e6aa96'), $t('201437e3-f779-47b6-b4de-a0fa00f3863e'))) {\n        return;\n    }\n    if (deleting.value || saving.value || !props.deleteHandler) {\n        return;\n    }\n\n    deleting.value = true;\n    try {\n        await props.deleteHandler();\n        if (props.showToasts) {\n            Toast.success($t('eb66ea67-3c37-40f2-8572-9589d71ffab6')).show();\n        }\n        await pop({ force: true });\n    }\n    catch (e) {\n        Toast.fromError(e).show();\n    }\n    finally {\n        deleting.value = false;\n    }\n}\n\nasync function addGroupPrice() {\n    const isValid = await errors.validator.validateByKey('price');\n\n    if (isValid) {\n        const price = GroupPrice.create({\n            name: $t('9b0aebaf-d119-49df-955b-eb57654529e5'),\n            price: patched.value.settings.prices[0]?.price?.clone(),\n        });\n\n        await present({\n            components: [\n                new ComponentWithProperties(GroupPriceView, {\n                    price,\n                    group: patched,\n                    isNew: true,\n                    defaultMembershipTypeId,\n                    showNameAlways: true,\n                    saveHandler: async (patch: AutoEncoderPatchType<GroupPrice>) => {\n                        addPricePut(price.patch(patch));\n                    },\n                }),\n            ],\n            modalDisplayStyle: 'popup',\n        });\n    }\n}\n\nasync function editGroupPrice(price: GroupPrice) {\n    await present({\n        components: [\n            new ComponentWithProperties(GroupPriceView, {\n                price,\n                group: patched,\n                isNew: false,\n                defaultMembershipTypeId,\n                saveHandler: async (patch: AutoEncoderPatchType<GroupPrice>) => {\n                    addPricePatch(patch);\n                },\n                deleteHandler: async () => {\n                    addPriceDelete(price.id);\n                },\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function addGroupOptionMenu() {\n    const optionMenu = GroupOptionMenu.create({\n        name: $t('9b0aebaf-d119-49df-955b-eb57654529e5'),\n        options: [\n            GroupOption.create({\n                name: $t('82b0f786-db14-4a2c-8514-3ca3b28ac65f'),\n            }),\n        ],\n    });\n\n    await present({\n        components: [\n            new ComponentWithProperties(GroupOptionMenuView, {\n                optionMenu,\n                group: patched,\n                isNew: true,\n                saveHandler: async (patch: AutoEncoderPatchType<GroupOptionMenu>) => {\n                    addOptionMenuPut(optionMenu.patch(patch));\n                },\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function addWaitingList() {\n    if (!externalOrganization.value) {\n        return;\n    }\n\n    const waitingList = Group.create({\n        organizationId: patched.value.organizationId,\n        periodId: patched.value.periodId,\n        type: GroupType.WaitingList,\n        settings: GroupSettings.create({\n            name: 'Wachtlijst van ' + patched.value.settings.name,\n        }),\n    });\n\n    // Edit the group\n    await present({\n        components: [\n            new ComponentWithProperties(EditGroupView, {\n                group: waitingList,\n                isNew: true,\n                showToasts: false,\n                organizationHint: externalOrganization.value,\n                saveHandler: (patch: AutoEncoderPatchType<Group>) => {\n                    addPatch({\n                        waitingList: waitingList.patch(patch),\n                    });\n                },\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nfunction isPropertyEnabled(name: MemberProperty) {\n    return !!OrganizationRecordsConfiguration.build({\n        platform: platform.value,\n        organization: externalOrganization.value,\n        group: patched.value,\n        includeGroup: true,\n    })[name];\n}\n\nasync function editWaitingList(waitingList: Group) {\n    if (waitingList.id !== patched.value.waitingList?.id) {\n        return;\n    }\n\n    await present({\n        components: [\n            new ComponentWithProperties(EditGroupView, {\n                group: waitingList,\n                isNew: false,\n                showToasts: false,\n                organizationHint: externalOrganization.value,\n                saveHandler: (patch: AutoEncoderPatchType<Group>) => {\n                    addPatch({\n                        waitingList: patch,\n                    });\n                },\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nconst genderTypes = [\n    {\n        value: GroupGenderType.Mixed,\n        name: 'Gemengd',\n    },\n    {\n        value: GroupGenderType.OnlyFemale,\n        name: 'Enkel meisjes',\n    },\n    {\n        value: GroupGenderType.OnlyMale,\n        name: 'Enkel jongens',\n    },\n];\n\nconst shouldNavigateAway = async () => {\n    if (!hasChanges.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm($t('996a4109-5524-4679-8d17-6968282a2a75'), $t('106b3169-6336-48b8-8544-4512d42c4fd6'));\n};\n\nfunction getAgeGroupAgeString(ageGroup: DefaultAgeGroup): string {\n    const { minAge, maxAge } = ageGroup;\n    if (minAge === null && maxAge === null) {\n        return '';\n    }\n\n    if (minAge && maxAge) {\n        return `${minAge} - ${maxAge} jaar`;\n    }\n\n    if (minAge) {\n        return `+${minAge}`;\n    }\n\n    if (maxAge) {\n        return `-${maxAge}`;\n    }\n\n    return '';\n}\n\nfunction getAgeGroupSelectionText(ageGroup: DefaultAgeGroup) {\n    let text = ageGroup.name;\n    const ageGroupAgeString = getAgeGroupAgeString(ageGroup);\n\n    if (ageGroupAgeString) {\n        text = text + ': ' + ageGroupAgeString;\n    }\n\n    if (!ageGroup.defaultMembershipTypeId) {\n        text = text + ' (niet automatisch)';\n    }\n\n    return text;\n}\n\nconst getRegisterItemFilterBuilders = useRegisterItemFilterBuilders();\n\nconst family = new PlatformFamily({\n    platform: Platform.shared,\n    contextOrganization: organization.value,\n});\n\nconst recordEditorSettings = computed(() => {\n    const exampleMember = new PlatformMember({\n        member: MemberWithRegistrationsBlob.create({\n            details: MemberDetails.create({\n                firstName: 'Voorbeeld',\n                lastName: 'Lid',\n                dataPermissions: BooleanStatus.create({ value: true }),\n                birthDay: new Date('2020-01-01'),\n            }),\n            users: [],\n            registrations: [],\n        }),\n        isNew: true,\n        family,\n    });\n\n    return new RecordEditorSettings({\n        type: RecordEditorType.Registration,\n        dataPermission: false,\n        toggleDefaultEnabled: false,\n        filterBuilder: (recordCategories: RecordCategory[]) => {\n            return getRegisterItemFilterBuilders(patched.value.patch({\n                settings: GroupSettings.patch({\n                    recordCategories: recordCategories as any,\n                }),\n            }))[0];\n        },\n        exampleValue: RegisterItem.defaultFor(exampleMember, patched.value, externalOrganization.value ?? Organization.create({\n            id: patched.value.organizationId\n        })),\n    });\n})\n\ndefineExpose({\n    shouldNavigateAway,\n});\n\n</script>\n","import { AppManager } from \"@stamhoofd/networking\";\nimport type {ObjectDirective} from \"vue\";\n\nfunction getScrollElement(element: HTMLElement | null = null): HTMLElement {\n    if (!element) {\n        element = this.$el as HTMLElement;\n    }\n\n    const style = window.getComputedStyle(element);\n    if (\n        style.overflowY == \"scroll\" ||\n        style.overflow == \"scroll\" ||\n        style.overflow == \"auto\" ||\n        style.overflowY == \"auto\" || \n        style.overflow == \"overlay\" || \n        style.overflowY == \"overlay\"\n    ) {\n        return element;\n    } else {\n        if (!element.parentElement) {\n            return document.documentElement;\n        }\n        return getScrollElement(element.parentElement);\n    }\n}\n\nfunction distance(a: { x: number, y: number }, b: { x: number, y: number }) {\n    return Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2));\n}\n\nconst LongPressDirective: ObjectDirective<HTMLElement & {$longPressTimer: NodeJS.Timeout|null, $didTriggerLongPress: boolean}, () => void> = {\n    beforeMount(el, binding) {\n        // If we are on Android or Desktop, we can ignore this listener\n        if (!(binding.instance?.$.proxy?.$isIOS)) {\n            return\n        }\n\n        el.$longPressTimer = null\n        el.$didTriggerLongPress = false\n        \n        let scrollElement: HTMLElement | undefined\n        let firstTouch: { x: number, y: number } | undefined\n        let lastTouch: { x: number, y: number } | undefined\n\n\n        const scrollListener = (e) => {\n            if (el.$longPressTimer && e.currentTarget.scrollTop > 1) {\n                clearTimeout(el.$longPressTimer)\n                e.currentTarget.removeEventListener(\"scroll\", scrollListener)\n            }\n        }\n\n        const touchMoveListener = (event: TouchEvent) => {\n            if (!event.touches || event.touches.length < 1) {\n                return\n            }\n            lastTouch = {\n                x: event.touches[0].pageX,\n                y: event.touches[0].pageY\n            }\n        }\n\n        const cancelLongPress = () => {\n            // Cancel timer\n            if (el.$longPressTimer) {\n                clearTimeout(el.$longPressTimer)\n            }\n            el.$longPressTimer = null\n            el.$didTriggerLongPress = false\n            scrollElement?.removeEventListener(\"scroll\", scrollListener)\n            document.removeEventListener(\"touchmove\", touchMoveListener)\n        }\n\n\n        // Add a hover listener\n        el.addEventListener(\n            \"touchstart\",\n            (event) => {\n                cancelLongPress()\n\n                if (event.touches.length > 1) {\n                    // If more than one finger, do nothing\n                    return\n                }\n\n                if (event.target && event.target.classList.contains('drag')) {\n                    return;\n                }\n\n                // Register position of touch\n                firstTouch = {\n                    x: event.touches[0].pageX,\n                    y: event.touches[0].pageY\n                }\n                lastTouch = {\n                    x: event.touches[0].pageX,\n                    y: event.touches[0].pageY\n                }\n\n                // Listen for scroll event of container, and cancel if scrolled\n                scrollElement = getScrollElement(el)\n                scrollElement.addEventListener(\"scroll\", scrollListener, { passive: true })\n                \n                document.addEventListener(\"touchmove\", touchMoveListener, { passive: true })\n\n                el.$longPressTimer = setTimeout(() => {\n                    scrollElement?.removeEventListener(\"scroll\", scrollListener)\n                    document.removeEventListener(\"touchmove\", touchMoveListener)\n\n                    // If distance between first touch and last touch is too big, do nothing\n                    if (!firstTouch || !lastTouch || distance(firstTouch, lastTouch) > 5) {\n                        cancelLongPress()\n                        return\n                    }\n                    console.log(el, el.getAttribute('draggable'))\n\n                    el.$longPressTimer = null\n\n                    AppManager.shared.hapticTap()\n\n                    // Call listener\n                    const callback = binding.value\n\n                    const customEvent = {\n                        currentTarget: el,\n                        target: el,\n                        changedTouches: event.changedTouches,\n                        touches: event.touches,\n                    }\n                    callback(customEvent)\n\n                    // Cancel all move events\n                    el.$didTriggerLongPress = true\n\n                    const onmove = (e) => {\n                        // Cancel all default handling from now on\n                        e.preventDefault()\n                    }\n                    document.addEventListener(\"touchmove\", onmove, { passive: false})\n                    // Remove\n                    document.addEventListener(\"touchend\", () => {\n                        document.removeEventListener(\"touchmove\", onmove)\n                    }, { once: true, passive: true })\n\n                }, 500)\n                \n            },\n            { passive: true }\n        );\n\n        // Add a hover listener\n        el.addEventListener(\n            \"touchend\",\n            (_event) => {\n                cancelLongPress()\n                \n            },\n            { passive: true }\n        );\n\n        // Add a hover listener\n        el.addEventListener(\n            \"contextmenu\",\n            (_event) => {\n                // Cancel timer\n                cancelLongPress()\n                \n            },\n            { passive: true }\n        );\n    },\n\n    unmounted(el, binding, vnode) {\n        if (el.$longPressTimer) {\n            clearTimeout(el.$longPressTimer)\n        }\n    }\n};\nexport default LongPressDirective;\n","<template>\n    <div class=\"input-icon-container right icon arrow-down-small gray\">\n        <select v-model=\"mappedValue\" class=\"input\" :autocomplete=\"autocomplete\" :name=\"name\" @blur=\"$emit('blur', $event)\" @focus=\"$emit('focus', $event)\">\n            <slot />\n        </select>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { NavigationMixin } from '@simonbackx/vue-app-navigation';\nimport { Component, Mixins,Prop } from \"@simonbackx/vue-app-navigation/classes\";\n\n@Component({\n    emits: [\"update:modelValue\"]\n})\nexport default class Dropdown extends Mixins(NavigationMixin) {\n    @Prop({})\n        modelValue: any\n\n    @Prop({ default: undefined })\n        autocomplete?: string\n\n    @Prop({ default: undefined })\n        name?: string\n\n    get mappedValue() {\n        return this.modelValue\n    }\n\n    set mappedValue(val: any) {\n        this.$emit(\"update:modelValue\", val)\n    }\n}\n</script>\n","<template>\n    <ContextMenuView v-bind=\"$attrs\" :auto-dismiss=\"autoDismiss\">\n        <aside ref=\"aside\" class=\"date-selection-view\">\n            <header>\n                <button type=\"button\" class=\"button icon gray arrow-left\" @click=\"previousMonth\" />\n                <h1>\n                    <div class=\"input-icon-container right icon arrow-down-small gray\">\n                        <select v-model=\"month\" @mousedown.stop>\n                            <option v-for=\"month in 12\" :key=\"month\" :value=\"month\">\n                                {{ monthText(month) }}\n                            </option>\n                        </select>\n                    </div>\n\n                    <div class=\"input-icon-container right icon arrow-down-small gray\">\n                        <select v-model=\"currentYear\" @mousedown.stop>\n                            <option v-for=\"year in 105\" :key=\"year\" :value=\"nowYear - year + 5\">\n                                {{ nowYear - year + 5 }}\n                            </option>\n                        </select>\n                    </div>\n                </h1>\n                <button type=\"button\" class=\"button icon gray arrow-right\" @click=\"nextMonth\" />\n            </header>\n            <div class=\"days\">\n                <div class=\"days\">\n                    <div>Ma</div>\n                    <div>Di</div>\n                    <div>Wo</div>\n                    <div>Do</div>\n                    <div>Vr</div>\n                    <div>Za</div>\n                    <div>Zo</div>\n                </div>\n                <div v-for=\"(week, index) in weeks\" :key=\"index\" class=\"row\">\n                    <button v-for=\"day in week\" :key=\"day.number\" type=\"button\" :class=\"{selected: day.selected, 'other-month': day.otherMonth}\" :disabled=\"isDisabled(day)\" @click=\"onSelect(day)\">\n                        {{ day.number }}\n                    </button>\n                </div>\n            </div>\n            <footer>\n                <button v-if=\"allowClear\" type=\"button\" class=\"button text\" @click=\"clear\">\n                    Leegmaken\n                </button>\n                <button v-if=\"!isDisabled({value: new Date()})\" type=\"button\" class=\"button text\" @click=\"setToday\">\n                    Vandaag\n                </button>\n            </footer>\n        </aside>\n    </ContextMenuView>\n</template>\n\n<script lang=\"ts\">\nimport { NavigationMixin } from '@simonbackx/vue-app-navigation';\nimport { Component, Mixins, Prop } from '@simonbackx/vue-app-navigation/classes';\nimport { Formatter } from '@stamhoofd/utility';\n\nimport LongPressDirective from '../directives/LongPress';\nimport Dropdown from '../inputs/Dropdown.vue';\nimport ContextMenuView from './ContextMenuView.vue';\n\n@Component({\n    components: {\n        ContextMenuView,\n        Dropdown,\n    },\n    directives: {\n        LongPress: LongPressDirective,\n    },\n})\nexport default class DateSelectionView extends Mixins(NavigationMixin) {\n    @Prop()\n    setDate!: (date: Date | null) => void;\n\n    @Prop()\n    onClose!: () => void;\n\n    @Prop({ default: true })\n    autoDismiss!: boolean;\n\n    @Prop({ required: true })\n    selectedDay!: Date;\n\n    @Prop({ default: null })\n    min!: Date | null;\n\n    @Prop({ default: null })\n    max!: Date | null;\n\n    currentMonth: Date = new Date((this.selectedDay ?? new Date()).getTime());\n    weeks: any = null;\n    monthTitle = '';\n    yearTitle = '';\n\n    @Prop({ default: false })\n    allowClear!: boolean;\n\n    created() {\n        this.weeks = this.generateDays();\n        this.updateMonthTitle();\n    }\n\n    beforeUnmount() {\n        this.onClose();\n    }\n\n    mounted() {\n        if (!this.autoDismiss) {\n            (this.$refs?.aside as any)?.addEventListener('mousedown', (e) => {\n                e.preventDefault();\n            });\n        }\n    }\n\n    isDisabled(day: { value: Date }) {\n        if (this.min && day.value.getTime() < this.min.getTime()) {\n            return true;\n        }\n        if (this.max && day.value.getTime() > this.max.getTime()) {\n            return true;\n        }\n        return false;\n    }\n\n    generateDays() {\n        const weeks: any = [];\n\n        const start = new Date(this.currentMonth.getTime());\n        start.setDate(1);\n\n        const month = start.getMonth();\n        const year = start.getFullYear();\n\n        // Make sure first day is 1\n        while (start.getDay() !== 1) {\n            start.setDate(start.getDate() - 1);\n        }\n\n        // loop days\n        while ((start.getMonth() <= month && start.getFullYear() === year) || start.getFullYear() < year || start.getDay() !== 1) {\n            if (start.getDay() === 1) {\n                // Start new week\n                weeks.push([]);\n            }\n\n            weeks[weeks.length - 1].push({\n                number: start.getDate(),\n                value: new Date(start.getTime()),\n                otherMonth: start.getMonth() !== month,\n                selected: this.selectedDay && start.getDate() === this.selectedDay.getDate() && start.getFullYear() === this.selectedDay.getFullYear() && start.getMonth() === this.selectedDay.getMonth(),\n            });\n\n            start.setDate(start.getDate() + 1);\n\n            if (weeks[weeks.length - 1].length > 7 || weeks.length > 6) {\n                console.error('Calendar infinite loop');\n                break;\n            }\n        }\n        return weeks;\n    }\n\n    clear() {\n        this.setDate(null);\n        this.pop();\n    }\n\n    setDateValue(date: Date) {\n        const selectedDay = this.selectedDay;\n        selectedDay.setTime(date.getTime());\n        this.currentMonth = new Date(selectedDay.getTime());\n        this.weeks = this.generateDays();\n        this.updateMonthTitle();\n        this.setDate(new Date(date.getTime()));\n    }\n\n    setToday() {\n        this.setDateValue(new Date());\n        this.pop();\n    }\n\n    updateMonthTitle() {\n        this.monthTitle = Formatter.capitalizeFirstLetter(Formatter.month(this.currentMonth.getMonth() + 1));\n        this.yearTitle = this.currentMonth.getFullYear().toString();\n    }\n\n    nextMonth() {\n        this.month = this.month + 1;\n    }\n\n    updateSelectedMonth() {\n        if (!this.selectedDay) {\n            return;\n        }\n        // Don't make a copy\n        const selectedDay = this.selectedDay;\n        const day = selectedDay.getDate();\n        selectedDay.setMonth(this.currentMonth.getMonth());\n        selectedDay.setMonth(this.currentMonth.getMonth());\n        selectedDay.setFullYear(this.currentMonth.getFullYear());\n        if (selectedDay.getDate() < day) {\n            selectedDay.setDate(new Date(selectedDay.getFullYear(), selectedDay.getMonth() + 1, 0).getDate());\n        }\n        this.setDate(selectedDay);\n    }\n\n    previousMonth() {\n        this.month = this.month - 1;\n    }\n\n    nextYear() {\n        this.currentYear = this.currentYear + 1;\n    }\n\n    previousYear() {\n        this.currentYear = this.currentYear - 1;\n    }\n\n    onSelect(day) {\n        console.log('Select', day);\n        day.selected = true;\n        this.setDate(day.value);\n        this.pop();\n    }\n\n    get nowYear() {\n        const ny = new Date().getFullYear();\n\n        if (this.currentYear < ny - 50) {\n            return this.currentYear + 50;\n        }\n        if (this.currentYear > ny) {\n            return this.currentYear;\n        }\n        return ny;\n    }\n\n    get currentYear() {\n        return this.currentMonth.getFullYear();\n    }\n\n    set currentYear(year: number) {\n        if (!year) {\n            // Weird vue thing\n            return;\n        }\n        const d = new Date(this.currentMonth);\n        d.setFullYear(year);\n        this.setDateValue(d);\n    }\n\n    get month() {\n        // Date is not reactive\n        return this.currentMonth.getMonth() + 1;\n    }\n\n    set month(month: number) {\n        console.log('Set month', month);\n        const d = new Date(this.currentMonth);\n        d.setDate(1);\n        if (month < 1) {\n            month = 12;\n            d.setMonth(month - 1);\n            d.setFullYear(this.currentMonth.getFullYear() - 1);\n        }\n        d.setMonth(month - 1);\n        d.setDate(this.currentMonth.getDate());\n\n        // If date overflowed\n        if (d.getDate() !== this.currentMonth.getDate()) {\n            d.setTime(this.currentMonth.getTime());\n            d.setDate(1);\n            d.setMonth(month);\n            d.setDate(0);\n        }\n\n        this.setDateValue(d);\n    }\n\n    monthText(month: number) {\n        return Formatter.capitalizeFirstLetter(Formatter.month(month));\n    }\n}\n</script>\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use '@stamhoofd/scss/base/text-styles.scss' as *;\n\n.date-selection-view {\n    min-width: 300px;\n    user-select: none;\n\n    @media (max-width: 400px) {\n        min-width: calc(100vw - 30px - 40px - 4px);\n    }\n\n    > header{\n        padding: 10px 0px;\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n\n        > h1 {\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            flex-direction: row;\n\n            flex-grow: 1;\n            @extend .style-title-3;\n        }\n\n        .input-icon-container {\n            @extend .style-title-3;\n\n            select {\n                color: $color-dark;\n            }\n        }\n    }\n\n    > footer{\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        justify-content: space-between;\n    }\n\n    .title-button {\n        display: inline-flex;\n        flex-direction: row;\n        align-items: center;\n\n        > .icon {\n            margin-left: -2px;\n            margin-right: -2px;\n        }\n    }\n\n    > .days {\n        padding-bottom: 10px;\n\n        > .days {\n            display: flex;\n            padding: 0px 0px;\n            padding-bottom: 7px;\n            margin-bottom: 5px;\n            border-bottom: $border-width solid $color-border;\n\n            > div {\n                flex-grow: 1;\n                flex-basis: 0;\n                position: relative;\n                z-index: 1;\n                margin: 0;\n                padding: 5px 0;\n                text-align: center;\n                @extend .style-interactive-small;\n            }\n        }\n\n        > .row {\n            display: flex;\n            padding: 3px 0px;\n\n            > button {\n                flex-grow: 1;\n                flex-basis: 0;\n                position: relative;\n                z-index: 1;\n                margin: 0;\n                padding: 7px 0;\n\n                @media (max-width: 400px) {\n                    padding: 12px 0;\n                }\n\n                cursor: pointer;\n                touch-action: manipulation;\n                user-select: none;\n                transition: color 0.2s;\n\n                @extend .style-interactive-small;\n\n                &::after {\n                    position: absolute;\n                    content: '';\n                    left: 0;\n                    top: 0;\n                    right: 0;\n                    bottom: 0;\n                    z-index: -1;\n                    border-radius: $border-radius;\n                    background: $color-background;\n                    background: var(--color-current-background, #{$color-background});\n                    transition: background-color 0.2s, transform 0.2s;\n                    transform: scale(0.9, 0.9);\n                }\n\n                &:active, &:hover {\n\n                    &::after {\n                        background: var(--color-current-background-shade, #{$color-background-shade});\n                        transform: scale(1, 1);\n                    }\n                }\n\n                &:active {\n                    color: white;\n\n                    &::after {\n                        background: $color-gray-1;\n                        transform: scale(0.9, 0.9);\n                    }\n                }\n\n                &.selected {\n                    color: $color-primary-contrast;\n                    font-weight: bold;\n\n                    &::after {\n                        background: $color-primary;\n                        transform: scale(1, 1);\n                    }\n\n                    &:hover {\n                        color: $color-background;\n\n                        &::after {\n                            background: $color-dark;\n                        }\n                    }\n\n                    &:active {\n                        &::after {\n                            transform: scale(0.9, 0.9);\n                        }\n                    }\n                }\n\n                &:disabled {\n                    opacity: 0.3;\n                    cursor: not-allowed;\n\n                    &:hover {\n                        &::after {\n                            background: var(--color-current-background, #{$color-background});\n                        }\n                    }\n                }\n\n                &.other-month {\n                    opacity: 0.3;\n\n                    &:disabled {\n                        opacity: 0.2;\n                    }\n                }\n\n            }\n        }\n    }\n}\n</style>\n","<template>\n    <div class=\"date-selection-container input-icon-container right icon arrow-down-small gray\">\n        <div v-if=\"$isMobile\" class=\"input selectable\" :class=\"{placeholder: modelValue === null}\" @click=\"openContextMenu(true)\">\n            <div>{{ dateText }}</div>\n        </div>\n        <div v-else class=\"input selectable\" :class=\"{placeholder: modelValue === null}\" @click=\"focusFirst()\" @mousedown.prevent>\n            <span v-if=\"modelValue === null\" class=\"placeholder\">{{ placeholder }}</span>\n            <div @click.prevent @mouseup.prevent>\n                <input ref=\"dayInput\" v-model=\"dayText\" inputmode=\"numeric\" autocomplete=\"off\" @change=\"updateDate\" @focus.prevent=\"onFocus(0)\" @blur=\"onBlur\" @click.prevent @mouseup.prevent @mousedown.prevent=\"onFocus(0)\" @input=\"onTyping();\">\n                <span>{{ dayText }}</span>\n            </div>\n\n            <span :class=\"{sep: true, hide: !hasFocus}\">/</span>\n\n            <div @click.prevent @mouseup.prevent>\n                <input ref=\"monthInput\" v-model=\"monthText\" inputmode=\"numeric\" autocomplete=\"off\" @change=\"updateDate\" @focus.prevent=\"onFocus(1)\" @blur=\"onBlur\" @click.prevent @mouseup.prevent @mousedown.prevent=\"onFocus(1)\" @input=\"onTyping();\">\n                <span v-if=\"hasFocus\">{{ monthText }}</span>\n                <span v-else>{{ monthTextLong }}</span>\n            </div>\n\n            <span :class=\"{sep: true, hide: !hasFocus}\">/</span>\n\n            <div @click.prevent @mouseup.prevent>\n                <input ref=\"yearInput\" v-model=\"yearText\" inputmode=\"numeric\" autocomplete=\"off\" @change=\"updateDate\" @focus.prevent=\"onFocus(2)\" @blur=\"onBlur\" @click.prevent @mouseup.prevent @mousedown.prevent=\"onFocus(2)\" @input=\"onTyping();\">\n                <span>{{ yearText }}</span>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { ComponentWithProperties, NavigationMixin } from '@simonbackx/vue-app-navigation';\nimport { Component, Mixins, Prop, Watch } from '@simonbackx/vue-app-navigation/classes';\nimport { Formatter } from '@stamhoofd/utility';\n\nimport DateSelectionView from '../overlays/DateSelectionView.vue';\n\n@Component\nexport default class DateSelection extends Mixins(NavigationMixin) {\n    @Prop({ default: () => {\n        const d = new Date();\n        d.setHours(0, 0, 0, 0);\n        return d;\n    } })\n    modelValue: Date | null;\n\n    @Prop({ default: true })\n    required!: boolean;\n\n    @Prop({ default: 'Kies een datum' })\n    placeholder!: string;\n\n    @Prop({ default: null })\n    min!: Date | null;\n\n    @Prop({ default: null })\n    max!: Date | null;\n\n    @Prop({ default: null })\n    time!: { hours: number; minutes: number; seconds: number } | null;\n\n    hasFocus = false;\n    hasFocusUnbounced = false;\n\n    dayText = '';\n    monthText = '';\n    yearText = '';\n\n    displayedComponent: ComponentWithProperties | null = null;\n\n    mounted() {\n        this.updateTextStrings();\n\n        document.addEventListener('keydown', this.onKey);\n        document.addEventListener('focusin', this.updateHasFocus);\n        document.addEventListener('focusout', this.updateHasFocus);\n        document.addEventListener('visibilitychange', this.updateHasFocus);\n\n        // Sometimes focusin/focusout isn't called reliably\n        document.addEventListener('click', this.updateHasFocus, { passive: true });\n    }\n\n    activated() {\n        document.addEventListener('keydown', this.onKey);\n        document.addEventListener('focusin', this.updateHasFocus);\n        document.addEventListener('focusout', this.updateHasFocus);\n        document.addEventListener('visibilitychange', this.updateHasFocus);\n\n        // Sometimes focusin/focusout isn't called reliably\n        document.addEventListener('click', this.updateHasFocus, { passive: true });\n    }\n\n    deactivated() {\n        document.removeEventListener('keydown', this.onKey);\n        document.removeEventListener('focusin', this.updateHasFocus);\n        document.removeEventListener('focusout', this.updateHasFocus);\n        document.removeEventListener('visibilitychange', this.updateHasFocus);\n        document.removeEventListener('click', this.updateHasFocus);\n    }\n\n    beforeUnmount() {\n        document.removeEventListener('keydown', this.onKey);\n        document.removeEventListener('focusin', this.updateHasFocus);\n        document.removeEventListener('focusout', this.updateHasFocus);\n        document.removeEventListener('visibilitychange', this.updateHasFocus);\n        document.removeEventListener('click', this.updateHasFocus);\n    }\n\n    updateTextStrings() {\n        const currentDateValue = this.textDate;\n\n        const iso1 = this.modelValue ? Formatter.dateIso(this.modelValue) : '';\n        const iso2 = currentDateValue ? Formatter.dateIso(currentDateValue) : '';\n\n        if (iso1 !== iso2 || !this.hasFocusUnbounced) {\n            this.dayText = this.modelValue ? this.modelValue.getDate().toString() : '';\n            this.monthText = this.modelValue ? (this.modelValue.getMonth() + 1).toString() : '';\n            this.yearText = this.modelValue ? this.modelValue.getFullYear().toString() : '';\n        }\n\n        if (this.modelValue && this.time) {\n            if ((this.min && this.modelValue < this.min) || (this.max && this.modelValue > this.max) || this.modelValue.getHours() !== this.time.hours || this.modelValue.getMinutes() !== this.time.minutes || this.modelValue.getSeconds() !== this.time.seconds || this.modelValue.getMilliseconds() !== 0) {\n                this.emitDate(this.modelValue);\n            }\n        }\n    }\n\n    @Watch('modelValue')\n    onValueChange() {\n        this.updateTextStrings();\n    }\n\n    get monthTextLong() {\n        return this.modelValue ? Formatter.month(this.modelValue.getMonth() + 1) : '';\n    }\n\n    get numberInputs() {\n        return [this.$refs.dayInput, this.$refs.monthInput, this.$refs.yearInput];\n    }\n\n    get numberConfig() {\n        return [\n            {\n                maxLength: 2,\n                max: 31,\n                min: 1,\n                type: 'day',\n                getValue: () => {\n                    return this.dayText;\n                },\n                setValue: (modelValue: string) => {\n                    this.dayText = modelValue;\n                    this.updateDate();\n                },\n            },\n            {\n                maxLength: 2,\n                max: 12,\n                min: 1,\n                type: 'month',\n                getValue: () => {\n                    return this.monthText;\n                },\n                setValue: (modelValue: string) => {\n                    this.monthText = modelValue;\n                    this.updateDate();\n                },\n            },\n            {\n                maxLength: 4,\n                max: 2100,\n                min: 1900,\n                type: 'year',\n                getValue: () => {\n                    return this.yearText;\n                },\n                setValue: (modelValue: string) => {\n                    this.yearText = modelValue;\n                    this.updateDate();\n                },\n            },\n        ];\n    }\n\n    blurAll() {\n        // Blur all\n        for (let index = 0; index < this.numberInputs.length; index++) {\n            const element = this.numberInputs[index] as HTMLInputElement;\n            if (!element) {\n                continue;\n            }\n            element.blur();\n        }\n    }\n\n    selectNext(index: number) {\n        if (index < 0) {\n            return;\n        }\n\n        if (index >= this.numberInputs.length) {\n            // Remove extra characters of last input\n            const config = this.numberConfig[index - 1];\n            let val = config.getValue().replace(/[^0-9]/g, '');\n\n            while (val.length >= 2) {\n                const shorter = val.substring(0, val.length - 1);\n                if (this.isFull(shorter, config)) {\n                    val = shorter;\n                }\n                else {\n                    break;\n                }\n            }\n\n            config.setValue(val);\n\n            // Blur all\n            this.blurAll();\n\n            return;\n        }\n\n        if (index >= 1) {\n            const config = this.numberConfig[index - 1];\n            const val = config.getValue();\n\n            // Get location of first special character after a number\n            const firstSpecialCharacter = val.search(/[0-9][^0-9]/);\n            const cutIndex = firstSpecialCharacter > -1 ? Math.min(firstSpecialCharacter + 1, config.maxLength, val.length) : Math.min(config.maxLength, val.length);\n\n            if (val.length > cutIndex) {\n                config.setValue(val.substr(0, cutIndex).replace(/[^0-9]/g, ''));\n\n                const currentConfig = this.numberConfig[index];\n\n                const moveText = val.substr(cutIndex).replace(/^[^0-9]+/, '');\n                currentConfig.setValue(moveText + currentConfig.getValue());\n\n                if (this.isFull(currentConfig.getValue(), currentConfig)) {\n                    this.selectNext(index + 1);\n                    return;\n                }\n            }\n            else {\n                // Clean previous\n                config.setValue(val.replace(/[^0-9]/g, ''));\n            }\n        }\n\n        (this.numberInputs[index] as HTMLInputElement).focus();\n\n        if ((this.numberInputs[index] as HTMLInputElement).value.length > 0) {\n            // iOS fix\n            (this.numberInputs[index] as HTMLInputElement).select();\n        }\n    }\n\n    onFocus(index: number) {\n        this.selectNext(index);\n    }\n\n    updateHasFocus() {\n        let focus = !!this.$el.contains(document.activeElement);\n\n        if (this.displayedComponent) {\n            const instance = this.displayedComponent.componentInstance();\n            if (instance) {\n                if (instance.$el && document.activeElement && instance.$el.contains(document.activeElement)) {\n                    focus = true;\n                }\n            }\n        }\n\n        if (this.$isMobile) {\n            focus = false;\n        }\n\n        if (focus) {\n            this.hasFocus = true;\n            this.hasFocusUnbounced = true;\n        }\n        else {\n            this.hasFocus = false;\n            setTimeout(() => {\n                this.hasFocusUnbounced = this.hasFocus;\n            }, 50);\n        }\n    }\n\n    onFocusIn() {\n        this.updateHasFocus();\n    }\n\n    onFocusOut() {\n        this.updateHasFocus();\n    }\n\n    onBlur() {\n        // todo\n    }\n\n    isFull(value: string, config) {\n        if (value.length >= config.maxLength) {\n            return true;\n        }\n\n        // If any addition of a zero would go above maximum value\n        const valueWithZero = parseInt(value + '0');\n        if (valueWithZero > config.max) {\n            return true;\n        }\n\n        return false;\n    }\n\n    onTyping() {\n        // Check if we can move to the next field\n        const focusedInput = document.activeElement as HTMLInputElement;\n        const index = this.numberInputs.indexOf(focusedInput);\n\n        if (index !== -1) {\n            // TODO remove and split on special characters\n            // todo: automatically move extra characters to the next field\n\n            // Check move to next date\n            if (this.isFull(focusedInput.value, this.numberConfig[index])) {\n                this.selectNext(index + 1);\n            }\n        }\n    }\n\n    focusFirst() {\n        if (!this.hasFocus) {\n            this.onFocus(0);\n        }\n    }\n\n    @Watch('hasFocusUnbounced')\n    onHasFocusUnbouncedChanged() {\n        if (!this.hasFocusUnbounced) {\n            this.hideDisplayedComponent({ unlessFocused: true });\n\n            // Clear invalid date text\n            this.updateTextStrings();\n        }\n        else {\n            this.openContextMenu(false);\n        }\n    }\n\n    updateDate() {\n        const date = this.textDate;\n\n        if (date) {\n            this.emitDate(date);\n            if (this.displayedComponent) {\n                const instance = this.displayedComponent.componentInstance();\n                if (instance) {\n                    (instance as any).setDateValue(date);\n                }\n            }\n        }\n    }\n\n    get textDate() {\n        const day = parseInt(this.dayText.replace(/[^0-9]/g, ''));\n        const month = parseInt(this.monthText.replace(/[^0-9]/g, ''));\n        const year = parseInt(this.yearText.replace(/[^0-9]/g, ''));\n        if (day && month && year && !isNaN(day) && !isNaN(month) && !isNaN(year)) {\n            const date = new Date(year, month - 1, day);\n            if (date.getFullYear() === year && date.getMonth() === month - 1 && date.getDate() === day) {\n                return date;\n            }\n\n            // The date has automatically been corrected\n            return new Date(year, month, 0);\n        }\n        return null;\n    }\n\n    get isValidTextDate() {\n        return this.textDate !== null;\n    }\n\n    get dateText() {\n        return this.modelValue ? Formatter.date(this.modelValue, true) : this.placeholder;\n    }\n\n    emitDate(value: Date | null) {\n        if (!value) {\n            this.$emit('update:modelValue', null);\n            return;\n        }\n        const d = new Date(value.getTime());\n\n        // First correct for min/max\n        if (this.max && d > this.max) {\n            d.setTime(this.max.getTime());\n        }\n\n        if (this.min && d < this.min) {\n            d.setTime(this.min.getTime());\n        }\n\n        if (this.time) {\n            d.setHours(this.time.hours, this.time.minutes, this.time.seconds, 0);\n        }\n        else if (this.modelValue) {\n            d.setHours(this.modelValue.getHours(), this.modelValue.getMinutes(), 0, 0);\n        }\n        else {\n            d.setHours(12, 0, 0, 0);\n        }\n\n        // End with min/max correction again\n        if (this.max && d > this.max) {\n            d.setTime(this.max.getTime());\n\n            if (this.time) {\n                // To fix infinite loop, we'll need to decrease the day with 1\n                d.setTime(this.max.getTime() - 24 * 60 * 60 * 1000);\n                d.setHours(this.time.hours, this.time.minutes, this.time.seconds, 0);\n            }\n        }\n\n        if (this.min && d < this.min) {\n            d.setTime(this.min.getTime());\n\n            if (this.time) {\n                // To fix infinite loop, we'll need to increase the day with 1\n                d.setTime(this.min.getTime() + 24 * 60 * 60 * 1000);\n                d.setHours(this.time.hours, this.time.minutes, this.time.seconds, 0);\n            }\n        }\n        this.$emit('update:modelValue', d);\n    }\n\n    openContextMenu(autoDismiss = true) {\n        if (this.displayedComponent) {\n            return;\n        }\n\n        const el = this.$el as HTMLElement;\n        const displayedComponent = new ComponentWithProperties(DateSelectionView, {\n            x: el.getBoundingClientRect().left + el.offsetWidth,\n            y: el.getBoundingClientRect().top + el.offsetHeight - 2,\n            wrapHeight: el.offsetHeight - 4,\n            xPlacement: 'left',\n            autoDismiss,\n            // preferredWidth: el.offsetWidth,\n            selectedDay: this.modelValue ? new Date(this.modelValue) : new Date(),\n            allowClear: !this.required,\n            min: this.min,\n            max: this.max,\n            setDate: (value: Date | null) => {\n                this.emitDate(value);\n            },\n            onClose: () => {\n                this.blurAll();\n                this.displayedComponent = null;\n            },\n        });\n        this.present(displayedComponent.setDisplayStyle('overlay'));\n        this.displayedComponent = displayedComponent;\n    }\n\n    hideDisplayedComponent({ unlessFocused } = { unlessFocused: false }) {\n        if (this.displayedComponent) {\n            const instance = this.displayedComponent.componentInstance();\n            if (instance) {\n                if (unlessFocused && instance.$el && document.activeElement && instance.$el.contains(document.activeElement)) {\n                    // Add an event listener to focus yearInput when blur\n                    const activeElement = document.activeElement;\n                    const listener = () => {\n                        activeElement.removeEventListener('change', listener);\n                        activeElement.removeEventListener('focusout', listener);\n                        // this.selectNext(2)\n                    };\n                    activeElement.addEventListener('change', listener);\n                    activeElement.addEventListener('focusout', listener);\n\n                    // return;\n                }\n                (instance as any).dismiss();\n            }\n            this.displayedComponent = null;\n        }\n    }\n\n    onKey(event) {\n        if (event.defaultPrevented || event.repeat) {\n            return;\n        }\n\n        if (!this.isFocused) {\n            return;\n        }\n\n        const focusedInput = document.activeElement as HTMLInputElement;\n        const index = this.numberInputs.indexOf(focusedInput);\n\n        if (index === -1) {\n            return;\n        }\n\n        const config = this.numberConfig[index];\n\n        const key = event.key || event.keyCode;\n\n        if (key === 'ArrowLeft') {\n            if (index > 0) {\n                this.selectNext(index - 1);\n            }\n            else {\n                this.blurAll();\n            }\n            event.preventDefault();\n        }\n        else if (key === 'ArrowRight') {\n            this.selectNext(index + 1);\n            event.preventDefault();\n        }\n        else if (key === 'ArrowUp' || key === 'PageUp') {\n            const value = parseInt(config.getValue());\n            if (!isNaN(value) && value < config.max) {\n                config.setValue((value + 1).toString());\n            }\n            event.preventDefault();\n        }\n        else if (key === 'ArrowDown' || key === 'PageDown') {\n            const value = parseInt(config.getValue());\n            if (!isNaN(value) && value > config.min) {\n                config.setValue((value - 1).toString());\n            }\n            event.preventDefault();\n        }\n    }\n}\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use \"@stamhoofd/scss/base/text-styles.scss\" as *;\n\n.date-selection-container {\n    .input.placeholder {\n        color: $color-gray-5;\n    }\n\n    .input:focus-within > span.placeholder {\n        display: none;\n    }\n\n    .input {\n        padding: 5px 0;\n        padding-right: 40px;\n        padding-left: 10px;\n\n        display: grid;\n        grid-template-columns: auto auto auto auto auto;\n        align-items: start;\n        justify-content: start;\n\n        > span.sep {\n            color: $color-gray-5;\n            pointer-events: none;\n            width: 10px;\n            transition: width 0.2s, opacity 0.2s;\n            text-align: center;\n            margin: 0 -5px;\n\n            &.hide {\n                display: none;\n            }\n        }\n\n        > div {\n            margin: -5px 0;\n            padding: 5px;\n            position: relative;\n            overflow: hidden;\n            text-overflow: ellipsis;\n            height: 100%;\n\n            &:focus-within {\n                // color: $color-primary;\n            }\n\n            > span {\n                pointer-events: none;\n            }\n\n            > input {\n                left: 0;\n                top: 0;\n                bottom: 0;\n                right: 0;\n                width: 100%;\n                height: 100%;\n                position: absolute;\n                @extend .style-input;\n                line-height: 1;\n                box-sizing: border-box;\n                opacity: 0;\n                padding: 5px;\n                padding-right: 0; // Fix being able to scroll inside the input\n                overflow: hidden;\n                caret-color: $color-primary;\n\n                -webkit-user-select: none;\n        -webkit-touch-callout: none;\n        -moz-user-select: none;\n        -ms-user-select: none;\n        user-select: none;\n        -webkit-user-modify: read-write-plaintext-only;\n                user-modify: read-write-plaintext-only;\n\n                &:focus {\n                    opacity: 1;\n\n                    + span {\n                        opacity: 0;\n                    }\n                }\n            }\n\n            // Remove dotted line in Firefox\n            > input:-moz-focusring {\n                color: transparent;\n                text-shadow: 0 0 0 #000;\n            }\n        }\n    }\n}\n</style>\n","<template>\n    <STList>\n        <STListItem :selectable=\"true\" element-name=\"label\">\n            <template #left>\n                <Radio v-model=\"filter.mode\" :name=\"filter.id\" :value=\"UIDateFilterMode.Equals\" @change=\"onChange\" />\n            </template>\n            <p class=\"style-title-list\">\n                Gelijk aan...\n            </p>\n\n            <component :is=\"DateSelection\" v-if=\"filter.mode === UIDateFilterMode.Equals\" ref=\"input\" v-model=\"filter.value\" :required=\"true\" placeholder=\"Vul datum in\" class=\"option\" />\n        </STListItem>\n\n        <STListItem :selectable=\"true\" element-name=\"label\">\n            <template #left>\n                <Radio v-model=\"filter.mode\" :name=\"filter.id\" :value=\"UIDateFilterMode.NotEquals\" @change=\"onChange\" />\n            </template>\n            <p class=\"style-title-list\">\n                Niet gelijk aan...\n            </p>\n\n            <component :is=\"DateSelection\" v-if=\"filter.mode === UIDateFilterMode.NotEquals\" ref=\"input\" v-model=\"filter.value\" :required=\"true\" placeholder=\"Vul datum in\" class=\"option\" />\n        </STListItem>\n\n        <STListItem :selectable=\"true\" element-name=\"label\">\n            <template #left>\n                <Radio v-model=\"filter.mode\" :name=\"filter.id\" :value=\"UIDateFilterMode.GreaterThan\" @change=\"onChange\" />\n            </template>\n            <p class=\"style-title-list\">\n                Groter dan...\n            </p>\n\n            <component :is=\"DateSelection\" v-if=\"filter.mode === UIDateFilterMode.GreaterThan\" ref=\"input\" v-model=\"filter.value\" :required=\"true\" placeholder=\"Vul datum in\" class=\"option\" />\n        </STListItem>\n\n        <STListItem :selectable=\"true\" element-name=\"label\">\n            <template #left>\n                <Radio v-model=\"filter.mode\" :name=\"filter.id\" :value=\"UIDateFilterMode.LessThan\" @change=\"onChange\" />\n            </template>\n            <p class=\"style-title-list\">\n                Kleiner dan...\n            </p>\n\n            <component :is=\"DateSelection\" v-if=\"filter.mode === UIDateFilterMode.LessThan\" ref=\"input\" v-model=\"filter.value\" :required=\"true\" placeholder=\"Vul datum in\" class=\"option\" />\n        </STListItem>\n    </STList>\n</template>\n\n<script lang=\"ts\" setup>\nimport { nextTick, ref } from 'vue';\nimport DateSelection from '../inputs/DateSelection.vue';\nimport { DateUIFilter, UIDateFilterMode } from './DateUIFilter';\n\ndefineProps<{\n    filter: DateUIFilter;\n}>();\n\nconst input = ref<HTMLInputElement | null>(null);\n\nasync function onChange() {\n    await nextTick();\n    input.value?.focus?.();\n}\n</script>\n","import { SimpleError } from '@simonbackx/simple-errors';\nimport { ComponentWithProperties } from '@simonbackx/vue-app-navigation';\nimport { isEmptyFilter, PropertyFilter, StamhoofdFilter, StamhoofdNotFilter, unwrapFilter, wrapFilter, WrapperFilter } from '@stamhoofd/structures';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport type UIFilterWrapper = ((value: StamhoofdFilter) => StamhoofdFilter);\nexport type UIFilterUnwrapper = ((value: StamhoofdFilter) => StamhoofdFilter | null);\n\nexport type UIFilterBuilders = UIFilterBuilder[];\nexport interface UIFilterBuilder<F extends UIFilter = UIFilter> {\n    /**\n     * Create a new default filter\n     */\n    create(options?: { isInverted?: boolean }): F;\n    name: string;\n\n    /**\n     * Hide in creation\n     */\n    allowCreation?: boolean;\n\n    wrapper?: WrapperFilter;\n    additionalUnwrappers?: WrapperFilter[];\n\n    // More complicated wrapper support:\n    wrapFilter?: UIFilterWrapper | null | undefined;\n    unwrapFilter?: UIFilterUnwrapper | null | undefined;\n\n    fromFilter(filter: StamhoofdFilter): UIFilter | null;\n}\n\nexport function unwrapFilterForBuilder(builder: UIFilterBuilder, filter: StamhoofdFilter): { match: boolean; markerValue?: StamhoofdFilter | undefined; leftOver?: StamhoofdFilter; isInverted?: boolean } {\n    for (const wrapper of [builder.wrapper!, ...(builder.additionalUnwrappers ?? [])].filter(w => !!w) as WrapperFilter[]) {\n        const result = unwrapFilter(filter, wrapper);\n\n        if (!result.match) {\n            const invertedFilter = UIFilter.invertFilter(filter);\n\n            if (invertedFilter) {\n                const invertedResult = unwrapFilter(invertedFilter, wrapper);\n\n                if (invertedResult.match) {\n                    return {\n                        ...invertedResult,\n                        isInverted: true,\n                    };\n                }\n            }\n        }\n\n        if (result.match) {\n            return result;\n        }\n    }\n\n    if (builder.unwrapFilter) {\n        const r = builder.unwrapFilter(filter);\n\n        if (r === null) {\n            const invertedFilter = UIFilter.invertFilter(filter);\n\n            if (invertedFilter) {\n                const invertedResult = builder.unwrapFilter(invertedFilter);\n                if (invertedResult !== null) {\n                    return {\n                        match: true,\n                        markerValue: invertedResult,\n                        isInverted: true,\n                    };\n                }\n            }\n        }\n        else {\n            return {\n                match: true,\n                markerValue: r,\n            };\n        }\n    }\n\n    return {\n        match: builder.wrapper === undefined && !builder.unwrapFilter,\n        markerValue: filter,\n    };\n}\n\nexport type StyledDescriptionChoice = { id: string; text: string; action: () => void; isSelected: () => boolean };\nexport type StyledDescription = { text: string; style: string; choices?: StyledDescriptionChoice[] }[];\nexport type UiFilterOptions = { isInverted?: boolean };\n\nexport abstract class UIFilter {\n    id = uuidv4();\n    builder!: UIFilterBuilder;\n    isInverted = false;\n\n    constructor(data: Partial<UIFilter>, options: UiFilterOptions = {}) {\n        Object.assign(this, data);\n\n        if (options.isInverted) {\n            this.isInverted = true;\n        }\n    }\n\n    /**\n     * Returns the filter object to pass to the backend or to apply locally\n     */\n    abstract doBuild(): StamhoofdFilter | null;\n\n    /**\n     * Returns the filter object to pass to the backend or to apply locally\n     */\n    build(): StamhoofdFilter | null {\n        const filter = this.buildFilter();\n\n        if (this.isInverted) {\n            return UIFilter.invertFilter(filter);\n        }\n\n        return filter;\n    }\n\n    private buildFilter(): StamhoofdFilter | null {\n        const b = this.doBuild();\n        if (b !== null && this.builder.wrapFilter) {\n            return this.builder.wrapFilter(b);\n        }\n\n        if (this.builder.wrapper) {\n            return wrapFilter(b, this.builder.wrapper);\n        }\n\n        return b;\n    }\n\n    static invertFilter(filter: StamhoofdFilter | null) {\n        if (filter === null) {\n            return null;\n        }\n\n        if (typeof filter !== 'object') {\n            throw new SimpleError({\n                code: 'filter_invert_fail',\n                message: 'Inverteren van de filter is mislukt',\n            });\n        }\n\n        const keys = Object.keys(filter);\n\n        if (keys.length === 1 && keys[0] === '$not') {\n            return (filter as StamhoofdNotFilter).$not;\n        }\n\n        return {\n            $not: filter,\n        };\n    }\n\n    clone(): UIFilter {\n        const f = new (this.constructor as any)();\n        Object.assign(f, this);\n        f.id = uuidv4();\n        return f;\n    }\n\n    flatten(): UIFilter | null {\n        return this;\n    }\n\n    /**\n     * Return the Vue component to edit this filter\n     */\n    abstract getComponent(): ComponentWithProperties;\n\n    get description(): string {\n        return this.styledDescription.map((s) => {\n            if ('choices' in s && s.choices) {\n                return s.choices.find(c => c.isSelected())?.text ?? '';\n            }\n            return s.text;\n        }).join(' ');\n    }\n\n    abstract get styledDescription(): StyledDescription;\n}\n\nexport function filterToString(filter: StamhoofdFilter, builder: UIFilterBuilder) {\n    const uiFilter = builder.fromFilter(filter);\n    if (uiFilter) {\n        return uiFilter.description;\n    }\n    return 'Onleesbare filter';\n}\n\nexport function propertyFilterToString(filter: PropertyFilter, builder: UIFilterBuilder) {\n    if (filter.enabledWhen === null || isEmptyFilter(filter.enabledWhen)) {\n        if (filter.requiredWhen === null) {\n            return 'Optioneel';\n        }\n        if (isEmptyFilter(filter.requiredWhen)) {\n            return 'Verplicht';\n        }\n\n        return 'Verplicht in te vullen als: ' + filterToString(filter.requiredWhen, builder) + ' (anders optioneel)';\n    }\n\n    const enabledDescription = filterToString(filter.enabledWhen, builder);\n\n    if (filter.requiredWhen === null) {\n        return 'Wordt enkel gevraagd als: ' + enabledDescription + ' (optioneel)';\n    }\n\n    if (isEmptyFilter(filter.requiredWhen)) {\n        return 'Wordt enkel gevraagd als: ' + enabledDescription;\n    }\n\n    return 'Wordt enkel gevraagd als: ' + enabledDescription + ' (enkel verplicht invullen als: ' + filterToString(filter.requiredWhen, builder) + ')';\n}\n","import { ComponentWithProperties } from '@simonbackx/vue-app-navigation';\nimport { StamhoofdFilter, unwrapFilterByPath, WrapperFilter } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport DateUIFilterView from './DateUIFilterView.vue';\nimport { UIFilter, UIFilterBuilder, UIFilterUnwrapper, UIFilterWrapper, unwrapFilterForBuilder } from './UIFilter';\n\nexport enum UIDateFilterMode {\n    GreaterThan = 'GreaterThan',\n    LessThan = 'LessThan',\n    Equals = 'Equals',\n    NotEquals = 'NotEquals',\n}\n\nfunction getBeginningOfDay(date: Date): Date {\n    return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n}\n\nfunction getEndOfDay(date: Date): Date {\n    return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999);\n}\n\nexport class DateUIFilter extends UIFilter {\n    builder!: DateFilterBuilder;\n    value: Date = new Date();\n    mode: UIDateFilterMode = UIDateFilterMode.Equals;\n\n    // idea: add possibility to choose time also\n    constructor(data: Partial<DateUIFilter>, options: { isInverted?: boolean } = {}) {\n        super(data, options);\n        Object.assign(this, data);\n    }\n\n    doBuild(): StamhoofdFilter {\n        switch (this.mode) {\n            case UIDateFilterMode.Equals: return {\n                $and: [\n                    {\n                        [this.builder.key]: {\n                            $gte: getBeginningOfDay(this.value),\n                        },\n                    },\n                    {\n                        [this.builder.key]: {\n                            $lte: getEndOfDay(this.value),\n                        },\n                    },\n                ],\n            };\n\n            case UIDateFilterMode.NotEquals: return {\n                $or: [\n                    {\n                        [this.builder.key]: {\n                            $lt: getBeginningOfDay(this.value),\n                        },\n                    },\n                    {\n                        [this.builder.key]: {\n                            $gt: getEndOfDay(this.value),\n                        },\n                    },\n                ],\n            };\n\n            case UIDateFilterMode.GreaterThan: return {\n                [this.builder.key]: {\n                    $gt: getEndOfDay(this.value),\n                },\n            };\n\n            case UIDateFilterMode.LessThan: return {\n                [this.builder.key]: {\n                    $lt: getBeginningOfDay(this.value),\n                },\n            };\n        }\n    }\n\n    getComponent(): ComponentWithProperties {\n        return new ComponentWithProperties(DateUIFilterView, {\n            filter: this,\n        });\n    }\n\n    get combinationWord(): string {\n        switch (this.mode) {\n            case UIDateFilterMode.GreaterThan: return 'is groter dan';\n            case UIDateFilterMode.LessThan: return 'is kleiner dan';\n            case UIDateFilterMode.Equals: return 'is gelijk aan';\n            case UIDateFilterMode.NotEquals: return 'is niet gelijk aan';\n        }\n    }\n\n    get styledDescription() {\n        return [\n            {\n                text: this.builder.name,\n                style: '',\n            },\n            {\n                text: ' ' + this.combinationWord + ' ',\n                style: 'gray',\n            }, {\n                text: Formatter.date(this.value, true),\n                style: '',\n            },\n        ];\n    }\n}\n\nexport class DateFilterBuilder implements UIFilterBuilder<DateUIFilter> {\n    key = '';\n    name = '';\n    wrapFilter?: UIFilterWrapper | null;\n    unwrapFilter?: UIFilterUnwrapper | null;\n    wrapper?: WrapperFilter;\n\n    constructor(data: { key: string; name: string; wrapFilter?: UIFilterWrapper; unwrapFilter?: UIFilterUnwrapper; wrapper?: WrapperFilter }) {\n        this.key = data.key;\n        this.wrapFilter = data.wrapFilter;\n        this.unwrapFilter = data.unwrapFilter;\n        this.name = data.name;\n        this.wrapper = data.wrapper;\n    }\n\n    fromFilter(filter: StamhoofdFilter): UIFilter | null {\n        const { markerValue: unwrapped, isInverted } = unwrapFilterForBuilder(this, filter);\n        if (unwrapped === null || unwrapped === undefined) {\n            return null;\n        }\n        if (!(typeof unwrapped === 'object')) {\n            return null;\n        }\n\n        const equals = unwrapFilterByPath(unwrapped, [this.key, '$eq']);\n\n        if (equals instanceof Date) {\n            return new DateUIFilter({\n                builder: this,\n                value: equals,\n                mode: UIDateFilterMode.Equals,\n            }, { isInverted });\n        }\n\n        const notEquals = unwrapFilterByPath(unwrapped, ['$not', this.key, '$eq']);\n\n        if (notEquals instanceof Date) {\n            return new DateUIFilter({\n                builder: this,\n                value: notEquals,\n                mode: UIDateFilterMode.NotEquals,\n            }, { isInverted });\n        }\n\n        const lessThan = unwrapFilterByPath(unwrapped, [this.key, '$lt']);\n\n        if (lessThan instanceof Date) {\n            return new DateUIFilter({\n                builder: this,\n                value: lessThan,\n                mode: UIDateFilterMode.LessThan,\n            }, { isInverted });\n        }\n\n        const greaterThan = unwrapFilterByPath(unwrapped, [this.key, '$gt']);\n\n        if (greaterThan instanceof Date) {\n            return new DateUIFilter({\n                builder: this,\n                value: greaterThan,\n                mode: UIDateFilterMode.GreaterThan,\n            }, { isInverted });\n        }\n\n        return null;\n    }\n\n    create(options: { isInverted?: boolean } = {}): DateUIFilter {\n        return new DateUIFilter({\n            builder: this,\n            value: new Date(),\n        }, options);\n    }\n}\n","<template>\n    <STList v-if=\"filters.length\" v-model=\"draggableFilters\" class=\"group-ui-filter-list\" :draggable=\"true\">\n        <template #item=\"{item: child, index}\">\n            <STListItem :selectable=\"!isGroup(child)\" class=\"right-stack group-ui-filter-row\" :class=\"{isLast: index === filters.length - 1, isFirst: index === 0}\" @click=\"isGroup(child) ? undefined : editFilter(index, child)\">\n                <template v-if=\"isGroup(child)\" #left>\n                    <span class=\"group-ui-filter-child-line\" />\n                </template>\n\n                <div v-if=\"!isGroup(child)\">\n                    <template v-for=\"(s, i) in child.styledDescription\" :key=\"i\">\n                        <span v-if=\"s.choices?.length\" class=\"button text inline margin-space\" :class=\"s.style\" type=\"button\" @click.stop.prevent=\"$event => showChoices($event, s.choices!)\">\n                            <span v-text=\"getSelectedChoiceText(s.choices)\" />\n                            <span class=\"icon arrow-down-small\" />\n                        </span>\n                        <span v-else class=\"styled-description\" :class=\"s.style\" v-text=\"s.text\" />\n                    </template>\n                </div>\n                <div v-else>\n                    <GroupUIFilterList :filter=\"child\" @click.stop @replace=\"setFilter(index, child, $event)\" />\n                </div>\n\n                <div v-if=\"index < filters.length - 1\" class=\"group-ui-filter-mode\" @click.stop>\n                    <Dropdown :model-value=\"filter.mode\" @update:model-value=\"setFilterMode($event, index)\">\n                        <option :value=\"GroupUIFilterMode.And\">\n                            En\n                        </option>\n                        <option :value=\"GroupUIFilterMode.Or\">\n                            Of\n                        </option>\n                    </Dropdown>\n                </div>\n\n                <template v-if=\"!isGroup(child)\" #right>\n                    <button class=\"button icon trash gray\" type=\"button\" @click=\"deleteFilter(index, child)\" />\n                    <span class=\"icon edit gray\" />\n                    <span v-if=\"filters.length > 1\" class=\"button icon drag gray\" @click.stop @contextmenu.stop />\n                </template>\n            </STListItem>\n        </template>\n    </STList>\n    <p v-else>\n        Geen filters\n    </p>\n</template>\n\n\n<script lang=\"ts\" setup>\nimport { ComponentWithProperties, useShow } from \"@simonbackx/vue-app-navigation\";\n\nimport { computed } from \"vue\";\nimport Dropdown from \"../../inputs/Dropdown.vue\";\nimport { ContextMenu, ContextMenuItem } from \"../../overlays/ContextMenu\";\nimport { GroupUIFilter, GroupUIFilterMode } from \"../GroupUIFilter\";\nimport { StyledDescriptionChoice, UIFilter } from \"../UIFilter\";\nimport UIFilterEditor from \"../UIFilterEditor.vue\";\n\nconst props = defineProps<{\n    filter: GroupUIFilter\n}>();\nconst show = useShow();\n\nconst emit = defineEmits<{\n    replace: [patch: UIFilter|null]\n}>();\nconst filters = computed(() => props.filter.filters);\n\nconst draggableFilters = computed({\n    get: () => filters.value,\n    set: (value: UIFilter[]) => {\n        const clone = props.filter.clone();\n        clone.filters = value;\n        emit('replace', clone.flatten());\n    }\n})\n\nfunction getSelectedChoiceText(choices: StyledDescriptionChoice[]) {\n    return choices.find(c => c.isSelected())?.text;\n}\n\nasync function showChoices(event: MouseEvent, choices: StyledDescriptionChoice[]) {\n    const menu = new ContextMenu([\n        choices.map(choice => {\n            return new ContextMenuItem({\n                name: choice.text,\n                action: choice.action\n            })\n        })\n    ])\n\n    await menu.show({\n        button: event.currentTarget as HTMLElement\n    })\n}\n\nasync function editFilter(index: number, filter: UIFilter) {\n    await show({\n        components: [\n            new ComponentWithProperties(UIFilterEditor, {\n                filter,\n                saveHandler: (f: UIFilter) => {\n                    const ff = f.flatten();\n                    if (!ff) {\n                        filters.value.splice(index, 1)\n                        return;\n                    }\n                    filters.value.splice(index, 1, ff)\n                },\n                deleteHandler: () => {\n                    deleteFilter(index, filter);\n                }\n            })\n        ]\n    })\n}\n\nfunction deleteFilter(index: number, filter: UIFilter) {\n    const clone = props.filter.clone();\n    clone.filters.splice(index, 1);\n    emit('replace', clone.flatten());\n}\n\nfunction setFilter(index: number, oldFilter: UIFilter, newFilter: UIFilter|null) {\n    if (!newFilter) {\n        deleteFilter(index, oldFilter);\n        return;\n    }\n\n    const clone = props.filter.clone();\n    clone.filters.splice(index, 1, newFilter);\n    emit('replace', clone.flatten());\n}\n\nfunction isGroup(filter: UIFilter): filter is GroupUIFilter {\n    return (filter instanceof GroupUIFilter) && !filter.builder.wrapFilter && !filter.builder.wrapper;\n}\n\nfunction setFilterMode(mode: GroupUIFilterMode, index: number) {\n    if (mode === props.filter.mode) {\n        return;\n    }\n\n    if (filters.value.length <= 2) {\n        const cloned = props.filter.clone();\n        cloned.mode = mode;\n        emit('replace', cloned.flatten());\n        return\n    }\n\n    const item1 = filters.value[index];\n    const item2 = filters.value[index + 1];\n\n    if (!item1 || !item2) {\n        return;\n    }\n\n    const newChildGroup = props.filter.clone()\n    newChildGroup.filters = [item1, item2];\n    newChildGroup.mode = mode;\n\n    filters.value.splice(index, 2, newChildGroup);\n    const flatten = props.filter.flatten();\n    if (flatten !== props.filter) {\n        emit('replace', flatten);\n    }\n}\n\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use \"@stamhoofd/scss/base/text-styles.scss\" as *;\n\n.group-ui-filter-mode {\n    position: absolute;\n    bottom: 0;\n    left: var(--st-horizontal-padding, 40px);\n    transform: translateY(50%);\n    z-index: 10;\n    transition: opacity 0.2s;\n\n    .sortable-drag & {\n        \n        opacity: 0;\n    }\n\n    .st-list.is-dragging & {\n        opacity: 0;\n    }\n}\n\n.group-ui-filter-list {\n    --st-list-padding: 30px;\n    --st-list-padding-top: 30px;\n    --st-list-padding-bottom: 30px;\n}\n\n.group-ui-filter-row {\n    position: relative;\n    contain: none;\n    --st-list-padding: 30px;\n    --st-list-padding-top: 30px;\n    --st-list-padding-bottom: 30px;\n\n    &.isFirst {\n       --st-list-padding-top: 15px;\n    }\n\n    // We use js selectors because during drag, :first-child and :last-child are not correct\n    &.isLast {\n        --st-list-padding-bottom: 15px;\n    }\n}\n\n.group-ui-filter-list + hr {\n    margin-top: 10px !important;\n}\n\n.group-ui-filter-child-line {\n    height: calc(100% - 60px);\n    width: $border-width-thin;\n    background: $color-border;\n    top: 30px;\n    position: absolute;\n}\n\n.margin-space {\n    margin-left: 0.5ch;\n    margin-right: 0.5ch;\n}\n</style>\n","<template>\n    <div class=\"container\">\n        <p v-if=\"filter.builder.description\" class=\"style-description-block\">\n            {{ filter.builder.description }}\n        </p>\n\n        <p v-else-if=\"canPop\" class=\"style-description-block\">\n            {{ $t(\"bfc8aada-8c57-4789-9059-a7df4824e67b\") }}\n        </p>\n\n        <GroupUIFilterList v-if=\"filters.length\" :filter=\"filter\" @replace=\"copyFromChanged($event)\" />\n\n        <hr v-if=\"filters.length\">\n\n        <STList>\n            <STListItem v-for=\"(builder, index) in builders\" :key=\"index\" :selectable=\"true\" class=\"right-stack\" @click=\"addFilter(builder)\">\n                <h3 class=\"style-title-list\">\n                    {{ capitalizeFirstLetter(builder.name) }}\n                </h3>\n                <p v-if=\"'description' in builder\" class=\"style-description-small\">\n                    {{ builder.description }}\n                </p>\n\n                <template #left>\n                    <span class=\"button icon filter gray\" />\n                </template>\n            </STListItem>\n        </STList>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ComponentWithProperties, useCanPop, useShow } from '@simonbackx/vue-app-navigation';\n\nimport { computed } from 'vue';\nimport STList from '../layout/STList.vue';\nimport STListItem from '../layout/STListItem.vue';\nimport { GroupUIFilter, GroupUIFilterBuilder } from './GroupUIFilter';\nimport { UIFilter, UIFilterBuilder } from './UIFilter';\nimport UIFilterEditor from './UIFilterEditor.vue';\nimport GroupUIFilterList from './components/GroupUIFilterList.vue';\n\nconst props = defineProps<{\n    filter: GroupUIFilter;\n}>();\n\nconst show = useShow();\nconst canPop = useCanPop();\n\nconst filters = computed(() => props.filter.filters);\n\nfunction filterBuilders(builders: UIFilterBuilder[]) {\n    return builders.filter(b => b.allowCreation === undefined || b.allowCreation === true);\n}\n\nconst builders = computed(() => {\n    if (props.filter.builders.length > 1 && props.filter.builders[0] instanceof GroupUIFilterBuilder && !props.filter.builders[0].wrapper) {\n        // Remove first\n        return filterBuilders(props.filter.builders.slice(1));\n    }\n    return filterBuilders(props.filter.builders).filter(b => b !== props.filter.builder);\n});\n\nasync function addFilter(builder: UIFilterBuilder) {\n    const filter = builder.create();\n    await show({\n        components: [\n            new ComponentWithProperties(UIFilterEditor, {\n                filter,\n                saveHandler: (f: UIFilter) => {\n                    const ff = f.flatten();\n                    if (!ff) {\n                        return;\n                    }\n                    filters.value.push(ff);\n                    copyFromChanged(props.filter.flatten());\n                },\n            }),\n        ],\n    });\n}\n\nfunction copyFromChanged(filter: UIFilter | null) {\n    if (!filter) {\n        props.filter.filters = [];\n        return;\n    }\n\n    if (filter instanceof GroupUIFilter && filter.builder === props.filter.builder) {\n        props.filter.filters = filter.filters;\n        props.filter.mode = filter.mode;\n        return;\n    }\n\n    filters.value.splice(0, filters.value.length, filter);\n}\n</script>\n","<template>\n    <code class=\"style-code\">\n        {{ encodedJson }}\n    </code>\n</template>\n\n\n<script lang=\"ts\" setup>\nimport { UnknownUIFilter } from './UnknownUIFilter';\n\nconst props = defineProps<{\n    filter: UnknownUIFilter\n}>()\n\nconst encodedJson = JSON.stringify(\n    props.filter.value,\n    null,\n    4\n)\n</script>\n","import { ComponentWithProperties } from \"@simonbackx/vue-app-navigation\";\nimport { StamhoofdFilter } from \"@stamhoofd/structures\";\n\nimport { UIFilter, UIFilterBuilder } from \"./UIFilter\";\nimport UnknownUIFilterView from \"./UnknownUIFilterView.vue\";\n\nexport class UnknownUIFilter extends UIFilter {\n    builder!: UnknownFilterBuilder\n    value: StamhoofdFilter\n\n    constructor(data: Partial<UnknownUIFilter>, options: {isInverted?: boolean} = {}) {\n        super(data, options)\n        Object.assign(this, data);\n    }\n\n    doBuild(): StamhoofdFilter {\n        return this.value\n    }\n\n    flatten() {\n        return super.flatten()\n    }\n\n    getComponent(): ComponentWithProperties {\n        return new ComponentWithProperties(UnknownUIFilterView, {\n            filter: this\n        })\n    }\n\n    get styledDescription() {\n        return [\n            {\n                text: 'Niet ondersteunde filter',\n                style: ''\n            }\n        ]\n    }\n}\n\nexport class UnknownFilterBuilder implements UIFilterBuilder<UnknownUIFilter> {\n    get name() {\n        return 'Niet ondersteunde filter';\n    }\n\n    fromFilter(filter: StamhoofdFilter): UIFilter | null {\n        return new UnknownUIFilter({\n            builder: this,\n            value: filter\n        })\n    }\n    \n    create(options: {isInverted?: boolean} = {}): UnknownUIFilter {\n        return new UnknownUIFilter({\n            builder: this,\n            value: {}\n        }, options)\n    }\n}\n","import { ComponentWithProperties } from '@simonbackx/vue-app-navigation';\nimport { StamhoofdFilter, WrapperFilter } from '@stamhoofd/structures';\n\nimport { markRaw } from 'vue';\nimport GroupUIFilterView from './GroupUIFilterView.vue';\nimport { StyledDescription, UIFilter, UIFilterBuilder, UIFilterWrapper, unwrapFilterForBuilder } from './UIFilter';\nimport { UnknownFilterBuilder, UnknownUIFilter } from './UnknownUIFilter';\n\nexport enum GroupUIFilterMode {\n    Or = 'Or',\n    And = 'And',\n}\n\nexport class GroupUIFilter extends UIFilter {\n    filters: UIFilter[] = [];\n    builder!: GroupUIFilterBuilder;\n    mode: GroupUIFilterMode = GroupUIFilterMode.And;\n\n    get builders() {\n        return this.builder.builders;\n    }\n\n    doBuild(): StamhoofdFilter | null {\n        if (!this.filters.length) {\n            return null;\n        }\n\n        const buildFilters = this.filters.map(b => b.build()).filter(f => f !== null) as StamhoofdFilter[];\n        if (buildFilters.length === 0) {\n            return null;\n        }\n\n        if (buildFilters.length === 1) {\n            return buildFilters[0];\n        }\n\n        return {\n            [this.mode === GroupUIFilterMode.And ? '$and' : '$or']: buildFilters,\n        };\n    }\n\n    clone() {\n        const c = super.clone() as GroupUIFilter;\n        c.filters = this.filters.map(f => f.clone());\n        c.mode = this.mode;\n        return c;\n    }\n\n    flatten() {\n        if (this.filters.length === 0) {\n            return null;\n        }\n\n        let flattened = this.builder.wrapFilter || this.builder.wrapper ? this.filters.slice() : this.filters.map(f => f?.flatten()).filter(f => !!f);\n\n        flattened = flattened.flatMap((f) => {\n            if (f instanceof GroupUIFilter && f.mode === this.mode && !f.builder.wrapFilter && !f.builder.wrapper) {\n                return f.filters;\n            }\n            return f;\n        });\n\n        if (flattened.length === 0) {\n            return null;\n        }\n\n        if (flattened.length === 1 && !this.builder.wrapFilter && !this.builder.wrapper) {\n            return flattened[0];\n        }\n\n        const clone = this.clone();\n        clone.filters = flattened as UIFilter[];\n        return clone;\n    }\n\n    getComponent(): ComponentWithProperties {\n        return new ComponentWithProperties(GroupUIFilterView, {\n            filter: this,\n        });\n    }\n\n    override get styledDescription(): StyledDescription {\n        const array = this.filters.map(b => b.styledDescription);\n        const last = array.pop();\n\n        if (last === undefined) {\n            return [];\n        }\n\n        const plast = array.pop();\n        const flattened = array.flatMap(a => [...a, { text: ', ', style: 'gray' }]);\n        if (plast) {\n            flattened.push(...plast);\n        }\n\n        if (flattened.length > 0) {\n            flattened.push({ text: this.mode === GroupUIFilterMode.And ? ' en ' : ' of ', style: 'gray' });\n        }\n\n        flattened.push(...last);\n\n        if (this.builder.wrapper) {\n            const prefix: typeof flattened = [];\n            prefix.push({\n                text: 'Heeft ',\n                style: 'gray',\n                choices: [\n                    {\n                        id: 'false',\n                        text: 'Heeft',\n                        action: () => this.isInverted = false,\n                        isSelected: () => this.isInverted === false,\n                    },\n                    {\n                        id: 'true',\n                        text: 'Heeft geen',\n                        action: () => this.isInverted = true,\n                        isSelected: () => this.isInverted === true,\n                    },\n                ],\n            });\n\n            prefix.push({\n                text: this.builder.name,\n                style: '',\n            });\n\n            prefix.push({\n                text: ' waar ',\n                style: 'gray',\n            });\n\n            flattened.unshift(...prefix);\n        }\n\n        return flattened;\n    }\n}\n\nexport class GroupUIFilterBuilder implements UIFilterBuilder<GroupUIFilter> {\n    builders: UIFilterBuilder[] = [];\n    name = 'complexe filtergroep';\n    description = '';\n    wrapFilter?: UIFilterWrapper | null;\n    wrapper?: WrapperFilter;\n\n    constructor(data: { builders: UIFilterBuilder[]; name?: string; description?: string; wrapFilter?: UIFilterWrapper | null; wrapper?: WrapperFilter }) {\n        this.builders = data.builders;\n        this.name = data.name ?? this.name;\n        this.description = data.description ?? this.description;\n        this.wrapFilter = data.wrapFilter ?? null;\n        this.wrapper = data.wrapper;\n\n        markRaw(this);\n    }\n\n    create(options: { isInverted?: boolean } = {}): GroupUIFilter {\n        return new GroupUIFilter({\n            builder: this,\n        }, options);\n    }\n\n    fromFilter(filter: StamhoofdFilter): UIFilter | null {\n        const result = unwrapFilterForBuilder(this, filter);\n        if (!result.match) {\n            filter = [];\n        }\n        else {\n            filter = result.markerValue ?? [];\n        }\n\n        let allowSelf = false;\n        let mode = GroupUIFilterMode.And;\n        if (typeof filter === 'object' && filter !== null && ('$and' in filter)) {\n            filter = filter.$and;\n            allowSelf = true;\n            mode = GroupUIFilterMode.And;\n        }\n\n        if (typeof filter === 'object' && filter !== null && ('$or' in filter)) {\n            filter = filter.$or;\n            allowSelf = true;\n            mode = GroupUIFilterMode.Or;\n        }\n\n        // Match\n        const subfilters: UIFilter[] = [];\n        const queue = Array.isArray(filter) ? filter.slice() : [filter];\n        let c = 0;\n\n        while (queue.length && c < 200) {\n            c++;\n            const f = queue.shift();\n            if (f === undefined) {\n                break;\n            }\n\n            for (const builder of [...this.builders, new UnknownFilterBuilder()]) {\n                if (builder === this && !allowSelf) {\n                    continue;\n                }\n                const decoded = builder.fromFilter(f);\n\n                if (decoded !== null) {\n                    if (decoded instanceof GroupUIFilter && (!decoded.filters.length || decoded.filters.every(f => f instanceof UnknownUIFilter))) {\n                        continue;\n                    }\n\n                    // do we have a leftover?\n                    const unwrappedF = unwrapFilterForBuilder(builder, f);\n\n                    const dd = decoded.flatten() ?? decoded;\n\n                    if (unwrappedF.leftOver) {\n                        // Keep processing this leftover one\n                        queue.push(unwrappedF.leftOver);\n                    }\n                    subfilters.push(dd);\n                    break;\n                }\n            }\n        }\n\n        const groupFilter = this.create();\n        groupFilter.filters = subfilters;\n        groupFilter.mode = mode;\n        if (result.isInverted) {\n            groupFilter.isInverted = true;\n        }\n        return groupFilter;\n    }\n}\n","<template>\n    <STList>\n        <STListItem v-if=\"filter.configuration.showOptionSelectAll\" :selectable=\"true\" element-name=\"label\">\n            <template #left>\n                <Checkbox v-model=\"isSelectAll\" />\n            </template>\n            <h3 class=\"style-title-list\">\n                {{ $t('b183b823-481c-46b1-951d-8a68dccc2517') }}\n            </h3>\n        </STListItem>\n        <template v-if=\"!isSelectAll\">\n            <STListItem v-for=\"option of options\" :key=\"option.value\" :selectable=\"true\" element-name=\"label\">\n                <template #left>\n                    <Checkbox :model-value=\"isOptionSelected(option)\" @update:model-value=\"setOptionSelected(option, $event)\" />\n                </template>\n                <h3 class=\"style-title-list\">\n                    {{ option.name }}\n                </h3>\n            </STListItem>\n        </template>\n    </STList>\n</template>\n\n\n<script lang=\"ts\" setup>\nimport { computed, ref, watch } from \"vue\";\nimport Checkbox from \"../inputs/Checkbox.vue\";\nimport STList from \"../layout/STList.vue\";\nimport STListItem from \"../layout/STListItem.vue\";\nimport { MultipleChoiceUIFilter, MultipleChoiceUIFilterOption } from './MultipleChoiceUIFilter';\n\nconst props = defineProps<{filter: MultipleChoiceUIFilter}>();\n\nconst isSelectAll = ref(false);\n\nwatch(isSelectAll, (isSelectAll) => {\n    if(isSelectAll) {\n        props.filter.selectedOptions = [...props.filter.builder.multipleChoiceOptions];\n    } else {\n        props.filter.selectedOptions = [];\n    }\n});\n\nconst options = computed(() => props.filter.builder.multipleChoiceOptions);\n\nfunction isOptionSelected(option: MultipleChoiceUIFilterOption) {\n    return !!props.filter.selectedOptions.find(i => i.value === option.value)\n}\n\nfunction setOptionSelected(option: MultipleChoiceUIFilterOption, selected: boolean) {\n    if (selected === isOptionSelected(option)) {\n        return\n    }\n    if (!selected) {\n        const index = props.filter.selectedOptions.findIndex(i => i.value === option.value)\n        if (index !== -1) {\n            props.filter.selectedOptions.splice(index, 1)\n        }\n    } else {\n        props.filter.selectedOptions.push(option)\n    }\n}\n</script>\n","import { ComponentWithProperties } from '@simonbackx/vue-app-navigation';\nimport { StamhoofdCompareValue, StamhoofdFilter, WrapperFilter } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\n\nimport MultipleChoiceUIFilterView from './MultipleChoiceUIFilterView.vue';\nimport { StyledDescription, UIFilter, UIFilterBuilder, UiFilterOptions, UIFilterUnwrapper, UIFilterWrapper, unwrapFilterForBuilder } from './UIFilter';\n\nexport class MultipleChoiceUIFilterOption {\n    name: string;\n    value: StamhoofdCompareValue;\n\n    constructor(name: string, value: StamhoofdCompareValue) {\n        this.name = name;\n        this.value = value;\n    }\n}\n\nexport enum MultipleChoiceUIFilterMode {\n    And = 'And',\n    Or = 'Or',\n}\n\nexport class MultipleChoiceUIFilter extends UIFilter {\n    builder: MultipleChoiceFilterBuilder;\n    selectedOptions: MultipleChoiceUIFilterOption[] = [];\n    configuration: MultipleChoiceUiFilterConfiguration;\n\n    constructor(data: Partial<UIFilter>, options: UiFilterOptions, multipleChoiceConfiguration: MultipleChoiceUiFilterConfiguration) {\n        super(data, options);\n\n        this.configuration = multipleChoiceConfiguration;\n    }\n\n    doBuild(): StamhoofdFilter {\n        return this.selectedOptions.map(o => o.value);\n    }\n\n    flatten() {\n        if (this.selectedOptions.length === 0) {\n            return null;\n        }\n\n        return super.flatten();\n    }\n\n    getComponent(): ComponentWithProperties {\n        return new ComponentWithProperties(MultipleChoiceUIFilterView, {\n            filter: this,\n        });\n    }\n\n    override get styledDescription(): StyledDescription {\n        const { mode, isSubjectPlural } = this.configuration;\n        const lastJoinWord = mode === MultipleChoiceUIFilterMode.Or ? 'of' : 'en';\n\n        return [\n            {\n                text: this.builder.name,\n                style: '',\n            },\n            {\n                text: '',\n                style: '',\n                choices: [\n                    {\n                        id: 'is',\n                        text: isSubjectPlural ? 'zijn' : 'is',\n                        action: () => {\n                            this.isInverted = false;\n                        },\n                        isSelected: () => !this.isInverted,\n                    },\n                    {\n                        id: 'is not',\n                        text: isSubjectPlural ? 'zijn niet' : 'is niet',\n                        action: () => {\n                            this.isInverted = true;\n                        },\n                        isSelected: () => this.isInverted,\n                    },\n                ],\n            },\n            {\n                text: Formatter.joinLast(this.selectedOptions.map(o => o.name), ', ', ` ${lastJoinWord} `),\n                style: '',\n            },\n        ];\n    }\n}\n\nexport type MultipleChoiceUiFilterConfiguration = {\n    mode: MultipleChoiceUIFilterMode;\n    isSubjectPlural: boolean;\n    showOptionSelectAll: boolean;\n};\n\nexport class MultipleChoiceFilterBuilder implements UIFilterBuilder<MultipleChoiceUIFilter> {\n    name = '';\n    description = '';\n    wrapper?: WrapperFilter;\n    additionalUnwrappers?: WrapperFilter[];\n    wrapFilter?: UIFilterWrapper | null | undefined;\n    unwrapFilter?: UIFilterUnwrapper | null | undefined;\n    allowCreation?: boolean | undefined;\n\n    multipleChoiceOptions: MultipleChoiceUIFilterOption[] = [];\n    multipleChoiceConfiguration: MultipleChoiceUiFilterConfiguration = {\n        mode: MultipleChoiceUIFilterMode.Or,\n        isSubjectPlural: false,\n        showOptionSelectAll: false,\n    };\n\n    constructor(data: {\n        name: string;\n        description?: string;\n        options: MultipleChoiceUIFilterOption[];\n        wrapper?: WrapperFilter;\n        additionalUnwrappers?: WrapperFilter[];\n        wrapFilter?: UIFilterWrapper | null | undefined;\n        unwrapFilter?: UIFilterUnwrapper | null | undefined;\n        multipleChoiceConfiguration?: Partial<MultipleChoiceUiFilterConfiguration>;\n        allowCreation?: boolean;\n    }) {\n        this.name = data.name;\n        this.description = data.description;\n        this.multipleChoiceOptions = data.options;\n        this.wrapper = data.wrapper;\n        this.wrapFilter = data.wrapFilter;\n        this.unwrapFilter = data.unwrapFilter;\n        this.additionalUnwrappers = data.additionalUnwrappers;\n        this.allowCreation = data.allowCreation;\n\n        const multipleChoiceConfiguration = data.multipleChoiceConfiguration;\n        if (multipleChoiceConfiguration) {\n            const { mode, isSubjectPlural, showOptionSelectAll } = multipleChoiceConfiguration;\n\n            if (mode !== undefined) {\n                this.multipleChoiceConfiguration.mode = mode;\n            }\n            if (isSubjectPlural !== undefined) {\n                this.multipleChoiceConfiguration.isSubjectPlural = isSubjectPlural;\n            }\n            if (showOptionSelectAll !== undefined) {\n                this.multipleChoiceConfiguration.showOptionSelectAll = showOptionSelectAll;\n            }\n        }\n    }\n\n    fromFilter(filter: StamhoofdFilter): UIFilter | null {\n        const match = unwrapFilterForBuilder(this, filter);\n        if (!match.match || match.markerValue === undefined) {\n            return null;\n        }\n        const response = match.markerValue;\n\n        if (Array.isArray(response)) {\n            // Check if all the options are valid\n            const options = this.multipleChoiceOptions.filter(o => response.includes(o.value));\n\n            if (options.length === response.length) {\n                const uiFilter = new MultipleChoiceUIFilter({\n                    builder: this,\n                }, { isInverted: match.isInverted }, this.multipleChoiceConfiguration);\n                uiFilter.selectedOptions = options;\n\n                return uiFilter;\n            }\n        }\n\n        const option = this.multipleChoiceOptions.find(o => o.value === response);\n        if (option) {\n            const uiFilter = new MultipleChoiceUIFilter({\n                builder: this,\n            }, { isInverted: match.isInverted }, this.multipleChoiceConfiguration);\n            uiFilter.selectedOptions = [option];\n\n            return uiFilter;\n        }\n\n        return null;\n    }\n\n    create(options: { isInverted?: boolean } = {}): MultipleChoiceUIFilter {\n        return new MultipleChoiceUIFilter({\n            builder: this,\n        }, options, this.multipleChoiceConfiguration);\n    }\n}\n","<template>\n    <div class=\"number-container\">\n        <label class=\"number-input input\" :class=\"{ error: !valid }\">\n            <!-- \n                We use type = text here because the specs of number inputs ensure that we can't get \n                the raw string value, but we need this for our placeholder logic.\n                Also inputmode is more specific on mobile devices. \n                Only downside is that we lose the stepper input on desktop.\n            -->\n            <input\n                ref=\"input\"\n                v-model=\"valueString\"\n                :disabled=\"disabled\"\n                type=\"text\"\n                :inputmode=\"floatingPoint ? 'decimal' : 'numeric'\"\n                step=\"any\"\n                @blur=\"clean\"\n                @keydown.up.prevent=\"step(1)\"\n                @keydown.down.prevent=\"step(-1)\"\n            >\n            <div v-if=\"!valid\">\n                <span>{{ valueString }}</span>\n            </div>\n            <div v-else-if=\"valueString !== ''\">\n                <span>{{ valueString }}</span> {{ internalValue === 1 && suffixSingular !== null ? suffixSingular : suffix }}\n            </div>\n            <div v-else>{{ placeholder }}</div>\n        </label>\n        <StepperInput v-if=\"stepper\" v-model=\"stepperValue\" :min=\"min\" :max=\"max\" />\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { Component, Prop, VueComponent, Watch } from '@simonbackx/vue-app-navigation/classes';\n\nimport StepperInput from \"./StepperInput.vue\";\n\n@Component({\n    components: {\n        StepperInput\n    },\n    emits: [\"update:modelValue\"]\n})\nexport default class NumberInput extends VueComponent {\n    /** Price in cents */\n    @Prop({ default: 0 })\n        min!: number | null\n\n    /** Price in cents */\n    @Prop({ default: null })\n        max!: number | null;\n\n    @Prop({ default: false })\n        stepper!: boolean;\n\n    valueString = \"\";\n    valid = true;\n\n    /** Price in cents */\n    @Prop({ default: true })\n        required!: boolean\n\n    @Prop({ default: false })\n        disabled!: boolean\n\n    /** Price in cents */\n    @Prop({ default: 0 })\n        modelValue!: number | null\n\n    @Prop({ default: \"\" })\n        suffix: string;\n\n    @Prop({ default: null })\n        suffixSingular: string | null;\n\n    @Prop({ default: \"\" })\n        placeholder!: string\n\n    @Prop({ default: false })\n        floatingPoint!: boolean // In cents if floating point, never returns floats!\n\n    @Watch(\"value\")\n    onValueChange() {\n        this.clean()\n    }\n\n    get internalValue() {\n        return this.modelValue\n    }\n\n    set internalValue(val: number | null) {\n        if(val === this.modelValue) {\n            return;\n        }\n        this.$emit('update:modelValue', val)\n    }\n\n    get stepperValue() {\n        return this.modelValue ?? this.min ?? 0\n    }\n\n    set stepperValue(val: number) {\n        this.$emit('update:modelValue', val)\n        this.$nextTick(() => {\n            this.clean();\n        })\n    }\n\n    mounted() {\n        this.clean()\n    }\n\n    @Watch(\"valueString\")\n    onValueChanged(value: string, _oldValue: string) {\n        // We need the value string here! Vue does some converting to numbers automatically\n        // but for our placeholder system we need exactly the same string\n        if (value === \"\") {\n            if (this.required) {\n                this.valid = true;\n                this.internalValue = Math.max(0, this.min ?? 0);\n            } else {\n                this.valid = true;\n                this.internalValue = null;\n            }\n        } else {\n            if (!value.includes(\".\")) {\n                // We do this for all locales since some browsers report the language locale instead of the formatting locale\n                value = value.replace(\",\", \".\");\n            }\n            const v = parseFloat(value);\n            if (isNaN(v)) {\n                this.valid = false;\n                this.internalValue = this.min ?? 0;\n            } else {\n                this.valid = true;\n\n                // Remove extra decimals\n                this.internalValue = this.constrain(Math.round(v * (this.floatingPoint ? 100 : 1)));\n            }\n        }\n    }\n\n    /// Returns the decimal separator of the system. Might be wrong if the system has a region set different from the language with an unknown combination.\n    whatDecimalSeparator(): string {\n        const n = 1.1;\n        const str = n.toLocaleString().substring(1, 2);\n        return str;\n    }\n\n    // Restore invalid input, make the input value again\n    // And set valueString\n    clean() {\n        if (!this.valid) {\n            return;\n        }\n\n        let value = this.modelValue\n        if (value === null) {\n            if (!this.required) {\n                this.valueString = \"\"\n                return\n            }\n            value = this.min ?? 0\n        }\n\n        // Check if has decimals\n        const float = value / (this.floatingPoint ? 100 : 1)\n        const decimals = float % 1;\n        const abs = Math.abs(float);\n\n        if (decimals !== 0) {\n            // Include decimals\n            this.valueString =\n                (float < 0 ? \"-\" : \"\") +\n                Math.floor(abs) +\n                this.whatDecimalSeparator() +\n                 (\"\"+Math.round(Math.abs(decimals) * (this.floatingPoint ? 100 : 1))).padStart(2, \"0\");\n        } else {\n            // Hide decimals\n            this.valueString = float + \"\";\n        }\n    }\n\n    // Limit value to bounds\n    constrain(value: number): number {\n        if (this.min !== null && value < this.min) {\n            value = this.min;\n        } else if (this.max !== null && value > this.max) {\n            value = this.max;\n        }\n        return value\n    }\n\n    step(add: number) {\n        if (!this.valid) {\n            return;\n        }\n        const v = this.constrain((this.internalValue ?? this.min ?? 0) + add);\n        this.internalValue = v\n        this.$nextTick(() => {\n            this.clean();\n        })\n        \n    }\n\n    focus() {\n        //(this.$refs[\"input\"] as any).focus()\n    }\n}\n</script>\n\n<!-- Add \"scoped\" attribute to limit CSS to this component only -->\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n\n.number-container {\n    display: flex;\n\n    &.option {\n        margin-top: 7px\n    }\n\n    .number-input {\n        min-width: 0;\n    }\n\n    .stepper-input {\n        margin-left: 5px;\n        min-width: 0;\n        flex-shrink: 0;\n    }\n}\n.number-input {\n    position: relative;\n\n    & > div {\n        pointer-events: none;\n        user-select: none;\n        white-space: nowrap;\n\n        span {\n            white-space: pre;\n        }\n    }\n\n    & > input {\n        position: absolute;\n        left: 0;\n        right: 0;\n        top: 0;\n        bottom: 0;\n        opacity: 0;\n        width: 100%;\n        box-sizing: border-box;\n        padding: 5px 15px;\n        height:  calc(#{$input-height} - 2 * #{$border-width});\n        line-height: calc(#{$input-height} - 10px - 2 * #{$border-width});\n\n        &:focus {\n            opacity: 1;\n\n            & + div {\n                opacity: 0.5;\n\n                span {\n                    visibility: hidden;\n                }\n            }\n        }\n    }\n}\n</style>\n","<template>\n    <label class=\"price-input input\" :class=\"{ error: !valid, disabled }\">\n        <!-- \n            We use type = text here because the specs of number inputs ensure that we can't get \n            the raw string modelValue, but we need this for our placeholder logic.\n            Also inputmode is more specific on mobile devices. \n            Only downside is that we lose the stepper input on desktop.\n        -->\n        <input\n            ref=\"input\"\n            v-model=\"valueString\"\n            type=\"text\"\n            inputmode=\"decimal\"\n            step=\"any\"\n            :disabled=\"disabled\"\n            @blur=\"clean\"\n            @keydown.up.prevent=\"step(100)\"\n            @keydown.down.prevent=\"step(-100)\"\n        >\n        <div v-if=\"!valid\">\n            <span>{{ valueString }}</span>\n        </div>\n        <div v-else-if=\"valueString !== ''\">\n            <span>{{ valueString }}</span> {{ currency }}\n        </div>\n        <div v-else class=\"placeholder\">{{ placeholder }}</div>\n    </label>\n</template>\n\n<script lang=\"ts\">\nimport { Component, Prop, VueComponent, Watch } from \"@simonbackx/vue-app-navigation/classes\";\n\n@Component({\n    emits: {\n        'update:modelValue': (_value: number | null) => true\n    }\n})\nexport default class PriceInput extends VueComponent {\n    /** Price in cents */\n    @Prop({ default: 0 })\n        min!: number | null\n\n    /** Price in cents */\n    @Prop({ default: null })\n        max!: number | null\n\n    valueString = \"40\";\n    valid = true;\n\n    /** Price in cents */\n    @Prop({ default: null })\n        modelValue!: number | null\n\n    currency = \"euro\";\n\n    @Prop({ default: \"\" })\n        placeholder!: string\n\n    @Prop({ default: true })\n        required!: boolean\n\n    @Prop({ default: false })\n        disabled!: boolean\n\n    @Watch('modelValue')\n    onRealValueChanged(val: number | null, old: number | null) {\n        if (old === val) {\n            return\n        }\n        const {value: currentValue} = this.stringToValue(this.valueString)\n\n        if (currentValue === val) {\n            return\n        }\n\n        if (val === null)  {\n            if (this.required) {\n                this.internalValue = this.constrain(this.modelValue ?? this.min ?? 0);\n            }\n            this.clean();\n            return;\n        }\n\n        this.internalValue = this.constrain(val);\n        this.clean();\n    }\n\n    get internalValue() {\n        return this.modelValue\n    }\n\n    set internalValue(val: number | null) {\n        if(val === this.modelValue) {\n            return;\n        }\n        this.$emit('update:modelValue', val)\n    }\n\n    mounted() {\n        this.clean()\n    }\n\n    stringToValue(str: string) {\n        // We need the modelValue string here! Vue does some converting to numbers automatically\n        // but for our placeholder system we need exactly the same string\n        if (str === \"\") {\n            if (this.required) {\n                return {\n                    value: Math.max(0, this.min ?? 0),\n                    valid: true\n                }\n            } else {\n                return {\n                    value: null,\n                    valid: true\n                }\n            }\n        } else {\n            if (!str.includes(\".\")) {\n                // We do this for all locales since some browsers report the language locale instead of the formatting locale\n                str = str.replace(\",\", \".\");\n            }\n            const v = parseFloat(str);\n            if (isNaN(v)) {\n                return {\n                    value: this.min ?? 0,\n                    valid: false\n                }\n            } else {\n                // Remove extra decimals\n                return {\n                    value: this.constrain(Math.round(v * 100)),\n                    valid: true\n                }\n            }\n        }\n    }\n\n    @Watch(\"valueString\")\n    onValueChanged(value: string, _oldValue: string) {\n        const {valid, value: newValue} = this.stringToValue(value);\n        this.valid = valid;\n        this.internalValue = newValue;\n    }\n\n    /// Returns the decimal separator of the system. Might be wrong if the system has a region set different from the language with an unknown combination.\n    whatDecimalSeparator(): string {\n        const n = 1.1;\n        const str = n.toLocaleString().substring(1, 2);\n        return str;\n    }\n\n    // Restore invalid input, make the input value again\n    // And set valueString\n    clean() {\n        if (!this.valid) {\n            return;\n        }\n\n        const value = this.internalValue\n\n        if (value === null) {\n            this.valueString = \"\"\n            return\n        }\n\n        // Check if has decimals\n        const float = value / 100\n        const decimals = float % 1;\n        const abs = Math.abs(float);\n\n        if (decimals !== 0) {\n            // Include decimals\n            this.valueString =\n                (float < 0 ? \"-\" : \"\") +\n                Math.floor(abs) +\n                this.whatDecimalSeparator() +\n                (\"\"+Math.round(Math.abs(decimals) * 100)).padStart(2, \"0\");\n        } else {\n            // Hide decimals\n            this.valueString = float + \"\";\n        }\n    }\n\n    // Limit value to bounds\n    constrain(value: number): number {\n        if (this.min !== null && value < this.min) {\n            value = this.min;\n        } else if (this.max !== null && value > this.max) {\n            value = this.max;\n        }\n        return value\n    }\n\n    step(add: number) {\n        if (!this.valid) {\n            return;\n        }\n        this.internalValue = this.constrain((this.modelValue ?? this.min ?? 0) + add);\n        this.$nextTick(() => {\n            this.clean();\n        })\n    }\n}\n</script>\n\n<!-- Add \"scoped\" attribute to limit CSS to this component only -->\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n\n.price-input {\n    position: relative;\n\n    & > div {\n        pointer-events: none;\n        user-select: none;\n        white-space: nowrap;\n\n        span {\n            white-space: pre;\n        }\n\n        &.placeholder {\n            opacity: 0.5;\n        }\n    }\n\n    & > input {\n        position: absolute;\n        left: 0;\n        right: 0;\n        top: 0;\n        bottom: 0;\n        opacity: 0;\n        width: 100%;\n        box-sizing: border-box;\n        padding: 5px 15px;\n        height:  calc(#{$input-height} - 2 * #{$border-width});\n        line-height: calc(#{$input-height} - 10px - 2 * #{$border-width});\n\n        &:focus {\n            opacity: 1;\n\n            & + div {\n                opacity: 0.5;\n\n                span {\n                    visibility: hidden;\n                }\n            }\n        }\n    }\n}\n</style>\n","<template>\n    <STErrorsInput :error-fields=\"errorFields\" :error-box=\"errorBox\" class=\"st-input-box\" :class=\"{indent}\">\n        <h4 :style=\"{display: title ? 'flex' : 'none'}\">\n            <label>{{ title }}</label>\n            <div class=\"right\">\n                <slot name=\"right\" />\n            </div>\n        </h4>\n        <slot />\n    </STErrorsInput>\n</template>\n\n\n<script lang=\"ts\">\nimport { Component, Prop, VueComponent } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport { ErrorBox } from '../errors/ErrorBox';\nimport STErrorsInput from '../errors/STErrorsInput.vue';\n\n@Component({\n    components: {\n        STErrorsInput\n    }\n})\nexport default class STInputBox extends VueComponent {\n    @Prop({ default: \"\"}) errorFields: string;\n    @Prop({ default: null }) errorBox: ErrorBox | null;\n\n    @Prop({ default: false})\n    indent!: boolean\n\n    @Prop({ default: \"\"})\n    title!: string\n}\n</script>\n\n\n<style lang=\"scss\">\n@use '@stamhoofd/scss/base/text-styles.scss';\n\n.st-input-box {\n    padding: 10px 0;\n    display: block;\n    max-width: 340px;\n\n    @media (max-width: 450px) {\n        max-width: none;\n    }\n\n    & + .style-description-small, & + .style-description {\n        padding-bottom: 10px;\n    }\n\n    &.indent {\n        padding-left: 35px;\n\n        @media (max-width: 450px) {\n            padding-left: 0;\n        }\n    }\n\n    &.custom-bottom-box {\n        padding-bottom: 0;\n    }\n\n    &.no-padding {\n        // Keep 5px padding at bottom to compensate height of label\n        padding: 0 0 5px 0;\n    }\n\n    > h4 {\n        margin: 0;\n        @extend .style-label;\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        height: 24px;\n\n        > label {\n            flex-grow: 1; // fix safari newline glitch\n            min-width: 0;\n            overflow: hidden;\n            white-space: nowrap;\n            text-overflow: ellipsis;\n            align-self: flex-start;\n        }\n\n        > .right {\n            margin-left: auto;\n            flex-shrink: 0;\n            align-self: flex-end;\n            height: 24px;\n        }\n\n        ~ * {\n            margin-top: 8px;\n\n            &:last-child {\n                margin-top: 0; // error box\n            }\n        }\n\n        + * {\n            margin-top: 0;\n        }\n    }\n\n    &.max {\n        max-width: none;\n    }\n}\n</style>\n","<template>\n    <STInputBox :title=\"title\" error-fields=\"time\" :error-box=\"errorBox\">\n        <input v-model=\"timeRaw\" class=\"input\" type=\"time\" :class=\"{ error: !valid }\" :placeholder=\"placeholder\" :autocomplete=\"autocomplete\" :disabled=\"disabled\" @change=\"validate\">\n    </STInputBox>\n</template>\n\n<script lang=\"ts\">\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { Component, Prop, VueComponent, Watch } from \"@simonbackx/vue-app-navigation/classes\";\nimport { Formatter } from '@stamhoofd/utility';\n\nimport { ErrorBox } from \"../errors/ErrorBox\";\nimport { Validator } from \"../errors/Validator\";\nimport STInputBox from \"./STInputBox.vue\";\n@Component({\n    components: {\n        STInputBox\n    }\n})\nexport default class TimeMinutesInput extends VueComponent {\n    @Prop({ default: \"\" }) \n        title: string;\n\n    @Prop({ default: null }) \n        validator: Validator | null\n    \n\n    timeRaw = \"\";\n    valid = true;\n\n    @Prop({ default: null })\n        modelValue!: number | null\n\n    @Prop({ default: true })\n        required!: boolean\n\n    @Prop({ default: false })\n        disabled!: boolean\n\n    @Prop({ default: \"\" })\n        placeholder!: string\n\n    @Prop({ default: \"\" })\n        autocomplete!: string\n\n    errorBox: ErrorBox | null = null\n\n    @Watch('modelValue')\n    onValueChanged(val: number | null) {\n        if (val === null) {\n            return\n        }\n        this.timeRaw = Formatter.minutesPadded(val)\n    }\n\n    mounted() {\n        if (this.validator) {\n            this.validator.addValidation(this, () => {\n                return this.validate()\n            })\n        }\n        if (this.modelValue) {\n            this.timeRaw = Formatter.minutesPadded(this.modelValue)\n        } else {\n            this.timeRaw = \"\"\n        }\n\n    }\n\n    unmounted() {\n        if (this.validator) {\n            this.validator.removeValidation(this)\n        }\n    }\n\n    async validate() {\n        this.timeRaw = this.timeRaw.trim().toLowerCase()\n\n        if (!this.required && this.timeRaw.length === 0) {\n            this.errorBox = null\n\n            if (this.modelValue !== null) {\n                this.$emit('update:modelValue', null)\n            }\n            return true\n        }\n\n        const regex = /^([0-9]{1,2}:)?[0-9]{1,2}$/;\n        \n        if (!regex.test(this.timeRaw)) {\n            this.errorBox = new ErrorBox(new SimpleError({\n                \"code\": \"invalid_field\",\n                \"message\": \"Ongeldig tijdstip. Voer in zoals bv. '12:30'\",\n                \"field\": \"time\"\n            }))\n            if (this.modelValue !== null) {\n                this.$emit('update:modelValue', null)\n            }\n            return false\n\n        } else {\n            const split = this.timeRaw.split(\":\")\n            let hours = parseInt(split[0])\n            let minutes = parseInt(split[1] ?? \"0\")\n\n            if (isNaN(hours)) {\n                hours = 0;\n            }\n\n            if (isNaN(minutes)) {\n                minutes = 0;\n            }\n\n            const time = Math.max(0, Math.min(hours*60 + minutes, 24*60 - 1))\n\n            if (time !== this.modelValue) {\n                this.$emit('update:modelValue', time)\n            }\n            this.errorBox = null\n            return true\n        }\n    }\n}\n</script>\n","<template>\n    <STList>\n        <STListItem :selectable=\"true\" element-name=\"label\">\n            <template #left>\n                <Radio v-model=\"filter.mode\" :name=\"filter.id\" :value=\"UINumberFilterMode.Equals\" @change=\"onChange\" />\n            </template>\n            <p class=\"style-title-list\">\n                Gelijk aan...\n            </p>\n\n            <component :is=\"inputComponent\" v-if=\"filter.mode === UINumberFilterMode.Equals\" ref=\"input\" v-model=\"filter.value\" :min=\"null\" :max=\"null\" :required=\"true\" :floating-point=\"floatingPoint\" :stepper=\"!floatingPoint\" placeholder=\"Vul getal in\" class=\"option\" />\n        </STListItem>\n\n        <STListItem :selectable=\"true\" element-name=\"label\">\n            <template #left>\n                <Radio v-model=\"filter.mode\" :name=\"filter.id\" :value=\"UINumberFilterMode.NotEquals\" @change=\"onChange\" />\n            </template>\n            <p class=\"style-title-list\">\n                Niet gelijk aan...\n            </p>\n\n            <component :is=\"inputComponent\" v-if=\"filter.mode === UINumberFilterMode.NotEquals\" ref=\"input\" v-model=\"filter.value\" :min=\"null\" :max=\"null\" :required=\"true\" :floating-point=\"floatingPoint\" :stepper=\"!floatingPoint\" placeholder=\"Vul getal in\" class=\"option\" />\n        </STListItem>\n\n        <STListItem :selectable=\"true\" element-name=\"label\">\n            <template #left>\n                <Radio v-model=\"filter.mode\" :name=\"filter.id\" :value=\"UINumberFilterMode.GreaterThan\" @change=\"onChange\" />\n            </template>\n            <p class=\"style-title-list\">\n                Groter dan...\n            </p>\n\n            <component :is=\"inputComponent\" v-if=\"filter.mode === UINumberFilterMode.GreaterThan\" ref=\"input\" v-model=\"filter.value\" :min=\"null\" :max=\"null\" :floating-point=\"floatingPoint\" :stepper=\"!floatingPoint\" placeholder=\"Vul een getal in\" class=\"option\" />\n        </STListItem>\n\n        <STListItem :selectable=\"true\" element-name=\"label\">\n            <template #left>\n                <Radio v-model=\"filter.mode\" :name=\"filter.id\" :value=\"UINumberFilterMode.LessThan\" @change=\"onChange\" />\n            </template>\n            <p class=\"style-title-list\">\n                Kleiner dan...\n            </p>\n\n            <component :is=\"inputComponent\" v-if=\"filter.mode === UINumberFilterMode.LessThan\" ref=\"input\" v-model=\"filter.value\" :min=\"null\" :max=\"null\" :floating-point=\"floatingPoint\" :stepper=\"!floatingPoint\" placeholder=\"Vul een getal in\" class=\"option\" />\n        </STListItem>\n    </STList>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, markRaw, nextTick, ref } from 'vue';\nimport NumberInput from '../inputs/NumberInput.vue';\nimport PriceInput from '../inputs/PriceInput.vue';\nimport TimeMinutesInput from '../inputs/TimeMinutesInput.vue';\nimport { NumberFilterFormat, NumberUIFilter, UINumberFilterMode } from './NumberUIFilter';\n\nconst props = defineProps<{\n    filter: NumberUIFilter;\n}>();\n\nconst type = computed(() => props.filter.builder.type);\nconst input = ref<HTMLInputElement | null>(null);\nconst floatingPoint = computed(() => props.filter.builder.floatingPoint);\n\nasync function onChange() {\n    await nextTick();\n    input.value?.focus();\n}\n\nconst inputComponent = computed(() => {\n    switch (type.value) {\n        case NumberFilterFormat.Number: return markRaw(NumberInput);\n        case NumberFilterFormat.Currency: return markRaw(PriceInput);\n        case NumberFilterFormat.TimeMinutes: return markRaw(TimeMinutesInput);\n        default: return markRaw(NumberInput);\n    }\n});\n</script>\n","import { ComponentWithProperties } from '@simonbackx/vue-app-navigation';\nimport { StamhoofdFilter, unwrapFilterByPath, WrapperFilter } from '@stamhoofd/structures';\n\nimport { Formatter } from '@stamhoofd/utility';\nimport NumberUIFilterView from './NumberUIFilterView.vue';\nimport { UIFilter, UIFilterBuilder, UIFilterUnwrapper, UIFilterWrapper, unwrapFilterForBuilder } from './UIFilter';\n\nexport enum UINumberFilterMode {\n    GreaterThan = 'GreaterThan',\n    LessThan = 'LessThan',\n    Equals = 'Equals',\n    NotEquals = 'NotEquals',\n}\n\nexport class NumberUIFilter extends UIFilter {\n    builder!: NumberFilterBuilder;\n    value = 0;\n    mode: UINumberFilterMode = UINumberFilterMode.Equals;\n\n    constructor(data: Partial<NumberUIFilter>, options: { isInverted?: boolean } = {}) {\n        super(data, options);\n        Object.assign(this, data);\n    }\n\n    doBuild(): StamhoofdFilter {\n        switch (this.mode) {\n            case UINumberFilterMode.Equals: return {\n                [this.builder.key]: {\n                    $eq: this.value,\n                },\n            };\n\n            case UINumberFilterMode.NotEquals: return {\n                $not: {\n                    [this.builder.key]: {\n                        $eq: this.value,\n                    },\n                },\n            };\n\n            case UINumberFilterMode.GreaterThan: return {\n                [this.builder.key]: {\n                    $gt: this.value,\n                },\n            };\n\n            case UINumberFilterMode.LessThan: return {\n                [this.builder.key]: {\n                    $lt: this.value,\n                },\n            };\n        }\n    }\n\n    getComponent(): ComponentWithProperties {\n        return new ComponentWithProperties(NumberUIFilterView, {\n            filter: this,\n        });\n    }\n\n    get combinationWord(): string {\n        switch (this.mode) {\n            case UINumberFilterMode.GreaterThan: return 'is groter dan';\n            case UINumberFilterMode.LessThan: return 'is kleiner dan';\n            case UINumberFilterMode.Equals: return 'is gelijk aan';\n            case UINumberFilterMode.NotEquals: return 'is niet gelijk aan';\n        }\n    }\n\n    get styledDescription() {\n        return [\n            {\n                text: this.builder.name,\n                style: '',\n            },\n            {\n                text: ' ' + this.combinationWord + ' ',\n                style: 'gray',\n            }, {\n                text: this.valueToText,\n                style: '',\n            },\n        ];\n    }\n\n    private get valueToText() {\n        switch (this.builder.type) {\n            case NumberFilterFormat.Number: return this.value.toFixed(this.builder.floatingPoint ? 2 : 0);\n            case NumberFilterFormat.Currency: return Formatter.price(this.value);\n            case NumberFilterFormat.TimeMinutes: {\n                const dateZero = new Date(0);\n                dateZero.setMinutes(this.value);\n                return Formatter.time(dateZero, 'utc');\n            };\n        }\n    }\n}\n\nexport enum NumberFilterFormat {\n    Number,\n    Currency,\n    TimeMinutes,\n}\n\nexport class NumberFilterBuilder implements UIFilterBuilder<NumberUIFilter> {\n    key = '';\n    name = '';\n    wrapFilter?: UIFilterWrapper | null;\n    unwrapFilter?: UIFilterUnwrapper | null;\n    wrapper?: WrapperFilter;\n\n    floatingPoint = false;\n    type = NumberFilterFormat.Number;\n\n    constructor(data: { key: string; name: string; type?: NumberFilterFormat; wrapFilter?: UIFilterWrapper; unwrapFilter?: UIFilterUnwrapper; wrapper?: WrapperFilter }) {\n        this.key = data.key;\n        this.wrapFilter = data.wrapFilter;\n        this.unwrapFilter = data.unwrapFilter;\n        this.name = data.name;\n        this.wrapper = data.wrapper;\n        if (data.type !== undefined) {\n            this.type = data.type;\n        }\n    }\n\n    fromFilter(filter: StamhoofdFilter): UIFilter | null {\n        const { markerValue: unwrapped, isInverted } = unwrapFilterForBuilder(this, filter);\n        if (unwrapped === null || unwrapped === undefined) {\n            return null;\n        }\n        if (!(typeof unwrapped === 'object')) {\n            return null;\n        }\n\n        const equals = unwrapFilterByPath(unwrapped, [this.key, '$eq']);\n\n        if (typeof equals === 'number') {\n            return new NumberUIFilter({\n                builder: this,\n                value: equals,\n                mode: UINumberFilterMode.Equals,\n            }, { isInverted });\n        }\n\n        const notEquals = unwrapFilterByPath(unwrapped, ['$not', this.key, '$eq']);\n\n        if (typeof notEquals === 'number') {\n            return new NumberUIFilter({\n                builder: this,\n                value: notEquals,\n                mode: UINumberFilterMode.NotEquals,\n            }, { isInverted });\n        }\n\n        const lessThan = unwrapFilterByPath(unwrapped, [this.key, '$lt']);\n\n        if (typeof lessThan === 'number') {\n            return new NumberUIFilter({\n                builder: this,\n                value: lessThan,\n                mode: UINumberFilterMode.LessThan,\n            }, { isInverted });\n        }\n\n        const greaterThan = unwrapFilterByPath(unwrapped, [this.key, '$gt']);\n\n        if (typeof greaterThan === 'number') {\n            return new NumberUIFilter({\n                builder: this,\n                value: greaterThan,\n                mode: UINumberFilterMode.GreaterThan,\n            }, { isInverted });\n        }\n\n        return null;\n    }\n\n    create(options: { isInverted?: boolean } = {}): NumberUIFilter {\n        return new NumberUIFilter({\n            builder: this,\n            value: 0,\n        }, options);\n    }\n}\n","<template>\n    <STList>\n        <STListItem :selectable=\"true\" element-name=\"label\" @click=\"onChange\">\n            <template #left>\n                <Radio v-model=\"filter.mode\" :name=\"filter.id\" :value=\"StringFilterMode.Equals\" @change=\"onChange\" />\n            </template>\n            <p class=\"style-title-list\">\n                Is gelijk aan...\n            </p>\n            <input v-if=\"filter.mode === StringFilterMode.Equals\" ref=\"input\" v-model=\"filter.value\" placeholder=\"Vul tekst in\" class=\"input option\">\n        </STListItem>\n\n        <STListItem :selectable=\"true\" element-name=\"label\" @click=\"onChange\">\n            <template #left>\n                <Radio v-model=\"filter.mode\" :name=\"filter.id\" :value=\"StringFilterMode.NotEquals\" @change=\"onChange\" />\n            </template>\n            <p class=\"style-title-list\">\n                Is niet gelijk aan...\n            </p>\n            <input v-if=\"filter.mode === StringFilterMode.NotEquals\" ref=\"input\" v-model=\"filter.value\" placeholder=\"Vul tekst in\" class=\"input option\">\n        </STListItem>\n\n        <STListItem :selectable=\"true\" element-name=\"label\" @click=\"onChange\">\n            <template #left>\n                <Radio v-model=\"filter.mode\" :name=\"filter.id\" :value=\"StringFilterMode.Contains\" @change=\"onChange\" />\n            </template>\n            <p class=\"style-title-list\">\n                Bevat...\n            </p>\n            <input v-if=\"filter.mode === StringFilterMode.Contains\" ref=\"input\" v-model=\"filter.value\" placeholder=\"Vul tekst in\" class=\"input option\">\n        </STListItem>\n\n        <STListItem :selectable=\"true\" element-name=\"label\" @click=\"onChange\">\n            <template #left>\n                <Radio v-model=\"filter.mode\" :name=\"filter.id\" :value=\"StringFilterMode.NotContains\" @change=\"onChange\" />\n            </template>\n            <p class=\"style-title-list\">\n                Bevat niet...\n            </p>\n            <input v-if=\"filter.mode === StringFilterMode.NotContains\" ref=\"input\" v-model=\"filter.value\" placeholder=\"Vul tekst in\" class=\"input option\">\n        </STListItem>\n\n        <STListItem :selectable=\"true\" element-name=\"label\" @click=\"onChange\">\n            <template #left>\n                <Radio v-model=\"filter.mode\" :name=\"filter.id\" :value=\"StringFilterMode.Empty\" @change=\"onChange\" />\n            </template>\n            <p class=\"style-title-list\">\n                Is leeg\n            </p>\n        </STListItem>\n\n        <STListItem :selectable=\"true\" element-name=\"label\" @click=\"onChange\">\n            <template #left>\n                <Radio v-model=\"filter.mode\" :name=\"filter.id\" :value=\"StringFilterMode.NotEmpty\" @change=\"onChange\" />\n            </template>\n            <p class=\"style-title-list\">\n                Is niet leeg\n            </p>\n        </STListItem>\n    </STList>\n</template>\n\n\n<script lang=\"ts\">\nimport { NavigationMixin } from \"@simonbackx/vue-app-navigation\";\nimport { Component, Mixins, Prop } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport Radio from \"../inputs/Radio.vue\";\nimport STList from \"../layout/STList.vue\";\nimport STListItem from \"../layout/STListItem.vue\";\nimport { StringFilterMode, StringUIFilter } from './StringUIFilter';\n\n@Component({\n    components: {\n        STListItem,\n        STList,\n        Radio\n    }\n})\nexport default class StringUIFilterView extends Mixins(NavigationMixin) {\n    @Prop({ required: true }) \n        filter: StringUIFilter\n\n    get StringFilterMode() {\n        return StringFilterMode\n    }\n\n    async onChange() {\n        await this.$nextTick();\n        (this.$refs[\"input\"] as any).focus()\n    }\n\n}\n</script>\n","import { ComponentWithProperties } from '@simonbackx/vue-app-navigation';\nimport { FilterWrapperMarker, StamhoofdFilter, unwrapFilter, unwrapFilterByPath, WrapperFilter } from '@stamhoofd/structures';\n\nimport StringUIFilterView from './StringUIFilterView.vue';\nimport { StyledDescriptionChoice, UIFilter, UIFilterBuilder, UIFilterUnwrapper, UIFilterWrapper, unwrapFilterForBuilder } from './UIFilter';\n\nexport enum StringFilterMode {\n    Contains = 'Contains',\n    Equals = 'Equals',\n    NotContains = 'NotContains',\n    NotEquals = 'NotEquals',\n    NotEmpty = 'NotEmpty',\n    Empty = 'Empty',\n}\n\nexport class StringUIFilter extends UIFilter {\n    builder!: StringFilterBuilder;\n    value = '';\n    mode: StringFilterMode = StringFilterMode.Equals;\n\n    constructor(data: Partial<StringUIFilter>, options: { isInverted?: boolean } = {}) {\n        super(data, options);\n        Object.assign(this, data);\n    }\n\n    doBuild(): StamhoofdFilter {\n        switch (this.mode) {\n            case StringFilterMode.Contains: return {\n                [this.builder.key]: {\n                    $contains: this.value,\n                },\n            };\n\n            case StringFilterMode.NotContains: return {\n                $not: {\n                    [this.builder.key]: {\n                        $contains: this.value,\n                    },\n                },\n            };\n\n            case StringFilterMode.Equals: return {\n                [this.builder.key]: {\n                    $eq: this.value,\n                },\n            };\n\n            case StringFilterMode.NotEquals: return {\n                $not: {\n                    [this.builder.key]: {\n                        $eq: this.value,\n                    },\n                },\n            };\n\n            case StringFilterMode.Empty: return {\n                $or: [\n                    {\n                        [this.builder.key]: {\n                            $eq: '',\n                        },\n                    },\n                    {\n                        [this.builder.key]: {\n                            $eq: null,\n                        },\n                    },\n                ],\n            };\n\n            case StringFilterMode.NotEmpty: return {\n                $not: {\n                    $or: [\n                        {\n                            [this.builder.key]: {\n                                $eq: '',\n                            },\n                        },\n                        {\n                            [this.builder.key]: {\n                                $eq: null,\n                            },\n                        },\n                    ],\n                },\n            };\n        }\n    }\n\n    flatten() {\n        if (this.mode === StringFilterMode.Equals && this.value === '') {\n            this.mode = StringFilterMode.Empty;\n        }\n        if (this.mode === StringFilterMode.NotEquals && this.value === '') {\n            this.mode = StringFilterMode.NotEmpty;\n        }\n\n        return super.flatten();\n    }\n\n    getComponent(): ComponentWithProperties {\n        return new ComponentWithProperties(StringUIFilterView, {\n            filter: this,\n        });\n    }\n\n    get combinationWord(): string {\n        return this.createCominationWord(this.mode);\n    }\n\n    get ignoreValue(): boolean {\n        switch (this.mode) {\n            case StringFilterMode.Empty: return true;\n            case StringFilterMode.NotEmpty: return true;\n        }\n        return false;\n    }\n\n    get styledDescription() {\n        const choices: StyledDescriptionChoice[] = Object.values(StringFilterMode)\n            .map((mode) => {\n                return {\n                    id: mode,\n                    text: this.createCominationWord(mode),\n                    action: () => this.mode = mode,\n                    isSelected: () => this.mode === mode,\n                };\n            });\n\n        if (this.ignoreValue) {\n            return [\n                {\n                    text: this.builder.name,\n                    style: '',\n                },\n                {\n                    text: ' ' + this.combinationWord,\n                    style: 'gray',\n                    choices,\n                },\n            ];\n        }\n\n        return [\n            {\n                text: this.builder.name,\n                style: '',\n            },\n            {\n                text: ' ' + this.combinationWord + ' ',\n                style: 'gray',\n                choices,\n            },\n            {\n                text: this.value,\n                style: '',\n            },\n        ];\n    }\n\n    private createCominationWord(mode: StringFilterMode) {\n        switch (mode) {\n            case StringFilterMode.Contains: return 'bevat';\n            case StringFilterMode.NotContains: return 'bevat niet';\n            case StringFilterMode.Equals: return 'is gelijk aan';\n            case StringFilterMode.NotEquals: return 'is niet gelijk aan';\n            case StringFilterMode.Empty: return 'is leeg';\n            case StringFilterMode.NotEmpty: return 'is niet leeg';\n        }\n    }\n}\n\nexport class StringFilterBuilder implements UIFilterBuilder<StringUIFilter> {\n    key = '';\n    name = '';\n    wrapFilter?: UIFilterWrapper | null;\n    unwrapFilter?: UIFilterUnwrapper | null;\n    wrapper?: WrapperFilter;\n    allowCreation?: boolean;\n\n    constructor(data: { key: string; name: string; wrapFilter?: UIFilterWrapper; unwrapFilter?: UIFilterUnwrapper; wrapper?: WrapperFilter; allowCreation?: boolean }) {\n        this.key = data.key;\n        this.wrapFilter = data.wrapFilter;\n        this.unwrapFilter = data.unwrapFilter;\n        this.wrapper = data.wrapper;\n        this.name = data.name;\n        this.allowCreation = data.allowCreation;\n    }\n\n    fromFilter(filter: StamhoofdFilter): UIFilter | null {\n        const { markerValue: unwrapped, isInverted, match } = unwrapFilterForBuilder(this, filter);\n\n        if (!match || !unwrapped) {\n            return null;\n        }\n\n        const direcltyEqual = unwrapFilter(unwrapped, {\n            [this.key]: FilterWrapperMarker,\n        });\n\n        if (direcltyEqual.match && typeof direcltyEqual.markerValue === 'string') {\n            return new StringUIFilter({\n                builder: this,\n                value: direcltyEqual.markerValue,\n                mode: StringFilterMode.Equals,\n            }, { isInverted });\n        }\n\n        if (typeof unwrapped === 'string') {\n            return new StringUIFilter({\n                builder: this,\n                value: unwrapped,\n                mode: StringFilterMode.Equals,\n            }, { isInverted });\n        }\n\n        if (!(typeof unwrapped === 'object')) {\n            return null;\n        }\n\n        const contains = unwrapFilterByPath(unwrapped, [this.key, '$contains']);\n\n        if (contains && typeof contains === 'string') {\n            return new StringUIFilter({\n                builder: this,\n                value: contains,\n                mode: StringFilterMode.Contains,\n            }, { isInverted });\n        }\n\n        const notContains = unwrapFilterByPath(unwrapped, ['$not', this.key, '$contains']);\n\n        if (notContains && typeof notContains === 'string') {\n            return new StringUIFilter({\n                builder: this,\n                value: notContains,\n                mode: StringFilterMode.NotContains,\n            }, { isInverted });\n        }\n\n        const equals = unwrapFilterByPath(unwrapped, [this.key, '$eq']);\n\n        if (equals && typeof equals === 'string') {\n            return new StringUIFilter({\n                builder: this,\n                value: equals,\n                mode: StringFilterMode.Equals,\n            }, { isInverted });\n        }\n\n        const notEquals = unwrapFilterByPath(unwrapped, ['$not', this.key, '$eq']);\n\n        if (notEquals && typeof notEquals === 'string') {\n            return new StringUIFilter({\n                builder: this,\n                value: notEquals,\n                mode: StringFilterMode.NotEquals,\n            }, { isInverted });\n        }\n\n        const empty = unwrapFilterByPath(unwrapped, ['$or', 0, this.key, '$eq']);\n\n        if (empty === '') {\n            return new StringUIFilter({\n                builder: this,\n                value: '',\n                mode: StringFilterMode.Empty,\n            }, { isInverted });\n        }\n\n        const notEmpty = unwrapFilterByPath(unwrapped, ['$not', '$or', 0, this.key, '$eq']);\n\n        if (notEmpty === '') {\n            return new StringUIFilter({\n                builder: this,\n                value: '',\n                mode: StringFilterMode.NotEmpty,\n            }, { isInverted });\n        }\n\n        return null;\n    }\n\n    create(options: { isInverted?: boolean } = {}): StringUIFilter {\n        return new StringUIFilter({\n            builder: this,\n            value: '',\n        }, options);\n    }\n}\n","import { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { usePlatformManager, useRequestOwner } from '@stamhoofd/networking';\nimport { AuditLogType, CheckoutMethodType, CheckoutMethodTypeHelper, DocumentStatus, DocumentStatusHelper, EventNotificationStatus, EventNotificationStatusHelper, EventNotificationType, FilterWrapperMarker, getAuditLogTypeName, Group, LoadedPermissions, MemberResponsibility, OrderStatus, OrderStatusHelper, Organization, OrganizationRecordsConfiguration, PaymentMethod, PaymentMethodHelper, PaymentStatus, PaymentStatusHelper, Platform, RecordCategory, RecordType, SetupStepType, StamhoofdCompareValue, StamhoofdFilter, unwrapFilter, User, WebshopPreview } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed, ref } from 'vue';\nimport { Gender } from '../../../../../shared/structures/esm/dist/src/members/Gender';\nimport { AppType } from '../context';\nimport { useFinancialSupportSettings } from '../groups';\nimport { useAuth, useContext, useOrganization, usePlatform, useUser } from '../hooks';\nimport { DateFilterBuilder } from './DateUIFilter';\nimport { GroupUIFilterBuilder } from './GroupUIFilter';\nimport { MultipleChoiceFilterBuilder, MultipleChoiceUIFilterMode, MultipleChoiceUIFilterOption } from './MultipleChoiceUIFilter';\nimport { NumberFilterBuilder, NumberFilterFormat } from './NumberUIFilter';\nimport { StringFilterBuilder } from './StringUIFilter';\nimport { UIFilter, UIFilterBuilder, UIFilterBuilders } from './UIFilter';\n\nexport const paymentsUIFilterBuilders: UIFilterBuilders = [\n    new MultipleChoiceFilterBuilder({\n        name: 'Betaalmethode',\n        options: Object.values(PaymentMethod).map((method) => {\n            return new MultipleChoiceUIFilterOption(PaymentMethodHelper.getNameCapitalized(method), method);\n        }),\n        wrapper: {\n            method: {\n                $in: FilterWrapperMarker,\n            },\n        },\n    }),\n\n    new MultipleChoiceFilterBuilder({\n        name: 'Status',\n        options: Object.values(PaymentStatus).map((method) => {\n            return new MultipleChoiceUIFilterOption(PaymentStatusHelper.getNameCapitalized(method), method);\n        }),\n        wrapper: {\n            status: {\n                $in: FilterWrapperMarker,\n            },\n        },\n    }),\n];\n\n// Recursive: self referencing groups\npaymentsUIFilterBuilders.unshift(\n    new GroupUIFilterBuilder({\n        builders: paymentsUIFilterBuilders,\n    }),\n);\n\n// This one should match memberWithRegistrationsBlobInMemoryFilterCompilers\nexport const memberWithRegistrationsBlobUIFilterBuilders: UIFilterBuilders = [\n    new NumberFilterBuilder({\n        name: 'Leeftijd',\n        key: 'age',\n    }),\n    new DateFilterBuilder({\n        name: 'Geboortedatum',\n        key: 'birthDay',\n    }),\n    new MultipleChoiceFilterBuilder({\n        name: 'Gender',\n        options: [\n            new MultipleChoiceUIFilterOption('Vrouw', Gender.Female),\n            new MultipleChoiceUIFilterOption('Man', Gender.Male),\n            new MultipleChoiceUIFilterOption('Andere', Gender.Other),\n        ],\n        wrapper: {\n            gender: {\n                $in: FilterWrapperMarker,\n            },\n        },\n    }),\n];\n\n// Recursive: self referencing groups\nmemberWithRegistrationsBlobUIFilterBuilders.unshift(\n    new GroupUIFilterBuilder({\n        builders: memberWithRegistrationsBlobUIFilterBuilders,\n    }),\n);\n\nexport function useMemberWithRegistrationsBlobFilterBuilders() {\n    return (recordConfiguration: OrganizationRecordsConfiguration) => {\n        const all: UIFilterBuilders = [];\n\n        if (recordConfiguration.birthDay) {\n            all.push(new DateFilterBuilder({\n                name: 'Geboortedatum',\n                key: 'birthDay',\n            }));\n\n            all.push(new NumberFilterBuilder({\n                name: 'Leeftijd',\n                key: 'age',\n            }));\n        }\n\n        if (recordConfiguration.gender) {\n            all.push(new MultipleChoiceFilterBuilder({\n                name: 'Gender',\n                options: [\n                    new MultipleChoiceUIFilterOption('Vrouw', Gender.Female),\n                    new MultipleChoiceUIFilterOption('Man', Gender.Male),\n                    new MultipleChoiceUIFilterOption('Andere', Gender.Other),\n                ],\n                wrapper: {\n                    gender: {\n                        $in: FilterWrapperMarker,\n                    },\n                },\n            }));\n        }\n\n        // Add record categories\n        all.push(...getFilterBuildersForRecordCategories(recordConfiguration.recordCategories));\n\n        // Recursive: self referencing groups\n        all.unshift(\n            new GroupUIFilterBuilder({\n                builders: all,\n            }),\n        );\n\n        return all;\n    };\n}\n\nexport function usePlatformMemberFilterBuilders() {\n    // the platform member passes all filters directly to the memberWithRegistrationsBlob\n    return useMemberWithRegistrationsBlobFilterBuilders();\n}\n\nexport function useRegisterItemFilterBuilders() {\n    return (group: Group) => {\n        const all: UIFilterBuilders = [\n            new NumberFilterBuilder({\n                name: 'Leeftijd',\n                key: 'age',\n                wrapper: {\n                    member: FilterWrapperMarker,\n                },\n            }),\n            new DateFilterBuilder({\n                name: 'Geboortedatum',\n                key: 'birthDay',\n                wrapper: {\n                    member: FilterWrapperMarker,\n                },\n            }),\n            new MultipleChoiceFilterBuilder({\n                name: 'Gender',\n                options: [\n                    new MultipleChoiceUIFilterOption('Vrouw', Gender.Female),\n                    new MultipleChoiceUIFilterOption('Man', Gender.Male),\n                    new MultipleChoiceUIFilterOption('Andere', Gender.Other),\n                ],\n                wrapper: {\n                    member: {\n                        gender: {\n                            $in: FilterWrapperMarker,\n                        },\n                    },\n                },\n            }),\n        ];\n\n        // Add price filter\n        all.push(\n            new MultipleChoiceFilterBuilder({\n                name: 'Tarief',\n                options: [\n                    ...group.settings.prices.map((price) => {\n                        return new MultipleChoiceUIFilterOption(price.name, price.id);\n                    }),\n                ],\n                allowCreation: group.settings.prices.length > 1,\n                wrapper: {\n                    groupPrice: {\n                        id: {\n                            $in: FilterWrapperMarker,\n                        },\n                    },\n                },\n            }),\n        );\n\n        // Option filter\n        for (const menu of group.settings.optionMenus) {\n            all.push(\n                new MultipleChoiceFilterBuilder({\n                    name: menu.name,\n                    options: [\n                        ...menu.options.map((option) => {\n                            return new MultipleChoiceUIFilterOption(option.name, option.id);\n                        }),\n                    ],\n                    wrapper: {\n                        options: {\n                            $elemMatch: {\n                                optionMenu: {\n                                    id: menu.id,\n                                },\n                                option: {\n                                    id: {\n                                        $in: FilterWrapperMarker,\n                                    },\n                                },\n                            },\n                        },\n                    },\n                }),\n            );\n        }\n\n        // Add record categories\n        all.push(...getFilterBuildersForRecordCategories(group.settings.recordCategories));\n\n        // Recursive: self referencing groups\n        all.unshift(\n            new GroupUIFilterBuilder({\n                builders: all,\n            }),\n        );\n\n        return all;\n    };\n}\n\nexport function useAdvancedRegistrationsUIFilterBuilders() {\n    const $platform = usePlatform();\n    const $user = useUser();\n    const $t = useTranslate();\n    const manager = usePlatformManager();\n    const owner = useRequestOwner();\n    const loading = ref(true);\n\n    manager.value.loadPeriods(false, true, owner).then(() => {\n        loading.value = false;\n    }).catch((e) => {\n        console.error('Failed to load periods in useAdvancedRegistrationsUIFilterBuilders', e);\n    });\n\n    return {\n        loading,\n        filterBuilders: computed(() => {\n            const platform = $platform.value;\n            const user = $user.value;\n            const hasPlatformPermissions = (user?.permissions?.platform !== null);\n\n            const all = [];\n            all.push(\n                new StringFilterBuilder({\n                    name: $t('2f2899e5-4c62-4452-97d2-97f4fd670e86'),\n                    key: 'organizationId',\n                    allowCreation: false,\n                    wrapper: FilterWrapperMarker,\n                }),\n            );\n\n            all.push(\n                new MultipleChoiceFilterBuilder({\n                    name: $t('322dd34f-a4ec-4065-be53-040725915e20'),\n                    options: (platform.periods ?? []).map((period) => {\n                        return new MultipleChoiceUIFilterOption(period.nameShort, period.id);\n                    }),\n                    allowCreation: hasPlatformPermissions,\n                    wrapper: {\n                        periodId: { $in: FilterWrapperMarker },\n                    },\n                    additionalUnwrappers: [\n                        {\n                            periodId: FilterWrapperMarker,\n                        },\n                    ],\n                }),\n            );\n\n            all.push(\n                new StringFilterBuilder({\n                    name: $t('05723781-9357-41b2-9fb8-cb4f80dde7f9'),\n                    key: 'uri',\n                    allowCreation: hasPlatformPermissions,\n                    wrapper: {\n                        organization: FilterWrapperMarker,\n                    },\n                }),\n            );\n\n            all.push(\n                new StringFilterBuilder({\n                    name: $t('47754708-6f27-4afd-b9fe-600a209cb980'),\n                    key: 'name',\n                    allowCreation: hasPlatformPermissions,\n                    wrapper: {\n                        organization: FilterWrapperMarker,\n                    },\n                }),\n            );\n\n            all.push(\n                new MultipleChoiceFilterBuilder({\n                    name: $t('ec2de613-f06f-4d9a-888a-40f98b6b3727'),\n                    multipleChoiceConfiguration: {\n                        isSubjectPlural: true,\n                    },\n                    options: platform.config.tags.map((tag) => {\n                        return new MultipleChoiceUIFilterOption(tag.name, tag.id);\n                    }),\n                    allowCreation: hasPlatformPermissions,\n                    wrapper: {\n                        organization: {\n                            tags: {\n                                $in: FilterWrapperMarker,\n                            },\n                        },\n                    },\n                }),\n            );\n\n            all.push(\n                new MultipleChoiceFilterBuilder({\n                    name: $t('6705ae0e-8239-4bc0-895d-10128cb5c6c4'),\n                    options: platform.config.defaultAgeGroups.map((group) => {\n                        return new MultipleChoiceUIFilterOption(group.name, group.id);\n                    }),\n                    wrapper: {\n                        group: {\n                            defaultAgeGroupId: {\n                                $in: FilterWrapperMarker,\n                            },\n                        },\n                    },\n                }),\n            );\n\n            all.push(\n                new StringFilterBuilder({\n                    name: $t('446b88a9-50f5-4c2b-a9e8-742f12034863'),\n                    key: 'name',\n                    wrapper: {\n                        group: FilterWrapperMarker,\n                    },\n                }),\n            );\n\n            all.unshift(\n                new GroupUIFilterBuilder({\n                    builders: all,\n                }),\n            );\n\n            return all;\n        }),\n    };\n}\n\nexport function useAdvancedPlatformMembershipUIFilterBuilders() {\n    const $platform = usePlatform();\n    const $user = useUser();\n    const $t = useTranslate();\n    const manager = usePlatformManager();\n    const owner = useRequestOwner();\n    const loading = ref(true);\n\n    manager.value.loadPeriods(false, true, owner).then(() => {\n        loading.value = false;\n    }).catch((e) => {\n        console.error('Failed to load periods in useAdvancedPlatformMembershipUIFilterBuilders', e);\n    });\n\n    return {\n        loading,\n        filterBuilders: computed(() => {\n            const platform = $platform.value;\n            const user = $user.value;\n            const hasPlatformPermissions = (user?.permissions?.platform !== null);\n\n            const all = [];\n            all.push(\n                new StringFilterBuilder({\n                    name: $t('2f2899e5-4c62-4452-97d2-97f4fd670e86'),\n                    key: 'organizationId',\n                    allowCreation: false,\n                    wrapper: FilterWrapperMarker,\n                }),\n            );\n\n            all.push(\n                new MultipleChoiceFilterBuilder({\n                    name: $t('322dd34f-a4ec-4065-be53-040725915e20'),\n                    options: (platform.periods ?? []).map((period) => {\n                        return new MultipleChoiceUIFilterOption(period.nameShort, period.id);\n                    }),\n                    wrapper: {\n                        periodId: { $in: FilterWrapperMarker },\n                    },\n                    additionalUnwrappers: [\n                        {\n                            periodId: FilterWrapperMarker,\n                        },\n                    ],\n                }),\n            );\n\n            all.push(\n                new DateFilterBuilder({\n                    name: $t('300d2935-b578-48cc-b58e-1c0446a68d59'),\n                    key: 'startDate',\n                }),\n            );\n\n            all.push(\n                new DateFilterBuilder({\n                    name: $t('85dcdb87-b504-43b6-8a52-c22a046eefad'),\n                    key: 'endDate',\n                }),\n            );\n\n            all.push(\n                new NumberFilterBuilder({\n                    name: $t('b4f47589-f6b4-4f9e-a83b-ad4cbb3de416'),\n                    key: 'price',\n                    type: NumberFilterFormat.Currency,\n                }),\n            );\n\n            all.push(\n                new NumberFilterBuilder({\n                    name: $t('9e6fd655-abb5-43b2-ac0e-c62409058700'),\n                    key: 'priceWithoutDiscount',\n                    type: NumberFilterFormat.Currency,\n                }),\n            );\n\n            all.push(\n                new MultipleChoiceFilterBuilder({\n                    name: $t('41b46e42-08eb-4146-b71c-d77c90f46219'),\n                    options: [\n                        new MultipleChoiceUIFilterOption($t('c5235739-b78a-4add-ab2f-515aef40073d'), true),\n                        new MultipleChoiceUIFilterOption($t('539dc5d4-c221-412b-bc33-fe28f85625c4'), false),\n                    ],\n                    wrapFilter: (f: StamhoofdFilter) => {\n                        const choices = Array.isArray(f) ? f : [f];\n\n                        if (choices.length === 2) {\n                            return null;\n                        }\n\n                        if (choices.length === 1 && choices[0] === true) {\n                            return {\n                                balanceItemId: {\n                                    $neq: null,\n                                },\n                            };\n                        }\n\n                        return {\n                            balanceItemId: null,\n                        };\n                    },\n                }),\n            );\n\n            all.push(\n                new MultipleChoiceFilterBuilder({\n                    name: $t('87d9975e-d0ac-41d4-8472-dedcfaa571cb'),\n                    options: [\n                        new MultipleChoiceUIFilterOption('Met actieve proefperiode', true),\n                        new MultipleChoiceUIFilterOption('Zonder proefperiode', false),\n                    ],\n                    wrapFilter: (f: StamhoofdFilter) => {\n                        const choices = Array.isArray(f) ? f : [f];\n\n                        if (choices.length === 2) {\n                            return null;\n                        }\n\n                        if (choices.length === 1 && choices[0] === false) {\n                            return {\n                                $or: [\n                                    {\n                                        trialUntil: {\n                                            $lte: { $: '$now' },\n                                        },\n                                    },\n                                    {\n                                        trialUntil: null,\n                                    },\n                                ],\n                            } as StamhoofdFilter;\n                        }\n\n                        return {\n                            trialUntil: {\n                                $gt: { $: '$now' },\n                            },\n                        };\n                    },\n                }),\n            );\n\n            all.push(\n                new MultipleChoiceFilterBuilder({\n                    name: $t('2f6eb4f4-cfc7-498f-9aef-e534979ea402'),\n                    description: $t('730983be-3471-4350-8c74-966480d46727'),\n                    options: [\n                        new MultipleChoiceUIFilterOption($t('2f6eb4f4-cfc7-498f-9aef-e534979ea402'), true),\n                        new MultipleChoiceUIFilterOption($t('039c2f51-c533-4262-91d6-24e4a503b003'), false),\n                    ],\n                    allowCreation: hasPlatformPermissions,\n                    wrapFilter: (f: StamhoofdFilter) => {\n                        const choices = Array.isArray(f) ? f : [f];\n\n                        if (choices.length === 2) {\n                            return null;\n                        }\n\n                        if (choices.length === 1 && choices[0] === false) {\n                            return {\n                                locked: false,\n                            } as StamhoofdFilter;\n                        }\n\n                        return {\n                            locked: true,\n                        };\n                    },\n                }),\n            );\n\n            all.push(\n                new MultipleChoiceFilterBuilder({\n                    name: $t('52b7cfdf-2f2c-4d88-8689-96a91f885654'),\n                    description: $t('227a2170-37b7-46b0-ac1e-516f603379b5'),\n                    options: [\n                        new MultipleChoiceUIFilterOption($t('48148df3-81a8-439e-a368-64355aa7da6e'), true),\n                        new MultipleChoiceUIFilterOption($t('6507f89c-5c50-4c37-943f-ec17f5831cf0'), false),\n                    ],\n                    allowCreation: hasPlatformPermissions,\n                    wrapFilter: (f: StamhoofdFilter) => {\n                        const choices = Array.isArray(f) ? f : [f];\n\n                        if (choices.length === 2) {\n                            return null;\n                        }\n\n                        if (choices.length === 1 && choices[0] === true) {\n                            return {\n                                organizationId: $platform.value.membershipOrganizationId,\n                            };\n                        }\n\n                        return {\n                            organizationId: {\n                                $neq: $platform.value.membershipOrganizationId,\n                            },\n                        };\n                    },\n                }),\n            );\n\n            all.push(\n                new MultipleChoiceFilterBuilder({\n                    name: $t('388a4417-a2df-4943-b446-d13d2445824b'),\n                    options: platform.config.membershipTypes.map((membershipType) => {\n                        return new MultipleChoiceUIFilterOption(membershipType.name, membershipType.id);\n                    }),\n                    wrapper: {\n                        membershipTypeId: {\n                            $in: FilterWrapperMarker,\n                        },\n                    },\n                }),\n            );\n\n            all.unshift(\n                new GroupUIFilterBuilder({\n                    builders: all,\n                }),\n            );\n\n            return all;\n        }),\n    };\n}\n\nexport function useAdvancedMemberWithRegistrationsBlobUIFilterBuilders() {\n    const $platform = usePlatform();\n    const $user = useUser();\n    const $t = useTranslate();\n    const { loading, filterBuilders: registrationFilters } = useAdvancedRegistrationsUIFilterBuilders();\n    const financialSupportSettings = useFinancialSupportSettings();\n    const auth = useAuth();\n    const organization = useOrganization();\n    const { loading: loadingMembershipFilters, filterBuilders: membershipFilters } = useAdvancedPlatformMembershipUIFilterBuilders();\n\n    const filterResponsibilities = (responsibilities: MemberResponsibility[]) => {\n        return responsibilities.filter((r) => {\n            if (organization.value === null) {\n                return true;\n            }\n\n            if (r.organizationTagIds !== null) {\n                return organization.value.meta.matchTags(r.organizationTagIds);\n            }\n\n            return true;\n        });\n    };\n\n    return {\n        loading: computed(() => loading.value || loadingMembershipFilters.value),\n        filterBuilders: computed(() => {\n            const platform = $platform.value;\n            const user = $user.value;\n\n            const all = [\n                ...memberWithRegistrationsBlobUIFilterBuilders.slice(1),\n            ];\n\n            if (user?.permissions?.platform !== null) {\n                all.push(\n                    new MultipleChoiceFilterBuilder({\n                        name: $t('b0cb950d-856f-4068-bf2f-9636927020f4'),\n                        multipleChoiceConfiguration: {\n                            isSubjectPlural: true,\n                        },\n                        options: filterResponsibilities(platform.config.responsibilities).map((responsibility) => {\n                            return new MultipleChoiceUIFilterOption(responsibility.name, responsibility.id);\n                        }),\n                        wrapper: {\n                            responsibilities: {\n                                $elemMatch: {\n                                    responsibilityId: {\n                                        $in: FilterWrapperMarker,\n                                    },\n                                    endDate: null,\n                                },\n                            },\n                        },\n                    }),\n                );\n\n                for (const responsibility of filterResponsibilities(platform.config.responsibilities)) {\n                    if (!responsibility.organizationBased || responsibility.defaultAgeGroupIds === null) {\n                        continue;\n                    }\n\n                    all.push(\n                        new MultipleChoiceFilterBuilder({\n                            name: responsibility.name,\n                            options: platform.config.defaultAgeGroups.filter(group => responsibility.defaultAgeGroupIds?.includes(group.id)).map((group) => {\n                                return new MultipleChoiceUIFilterOption(group.name, group.id);\n                            }),\n                            wrapper: {\n                                responsibilities: {\n                                    $elemMatch: {\n                                        responsibilityId: responsibility.id,\n                                        endDate: null,\n                                        group: {\n                                            defaultAgeGroupId: {\n                                                $in: FilterWrapperMarker,\n                                            },\n                                        },\n                                    },\n                                },\n                            },\n                        }),\n                    );\n                }\n            }\n\n            all.push(\n                new MultipleChoiceFilterBuilder({\n                    name: $t('11007b85-a7ac-48d8-9480-669831cef564'),\n                    options: [\n                        new MultipleChoiceUIFilterOption($t('6d4c31c6-c70b-4cf2-8890-b2d4507913c7'), 'Active'),\n                        new MultipleChoiceUIFilterOption($t('cb1953f4-7e4f-498d-b8d8-54a885753e23'), 'Trial'),\n                        new MultipleChoiceUIFilterOption($t('cc528c3f-aed3-4eb6-9db1-70aae5261a28'), 'Expiring'),\n                        new MultipleChoiceUIFilterOption($t('33906077-a1d8-4daa-9914-ce129538f68c'), 'Inactive'),\n                    ],\n                    wrapFilter: (f: StamhoofdFilter) => {\n                        const choices = Array.isArray(f) ? f : [f];\n\n                        if (choices.length === 4 || choices.length === 0) {\n                            return null;\n                        }\n\n                        const activeOrExpiringFilter: StamhoofdFilter = {\n                            platformMemberships: {\n                                $elemMatch: {\n                                    startDate: {\n                                        $lte: { $: '$now' },\n                                    },\n                                    endDate: {\n                                        $gt: { $: '$now' },\n                                    },\n                                },\n                            },\n                        };\n\n                        const activeOrExpiringFilterButNoTrial: StamhoofdFilter = {\n                            platformMemberships: {\n                                $elemMatch: {\n                                    startDate: {\n                                        $lte: { $: '$now' },\n                                    },\n                                    endDate: {\n                                        $gt: { $: '$now' },\n                                    },\n                                    $or: [\n                                        {\n                                            trialUntil: null,\n                                        },\n                                        {\n                                            trialUntil: {\n                                                $lte: { $: '$now' },\n                                            },\n                                        },\n                                    ],\n                                },\n                            },\n                        };\n\n                        if (choices.length === 3 && ['Active', 'Expiring', 'Trial'].every(x => choices.includes(x))) {\n                            return activeOrExpiringFilter;\n                        }\n\n                        if (choices.length === 2 && ['Active', 'Expiring'].every(x => choices.includes(x))) {\n                            return activeOrExpiringFilterButNoTrial;\n                        }\n\n                        if (choices.length === 2 && ['Active', 'Trial'].every(x => choices.includes(x))) {\n                            return {\n                                platformMemberships: {\n                                    $elemMatch: {\n                                        endDate: {\n                                            $gt: { $: '$now' },\n                                        },\n                                        startDate: {\n                                            $lte: { $: '$now' },\n                                        },\n                                        $or: [\n                                            {\n                                                expireDate: null,\n                                            },\n                                            {\n                                                expireDate: {\n                                                    $gt: { $: '$now' },\n                                                },\n                                            },\n                                        ],\n                                    },\n                                },\n                            };\n                        }\n\n                        const getFilter = (choice: StamhoofdFilter<StamhoofdCompareValue>): StamhoofdFilter => {\n                            switch (choice) {\n                                case 'Active': {\n                                    return {\n                                        platformMemberships: {\n                                            $elemMatch: {\n                                                $and: [\n                                                    {\n                                                        endDate: {\n                                                            $gt: { $: '$now' },\n                                                        },\n                                                        startDate: {\n                                                            $lte: { $: '$now' },\n                                                        },\n                                                        $or: [\n                                                            {\n                                                                expireDate: null,\n                                                            },\n                                                            {\n                                                                expireDate: {\n                                                                    $gt: { $: '$now' },\n                                                                },\n                                                            },\n                                                        ],\n                                                    },\n                                                    {\n                                                        $or: [\n                                                            {\n                                                                trialUntil: null,\n                                                            },\n                                                            {\n                                                                trialUntil: {\n                                                                    $lte: { $: '$now' },\n                                                                },\n                                                            },\n                                                        ],\n                                                    },\n                                                ],\n                                            },\n                                        },\n                                    };\n                                }\n                                case 'Trial': {\n                                    return {\n                                        platformMemberships: {\n                                            $elemMatch: {\n                                                endDate: {\n                                                    $gt: { $: '$now' },\n                                                },\n                                                startDate: {\n                                                    $lte: { $: '$now' },\n                                                },\n                                                $or: [\n                                                    {\n                                                        expireDate: null,\n                                                    },\n                                                    {\n                                                        expireDate: {\n                                                            $gt: { $: '$now' },\n                                                        },\n                                                    },\n                                                ],\n                                                trialUntil: {\n                                                    $gt: { $: '$now' },\n                                                },\n                                            },\n                                        },\n                                    };\n                                }\n                                case 'Inactive': {\n                                    return {\n                                        $not: activeOrExpiringFilter,\n                                    };\n                                }\n                                case 'Expiring': {\n                                    return {\n                                        $not: getFilter('Active'),\n                                        platformMemberships: {\n                                            $elemMatch: {\n                                                endDate: {\n                                                    $gte: { $: '$now' },\n                                                },\n                                                expireDate: {\n                                                    $lt: { $: '$now' },\n                                                },\n                                            },\n                                        },\n                                    };\n                                }\n                                default: {\n                                    return null;\n                                }\n                            }\n                        };\n\n                        const filters = choices.map(getFilter);\n\n                        if (filters.length === 1) {\n                            return filters[0];\n                        }\n\n                        return {\n                            $or: filters,\n                        };\n                    },\n                    unwrapFilter: (f: StamhoofdFilter): StamhoofdFilter | null => {\n                        const activeAndExpiring = unwrapFilter(f, {\n                            platformMemberships: {\n                                $elemMatch: {\n                                    endDate: {\n                                        $gt: { $: '$now' },\n                                    },\n                                },\n                            },\n                        });\n\n                        if (activeAndExpiring.match) {\n                            return ['Active', 'Trial', 'Expiring'];\n                        }\n\n                        const activeOrExpiring = unwrapFilter(f, {\n                            platformMemberships: {\n                                $elemMatch: {\n                                    startDate: {\n                                        $lte: { $: '$now' },\n                                    },\n                                    endDate: {\n                                        $gt: { $: '$now' },\n                                    },\n                                },\n                            },\n                        });\n\n                        if (activeOrExpiring.match) {\n                            return ['Active', 'Expiring', 'Trial'];\n                        }\n\n                        const activeOrExpiringButNoTrial = unwrapFilter(f, {\n                            platformMemberships: {\n                                $elemMatch: {\n                                    startDate: {\n                                        $lte: { $: '$now' },\n                                    },\n                                    endDate: {\n                                        $gt: { $: '$now' },\n                                    },\n                                    $or: [\n                                        {\n                                            trialUntil: null,\n                                        },\n                                        {\n                                            trialUntil: {\n                                                $lte: { $: '$now' },\n                                            },\n                                        },\n                                    ],\n                                },\n                            },\n                        });\n\n                        if (activeOrExpiringButNoTrial.match) {\n                            return ['Active', 'Expiring'];\n                        }\n\n                        const activeOrTrial = unwrapFilter(f, {\n                            platformMemberships: {\n                                $elemMatch: {\n                                    endDate: {\n                                        $gt: { $: '$now' },\n                                    },\n                                    startDate: {\n                                        $lte: { $: '$now' },\n                                    },\n                                    $or: [\n                                        {\n                                            expireDate: null,\n                                        },\n                                        {\n                                            expireDate: {\n                                                $gt: { $: '$now' },\n                                            },\n                                        },\n                                    ],\n                                },\n                            },\n                        });\n\n                        if (activeOrTrial.match) {\n                            return ['Active', 'Trial'];\n                        }\n\n                        return null;\n                    },\n                }),\n            );\n\n            all.push(\n                new MultipleChoiceFilterBuilder({\n                    name: $t('b0ed8db1-097d-4739-9407-e8aae5e1413c'),\n                    options: platform.config.membershipTypes.map((type) => {\n                        return new MultipleChoiceUIFilterOption(type.name, type.id);\n                    }),\n                    wrapper: {\n                        platformMemberships: {\n                            $elemMatch: {\n                                membershipTypeId: {\n                                    $in: FilterWrapperMarker,\n                                },\n                                startDate: {\n                                    $lte: { $: '$now' },\n                                },\n                                endDate: {\n                                    $gt: { $: '$now' },\n                                },\n                                $or: [\n                                    {\n                                        expireDate: null,\n                                    },\n                                    {\n                                        expireDate: {\n                                            $gt: { $: '$now' },\n                                        },\n                                    },\n                                ],\n                            },\n                        },\n                    },\n                }),\n            );\n\n            all.push(\n                new StringFilterBuilder({\n                    name: $t('4824fef7-9c02-4a3f-b2fd-117857a7b82c'),\n                    key: 'name',\n                    wrapper: {\n                        $or: [\n                            {\n                                'details.parents[0]': FilterWrapperMarker,\n                            },\n                            {\n                                'details.parents[1]': FilterWrapperMarker,\n                            },\n                        ],\n                    },\n                }),\n            );\n\n            all.push(\n                new StringFilterBuilder({\n                    name: $t('d8d26405-9d24-4217-af9b-5a0edee0d35f'),\n                    key: 'email',\n                }),\n            );\n\n            all.push(\n                new StringFilterBuilder({\n                    name: $t('81082354-9a9a-4a23-aa02-3273d4906652'),\n                    key: 'parentEmail',\n                }),\n            );\n\n            all.push(\n                new StringFilterBuilder({\n                    name: $t('a783e1f8-b052-4278-87c9-e00fa4590e8c'),\n                    key: 'phone',\n                }),\n            );\n\n            all.push(\n                new StringFilterBuilder({\n                    name: $t('532568c8-345e-4675-ba5e-60014bbcf9ae'),\n                    key: 'parentPhone',\n                }),\n            );\n\n            all.push(\n                new StringFilterBuilder({\n                    name: $t('f8bfc32b-5bc4-4ccc-82ed-514dffd011c2'),\n                    key: 'street',\n                    wrapper: {\n                        $or: [\n                            {\n                                'details.address': FilterWrapperMarker,\n                            },\n                            {\n                                'details.parents[*].address': FilterWrapperMarker,\n                            },\n                        ],\n                    },\n                }),\n            );\n\n            all.push(\n                new StringFilterBuilder({\n                    name: $t('99ea968b-f820-4791-96c3-bb1033603013'),\n                    key: 'number',\n                    wrapper: {\n                        $or: [\n                            {\n                                'details.address': FilterWrapperMarker,\n                            },\n                            {\n                                'details.parents[*].address': FilterWrapperMarker,\n                            },\n                        ],\n                    },\n                }),\n            );\n\n            all.push(\n                new StringFilterBuilder({\n                    name: $t('f5c908ad-c996-4dc8-acc0-dae902f13495'),\n                    key: 'city',\n                    wrapper: {\n                        $or: [\n                            {\n                                'details.address': FilterWrapperMarker,\n                            },\n                            {\n                                'details.parents[*].address': FilterWrapperMarker,\n                            },\n                        ],\n                    },\n                }),\n            );\n\n            all.push(\n                new StringFilterBuilder({\n                    name: $t('28b0f035-cb44-48b7-b60f-093f6adc26fb'),\n                    key: 'postalCode',\n                    wrapper: {\n                        $or: [\n                            {\n                                'details.address': FilterWrapperMarker,\n                            },\n                            {\n                                'details.parents[*].address': FilterWrapperMarker,\n                            },\n                        ],\n                    },\n                }),\n            );\n\n            if (financialSupportSettings.enabled) {\n                all.push(\n                    new MultipleChoiceFilterBuilder({\n                        name: financialSupportSettings.financialSupportSettings.value.title,\n                        options: [\n                            new MultipleChoiceUIFilterOption('Ingeschakeld', true),\n                            new MultipleChoiceUIFilterOption('Uitgeschakeld', false),\n                            new MultipleChoiceUIFilterOption('Onbepaald', null),\n                        ],\n                        wrapper: {\n                            'details.requiresFinancialSupport': {\n                                $in: FilterWrapperMarker,\n                            },\n                        },\n                    }),\n                );\n            }\n\n            all.push(\n                new GroupUIFilterBuilder({\n                    name: 'huidige inschrijving',\n                    description: 'Filter op leden die een actieve inschrijving heeft die aan deze voorwaarden voldoet.',\n                    builders: registrationFilters.value.filter(f => f.name !== 'Werkjaar'),\n                    wrapper: {\n                        registrations: {\n                            $elemMatch: {\n                                $and: [\n                                    FilterWrapperMarker,\n                                    {\n                                        periodId: platform.period.id,\n                                    },\n                                ],\n                            },\n                        },\n                    },\n                }),\n            );\n\n            if (auth.hasFullAccess()) {\n                all.push(\n                    new GroupUIFilterBuilder({\n                        name: $t('9bebe05c-cc6b-4f78-8704-80143df8e010'),\n                        description: $t('1316502a-5502-49ec-96fe-93e60cb94268'),\n                        builders: registrationFilters.value,\n                        wrapper: {\n                            registrations: {\n                                $elemMatch: FilterWrapperMarker,\n                            },\n                        },\n                    }),\n                );\n\n                all.push(\n                    new GroupUIFilterBuilder({\n                        name: $t('07cba8c8-a135-48e8-83c4-59313ef296d8'),\n                        description: $t('8cd6fafc-25ae-4b8d-94e6-fa9d8be0ec16'),\n                        builders: membershipFilters.value,\n                        wrapper: {\n                            platformMemberships: {\n                                $elemMatch: FilterWrapperMarker,\n                            },\n                        },\n                    }),\n                );\n            }\n\n            if (user?.permissions?.platform !== null) {\n                const responsibilitiesFilters: typeof all = [];\n\n                responsibilitiesFilters.push(\n                    new MultipleChoiceFilterBuilder({\n                        name: $t('619d07b4-4512-4ca5-933c-93203421ac54'),\n                        multipleChoiceConfiguration: {\n                            isSubjectPlural: false,\n                        },\n                        options: platform.config.responsibilities.map((responsibility) => {\n                            return new MultipleChoiceUIFilterOption(responsibility.name, responsibility.id);\n                        }),\n                        wrapper: {\n                            responsibilityId: {\n                                $in: FilterWrapperMarker,\n                            },\n                        },\n                    }),\n                );\n\n                for (const responsibility of platform.config.responsibilities) {\n                    if (!responsibility.organizationBased || responsibility.defaultAgeGroupIds === null) {\n                        continue;\n                    }\n\n                    responsibilitiesFilters.push(\n                        new MultipleChoiceFilterBuilder({\n                            name: responsibility.name,\n                            options: platform.config.defaultAgeGroups.filter(group => responsibility.defaultAgeGroupIds?.includes(group.id)).map((group) => {\n                                return new MultipleChoiceUIFilterOption(group.name, group.id);\n                            }),\n                            wrapper: {\n                                responsibilityId: responsibility.id,\n                                group: {\n                                    defaultAgeGroupId: {\n                                        $in: FilterWrapperMarker,\n                                    },\n                                },\n                            },\n                        }),\n                    );\n                }\n\n                responsibilitiesFilters.push(\n                    new DateFilterBuilder({\n                        name: $t('300d2935-b578-48cc-b58e-1c0446a68d59'),\n                        key: 'startDate',\n                    }),\n                );\n\n                responsibilitiesFilters.push(\n                    new DateFilterBuilder({\n                        name: $t('85dcdb87-b504-43b6-8a52-c22a046eefad'),\n                        key: 'endDate',\n                    }),\n                );\n\n                responsibilitiesFilters.unshift(\n                    new GroupUIFilterBuilder({\n                        builders: responsibilitiesFilters,\n                    }),\n                );\n\n                all.push(\n                    new GroupUIFilterBuilder({\n                        name: 'historische functie',\n                        description: 'Filter op leden die een functie hadden die aan deze voorwaarden voldoet.',\n                        builders: responsibilitiesFilters,\n                        wrapper: {\n                            responsibilities: {\n                                $elemMatch: FilterWrapperMarker,\n                            },\n                        },\n                    }),\n                );\n            }\n\n            all.unshift(\n                new GroupUIFilterBuilder({\n                    builders: all,\n                }),\n            );\n\n            return all;\n        }),\n    };\n}\n\n//\n// CHECKOUT\n//\n\n// This one should match memberWithRegistrationsBlobInMemoryFilterCompilers\nexport const checkoutUIFilterBuilders: UIFilterBuilders = [\n    // todo\n];\n\n// Recursive: self referencing groups\ncheckoutUIFilterBuilders.unshift(\n    new GroupUIFilterBuilder({\n        builders: checkoutUIFilterBuilders,\n    }),\n);\n\n// Cached outstanding balances\n\nexport const cachedOutstandingBalanceUIFilterBuilders: UIFilterBuilders = [\n    new NumberFilterBuilder({\n        name: 'Openstaand bedrag',\n        type: NumberFilterFormat.Currency,\n        key: 'amountOpen',\n    }),\n    new NumberFilterBuilder({\n        name: 'Bedrag in verwerking',\n        type: NumberFilterFormat.Currency,\n        key: 'amountPending',\n    }),\n    /* new MultipleChoiceFilterBuilder({\n        name: 'Type',\n        options: [\n            new MultipleChoiceUIFilterOption('Verenigingen', ReceivableBalanceType.organization),\n            new MultipleChoiceUIFilterOption('Leden', ReceivableBalanceType.member),\n            new MultipleChoiceUIFilterOption('Accounts', ReceivableBalanceType.user),\n        ],\n        wrapper: {\n            objectType: {\n                $in: FilterWrapperMarker,\n            },\n        },\n    }), */\n];\n\ncachedOutstandingBalanceUIFilterBuilders.unshift(\n    new GroupUIFilterBuilder({\n        builders: cachedOutstandingBalanceUIFilterBuilders,\n    }),\n);\n\n//\n// ORGANIZATIONS\n//\n\nconst organizationMemberUIFilterBuilders: UIFilterBuilders = [\n    new StringFilterBuilder({\n        name: 'Naam',\n        key: 'name',\n    }),\n    new StringFilterBuilder({\n        name: 'Voornaam',\n        key: 'firstName',\n    }),\n    new StringFilterBuilder({\n        name: 'Achternaam',\n        key: 'lastName',\n    }),\n    new StringFilterBuilder({\n        name: 'E-mailadres',\n        key: 'email',\n    }),\n];\n\nexport function useGetOrganizationUIFilterBuilders() {\n    const $t = useTranslate();\n    const platform = usePlatform();\n\n    const setupStepFilterNameMap: Record<SetupStepType, string> = {\n        [SetupStepType.Responsibilities]: $t('be92d7b0-92ad-42d6-b9e2-b414671ac57d'),\n        [SetupStepType.Companies]: $t('6313a021-6795-4b7e-842c-f4574e433324'),\n        [SetupStepType.Groups]: $t('b6458e9c-2ddf-4cb0-8051-fb6a220c4127'),\n        [SetupStepType.Premises]: $t('7f531562-9609-456e-a8c3-2b373cad3f29'),\n        [SetupStepType.Emails]: $t('36a44efc-4cb0-4180-8678-938cc51d3ae8'),\n        [SetupStepType.Payment]: $t('d951a3d6-58f6-4e56-a482-2b8652ddd3bf'),\n        [SetupStepType.Registrations]: $t('98a4f650-2fc9-455f-8454-dfe7a8140faa'),\n    };\n\n    const getOrganizationUIFilterBuilders = (user: User | null) => {\n        const all = [\n            new StringFilterBuilder({\n                name: 'Naam',\n                key: 'name',\n            }),\n\n            new StringFilterBuilder({\n                name: 'Gemeente',\n                key: 'city',\n            }),\n\n            new StringFilterBuilder({\n                name: 'Postcode',\n                key: 'postalCode',\n            }),\n\n            new StringFilterBuilder({\n                name: $t('5e99e2aa-a240-4894-8de3-f8f0fef20068'),\n                key: 'uri',\n            }),\n\n            new GroupUIFilterBuilder({\n                name: 'Leden',\n                description: $t('6bf80a05-84b0-47ba-ad41-66e2a106669b'),\n                builders: organizationMemberUIFilterBuilders,\n                wrapper: {\n                    members: {\n                        $elemMatch: FilterWrapperMarker,\n                    },\n                },\n            }),\n            new MultipleChoiceFilterBuilder({\n                name: 'Actief',\n                options: [\n                    new MultipleChoiceUIFilterOption('Actief', 1),\n                    new MultipleChoiceUIFilterOption('Inactief', 0),\n                ],\n                wrapper: {\n                    active: {\n                        $in: FilterWrapperMarker,\n                    },\n                },\n            })];\n\n        if (user?.permissions?.platform !== null) {\n            all.push(\n                new MultipleChoiceFilterBuilder({\n                    name: $t('ec2de613-f06f-4d9a-888a-40f98b6b3727'),\n                    multipleChoiceConfiguration: {\n                        isSubjectPlural: true,\n                    },\n                    options: platform.value.config.tags.map((tag) => {\n                        return new MultipleChoiceUIFilterOption(tag.name, tag.id);\n                    }),\n                    wrapper: {\n                        tags: {\n                            $in: FilterWrapperMarker,\n                        },\n                    },\n                }),\n            );\n\n            all.push(\n                new MultipleChoiceFilterBuilder({\n                    name: 'Voltooide vlagmomenten',\n                    multipleChoiceConfiguration: {\n                        isSubjectPlural: true,\n                        mode: MultipleChoiceUIFilterMode.And,\n                        showOptionSelectAll: true,\n                    },\n                    options: Object.entries(setupStepFilterNameMap).map(\n                        ([k, v]) =>\n                            new MultipleChoiceUIFilterOption(\n                                v,\n                                k as SetupStepType,\n                            ),\n                    ),\n                    wrapFilter: (f: StamhoofdFilter) => {\n                        const choices = Array.isArray(f) ? f : [f];\n\n                        return {\n                            setupSteps: {\n                                $elemMatch: {\n                                    periodId: {\n                                        $eq: platform.value.period.id,\n                                    },\n                                    ...Object.fromEntries(\n                                        Object.values(SetupStepType)\n                                            .filter(\n                                                x => choices.includes(x),\n                                            )\n                                            .map((setupStep) => {\n                                                return [\n                                                    setupStep,\n                                                    {\n                                                        reviewedAt: {\n                                                            $neq: null,\n                                                        },\n                                                        complete: true,\n                                                    },\n                                                ];\n                                            }),\n                                    ),\n                                },\n                            },\n                        };\n                    },\n                    unwrapFilter: (f: StamhoofdFilter): StamhoofdFilter | null => {\n                        if (typeof f !== 'object') return null;\n\n                        const elemMatch = (f as any).setupSteps?.$elemMatch;\n                        if (!elemMatch) return null;\n\n                        const periodId = elemMatch.periodId?.$eq;\n                        if (periodId !== platform.value.period.id) return null;\n\n                        const enumValues = Object.values(SetupStepType);\n                        const stringifiedValueToMatch = JSON.stringify({\n                            reviewedAt: { $neq: null },\n                            complete: true,\n                        });\n\n                        const results: SetupStepType[] = [];\n\n                        for (const [key, value] of Object.entries(elemMatch)) {\n                            if (enumValues.includes(key as SetupStepType)) {\n                                if (JSON.stringify(value) === stringifiedValueToMatch) {\n                                    results.push(key as SetupStepType);\n                                }\n                                else {\n                                    return null;\n                                }\n                            }\n                            else if (key !== 'periodId') {\n                                return null;\n                            }\n                        }\n\n                        if (results.length) {\n                            return results;\n                        }\n\n                        return null;\n                    },\n                },\n                ),\n            );\n        }\n\n        // Recursive: self referencing groups\n        all.unshift(\n            new GroupUIFilterBuilder({\n                builders: all,\n            }),\n        );\n\n        return all;\n    };\n\n    return { getOrganizationUIFilterBuilders };\n}\n\nexport function getOrganizationUIFilterBuildersForTags(platform: Platform) {\n    const $t = useTranslate();\n\n    const all: UIFilterBuilder[] = [];\n\n    const tagFilter = new MultipleChoiceFilterBuilder({\n        name: $t('ceba695c-105b-49c9-aaa4-bf716c4aec6b'),\n        multipleChoiceConfiguration: {\n            isSubjectPlural: true,\n        },\n        options: platform.config.tags.map(tag => new MultipleChoiceUIFilterOption(tag.name, tag.id)),\n        wrapper: {\n            tags: {\n                $in: FilterWrapperMarker,\n            },\n        },\n    });\n\n    all.push(tagFilter);\n\n    all.unshift(\n        new GroupUIFilterBuilder({\n            builders: all,\n        }),\n    );\n\n    return all;\n}\n\n// Events\nexport function useEventUIFilterBuilders({ platform, organizations, app }: { platform: Platform; organizations: Organization[]; app: AppType | 'auto' }) {\n    const context = useContext();\n\n    return computed(() => getEventUIFilterBuilders({ platform, organizations, app, permissions: context.value.auth.permissions }));\n}\n\nfunction getEventUIFilterBuilders({ platform, organizations, app, permissions }: { platform: Platform; organizations: Organization[]; app: AppType | 'auto'; permissions: LoadedPermissions | null | undefined }) {\n    const all: UIFilterBuilder<UIFilter>[] = [];\n\n    const organizationFilter = new MultipleChoiceFilterBuilder({\n        name: 'Lokale groep',\n        options: [\n            new MultipleChoiceUIFilterOption('Nationale activiteiten', null),\n            ...organizations.map(org => new MultipleChoiceUIFilterOption(org.name, org.id)),\n        ],\n        wrapper: {\n            organizationId: {\n                $in: FilterWrapperMarker,\n            },\n        },\n    });\n    all.push(organizationFilter);\n\n    const tagsFilter = new MultipleChoiceFilterBuilder({\n        name: 'Regio',\n        options: [\n            new MultipleChoiceUIFilterOption('Alles', null),\n            ...platform.config.tags.map(tag => new MultipleChoiceUIFilterOption(tag.name, tag.id)),\n        ],\n        wrapper: {\n            organizationTagIds: {\n                $in: FilterWrapperMarker,\n            },\n        },\n    });\n\n    all.push(tagsFilter);\n\n    const allTags = organizations.flatMap(organization => organization.meta.tags);\n\n    const defaultAgeGroupFilter = new MultipleChoiceFilterBuilder({\n        name: 'Standaard leeftijdsgroep',\n        options: [\n            new MultipleChoiceUIFilterOption('Iedereen', null),\n            ...platform.config.defaultAgeGroups.filter(defaultAgeGroup => defaultAgeGroup.isEnabledForTags(allTags)).map(g => new MultipleChoiceUIFilterOption(g.name, g.id)),\n        ],\n        wrapper: {\n            defaultAgeGroupIds: {\n                $in: FilterWrapperMarker,\n            },\n        },\n    });\n    all.push(defaultAgeGroupFilter);\n\n    const groupFilter = new MultipleChoiceFilterBuilder({\n        name: 'Inschrijvingsgroep',\n        allowCreation: organizations.length > 0,\n        options: [\n            new MultipleChoiceUIFilterOption('Iedereen', null),\n            ...organizations\n                .flatMap(organization => organization.period.getCategoryTree({ permissions }).getAllGroups().map((g) => {\n                    return new MultipleChoiceUIFilterOption((organizations.length > 1 ? (organization.name + ' - ') : '') + g.settings.name, g.id);\n                })),\n        ],\n        wrapper: {\n            groupIds: {\n                $in: FilterWrapperMarker,\n            },\n        },\n    });\n    all.push(groupFilter);\n\n    if (app !== 'registration') {\n        const typeFilter = new MultipleChoiceFilterBuilder({\n            name: 'Type',\n            options: [\n                ...platform.config.eventTypes.map(type => new MultipleChoiceUIFilterOption(type.name, type.id)),\n            ],\n            wrapper: {\n                typeId: {\n                    $in: FilterWrapperMarker,\n                },\n            },\n        });\n\n        all.push(typeFilter);\n    }\n\n    all.unshift(\n        new GroupUIFilterBuilder({\n            builders: all,\n        }),\n    );\n\n    return all;\n}\n\n// Events\nexport function useAuditLogUIFilterBuilders() {\n    const all: UIFilterBuilder<UIFilter>[] = [];\n\n    const typeFilter = new MultipleChoiceFilterBuilder({\n        name: 'Type',\n        options: [\n            ...Object.values(AuditLogType).map(type => new MultipleChoiceUIFilterOption(getAuditLogTypeName(type), type)),\n        ],\n        wrapper: {\n            type: {\n                $in: FilterWrapperMarker,\n            },\n        },\n    });\n\n    all.push(typeFilter);\n\n    all.unshift(\n        new GroupUIFilterBuilder({\n            builders: all,\n        }),\n    );\n\n    return all;\n}\n\nexport function getWebshopOrderUIFilterBuilders(preview: WebshopPreview) {\n    const builders: UIFilterBuilders = [\n        new NumberFilterBuilder({\n            name: '#',\n            key: 'number',\n        }),\n        new MultipleChoiceFilterBuilder({\n            name: 'Status',\n            options: Object.values(OrderStatus)\n                .filter(s => s !== OrderStatus.Deleted)\n                .map((status) => {\n                    return new MultipleChoiceUIFilterOption(Formatter.capitalizeFirstLetter(OrderStatusHelper.getName(status)), status);\n                }),\n            wrapper: {\n                status: {\n                    $in: FilterWrapperMarker,\n                },\n            },\n        }),\n        new StringFilterBuilder({\n            name: 'Naam',\n            key: 'name',\n        }),\n        new StringFilterBuilder({\n            name: 'E-mailadres',\n            key: 'email',\n        }),\n    ];\n\n    if (preview.meta.phoneEnabled) {\n        builders.push(new StringFilterBuilder({\n            name: 'Telefoonnummer',\n            key: 'phone',\n        }));\n    }\n\n    builders.push(new MultipleChoiceFilterBuilder({\n        name: 'Betaalmethode',\n        options: Object.values(PaymentMethod).map((paymentMethod) => {\n            return new MultipleChoiceUIFilterOption(PaymentMethodHelper.getNameCapitalized(paymentMethod), paymentMethod);\n        }),\n        wrapper: {\n            paymentMethod: {\n                $in: FilterWrapperMarker,\n            },\n        },\n    }));\n\n    const distinctCheckoutMethods = Formatter.uniqueArray(preview.meta.checkoutMethods.map(m => m.type));\n\n    if (distinctCheckoutMethods.length > 1) {\n        builders.push(new MultipleChoiceFilterBuilder({\n            name: 'Methode',\n            options: distinctCheckoutMethods.map((checkoutMethod) => {\n                return new MultipleChoiceUIFilterOption(Formatter.capitalizeFirstLetter(CheckoutMethodTypeHelper.getName(checkoutMethod)), checkoutMethod);\n            }),\n            wrapper: {\n                checkoutMethod: {\n                    $in: FilterWrapperMarker,\n                },\n            },\n        }));\n    }\n\n    builders.push(\n        new DateFilterBuilder({\n            name: 'Besteldatum',\n            key: 'validAt',\n        }),\n        new NumberFilterBuilder({\n            name: 'Bedrag',\n            key: 'totalPrice',\n            type: NumberFilterFormat.Currency,\n        }),\n        new NumberFilterBuilder({\n            name: 'Aantal',\n            key: 'amount',\n        }),\n    );\n\n    const timeCount = Formatter.uniqueArray(preview.meta.checkoutMethods.flatMap(method => method.timeSlots.timeSlots).map(t => t.timeRangeString())).length;\n    const dateCount = Formatter.uniqueArray(preview.meta.checkoutMethods.flatMap(method => method.timeSlots.timeSlots).map(t => t.dateString())).length;\n\n    const hasDelivery = preview.meta.checkoutMethods.some(method => method.type === CheckoutMethodType.Delivery);\n\n    // Count checkoutmethods that are not delivery\n    const nonDeliveryCount = preview.meta.checkoutMethods.filter(method => method.type !== CheckoutMethodType.Delivery).length;\n\n    if (dateCount > 1) {\n        builders.push(\n            new DateFilterBuilder({\n                name: (hasDelivery && nonDeliveryCount > 0) ? 'Afhaal/leverdatum' : (hasDelivery ? 'Leverdatum' : 'Afhaaldatum'),\n                key: 'timeSlotDate',\n            }));\n    }\n\n    if (timeCount > 1) {\n        // todo: change sort of timeSlotTime => should take start time into account => composite key or generated index maybe?\n        // todo: maybe group\n        builders.push(\n            new NumberFilterBuilder({\n                name: 'Tijdstip einde',\n                key: 'timeSlotEndTime',\n                type: NumberFilterFormat.TimeMinutes,\n            }));\n\n        builders.push(\n            new NumberFilterBuilder({\n                name: 'Tijdstip start',\n                key: 'timeSlotStartTime',\n                type: NumberFilterFormat.TimeMinutes,\n            }));\n    }\n\n    const groupFilter = new GroupUIFilterBuilder({ builders });\n\n    return [groupFilter, ...builders];\n}\n\nexport function getDocumentsUIFilterBuilders() {\n    const builders: UIFilterBuilders = [\n        new StringFilterBuilder({\n            name: 'Volgnummer',\n            key: 'id',\n        }),\n        new NumberFilterBuilder({\n            name: 'Nummer',\n            key: 'number',\n        }),\n        new StringFilterBuilder({\n            name: 'Beschrijving',\n            key: 'description',\n        }),\n        new MultipleChoiceFilterBuilder({\n            name: 'status',\n            options: Object.values(DocumentStatus).map((status) => {\n                return new MultipleChoiceUIFilterOption(\n                    Formatter.capitalizeFirstLetter(DocumentStatusHelper.getName(status)),\n                    status,\n                );\n            }),\n            wrapper: {\n                status: {\n                    $in: FilterWrapperMarker,\n                },\n            },\n        }),\n    ];\n    const groupFilter = new GroupUIFilterBuilder({ builders });\n\n    return [groupFilter, ...builders];\n}\n\nexport function getFilterBuildersForRecordCategories(categories: RecordCategory[], prefix = '') {\n    const all: UIFilterBuilder<UIFilter>[] = [];\n\n    for (const category of categories) {\n        const allForCategory: UIFilterBuilder<UIFilter>[] = [];\n        const categoryPrefix = category.name + ' → ';\n\n        for (const record of category.records) {\n            if (record.type === RecordType.Checkbox) {\n                allForCategory.push(\n                    new MultipleChoiceFilterBuilder({\n                        name: prefix + categoryPrefix + record.name,\n                        options: [\n                            new MultipleChoiceUIFilterOption($t('d87cdb56-c8a6-4466-a6fd-f32fe59561f5'), true),\n                            new MultipleChoiceUIFilterOption($t('01b79813-933b-4045-b426-82700f921eaa'), false),\n                        ],\n                        wrapper: {\n                            recordAnswers: {\n                                [record.id]: {\n                                    selected: { $in: FilterWrapperMarker },\n                                },\n                            },\n                        },\n                    }),\n                );\n            }\n\n            if (record.type === RecordType.ChooseOne) {\n                allForCategory.push(\n                    new MultipleChoiceFilterBuilder({\n                        name: prefix + categoryPrefix + record.name,\n                        options: [\n                            ...record.choices.map(c => new MultipleChoiceUIFilterOption(c.name, c.id)),\n                        ],\n                        wrapper: {\n                            recordAnswers: {\n                                [record.id]: {\n                                    selectedChoice: {\n                                        id: {\n                                            $in: FilterWrapperMarker,\n                                        },\n                                    },\n                                },\n                            },\n                        },\n                    }),\n                );\n            }\n\n            if (record.type === RecordType.MultipleChoice) {\n                allForCategory.push(\n                    new MultipleChoiceFilterBuilder({\n                        name: prefix + categoryPrefix + record.name,\n                        options: [\n                            ...record.choices.map(c => new MultipleChoiceUIFilterOption(c.name, c.id)),\n                        ],\n                        wrapper: {\n                            recordAnswers: {\n                                [record.id]: {\n                                    selectedChoices: {\n                                        $elemMatch: {\n                                            id: {\n                                                $in: FilterWrapperMarker,\n                                            },\n                                        },\n                                    },\n                                },\n                            },\n                        },\n                    }),\n                );\n            }\n        }\n\n        allForCategory.push(\n            ...getFilterBuildersForRecordCategories(category.childCategories, prefix + categoryPrefix),\n        );\n\n        if (allForCategory.length > 0) {\n            const group = new GroupUIFilterBuilder({\n                name: category.name,\n                builders: allForCategory,\n            });\n            allForCategory.unshift(group);\n            all.push(\n                group,\n            );\n        }\n    }\n\n    return all;\n}\n\n/**\n * These filters are compatible with the SQLFilter in the backend\n */\nexport function useEventNotificationBackendFilterBuilders() {\n    const platform = usePlatform();\n\n    return () => {\n        const all: UIFilterBuilders = [\n            new DateFilterBuilder({\n                name: $t('86983e38-4283-4f0a-bd1d-f48f050d3681'),\n                key: 'startDate',\n            }),\n            new DateFilterBuilder({\n                name: $t('c15040b1-3202-45a8-8d30-030a4e4c5f9c'),\n                key: 'endDate',\n            }),\n            new MultipleChoiceFilterBuilder({\n                name: $t('b8edf1c5-ebc8-4aae-83c1-249c08db529d'),\n                options: [\n                    ...platform.value.config.eventTypes.map((eventType) => {\n                        return new MultipleChoiceUIFilterOption(eventType.name, eventType.id);\n                    }),\n                ],\n                wrapper: {\n                    events: {\n                        $elemMatch: {\n                            typeId: {\n                                $in: FilterWrapperMarker,\n                            },\n                        },\n                    },\n                },\n            }),\n            new MultipleChoiceFilterBuilder({\n                name: $t('fde0cfa6-c279-4eef-ab75-8f62fd4028a8'),\n                options: [\n                    ...Object.values(EventNotificationStatus).map((status) => {\n                        return new MultipleChoiceUIFilterOption(\n                            Formatter.capitalizeFirstLetter(EventNotificationStatusHelper.getName(status)),\n                            status,\n                        );\n                    }),\n                ],\n                wrapper: {\n                    status: {\n                        $in: FilterWrapperMarker,\n                    },\n                },\n            }),\n            new MultipleChoiceFilterBuilder({\n                name: $t('cef37396-3c75-4a85-b14e-d1f7cfb9e546'),\n                multipleChoiceConfiguration: {\n                    isSubjectPlural: true,\n                },\n                options: platform.value.config.tags.map(tag => new MultipleChoiceUIFilterOption(tag.name, tag.id)),\n                wrapper: {\n                    organization: {\n                        $elemMatch: {\n                            tags: {\n                                $in: FilterWrapperMarker,\n                            },\n                        },\n                    },\n                },\n            }),\n            new StringFilterBuilder({\n                name: $t('05723781-9357-41b2-9fb8-cb4f80dde7f9'),\n                key: 'uri',\n                wrapper: {\n                    organization: {\n                        $elemMatch: FilterWrapperMarker,\n                    },\n                },\n            }),\n\n            new StringFilterBuilder({\n                name: $t('47754708-6f27-4afd-b9fe-600a209cb980'),\n                key: 'name',\n                wrapper: {\n                    organization: {\n                        $elemMatch: FilterWrapperMarker,\n                    },\n                },\n            }),\n        ];\n\n        // Recursive: self referencing groups\n        all.unshift(\n            new GroupUIFilterBuilder({\n                builders: all,\n            }),\n        );\n\n        return all;\n    };\n}\n\n/**\n * These filters are compatible with the SQLFilter in the backend\n */\nexport function useEventNotificationInMemoryFilterBuilders() {\n    const platform = usePlatform();\n\n    return (type: EventNotificationType) => {\n        const all: UIFilterBuilders = [\n            new DateFilterBuilder({\n                name: $t('86983e38-4283-4f0a-bd1d-f48f050d3681'),\n                key: 'startDate',\n            }),\n            new DateFilterBuilder({\n                name: $t('c15040b1-3202-45a8-8d30-030a4e4c5f9c'),\n                key: 'endDate',\n            }),\n            new MultipleChoiceFilterBuilder({\n                name: $t('b8edf1c5-ebc8-4aae-83c1-249c08db529d'),\n                options: [\n                    ...platform.value.config.eventTypes.map((eventType) => {\n                        return new MultipleChoiceUIFilterOption(eventType.name, eventType.id);\n                    }),\n                ],\n                wrapper: {\n                    events: {\n                        $elemMatch: {\n                            typeId: {\n                                $in: FilterWrapperMarker,\n                            },\n                        },\n                    },\n                },\n            }),\n        ];\n\n        if (type) {\n            // Also include complex filters\n            all.push(...getFilterBuildersForRecordCategories(type.recordCategories));\n        }\n\n        // Recursive: self referencing groups\n        all.unshift(\n            new GroupUIFilterBuilder({\n                builders: all,\n            }),\n        );\n\n        return all;\n    };\n}\n","<template>\n    <svg\n        :height=\"radius * 2\"\n        :width=\"radius * 2\"\n        :style=\"`border-width: ${borderWidth}px`\"\n    >\n        <circle\n            stroke=\"var(--color-gray-2, red)\"\n            fill=\"transparent\"\n            :stroke-width=\"stroke\"\n            :r=\"normalizedRadius\"\n            :cx=\"radius\"\n            :cy=\"radius\"\n        />\n        <circle\n            stroke=\"var(--color-primary, red)\"\n            fill=\"transparent\"\n            :stroke-dasharray=\"circumference + ' ' + circumference\"\n            :style=\"{ strokeDashoffset }\"\n            :stroke-width=\"stroke\"\n            :r=\"normalizedRadius\"\n            :cx=\"radius\"\n            :cy=\"radius\"\n        />\n    </svg>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\n\nconst props = withDefaults(defineProps<{radius: number, progress: number, stroke: number, borderWidth?: number}>(), {\n    borderWidth: 0\n});\n\nconst normalizedRadius = computed(() => props.radius - props.stroke);\nconst circumference = computed(() => normalizedRadius.value * 2 * Math.PI);\nconst strokeDashoffset = computed(() => circumference.value - (props.progress * circumference.value) );\n</script>\n\n<style lang=\"scss\" scoped>\n\nsvg {\n    border: 0px solid transparent;\n}\n\ncircle {\n    transition: stroke-dashoffset 0.35s;\n    transform: rotate(-90deg);\n    transform-origin: 50% 50%;\n    stroke-linecap: round;\n}\n</style>\n","<template>\n    <!-- This div is not really needed, but causes bugs if we remove it from the DOM. Probably something Vue.js related (e.g. user keeps logged out, even if loggedIn = true and force reload is used) -->\n    <div class=\"authenticated-view\">\n        <LoadingViewTransition :error-box=\"errorBox\">\n            <ComponentWithPropertiesInstance v-if=\"loggedIn\" :key=\"root.key\" :component=\"root\" />\n            <ComponentWithPropertiesInstance v-else-if=\"noPermissionsRoot && showPermissionsRoot\" :key=\"noPermissionsRoot.key\" :component=\"noPermissionsRoot\" />\n            <ComponentWithPropertiesInstance v-else-if=\"!hasToken\" :key=\"loginRoot.key\" :component=\"loginRoot\" />\n        </LoadingViewTransition>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { ComponentWithProperties, ComponentWithPropertiesInstance } from '@simonbackx/vue-app-navigation';\nimport { Component, Prop, VueComponent } from '@simonbackx/vue-app-navigation/classes';\n\nimport { ErrorBox } from '../errors/ErrorBox';\nimport LoadingViewTransition from './LoadingViewTransition.vue';\n\n@Component({\n    components: {\n        ComponentWithPropertiesInstance,\n        LoadingViewTransition,\n    },\n})\nexport default class AuthenticatedView extends VueComponent {\n    @Prop()\n    root!: ComponentWithProperties;\n\n    @Prop()\n    loginRoot!: ComponentWithProperties;\n\n    /**\n     * Set this as the root when the user doesn't have permissions (don't set if permissions are not needed)\n     */\n    @Prop()\n    noPermissionsRoot!: ComponentWithProperties | null;\n\n    loggedIn = false;\n    userId: string | null = null;\n    hasToken = false;\n    showPermissionsRoot = false;\n    lastOrganizationFetch = new Date();\n    errorBox: ErrorBox | null = null;\n\n    created() {\n        // We need to check data already before loading any component!\n        this.changed();\n        this.$context.addListener(this, this.changed.bind(this));\n        document.addEventListener('visibilitychange', this.onVisibilityChange);\n    }\n\n    beforeUnmount() {\n        this.$context.removeListener(this);\n        document.removeEventListener('visibilitychange', this.onVisibilityChange);\n    }\n\n    changed() {\n        if (this.noPermissionsRoot) {\n            this.loggedIn = (this.$context.isComplete() ?? false) && !!this.$context.auth.permissions && !this.$context.auth.permissions.isEmpty;\n            this.hasToken = this.$context.hasToken() ?? false;\n            this.showPermissionsRoot = this.$context.isComplete() ?? false;\n            this.userId = this.$context.user?.id ?? null;\n            this.errorBox = this.$context.loadingError ? new ErrorBox(this.$context.loadingError) : null;\n        }\n        else {\n            this.loggedIn = this.$context.isComplete() ?? false;\n            this.hasToken = this.$context.hasToken() ?? false;\n            this.showPermissionsRoot = false;\n            this.userId = this.$context.user?.id ?? null;\n            this.errorBox = this.$context.loadingError ? new ErrorBox(this.$context.loadingError) : null;\n        }\n    }\n\n    onVisibilityChange() {\n        if (document.visibilityState === 'visible') {\n            // TODO\n            console.info('Window became visible again');\n\n            if (!this.$context || !this.$context.isComplete()) {\n                return;\n            }\n\n            if (STAMHOOFD.environment === 'development' || this.lastOrganizationFetch.getTime() + 1000 * 60 * 5 < new Date().getTime()) {\n                // Update when at least 5 minutes inactive\n                console.info('Updating organization');\n                this.lastOrganizationFetch = new Date();\n\n                this.$context.updateData(true, false, false).catch(console.error);\n            }\n        }\n    }\n\n    async shouldNavigateAway() {\n        if (this.loggedIn) {\n            return await this.root.shouldNavigateAway();\n        }\n        if (this.noPermissionsRoot && this.showPermissionsRoot) {\n            return await this.noPermissionsRoot.shouldNavigateAway();\n        }\n        if (!this.hasToken) {\n            return await this.loginRoot.shouldNavigateAway();\n        }\n        return true;\n    }\n}\n</script>\n","<template>\n    <!-- This div is not really needed, but causes bugs if we remove it from the DOM. Probably something Vue.js related (e.g. user keeps logged out, even if loggedIn = true and force reload is used) -->\n    <div class=\"context-provider-view\">\n        <ComponentWithPropertiesInstance :key=\"root.key\" :component=\"root\" />\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { ComponentWithProperties, ComponentWithPropertiesInstance } from '@simonbackx/vue-app-navigation';\nimport { Component, Prop, VueComponent } from '@simonbackx/vue-app-navigation/classes';\nimport { isReactive } from 'vue';\nimport { appToUri } from '../context';\n\n@Component({\n    components: {\n        ComponentWithPropertiesInstance,\n    },\n    provide() {\n        if (isReactive(this.context)) {\n            // If this.context is a proxy, it will auto unwrap all the reference properties it has\n            // which will break reactivity on scalar values (e.g. Computed<null> will be unwrapped to null)\n            throw new Error('ContextProvider.context is reactive, which will break reactivity of the context properties');\n        }\n\n        if (!this.context.stamhoofd_app) {\n            console.error('Missing stamhoofd_app in ContextProvider.context');\n        }\n        else if (!this.context.$context) {\n            console.error('Missing $context in ContextProvider.context');\n        }\n        else {\n            if (this.context.stamhoofd_app === 'webshop') {\n                this.context.reactive_navigation_url = '/';\n            }\n            else {\n                // Build reactive url\n                this.context.reactive_navigation_url = appToUri(this.context.stamhoofd_app) + (this.context.$context.organization ? '/' + this.context.$context.organization!.uri : '');\n            }\n        }\n\n        return this.context;\n    },\n})\nexport default class ContextProvider extends VueComponent {\n    @Prop()\n    root!: ComponentWithProperties;\n\n    @Prop({ default: () => {\n        return {};\n    } })\n    context!: Record<string, unknown>;\n\n    async shouldNavigateAway() {\n        return await this.root.shouldNavigateAway();\n    }\n\n    returnToHistoryIndex() {\n        if (this.root) {\n            return this.root.returnToHistoryIndex();\n        }\n        return false;\n    }\n\n    beforeMount() {\n        if (this.root) {\n            this.root.assignHistoryIndex();\n        }\n    }\n}\n</script>\n","<template>\n    <div class=\"image-component\" :style=\"{maxHeight: maxHeight ? maxHeight+'px' : null}\">\n        <div v-if=\"autoHeight\" class=\"sizer\" :style=\"sizerStyle\">\n            <div :style=\"sizerChildStyle\" />\n        </div>\n\n        <picture v-if=\"elWidth\">\n            <source \n                v-if=\"imageDark && srcDark && (darkMode === 'Auto' || darkMode === 'On')\"\n                :srcset=\"srcDark\"\n                :media=\"darkMode === 'Auto' ? '(prefers-color-scheme: dark)' : ''\"\n                :width=\"imgWidthDark\" \n                :height=\"imgHeightDark\"\n            >\n            <img \n                :src=\"src\"\n                :width=\"imgWidth\" \n                :height=\"imgHeight\"\n                :alt=\"alt\"\n            >\n        </picture>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { Component, Prop, VueComponent } from '@simonbackx/vue-app-navigation/classes';\nimport { DarkMode, Image } from '@stamhoofd/structures';\n\n\n@Component({})\nexport default class ImageComponent extends VueComponent {\n    @Prop({ default: '' })\n        alt: string\n\n    @Prop({ required: true })\n        image: Image\n\n    @Prop({ default: null })\n        imageDark: Image|null\n\n    @Prop({ default: DarkMode.Auto})\n        darkMode: DarkMode\n\n    /**\n     * Update the height to match the image resolution.\n     * Width will take the available space (can style this with css)\n     */\n    @Prop({ default: false })\n        autoHeight: boolean\n\n    @Prop({ default: null })\n        maxHeight: number|null\n\n    elWidth: number|null = null;\n    elHeight: number|null = null;\n\n    get resolution() {\n        return this.image.getResolutionForSize(this.elWidth ?? undefined, this.elHeight ?? undefined)\n    }\n\n    get darkResolution() {\n        return (this.imageDark ?? this.image).getResolutionForSize(this.elWidth ?? undefined, this.elHeight ?? undefined)\n    }\n\n    get imgWidth() {\n        return this.resolution.width\n    }\n\n    get imgHeight() {\n        return this.resolution.height\n    }\n\n    get src() {\n        return this.resolution.file.getPublicPath();\n    }\n\n    get imgWidthDark() {\n        return this.darkResolution.width\n    }\n\n    get imgHeightDark() {\n        return this.darkResolution.height\n    }\n\n    get srcDark() {\n        return this.darkResolution.file.getPublicPath();\n    }\n\n    updateSize() {\n        this.elWidth = (this.$el as HTMLElement).offsetWidth\n        this.elHeight = this.autoHeight ? null : (this.$el as HTMLElement).offsetHeight\n    }\n\n    get sizerChildStyle() {\n        if (!this.autoHeight) {\n            return;\n        }\n        const percentage = (this.imgHeight / this.imgWidth * 100).toFixed(2);\n        return `padding-bottom: ${percentage}%;`\n    }\n\n    get sizerStyle() {\n        if (!this.autoHeight) {\n            return;\n        }\n        return `max-height: ${this.imgHeight}px;`\n    }\n\n    // Observe the size of the element and update the used resolution accordingly\n    mounted() {\n        // Create a size observer\n        try {\n            const resizeObserver = new ResizeObserver(() => {\n                this.updateSize();\n            });\n            resizeObserver.observe(this.$el);\n        } catch (e) {\n            // Not supported\n            this.$nextTick(() => {\n                this.updateSize();\n            })\n        }\n    }\n}\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use \"@stamhoofd/scss/base/text-styles.scss\" as *;\n\n.image-component {\n    position: relative;\n    overflow: hidden;\n\n    // Width and height should be set by the parent.\n    img {\n        object-fit: scale-down;\n        position: absolute;\n        left: 0;\n        top: 0;\n        width: 100%;\n        height: 100%;\n    }\n}\n</style>\n","<template>\n    <!-- This div is not really needed, but causes bugs if we remove it from the DOM. Probably something Vue.js related (e.g. user keeps logged out, even if loggedIn = true and force reload is used) -->\n    <div v-if=\"platform.config.coverPhoto\" class=\"cover-image-container\">\n        <div class=\"left\">\n            <ImageComponent :image=\"platform.config.coverPhoto\" class=\"cover-image\" />\n            <ImageComponent v-if=\"platform.config.coverBottomLeftOverlayImage\" :image=\"platform.config.coverBottomLeftOverlayImage\" class=\"overlay\" :auto-height=\"true\" :style=\"'width: ' + platform.config.coverBottomLeftOverlayWidth + 'px'\" />\n        </div>\n        <div class=\"right\">\n            <ComponentWithPropertiesInstance :key=\"root.key\" :component=\"root\" />\n        </div>\n    </div>\n    <ComponentWithPropertiesInstance v-else :key=\"root.key\" :component=\"root\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport { ComponentWithProperties, ComponentWithPropertiesInstance } from '@simonbackx/vue-app-navigation';\nimport { usePlatform } from '../hooks';\nimport ImageComponent from '../views/ImageComponent.vue';\n\nconst props = defineProps<{\n    root: ComponentWithProperties;\n}>();\n\nconst platform = usePlatform();\n\ndefineExpose({\n    shouldNavigateAway: async () => {\n        return await props.root.shouldNavigateAway();\n    },\n});\n</script>\n\n<style lang=\"scss\">\n@use '@stamhoofd/scss/base/variables' as *;\n\n.cover-image-container {\n    > .left {\n        background: $color-background-shade;\n        display: none;\n        position: relative;\n\n        .cover-image {\n            position: absolute;\n            left: 0;\n            top: 0;\n            width: 100%;\n            height: 100%;\n\n            img {\n                object-fit: cover;\n            }\n        }\n\n        .overlay {\n            position: absolute;\n            left: 0;\n            bottom: 0;\n            max-width: 100%;\n        }\n\n    }\n}\n\n@media (min-width: 1000px) {\n    .cover-image-container {\n        display: grid;\n        grid-template-columns: 60vw 40vw;\n\n        > .left {\n            display: block;\n        }\n\n        > .right {\n            --vw: 0.4vw;\n            --st-horizontal-padding: var(--split-view-detail-horizontal-padding, 40px);\n            --navigation-bar-horizontal-padding: 20px;\n\n            overflow: clip;\n\n            .st-view {\n                .st-view-vertical-center {\n                    flex-grow: 1;\n                    display: flex;\n                    align-items: center;\n\n                    > .container {\n                        width: 100%;\n                    }\n                }\n            }\n        }\n    }\n}\n\n</style>\n","\n<template>\n    <ComponentWithPropertiesInstance :key=\"root.key\" :component=\"root\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport { ComponentWithProperties, ComponentWithPropertiesInstance } from \"@simonbackx/vue-app-navigation\";\n\nconst props = defineProps<{\n    root: ComponentWithProperties,\n    hooks: () => void\n}>();\n\nprops.hooks();\n\n</script>\n","<!-- eslint-disable vue/no-multiple-template-root -->\n<template>\n    <LoadingViewTransition :error-box=\"errorBox\">\n        <slot v-if=\"!loading\" v-bind=\"{externalOrganization: externalOrganization as null extends Nullable ? (Organization|null) : Organization}\" />\n    </LoadingViewTransition>\n</template>\n\n<script setup lang=\"ts\" generic=\"Nullable extends string|null\">\nimport { Organization } from '@stamhoofd/structures';\nimport { computed, watchEffect } from 'vue';\nimport { useExternalOrganization } from '../groups';\nimport LoadingViewTransition from './LoadingViewTransition.vue';\n\nconst props = withDefaults(\n    defineProps<{\n        organizationId: Nullable;\n        organizationHint?: Organization | null;\n    }>(), {\n        organizationHint: null,\n    },\n);\n\nconst emit = defineEmits<{\n    update: [patch: Organization];\n}>();\nconst { loading, errorBox, externalOrganization } = useExternalOrganization(computed(() => props.organizationId), props.organizationHint);\n\nwatchEffect(() => {\n    if (externalOrganization.value) {\n        emit('update', externalOrganization.value);\n    }\n});\n\n</script>\n","import { onBeforeUnmount, Ref, watch } from \"vue\";\n\n\nexport function useResizeObserver(elementRef: Ref<HTMLElement|HTMLElement[]|null>, callback: () => void) {\n    const observing = new Set<HTMLElement>();\n    const observer = new ResizeObserver((entries) => {\n        callback();\n    });\n\n    function observe(el: HTMLElement) {\n        if (observing.has(el)) {\n            return;\n        }\n        observer.observe(el);\n        observing.add(el);\n    }\n\n    function unobserveAll() {\n        for (const el of observing) {\n            observer.unobserve(el);\n        }\n        observing.clear();\n    }\n\n    watch(elementRef, (el) => {\n        unobserveAll();\n        if (el) {\n            if (Array.isArray(el)) {\n                for (const e of el) {\n                    observe(e);\n                }\n            } else {\n                observe(el);\n            }\n        }\n    }, {deep: true});\n\n    onBeforeUnmount(() => {\n        observer.disconnect();\n    });\n}\n","<template>\n    <div ref=\"rootElement\" class=\"scrollable-segmented-control\">\n        <button\n            v-for=\"(item, index) in items\"\n            :key=\"index\"\n            ref=\"elements\"\n            class=\"button item\"\n            type=\"button\"\n            :class=\"{ selected: item === modelValue }\"\n            @click=\"selectItem(index)\"\n        >\n            <slot v-if=\"$slots.item\" name=\"item\" :item=\"item\" :index=\"index\" />\n            <span v-else>{{ labels ? labels[index] : item }}</span>\n        </button>\n\n        <div class=\"right\">\n            <slot name=\"right\" />\n        </div>\n\n        <div v-if=\"seekerWidth\" class=\"seeker\" :style=\"{'--seek-width': seekerWidth+'px', '--seek-x': seekerXOffset + 'px'}\" />\n    </div>\n</template>\n\n<script lang=\"ts\" setup generic=\"T\">\nimport { computed, nextTick, onMounted, ref, watch } from 'vue';\n\nimport { useResizeObserver } from './hooks/useResizeObserver';\n\n\nconst props = withDefaults(\n    defineProps<{items: T[], labels?: string[] | null}>(),\n    {labels: null}\n);\nconst modelValue = defineModel<any>();\nconst elements = ref<HTMLElement[]>([]);\nconst rootElement = ref<HTMLElement | null>(null);\n\nconst widths = ref<number[]>([]);\nconst seekerXOffset = computed(() => {\n    const index = props.items.indexOf(modelValue.value);\n    if (index === -1) {\n        return 0;\n    }\n    return widths.value.slice(0, index).reduce((a, b) => a + b, 0) + (30 * index);\n});\nconst seekerWidth = computed(() => {\n    return widths.value[props.items.indexOf(modelValue.value)] ?? 0;\n});\n\nfunction selectItem(index: number) {\n    modelValue.value = props.items[index];\n}\n\nfunction updateWidths() {\n    widths.value = elements.value.map(e => (e.offsetWidth ));\n}\n\nonMounted(() => {\n    updateWidths();\n});\n\nuseResizeObserver(rootElement, () => {\n    updateWidths();\n});\n\nuseResizeObserver(elements, () => {\n    updateWidths();\n});\n\nwatch(() => props.labels, async () => {\n    // Wait for next render\n    await nextTick();\n    updateWidths();\n});\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use '@stamhoofd/scss/base/text-styles.scss';\n$segmented-control-height: 60px;\n\n.scrollable-segmented-control {\n    margin: var(--st-hr-margin, 30px) calc(-1 * var(--st-horizontal-padding, 40px));\n    padding: 0 var(--st-horizontal-padding, 40px);\n\n    h1 + & {\n        margin-top: 0px;\n    }\n    \n    overflow-x: auto;\n    overflow-y: hidden;\n    display: flex;\n    flex-direction: row;\n    position: relative;\n    --seek-x: 0px;\n    --seek-width: 100px;\n    scrollbar-width: thin;\n\n    &:before {\n        content: '';\n        position: absolute;\n        background: $color-border;\n        left: 0;\n        right: 0;\n        bottom: 0;\n        height: $border-width-thin;\n    }\n\n    > .seeker {\n        position: absolute;\n        background: $color-primary;\n        left: var(--st-horizontal-padding, 40px);\n        bottom: 0;\n        height: 3px;\n        transition: width 0.2s, transform 0.2s, opacity 0.2s;\n        \n        width: var(--seek-width);\n        transform: translateX(var(--seek-x));\n        border-radius: 1.5px;\n    }\n\n    > .item {\n        height: $segmented-control-height;\n        min-width: 0;\n        flex-shrink: 0;\n        max-width: 30vw;\n        @extend .style-interactive-small;\n        border-bottom: 3px solid transparent;\n        line-height: $segmented-control-height;\n        transition: color 0.2s, opacity 0.2s;\n        margin: 0 15px;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        gap: 7px;\n\n        &:first-child {\n            margin-left: 0;\n        }\n\n        &:active, &:hover {\n            opacity: 0.4;\n        }\n\n        &.selected {\n            color: $color-primary;\n\n            &:hover ~ .seeker {\n                opacity: 0.4;\n            }\n        }\n    }\n\n    > .right {\n        margin-left: auto;\n        height: $segmented-control-height;\n        display: flex;\n        align-items: center;\n    }\n}\n</style>\n","<template>\n    <STListItem class=\"right-stack smartphone-wrap-left\" :selectable=\"true\">\n        <template #left>\n            <EventImageBox :event=\"event\" />\n        </template>\n        <p v-if=\"levelPrefix\" class=\"style-title-prefix-list style-limit-lines\">\n            {{ levelPrefix }}\n        </p>\n        <h3 class=\"style-title-list larger\">\n            <span>{{ event.name }}</span>\n        </h3>\n        <p class=\"style-description-small\">\n            {{ Formatter.capitalizeFirstLetter(event.dateRange) }}\n        </p>\n\n        <p v-if=\"prefix\" class=\"style-description-small\">\n            Voor {{ prefix }}\n        </p>\n\n        <p v-if=\"event.meta.location?.name || event.meta.location?.address?.city\" class=\"style-description-small\">\n            {{ event.meta.location?.name || event.meta.location?.address?.city }}\n        </p>\n\n        <p v-if=\"event.group\" class=\"style-description-small\">\n            <span v-if=\"event.group.notYetOpen\">Inschrijvingen starten op {{ Formatter.date(event.group.activePreRegistrationDate ?? event.group.settings.registrationStartDate ?? new Date()) }}</span>\n            <span v-else-if=\"event.group.closed\">Inschrijvingen gesloten</span>\n            <span v-else>Inschrijvingen open</span>\n        </p>\n\n        <p v-if=\"event.group && app !== 'registration'\" class=\"style-description-small\">\n            <span v-if=\"event.group.getMemberCount() !== null\">{{ capitalizeFirstLetter(pluralText(event.group.getMemberCount() ?? 0, 'inschrijving', 'inschrijvingen')) }}</span>\n        </p>\n\n        <template #right>\n            <span v-if=\"!event.meta.visible\" v-tooltip=\"'Verborgen'\" class=\"icon gray eye-off\" />\n            <span v-if=\"event.id\" class=\"icon arrow-right-small gray\" />\n            <span v-else class=\"icon add gray\" />\n        </template>\n    </STListItem>\n</template>\n\n<script setup lang=\"ts\">\nimport { Event } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed } from 'vue';\nimport { useOrganization, usePlatform } from '../../hooks';\nimport EventImageBox from './EventImageBox.vue';\nimport { useAppContext } from '../../context';\n\nconst props = defineProps<{\n    event: Event\n}>();\n\nconst platform = usePlatform()\nconst organization = useOrganization()\nconst app = useAppContext()\n\nconst levelPrefix = computed(() => {\n    const prefixes: string[] = []\n\n    if (props.event.organizationId === null) {\n        if (props.event.meta.organizationTagIds !== null) {\n            const tagNames = platform.value?.config.tags.filter(t => props.event.meta.organizationTagIds?.includes(t.id)).map(t => t.name)\n            prefixes.push(...tagNames)\n        } else {\n            prefixes.push('Nationaal')\n        }\n    } else {\n        if (props.event.organizationId === organization.value?.id) {\n            // skip\n        } else {\n            // Name of the organization\n            if (props.event.meta.organizationCache?.name) {\n                prefixes.push(props.event.meta.organizationCache?.name)\n            }\n        }\n    }\n\n    return Formatter.joinLast(prefixes, ', ', ' en ')\n});\n\n\nconst prefix = computed(() => {\n    const prefixes: string[] = []\n\n    if (props.event.meta.defaultAgeGroupIds !== null) {\n        for (const ageGroupId of props.event.meta.defaultAgeGroupIds) {\n            const ageGroup = platform.value?.config.defaultAgeGroups.find(g => g.id === ageGroupId)\n            if (ageGroup) {\n                prefixes.push(ageGroup.name)\n            }\n        }\n    }\n\n    if (props.event.meta.groups !== null) {\n        for (const group of props.event.meta.groups) {\n            prefixes.push(group.name)\n        }\n    }\n    return Formatter.joinLast(prefixes, ', ', ' en ')\n});\n\n</script>\n","import { AccessRight, NamedObject, Organization, OrganizationTag, PermissionsResourceType } from '@stamhoofd/structures';\nimport { useAuth, usePlatform } from '../../hooks';\n\nexport function useEventPermissions() {\n    const auth = useAuth();\n    const platform = usePlatform();\n    const permissions = auth.permissions;\n\n    function canWriteSome() {\n        if (!permissions) {\n            return false;\n        }\n\n        return permissions.hasAccessRightForSomeResourceOfType(PermissionsResourceType.OrganizationTags, AccessRight.EventWrite) || permissions.hasAccessRightForSomeResourceOfType(PermissionsResourceType.Groups, AccessRight.EventWrite);\n    }\n\n    function canWriteAllGroupEvents() {\n        if (!permissions) {\n            return false;\n        }\n        return permissions.hasAccessRightForAllResourcesOfType(PermissionsResourceType.Groups, AccessRight.EventWrite);\n    }\n\n    function canWriteAllTagEvents() {\n        if (!permissions) {\n            return false;\n        }\n        return permissions.hasAccessRightForAllResourcesOfType(PermissionsResourceType.OrganizationTags, AccessRight.EventWrite);\n    }\n\n    function groupsToFilterEventsOn(): string[] | null {\n        return filterEventsOn(PermissionsResourceType.Groups);\n    }\n\n    function tagsToFilterEventsOn(): string[] | null {\n        return filterEventsOn(PermissionsResourceType.OrganizationTags);\n    }\n\n    function isGroupEnabledOperatorFactory() {\n        if (!permissions) {\n            return () => false;\n        }\n\n        return (group: NamedObject) => permissions.hasResourceAccessRight(PermissionsResourceType.Groups, group.id, AccessRight.EventWrite);\n    }\n\n    function isTagEnabledPredicateFactory() {\n        if (!permissions) {\n            return () => false;\n        }\n\n        return (tag: OrganizationTag) => permissions.hasResourceAccessRight(PermissionsResourceType.OrganizationTags, tag.id, AccessRight.EventWrite);\n    }\n\n    function canAdminEventForExternalOrganization(organization: Organization) {\n        const organizationPermissions = auth.user?.permissions?.forOrganization(organization, platform.value);\n        return organizationPermissions?.hasAccessRight(AccessRight.EventWrite) ?? false;\n    }\n\n    function filterEventsOn(type: PermissionsResourceType): string[] | null {\n        if (!permissions) {\n            return null;\n        }\n\n        if (permissions.hasAccessRightForAllResourcesOfType(type, AccessRight.EventWrite)) {\n            return null;\n        }\n\n        const result = new Set<string>();\n\n        const ressources = permissions.resources.get(type);\n        if (ressources) {\n            for (const [tagId, permissions] of ressources.entries()) {\n                if (permissions.hasAccessRight(AccessRight.EventWrite)) {\n                    result.add(tagId);\n                }\n            }\n        }\n\n        return [...result];\n    }\n\n    return {\n        canWriteSome,\n        canWriteAllGroupEvents,\n        canWriteAllTagEvents,\n        isGroupEnabledOperatorFactory,\n        isTagEnabledPredicateFactory,\n        canAdminEventForExternalOrganization,\n        tagsToFilterEventsOn,\n        groupsToFilterEventsOn,\n    };\n}\n","<template>\n    <STList>\n        <STListItem v-if=\"nullable\" :selectable=\"true\" element-name=\"label\">\n            <template #left>\n                <Checkbox v-model=\"allGroups\" />\n            </template>\n            <h3 class=\"style-title-list\">\n                {{ nullableLabel }}\n            </h3>\n        </STListItem>\n\n        <template v-if=\"model !== null\">\n            <STListItem v-for=\"item of items\" :key=\"item.value\" :selectable=\"true\" element-name=\"label\">\n                <template #left>\n                    <Checkbox :model-value=\"getGroupValue(item.value)\" @update:model-value=\"setGroupValue(item.value, $event)\" />\n                </template>\n                <h3 class=\"style-title-list\">\n                    {{ item.name }}\n                </h3>\n                <p v-if=\"item.description\" class=\"style-description-small\" v-text=\"item.description\" />\n            </STListItem>\n        </template>\n    </STList>\n</template>\n\n<script setup lang=\"ts\" generic=\"T extends string|number, Nullable extends true|false = false\">\nimport { computed, ref, watchEffect } from 'vue';\n\nconst props = withDefaults(\n    defineProps<{\n        nullable?: Nullable;\n        nullableLabel?: string;\n        items: { name: string; value: T; description?: string }[];\n    }>(), {\n        nullable: false as any,\n        nullableLabel: 'Alles',\n    },\n);\n\ntype Arr = Nullable extends true ? (T[] | null) : T[];\nconst model = defineModel<Arr>({ required: true });\nconst lastCachedValue = ref<Arr>((props.nullable ? null : []) as Arr);\n\nwatchEffect(() => {\n    if (model.value !== null) {\n        lastCachedValue.value = model.value;\n    }\n});\n\nconst allGroups = computed({\n    get: () => model.value === null,\n    set: (allGroups) => {\n        if (allGroups) {\n            model.value = null as Arr;\n        }\n        else {\n            model.value = (lastCachedValue.value ?? []).slice();\n        }\n    },\n});\n\nfunction getGroupValue(group: T) {\n    return model.value?.includes(group) ?? false;\n}\n\nfunction setGroupValue(group: T, value: boolean) {\n    if (model.value === null) {\n        return;\n    }\n    if (value) {\n        model.value = [...model.value.filter(t => t !== group), group] as Arr;\n    }\n    else {\n        model.value = model.value.filter(t => t !== group) as Arr;\n    }\n}\n</script>\n","<template>\n    <MultipleChoiceInput\n        v-model=\"model\"\n        :items=\"defaultAgeGroups.map(group => ({ name: group.name, value: group.id }))\"\n        :nullable=\"nullable\"\n        :nullable-label=\"$t('07d642d2-d04a-4d96-b155-8dbdb1a9e4ff')\"\n    />\n</template>\n\n<script setup lang=\"ts\">\nimport { SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\nimport { ErrorBox, useErrors, usePlatform, useValidation, Validator } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { computed } from 'vue';\nimport MultipleChoiceInput from './MultipleChoiceInput.vue';\n\nconst props = withDefaults(\n    defineProps<{\n        nullable?: boolean;\n        validator: Validator;\n        shouldSelectAtLeastOne?: boolean;\n    }>(), {\n        nullable: false,\n        shouldSelectAtLeastOne: true,\n    },\n);\n\nconst model = defineModel<string[] | null>({ required: true });\nconst platform = usePlatform();\nconst errors = useErrors({ validator: props.validator });\nconst $t = useTranslate();\n\nconst defaultAgeGroups = computed(() => platform.value.config.defaultAgeGroups);\n\nuseValidation(errors.validator, () => {\n    const se = new SimpleErrors();\n    if (props.shouldSelectAtLeastOne) {\n        if (model.value !== null && model.value.length === 0) {\n            se.addError(new SimpleError({\n                code: 'invalid_field',\n                message: $t('54a24516-1a43-4bc7-ac7a-c3fafa74ee22'),\n                field: 'agegroups',\n            }));\n        }\n    }\n\n    if (se.errors.length > 0) {\n        errors.errorBox = new ErrorBox(se);\n        return false;\n    }\n\n    return true;\n});\n</script>\n","<template>\n    <LoadingBoxTransition>\n        <STList v-if=\"!loading\">\n            <STListItem v-if=\"nullable\" :selectable=\"true\" element-name=\"label\">\n                <template #left>\n                    <Checkbox v-model=\"allGroups\" />\n                </template>\n                <h3 class=\"style-title-list\">\n                    {{ $t('07d642d2-d04a-4d96-b155-8dbdb1a9e4ff') }}\n                </h3>\n            </STListItem>\n\n            <template v-if=\"model !== null\">\n                <STListItem v-for=\"option of options\" :key=\"option.group.id\" :selectable=\"option.isEnabled && !option.isLocked\" element-name=\"label\">\n                    <template #left>\n                        <Checkbox :model-value=\"getGroupValue(option.group)\" :disabled=\"!option.isEnabled || option.isLocked\" @update:model-value=\"setGroupValue(option.group, $event)\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        {{ option.group.name }}\n                    </h3>\n                    <p v-if=\"option.group.description\" class=\"style-description-small\">\n                        {{ option.group.description }}\n                    </p>\n                </STListItem>\n            </template>\n        </STList>\n    </LoadingBoxTransition>\n</template>\n\n<script setup lang=\"ts\">\nimport { LoadingBoxTransition, useOrganization, usePlatform } from '@stamhoofd/components';\nimport { useOrganizationManager, useRequestOwner } from '@stamhoofd/networking';\nimport { GroupType, NamedObject, RegistrationPeriodList } from '@stamhoofd/structures';\nimport { computed, Ref, ref, watch, watchEffect } from 'vue';\n\nconst props = withDefaults(\n    defineProps<{\n        nullable?: boolean;\n        date: Date; // indication for selection the right groups in this period\n        isGroupEnabledOperator?: (group: NamedObject) => boolean;\n    }>(), {\n        nullable: false,\n        isGroupEnabledOperator: undefined,\n    },\n);\n\nconst model = defineModel<NamedObject[] | null>({ required: true });\nconst organization = useOrganization();\nconst organizationManager = useOrganizationManager();\nconst owner = useRequestOwner();\nconst platform = usePlatform();\n\nconst lastCachedValue = ref<NamedObject[] | null>(null);\nconst periods = ref(RegistrationPeriodList.create({}) as any) as Ref<RegistrationPeriodList>;\nconst loading = ref(true);\n\nconst visiblePeriodIds = computed(() => {\n    const pp = periods.value.periods.filter(period => period.startDate <= props.date && period.endDate >= props.date).map(p => p.id);\n\n    if (pp.length > 0) {\n        return pp;\n    }\n\n    // Defualt show current\n    return [\n        platform.value.period.id,\n        organization.value?.period.period.id,\n    ];\n});\n\nconst groups = computed(() => {\n    return periods.value.organizationPeriods.filter(p => visiblePeriodIds.value.includes(p.period.id)).flatMap((p) => {\n        return p.adminCategoryTree.getAllGroups().filter(g => g.type === GroupType.Membership).map(group => NamedObject.create({\n            id: group.id,\n            name: group.settings.name,\n            description: p.period.nameShort,\n        }));\n    });\n});\n\nconst missingGroups = computed(() => {\n    return model.value === null ? [] : model.value.filter(g => !groups.value.find(group => group.id === g.id));\n});\n\nconst options = computed(() => {\n    const isEnabledOperator = props.isGroupEnabledOperator;\n    const groupsToChoose = [...groups.value, ...missingGroups.value];\n\n    let result: { group: NamedObject; isEnabled: boolean; isLocked: boolean }[] = [];\n\n    if (isEnabledOperator !== undefined) {\n        result = groupsToChoose.map((group) => {\n            return {\n                group,\n                isEnabled: isEnabledOperator(group),\n                isLocked: false,\n            };\n        },\n        );\n    }\n    else {\n        result = groupsToChoose.map((group) => {\n            return {\n                group,\n                isEnabled: true,\n                isLocked: false,\n            };\n        });\n    }\n\n    if (result.filter(x => x.isEnabled).length === 1) {\n        const firstEnabled = result.find(x => x.isEnabled);\n        if (firstEnabled) {\n            firstEnabled.isLocked = true;\n        }\n    }\n\n    return result;\n});\n\nconst enabledOptions = computed(() => options.value.filter(g => g.isEnabled).map(g => g.group));\n\nwatch(enabledOptions, (options) => {\n    if (options.length === 1 && model.value?.length === 0) {\n        model.value = [options[0]];\n    }\n}, { immediate: true });\n\norganizationManager.value.loadPeriods(false, true, owner).then((p) => {\n    periods.value = p;\n    loading.value = false;\n}).catch(console.error);\n\nwatchEffect(() => {\n    if (model.value !== null) {\n        lastCachedValue.value = model.value;\n    }\n});\n\nconst allGroups = computed({\n    get: () => model.value === null,\n    set: (allGroups) => {\n        if (allGroups) {\n            model.value = null;\n        }\n        else {\n            model.value = (lastCachedValue.value ?? []).slice();\n        }\n    },\n});\n\nfunction getGroupValue(group: NamedObject) {\n    return !!model.value?.find(v => v.id === group.id);\n}\n\nfunction setGroupValue(group: NamedObject, value: boolean) {\n    if (model.value === null) {\n        return;\n    }\n    if (value) {\n        model.value = [...model.value.filter(t => t.id !== group.id), group];\n    }\n    else {\n        model.value = model.value.filter(t => t.id !== group.id);\n    }\n}\n</script>\n","<template>\n    <div class=\"st-view search-organization-view\">\n        <STNavigationBar :title=\"$t('857e22fa-a4ac-4306-a631-d5133b6c8834')\" />\n\n        <main>\n            <h1>{{ title }}</h1>\n            <p v-if=\"description\" class=\"style-description-block pre-wrap\" v-text=\"description\" />\n\n            <form class=\"search-box input-icon-container icon search gray\" @submit.prevent>\n                <input ref=\"input\" v-model=\"query\" :autofocus=\"true\" class=\"input\" placeholder=\"Zoek op naam of postcode\" name=\"search\" inputmode=\"search\" type=\"search\" enterkeyhint=\"search\" autocorrect=\"off\" autocomplete=\"off\" :spellcheck=\"false\" autocapitalize=\"off\">\n            </form>\n\n            <Spinner v-if=\"loadingResults\" class=\"gray center\" />\n            <STList v-else>\n                <STListItem v-for=\"organization in results\" :key=\"organization.id\" :selectable=\"true\" @click=\"selectOrganization(organization, navigationActions)\">\n                    <template #left>\n                        <OrganizationAvatar :organization=\"organization\" />\n                    </template>\n\n                    <h2>{{ organization.name }}</h2>\n\n                    <p class=\"style-description\">\n                        {{ organization.address.anonymousString(defaultCountry) }}\n                    </p>\n                </STListItem>\n            </STList>\n            <p v-if=\"!loadingResults && results.length === 0 && query\" class=\"info-box\">\n                {{ $t('735ec53c-5b23-469a-9365-d1216e1c739b') }}\n            </p>\n        </main>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ArrayDecoder, Decoder } from '@simonbackx/simple-encoding';\nimport { Request } from '@simonbackx/simple-networking';\nimport { NavigationActions, OrganizationAvatar, Spinner, Toast, useNavigationActions } from '@stamhoofd/components';\nimport { I18nController, useTranslate } from '@stamhoofd/frontend-i18n';\nimport { NetworkManager, useRequestOwner } from '@stamhoofd/networking';\nimport { Organization } from '@stamhoofd/structures';\nimport { throttle } from \"@stamhoofd/utility\";\nimport { Ref, ref, watch } from 'vue';\n\nwithDefaults(\n    defineProps<{\n        title?: string\n        description?: string,\n        selectOrganization: (organization: Organization, navigation: NavigationActions) => Promise<void>|void;\n    }>(), {\n        title: 'Zoeken',\n        description: '',\n    }\n);\n\nconst navigationActions = useNavigationActions()\nconst loadingResults = ref(false)\nconst query = ref(\"\");\nconst results = ref([]) as Ref<Organization[]>;\nconst owner = useRequestOwner()\nconst defaultCountry = I18nController.shared.countryCode\nconst $t = useTranslate();\n\nlet lastQuery = '';\nlet counter = 0;\n\nconst updateResults = async () => {\n    const q = query.value\n    const cachedCount = counter\n\n    if (q.length === 0 ) {\n        results.value = []\n        loadingResults.value = false\n        return\n    }\n    loadingResults.value = true\n\n    try {\n        const response = await NetworkManager.server.request({\n            method: \"GET\",\n            path: \"/organizations/search\",\n            query: {query: q },\n            decoder: new ArrayDecoder(Organization as Decoder<Organization>),\n            owner\n        })\n\n        if (cachedCount !== counter) {\n            // A new request have started already\n            return\n        }\n        results.value = response.data\n    } catch (e) {\n        if (cachedCount !== counter) {\n            // A new request have started already\n            return\n        }\n        if (!Request.isAbortError(e)) {\n            console.error(e)\n            Toast.fromError(e).show()\n        }\n        results.value = []\n    }\n\n    if (cachedCount !== counter) {\n        // A new request have started already\n        return\n    }\n    loadingResults.value = false\n}\n\nconst throttleUpdateResults = throttle(updateResults, 500);\n\nconst startUpdateResults = async () => {\n    const value = query.value\n    if (value === lastQuery) {\n        return\n    }\n    lastQuery = value\n    loadingResults.value = true\n    counter += 1;\n\n    Request.cancelAll(owner)\n\n    if (value.length === 0) {\n        results.value = []\n        loadingResults.value = false\n        return\n    }\n    throttleUpdateResults()\n}\n\nwatch(query, startUpdateResults);\n\n</script>\n\n<style lang=\"scss\">\n.search-organization-view {\n    .search-box {\n        margin: 15px 0;\n    }\n}\n</style>\n","<template>\n    <SaveView :loading=\"loading\" :disabled=\"disabled\" :title=\"title\" :save-text=\"deleteText\" :cancel-text=\"cancelText\" :add-extra-cancel=\"true\" save-icon=\"trash\" save-button-class=\"destructive\" @save=\"doDelete\">\n        <h1>{{ title }}</h1>\n\n        <p>{{ description }}</p>\n\n        <STInputBox :title=\"confirmationTitle\" error-fields=\"confirmationCodeInput\">\n            <input v-model=\"confirmationCodeInput\" class=\"input\" type=\"text\" :placeholder=\"confirmationPlaceholder\" autocomplete=\"given-name\">\n        </STInputBox>\n\n        <hr>\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n        <Checkbox v-model=\"isConfirm\" error-fields=\"isConfirm\">\n            {{ checkboxText }}\n        </Checkbox>\n    </SaveView>\n</template>\n\n<script setup lang=\"ts\">\nimport { SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\nimport { usePop } from '@simonbackx/vue-app-navigation';\nimport { computed, ref } from 'vue';\nimport { ErrorBox } from '../errors/ErrorBox';\nimport { useErrors } from '../errors/useErrors';\nimport { useValidation } from '../errors/useValidation';\nimport STInputBox from '../inputs/STInputBox.vue';\nimport { Toast } from '../overlays/Toast';\n\nconst props = \n    defineProps<{\n        title: string,\n        description: string,\n        confirmationTitle: string,\n        confirmationPlaceholder: string,\n        confirmationCode: string,\n        checkboxText: string\n        onDelete: () => Promise<boolean>\n    }>();\n\nconst pop = usePop();\nconst errors = useErrors();\n\nconst deleteText = 'Verwijderen';\nconst cancelText = 'Annuleren';\nconst confirmationCodeInput = ref('');\nconst isConfirm = ref(false);\nconst disabled = computed(() => confirmationCodeInput.value.toLowerCase() !== props.confirmationCode.toLowerCase());\nconst loading = ref(false);\n\nuseValidation(errors.validator, () => {\n    const se = new SimpleErrors();\n\n    if (!isConfirm.value) {\n        se.addError(new SimpleError({\n            code: \"invalid_field\",\n            message: \"Bevestig de actie\",\n            field: \"isConfirm\"\n        }))\n    }\n\n    if (se.errors.length > 0) {\n        errors.errorBox = new ErrorBox(se)\n        return false\n    }\n\n    errors.errorBox = null;\n    return true;\n});\n\nasync function doDelete() {\n    if(disabled.value) {\n        return;\n    }\n\n    loading.value = true;\n\n    try {\n        const isValid = await errors.validator.validate();\n\n        if(!isValid) {\n            return;\n        }\n\n        const isDeleted = await props.onDelete();\n\n        if(isDeleted) {\n            await pop();\n        }\n    } catch(e) {\n        Toast.fromError(e).show();\n    } finally {\n        loading.value = false;\n    }\n}\n</script>\n","<template>\n    <SaveView :title=\"title\" :disabled=\"!hasChanges\" :loading=\"saving\" :deleting=\"deleting\" @save=\"save\" v-on=\"!isNew ? {delete: deleteMe} : {}\">\n        <h1>\n            {{ title }}\n        </h1>\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <div class=\"split-inputs\">\n            <STInputBox :title=\"$t('c0a0c0f7-1282-40be-85fc-320d136d34ab')\" error-fields=\"name\" :error-box=\"errors.errorBox\">\n                <input\n                    ref=\"firstInput\"\n                    v-model=\"name\"\n                    class=\"input\"\n                    type=\"text\"\n                    :placeholder=\"$t('c0a0c0f7-1282-40be-85fc-320d136d34ab')\"\n                    autocomplete=\"off\"\n                    enterkeyhint=\"next\"\n                >\n            </STInputBox>\n\n            <STInputBox v-if=\"platform.config.eventTypes.length\" title=\"Type\" error-fields=\"type\" :error-box=\"errors.errorBox\">\n                <Dropdown\n                    v-model=\"typeId\"\n                >\n                    <option v-for=\"t of platform.config.eventTypes\" :key=\"t.id\" :value=\"t.id\">\n                        {{ t.name }}\n                    </option>\n                </Dropdown>\n            </STInputBox>\n        </div>\n        <p v-if=\"type\" class=\"style-description-block\">\n            {{ type.description }}\n        </p>\n\n        <STInputBox :title=\"$t('561e9ebb-ae0c-48f3-a10d-921c2a59d5a4')\" error-fields=\"meta.description\" :error-box=\"errors.errorBox\" class=\"max\">\n            <WYSIWYGTextInput\n                v-model=\"description\"\n                :placeholder=\"$t('2cb56415-5e16-4a75-9012-8971be8dbc6a')\"\n            />\n        </STInputBox>\n\n        <STList>\n            <STListItem :selectable=\"true\" element-name=\"button\" @click=\"addRegistrations\">\n                <template #left>\n                    <span class=\"icon gray\" :class=\"patched.group ? 'edit' : 'add'\" />\n                </template>\n\n                <h3 class=\"style-title-list\">\n                    {{ patched.group ? $t('76eb7982-9fc5-490a-9414-42bb7f10b8d6') : $t('8c30c20d-b734-4ece-bca9-292d064c5028') }}\n                </h3>\n\n                <p class=\"style-description-small\">\n                    {{ $t('9210b13c-2699-4a7f-b173-a07bafd8a13b') }}\n                </p>\n            </STListItem>\n        </STList>\n\n        <hr>\n        <h2>{{ $t('112b7686-dffc-4ae9-9706-e3efcd34898f') }}</h2>\n\n        <Checkbox v-if=\"!type || (type.maximumDays !== 1 && (type.minimumDays ?? 1) <= 1)\" v-model=\"multipleDays\">\n            {{ $t('f001f5c4-f3ea-46c0-bd0c-0b30ad8098f5') }}\n        </Checkbox>\n\n        <div class=\"split-inputs\">\n            <STInputBox :title=\"multipleDays ? 'Startdatum' : 'Datum'\" error-fields=\"startDate\" :error-box=\"errors.errorBox\">\n                <DateSelection v-model=\"startDate\" />\n            </STInputBox>\n            <TimeInput v-if=\"multipleDays\" v-model=\"startDate\" :title=\"$t('5dd84548-b16f-415b-8dbd-d96aeecedc3e')\" :validator=\"errors.validator\" />\n        </div>\n\n        <div class=\"split-inputs\">\n            <STInputBox v-if=\"multipleDays || (type && type.minimumDays !== null && type.minimumDays > 1)\" title=\"Einddatum\" error-fields=\"endDate\" :error-box=\"errors.errorBox\">\n                <DateSelection v-model=\"endDate\" />\n            </STInputBox>\n            <TimeInput v-else v-model=\"startDate\" :title=\"$t('5dd84548-b16f-415b-8dbd-d96aeecedc3e')\" :validator=\"errors.validator\" />\n            <TimeInput v-model=\"endDate\" title=\"Tot\" :validator=\"errors.validator\" />\n        </div>\n\n        <hr>\n        <h2>Beschikbaarheid</h2>\n\n        <STList>\n            <STListItem v-if=\"canSetNationalActivity || isNationalActivity\" :selectable=\"true\" element-name=\"label\">\n                <template #left>\n                    <Checkbox v-model=\"isNationalActivity\" />\n                </template>\n\n                <h3 class=\"style-title-list\">\n                    {{ $t('d756277c-4655-4e92-afcc-ae3c9f615190') }}\n                </h3>\n            </STListItem>\n\n            <STListItem :selectable=\"true\" element-name=\"label\">\n                <template #left>\n                    <Checkbox v-model=\"visible\" />\n                </template>\n\n                <h3 class=\"style-title-list\">\n                    {{ $t('987c7ee6-8ee2-41d7-823e-db0ff590ea7d') }}\n                </h3>\n            </STListItem>\n        </STList>\n\n        <template v-if=\"canSetNationalActivity && externalOrganization\">\n            <hr>\n            <h2>{{ $t('113f3407-9b00-4e86-bedd-e61614e78a0b') }}</h2>\n            <p>{{ $t('2662a425-f996-479b-a1fc-8498f068ea97') }}</p>\n\n            <STList>\n                <STListItem v-if=\"externalOrganization\" :selectable=\"!organization\" @click=\"chooseOrganizer('Kies een organisator', canSelectOrganization)\">\n                    <template #left>\n                        <OrganizationAvatar :organization=\"externalOrganization\" />\n                    </template>\n\n                    <h3 class=\"style-title-list\">\n                        {{ externalOrganization.name }}\n                    </h3>\n\n                    <template v-if=\"!organization\" #right>\n                        <span class=\"icon arrow-right-small gray\" />\n                    </template>\n                </STListItem>\n            </STList>\n        </template>\n\n        <JumpToContainer :visible=\"isNationalActivity && organizationTagIds !== null\">\n            <hr>\n\n            <h2 class=\"style-with-button\">\n                <div>Regio</div>\n                <div>\n                    <button v-if=\"!hasTagRestrictions\" type=\"button\" class=\"button icon trash\" @click=\"deleteTagRestriction\" />\n                </div>\n            </h2>\n            <p>Kies voor welke groepen deze activiteit zichtbaar is.</p>\n\n            <TagIdsInput v-model=\"organizationTagIds\" :is-tag-enabled-predicate=\"isTagEnabledPredicate\" :validator=\"errors.validator\" />\n        </JumpToContainer>\n\n        <JumpToContainer :visible=\"defaultAgeGroupIds !== null\">\n            <hr>\n\n            <h2 class=\"style-with-button\">\n                <div>{{ $t('9af957c4-5dea-47ee-a30f-1ef5802a9437') }}</div>\n                <div>\n                    <button type=\"button\" class=\"button icon trash\" @click=\"deleteDefaultAgeGroupRestriction\" />\n                </div>\n            </h2>\n\n            <p>{{ $t('712c3597-d7c9-459c-9e92-ff32de445642') }}</p>\n\n            <DefaultAgeGroupIdsInput v-model=\"defaultAgeGroupIds\" :validator=\"errors.validator\" />\n        </JumpToContainer>\n\n        <JumpToContainer :visible=\"groups !== null\">\n            <hr>\n\n            <h2 class=\"style-with-button\">\n                <div>{{ $t('efeed776-7b4a-4f06-b755-04b1c615ff2d') }}</div>\n                <div>\n                    <button v-if=\"!hasGroupRestrictions\" type=\"button\" class=\"button icon trash\" @click=\"deleteGroupsRestriction\" />\n                </div>\n            </h2>\n\n            <p>{{ $t('248d7837-f7f1-48f9-a151-96e936cda4fc') }}</p>\n\n            <p v-if=\"!organization || !externalOrganization || externalOrganization?.id !== organization.id\" class=\"info-box\">\n                {{ $t('fb25250b-2b50-4fb4-babc-020b9fe80dfc') }}\n            </p>\n            <GroupsInput v-else v-model=\"groups\" :date=\"startDate\" :is-group-enabled-operator=\"isGroupEnabledOperator\" />\n        </JumpToContainer>\n\n        <JumpToContainer :visible=\"!!location\">\n            <hr>\n            <h2 class=\"style-with-button\">\n                <div>{{ $t('8922afd5-4566-4998-9c6f-d7a6143f29a2') }}</div>\n                <div>\n                    <button type=\"button\" class=\"button icon trash\" @click=\"deleteLocation\" />\n                </div>\n            </h2>\n\n            <STInputBox :title=\"$t('3db5bf3f-3eb5-4cfc-ba9b-429fab43c540')\" error-fields=\"location.name\" :error-box=\"errors.errorBox\">\n                <input\n                    ref=\"firstInput\"\n                    v-model=\"locationName\"\n                    class=\"input\"\n                    type=\"text\"\n                    placeholder=\"bv. Gemeentelijke feestzaal\"\n                    autocomplete=\"off\"\n                    enterkeyhint=\"next\"\n                >\n            </STInputBox>\n\n            <AddressInput v-model=\"locationAddress\" title=\"Adres (optioneel)\" :nullable=\"true\" :required=\"isLocationRequired\" :validator=\"errors.validator\" />\n        </JumpToContainer>\n\n        <JumpToContainer :visible=\"!!coverPhoto\">\n            <hr>\n            <h2 class=\"style-with-button\">\n                <div>{{ $t('17d579e1-518b-4dd4-98d8-f8184b7287be') }}</div>\n                <div>\n                    <button v-if=\"coverPhoto\" type=\"button\" class=\"button text only-icon-smartphone\" @click=\"coverPhoto = null\">\n                        <span class=\"icon trash\" />\n                        <span>{{ $t('ffef2405-f472-416b-b8fa-372fdf694797') }}</span>\n                    </button>\n                    <UploadButton v-model=\"coverPhoto\" :text=\"coverPhoto ? 'Vervangen' : 'Uploaden'\" :resolutions=\"resolutions\" />\n                </div>\n            </h2>\n\n            <ImageComponent :image=\"coverPhoto\" :auto-height=\"true\" />\n        </JumpToContainer>\n\n        <hr>\n\n        <STList>\n            <STListItem v-if=\"defaultAgeGroupIds === null && isNationalActivity\" :selectable=\"true\" element-name=\"button\" @click=\"addDefaultAgeGroupRestriction\">\n                <template #left>\n                    <span class=\"icon add gray\" />\n                </template>\n\n                <h3 class=\"style-title-list\">\n                    {{ $t('5283efe2-f4a8-4c3b-8cbc-7cf2acf16da0') }}\n                </h3>\n            </STListItem>\n\n            <STListItem v-if=\"!isNationalActivity && externalOrganization && organization && organization.id === externalOrganization.id && groups === null && !hasGroupRestrictions\" :selectable=\"true\" element-name=\"button\" @click=\"addGroupsRestriction\">\n                <template #left>\n                    <span class=\"icon add gray\" />\n                </template>\n\n                <h3 class=\"style-title-list\">\n                    {{ $t('97bfc084-7f4f-4e4f-a187-48703d42c7be') }}\n                </h3>\n            </STListItem>\n\n            <STListItem v-if=\"isNationalActivity && organizationTagIds === null\" :selectable=\"true\" element-name=\"button\" @click=\"addTagRestriction\">\n                <template #left>\n                    <span class=\"icon add gray\" />\n                </template>\n\n                <h3 class=\"style-title-list\">\n                    {{ $t('5ba7cf31-0cee-4599-9086-ae864b09f441') }}\n                </h3>\n            </STListItem>\n\n            <STListItem v-if=\"!location\" :selectable=\"true\" element-name=\"button\" @click=\"addLocation\">\n                <template #left>\n                    <span class=\"icon location gray\" />\n                </template>\n\n                <h3 class=\"style-title-list\">\n                    {{ $t('b735b655-5037-4b7c-90d2-711ac066c194') }}\n                </h3>\n            </STListItem>\n\n            <STListItem v-if=\"!coverPhoto\" :selectable=\"true\" element-name=\"label\" class=\"button\">\n                <template #left>\n                    <span class=\"icon camera gray\" />\n                </template>\n\n                <UploadButton v-model=\"coverPhoto\" :resolutions=\"resolutions\" element-name=\"div\">\n                    <h3 class=\"style-title-list\">\n                        {{ $t('9448b5c3-579e-48c4-a4a4-2d8d0e6210b8') }}\n                    </h3>\n                </UploadButton>\n            </STListItem>\n        </STList>\n    </SaveView>\n</template>\n\n<script setup lang=\"ts\">\nimport { ArrayDecoder, AutoEncoderPatchType, Decoder, deepSetArray, PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { ComponentWithProperties, NavigationController, usePop, usePresent } from '@simonbackx/vue-app-navigation';\nimport { AddressInput, CenteredMessage, DateSelection, Dropdown, EditGroupView, ErrorBox, GlobalEventBus, ImageComponent, NavigationActions, OrganizationAvatar, TagIdsInput, TimeInput, Toast, UploadButton, useAppContext, useExternalOrganization, WYSIWYGTextInput } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { AccessRight, Event, EventLocation, EventMeta, Group, GroupSettings, GroupType, Organization, ResolutionRequest } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed, ref, watch, watchEffect } from 'vue';\nimport JumpToContainer from '../containers/JumpToContainer.vue';\nimport { useErrors } from '../errors/useErrors';\nimport { useAuth, useContext, useOrganization, usePatch, usePlatform } from '../hooks';\nimport DefaultAgeGroupIdsInput from '../inputs/DefaultAgeGroupIdsInput.vue';\nimport GroupsInput from '../inputs/GroupsInput.vue';\nimport SearchOrganizationView from '../members/SearchOrganizationView.vue';\nimport DeleteView from '../views/DeleteView.vue';\nimport { useEventPermissions } from './composables/useEventPermissions';\n\nconst props = withDefaults(\n    defineProps<{\n        isNew: boolean;\n        event: Event;\n        callback?: (() => void) | null;\n    }>(),\n    {\n        callback: null,\n    },\n);\n\nconst errors = useErrors();\nconst { hasChanges, patched, addPatch, patch } = usePatch(props.event);\nconst title = computed(() => props.isNew ? 'Activiteit toevoegen' : 'Activiteit bewerken');\nconst saving = ref(false);\nconst deleting = ref(false);\nconst $t = useTranslate();\nconst context = useContext();\nconst pop = usePop();\nconst organization = useOrganization();\nconst present = usePresent();\nconst platform = usePlatform();\nconst eventPermissions = useEventPermissions();\n\nconst { externalOrganization, choose: chooseOrganizer } = useExternalOrganization(\n    computed({\n        get: () => patched.value.organizationId,\n        set: organizationId => addPatch({\n            organizationId,\n        }),\n    }),\n);\n\nconst type = computed(() => {\n    const type = platform.value.config.eventTypes.find(e => e.id === patched.value.typeId);\n    return type ?? null;\n});\n\nconst isLocationRequired = computed(() => type.value?.isLocationRequired ?? false);\n\nconst multipleDays = computed({\n    get: () => {\n        return Formatter.dateNumber(patched.value.startDate, true) !== Formatter.dateNumber(patched.value.endDate, true);\n    },\n    set: (md) => {\n        if (md === multipleDays.value) {\n            return;\n        }\n        if (md) {\n            const d = new Date(endDate.value);\n            d.setDate(startDate.value.getDate() + (Math.max(2, type.value?.minimumDays || 2) - 1));\n            endDate.value = d;\n        }\n        else {\n            const d = new Date(endDate.value);\n            d.setFullYear(startDate.value.getFullYear());\n            d.setMonth(startDate.value.getMonth());\n            d.setDate(startDate.value.getDate());\n            endDate.value = d;\n        }\n    },\n});\n\n// Auto correct invalid types\nwatchEffect(() => {\n    const t = type.value;\n    if (!t) {\n        if (platform.value.config.eventTypes.length) {\n            addPatch({ typeId: platform.value.config.eventTypes[0].id });\n        }\n        return;\n    }\n\n    if (t.minimumDays !== null && t.minimumDays > 1 && !multipleDays.value) {\n        multipleDays.value = true;\n    }\n\n    if (t.maximumDays === 1 && multipleDays.value) {\n        multipleDays.value = false;\n    }\n});\n\nconst name = computed({\n    get: () => patched.value.name,\n    set: name => addPatch({ name }),\n});\n\nconst startDate = computed({\n    get: () => patched.value.startDate,\n    set: (startDate) => {\n        const wasMultipleDays = multipleDays.value;\n        addPatch({ startDate });\n\n        if (!wasMultipleDays) {\n            // Makse sure end date remains same date\n            const d = new Date(endDate.value);\n            d.setFullYear(startDate.getFullYear());\n            d.setMonth(startDate.getMonth());\n            d.setDate(startDate.getDate());\n            endDate.value = d;\n        }\n    },\n});\n\nconst endDate = computed({\n    get: () => patched.value.endDate,\n    set: endDate => addPatch({ endDate }),\n});\n\nconst typeId = computed({\n    get: () => patched.value.typeId,\n    set: typeId => addPatch({ typeId }),\n});\n\nconst organizationTagIds = computed({\n    get: () => patched.value.meta.organizationTagIds,\n    set: organizationTagIds =>\n        addPatch({\n            meta: EventMeta.patch({\n                organizationTagIds: organizationTagIds as any,\n            }),\n        }),\n});\n\nconst defaultAgeGroupIds = computed({\n    get: () => patched.value.meta.defaultAgeGroupIds,\n    set: defaultAgeGroupIds =>\n        addPatch({\n            meta: EventMeta.patch({\n                defaultAgeGroupIds: defaultAgeGroupIds as any,\n            }),\n        }),\n});\n\nconst groups = computed({\n    get: () => patched.value.meta.groups,\n    set: groups =>\n        addPatch({\n            meta: EventMeta.patch({\n                groups: groups as any,\n            }),\n        }),\n});\n\nconst location = computed({\n    get: () => patched.value.meta.location,\n    set: location =>\n        addPatch({\n            meta: EventMeta.patch({\n                location,\n            }),\n        }),\n});\n\nconst coverPhoto = computed({\n    get: () => patched.value.meta.coverPhoto,\n    set: coverPhoto =>\n        addPatch({\n            meta: EventMeta.patch({\n                coverPhoto,\n            }),\n        }),\n});\n\nconst locationName = computed({\n    get: () => location.value?.name ?? '',\n    set: (name) => {\n        if (location.value) {\n            addPatch({\n                meta: EventMeta.patch({\n                    location: EventLocation.patch({\n                        name,\n                    }),\n                }),\n            });\n        }\n    },\n});\n\nconst locationAddress = computed({\n    get: () => location.value?.address ?? null,\n    set: (address) => {\n        if (location.value) {\n            addPatch({\n                meta: EventMeta.patch({\n                    location: EventLocation.patch({\n                        address,\n                    }),\n                }),\n            });\n        }\n    },\n});\n\nconst auth = useAuth();\nconst canSetNationalActivity = computed(() => auth.platformPermissions?.hasAccessRight(AccessRight.EventWrite));\nconst isNationalActivity = computed({\n    get: () => patched.value.organizationId === null,\n    set: (isNationalActivity) => {\n        if (isNationalActivity) {\n            addPatch({\n                organizationId: null,\n            });\n        }\n        else {\n            const organizationId = props.event.organizationId || organization.value?.id;\n\n            if (!organizationId) {\n                chooseOrganizer('Kies een organisator', canSelectOrganization).catch(console.error);\n                return;\n            }\n            addPatch({\n                organizationId,\n            });\n        }\n    },\n});\n\nconst description = computed({\n    get: () => patched.value.meta.description,\n    set: description => addPatch({\n        meta: EventMeta.patch({\n            description,\n        }),\n    }),\n});\n\nconst visible = computed({\n    get: () => patched.value.meta.visible,\n    set: visible => addPatch({\n        meta: EventMeta.patch({\n            visible,\n        }),\n    }),\n});\n\nconst hasGroupRestrictions = computed(() => !isNationalActivity.value && organization.value && !eventPermissions.canWriteAllGroupEvents());\nconst hasTagRestrictions = computed(() => isNationalActivity.value && !eventPermissions.canWriteAllTagEvents());\n\nwatch(hasGroupRestrictions, (hasGroupRestrictions) => {\n    if (hasGroupRestrictions && groups.value === null) {\n        addGroupsRestriction();\n    }\n}, { immediate: true });\n\nwatch(hasTagRestrictions, (hasTagRestrictions) => {\n    if (hasTagRestrictions) {\n        if (organizationTagIds.value === null) {\n            addTagRestriction();\n        }\n    }\n    else if (organizationTagIds.value?.length === 0) {\n        deleteTagRestriction();\n    }\n}, { immediate: true });\n\nconst isGroupEnabledOperator = computed(() => {\n    if (!hasGroupRestrictions.value) {\n        return undefined;\n    }\n\n    return eventPermissions.isGroupEnabledOperatorFactory();\n});\n\nconst isTagEnabledPredicate = computed(() => {\n    if (!hasTagRestrictions.value) {\n        return undefined;\n    }\n\n    return eventPermissions.isTagEnabledPredicateFactory();\n});\n\nconst canSelectOrganization = (o: Organization) => {\n    const result = eventPermissions.canAdminEventForExternalOrganization(o);\n    if (!result) {\n        Toast.error($t('43ff8e32-1a0b-41cf-b9a6-8e4c85d12739'))\n            .show();\n        return false;\n    }\n\n    if (organization.value && o.id !== organization.value.id) {\n        Toast.error($t('13a4b7fa-7de6-497e-9e7c-6aee4f783260'))\n            .show();\n        return false;\n    }\n\n    return true;\n};\n\nconst resolutions = [\n    ResolutionRequest.create({\n        width: 1200,\n    }),\n    ResolutionRequest.create({\n        width: 600,\n    }),\n    ResolutionRequest.create({\n        width: 300,\n    }),\n    ResolutionRequest.create({\n        width: 100,\n    }),\n];\n\nfunction addLocation() {\n    location.value = EventLocation.create({});\n}\n\nfunction deleteLocation() {\n    location.value = null;\n}\n\nfunction addDefaultAgeGroupRestriction() {\n    defaultAgeGroupIds.value = [];\n}\n\nfunction addGroupsRestriction() {\n    groups.value = [];\n}\n\nfunction deleteDefaultAgeGroupRestriction() {\n    defaultAgeGroupIds.value = null;\n}\n\nfunction deleteGroupsRestriction() {\n    groups.value = null;\n}\n\nfunction addTagRestriction() {\n    organizationTagIds.value = [];\n}\n\nfunction deleteTagRestriction() {\n    organizationTagIds.value = null;\n}\n\nasync function save() {\n    if (saving.value) {\n        return;\n    }\n\n    errors.errorBox = null;\n\n    saving.value = true;\n\n    if (!await errors.validator.validate()) {\n        saving.value = false;\n        return;\n    }\n\n    try {\n        // #region validate location\n        if (isLocationRequired.value) {\n            if (!location.value) {\n                throw new SimpleError({\n                    code: 'invalid_field',\n                    message: 'De locatie is verplicht voor deze soort activiteit.',\n                    field: 'event_required',\n                });\n            }\n        }\n\n        if (patched.value.meta.groups !== null && patched.value.meta.groups?.length === 0) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Kies minstens één leeftijdsgroep.',\n            });\n        }\n        // #endregion\n\n        const arr = new PatchableArray() as PatchableArrayAutoEncoder<Event>;\n\n        if (props.isNew) {\n            arr.addPut(patched.value);\n        }\n        else {\n            arr.addPatch(patch.value);\n        }\n\n        const response = await context.value.authenticatedServer.request({\n            method: 'PATCH',\n            path: '/events',\n            body: arr,\n            decoder: new ArrayDecoder(Event as Decoder<Event>),\n        });\n\n        Toast.success($t('dced31f7-3554-425d-bae9-85416e3742d6')).show();\n\n        // Make sure original event is patched\n        deepSetArray([props.event], response.data);\n\n        props.callback?.();\n\n        await pop({ force: true });\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n\n    saving.value = false;\n}\n\nasync function addRegistrations() {\n    if (patched.value.group) {\n        // Edit the group\n        await present({\n            components: [\n                new ComponentWithProperties(EditGroupView, {\n                    group: patched.value.group,\n                    isMultiOrganization: isNationalActivity.value,\n                    isNew: false,\n                    showToasts: false,\n                    saveHandler: (patch: AutoEncoderPatchType<Group>) => {\n                        addPatch({\n                            group: patch,\n                        });\n                    },\n                    deleteHandler: async () => {\n                        addPatch({\n                            group: null,\n                        });\n                    },\n                }),\n            ],\n            modalDisplayStyle: 'popup',\n        });\n    }\n    else {\n        const organizationId = patched.value.organizationId ?? organization.value?.id ?? '';\n        const group = Group.create({\n            organizationId,\n            periodId: externalOrganization.value?.period.period.id ?? organization.value?.period.period.id,\n            type: GroupType.EventRegistration,\n            settings: GroupSettings.create({\n                name: patched.value.name,\n                allowRegistrationsByOrganization: isNationalActivity.value,\n            }),\n        });\n\n        if (!organizationId) {\n            // Kies een organisator\n            await present({\n                components: [\n                    new ComponentWithProperties(NavigationController, {\n                        root: new ComponentWithProperties(SearchOrganizationView, {\n                            title: $t('67967405-d320-4d40-8dc0-889915da1f34'),\n                            description: $t('2e5e052c-98b7-4375-b771-05a8913c145b'),\n                            selectOrganization: async (organization: Organization, navigation: NavigationActions) => {\n                                group.organizationId = organization.id;\n                                group.periodId = organization.period.period.id;\n                                await navigation.show({\n                                    force: true,\n                                    replace: 1,\n                                    components: [\n                                        new ComponentWithProperties(EditGroupView, {\n                                            group: group,\n                                            isNew: true,\n                                            isMultiOrganization: isNationalActivity.value,\n                                            showToasts: false,\n                                            organizationHint: organization,\n                                            saveHandler: (patch: AutoEncoderPatchType<Group>) => {\n                                                addPatch({\n                                                    group: group.patch(patch),\n                                                });\n                                            },\n                                        }),\n                                    ],\n                                });\n                            },\n                        }),\n                    }),\n                ],\n                modalDisplayStyle: 'popup',\n            });\n            return;\n        }\n\n        // Edit the group\n        await present({\n            components: [\n                new ComponentWithProperties(EditGroupView, {\n                    group: group,\n                    isNew: true,\n                    isMultiOrganization: isNationalActivity.value,\n                    organizationHint: externalOrganization.value,\n                    showToasts: false,\n                    saveHandler: (patch: AutoEncoderPatchType<Group>) => {\n                        addPatch({\n                            group: group.patch(patch),\n                        });\n                    },\n                }),\n            ],\n            modalDisplayStyle: 'popup',\n        });\n    }\n}\n\nasync function deleteMe() {\n    if (saving.value || deleting.value) {\n        return;\n    }\n\n    const confirmationCode = name.value;\n\n    await present({\n        components: [\n            new ComponentWithProperties(DeleteView, {\n                title: $t('14a63393-32e4-448b-8cb5-aa0e0629667b'),\n                description: $t('52312517-de77-4dd5-8c77-cef97c573578'),\n                confirmationTitle: $t('b584fc1c-6b13-442b-b2cc-f59e39fea6e7'),\n                confirmationPlaceholder: $t('deb2a251-2eab-4132-849e-6b1a8bc87300'),\n                confirmationCode,\n                checkboxText: $t('4a1ad6f2-d061-4fe0-8206-8540442ad038'),\n                onDelete: async () => {\n                    deleting.value = true;\n\n                    try {\n                        const arr = new PatchableArray() as PatchableArrayAutoEncoder<Event>;\n                        arr.addDelete(props.event.id);\n\n                        await context.value.authenticatedServer.request({\n                            method: 'PATCH',\n                            path: '/events',\n                            body: arr,\n                            decoder: new ArrayDecoder(Event as Decoder<Event>),\n                        });\n\n                        GlobalEventBus.sendEvent('event-deleted', props.event).catch(console.error);\n\n                        Toast.success($t('50df35d9-992f-4697-9150-aa8643ee4f18')).show();\n                        props.callback?.();\n                        await pop({ force: true });\n                    }\n                    catch (e) {\n                        errors.errorBox = new ErrorBox(e);\n                    }\n\n                    return true;\n                },\n            }),\n        ],\n        modalDisplayStyle: 'sheet',\n    });\n}\n\nconst shouldNavigateAway = async () => {\n    if (!hasChanges.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm($t('996a4109-5524-4679-8d17-6968282a2a75'), $t('106b3169-6336-48b8-8544-4512d42c4fd6'));\n};\n\ndefineExpose({\n    shouldNavigateAway,\n});\n\n</script>\n","export default import.meta.ROLLUP_FILE_URL_C3JYjjT3;","export default import.meta.ROLLUP_FILE_URL_S4TktFj7;","export default import.meta.ROLLUP_FILE_URL_BlFTbbG_;","// ::- Persistent data structure representing an ordered mapping from\n// strings to values, with some convenient update methods.\nfunction OrderedMap(content) {\n  this.content = content;\n}\n\nOrderedMap.prototype = {\n  constructor: OrderedMap,\n\n  find: function(key) {\n    for (var i = 0; i < this.content.length; i += 2)\n      if (this.content[i] === key) return i\n    return -1\n  },\n\n  // :: (string) → ?any\n  // Retrieve the value stored under `key`, or return undefined when\n  // no such key exists.\n  get: function(key) {\n    var found = this.find(key);\n    return found == -1 ? undefined : this.content[found + 1]\n  },\n\n  // :: (string, any, ?string) → OrderedMap\n  // Create a new map by replacing the value of `key` with a new\n  // value, or adding a binding to the end of the map. If `newKey` is\n  // given, the key of the binding will be replaced with that key.\n  update: function(key, value, newKey) {\n    var self = newKey && newKey != key ? this.remove(newKey) : this;\n    var found = self.find(key), content = self.content.slice();\n    if (found == -1) {\n      content.push(newKey || key, value);\n    } else {\n      content[found + 1] = value;\n      if (newKey) content[found] = newKey;\n    }\n    return new OrderedMap(content)\n  },\n\n  // :: (string) → OrderedMap\n  // Return a map with the given key removed, if it existed.\n  remove: function(key) {\n    var found = this.find(key);\n    if (found == -1) return this\n    var content = this.content.slice();\n    content.splice(found, 2);\n    return new OrderedMap(content)\n  },\n\n  // :: (string, any) → OrderedMap\n  // Add a new key to the start of the map.\n  addToStart: function(key, value) {\n    return new OrderedMap([key, value].concat(this.remove(key).content))\n  },\n\n  // :: (string, any) → OrderedMap\n  // Add a new key to the end of the map.\n  addToEnd: function(key, value) {\n    var content = this.remove(key).content.slice();\n    content.push(key, value);\n    return new OrderedMap(content)\n  },\n\n  // :: (string, string, any) → OrderedMap\n  // Add a key after the given key. If `place` is not found, the new\n  // key is added to the end.\n  addBefore: function(place, key, value) {\n    var without = this.remove(key), content = without.content.slice();\n    var found = without.find(place);\n    content.splice(found == -1 ? content.length : found, 0, key, value);\n    return new OrderedMap(content)\n  },\n\n  // :: ((key: string, value: any))\n  // Call the given function for each key/value pair in the map, in\n  // order.\n  forEach: function(f) {\n    for (var i = 0; i < this.content.length; i += 2)\n      f(this.content[i], this.content[i + 1]);\n  },\n\n  // :: (union<Object, OrderedMap>) → OrderedMap\n  // Create a new map by prepending the keys in this map that don't\n  // appear in `map` before the keys in `map`.\n  prepend: function(map) {\n    map = OrderedMap.from(map);\n    if (!map.size) return this\n    return new OrderedMap(map.content.concat(this.subtract(map).content))\n  },\n\n  // :: (union<Object, OrderedMap>) → OrderedMap\n  // Create a new map by appending the keys in this map that don't\n  // appear in `map` after the keys in `map`.\n  append: function(map) {\n    map = OrderedMap.from(map);\n    if (!map.size) return this\n    return new OrderedMap(this.subtract(map).content.concat(map.content))\n  },\n\n  // :: (union<Object, OrderedMap>) → OrderedMap\n  // Create a map containing all the keys in this map that don't\n  // appear in `map`.\n  subtract: function(map) {\n    var result = this;\n    map = OrderedMap.from(map);\n    for (var i = 0; i < map.content.length; i += 2)\n      result = result.remove(map.content[i]);\n    return result\n  },\n\n  // :: () → Object\n  // Turn ordered map into a plain object.\n  toObject: function() {\n    var result = {};\n    this.forEach(function(key, value) { result[key] = value; });\n    return result\n  },\n\n  // :: number\n  // The amount of keys in this map.\n  get size() {\n    return this.content.length >> 1\n  }\n};\n\n// :: (?union<Object, OrderedMap>) → OrderedMap\n// Return a map with the given content. If null, create an empty\n// map. If given an ordered map, return that map itself. If given an\n// object, create a map from the object's properties.\nOrderedMap.from = function(value) {\n  if (value instanceof OrderedMap) return value\n  var content = [];\n  if (value) for (var prop in value) content.push(prop, value[prop]);\n  return new OrderedMap(content)\n};\n\nexport default OrderedMap;\n","import OrderedMap from 'orderedmap';\n\nfunction findDiffStart(a, b, pos) {\n    for (let i = 0;; i++) {\n        if (i == a.childCount || i == b.childCount)\n            return a.childCount == b.childCount ? null : pos;\n        let childA = a.child(i), childB = b.child(i);\n        if (childA == childB) {\n            pos += childA.nodeSize;\n            continue;\n        }\n        if (!childA.sameMarkup(childB))\n            return pos;\n        if (childA.isText && childA.text != childB.text) {\n            for (let j = 0; childA.text[j] == childB.text[j]; j++)\n                pos++;\n            return pos;\n        }\n        if (childA.content.size || childB.content.size) {\n            let inner = findDiffStart(childA.content, childB.content, pos + 1);\n            if (inner != null)\n                return inner;\n        }\n        pos += childA.nodeSize;\n    }\n}\nfunction findDiffEnd(a, b, posA, posB) {\n    for (let iA = a.childCount, iB = b.childCount;;) {\n        if (iA == 0 || iB == 0)\n            return iA == iB ? null : { a: posA, b: posB };\n        let childA = a.child(--iA), childB = b.child(--iB), size = childA.nodeSize;\n        if (childA == childB) {\n            posA -= size;\n            posB -= size;\n            continue;\n        }\n        if (!childA.sameMarkup(childB))\n            return { a: posA, b: posB };\n        if (childA.isText && childA.text != childB.text) {\n            let same = 0, minSize = Math.min(childA.text.length, childB.text.length);\n            while (same < minSize && childA.text[childA.text.length - same - 1] == childB.text[childB.text.length - same - 1]) {\n                same++;\n                posA--;\n                posB--;\n            }\n            return { a: posA, b: posB };\n        }\n        if (childA.content.size || childB.content.size) {\n            let inner = findDiffEnd(childA.content, childB.content, posA - 1, posB - 1);\n            if (inner)\n                return inner;\n        }\n        posA -= size;\n        posB -= size;\n    }\n}\n\n/**\nA fragment represents a node's collection of child nodes.\n\nLike nodes, fragments are persistent data structures, and you\nshould not mutate them or their content. Rather, you create new\ninstances whenever needed. The API tries to make this easy.\n*/\nclass Fragment {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    @internal\n    */\n    content, size) {\n        this.content = content;\n        this.size = size || 0;\n        if (size == null)\n            for (let i = 0; i < content.length; i++)\n                this.size += content[i].nodeSize;\n    }\n    /**\n    Invoke a callback for all descendant nodes between the given two\n    positions (relative to start of this fragment). Doesn't descend\n    into a node when the callback returns `false`.\n    */\n    nodesBetween(from, to, f, nodeStart = 0, parent) {\n        for (let i = 0, pos = 0; pos < to; i++) {\n            let child = this.content[i], end = pos + child.nodeSize;\n            if (end > from && f(child, nodeStart + pos, parent || null, i) !== false && child.content.size) {\n                let start = pos + 1;\n                child.nodesBetween(Math.max(0, from - start), Math.min(child.content.size, to - start), f, nodeStart + start);\n            }\n            pos = end;\n        }\n    }\n    /**\n    Call the given callback for every descendant node. `pos` will be\n    relative to the start of the fragment. The callback may return\n    `false` to prevent traversal of a given node's children.\n    */\n    descendants(f) {\n        this.nodesBetween(0, this.size, f);\n    }\n    /**\n    Extract the text between `from` and `to`. See the same method on\n    [`Node`](https://prosemirror.net/docs/ref/#model.Node.textBetween).\n    */\n    textBetween(from, to, blockSeparator, leafText) {\n        let text = \"\", first = true;\n        this.nodesBetween(from, to, (node, pos) => {\n            let nodeText = node.isText ? node.text.slice(Math.max(from, pos) - pos, to - pos)\n                : !node.isLeaf ? \"\"\n                    : leafText ? (typeof leafText === \"function\" ? leafText(node) : leafText)\n                        : node.type.spec.leafText ? node.type.spec.leafText(node)\n                            : \"\";\n            if (node.isBlock && (node.isLeaf && nodeText || node.isTextblock) && blockSeparator) {\n                if (first)\n                    first = false;\n                else\n                    text += blockSeparator;\n            }\n            text += nodeText;\n        }, 0);\n        return text;\n    }\n    /**\n    Create a new fragment containing the combined content of this\n    fragment and the other.\n    */\n    append(other) {\n        if (!other.size)\n            return this;\n        if (!this.size)\n            return other;\n        let last = this.lastChild, first = other.firstChild, content = this.content.slice(), i = 0;\n        if (last.isText && last.sameMarkup(first)) {\n            content[content.length - 1] = last.withText(last.text + first.text);\n            i = 1;\n        }\n        for (; i < other.content.length; i++)\n            content.push(other.content[i]);\n        return new Fragment(content, this.size + other.size);\n    }\n    /**\n    Cut out the sub-fragment between the two given positions.\n    */\n    cut(from, to = this.size) {\n        if (from == 0 && to == this.size)\n            return this;\n        let result = [], size = 0;\n        if (to > from)\n            for (let i = 0, pos = 0; pos < to; i++) {\n                let child = this.content[i], end = pos + child.nodeSize;\n                if (end > from) {\n                    if (pos < from || end > to) {\n                        if (child.isText)\n                            child = child.cut(Math.max(0, from - pos), Math.min(child.text.length, to - pos));\n                        else\n                            child = child.cut(Math.max(0, from - pos - 1), Math.min(child.content.size, to - pos - 1));\n                    }\n                    result.push(child);\n                    size += child.nodeSize;\n                }\n                pos = end;\n            }\n        return new Fragment(result, size);\n    }\n    /**\n    @internal\n    */\n    cutByIndex(from, to) {\n        if (from == to)\n            return Fragment.empty;\n        if (from == 0 && to == this.content.length)\n            return this;\n        return new Fragment(this.content.slice(from, to));\n    }\n    /**\n    Create a new fragment in which the node at the given index is\n    replaced by the given node.\n    */\n    replaceChild(index, node) {\n        let current = this.content[index];\n        if (current == node)\n            return this;\n        let copy = this.content.slice();\n        let size = this.size + node.nodeSize - current.nodeSize;\n        copy[index] = node;\n        return new Fragment(copy, size);\n    }\n    /**\n    Create a new fragment by prepending the given node to this\n    fragment.\n    */\n    addToStart(node) {\n        return new Fragment([node].concat(this.content), this.size + node.nodeSize);\n    }\n    /**\n    Create a new fragment by appending the given node to this\n    fragment.\n    */\n    addToEnd(node) {\n        return new Fragment(this.content.concat(node), this.size + node.nodeSize);\n    }\n    /**\n    Compare this fragment to another one.\n    */\n    eq(other) {\n        if (this.content.length != other.content.length)\n            return false;\n        for (let i = 0; i < this.content.length; i++)\n            if (!this.content[i].eq(other.content[i]))\n                return false;\n        return true;\n    }\n    /**\n    The first child of the fragment, or `null` if it is empty.\n    */\n    get firstChild() { return this.content.length ? this.content[0] : null; }\n    /**\n    The last child of the fragment, or `null` if it is empty.\n    */\n    get lastChild() { return this.content.length ? this.content[this.content.length - 1] : null; }\n    /**\n    The number of child nodes in this fragment.\n    */\n    get childCount() { return this.content.length; }\n    /**\n    Get the child node at the given index. Raise an error when the\n    index is out of range.\n    */\n    child(index) {\n        let found = this.content[index];\n        if (!found)\n            throw new RangeError(\"Index \" + index + \" out of range for \" + this);\n        return found;\n    }\n    /**\n    Get the child node at the given index, if it exists.\n    */\n    maybeChild(index) {\n        return this.content[index] || null;\n    }\n    /**\n    Call `f` for every child node, passing the node, its offset\n    into this parent node, and its index.\n    */\n    forEach(f) {\n        for (let i = 0, p = 0; i < this.content.length; i++) {\n            let child = this.content[i];\n            f(child, p, i);\n            p += child.nodeSize;\n        }\n    }\n    /**\n    Find the first position at which this fragment and another\n    fragment differ, or `null` if they are the same.\n    */\n    findDiffStart(other, pos = 0) {\n        return findDiffStart(this, other, pos);\n    }\n    /**\n    Find the first position, searching from the end, at which this\n    fragment and the given fragment differ, or `null` if they are\n    the same. Since this position will not be the same in both\n    nodes, an object with two separate positions is returned.\n    */\n    findDiffEnd(other, pos = this.size, otherPos = other.size) {\n        return findDiffEnd(this, other, pos, otherPos);\n    }\n    /**\n    Find the index and inner offset corresponding to a given relative\n    position in this fragment. The result object will be reused\n    (overwritten) the next time the function is called. @internal\n    */\n    findIndex(pos, round = -1) {\n        if (pos == 0)\n            return retIndex(0, pos);\n        if (pos == this.size)\n            return retIndex(this.content.length, pos);\n        if (pos > this.size || pos < 0)\n            throw new RangeError(`Position ${pos} outside of fragment (${this})`);\n        for (let i = 0, curPos = 0;; i++) {\n            let cur = this.child(i), end = curPos + cur.nodeSize;\n            if (end >= pos) {\n                if (end == pos || round > 0)\n                    return retIndex(i + 1, end);\n                return retIndex(i, curPos);\n            }\n            curPos = end;\n        }\n    }\n    /**\n    Return a debugging string that describes this fragment.\n    */\n    toString() { return \"<\" + this.toStringInner() + \">\"; }\n    /**\n    @internal\n    */\n    toStringInner() { return this.content.join(\", \"); }\n    /**\n    Create a JSON-serializeable representation of this fragment.\n    */\n    toJSON() {\n        return this.content.length ? this.content.map(n => n.toJSON()) : null;\n    }\n    /**\n    Deserialize a fragment from its JSON representation.\n    */\n    static fromJSON(schema, value) {\n        if (!value)\n            return Fragment.empty;\n        if (!Array.isArray(value))\n            throw new RangeError(\"Invalid input for Fragment.fromJSON\");\n        return new Fragment(value.map(schema.nodeFromJSON));\n    }\n    /**\n    Build a fragment from an array of nodes. Ensures that adjacent\n    text nodes with the same marks are joined together.\n    */\n    static fromArray(array) {\n        if (!array.length)\n            return Fragment.empty;\n        let joined, size = 0;\n        for (let i = 0; i < array.length; i++) {\n            let node = array[i];\n            size += node.nodeSize;\n            if (i && node.isText && array[i - 1].sameMarkup(node)) {\n                if (!joined)\n                    joined = array.slice(0, i);\n                joined[joined.length - 1] = node\n                    .withText(joined[joined.length - 1].text + node.text);\n            }\n            else if (joined) {\n                joined.push(node);\n            }\n        }\n        return new Fragment(joined || array, size);\n    }\n    /**\n    Create a fragment from something that can be interpreted as a\n    set of nodes. For `null`, it returns the empty fragment. For a\n    fragment, the fragment itself. For a node or array of nodes, a\n    fragment containing those nodes.\n    */\n    static from(nodes) {\n        if (!nodes)\n            return Fragment.empty;\n        if (nodes instanceof Fragment)\n            return nodes;\n        if (Array.isArray(nodes))\n            return this.fromArray(nodes);\n        if (nodes.attrs)\n            return new Fragment([nodes], nodes.nodeSize);\n        throw new RangeError(\"Can not convert \" + nodes + \" to a Fragment\" +\n            (nodes.nodesBetween ? \" (looks like multiple versions of prosemirror-model were loaded)\" : \"\"));\n    }\n}\n/**\nAn empty fragment. Intended to be reused whenever a node doesn't\ncontain anything (rather than allocating a new empty fragment for\neach leaf node).\n*/\nFragment.empty = new Fragment([], 0);\nconst found = { index: 0, offset: 0 };\nfunction retIndex(index, offset) {\n    found.index = index;\n    found.offset = offset;\n    return found;\n}\n\nfunction compareDeep(a, b) {\n    if (a === b)\n        return true;\n    if (!(a && typeof a == \"object\") ||\n        !(b && typeof b == \"object\"))\n        return false;\n    let array = Array.isArray(a);\n    if (Array.isArray(b) != array)\n        return false;\n    if (array) {\n        if (a.length != b.length)\n            return false;\n        for (let i = 0; i < a.length; i++)\n            if (!compareDeep(a[i], b[i]))\n                return false;\n    }\n    else {\n        for (let p in a)\n            if (!(p in b) || !compareDeep(a[p], b[p]))\n                return false;\n        for (let p in b)\n            if (!(p in a))\n                return false;\n    }\n    return true;\n}\n\n/**\nA mark is a piece of information that can be attached to a node,\nsuch as it being emphasized, in code font, or a link. It has a\ntype and optionally a set of attributes that provide further\ninformation (such as the target of the link). Marks are created\nthrough a `Schema`, which controls which types exist and which\nattributes they have.\n*/\nclass Mark {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The type of this mark.\n    */\n    type, \n    /**\n    The attributes associated with this mark.\n    */\n    attrs) {\n        this.type = type;\n        this.attrs = attrs;\n    }\n    /**\n    Given a set of marks, create a new set which contains this one as\n    well, in the right position. If this mark is already in the set,\n    the set itself is returned. If any marks that are set to be\n    [exclusive](https://prosemirror.net/docs/ref/#model.MarkSpec.excludes) with this mark are present,\n    those are replaced by this one.\n    */\n    addToSet(set) {\n        let copy, placed = false;\n        for (let i = 0; i < set.length; i++) {\n            let other = set[i];\n            if (this.eq(other))\n                return set;\n            if (this.type.excludes(other.type)) {\n                if (!copy)\n                    copy = set.slice(0, i);\n            }\n            else if (other.type.excludes(this.type)) {\n                return set;\n            }\n            else {\n                if (!placed && other.type.rank > this.type.rank) {\n                    if (!copy)\n                        copy = set.slice(0, i);\n                    copy.push(this);\n                    placed = true;\n                }\n                if (copy)\n                    copy.push(other);\n            }\n        }\n        if (!copy)\n            copy = set.slice();\n        if (!placed)\n            copy.push(this);\n        return copy;\n    }\n    /**\n    Remove this mark from the given set, returning a new set. If this\n    mark is not in the set, the set itself is returned.\n    */\n    removeFromSet(set) {\n        for (let i = 0; i < set.length; i++)\n            if (this.eq(set[i]))\n                return set.slice(0, i).concat(set.slice(i + 1));\n        return set;\n    }\n    /**\n    Test whether this mark is in the given set of marks.\n    */\n    isInSet(set) {\n        for (let i = 0; i < set.length; i++)\n            if (this.eq(set[i]))\n                return true;\n        return false;\n    }\n    /**\n    Test whether this mark has the same type and attributes as\n    another mark.\n    */\n    eq(other) {\n        return this == other ||\n            (this.type == other.type && compareDeep(this.attrs, other.attrs));\n    }\n    /**\n    Convert this mark to a JSON-serializeable representation.\n    */\n    toJSON() {\n        let obj = { type: this.type.name };\n        for (let _ in this.attrs) {\n            obj.attrs = this.attrs;\n            break;\n        }\n        return obj;\n    }\n    /**\n    Deserialize a mark from JSON.\n    */\n    static fromJSON(schema, json) {\n        if (!json)\n            throw new RangeError(\"Invalid input for Mark.fromJSON\");\n        let type = schema.marks[json.type];\n        if (!type)\n            throw new RangeError(`There is no mark type ${json.type} in this schema`);\n        let mark = type.create(json.attrs);\n        type.checkAttrs(mark.attrs);\n        return mark;\n    }\n    /**\n    Test whether two sets of marks are identical.\n    */\n    static sameSet(a, b) {\n        if (a == b)\n            return true;\n        if (a.length != b.length)\n            return false;\n        for (let i = 0; i < a.length; i++)\n            if (!a[i].eq(b[i]))\n                return false;\n        return true;\n    }\n    /**\n    Create a properly sorted mark set from null, a single mark, or an\n    unsorted array of marks.\n    */\n    static setFrom(marks) {\n        if (!marks || Array.isArray(marks) && marks.length == 0)\n            return Mark.none;\n        if (marks instanceof Mark)\n            return [marks];\n        let copy = marks.slice();\n        copy.sort((a, b) => a.type.rank - b.type.rank);\n        return copy;\n    }\n}\n/**\nThe empty set of marks.\n*/\nMark.none = [];\n\n/**\nError type raised by [`Node.replace`](https://prosemirror.net/docs/ref/#model.Node.replace) when\ngiven an invalid replacement.\n*/\nclass ReplaceError extends Error {\n}\n/*\nReplaceError = function(this: any, message: string) {\n  let err = Error.call(this, message)\n  ;(err as any).__proto__ = ReplaceError.prototype\n  return err\n} as any\n\nReplaceError.prototype = Object.create(Error.prototype)\nReplaceError.prototype.constructor = ReplaceError\nReplaceError.prototype.name = \"ReplaceError\"\n*/\n/**\nA slice represents a piece cut out of a larger document. It\nstores not only a fragment, but also the depth up to which nodes on\nboth side are ‘open’ (cut through).\n*/\nclass Slice {\n    /**\n    Create a slice. When specifying a non-zero open depth, you must\n    make sure that there are nodes of at least that depth at the\n    appropriate side of the fragment—i.e. if the fragment is an\n    empty paragraph node, `openStart` and `openEnd` can't be greater\n    than 1.\n    \n    It is not necessary for the content of open nodes to conform to\n    the schema's content constraints, though it should be a valid\n    start/end/middle for such a node, depending on which sides are\n    open.\n    */\n    constructor(\n    /**\n    The slice's content.\n    */\n    content, \n    /**\n    The open depth at the start of the fragment.\n    */\n    openStart, \n    /**\n    The open depth at the end.\n    */\n    openEnd) {\n        this.content = content;\n        this.openStart = openStart;\n        this.openEnd = openEnd;\n    }\n    /**\n    The size this slice would add when inserted into a document.\n    */\n    get size() {\n        return this.content.size - this.openStart - this.openEnd;\n    }\n    /**\n    @internal\n    */\n    insertAt(pos, fragment) {\n        let content = insertInto(this.content, pos + this.openStart, fragment);\n        return content && new Slice(content, this.openStart, this.openEnd);\n    }\n    /**\n    @internal\n    */\n    removeBetween(from, to) {\n        return new Slice(removeRange(this.content, from + this.openStart, to + this.openStart), this.openStart, this.openEnd);\n    }\n    /**\n    Tests whether this slice is equal to another slice.\n    */\n    eq(other) {\n        return this.content.eq(other.content) && this.openStart == other.openStart && this.openEnd == other.openEnd;\n    }\n    /**\n    @internal\n    */\n    toString() {\n        return this.content + \"(\" + this.openStart + \",\" + this.openEnd + \")\";\n    }\n    /**\n    Convert a slice to a JSON-serializable representation.\n    */\n    toJSON() {\n        if (!this.content.size)\n            return null;\n        let json = { content: this.content.toJSON() };\n        if (this.openStart > 0)\n            json.openStart = this.openStart;\n        if (this.openEnd > 0)\n            json.openEnd = this.openEnd;\n        return json;\n    }\n    /**\n    Deserialize a slice from its JSON representation.\n    */\n    static fromJSON(schema, json) {\n        if (!json)\n            return Slice.empty;\n        let openStart = json.openStart || 0, openEnd = json.openEnd || 0;\n        if (typeof openStart != \"number\" || typeof openEnd != \"number\")\n            throw new RangeError(\"Invalid input for Slice.fromJSON\");\n        return new Slice(Fragment.fromJSON(schema, json.content), openStart, openEnd);\n    }\n    /**\n    Create a slice from a fragment by taking the maximum possible\n    open value on both side of the fragment.\n    */\n    static maxOpen(fragment, openIsolating = true) {\n        let openStart = 0, openEnd = 0;\n        for (let n = fragment.firstChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.firstChild)\n            openStart++;\n        for (let n = fragment.lastChild; n && !n.isLeaf && (openIsolating || !n.type.spec.isolating); n = n.lastChild)\n            openEnd++;\n        return new Slice(fragment, openStart, openEnd);\n    }\n}\n/**\nThe empty slice.\n*/\nSlice.empty = new Slice(Fragment.empty, 0, 0);\nfunction removeRange(content, from, to) {\n    let { index, offset } = content.findIndex(from), child = content.maybeChild(index);\n    let { index: indexTo, offset: offsetTo } = content.findIndex(to);\n    if (offset == from || child.isText) {\n        if (offsetTo != to && !content.child(indexTo).isText)\n            throw new RangeError(\"Removing non-flat range\");\n        return content.cut(0, from).append(content.cut(to));\n    }\n    if (index != indexTo)\n        throw new RangeError(\"Removing non-flat range\");\n    return content.replaceChild(index, child.copy(removeRange(child.content, from - offset - 1, to - offset - 1)));\n}\nfunction insertInto(content, dist, insert, parent) {\n    let { index, offset } = content.findIndex(dist), child = content.maybeChild(index);\n    if (offset == dist || child.isText) {\n        if (parent && !parent.canReplace(index, index, insert))\n            return null;\n        return content.cut(0, dist).append(insert).append(content.cut(dist));\n    }\n    let inner = insertInto(child.content, dist - offset - 1, insert);\n    return inner && content.replaceChild(index, child.copy(inner));\n}\nfunction replace($from, $to, slice) {\n    if (slice.openStart > $from.depth)\n        throw new ReplaceError(\"Inserted content deeper than insertion position\");\n    if ($from.depth - slice.openStart != $to.depth - slice.openEnd)\n        throw new ReplaceError(\"Inconsistent open depths\");\n    return replaceOuter($from, $to, slice, 0);\n}\nfunction replaceOuter($from, $to, slice, depth) {\n    let index = $from.index(depth), node = $from.node(depth);\n    if (index == $to.index(depth) && depth < $from.depth - slice.openStart) {\n        let inner = replaceOuter($from, $to, slice, depth + 1);\n        return node.copy(node.content.replaceChild(index, inner));\n    }\n    else if (!slice.content.size) {\n        return close(node, replaceTwoWay($from, $to, depth));\n    }\n    else if (!slice.openStart && !slice.openEnd && $from.depth == depth && $to.depth == depth) { // Simple, flat case\n        let parent = $from.parent, content = parent.content;\n        return close(parent, content.cut(0, $from.parentOffset).append(slice.content).append(content.cut($to.parentOffset)));\n    }\n    else {\n        let { start, end } = prepareSliceForReplace(slice, $from);\n        return close(node, replaceThreeWay($from, start, end, $to, depth));\n    }\n}\nfunction checkJoin(main, sub) {\n    if (!sub.type.compatibleContent(main.type))\n        throw new ReplaceError(\"Cannot join \" + sub.type.name + \" onto \" + main.type.name);\n}\nfunction joinable($before, $after, depth) {\n    let node = $before.node(depth);\n    checkJoin(node, $after.node(depth));\n    return node;\n}\nfunction addNode(child, target) {\n    let last = target.length - 1;\n    if (last >= 0 && child.isText && child.sameMarkup(target[last]))\n        target[last] = child.withText(target[last].text + child.text);\n    else\n        target.push(child);\n}\nfunction addRange($start, $end, depth, target) {\n    let node = ($end || $start).node(depth);\n    let startIndex = 0, endIndex = $end ? $end.index(depth) : node.childCount;\n    if ($start) {\n        startIndex = $start.index(depth);\n        if ($start.depth > depth) {\n            startIndex++;\n        }\n        else if ($start.textOffset) {\n            addNode($start.nodeAfter, target);\n            startIndex++;\n        }\n    }\n    for (let i = startIndex; i < endIndex; i++)\n        addNode(node.child(i), target);\n    if ($end && $end.depth == depth && $end.textOffset)\n        addNode($end.nodeBefore, target);\n}\nfunction close(node, content) {\n    node.type.checkContent(content);\n    return node.copy(content);\n}\nfunction replaceThreeWay($from, $start, $end, $to, depth) {\n    let openStart = $from.depth > depth && joinable($from, $start, depth + 1);\n    let openEnd = $to.depth > depth && joinable($end, $to, depth + 1);\n    let content = [];\n    addRange(null, $from, depth, content);\n    if (openStart && openEnd && $start.index(depth) == $end.index(depth)) {\n        checkJoin(openStart, openEnd);\n        addNode(close(openStart, replaceThreeWay($from, $start, $end, $to, depth + 1)), content);\n    }\n    else {\n        if (openStart)\n            addNode(close(openStart, replaceTwoWay($from, $start, depth + 1)), content);\n        addRange($start, $end, depth, content);\n        if (openEnd)\n            addNode(close(openEnd, replaceTwoWay($end, $to, depth + 1)), content);\n    }\n    addRange($to, null, depth, content);\n    return new Fragment(content);\n}\nfunction replaceTwoWay($from, $to, depth) {\n    let content = [];\n    addRange(null, $from, depth, content);\n    if ($from.depth > depth) {\n        let type = joinable($from, $to, depth + 1);\n        addNode(close(type, replaceTwoWay($from, $to, depth + 1)), content);\n    }\n    addRange($to, null, depth, content);\n    return new Fragment(content);\n}\nfunction prepareSliceForReplace(slice, $along) {\n    let extra = $along.depth - slice.openStart, parent = $along.node(extra);\n    let node = parent.copy(slice.content);\n    for (let i = extra - 1; i >= 0; i--)\n        node = $along.node(i).copy(Fragment.from(node));\n    return { start: node.resolveNoCache(slice.openStart + extra),\n        end: node.resolveNoCache(node.content.size - slice.openEnd - extra) };\n}\n\n/**\nYou can [_resolve_](https://prosemirror.net/docs/ref/#model.Node.resolve) a position to get more\ninformation about it. Objects of this class represent such a\nresolved position, providing various pieces of context\ninformation, and some helper methods.\n\nThroughout this interface, methods that take an optional `depth`\nparameter will interpret undefined as `this.depth` and negative\nnumbers as `this.depth + value`.\n*/\nclass ResolvedPos {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The position that was resolved.\n    */\n    pos, \n    /**\n    @internal\n    */\n    path, \n    /**\n    The offset this position has into its parent node.\n    */\n    parentOffset) {\n        this.pos = pos;\n        this.path = path;\n        this.parentOffset = parentOffset;\n        this.depth = path.length / 3 - 1;\n    }\n    /**\n    @internal\n    */\n    resolveDepth(val) {\n        if (val == null)\n            return this.depth;\n        if (val < 0)\n            return this.depth + val;\n        return val;\n    }\n    /**\n    The parent node that the position points into. Note that even if\n    a position points into a text node, that node is not considered\n    the parent—text nodes are ‘flat’ in this model, and have no content.\n    */\n    get parent() { return this.node(this.depth); }\n    /**\n    The root node in which the position was resolved.\n    */\n    get doc() { return this.node(0); }\n    /**\n    The ancestor node at the given level. `p.node(p.depth)` is the\n    same as `p.parent`.\n    */\n    node(depth) { return this.path[this.resolveDepth(depth) * 3]; }\n    /**\n    The index into the ancestor at the given level. If this points\n    at the 3rd node in the 2nd paragraph on the top level, for\n    example, `p.index(0)` is 1 and `p.index(1)` is 2.\n    */\n    index(depth) { return this.path[this.resolveDepth(depth) * 3 + 1]; }\n    /**\n    The index pointing after this position into the ancestor at the\n    given level.\n    */\n    indexAfter(depth) {\n        depth = this.resolveDepth(depth);\n        return this.index(depth) + (depth == this.depth && !this.textOffset ? 0 : 1);\n    }\n    /**\n    The (absolute) position at the start of the node at the given\n    level.\n    */\n    start(depth) {\n        depth = this.resolveDepth(depth);\n        return depth == 0 ? 0 : this.path[depth * 3 - 1] + 1;\n    }\n    /**\n    The (absolute) position at the end of the node at the given\n    level.\n    */\n    end(depth) {\n        depth = this.resolveDepth(depth);\n        return this.start(depth) + this.node(depth).content.size;\n    }\n    /**\n    The (absolute) position directly before the wrapping node at the\n    given level, or, when `depth` is `this.depth + 1`, the original\n    position.\n    */\n    before(depth) {\n        depth = this.resolveDepth(depth);\n        if (!depth)\n            throw new RangeError(\"There is no position before the top-level node\");\n        return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1];\n    }\n    /**\n    The (absolute) position directly after the wrapping node at the\n    given level, or the original position when `depth` is `this.depth + 1`.\n    */\n    after(depth) {\n        depth = this.resolveDepth(depth);\n        if (!depth)\n            throw new RangeError(\"There is no position after the top-level node\");\n        return depth == this.depth + 1 ? this.pos : this.path[depth * 3 - 1] + this.path[depth * 3].nodeSize;\n    }\n    /**\n    When this position points into a text node, this returns the\n    distance between the position and the start of the text node.\n    Will be zero for positions that point between nodes.\n    */\n    get textOffset() { return this.pos - this.path[this.path.length - 1]; }\n    /**\n    Get the node directly after the position, if any. If the position\n    points into a text node, only the part of that node after the\n    position is returned.\n    */\n    get nodeAfter() {\n        let parent = this.parent, index = this.index(this.depth);\n        if (index == parent.childCount)\n            return null;\n        let dOff = this.pos - this.path[this.path.length - 1], child = parent.child(index);\n        return dOff ? parent.child(index).cut(dOff) : child;\n    }\n    /**\n    Get the node directly before the position, if any. If the\n    position points into a text node, only the part of that node\n    before the position is returned.\n    */\n    get nodeBefore() {\n        let index = this.index(this.depth);\n        let dOff = this.pos - this.path[this.path.length - 1];\n        if (dOff)\n            return this.parent.child(index).cut(0, dOff);\n        return index == 0 ? null : this.parent.child(index - 1);\n    }\n    /**\n    Get the position at the given index in the parent node at the\n    given depth (which defaults to `this.depth`).\n    */\n    posAtIndex(index, depth) {\n        depth = this.resolveDepth(depth);\n        let node = this.path[depth * 3], pos = depth == 0 ? 0 : this.path[depth * 3 - 1] + 1;\n        for (let i = 0; i < index; i++)\n            pos += node.child(i).nodeSize;\n        return pos;\n    }\n    /**\n    Get the marks at this position, factoring in the surrounding\n    marks' [`inclusive`](https://prosemirror.net/docs/ref/#model.MarkSpec.inclusive) property. If the\n    position is at the start of a non-empty node, the marks of the\n    node after it (if any) are returned.\n    */\n    marks() {\n        let parent = this.parent, index = this.index();\n        // In an empty parent, return the empty array\n        if (parent.content.size == 0)\n            return Mark.none;\n        // When inside a text node, just return the text node's marks\n        if (this.textOffset)\n            return parent.child(index).marks;\n        let main = parent.maybeChild(index - 1), other = parent.maybeChild(index);\n        // If the `after` flag is true of there is no node before, make\n        // the node after this position the main reference.\n        if (!main) {\n            let tmp = main;\n            main = other;\n            other = tmp;\n        }\n        // Use all marks in the main node, except those that have\n        // `inclusive` set to false and are not present in the other node.\n        let marks = main.marks;\n        for (var i = 0; i < marks.length; i++)\n            if (marks[i].type.spec.inclusive === false && (!other || !marks[i].isInSet(other.marks)))\n                marks = marks[i--].removeFromSet(marks);\n        return marks;\n    }\n    /**\n    Get the marks after the current position, if any, except those\n    that are non-inclusive and not present at position `$end`. This\n    is mostly useful for getting the set of marks to preserve after a\n    deletion. Will return `null` if this position is at the end of\n    its parent node or its parent node isn't a textblock (in which\n    case no marks should be preserved).\n    */\n    marksAcross($end) {\n        let after = this.parent.maybeChild(this.index());\n        if (!after || !after.isInline)\n            return null;\n        let marks = after.marks, next = $end.parent.maybeChild($end.index());\n        for (var i = 0; i < marks.length; i++)\n            if (marks[i].type.spec.inclusive === false && (!next || !marks[i].isInSet(next.marks)))\n                marks = marks[i--].removeFromSet(marks);\n        return marks;\n    }\n    /**\n    The depth up to which this position and the given (non-resolved)\n    position share the same parent nodes.\n    */\n    sharedDepth(pos) {\n        for (let depth = this.depth; depth > 0; depth--)\n            if (this.start(depth) <= pos && this.end(depth) >= pos)\n                return depth;\n        return 0;\n    }\n    /**\n    Returns a range based on the place where this position and the\n    given position diverge around block content. If both point into\n    the same textblock, for example, a range around that textblock\n    will be returned. If they point into different blocks, the range\n    around those blocks in their shared ancestor is returned. You can\n    pass in an optional predicate that will be called with a parent\n    node to see if a range into that parent is acceptable.\n    */\n    blockRange(other = this, pred) {\n        if (other.pos < this.pos)\n            return other.blockRange(this);\n        for (let d = this.depth - (this.parent.inlineContent || this.pos == other.pos ? 1 : 0); d >= 0; d--)\n            if (other.pos <= this.end(d) && (!pred || pred(this.node(d))))\n                return new NodeRange(this, other, d);\n        return null;\n    }\n    /**\n    Query whether the given position shares the same parent node.\n    */\n    sameParent(other) {\n        return this.pos - this.parentOffset == other.pos - other.parentOffset;\n    }\n    /**\n    Return the greater of this and the given position.\n    */\n    max(other) {\n        return other.pos > this.pos ? other : this;\n    }\n    /**\n    Return the smaller of this and the given position.\n    */\n    min(other) {\n        return other.pos < this.pos ? other : this;\n    }\n    /**\n    @internal\n    */\n    toString() {\n        let str = \"\";\n        for (let i = 1; i <= this.depth; i++)\n            str += (str ? \"/\" : \"\") + this.node(i).type.name + \"_\" + this.index(i - 1);\n        return str + \":\" + this.parentOffset;\n    }\n    /**\n    @internal\n    */\n    static resolve(doc, pos) {\n        if (!(pos >= 0 && pos <= doc.content.size))\n            throw new RangeError(\"Position \" + pos + \" out of range\");\n        let path = [];\n        let start = 0, parentOffset = pos;\n        for (let node = doc;;) {\n            let { index, offset } = node.content.findIndex(parentOffset);\n            let rem = parentOffset - offset;\n            path.push(node, index, start + offset);\n            if (!rem)\n                break;\n            node = node.child(index);\n            if (node.isText)\n                break;\n            parentOffset = rem - 1;\n            start += offset + 1;\n        }\n        return new ResolvedPos(pos, path, parentOffset);\n    }\n    /**\n    @internal\n    */\n    static resolveCached(doc, pos) {\n        let cache = resolveCache.get(doc);\n        if (cache) {\n            for (let i = 0; i < cache.elts.length; i++) {\n                let elt = cache.elts[i];\n                if (elt.pos == pos)\n                    return elt;\n            }\n        }\n        else {\n            resolveCache.set(doc, cache = new ResolveCache);\n        }\n        let result = cache.elts[cache.i] = ResolvedPos.resolve(doc, pos);\n        cache.i = (cache.i + 1) % resolveCacheSize;\n        return result;\n    }\n}\nclass ResolveCache {\n    constructor() {\n        this.elts = [];\n        this.i = 0;\n    }\n}\nconst resolveCacheSize = 12, resolveCache = new WeakMap();\n/**\nRepresents a flat range of content, i.e. one that starts and\nends in the same node.\n*/\nclass NodeRange {\n    /**\n    Construct a node range. `$from` and `$to` should point into the\n    same node until at least the given `depth`, since a node range\n    denotes an adjacent set of nodes in a single parent node.\n    */\n    constructor(\n    /**\n    A resolved position along the start of the content. May have a\n    `depth` greater than this object's `depth` property, since\n    these are the positions that were used to compute the range,\n    not re-resolved positions directly at its boundaries.\n    */\n    $from, \n    /**\n    A position along the end of the content. See\n    caveat for [`$from`](https://prosemirror.net/docs/ref/#model.NodeRange.$from).\n    */\n    $to, \n    /**\n    The depth of the node that this range points into.\n    */\n    depth) {\n        this.$from = $from;\n        this.$to = $to;\n        this.depth = depth;\n    }\n    /**\n    The position at the start of the range.\n    */\n    get start() { return this.$from.before(this.depth + 1); }\n    /**\n    The position at the end of the range.\n    */\n    get end() { return this.$to.after(this.depth + 1); }\n    /**\n    The parent node that the range points into.\n    */\n    get parent() { return this.$from.node(this.depth); }\n    /**\n    The start index of the range in the parent node.\n    */\n    get startIndex() { return this.$from.index(this.depth); }\n    /**\n    The end index of the range in the parent node.\n    */\n    get endIndex() { return this.$to.indexAfter(this.depth); }\n}\n\nconst emptyAttrs = Object.create(null);\n/**\nThis class represents a node in the tree that makes up a\nProseMirror document. So a document is an instance of `Node`, with\nchildren that are also instances of `Node`.\n\nNodes are persistent data structures. Instead of changing them, you\ncreate new ones with the content you want. Old ones keep pointing\nat the old document shape. This is made cheaper by sharing\nstructure between the old and new data as much as possible, which a\ntree shape like this (without back pointers) makes easy.\n\n**Do not** directly mutate the properties of a `Node` object. See\n[the guide](/docs/guide/#doc) for more information.\n*/\nclass Node {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The type of node that this is.\n    */\n    type, \n    /**\n    An object mapping attribute names to values. The kind of\n    attributes allowed and required are\n    [determined](https://prosemirror.net/docs/ref/#model.NodeSpec.attrs) by the node type.\n    */\n    attrs, \n    // A fragment holding the node's children.\n    content, \n    /**\n    The marks (things like whether it is emphasized or part of a\n    link) applied to this node.\n    */\n    marks = Mark.none) {\n        this.type = type;\n        this.attrs = attrs;\n        this.marks = marks;\n        this.content = content || Fragment.empty;\n    }\n    /**\n    The size of this node, as defined by the integer-based [indexing\n    scheme](/docs/guide/#doc.indexing). For text nodes, this is the\n    amount of characters. For other leaf nodes, it is one. For\n    non-leaf nodes, it is the size of the content plus two (the\n    start and end token).\n    */\n    get nodeSize() { return this.isLeaf ? 1 : 2 + this.content.size; }\n    /**\n    The number of children that the node has.\n    */\n    get childCount() { return this.content.childCount; }\n    /**\n    Get the child node at the given index. Raises an error when the\n    index is out of range.\n    */\n    child(index) { return this.content.child(index); }\n    /**\n    Get the child node at the given index, if it exists.\n    */\n    maybeChild(index) { return this.content.maybeChild(index); }\n    /**\n    Call `f` for every child node, passing the node, its offset\n    into this parent node, and its index.\n    */\n    forEach(f) { this.content.forEach(f); }\n    /**\n    Invoke a callback for all descendant nodes recursively between\n    the given two positions that are relative to start of this\n    node's content. The callback is invoked with the node, its\n    position relative to the original node (method receiver),\n    its parent node, and its child index. When the callback returns\n    false for a given node, that node's children will not be\n    recursed over. The last parameter can be used to specify a\n    starting position to count from.\n    */\n    nodesBetween(from, to, f, startPos = 0) {\n        this.content.nodesBetween(from, to, f, startPos, this);\n    }\n    /**\n    Call the given callback for every descendant node. Doesn't\n    descend into a node when the callback returns `false`.\n    */\n    descendants(f) {\n        this.nodesBetween(0, this.content.size, f);\n    }\n    /**\n    Concatenates all the text nodes found in this fragment and its\n    children.\n    */\n    get textContent() {\n        return (this.isLeaf && this.type.spec.leafText)\n            ? this.type.spec.leafText(this)\n            : this.textBetween(0, this.content.size, \"\");\n    }\n    /**\n    Get all text between positions `from` and `to`. When\n    `blockSeparator` is given, it will be inserted to separate text\n    from different block nodes. If `leafText` is given, it'll be\n    inserted for every non-text leaf node encountered, otherwise\n    [`leafText`](https://prosemirror.net/docs/ref/#model.NodeSpec^leafText) will be used.\n    */\n    textBetween(from, to, blockSeparator, leafText) {\n        return this.content.textBetween(from, to, blockSeparator, leafText);\n    }\n    /**\n    Returns this node's first child, or `null` if there are no\n    children.\n    */\n    get firstChild() { return this.content.firstChild; }\n    /**\n    Returns this node's last child, or `null` if there are no\n    children.\n    */\n    get lastChild() { return this.content.lastChild; }\n    /**\n    Test whether two nodes represent the same piece of document.\n    */\n    eq(other) {\n        return this == other || (this.sameMarkup(other) && this.content.eq(other.content));\n    }\n    /**\n    Compare the markup (type, attributes, and marks) of this node to\n    those of another. Returns `true` if both have the same markup.\n    */\n    sameMarkup(other) {\n        return this.hasMarkup(other.type, other.attrs, other.marks);\n    }\n    /**\n    Check whether this node's markup correspond to the given type,\n    attributes, and marks.\n    */\n    hasMarkup(type, attrs, marks) {\n        return this.type == type &&\n            compareDeep(this.attrs, attrs || type.defaultAttrs || emptyAttrs) &&\n            Mark.sameSet(this.marks, marks || Mark.none);\n    }\n    /**\n    Create a new node with the same markup as this node, containing\n    the given content (or empty, if no content is given).\n    */\n    copy(content = null) {\n        if (content == this.content)\n            return this;\n        return new Node(this.type, this.attrs, content, this.marks);\n    }\n    /**\n    Create a copy of this node, with the given set of marks instead\n    of the node's own marks.\n    */\n    mark(marks) {\n        return marks == this.marks ? this : new Node(this.type, this.attrs, this.content, marks);\n    }\n    /**\n    Create a copy of this node with only the content between the\n    given positions. If `to` is not given, it defaults to the end of\n    the node.\n    */\n    cut(from, to = this.content.size) {\n        if (from == 0 && to == this.content.size)\n            return this;\n        return this.copy(this.content.cut(from, to));\n    }\n    /**\n    Cut out the part of the document between the given positions, and\n    return it as a `Slice` object.\n    */\n    slice(from, to = this.content.size, includeParents = false) {\n        if (from == to)\n            return Slice.empty;\n        let $from = this.resolve(from), $to = this.resolve(to);\n        let depth = includeParents ? 0 : $from.sharedDepth(to);\n        let start = $from.start(depth), node = $from.node(depth);\n        let content = node.content.cut($from.pos - start, $to.pos - start);\n        return new Slice(content, $from.depth - depth, $to.depth - depth);\n    }\n    /**\n    Replace the part of the document between the given positions with\n    the given slice. The slice must 'fit', meaning its open sides\n    must be able to connect to the surrounding content, and its\n    content nodes must be valid children for the node they are placed\n    into. If any of this is violated, an error of type\n    [`ReplaceError`](https://prosemirror.net/docs/ref/#model.ReplaceError) is thrown.\n    */\n    replace(from, to, slice) {\n        return replace(this.resolve(from), this.resolve(to), slice);\n    }\n    /**\n    Find the node directly after the given position.\n    */\n    nodeAt(pos) {\n        for (let node = this;;) {\n            let { index, offset } = node.content.findIndex(pos);\n            node = node.maybeChild(index);\n            if (!node)\n                return null;\n            if (offset == pos || node.isText)\n                return node;\n            pos -= offset + 1;\n        }\n    }\n    /**\n    Find the (direct) child node after the given offset, if any,\n    and return it along with its index and offset relative to this\n    node.\n    */\n    childAfter(pos) {\n        let { index, offset } = this.content.findIndex(pos);\n        return { node: this.content.maybeChild(index), index, offset };\n    }\n    /**\n    Find the (direct) child node before the given offset, if any,\n    and return it along with its index and offset relative to this\n    node.\n    */\n    childBefore(pos) {\n        if (pos == 0)\n            return { node: null, index: 0, offset: 0 };\n        let { index, offset } = this.content.findIndex(pos);\n        if (offset < pos)\n            return { node: this.content.child(index), index, offset };\n        let node = this.content.child(index - 1);\n        return { node, index: index - 1, offset: offset - node.nodeSize };\n    }\n    /**\n    Resolve the given position in the document, returning an\n    [object](https://prosemirror.net/docs/ref/#model.ResolvedPos) with information about its context.\n    */\n    resolve(pos) { return ResolvedPos.resolveCached(this, pos); }\n    /**\n    @internal\n    */\n    resolveNoCache(pos) { return ResolvedPos.resolve(this, pos); }\n    /**\n    Test whether a given mark or mark type occurs in this document\n    between the two given positions.\n    */\n    rangeHasMark(from, to, type) {\n        let found = false;\n        if (to > from)\n            this.nodesBetween(from, to, node => {\n                if (type.isInSet(node.marks))\n                    found = true;\n                return !found;\n            });\n        return found;\n    }\n    /**\n    True when this is a block (non-inline node)\n    */\n    get isBlock() { return this.type.isBlock; }\n    /**\n    True when this is a textblock node, a block node with inline\n    content.\n    */\n    get isTextblock() { return this.type.isTextblock; }\n    /**\n    True when this node allows inline content.\n    */\n    get inlineContent() { return this.type.inlineContent; }\n    /**\n    True when this is an inline node (a text node or a node that can\n    appear among text).\n    */\n    get isInline() { return this.type.isInline; }\n    /**\n    True when this is a text node.\n    */\n    get isText() { return this.type.isText; }\n    /**\n    True when this is a leaf node.\n    */\n    get isLeaf() { return this.type.isLeaf; }\n    /**\n    True when this is an atom, i.e. when it does not have directly\n    editable content. This is usually the same as `isLeaf`, but can\n    be configured with the [`atom` property](https://prosemirror.net/docs/ref/#model.NodeSpec.atom)\n    on a node's spec (typically used when the node is displayed as\n    an uneditable [node view](https://prosemirror.net/docs/ref/#view.NodeView)).\n    */\n    get isAtom() { return this.type.isAtom; }\n    /**\n    Return a string representation of this node for debugging\n    purposes.\n    */\n    toString() {\n        if (this.type.spec.toDebugString)\n            return this.type.spec.toDebugString(this);\n        let name = this.type.name;\n        if (this.content.size)\n            name += \"(\" + this.content.toStringInner() + \")\";\n        return wrapMarks(this.marks, name);\n    }\n    /**\n    Get the content match in this node at the given index.\n    */\n    contentMatchAt(index) {\n        let match = this.type.contentMatch.matchFragment(this.content, 0, index);\n        if (!match)\n            throw new Error(\"Called contentMatchAt on a node with invalid content\");\n        return match;\n    }\n    /**\n    Test whether replacing the range between `from` and `to` (by\n    child index) with the given replacement fragment (which defaults\n    to the empty fragment) would leave the node's content valid. You\n    can optionally pass `start` and `end` indices into the\n    replacement fragment.\n    */\n    canReplace(from, to, replacement = Fragment.empty, start = 0, end = replacement.childCount) {\n        let one = this.contentMatchAt(from).matchFragment(replacement, start, end);\n        let two = one && one.matchFragment(this.content, to);\n        if (!two || !two.validEnd)\n            return false;\n        for (let i = start; i < end; i++)\n            if (!this.type.allowsMarks(replacement.child(i).marks))\n                return false;\n        return true;\n    }\n    /**\n    Test whether replacing the range `from` to `to` (by index) with\n    a node of the given type would leave the node's content valid.\n    */\n    canReplaceWith(from, to, type, marks) {\n        if (marks && !this.type.allowsMarks(marks))\n            return false;\n        let start = this.contentMatchAt(from).matchType(type);\n        let end = start && start.matchFragment(this.content, to);\n        return end ? end.validEnd : false;\n    }\n    /**\n    Test whether the given node's content could be appended to this\n    node. If that node is empty, this will only return true if there\n    is at least one node type that can appear in both nodes (to avoid\n    merging completely incompatible nodes).\n    */\n    canAppend(other) {\n        if (other.content.size)\n            return this.canReplace(this.childCount, this.childCount, other.content);\n        else\n            return this.type.compatibleContent(other.type);\n    }\n    /**\n    Check whether this node and its descendants conform to the\n    schema, and raise an exception when they do not.\n    */\n    check() {\n        this.type.checkContent(this.content);\n        this.type.checkAttrs(this.attrs);\n        let copy = Mark.none;\n        for (let i = 0; i < this.marks.length; i++) {\n            let mark = this.marks[i];\n            mark.type.checkAttrs(mark.attrs);\n            copy = mark.addToSet(copy);\n        }\n        if (!Mark.sameSet(copy, this.marks))\n            throw new RangeError(`Invalid collection of marks for node ${this.type.name}: ${this.marks.map(m => m.type.name)}`);\n        this.content.forEach(node => node.check());\n    }\n    /**\n    Return a JSON-serializeable representation of this node.\n    */\n    toJSON() {\n        let obj = { type: this.type.name };\n        for (let _ in this.attrs) {\n            obj.attrs = this.attrs;\n            break;\n        }\n        if (this.content.size)\n            obj.content = this.content.toJSON();\n        if (this.marks.length)\n            obj.marks = this.marks.map(n => n.toJSON());\n        return obj;\n    }\n    /**\n    Deserialize a node from its JSON representation.\n    */\n    static fromJSON(schema, json) {\n        if (!json)\n            throw new RangeError(\"Invalid input for Node.fromJSON\");\n        let marks = undefined;\n        if (json.marks) {\n            if (!Array.isArray(json.marks))\n                throw new RangeError(\"Invalid mark data for Node.fromJSON\");\n            marks = json.marks.map(schema.markFromJSON);\n        }\n        if (json.type == \"text\") {\n            if (typeof json.text != \"string\")\n                throw new RangeError(\"Invalid text node in JSON\");\n            return schema.text(json.text, marks);\n        }\n        let content = Fragment.fromJSON(schema, json.content);\n        let node = schema.nodeType(json.type).create(json.attrs, content, marks);\n        node.type.checkAttrs(node.attrs);\n        return node;\n    }\n}\nNode.prototype.text = undefined;\nclass TextNode extends Node {\n    /**\n    @internal\n    */\n    constructor(type, attrs, content, marks) {\n        super(type, attrs, null, marks);\n        if (!content)\n            throw new RangeError(\"Empty text nodes are not allowed\");\n        this.text = content;\n    }\n    toString() {\n        if (this.type.spec.toDebugString)\n            return this.type.spec.toDebugString(this);\n        return wrapMarks(this.marks, JSON.stringify(this.text));\n    }\n    get textContent() { return this.text; }\n    textBetween(from, to) { return this.text.slice(from, to); }\n    get nodeSize() { return this.text.length; }\n    mark(marks) {\n        return marks == this.marks ? this : new TextNode(this.type, this.attrs, this.text, marks);\n    }\n    withText(text) {\n        if (text == this.text)\n            return this;\n        return new TextNode(this.type, this.attrs, text, this.marks);\n    }\n    cut(from = 0, to = this.text.length) {\n        if (from == 0 && to == this.text.length)\n            return this;\n        return this.withText(this.text.slice(from, to));\n    }\n    eq(other) {\n        return this.sameMarkup(other) && this.text == other.text;\n    }\n    toJSON() {\n        let base = super.toJSON();\n        base.text = this.text;\n        return base;\n    }\n}\nfunction wrapMarks(marks, str) {\n    for (let i = marks.length - 1; i >= 0; i--)\n        str = marks[i].type.name + \"(\" + str + \")\";\n    return str;\n}\n\n/**\nInstances of this class represent a match state of a node type's\n[content expression](https://prosemirror.net/docs/ref/#model.NodeSpec.content), and can be used to\nfind out whether further content matches here, and whether a given\nposition is a valid end of the node.\n*/\nclass ContentMatch {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    True when this match state represents a valid end of the node.\n    */\n    validEnd) {\n        this.validEnd = validEnd;\n        /**\n        @internal\n        */\n        this.next = [];\n        /**\n        @internal\n        */\n        this.wrapCache = [];\n    }\n    /**\n    @internal\n    */\n    static parse(string, nodeTypes) {\n        let stream = new TokenStream(string, nodeTypes);\n        if (stream.next == null)\n            return ContentMatch.empty;\n        let expr = parseExpr(stream);\n        if (stream.next)\n            stream.err(\"Unexpected trailing text\");\n        let match = dfa(nfa(expr));\n        checkForDeadEnds(match, stream);\n        return match;\n    }\n    /**\n    Match a node type, returning a match after that node if\n    successful.\n    */\n    matchType(type) {\n        for (let i = 0; i < this.next.length; i++)\n            if (this.next[i].type == type)\n                return this.next[i].next;\n        return null;\n    }\n    /**\n    Try to match a fragment. Returns the resulting match when\n    successful.\n    */\n    matchFragment(frag, start = 0, end = frag.childCount) {\n        let cur = this;\n        for (let i = start; cur && i < end; i++)\n            cur = cur.matchType(frag.child(i).type);\n        return cur;\n    }\n    /**\n    @internal\n    */\n    get inlineContent() {\n        return this.next.length != 0 && this.next[0].type.isInline;\n    }\n    /**\n    Get the first matching node type at this match position that can\n    be generated.\n    */\n    get defaultType() {\n        for (let i = 0; i < this.next.length; i++) {\n            let { type } = this.next[i];\n            if (!(type.isText || type.hasRequiredAttrs()))\n                return type;\n        }\n        return null;\n    }\n    /**\n    @internal\n    */\n    compatible(other) {\n        for (let i = 0; i < this.next.length; i++)\n            for (let j = 0; j < other.next.length; j++)\n                if (this.next[i].type == other.next[j].type)\n                    return true;\n        return false;\n    }\n    /**\n    Try to match the given fragment, and if that fails, see if it can\n    be made to match by inserting nodes in front of it. When\n    successful, return a fragment of inserted nodes (which may be\n    empty if nothing had to be inserted). When `toEnd` is true, only\n    return a fragment if the resulting match goes to the end of the\n    content expression.\n    */\n    fillBefore(after, toEnd = false, startIndex = 0) {\n        let seen = [this];\n        function search(match, types) {\n            let finished = match.matchFragment(after, startIndex);\n            if (finished && (!toEnd || finished.validEnd))\n                return Fragment.from(types.map(tp => tp.createAndFill()));\n            for (let i = 0; i < match.next.length; i++) {\n                let { type, next } = match.next[i];\n                if (!(type.isText || type.hasRequiredAttrs()) && seen.indexOf(next) == -1) {\n                    seen.push(next);\n                    let found = search(next, types.concat(type));\n                    if (found)\n                        return found;\n                }\n            }\n            return null;\n        }\n        return search(this, []);\n    }\n    /**\n    Find a set of wrapping node types that would allow a node of the\n    given type to appear at this position. The result may be empty\n    (when it fits directly) and will be null when no such wrapping\n    exists.\n    */\n    findWrapping(target) {\n        for (let i = 0; i < this.wrapCache.length; i += 2)\n            if (this.wrapCache[i] == target)\n                return this.wrapCache[i + 1];\n        let computed = this.computeWrapping(target);\n        this.wrapCache.push(target, computed);\n        return computed;\n    }\n    /**\n    @internal\n    */\n    computeWrapping(target) {\n        let seen = Object.create(null), active = [{ match: this, type: null, via: null }];\n        while (active.length) {\n            let current = active.shift(), match = current.match;\n            if (match.matchType(target)) {\n                let result = [];\n                for (let obj = current; obj.type; obj = obj.via)\n                    result.push(obj.type);\n                return result.reverse();\n            }\n            for (let i = 0; i < match.next.length; i++) {\n                let { type, next } = match.next[i];\n                if (!type.isLeaf && !type.hasRequiredAttrs() && !(type.name in seen) && (!current.type || next.validEnd)) {\n                    active.push({ match: type.contentMatch, type, via: current });\n                    seen[type.name] = true;\n                }\n            }\n        }\n        return null;\n    }\n    /**\n    The number of outgoing edges this node has in the finite\n    automaton that describes the content expression.\n    */\n    get edgeCount() {\n        return this.next.length;\n    }\n    /**\n    Get the _n_​th outgoing edge from this node in the finite\n    automaton that describes the content expression.\n    */\n    edge(n) {\n        if (n >= this.next.length)\n            throw new RangeError(`There's no ${n}th edge in this content match`);\n        return this.next[n];\n    }\n    /**\n    @internal\n    */\n    toString() {\n        let seen = [];\n        function scan(m) {\n            seen.push(m);\n            for (let i = 0; i < m.next.length; i++)\n                if (seen.indexOf(m.next[i].next) == -1)\n                    scan(m.next[i].next);\n        }\n        scan(this);\n        return seen.map((m, i) => {\n            let out = i + (m.validEnd ? \"*\" : \" \") + \" \";\n            for (let i = 0; i < m.next.length; i++)\n                out += (i ? \", \" : \"\") + m.next[i].type.name + \"->\" + seen.indexOf(m.next[i].next);\n            return out;\n        }).join(\"\\n\");\n    }\n}\n/**\n@internal\n*/\nContentMatch.empty = new ContentMatch(true);\nclass TokenStream {\n    constructor(string, nodeTypes) {\n        this.string = string;\n        this.nodeTypes = nodeTypes;\n        this.inline = null;\n        this.pos = 0;\n        this.tokens = string.split(/\\s*(?=\\b|\\W|$)/);\n        if (this.tokens[this.tokens.length - 1] == \"\")\n            this.tokens.pop();\n        if (this.tokens[0] == \"\")\n            this.tokens.shift();\n    }\n    get next() { return this.tokens[this.pos]; }\n    eat(tok) { return this.next == tok && (this.pos++ || true); }\n    err(str) { throw new SyntaxError(str + \" (in content expression '\" + this.string + \"')\"); }\n}\nfunction parseExpr(stream) {\n    let exprs = [];\n    do {\n        exprs.push(parseExprSeq(stream));\n    } while (stream.eat(\"|\"));\n    return exprs.length == 1 ? exprs[0] : { type: \"choice\", exprs };\n}\nfunction parseExprSeq(stream) {\n    let exprs = [];\n    do {\n        exprs.push(parseExprSubscript(stream));\n    } while (stream.next && stream.next != \")\" && stream.next != \"|\");\n    return exprs.length == 1 ? exprs[0] : { type: \"seq\", exprs };\n}\nfunction parseExprSubscript(stream) {\n    let expr = parseExprAtom(stream);\n    for (;;) {\n        if (stream.eat(\"+\"))\n            expr = { type: \"plus\", expr };\n        else if (stream.eat(\"*\"))\n            expr = { type: \"star\", expr };\n        else if (stream.eat(\"?\"))\n            expr = { type: \"opt\", expr };\n        else if (stream.eat(\"{\"))\n            expr = parseExprRange(stream, expr);\n        else\n            break;\n    }\n    return expr;\n}\nfunction parseNum(stream) {\n    if (/\\D/.test(stream.next))\n        stream.err(\"Expected number, got '\" + stream.next + \"'\");\n    let result = Number(stream.next);\n    stream.pos++;\n    return result;\n}\nfunction parseExprRange(stream, expr) {\n    let min = parseNum(stream), max = min;\n    if (stream.eat(\",\")) {\n        if (stream.next != \"}\")\n            max = parseNum(stream);\n        else\n            max = -1;\n    }\n    if (!stream.eat(\"}\"))\n        stream.err(\"Unclosed braced range\");\n    return { type: \"range\", min, max, expr };\n}\nfunction resolveName(stream, name) {\n    let types = stream.nodeTypes, type = types[name];\n    if (type)\n        return [type];\n    let result = [];\n    for (let typeName in types) {\n        let type = types[typeName];\n        if (type.groups.indexOf(name) > -1)\n            result.push(type);\n    }\n    if (result.length == 0)\n        stream.err(\"No node type or group '\" + name + \"' found\");\n    return result;\n}\nfunction parseExprAtom(stream) {\n    if (stream.eat(\"(\")) {\n        let expr = parseExpr(stream);\n        if (!stream.eat(\")\"))\n            stream.err(\"Missing closing paren\");\n        return expr;\n    }\n    else if (!/\\W/.test(stream.next)) {\n        let exprs = resolveName(stream, stream.next).map(type => {\n            if (stream.inline == null)\n                stream.inline = type.isInline;\n            else if (stream.inline != type.isInline)\n                stream.err(\"Mixing inline and block content\");\n            return { type: \"name\", value: type };\n        });\n        stream.pos++;\n        return exprs.length == 1 ? exprs[0] : { type: \"choice\", exprs };\n    }\n    else {\n        stream.err(\"Unexpected token '\" + stream.next + \"'\");\n    }\n}\n/**\nConstruct an NFA from an expression as returned by the parser. The\nNFA is represented as an array of states, which are themselves\narrays of edges, which are `{term, to}` objects. The first state is\nthe entry state and the last node is the success state.\n\nNote that unlike typical NFAs, the edge ordering in this one is\nsignificant, in that it is used to contruct filler content when\nnecessary.\n*/\nfunction nfa(expr) {\n    let nfa = [[]];\n    connect(compile(expr, 0), node());\n    return nfa;\n    function node() { return nfa.push([]) - 1; }\n    function edge(from, to, term) {\n        let edge = { term, to };\n        nfa[from].push(edge);\n        return edge;\n    }\n    function connect(edges, to) {\n        edges.forEach(edge => edge.to = to);\n    }\n    function compile(expr, from) {\n        if (expr.type == \"choice\") {\n            return expr.exprs.reduce((out, expr) => out.concat(compile(expr, from)), []);\n        }\n        else if (expr.type == \"seq\") {\n            for (let i = 0;; i++) {\n                let next = compile(expr.exprs[i], from);\n                if (i == expr.exprs.length - 1)\n                    return next;\n                connect(next, from = node());\n            }\n        }\n        else if (expr.type == \"star\") {\n            let loop = node();\n            edge(from, loop);\n            connect(compile(expr.expr, loop), loop);\n            return [edge(loop)];\n        }\n        else if (expr.type == \"plus\") {\n            let loop = node();\n            connect(compile(expr.expr, from), loop);\n            connect(compile(expr.expr, loop), loop);\n            return [edge(loop)];\n        }\n        else if (expr.type == \"opt\") {\n            return [edge(from)].concat(compile(expr.expr, from));\n        }\n        else if (expr.type == \"range\") {\n            let cur = from;\n            for (let i = 0; i < expr.min; i++) {\n                let next = node();\n                connect(compile(expr.expr, cur), next);\n                cur = next;\n            }\n            if (expr.max == -1) {\n                connect(compile(expr.expr, cur), cur);\n            }\n            else {\n                for (let i = expr.min; i < expr.max; i++) {\n                    let next = node();\n                    edge(cur, next);\n                    connect(compile(expr.expr, cur), next);\n                    cur = next;\n                }\n            }\n            return [edge(cur)];\n        }\n        else if (expr.type == \"name\") {\n            return [edge(from, undefined, expr.value)];\n        }\n        else {\n            throw new Error(\"Unknown expr type\");\n        }\n    }\n}\nfunction cmp(a, b) { return b - a; }\n// Get the set of nodes reachable by null edges from `node`. Omit\n// nodes with only a single null-out-edge, since they may lead to\n// needless duplicated nodes.\nfunction nullFrom(nfa, node) {\n    let result = [];\n    scan(node);\n    return result.sort(cmp);\n    function scan(node) {\n        let edges = nfa[node];\n        if (edges.length == 1 && !edges[0].term)\n            return scan(edges[0].to);\n        result.push(node);\n        for (let i = 0; i < edges.length; i++) {\n            let { term, to } = edges[i];\n            if (!term && result.indexOf(to) == -1)\n                scan(to);\n        }\n    }\n}\n// Compiles an NFA as produced by `nfa` into a DFA, modeled as a set\n// of state objects (`ContentMatch` instances) with transitions\n// between them.\nfunction dfa(nfa) {\n    let labeled = Object.create(null);\n    return explore(nullFrom(nfa, 0));\n    function explore(states) {\n        let out = [];\n        states.forEach(node => {\n            nfa[node].forEach(({ term, to }) => {\n                if (!term)\n                    return;\n                let set;\n                for (let i = 0; i < out.length; i++)\n                    if (out[i][0] == term)\n                        set = out[i][1];\n                nullFrom(nfa, to).forEach(node => {\n                    if (!set)\n                        out.push([term, set = []]);\n                    if (set.indexOf(node) == -1)\n                        set.push(node);\n                });\n            });\n        });\n        let state = labeled[states.join(\",\")] = new ContentMatch(states.indexOf(nfa.length - 1) > -1);\n        for (let i = 0; i < out.length; i++) {\n            let states = out[i][1].sort(cmp);\n            state.next.push({ type: out[i][0], next: labeled[states.join(\",\")] || explore(states) });\n        }\n        return state;\n    }\n}\nfunction checkForDeadEnds(match, stream) {\n    for (let i = 0, work = [match]; i < work.length; i++) {\n        let state = work[i], dead = !state.validEnd, nodes = [];\n        for (let j = 0; j < state.next.length; j++) {\n            let { type, next } = state.next[j];\n            nodes.push(type.name);\n            if (dead && !(type.isText || type.hasRequiredAttrs()))\n                dead = false;\n            if (work.indexOf(next) == -1)\n                work.push(next);\n        }\n        if (dead)\n            stream.err(\"Only non-generatable nodes (\" + nodes.join(\", \") + \") in a required position (see https://prosemirror.net/docs/guide/#generatable)\");\n    }\n}\n\n// For node types where all attrs have a default value (or which don't\n// have any attributes), build up a single reusable default attribute\n// object, and use it for all nodes that don't specify specific\n// attributes.\nfunction defaultAttrs(attrs) {\n    let defaults = Object.create(null);\n    for (let attrName in attrs) {\n        let attr = attrs[attrName];\n        if (!attr.hasDefault)\n            return null;\n        defaults[attrName] = attr.default;\n    }\n    return defaults;\n}\nfunction computeAttrs(attrs, value) {\n    let built = Object.create(null);\n    for (let name in attrs) {\n        let given = value && value[name];\n        if (given === undefined) {\n            let attr = attrs[name];\n            if (attr.hasDefault)\n                given = attr.default;\n            else\n                throw new RangeError(\"No value supplied for attribute \" + name);\n        }\n        built[name] = given;\n    }\n    return built;\n}\nfunction checkAttrs(attrs, values, type, name) {\n    for (let name in values)\n        if (!(name in attrs))\n            throw new RangeError(`Unsupported attribute ${name} for ${type} of type ${name}`);\n    for (let name in attrs) {\n        let attr = attrs[name];\n        if (attr.validate)\n            attr.validate(values[name]);\n    }\n}\nfunction initAttrs(attrs) {\n    let result = Object.create(null);\n    if (attrs)\n        for (let name in attrs)\n            result[name] = new Attribute(attrs[name]);\n    return result;\n}\n/**\nNode types are objects allocated once per `Schema` and used to\n[tag](https://prosemirror.net/docs/ref/#model.Node.type) `Node` instances. They contain information\nabout the node type, such as its name and what kind of node it\nrepresents.\n*/\nclass NodeType {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The name the node type has in this schema.\n    */\n    name, \n    /**\n    A link back to the `Schema` the node type belongs to.\n    */\n    schema, \n    /**\n    The spec that this type is based on\n    */\n    spec) {\n        this.name = name;\n        this.schema = schema;\n        this.spec = spec;\n        /**\n        The set of marks allowed in this node. `null` means all marks\n        are allowed.\n        */\n        this.markSet = null;\n        this.groups = spec.group ? spec.group.split(\" \") : [];\n        this.attrs = initAttrs(spec.attrs);\n        this.defaultAttrs = defaultAttrs(this.attrs);\n        this.contentMatch = null;\n        this.inlineContent = null;\n        this.isBlock = !(spec.inline || name == \"text\");\n        this.isText = name == \"text\";\n    }\n    /**\n    True if this is an inline type.\n    */\n    get isInline() { return !this.isBlock; }\n    /**\n    True if this is a textblock type, a block that contains inline\n    content.\n    */\n    get isTextblock() { return this.isBlock && this.inlineContent; }\n    /**\n    True for node types that allow no content.\n    */\n    get isLeaf() { return this.contentMatch == ContentMatch.empty; }\n    /**\n    True when this node is an atom, i.e. when it does not have\n    directly editable content.\n    */\n    get isAtom() { return this.isLeaf || !!this.spec.atom; }\n    /**\n    The node type's [whitespace](https://prosemirror.net/docs/ref/#model.NodeSpec.whitespace) option.\n    */\n    get whitespace() {\n        return this.spec.whitespace || (this.spec.code ? \"pre\" : \"normal\");\n    }\n    /**\n    Tells you whether this node type has any required attributes.\n    */\n    hasRequiredAttrs() {\n        for (let n in this.attrs)\n            if (this.attrs[n].isRequired)\n                return true;\n        return false;\n    }\n    /**\n    Indicates whether this node allows some of the same content as\n    the given node type.\n    */\n    compatibleContent(other) {\n        return this == other || this.contentMatch.compatible(other.contentMatch);\n    }\n    /**\n    @internal\n    */\n    computeAttrs(attrs) {\n        if (!attrs && this.defaultAttrs)\n            return this.defaultAttrs;\n        else\n            return computeAttrs(this.attrs, attrs);\n    }\n    /**\n    Create a `Node` of this type. The given attributes are\n    checked and defaulted (you can pass `null` to use the type's\n    defaults entirely, if no required attributes exist). `content`\n    may be a `Fragment`, a node, an array of nodes, or\n    `null`. Similarly `marks` may be `null` to default to the empty\n    set of marks.\n    */\n    create(attrs = null, content, marks) {\n        if (this.isText)\n            throw new Error(\"NodeType.create can't construct text nodes\");\n        return new Node(this, this.computeAttrs(attrs), Fragment.from(content), Mark.setFrom(marks));\n    }\n    /**\n    Like [`create`](https://prosemirror.net/docs/ref/#model.NodeType.create), but check the given content\n    against the node type's content restrictions, and throw an error\n    if it doesn't match.\n    */\n    createChecked(attrs = null, content, marks) {\n        content = Fragment.from(content);\n        this.checkContent(content);\n        return new Node(this, this.computeAttrs(attrs), content, Mark.setFrom(marks));\n    }\n    /**\n    Like [`create`](https://prosemirror.net/docs/ref/#model.NodeType.create), but see if it is\n    necessary to add nodes to the start or end of the given fragment\n    to make it fit the node. If no fitting wrapping can be found,\n    return null. Note that, due to the fact that required nodes can\n    always be created, this will always succeed if you pass null or\n    `Fragment.empty` as content.\n    */\n    createAndFill(attrs = null, content, marks) {\n        attrs = this.computeAttrs(attrs);\n        content = Fragment.from(content);\n        if (content.size) {\n            let before = this.contentMatch.fillBefore(content);\n            if (!before)\n                return null;\n            content = before.append(content);\n        }\n        let matched = this.contentMatch.matchFragment(content);\n        let after = matched && matched.fillBefore(Fragment.empty, true);\n        if (!after)\n            return null;\n        return new Node(this, attrs, content.append(after), Mark.setFrom(marks));\n    }\n    /**\n    Returns true if the given fragment is valid content for this node\n    type.\n    */\n    validContent(content) {\n        let result = this.contentMatch.matchFragment(content);\n        if (!result || !result.validEnd)\n            return false;\n        for (let i = 0; i < content.childCount; i++)\n            if (!this.allowsMarks(content.child(i).marks))\n                return false;\n        return true;\n    }\n    /**\n    Throws a RangeError if the given fragment is not valid content for this\n    node type.\n    @internal\n    */\n    checkContent(content) {\n        if (!this.validContent(content))\n            throw new RangeError(`Invalid content for node ${this.name}: ${content.toString().slice(0, 50)}`);\n    }\n    /**\n    @internal\n    */\n    checkAttrs(attrs) {\n        checkAttrs(this.attrs, attrs, \"node\", this.name);\n    }\n    /**\n    Check whether the given mark type is allowed in this node.\n    */\n    allowsMarkType(markType) {\n        return this.markSet == null || this.markSet.indexOf(markType) > -1;\n    }\n    /**\n    Test whether the given set of marks are allowed in this node.\n    */\n    allowsMarks(marks) {\n        if (this.markSet == null)\n            return true;\n        for (let i = 0; i < marks.length; i++)\n            if (!this.allowsMarkType(marks[i].type))\n                return false;\n        return true;\n    }\n    /**\n    Removes the marks that are not allowed in this node from the given set.\n    */\n    allowedMarks(marks) {\n        if (this.markSet == null)\n            return marks;\n        let copy;\n        for (let i = 0; i < marks.length; i++) {\n            if (!this.allowsMarkType(marks[i].type)) {\n                if (!copy)\n                    copy = marks.slice(0, i);\n            }\n            else if (copy) {\n                copy.push(marks[i]);\n            }\n        }\n        return !copy ? marks : copy.length ? copy : Mark.none;\n    }\n    /**\n    @internal\n    */\n    static compile(nodes, schema) {\n        let result = Object.create(null);\n        nodes.forEach((name, spec) => result[name] = new NodeType(name, schema, spec));\n        let topType = schema.spec.topNode || \"doc\";\n        if (!result[topType])\n            throw new RangeError(\"Schema is missing its top node type ('\" + topType + \"')\");\n        if (!result.text)\n            throw new RangeError(\"Every schema needs a 'text' type\");\n        for (let _ in result.text.attrs)\n            throw new RangeError(\"The text node type should not have attributes\");\n        return result;\n    }\n}\nfunction validateType(type) {\n    let types = type.split(\"|\");\n    return (value) => {\n        let name = value === null ? \"null\" : typeof value;\n        if (types.indexOf(name) < 0)\n            throw new RangeError(`Expected value of type ${types}, got ${name}`);\n    };\n}\n// Attribute descriptors\nclass Attribute {\n    constructor(options) {\n        this.hasDefault = Object.prototype.hasOwnProperty.call(options, \"default\");\n        this.default = options.default;\n        this.validate = typeof options.validate == \"string\" ? validateType(options.validate) : options.validate;\n    }\n    get isRequired() {\n        return !this.hasDefault;\n    }\n}\n// Marks\n/**\nLike nodes, marks (which are associated with nodes to signify\nthings like emphasis or being part of a link) are\n[tagged](https://prosemirror.net/docs/ref/#model.Mark.type) with type objects, which are\ninstantiated once per `Schema`.\n*/\nclass MarkType {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The name of the mark type.\n    */\n    name, \n    /**\n    @internal\n    */\n    rank, \n    /**\n    The schema that this mark type instance is part of.\n    */\n    schema, \n    /**\n    The spec on which the type is based.\n    */\n    spec) {\n        this.name = name;\n        this.rank = rank;\n        this.schema = schema;\n        this.spec = spec;\n        this.attrs = initAttrs(spec.attrs);\n        this.excluded = null;\n        let defaults = defaultAttrs(this.attrs);\n        this.instance = defaults ? new Mark(this, defaults) : null;\n    }\n    /**\n    Create a mark of this type. `attrs` may be `null` or an object\n    containing only some of the mark's attributes. The others, if\n    they have defaults, will be added.\n    */\n    create(attrs = null) {\n        if (!attrs && this.instance)\n            return this.instance;\n        return new Mark(this, computeAttrs(this.attrs, attrs));\n    }\n    /**\n    @internal\n    */\n    static compile(marks, schema) {\n        let result = Object.create(null), rank = 0;\n        marks.forEach((name, spec) => result[name] = new MarkType(name, rank++, schema, spec));\n        return result;\n    }\n    /**\n    When there is a mark of this type in the given set, a new set\n    without it is returned. Otherwise, the input set is returned.\n    */\n    removeFromSet(set) {\n        for (var i = 0; i < set.length; i++)\n            if (set[i].type == this) {\n                set = set.slice(0, i).concat(set.slice(i + 1));\n                i--;\n            }\n        return set;\n    }\n    /**\n    Tests whether there is a mark of this type in the given set.\n    */\n    isInSet(set) {\n        for (let i = 0; i < set.length; i++)\n            if (set[i].type == this)\n                return set[i];\n    }\n    /**\n    @internal\n    */\n    checkAttrs(attrs) {\n        checkAttrs(this.attrs, attrs, \"mark\", this.name);\n    }\n    /**\n    Queries whether a given mark type is\n    [excluded](https://prosemirror.net/docs/ref/#model.MarkSpec.excludes) by this one.\n    */\n    excludes(other) {\n        return this.excluded.indexOf(other) > -1;\n    }\n}\n/**\nA document schema. Holds [node](https://prosemirror.net/docs/ref/#model.NodeType) and [mark\ntype](https://prosemirror.net/docs/ref/#model.MarkType) objects for the nodes and marks that may\noccur in conforming documents, and provides functionality for\ncreating and deserializing such documents.\n\nWhen given, the type parameters provide the names of the nodes and\nmarks in this schema.\n*/\nclass Schema {\n    /**\n    Construct a schema from a schema [specification](https://prosemirror.net/docs/ref/#model.SchemaSpec).\n    */\n    constructor(spec) {\n        /**\n        The [linebreak\n        replacement](https://prosemirror.net/docs/ref/#model.NodeSpec.linebreakReplacement) node defined\n        in this schema, if any.\n        */\n        this.linebreakReplacement = null;\n        /**\n        An object for storing whatever values modules may want to\n        compute and cache per schema. (If you want to store something\n        in it, try to use property names unlikely to clash.)\n        */\n        this.cached = Object.create(null);\n        let instanceSpec = this.spec = {};\n        for (let prop in spec)\n            instanceSpec[prop] = spec[prop];\n        instanceSpec.nodes = OrderedMap.from(spec.nodes),\n            instanceSpec.marks = OrderedMap.from(spec.marks || {}),\n            this.nodes = NodeType.compile(this.spec.nodes, this);\n        this.marks = MarkType.compile(this.spec.marks, this);\n        let contentExprCache = Object.create(null);\n        for (let prop in this.nodes) {\n            if (prop in this.marks)\n                throw new RangeError(prop + \" can not be both a node and a mark\");\n            let type = this.nodes[prop], contentExpr = type.spec.content || \"\", markExpr = type.spec.marks;\n            type.contentMatch = contentExprCache[contentExpr] ||\n                (contentExprCache[contentExpr] = ContentMatch.parse(contentExpr, this.nodes));\n            type.inlineContent = type.contentMatch.inlineContent;\n            if (type.spec.linebreakReplacement) {\n                if (this.linebreakReplacement)\n                    throw new RangeError(\"Multiple linebreak nodes defined\");\n                if (!type.isInline || !type.isLeaf)\n                    throw new RangeError(\"Linebreak replacement nodes must be inline leaf nodes\");\n                this.linebreakReplacement = type;\n            }\n            type.markSet = markExpr == \"_\" ? null :\n                markExpr ? gatherMarks(this, markExpr.split(\" \")) :\n                    markExpr == \"\" || !type.inlineContent ? [] : null;\n        }\n        for (let prop in this.marks) {\n            let type = this.marks[prop], excl = type.spec.excludes;\n            type.excluded = excl == null ? [type] : excl == \"\" ? [] : gatherMarks(this, excl.split(\" \"));\n        }\n        this.nodeFromJSON = this.nodeFromJSON.bind(this);\n        this.markFromJSON = this.markFromJSON.bind(this);\n        this.topNodeType = this.nodes[this.spec.topNode || \"doc\"];\n        this.cached.wrappings = Object.create(null);\n    }\n    /**\n    Create a node in this schema. The `type` may be a string or a\n    `NodeType` instance. Attributes will be extended with defaults,\n    `content` may be a `Fragment`, `null`, a `Node`, or an array of\n    nodes.\n    */\n    node(type, attrs = null, content, marks) {\n        if (typeof type == \"string\")\n            type = this.nodeType(type);\n        else if (!(type instanceof NodeType))\n            throw new RangeError(\"Invalid node type: \" + type);\n        else if (type.schema != this)\n            throw new RangeError(\"Node type from different schema used (\" + type.name + \")\");\n        return type.createChecked(attrs, content, marks);\n    }\n    /**\n    Create a text node in the schema. Empty text nodes are not\n    allowed.\n    */\n    text(text, marks) {\n        let type = this.nodes.text;\n        return new TextNode(type, type.defaultAttrs, text, Mark.setFrom(marks));\n    }\n    /**\n    Create a mark with the given type and attributes.\n    */\n    mark(type, attrs) {\n        if (typeof type == \"string\")\n            type = this.marks[type];\n        return type.create(attrs);\n    }\n    /**\n    Deserialize a node from its JSON representation. This method is\n    bound.\n    */\n    nodeFromJSON(json) {\n        return Node.fromJSON(this, json);\n    }\n    /**\n    Deserialize a mark from its JSON representation. This method is\n    bound.\n    */\n    markFromJSON(json) {\n        return Mark.fromJSON(this, json);\n    }\n    /**\n    @internal\n    */\n    nodeType(name) {\n        let found = this.nodes[name];\n        if (!found)\n            throw new RangeError(\"Unknown node type: \" + name);\n        return found;\n    }\n}\nfunction gatherMarks(schema, marks) {\n    let found = [];\n    for (let i = 0; i < marks.length; i++) {\n        let name = marks[i], mark = schema.marks[name], ok = mark;\n        if (mark) {\n            found.push(mark);\n        }\n        else {\n            for (let prop in schema.marks) {\n                let mark = schema.marks[prop];\n                if (name == \"_\" || (mark.spec.group && mark.spec.group.split(\" \").indexOf(name) > -1))\n                    found.push(ok = mark);\n            }\n        }\n        if (!ok)\n            throw new SyntaxError(\"Unknown mark type: '\" + marks[i] + \"'\");\n    }\n    return found;\n}\n\nfunction isTagRule(rule) { return rule.tag != null; }\nfunction isStyleRule(rule) { return rule.style != null; }\n/**\nA DOM parser represents a strategy for parsing DOM content into a\nProseMirror document conforming to a given schema. Its behavior is\ndefined by an array of [rules](https://prosemirror.net/docs/ref/#model.ParseRule).\n*/\nclass DOMParser {\n    /**\n    Create a parser that targets the given schema, using the given\n    parsing rules.\n    */\n    constructor(\n    /**\n    The schema into which the parser parses.\n    */\n    schema, \n    /**\n    The set of [parse rules](https://prosemirror.net/docs/ref/#model.ParseRule) that the parser\n    uses, in order of precedence.\n    */\n    rules) {\n        this.schema = schema;\n        this.rules = rules;\n        /**\n        @internal\n        */\n        this.tags = [];\n        /**\n        @internal\n        */\n        this.styles = [];\n        let matchedStyles = this.matchedStyles = [];\n        rules.forEach(rule => {\n            if (isTagRule(rule)) {\n                this.tags.push(rule);\n            }\n            else if (isStyleRule(rule)) {\n                let prop = /[^=]*/.exec(rule.style)[0];\n                if (matchedStyles.indexOf(prop) < 0)\n                    matchedStyles.push(prop);\n                this.styles.push(rule);\n            }\n        });\n        // Only normalize list elements when lists in the schema can't directly contain themselves\n        this.normalizeLists = !this.tags.some(r => {\n            if (!/^(ul|ol)\\b/.test(r.tag) || !r.node)\n                return false;\n            let node = schema.nodes[r.node];\n            return node.contentMatch.matchType(node);\n        });\n    }\n    /**\n    Parse a document from the content of a DOM node.\n    */\n    parse(dom, options = {}) {\n        let context = new ParseContext(this, options, false);\n        context.addAll(dom, options.from, options.to);\n        return context.finish();\n    }\n    /**\n    Parses the content of the given DOM node, like\n    [`parse`](https://prosemirror.net/docs/ref/#model.DOMParser.parse), and takes the same set of\n    options. But unlike that method, which produces a whole node,\n    this one returns a slice that is open at the sides, meaning that\n    the schema constraints aren't applied to the start of nodes to\n    the left of the input and the end of nodes at the end.\n    */\n    parseSlice(dom, options = {}) {\n        let context = new ParseContext(this, options, true);\n        context.addAll(dom, options.from, options.to);\n        return Slice.maxOpen(context.finish());\n    }\n    /**\n    @internal\n    */\n    matchTag(dom, context, after) {\n        for (let i = after ? this.tags.indexOf(after) + 1 : 0; i < this.tags.length; i++) {\n            let rule = this.tags[i];\n            if (matches(dom, rule.tag) &&\n                (rule.namespace === undefined || dom.namespaceURI == rule.namespace) &&\n                (!rule.context || context.matchesContext(rule.context))) {\n                if (rule.getAttrs) {\n                    let result = rule.getAttrs(dom);\n                    if (result === false)\n                        continue;\n                    rule.attrs = result || undefined;\n                }\n                return rule;\n            }\n        }\n    }\n    /**\n    @internal\n    */\n    matchStyle(prop, value, context, after) {\n        for (let i = after ? this.styles.indexOf(after) + 1 : 0; i < this.styles.length; i++) {\n            let rule = this.styles[i], style = rule.style;\n            if (style.indexOf(prop) != 0 ||\n                rule.context && !context.matchesContext(rule.context) ||\n                // Test that the style string either precisely matches the prop,\n                // or has an '=' sign after the prop, followed by the given\n                // value.\n                style.length > prop.length &&\n                    (style.charCodeAt(prop.length) != 61 || style.slice(prop.length + 1) != value))\n                continue;\n            if (rule.getAttrs) {\n                let result = rule.getAttrs(value);\n                if (result === false)\n                    continue;\n                rule.attrs = result || undefined;\n            }\n            return rule;\n        }\n    }\n    /**\n    @internal\n    */\n    static schemaRules(schema) {\n        let result = [];\n        function insert(rule) {\n            let priority = rule.priority == null ? 50 : rule.priority, i = 0;\n            for (; i < result.length; i++) {\n                let next = result[i], nextPriority = next.priority == null ? 50 : next.priority;\n                if (nextPriority < priority)\n                    break;\n            }\n            result.splice(i, 0, rule);\n        }\n        for (let name in schema.marks) {\n            let rules = schema.marks[name].spec.parseDOM;\n            if (rules)\n                rules.forEach(rule => {\n                    insert(rule = copy(rule));\n                    if (!(rule.mark || rule.ignore || rule.clearMark))\n                        rule.mark = name;\n                });\n        }\n        for (let name in schema.nodes) {\n            let rules = schema.nodes[name].spec.parseDOM;\n            if (rules)\n                rules.forEach(rule => {\n                    insert(rule = copy(rule));\n                    if (!(rule.node || rule.ignore || rule.mark))\n                        rule.node = name;\n                });\n        }\n        return result;\n    }\n    /**\n    Construct a DOM parser using the parsing rules listed in a\n    schema's [node specs](https://prosemirror.net/docs/ref/#model.NodeSpec.parseDOM), reordered by\n    [priority](https://prosemirror.net/docs/ref/#model.ParseRule.priority).\n    */\n    static fromSchema(schema) {\n        return schema.cached.domParser ||\n            (schema.cached.domParser = new DOMParser(schema, DOMParser.schemaRules(schema)));\n    }\n}\nconst blockTags = {\n    address: true, article: true, aside: true, blockquote: true, canvas: true,\n    dd: true, div: true, dl: true, fieldset: true, figcaption: true, figure: true,\n    footer: true, form: true, h1: true, h2: true, h3: true, h4: true, h5: true,\n    h6: true, header: true, hgroup: true, hr: true, li: true, noscript: true, ol: true,\n    output: true, p: true, pre: true, section: true, table: true, tfoot: true, ul: true\n};\nconst ignoreTags = {\n    head: true, noscript: true, object: true, script: true, style: true, title: true\n};\nconst listTags = { ol: true, ul: true };\n// Using a bitfield for node context options\nconst OPT_PRESERVE_WS = 1, OPT_PRESERVE_WS_FULL = 2, OPT_OPEN_LEFT = 4;\nfunction wsOptionsFor(type, preserveWhitespace, base) {\n    if (preserveWhitespace != null)\n        return (preserveWhitespace ? OPT_PRESERVE_WS : 0) |\n            (preserveWhitespace === \"full\" ? OPT_PRESERVE_WS_FULL : 0);\n    return type && type.whitespace == \"pre\" ? OPT_PRESERVE_WS | OPT_PRESERVE_WS_FULL : base & ~OPT_OPEN_LEFT;\n}\nclass NodeContext {\n    constructor(type, attrs, \n    // Marks applied to this node itself\n    marks, \n    // Marks that can't apply here, but will be used in children if possible\n    pendingMarks, solid, match, options) {\n        this.type = type;\n        this.attrs = attrs;\n        this.marks = marks;\n        this.pendingMarks = pendingMarks;\n        this.solid = solid;\n        this.options = options;\n        this.content = [];\n        // Marks applied to the node's children\n        this.activeMarks = Mark.none;\n        // Nested Marks with same type\n        this.stashMarks = [];\n        this.match = match || (options & OPT_OPEN_LEFT ? null : type.contentMatch);\n    }\n    findWrapping(node) {\n        if (!this.match) {\n            if (!this.type)\n                return [];\n            let fill = this.type.contentMatch.fillBefore(Fragment.from(node));\n            if (fill) {\n                this.match = this.type.contentMatch.matchFragment(fill);\n            }\n            else {\n                let start = this.type.contentMatch, wrap;\n                if (wrap = start.findWrapping(node.type)) {\n                    this.match = start;\n                    return wrap;\n                }\n                else {\n                    return null;\n                }\n            }\n        }\n        return this.match.findWrapping(node.type);\n    }\n    finish(openEnd) {\n        if (!(this.options & OPT_PRESERVE_WS)) { // Strip trailing whitespace\n            let last = this.content[this.content.length - 1], m;\n            if (last && last.isText && (m = /[ \\t\\r\\n\\u000c]+$/.exec(last.text))) {\n                let text = last;\n                if (last.text.length == m[0].length)\n                    this.content.pop();\n                else\n                    this.content[this.content.length - 1] = text.withText(text.text.slice(0, text.text.length - m[0].length));\n            }\n        }\n        let content = Fragment.from(this.content);\n        if (!openEnd && this.match)\n            content = content.append(this.match.fillBefore(Fragment.empty, true));\n        return this.type ? this.type.create(this.attrs, content, this.marks) : content;\n    }\n    popFromStashMark(mark) {\n        for (let i = this.stashMarks.length - 1; i >= 0; i--)\n            if (mark.eq(this.stashMarks[i]))\n                return this.stashMarks.splice(i, 1)[0];\n    }\n    applyPending(nextType) {\n        for (let i = 0, pending = this.pendingMarks; i < pending.length; i++) {\n            let mark = pending[i];\n            if ((this.type ? this.type.allowsMarkType(mark.type) : markMayApply(mark.type, nextType)) &&\n                !mark.isInSet(this.activeMarks)) {\n                this.activeMarks = mark.addToSet(this.activeMarks);\n                this.pendingMarks = mark.removeFromSet(this.pendingMarks);\n            }\n        }\n    }\n    inlineContext(node) {\n        if (this.type)\n            return this.type.inlineContent;\n        if (this.content.length)\n            return this.content[0].isInline;\n        return node.parentNode && !blockTags.hasOwnProperty(node.parentNode.nodeName.toLowerCase());\n    }\n}\nclass ParseContext {\n    constructor(\n    // The parser we are using.\n    parser, \n    // The options passed to this parse.\n    options, isOpen) {\n        this.parser = parser;\n        this.options = options;\n        this.isOpen = isOpen;\n        this.open = 0;\n        let topNode = options.topNode, topContext;\n        let topOptions = wsOptionsFor(null, options.preserveWhitespace, 0) | (isOpen ? OPT_OPEN_LEFT : 0);\n        if (topNode)\n            topContext = new NodeContext(topNode.type, topNode.attrs, Mark.none, Mark.none, true, options.topMatch || topNode.type.contentMatch, topOptions);\n        else if (isOpen)\n            topContext = new NodeContext(null, null, Mark.none, Mark.none, true, null, topOptions);\n        else\n            topContext = new NodeContext(parser.schema.topNodeType, null, Mark.none, Mark.none, true, null, topOptions);\n        this.nodes = [topContext];\n        this.find = options.findPositions;\n        this.needsBlock = false;\n    }\n    get top() {\n        return this.nodes[this.open];\n    }\n    // Add a DOM node to the content. Text is inserted as text node,\n    // otherwise, the node is passed to `addElement` or, if it has a\n    // `style` attribute, `addElementWithStyles`.\n    addDOM(dom) {\n        if (dom.nodeType == 3)\n            this.addTextNode(dom);\n        else if (dom.nodeType == 1)\n            this.addElement(dom);\n    }\n    withStyleRules(dom, f) {\n        let style = dom.style;\n        if (!style || !style.length)\n            return f();\n        let marks = this.readStyles(dom.style);\n        if (!marks)\n            return; // A style with ignore: true\n        let [addMarks, removeMarks] = marks, top = this.top;\n        for (let i = 0; i < removeMarks.length; i++)\n            this.removePendingMark(removeMarks[i], top);\n        for (let i = 0; i < addMarks.length; i++)\n            this.addPendingMark(addMarks[i]);\n        f();\n        for (let i = 0; i < addMarks.length; i++)\n            this.removePendingMark(addMarks[i], top);\n        for (let i = 0; i < removeMarks.length; i++)\n            this.addPendingMark(removeMarks[i]);\n    }\n    addTextNode(dom) {\n        let value = dom.nodeValue;\n        let top = this.top;\n        if (top.options & OPT_PRESERVE_WS_FULL ||\n            top.inlineContext(dom) ||\n            /[^ \\t\\r\\n\\u000c]/.test(value)) {\n            if (!(top.options & OPT_PRESERVE_WS)) {\n                value = value.replace(/[ \\t\\r\\n\\u000c]+/g, \" \");\n                // If this starts with whitespace, and there is no node before it, or\n                // a hard break, or a text node that ends with whitespace, strip the\n                // leading space.\n                if (/^[ \\t\\r\\n\\u000c]/.test(value) && this.open == this.nodes.length - 1) {\n                    let nodeBefore = top.content[top.content.length - 1];\n                    let domNodeBefore = dom.previousSibling;\n                    if (!nodeBefore ||\n                        (domNodeBefore && domNodeBefore.nodeName == 'BR') ||\n                        (nodeBefore.isText && /[ \\t\\r\\n\\u000c]$/.test(nodeBefore.text)))\n                        value = value.slice(1);\n                }\n            }\n            else if (!(top.options & OPT_PRESERVE_WS_FULL)) {\n                value = value.replace(/\\r?\\n|\\r/g, \" \");\n            }\n            else {\n                value = value.replace(/\\r\\n?/g, \"\\n\");\n            }\n            if (value)\n                this.insertNode(this.parser.schema.text(value));\n            this.findInText(dom);\n        }\n        else {\n            this.findInside(dom);\n        }\n    }\n    // Try to find a handler for the given tag and use that to parse. If\n    // none is found, the element's content nodes are added directly.\n    addElement(dom, matchAfter) {\n        let name = dom.nodeName.toLowerCase(), ruleID;\n        if (listTags.hasOwnProperty(name) && this.parser.normalizeLists)\n            normalizeList(dom);\n        let rule = (this.options.ruleFromNode && this.options.ruleFromNode(dom)) ||\n            (ruleID = this.parser.matchTag(dom, this, matchAfter));\n        if (rule ? rule.ignore : ignoreTags.hasOwnProperty(name)) {\n            this.findInside(dom);\n            this.ignoreFallback(dom);\n        }\n        else if (!rule || rule.skip || rule.closeParent) {\n            if (rule && rule.closeParent)\n                this.open = Math.max(0, this.open - 1);\n            else if (rule && rule.skip.nodeType)\n                dom = rule.skip;\n            let sync, top = this.top, oldNeedsBlock = this.needsBlock;\n            if (blockTags.hasOwnProperty(name)) {\n                if (top.content.length && top.content[0].isInline && this.open) {\n                    this.open--;\n                    top = this.top;\n                }\n                sync = true;\n                if (!top.type)\n                    this.needsBlock = true;\n            }\n            else if (!dom.firstChild) {\n                this.leafFallback(dom);\n                return;\n            }\n            if (rule && rule.skip)\n                this.addAll(dom);\n            else\n                this.withStyleRules(dom, () => this.addAll(dom));\n            if (sync)\n                this.sync(top);\n            this.needsBlock = oldNeedsBlock;\n        }\n        else {\n            this.withStyleRules(dom, () => {\n                this.addElementByRule(dom, rule, rule.consuming === false ? ruleID : undefined);\n            });\n        }\n    }\n    // Called for leaf DOM nodes that would otherwise be ignored\n    leafFallback(dom) {\n        if (dom.nodeName == \"BR\" && this.top.type && this.top.type.inlineContent)\n            this.addTextNode(dom.ownerDocument.createTextNode(\"\\n\"));\n    }\n    // Called for ignored nodes\n    ignoreFallback(dom) {\n        // Ignored BR nodes should at least create an inline context\n        if (dom.nodeName == \"BR\" && (!this.top.type || !this.top.type.inlineContent))\n            this.findPlace(this.parser.schema.text(\"-\"));\n    }\n    // Run any style parser associated with the node's styles. Either\n    // return an array of marks, or null to indicate some of the styles\n    // had a rule with `ignore` set.\n    readStyles(styles) {\n        let add = Mark.none, remove = Mark.none;\n        // Because many properties will only show up in 'normalized' form\n        // in `style.item` (i.e. text-decoration becomes\n        // text-decoration-line, text-decoration-color, etc), we directly\n        // query the styles mentioned in our rules instead of iterating\n        // over the items.\n        if (styles.length)\n            for (let i = 0; i < this.parser.matchedStyles.length; i++) {\n                let name = this.parser.matchedStyles[i], value = styles.getPropertyValue(name);\n                if (value)\n                    for (let after = undefined;;) {\n                        let rule = this.parser.matchStyle(name, value, this, after);\n                        if (!rule)\n                            break;\n                        if (rule.ignore)\n                            return null;\n                        if (rule.clearMark) {\n                            this.top.pendingMarks.concat(this.top.activeMarks).forEach(m => {\n                                if (rule.clearMark(m))\n                                    remove = m.addToSet(remove);\n                            });\n                        }\n                        else {\n                            add = this.parser.schema.marks[rule.mark].create(rule.attrs).addToSet(add);\n                        }\n                        if (rule.consuming === false)\n                            after = rule;\n                        else\n                            break;\n                    }\n            }\n        return [add, remove];\n    }\n    // Look up a handler for the given node. If none are found, return\n    // false. Otherwise, apply it, use its return value to drive the way\n    // the node's content is wrapped, and return true.\n    addElementByRule(dom, rule, continueAfter) {\n        let sync, nodeType, mark;\n        if (rule.node) {\n            nodeType = this.parser.schema.nodes[rule.node];\n            if (!nodeType.isLeaf) {\n                sync = this.enter(nodeType, rule.attrs || null, rule.preserveWhitespace);\n            }\n            else if (!this.insertNode(nodeType.create(rule.attrs))) {\n                this.leafFallback(dom);\n            }\n        }\n        else {\n            let markType = this.parser.schema.marks[rule.mark];\n            mark = markType.create(rule.attrs);\n            this.addPendingMark(mark);\n        }\n        let startIn = this.top;\n        if (nodeType && nodeType.isLeaf) {\n            this.findInside(dom);\n        }\n        else if (continueAfter) {\n            this.addElement(dom, continueAfter);\n        }\n        else if (rule.getContent) {\n            this.findInside(dom);\n            rule.getContent(dom, this.parser.schema).forEach(node => this.insertNode(node));\n        }\n        else {\n            let contentDOM = dom;\n            if (typeof rule.contentElement == \"string\")\n                contentDOM = dom.querySelector(rule.contentElement);\n            else if (typeof rule.contentElement == \"function\")\n                contentDOM = rule.contentElement(dom);\n            else if (rule.contentElement)\n                contentDOM = rule.contentElement;\n            this.findAround(dom, contentDOM, true);\n            this.addAll(contentDOM);\n        }\n        if (sync && this.sync(startIn))\n            this.open--;\n        if (mark)\n            this.removePendingMark(mark, startIn);\n    }\n    // Add all child nodes between `startIndex` and `endIndex` (or the\n    // whole node, if not given). If `sync` is passed, use it to\n    // synchronize after every block element.\n    addAll(parent, startIndex, endIndex) {\n        let index = startIndex || 0;\n        for (let dom = startIndex ? parent.childNodes[startIndex] : parent.firstChild, end = endIndex == null ? null : parent.childNodes[endIndex]; dom != end; dom = dom.nextSibling, ++index) {\n            this.findAtPoint(parent, index);\n            this.addDOM(dom);\n        }\n        this.findAtPoint(parent, index);\n    }\n    // Try to find a way to fit the given node type into the current\n    // context. May add intermediate wrappers and/or leave non-solid\n    // nodes that we're in.\n    findPlace(node) {\n        let route, sync;\n        for (let depth = this.open; depth >= 0; depth--) {\n            let cx = this.nodes[depth];\n            let found = cx.findWrapping(node);\n            if (found && (!route || route.length > found.length)) {\n                route = found;\n                sync = cx;\n                if (!found.length)\n                    break;\n            }\n            if (cx.solid)\n                break;\n        }\n        if (!route)\n            return false;\n        this.sync(sync);\n        for (let i = 0; i < route.length; i++)\n            this.enterInner(route[i], null, false);\n        return true;\n    }\n    // Try to insert the given node, adjusting the context when needed.\n    insertNode(node) {\n        if (node.isInline && this.needsBlock && !this.top.type) {\n            let block = this.textblockFromContext();\n            if (block)\n                this.enterInner(block);\n        }\n        if (this.findPlace(node)) {\n            this.closeExtra();\n            let top = this.top;\n            top.applyPending(node.type);\n            if (top.match)\n                top.match = top.match.matchType(node.type);\n            let marks = top.activeMarks;\n            for (let i = 0; i < node.marks.length; i++)\n                if (!top.type || top.type.allowsMarkType(node.marks[i].type))\n                    marks = node.marks[i].addToSet(marks);\n            top.content.push(node.mark(marks));\n            return true;\n        }\n        return false;\n    }\n    // Try to start a node of the given type, adjusting the context when\n    // necessary.\n    enter(type, attrs, preserveWS) {\n        let ok = this.findPlace(type.create(attrs));\n        if (ok)\n            this.enterInner(type, attrs, true, preserveWS);\n        return ok;\n    }\n    // Open a node of the given type\n    enterInner(type, attrs = null, solid = false, preserveWS) {\n        this.closeExtra();\n        let top = this.top;\n        top.applyPending(type);\n        top.match = top.match && top.match.matchType(type);\n        let options = wsOptionsFor(type, preserveWS, top.options);\n        if ((top.options & OPT_OPEN_LEFT) && top.content.length == 0)\n            options |= OPT_OPEN_LEFT;\n        this.nodes.push(new NodeContext(type, attrs, top.activeMarks, top.pendingMarks, solid, null, options));\n        this.open++;\n    }\n    // Make sure all nodes above this.open are finished and added to\n    // their parents\n    closeExtra(openEnd = false) {\n        let i = this.nodes.length - 1;\n        if (i > this.open) {\n            for (; i > this.open; i--)\n                this.nodes[i - 1].content.push(this.nodes[i].finish(openEnd));\n            this.nodes.length = this.open + 1;\n        }\n    }\n    finish() {\n        this.open = 0;\n        this.closeExtra(this.isOpen);\n        return this.nodes[0].finish(this.isOpen || this.options.topOpen);\n    }\n    sync(to) {\n        for (let i = this.open; i >= 0; i--)\n            if (this.nodes[i] == to) {\n                this.open = i;\n                return true;\n            }\n        return false;\n    }\n    get currentPos() {\n        this.closeExtra();\n        let pos = 0;\n        for (let i = this.open; i >= 0; i--) {\n            let content = this.nodes[i].content;\n            for (let j = content.length - 1; j >= 0; j--)\n                pos += content[j].nodeSize;\n            if (i)\n                pos++;\n        }\n        return pos;\n    }\n    findAtPoint(parent, offset) {\n        if (this.find)\n            for (let i = 0; i < this.find.length; i++) {\n                if (this.find[i].node == parent && this.find[i].offset == offset)\n                    this.find[i].pos = this.currentPos;\n            }\n    }\n    findInside(parent) {\n        if (this.find)\n            for (let i = 0; i < this.find.length; i++) {\n                if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node))\n                    this.find[i].pos = this.currentPos;\n            }\n    }\n    findAround(parent, content, before) {\n        if (parent != content && this.find)\n            for (let i = 0; i < this.find.length; i++) {\n                if (this.find[i].pos == null && parent.nodeType == 1 && parent.contains(this.find[i].node)) {\n                    let pos = content.compareDocumentPosition(this.find[i].node);\n                    if (pos & (before ? 2 : 4))\n                        this.find[i].pos = this.currentPos;\n                }\n            }\n    }\n    findInText(textNode) {\n        if (this.find)\n            for (let i = 0; i < this.find.length; i++) {\n                if (this.find[i].node == textNode)\n                    this.find[i].pos = this.currentPos - (textNode.nodeValue.length - this.find[i].offset);\n            }\n    }\n    // Determines whether the given context string matches this context.\n    matchesContext(context) {\n        if (context.indexOf(\"|\") > -1)\n            return context.split(/\\s*\\|\\s*/).some(this.matchesContext, this);\n        let parts = context.split(\"/\");\n        let option = this.options.context;\n        let useRoot = !this.isOpen && (!option || option.parent.type == this.nodes[0].type);\n        let minDepth = -(option ? option.depth + 1 : 0) + (useRoot ? 0 : 1);\n        let match = (i, depth) => {\n            for (; i >= 0; i--) {\n                let part = parts[i];\n                if (part == \"\") {\n                    if (i == parts.length - 1 || i == 0)\n                        continue;\n                    for (; depth >= minDepth; depth--)\n                        if (match(i - 1, depth))\n                            return true;\n                    return false;\n                }\n                else {\n                    let next = depth > 0 || (depth == 0 && useRoot) ? this.nodes[depth].type\n                        : option && depth >= minDepth ? option.node(depth - minDepth).type\n                            : null;\n                    if (!next || (next.name != part && next.groups.indexOf(part) == -1))\n                        return false;\n                    depth--;\n                }\n            }\n            return true;\n        };\n        return match(parts.length - 1, this.open);\n    }\n    textblockFromContext() {\n        let $context = this.options.context;\n        if ($context)\n            for (let d = $context.depth; d >= 0; d--) {\n                let deflt = $context.node(d).contentMatchAt($context.indexAfter(d)).defaultType;\n                if (deflt && deflt.isTextblock && deflt.defaultAttrs)\n                    return deflt;\n            }\n        for (let name in this.parser.schema.nodes) {\n            let type = this.parser.schema.nodes[name];\n            if (type.isTextblock && type.defaultAttrs)\n                return type;\n        }\n    }\n    addPendingMark(mark) {\n        let found = findSameMarkInSet(mark, this.top.pendingMarks);\n        if (found)\n            this.top.stashMarks.push(found);\n        this.top.pendingMarks = mark.addToSet(this.top.pendingMarks);\n    }\n    removePendingMark(mark, upto) {\n        for (let depth = this.open; depth >= 0; depth--) {\n            let level = this.nodes[depth];\n            let found = level.pendingMarks.lastIndexOf(mark);\n            if (found > -1) {\n                level.pendingMarks = mark.removeFromSet(level.pendingMarks);\n            }\n            else {\n                level.activeMarks = mark.removeFromSet(level.activeMarks);\n                let stashMark = level.popFromStashMark(mark);\n                if (stashMark && level.type && level.type.allowsMarkType(stashMark.type))\n                    level.activeMarks = stashMark.addToSet(level.activeMarks);\n            }\n            if (level == upto)\n                break;\n        }\n    }\n}\n// Kludge to work around directly nested list nodes produced by some\n// tools and allowed by browsers to mean that the nested list is\n// actually part of the list item above it.\nfunction normalizeList(dom) {\n    for (let child = dom.firstChild, prevItem = null; child; child = child.nextSibling) {\n        let name = child.nodeType == 1 ? child.nodeName.toLowerCase() : null;\n        if (name && listTags.hasOwnProperty(name) && prevItem) {\n            prevItem.appendChild(child);\n            child = prevItem;\n        }\n        else if (name == \"li\") {\n            prevItem = child;\n        }\n        else if (name) {\n            prevItem = null;\n        }\n    }\n}\n// Apply a CSS selector.\nfunction matches(dom, selector) {\n    return (dom.matches || dom.msMatchesSelector || dom.webkitMatchesSelector || dom.mozMatchesSelector).call(dom, selector);\n}\nfunction copy(obj) {\n    let copy = {};\n    for (let prop in obj)\n        copy[prop] = obj[prop];\n    return copy;\n}\n// Used when finding a mark at the top level of a fragment parse.\n// Checks whether it would be reasonable to apply a given mark type to\n// a given node, by looking at the way the mark occurs in the schema.\nfunction markMayApply(markType, nodeType) {\n    let nodes = nodeType.schema.nodes;\n    for (let name in nodes) {\n        let parent = nodes[name];\n        if (!parent.allowsMarkType(markType))\n            continue;\n        let seen = [], scan = (match) => {\n            seen.push(match);\n            for (let i = 0; i < match.edgeCount; i++) {\n                let { type, next } = match.edge(i);\n                if (type == nodeType)\n                    return true;\n                if (seen.indexOf(next) < 0 && scan(next))\n                    return true;\n            }\n        };\n        if (scan(parent.contentMatch))\n            return true;\n    }\n}\nfunction findSameMarkInSet(mark, set) {\n    for (let i = 0; i < set.length; i++) {\n        if (mark.eq(set[i]))\n            return set[i];\n    }\n}\n\n/**\nA DOM serializer knows how to convert ProseMirror nodes and\nmarks of various types to DOM nodes.\n*/\nclass DOMSerializer {\n    /**\n    Create a serializer. `nodes` should map node names to functions\n    that take a node and return a description of the corresponding\n    DOM. `marks` does the same for mark names, but also gets an\n    argument that tells it whether the mark's content is block or\n    inline content (for typical use, it'll always be inline). A mark\n    serializer may be `null` to indicate that marks of that type\n    should not be serialized.\n    */\n    constructor(\n    /**\n    The node serialization functions.\n    */\n    nodes, \n    /**\n    The mark serialization functions.\n    */\n    marks) {\n        this.nodes = nodes;\n        this.marks = marks;\n    }\n    /**\n    Serialize the content of this fragment to a DOM fragment. When\n    not in the browser, the `document` option, containing a DOM\n    document, should be passed so that the serializer can create\n    nodes.\n    */\n    serializeFragment(fragment, options = {}, target) {\n        if (!target)\n            target = doc(options).createDocumentFragment();\n        let top = target, active = [];\n        fragment.forEach(node => {\n            if (active.length || node.marks.length) {\n                let keep = 0, rendered = 0;\n                while (keep < active.length && rendered < node.marks.length) {\n                    let next = node.marks[rendered];\n                    if (!this.marks[next.type.name]) {\n                        rendered++;\n                        continue;\n                    }\n                    if (!next.eq(active[keep][0]) || next.type.spec.spanning === false)\n                        break;\n                    keep++;\n                    rendered++;\n                }\n                while (keep < active.length)\n                    top = active.pop()[1];\n                while (rendered < node.marks.length) {\n                    let add = node.marks[rendered++];\n                    let markDOM = this.serializeMark(add, node.isInline, options);\n                    if (markDOM) {\n                        active.push([add, top]);\n                        top.appendChild(markDOM.dom);\n                        top = markDOM.contentDOM || markDOM.dom;\n                    }\n                }\n            }\n            top.appendChild(this.serializeNodeInner(node, options));\n        });\n        return target;\n    }\n    /**\n    @internal\n    */\n    serializeNodeInner(node, options) {\n        let { dom, contentDOM } = renderSpec(doc(options), this.nodes[node.type.name](node), null, node.attrs);\n        if (contentDOM) {\n            if (node.isLeaf)\n                throw new RangeError(\"Content hole not allowed in a leaf node spec\");\n            this.serializeFragment(node.content, options, contentDOM);\n        }\n        return dom;\n    }\n    /**\n    Serialize this node to a DOM node. This can be useful when you\n    need to serialize a part of a document, as opposed to the whole\n    document. To serialize a whole document, use\n    [`serializeFragment`](https://prosemirror.net/docs/ref/#model.DOMSerializer.serializeFragment) on\n    its [content](https://prosemirror.net/docs/ref/#model.Node.content).\n    */\n    serializeNode(node, options = {}) {\n        let dom = this.serializeNodeInner(node, options);\n        for (let i = node.marks.length - 1; i >= 0; i--) {\n            let wrap = this.serializeMark(node.marks[i], node.isInline, options);\n            if (wrap) {\n                (wrap.contentDOM || wrap.dom).appendChild(dom);\n                dom = wrap.dom;\n            }\n        }\n        return dom;\n    }\n    /**\n    @internal\n    */\n    serializeMark(mark, inline, options = {}) {\n        let toDOM = this.marks[mark.type.name];\n        return toDOM && renderSpec(doc(options), toDOM(mark, inline), null, mark.attrs);\n    }\n    /**\n    Render an [output spec](https://prosemirror.net/docs/ref/#model.DOMOutputSpec) to a DOM node. If\n    the spec has a hole (zero) in it, `contentDOM` will point at the\n    node with the hole.\n    */\n    static renderSpec(doc, structure, xmlNS = null) {\n        return renderSpec(doc, structure, xmlNS);\n    }\n    /**\n    Build a serializer using the [`toDOM`](https://prosemirror.net/docs/ref/#model.NodeSpec.toDOM)\n    properties in a schema's node and mark specs.\n    */\n    static fromSchema(schema) {\n        return schema.cached.domSerializer ||\n            (schema.cached.domSerializer = new DOMSerializer(this.nodesFromSchema(schema), this.marksFromSchema(schema)));\n    }\n    /**\n    Gather the serializers in a schema's node specs into an object.\n    This can be useful as a base to build a custom serializer from.\n    */\n    static nodesFromSchema(schema) {\n        let result = gatherToDOM(schema.nodes);\n        if (!result.text)\n            result.text = node => node.text;\n        return result;\n    }\n    /**\n    Gather the serializers in a schema's mark specs into an object.\n    */\n    static marksFromSchema(schema) {\n        return gatherToDOM(schema.marks);\n    }\n}\nfunction gatherToDOM(obj) {\n    let result = {};\n    for (let name in obj) {\n        let toDOM = obj[name].spec.toDOM;\n        if (toDOM)\n            result[name] = toDOM;\n    }\n    return result;\n}\nfunction doc(options) {\n    return options.document || window.document;\n}\nconst suspiciousAttributeCache = new WeakMap();\nfunction suspiciousAttributes(attrs) {\n    let value = suspiciousAttributeCache.get(attrs);\n    if (value === undefined)\n        suspiciousAttributeCache.set(attrs, value = suspiciousAttributesInner(attrs));\n    return value;\n}\nfunction suspiciousAttributesInner(attrs) {\n    let result = null;\n    function scan(value) {\n        if (value && typeof value == \"object\") {\n            if (Array.isArray(value)) {\n                if (typeof value[0] == \"string\") {\n                    if (!result)\n                        result = [];\n                    result.push(value);\n                }\n                else {\n                    for (let i = 0; i < value.length; i++)\n                        scan(value[i]);\n                }\n            }\n            else {\n                for (let prop in value)\n                    scan(value[prop]);\n            }\n        }\n    }\n    scan(attrs);\n    return result;\n}\nfunction renderSpec(doc, structure, xmlNS, blockArraysIn) {\n    if (typeof structure == \"string\")\n        return { dom: doc.createTextNode(structure) };\n    if (structure.nodeType != null)\n        return { dom: structure };\n    if (structure.dom && structure.dom.nodeType != null)\n        return structure;\n    let tagName = structure[0], suspicious;\n    if (typeof tagName != \"string\")\n        throw new RangeError(\"Invalid array passed to renderSpec\");\n    if (blockArraysIn && (suspicious = suspiciousAttributes(blockArraysIn)) &&\n        suspicious.indexOf(structure) > -1)\n        throw new RangeError(\"Using an array from an attribute object as a DOM spec. This may be an attempted cross site scripting attack.\");\n    let space = tagName.indexOf(\" \");\n    if (space > 0) {\n        xmlNS = tagName.slice(0, space);\n        tagName = tagName.slice(space + 1);\n    }\n    let contentDOM;\n    let dom = (xmlNS ? doc.createElementNS(xmlNS, tagName) : doc.createElement(tagName));\n    let attrs = structure[1], start = 1;\n    if (attrs && typeof attrs == \"object\" && attrs.nodeType == null && !Array.isArray(attrs)) {\n        start = 2;\n        for (let name in attrs)\n            if (attrs[name] != null) {\n                let space = name.indexOf(\" \");\n                if (space > 0)\n                    dom.setAttributeNS(name.slice(0, space), name.slice(space + 1), attrs[name]);\n                else\n                    dom.setAttribute(name, attrs[name]);\n            }\n    }\n    for (let i = start; i < structure.length; i++) {\n        let child = structure[i];\n        if (child === 0) {\n            if (i < structure.length - 1 || i > start)\n                throw new RangeError(\"Content hole must be the only child of its parent node\");\n            return { dom, contentDOM: dom };\n        }\n        else {\n            let { dom: inner, contentDOM: innerContent } = renderSpec(doc, child, xmlNS, blockArraysIn);\n            dom.appendChild(inner);\n            if (innerContent) {\n                if (contentDOM)\n                    throw new RangeError(\"Multiple content holes\");\n                contentDOM = innerContent;\n            }\n        }\n    }\n    return { dom, contentDOM };\n}\n\nexport { ContentMatch, DOMParser, DOMSerializer, Fragment, Mark, MarkType, Node, NodeRange, NodeType, ReplaceError, ResolvedPos, Schema, Slice };\n","import { ReplaceError, Slice, Fragment, MarkType, Mark } from 'prosemirror-model';\n\n// Recovery values encode a range index and an offset. They are\n// represented as numbers, because tons of them will be created when\n// mapping, for example, a large number of decorations. The number's\n// lower 16 bits provide the index, the remaining bits the offset.\n//\n// Note: We intentionally don't use bit shift operators to en- and\n// decode these, since those clip to 32 bits, which we might in rare\n// cases want to overflow. A 64-bit float can represent 48-bit\n// integers precisely.\nconst lower16 = 0xffff;\nconst factor16 = Math.pow(2, 16);\nfunction makeRecover(index, offset) { return index + offset * factor16; }\nfunction recoverIndex(value) { return value & lower16; }\nfunction recoverOffset(value) { return (value - (value & lower16)) / factor16; }\nconst DEL_BEFORE = 1, DEL_AFTER = 2, DEL_ACROSS = 4, DEL_SIDE = 8;\n/**\nAn object representing a mapped position with extra\ninformation.\n*/\nclass MapResult {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The mapped version of the position.\n    */\n    pos, \n    /**\n    @internal\n    */\n    delInfo, \n    /**\n    @internal\n    */\n    recover) {\n        this.pos = pos;\n        this.delInfo = delInfo;\n        this.recover = recover;\n    }\n    /**\n    Tells you whether the position was deleted, that is, whether the\n    step removed the token on the side queried (via the `assoc`)\n    argument from the document.\n    */\n    get deleted() { return (this.delInfo & DEL_SIDE) > 0; }\n    /**\n    Tells you whether the token before the mapped position was deleted.\n    */\n    get deletedBefore() { return (this.delInfo & (DEL_BEFORE | DEL_ACROSS)) > 0; }\n    /**\n    True when the token after the mapped position was deleted.\n    */\n    get deletedAfter() { return (this.delInfo & (DEL_AFTER | DEL_ACROSS)) > 0; }\n    /**\n    Tells whether any of the steps mapped through deletes across the\n    position (including both the token before and after the\n    position).\n    */\n    get deletedAcross() { return (this.delInfo & DEL_ACROSS) > 0; }\n}\n/**\nA map describing the deletions and insertions made by a step, which\ncan be used to find the correspondence between positions in the\npre-step version of a document and the same position in the\npost-step version.\n*/\nclass StepMap {\n    /**\n    Create a position map. The modifications to the document are\n    represented as an array of numbers, in which each group of three\n    represents a modified chunk as `[start, oldSize, newSize]`.\n    */\n    constructor(\n    /**\n    @internal\n    */\n    ranges, \n    /**\n    @internal\n    */\n    inverted = false) {\n        this.ranges = ranges;\n        this.inverted = inverted;\n        if (!ranges.length && StepMap.empty)\n            return StepMap.empty;\n    }\n    /**\n    @internal\n    */\n    recover(value) {\n        let diff = 0, index = recoverIndex(value);\n        if (!this.inverted)\n            for (let i = 0; i < index; i++)\n                diff += this.ranges[i * 3 + 2] - this.ranges[i * 3 + 1];\n        return this.ranges[index * 3] + diff + recoverOffset(value);\n    }\n    mapResult(pos, assoc = 1) { return this._map(pos, assoc, false); }\n    map(pos, assoc = 1) { return this._map(pos, assoc, true); }\n    /**\n    @internal\n    */\n    _map(pos, assoc, simple) {\n        let diff = 0, oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n        for (let i = 0; i < this.ranges.length; i += 3) {\n            let start = this.ranges[i] - (this.inverted ? diff : 0);\n            if (start > pos)\n                break;\n            let oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex], end = start + oldSize;\n            if (pos <= end) {\n                let side = !oldSize ? assoc : pos == start ? -1 : pos == end ? 1 : assoc;\n                let result = start + diff + (side < 0 ? 0 : newSize);\n                if (simple)\n                    return result;\n                let recover = pos == (assoc < 0 ? start : end) ? null : makeRecover(i / 3, pos - start);\n                let del = pos == start ? DEL_AFTER : pos == end ? DEL_BEFORE : DEL_ACROSS;\n                if (assoc < 0 ? pos != start : pos != end)\n                    del |= DEL_SIDE;\n                return new MapResult(result, del, recover);\n            }\n            diff += newSize - oldSize;\n        }\n        return simple ? pos + diff : new MapResult(pos + diff, 0, null);\n    }\n    /**\n    @internal\n    */\n    touches(pos, recover) {\n        let diff = 0, index = recoverIndex(recover);\n        let oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n        for (let i = 0; i < this.ranges.length; i += 3) {\n            let start = this.ranges[i] - (this.inverted ? diff : 0);\n            if (start > pos)\n                break;\n            let oldSize = this.ranges[i + oldIndex], end = start + oldSize;\n            if (pos <= end && i == index * 3)\n                return true;\n            diff += this.ranges[i + newIndex] - oldSize;\n        }\n        return false;\n    }\n    /**\n    Calls the given function on each of the changed ranges included in\n    this map.\n    */\n    forEach(f) {\n        let oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n        for (let i = 0, diff = 0; i < this.ranges.length; i += 3) {\n            let start = this.ranges[i], oldStart = start - (this.inverted ? diff : 0), newStart = start + (this.inverted ? 0 : diff);\n            let oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex];\n            f(oldStart, oldStart + oldSize, newStart, newStart + newSize);\n            diff += newSize - oldSize;\n        }\n    }\n    /**\n    Create an inverted version of this map. The result can be used to\n    map positions in the post-step document to the pre-step document.\n    */\n    invert() {\n        return new StepMap(this.ranges, !this.inverted);\n    }\n    /**\n    @internal\n    */\n    toString() {\n        return (this.inverted ? \"-\" : \"\") + JSON.stringify(this.ranges);\n    }\n    /**\n    Create a map that moves all positions by offset `n` (which may be\n    negative). This can be useful when applying steps meant for a\n    sub-document to a larger document, or vice-versa.\n    */\n    static offset(n) {\n        return n == 0 ? StepMap.empty : new StepMap(n < 0 ? [0, -n, 0] : [0, 0, n]);\n    }\n}\n/**\nA StepMap that contains no changed ranges.\n*/\nStepMap.empty = new StepMap([]);\n/**\nA mapping represents a pipeline of zero or more [step\nmaps](https://prosemirror.net/docs/ref/#transform.StepMap). It has special provisions for losslessly\nhandling mapping positions through a series of steps in which some\nsteps are inverted versions of earlier steps. (This comes up when\n‘[rebasing](/docs/guide/#transform.rebasing)’ steps for\ncollaboration or history management.)\n*/\nclass Mapping {\n    /**\n    Create a new mapping with the given position maps.\n    */\n    constructor(\n    /**\n    The step maps in this mapping.\n    */\n    maps = [], \n    /**\n    @internal\n    */\n    mirror, \n    /**\n    The starting position in the `maps` array, used when `map` or\n    `mapResult` is called.\n    */\n    from = 0, \n    /**\n    The end position in the `maps` array.\n    */\n    to = maps.length) {\n        this.maps = maps;\n        this.mirror = mirror;\n        this.from = from;\n        this.to = to;\n    }\n    /**\n    Create a mapping that maps only through a part of this one.\n    */\n    slice(from = 0, to = this.maps.length) {\n        return new Mapping(this.maps, this.mirror, from, to);\n    }\n    /**\n    @internal\n    */\n    copy() {\n        return new Mapping(this.maps.slice(), this.mirror && this.mirror.slice(), this.from, this.to);\n    }\n    /**\n    Add a step map to the end of this mapping. If `mirrors` is\n    given, it should be the index of the step map that is the mirror\n    image of this one.\n    */\n    appendMap(map, mirrors) {\n        this.to = this.maps.push(map);\n        if (mirrors != null)\n            this.setMirror(this.maps.length - 1, mirrors);\n    }\n    /**\n    Add all the step maps in a given mapping to this one (preserving\n    mirroring information).\n    */\n    appendMapping(mapping) {\n        for (let i = 0, startSize = this.maps.length; i < mapping.maps.length; i++) {\n            let mirr = mapping.getMirror(i);\n            this.appendMap(mapping.maps[i], mirr != null && mirr < i ? startSize + mirr : undefined);\n        }\n    }\n    /**\n    Finds the offset of the step map that mirrors the map at the\n    given offset, in this mapping (as per the second argument to\n    `appendMap`).\n    */\n    getMirror(n) {\n        if (this.mirror)\n            for (let i = 0; i < this.mirror.length; i++)\n                if (this.mirror[i] == n)\n                    return this.mirror[i + (i % 2 ? -1 : 1)];\n    }\n    /**\n    @internal\n    */\n    setMirror(n, m) {\n        if (!this.mirror)\n            this.mirror = [];\n        this.mirror.push(n, m);\n    }\n    /**\n    Append the inverse of the given mapping to this one.\n    */\n    appendMappingInverted(mapping) {\n        for (let i = mapping.maps.length - 1, totalSize = this.maps.length + mapping.maps.length; i >= 0; i--) {\n            let mirr = mapping.getMirror(i);\n            this.appendMap(mapping.maps[i].invert(), mirr != null && mirr > i ? totalSize - mirr - 1 : undefined);\n        }\n    }\n    /**\n    Create an inverted version of this mapping.\n    */\n    invert() {\n        let inverse = new Mapping;\n        inverse.appendMappingInverted(this);\n        return inverse;\n    }\n    /**\n    Map a position through this mapping.\n    */\n    map(pos, assoc = 1) {\n        if (this.mirror)\n            return this._map(pos, assoc, true);\n        for (let i = this.from; i < this.to; i++)\n            pos = this.maps[i].map(pos, assoc);\n        return pos;\n    }\n    /**\n    Map a position through this mapping, returning a mapping\n    result.\n    */\n    mapResult(pos, assoc = 1) { return this._map(pos, assoc, false); }\n    /**\n    @internal\n    */\n    _map(pos, assoc, simple) {\n        let delInfo = 0;\n        for (let i = this.from; i < this.to; i++) {\n            let map = this.maps[i], result = map.mapResult(pos, assoc);\n            if (result.recover != null) {\n                let corr = this.getMirror(i);\n                if (corr != null && corr > i && corr < this.to) {\n                    i = corr;\n                    pos = this.maps[corr].recover(result.recover);\n                    continue;\n                }\n            }\n            delInfo |= result.delInfo;\n            pos = result.pos;\n        }\n        return simple ? pos : new MapResult(pos, delInfo, null);\n    }\n}\n\nconst stepsByID = Object.create(null);\n/**\nA step object represents an atomic change. It generally applies\nonly to the document it was created for, since the positions\nstored in it will only make sense for that document.\n\nNew steps are defined by creating classes that extend `Step`,\noverriding the `apply`, `invert`, `map`, `getMap` and `fromJSON`\nmethods, and registering your class with a unique\nJSON-serialization identifier using\n[`Step.jsonID`](https://prosemirror.net/docs/ref/#transform.Step^jsonID).\n*/\nclass Step {\n    /**\n    Get the step map that represents the changes made by this step,\n    and which can be used to transform between positions in the old\n    and the new document.\n    */\n    getMap() { return StepMap.empty; }\n    /**\n    Try to merge this step with another one, to be applied directly\n    after it. Returns the merged step when possible, null if the\n    steps can't be merged.\n    */\n    merge(other) { return null; }\n    /**\n    Deserialize a step from its JSON representation. Will call\n    through to the step class' own implementation of this method.\n    */\n    static fromJSON(schema, json) {\n        if (!json || !json.stepType)\n            throw new RangeError(\"Invalid input for Step.fromJSON\");\n        let type = stepsByID[json.stepType];\n        if (!type)\n            throw new RangeError(`No step type ${json.stepType} defined`);\n        return type.fromJSON(schema, json);\n    }\n    /**\n    To be able to serialize steps to JSON, each step needs a string\n    ID to attach to its JSON representation. Use this method to\n    register an ID for your step classes. Try to pick something\n    that's unlikely to clash with steps from other modules.\n    */\n    static jsonID(id, stepClass) {\n        if (id in stepsByID)\n            throw new RangeError(\"Duplicate use of step JSON ID \" + id);\n        stepsByID[id] = stepClass;\n        stepClass.prototype.jsonID = id;\n        return stepClass;\n    }\n}\n/**\nThe result of [applying](https://prosemirror.net/docs/ref/#transform.Step.apply) a step. Contains either a\nnew document or a failure value.\n*/\nclass StepResult {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The transformed document, if successful.\n    */\n    doc, \n    /**\n    The failure message, if unsuccessful.\n    */\n    failed) {\n        this.doc = doc;\n        this.failed = failed;\n    }\n    /**\n    Create a successful step result.\n    */\n    static ok(doc) { return new StepResult(doc, null); }\n    /**\n    Create a failed step result.\n    */\n    static fail(message) { return new StepResult(null, message); }\n    /**\n    Call [`Node.replace`](https://prosemirror.net/docs/ref/#model.Node.replace) with the given\n    arguments. Create a successful result if it succeeds, and a\n    failed one if it throws a `ReplaceError`.\n    */\n    static fromReplace(doc, from, to, slice) {\n        try {\n            return StepResult.ok(doc.replace(from, to, slice));\n        }\n        catch (e) {\n            if (e instanceof ReplaceError)\n                return StepResult.fail(e.message);\n            throw e;\n        }\n    }\n}\n\nfunction mapFragment(fragment, f, parent) {\n    let mapped = [];\n    for (let i = 0; i < fragment.childCount; i++) {\n        let child = fragment.child(i);\n        if (child.content.size)\n            child = child.copy(mapFragment(child.content, f, child));\n        if (child.isInline)\n            child = f(child, parent, i);\n        mapped.push(child);\n    }\n    return Fragment.fromArray(mapped);\n}\n/**\nAdd a mark to all inline content between two positions.\n*/\nclass AddMarkStep extends Step {\n    /**\n    Create a mark step.\n    */\n    constructor(\n    /**\n    The start of the marked range.\n    */\n    from, \n    /**\n    The end of the marked range.\n    */\n    to, \n    /**\n    The mark to add.\n    */\n    mark) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let oldSlice = doc.slice(this.from, this.to), $from = doc.resolve(this.from);\n        let parent = $from.node($from.sharedDepth(this.to));\n        let slice = new Slice(mapFragment(oldSlice.content, (node, parent) => {\n            if (!node.isAtom || !parent.type.allowsMarkType(this.mark.type))\n                return node;\n            return node.mark(this.mark.addToSet(node.marks));\n        }, parent), oldSlice.openStart, oldSlice.openEnd);\n        return StepResult.fromReplace(doc, this.from, this.to, slice);\n    }\n    invert() {\n        return new RemoveMarkStep(this.from, this.to, this.mark);\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        if (from.deleted && to.deleted || from.pos >= to.pos)\n            return null;\n        return new AddMarkStep(from.pos, to.pos, this.mark);\n    }\n    merge(other) {\n        if (other instanceof AddMarkStep &&\n            other.mark.eq(this.mark) &&\n            this.from <= other.to && this.to >= other.from)\n            return new AddMarkStep(Math.min(this.from, other.from), Math.max(this.to, other.to), this.mark);\n        return null;\n    }\n    toJSON() {\n        return { stepType: \"addMark\", mark: this.mark.toJSON(),\n            from: this.from, to: this.to };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\")\n            throw new RangeError(\"Invalid input for AddMarkStep.fromJSON\");\n        return new AddMarkStep(json.from, json.to, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"addMark\", AddMarkStep);\n/**\nRemove a mark from all inline content between two positions.\n*/\nclass RemoveMarkStep extends Step {\n    /**\n    Create a mark-removing step.\n    */\n    constructor(\n    /**\n    The start of the unmarked range.\n    */\n    from, \n    /**\n    The end of the unmarked range.\n    */\n    to, \n    /**\n    The mark to remove.\n    */\n    mark) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let oldSlice = doc.slice(this.from, this.to);\n        let slice = new Slice(mapFragment(oldSlice.content, node => {\n            return node.mark(this.mark.removeFromSet(node.marks));\n        }, doc), oldSlice.openStart, oldSlice.openEnd);\n        return StepResult.fromReplace(doc, this.from, this.to, slice);\n    }\n    invert() {\n        return new AddMarkStep(this.from, this.to, this.mark);\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        if (from.deleted && to.deleted || from.pos >= to.pos)\n            return null;\n        return new RemoveMarkStep(from.pos, to.pos, this.mark);\n    }\n    merge(other) {\n        if (other instanceof RemoveMarkStep &&\n            other.mark.eq(this.mark) &&\n            this.from <= other.to && this.to >= other.from)\n            return new RemoveMarkStep(Math.min(this.from, other.from), Math.max(this.to, other.to), this.mark);\n        return null;\n    }\n    toJSON() {\n        return { stepType: \"removeMark\", mark: this.mark.toJSON(),\n            from: this.from, to: this.to };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\")\n            throw new RangeError(\"Invalid input for RemoveMarkStep.fromJSON\");\n        return new RemoveMarkStep(json.from, json.to, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"removeMark\", RemoveMarkStep);\n/**\nAdd a mark to a specific node.\n*/\nclass AddNodeMarkStep extends Step {\n    /**\n    Create a node mark step.\n    */\n    constructor(\n    /**\n    The position of the target node.\n    */\n    pos, \n    /**\n    The mark to add.\n    */\n    mark) {\n        super();\n        this.pos = pos;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node)\n            return StepResult.fail(\"No node at mark step's position\");\n        let updated = node.type.create(node.attrs, null, this.mark.addToSet(node.marks));\n        return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n    }\n    invert(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (node) {\n            let newSet = this.mark.addToSet(node.marks);\n            if (newSet.length == node.marks.length) {\n                for (let i = 0; i < node.marks.length; i++)\n                    if (!node.marks[i].isInSet(newSet))\n                        return new AddNodeMarkStep(this.pos, node.marks[i]);\n                return new AddNodeMarkStep(this.pos, this.mark);\n            }\n        }\n        return new RemoveNodeMarkStep(this.pos, this.mark);\n    }\n    map(mapping) {\n        let pos = mapping.mapResult(this.pos, 1);\n        return pos.deletedAfter ? null : new AddNodeMarkStep(pos.pos, this.mark);\n    }\n    toJSON() {\n        return { stepType: \"addNodeMark\", pos: this.pos, mark: this.mark.toJSON() };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.pos != \"number\")\n            throw new RangeError(\"Invalid input for AddNodeMarkStep.fromJSON\");\n        return new AddNodeMarkStep(json.pos, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"addNodeMark\", AddNodeMarkStep);\n/**\nRemove a mark from a specific node.\n*/\nclass RemoveNodeMarkStep extends Step {\n    /**\n    Create a mark-removing step.\n    */\n    constructor(\n    /**\n    The position of the target node.\n    */\n    pos, \n    /**\n    The mark to remove.\n    */\n    mark) {\n        super();\n        this.pos = pos;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node)\n            return StepResult.fail(\"No node at mark step's position\");\n        let updated = node.type.create(node.attrs, null, this.mark.removeFromSet(node.marks));\n        return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n    }\n    invert(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node || !this.mark.isInSet(node.marks))\n            return this;\n        return new AddNodeMarkStep(this.pos, this.mark);\n    }\n    map(mapping) {\n        let pos = mapping.mapResult(this.pos, 1);\n        return pos.deletedAfter ? null : new RemoveNodeMarkStep(pos.pos, this.mark);\n    }\n    toJSON() {\n        return { stepType: \"removeNodeMark\", pos: this.pos, mark: this.mark.toJSON() };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.pos != \"number\")\n            throw new RangeError(\"Invalid input for RemoveNodeMarkStep.fromJSON\");\n        return new RemoveNodeMarkStep(json.pos, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"removeNodeMark\", RemoveNodeMarkStep);\n\n/**\nReplace a part of the document with a slice of new content.\n*/\nclass ReplaceStep extends Step {\n    /**\n    The given `slice` should fit the 'gap' between `from` and\n    `to`—the depths must line up, and the surrounding nodes must be\n    able to be joined with the open sides of the slice. When\n    `structure` is true, the step will fail if the content between\n    from and to is not just a sequence of closing and then opening\n    tokens (this is to guard against rebased replace steps\n    overwriting something they weren't supposed to).\n    */\n    constructor(\n    /**\n    The start position of the replaced range.\n    */\n    from, \n    /**\n    The end position of the replaced range.\n    */\n    to, \n    /**\n    The slice to insert.\n    */\n    slice, \n    /**\n    @internal\n    */\n    structure = false) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.slice = slice;\n        this.structure = structure;\n    }\n    apply(doc) {\n        if (this.structure && contentBetween(doc, this.from, this.to))\n            return StepResult.fail(\"Structure replace would overwrite content\");\n        return StepResult.fromReplace(doc, this.from, this.to, this.slice);\n    }\n    getMap() {\n        return new StepMap([this.from, this.to - this.from, this.slice.size]);\n    }\n    invert(doc) {\n        return new ReplaceStep(this.from, this.from + this.slice.size, doc.slice(this.from, this.to));\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        if (from.deletedAcross && to.deletedAcross)\n            return null;\n        return new ReplaceStep(from.pos, Math.max(from.pos, to.pos), this.slice);\n    }\n    merge(other) {\n        if (!(other instanceof ReplaceStep) || other.structure || this.structure)\n            return null;\n        if (this.from + this.slice.size == other.from && !this.slice.openEnd && !other.slice.openStart) {\n            let slice = this.slice.size + other.slice.size == 0 ? Slice.empty\n                : new Slice(this.slice.content.append(other.slice.content), this.slice.openStart, other.slice.openEnd);\n            return new ReplaceStep(this.from, this.to + (other.to - other.from), slice, this.structure);\n        }\n        else if (other.to == this.from && !this.slice.openStart && !other.slice.openEnd) {\n            let slice = this.slice.size + other.slice.size == 0 ? Slice.empty\n                : new Slice(other.slice.content.append(this.slice.content), other.slice.openStart, this.slice.openEnd);\n            return new ReplaceStep(other.from, this.to, slice, this.structure);\n        }\n        else {\n            return null;\n        }\n    }\n    toJSON() {\n        let json = { stepType: \"replace\", from: this.from, to: this.to };\n        if (this.slice.size)\n            json.slice = this.slice.toJSON();\n        if (this.structure)\n            json.structure = true;\n        return json;\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\")\n            throw new RangeError(\"Invalid input for ReplaceStep.fromJSON\");\n        return new ReplaceStep(json.from, json.to, Slice.fromJSON(schema, json.slice), !!json.structure);\n    }\n}\nStep.jsonID(\"replace\", ReplaceStep);\n/**\nReplace a part of the document with a slice of content, but\npreserve a range of the replaced content by moving it into the\nslice.\n*/\nclass ReplaceAroundStep extends Step {\n    /**\n    Create a replace-around step with the given range and gap.\n    `insert` should be the point in the slice into which the content\n    of the gap should be moved. `structure` has the same meaning as\n    it has in the [`ReplaceStep`](https://prosemirror.net/docs/ref/#transform.ReplaceStep) class.\n    */\n    constructor(\n    /**\n    The start position of the replaced range.\n    */\n    from, \n    /**\n    The end position of the replaced range.\n    */\n    to, \n    /**\n    The start of preserved range.\n    */\n    gapFrom, \n    /**\n    The end of preserved range.\n    */\n    gapTo, \n    /**\n    The slice to insert.\n    */\n    slice, \n    /**\n    The position in the slice where the preserved range should be\n    inserted.\n    */\n    insert, \n    /**\n    @internal\n    */\n    structure = false) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.gapFrom = gapFrom;\n        this.gapTo = gapTo;\n        this.slice = slice;\n        this.insert = insert;\n        this.structure = structure;\n    }\n    apply(doc) {\n        if (this.structure && (contentBetween(doc, this.from, this.gapFrom) ||\n            contentBetween(doc, this.gapTo, this.to)))\n            return StepResult.fail(\"Structure gap-replace would overwrite content\");\n        let gap = doc.slice(this.gapFrom, this.gapTo);\n        if (gap.openStart || gap.openEnd)\n            return StepResult.fail(\"Gap is not a flat range\");\n        let inserted = this.slice.insertAt(this.insert, gap.content);\n        if (!inserted)\n            return StepResult.fail(\"Content does not fit in gap\");\n        return StepResult.fromReplace(doc, this.from, this.to, inserted);\n    }\n    getMap() {\n        return new StepMap([this.from, this.gapFrom - this.from, this.insert,\n            this.gapTo, this.to - this.gapTo, this.slice.size - this.insert]);\n    }\n    invert(doc) {\n        let gap = this.gapTo - this.gapFrom;\n        return new ReplaceAroundStep(this.from, this.from + this.slice.size + gap, this.from + this.insert, this.from + this.insert + gap, doc.slice(this.from, this.to).removeBetween(this.gapFrom - this.from, this.gapTo - this.from), this.gapFrom - this.from, this.structure);\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        let gapFrom = mapping.map(this.gapFrom, -1), gapTo = mapping.map(this.gapTo, 1);\n        if ((from.deletedAcross && to.deletedAcross) || gapFrom < from.pos || gapTo > to.pos)\n            return null;\n        return new ReplaceAroundStep(from.pos, to.pos, gapFrom, gapTo, this.slice, this.insert, this.structure);\n    }\n    toJSON() {\n        let json = { stepType: \"replaceAround\", from: this.from, to: this.to,\n            gapFrom: this.gapFrom, gapTo: this.gapTo, insert: this.insert };\n        if (this.slice.size)\n            json.slice = this.slice.toJSON();\n        if (this.structure)\n            json.structure = true;\n        return json;\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\" ||\n            typeof json.gapFrom != \"number\" || typeof json.gapTo != \"number\" || typeof json.insert != \"number\")\n            throw new RangeError(\"Invalid input for ReplaceAroundStep.fromJSON\");\n        return new ReplaceAroundStep(json.from, json.to, json.gapFrom, json.gapTo, Slice.fromJSON(schema, json.slice), json.insert, !!json.structure);\n    }\n}\nStep.jsonID(\"replaceAround\", ReplaceAroundStep);\nfunction contentBetween(doc, from, to) {\n    let $from = doc.resolve(from), dist = to - from, depth = $from.depth;\n    while (dist > 0 && depth > 0 && $from.indexAfter(depth) == $from.node(depth).childCount) {\n        depth--;\n        dist--;\n    }\n    if (dist > 0) {\n        let next = $from.node(depth).maybeChild($from.indexAfter(depth));\n        while (dist > 0) {\n            if (!next || next.isLeaf)\n                return true;\n            next = next.firstChild;\n            dist--;\n        }\n    }\n    return false;\n}\n\nfunction addMark(tr, from, to, mark) {\n    let removed = [], added = [];\n    let removing, adding;\n    tr.doc.nodesBetween(from, to, (node, pos, parent) => {\n        if (!node.isInline)\n            return;\n        let marks = node.marks;\n        if (!mark.isInSet(marks) && parent.type.allowsMarkType(mark.type)) {\n            let start = Math.max(pos, from), end = Math.min(pos + node.nodeSize, to);\n            let newSet = mark.addToSet(marks);\n            for (let i = 0; i < marks.length; i++) {\n                if (!marks[i].isInSet(newSet)) {\n                    if (removing && removing.to == start && removing.mark.eq(marks[i]))\n                        removing.to = end;\n                    else\n                        removed.push(removing = new RemoveMarkStep(start, end, marks[i]));\n                }\n            }\n            if (adding && adding.to == start)\n                adding.to = end;\n            else\n                added.push(adding = new AddMarkStep(start, end, mark));\n        }\n    });\n    removed.forEach(s => tr.step(s));\n    added.forEach(s => tr.step(s));\n}\nfunction removeMark(tr, from, to, mark) {\n    let matched = [], step = 0;\n    tr.doc.nodesBetween(from, to, (node, pos) => {\n        if (!node.isInline)\n            return;\n        step++;\n        let toRemove = null;\n        if (mark instanceof MarkType) {\n            let set = node.marks, found;\n            while (found = mark.isInSet(set)) {\n                (toRemove || (toRemove = [])).push(found);\n                set = found.removeFromSet(set);\n            }\n        }\n        else if (mark) {\n            if (mark.isInSet(node.marks))\n                toRemove = [mark];\n        }\n        else {\n            toRemove = node.marks;\n        }\n        if (toRemove && toRemove.length) {\n            let end = Math.min(pos + node.nodeSize, to);\n            for (let i = 0; i < toRemove.length; i++) {\n                let style = toRemove[i], found;\n                for (let j = 0; j < matched.length; j++) {\n                    let m = matched[j];\n                    if (m.step == step - 1 && style.eq(matched[j].style))\n                        found = m;\n                }\n                if (found) {\n                    found.to = end;\n                    found.step = step;\n                }\n                else {\n                    matched.push({ style, from: Math.max(pos, from), to: end, step });\n                }\n            }\n        }\n    });\n    matched.forEach(m => tr.step(new RemoveMarkStep(m.from, m.to, m.style)));\n}\nfunction clearIncompatible(tr, pos, parentType, match = parentType.contentMatch) {\n    let node = tr.doc.nodeAt(pos);\n    let replSteps = [], cur = pos + 1;\n    for (let i = 0; i < node.childCount; i++) {\n        let child = node.child(i), end = cur + child.nodeSize;\n        let allowed = match.matchType(child.type);\n        if (!allowed) {\n            replSteps.push(new ReplaceStep(cur, end, Slice.empty));\n        }\n        else {\n            match = allowed;\n            for (let j = 0; j < child.marks.length; j++)\n                if (!parentType.allowsMarkType(child.marks[j].type))\n                    tr.step(new RemoveMarkStep(cur, end, child.marks[j]));\n            if (child.isText && !parentType.spec.code) {\n                let m, newline = /\\r?\\n|\\r/g, slice;\n                while (m = newline.exec(child.text)) {\n                    if (!slice)\n                        slice = new Slice(Fragment.from(parentType.schema.text(\" \", parentType.allowedMarks(child.marks))), 0, 0);\n                    replSteps.push(new ReplaceStep(cur + m.index, cur + m.index + m[0].length, slice));\n                }\n            }\n        }\n        cur = end;\n    }\n    if (!match.validEnd) {\n        let fill = match.fillBefore(Fragment.empty, true);\n        tr.replace(cur, cur, new Slice(fill, 0, 0));\n    }\n    for (let i = replSteps.length - 1; i >= 0; i--)\n        tr.step(replSteps[i]);\n}\n\nfunction canCut(node, start, end) {\n    return (start == 0 || node.canReplace(start, node.childCount)) &&\n        (end == node.childCount || node.canReplace(0, end));\n}\n/**\nTry to find a target depth to which the content in the given range\ncan be lifted. Will not go across\n[isolating](https://prosemirror.net/docs/ref/#model.NodeSpec.isolating) parent nodes.\n*/\nfunction liftTarget(range) {\n    let parent = range.parent;\n    let content = parent.content.cutByIndex(range.startIndex, range.endIndex);\n    for (let depth = range.depth;; --depth) {\n        let node = range.$from.node(depth);\n        let index = range.$from.index(depth), endIndex = range.$to.indexAfter(depth);\n        if (depth < range.depth && node.canReplace(index, endIndex, content))\n            return depth;\n        if (depth == 0 || node.type.spec.isolating || !canCut(node, index, endIndex))\n            break;\n    }\n    return null;\n}\nfunction lift(tr, range, target) {\n    let { $from, $to, depth } = range;\n    let gapStart = $from.before(depth + 1), gapEnd = $to.after(depth + 1);\n    let start = gapStart, end = gapEnd;\n    let before = Fragment.empty, openStart = 0;\n    for (let d = depth, splitting = false; d > target; d--)\n        if (splitting || $from.index(d) > 0) {\n            splitting = true;\n            before = Fragment.from($from.node(d).copy(before));\n            openStart++;\n        }\n        else {\n            start--;\n        }\n    let after = Fragment.empty, openEnd = 0;\n    for (let d = depth, splitting = false; d > target; d--)\n        if (splitting || $to.after(d + 1) < $to.end(d)) {\n            splitting = true;\n            after = Fragment.from($to.node(d).copy(after));\n            openEnd++;\n        }\n        else {\n            end++;\n        }\n    tr.step(new ReplaceAroundStep(start, end, gapStart, gapEnd, new Slice(before.append(after), openStart, openEnd), before.size - openStart, true));\n}\n/**\nTry to find a valid way to wrap the content in the given range in a\nnode of the given type. May introduce extra nodes around and inside\nthe wrapper node, if necessary. Returns null if no valid wrapping\ncould be found. When `innerRange` is given, that range's content is\nused as the content to fit into the wrapping, instead of the\ncontent of `range`.\n*/\nfunction findWrapping(range, nodeType, attrs = null, innerRange = range) {\n    let around = findWrappingOutside(range, nodeType);\n    let inner = around && findWrappingInside(innerRange, nodeType);\n    if (!inner)\n        return null;\n    return around.map(withAttrs)\n        .concat({ type: nodeType, attrs }).concat(inner.map(withAttrs));\n}\nfunction withAttrs(type) { return { type, attrs: null }; }\nfunction findWrappingOutside(range, type) {\n    let { parent, startIndex, endIndex } = range;\n    let around = parent.contentMatchAt(startIndex).findWrapping(type);\n    if (!around)\n        return null;\n    let outer = around.length ? around[0] : type;\n    return parent.canReplaceWith(startIndex, endIndex, outer) ? around : null;\n}\nfunction findWrappingInside(range, type) {\n    let { parent, startIndex, endIndex } = range;\n    let inner = parent.child(startIndex);\n    let inside = type.contentMatch.findWrapping(inner.type);\n    if (!inside)\n        return null;\n    let lastType = inside.length ? inside[inside.length - 1] : type;\n    let innerMatch = lastType.contentMatch;\n    for (let i = startIndex; innerMatch && i < endIndex; i++)\n        innerMatch = innerMatch.matchType(parent.child(i).type);\n    if (!innerMatch || !innerMatch.validEnd)\n        return null;\n    return inside;\n}\nfunction wrap(tr, range, wrappers) {\n    let content = Fragment.empty;\n    for (let i = wrappers.length - 1; i >= 0; i--) {\n        if (content.size) {\n            let match = wrappers[i].type.contentMatch.matchFragment(content);\n            if (!match || !match.validEnd)\n                throw new RangeError(\"Wrapper type given to Transform.wrap does not form valid content of its parent wrapper\");\n        }\n        content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content));\n    }\n    let start = range.start, end = range.end;\n    tr.step(new ReplaceAroundStep(start, end, start, end, new Slice(content, 0, 0), wrappers.length, true));\n}\nfunction setBlockType(tr, from, to, type, attrs) {\n    if (!type.isTextblock)\n        throw new RangeError(\"Type given to setBlockType should be a textblock\");\n    let mapFrom = tr.steps.length;\n    tr.doc.nodesBetween(from, to, (node, pos) => {\n        if (node.isTextblock && !node.hasMarkup(type, attrs) && canChangeType(tr.doc, tr.mapping.slice(mapFrom).map(pos), type)) {\n            // Ensure all markup that isn't allowed in the new node type is cleared\n            tr.clearIncompatible(tr.mapping.slice(mapFrom).map(pos, 1), type);\n            let mapping = tr.mapping.slice(mapFrom);\n            let startM = mapping.map(pos, 1), endM = mapping.map(pos + node.nodeSize, 1);\n            tr.step(new ReplaceAroundStep(startM, endM, startM + 1, endM - 1, new Slice(Fragment.from(type.create(attrs, null, node.marks)), 0, 0), 1, true));\n            return false;\n        }\n    });\n}\nfunction canChangeType(doc, pos, type) {\n    let $pos = doc.resolve(pos), index = $pos.index();\n    return $pos.parent.canReplaceWith(index, index + 1, type);\n}\n/**\nChange the type, attributes, and/or marks of the node at `pos`.\nWhen `type` isn't given, the existing node type is preserved,\n*/\nfunction setNodeMarkup(tr, pos, type, attrs, marks) {\n    let node = tr.doc.nodeAt(pos);\n    if (!node)\n        throw new RangeError(\"No node at given position\");\n    if (!type)\n        type = node.type;\n    let newNode = type.create(attrs, null, marks || node.marks);\n    if (node.isLeaf)\n        return tr.replaceWith(pos, pos + node.nodeSize, newNode);\n    if (!type.validContent(node.content))\n        throw new RangeError(\"Invalid content for node type \" + type.name);\n    tr.step(new ReplaceAroundStep(pos, pos + node.nodeSize, pos + 1, pos + node.nodeSize - 1, new Slice(Fragment.from(newNode), 0, 0), 1, true));\n}\n/**\nCheck whether splitting at the given position is allowed.\n*/\nfunction canSplit(doc, pos, depth = 1, typesAfter) {\n    let $pos = doc.resolve(pos), base = $pos.depth - depth;\n    let innerType = (typesAfter && typesAfter[typesAfter.length - 1]) || $pos.parent;\n    if (base < 0 || $pos.parent.type.spec.isolating ||\n        !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) ||\n        !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount)))\n        return false;\n    for (let d = $pos.depth - 1, i = depth - 2; d > base; d--, i--) {\n        let node = $pos.node(d), index = $pos.index(d);\n        if (node.type.spec.isolating)\n            return false;\n        let rest = node.content.cutByIndex(index, node.childCount);\n        let overrideChild = typesAfter && typesAfter[i + 1];\n        if (overrideChild)\n            rest = rest.replaceChild(0, overrideChild.type.create(overrideChild.attrs));\n        let after = (typesAfter && typesAfter[i]) || node;\n        if (!node.canReplace(index + 1, node.childCount) || !after.type.validContent(rest))\n            return false;\n    }\n    let index = $pos.indexAfter(base);\n    let baseType = typesAfter && typesAfter[0];\n    return $pos.node(base).canReplaceWith(index, index, baseType ? baseType.type : $pos.node(base + 1).type);\n}\nfunction split(tr, pos, depth = 1, typesAfter) {\n    let $pos = tr.doc.resolve(pos), before = Fragment.empty, after = Fragment.empty;\n    for (let d = $pos.depth, e = $pos.depth - depth, i = depth - 1; d > e; d--, i--) {\n        before = Fragment.from($pos.node(d).copy(before));\n        let typeAfter = typesAfter && typesAfter[i];\n        after = Fragment.from(typeAfter ? typeAfter.type.create(typeAfter.attrs, after) : $pos.node(d).copy(after));\n    }\n    tr.step(new ReplaceStep(pos, pos, new Slice(before.append(after), depth, depth), true));\n}\n/**\nTest whether the blocks before and after a given position can be\njoined.\n*/\nfunction canJoin(doc, pos) {\n    let $pos = doc.resolve(pos), index = $pos.index();\n    return joinable($pos.nodeBefore, $pos.nodeAfter) &&\n        $pos.parent.canReplace(index, index + 1);\n}\nfunction joinable(a, b) {\n    return !!(a && b && !a.isLeaf && a.canAppend(b));\n}\n/**\nFind an ancestor of the given position that can be joined to the\nblock before (or after if `dir` is positive). Returns the joinable\npoint, if any.\n*/\nfunction joinPoint(doc, pos, dir = -1) {\n    let $pos = doc.resolve(pos);\n    for (let d = $pos.depth;; d--) {\n        let before, after, index = $pos.index(d);\n        if (d == $pos.depth) {\n            before = $pos.nodeBefore;\n            after = $pos.nodeAfter;\n        }\n        else if (dir > 0) {\n            before = $pos.node(d + 1);\n            index++;\n            after = $pos.node(d).maybeChild(index);\n        }\n        else {\n            before = $pos.node(d).maybeChild(index - 1);\n            after = $pos.node(d + 1);\n        }\n        if (before && !before.isTextblock && joinable(before, after) &&\n            $pos.node(d).canReplace(index, index + 1))\n            return pos;\n        if (d == 0)\n            break;\n        pos = dir < 0 ? $pos.before(d) : $pos.after(d);\n    }\n}\nfunction join(tr, pos, depth) {\n    let step = new ReplaceStep(pos - depth, pos + depth, Slice.empty, true);\n    tr.step(step);\n}\n/**\nTry to find a point where a node of the given type can be inserted\nnear `pos`, by searching up the node hierarchy when `pos` itself\nisn't a valid place but is at the start or end of a node. Return\nnull if no position was found.\n*/\nfunction insertPoint(doc, pos, nodeType) {\n    let $pos = doc.resolve(pos);\n    if ($pos.parent.canReplaceWith($pos.index(), $pos.index(), nodeType))\n        return pos;\n    if ($pos.parentOffset == 0)\n        for (let d = $pos.depth - 1; d >= 0; d--) {\n            let index = $pos.index(d);\n            if ($pos.node(d).canReplaceWith(index, index, nodeType))\n                return $pos.before(d + 1);\n            if (index > 0)\n                return null;\n        }\n    if ($pos.parentOffset == $pos.parent.content.size)\n        for (let d = $pos.depth - 1; d >= 0; d--) {\n            let index = $pos.indexAfter(d);\n            if ($pos.node(d).canReplaceWith(index, index, nodeType))\n                return $pos.after(d + 1);\n            if (index < $pos.node(d).childCount)\n                return null;\n        }\n    return null;\n}\n/**\nFinds a position at or around the given position where the given\nslice can be inserted. Will look at parent nodes' nearest boundary\nand try there, even if the original position wasn't directly at the\nstart or end of that node. Returns null when no position was found.\n*/\nfunction dropPoint(doc, pos, slice) {\n    let $pos = doc.resolve(pos);\n    if (!slice.content.size)\n        return pos;\n    let content = slice.content;\n    for (let i = 0; i < slice.openStart; i++)\n        content = content.firstChild.content;\n    for (let pass = 1; pass <= (slice.openStart == 0 && slice.size ? 2 : 1); pass++) {\n        for (let d = $pos.depth; d >= 0; d--) {\n            let bias = d == $pos.depth ? 0 : $pos.pos <= ($pos.start(d + 1) + $pos.end(d + 1)) / 2 ? -1 : 1;\n            let insertPos = $pos.index(d) + (bias > 0 ? 1 : 0);\n            let parent = $pos.node(d), fits = false;\n            if (pass == 1) {\n                fits = parent.canReplace(insertPos, insertPos, content);\n            }\n            else {\n                let wrapping = parent.contentMatchAt(insertPos).findWrapping(content.firstChild.type);\n                fits = wrapping && parent.canReplaceWith(insertPos, insertPos, wrapping[0]);\n            }\n            if (fits)\n                return bias == 0 ? $pos.pos : bias < 0 ? $pos.before(d + 1) : $pos.after(d + 1);\n        }\n    }\n    return null;\n}\n\n/**\n‘Fit’ a slice into a given position in the document, producing a\n[step](https://prosemirror.net/docs/ref/#transform.Step) that inserts it. Will return null if\nthere's no meaningful way to insert the slice here, or inserting it\nwould be a no-op (an empty slice over an empty range).\n*/\nfunction replaceStep(doc, from, to = from, slice = Slice.empty) {\n    if (from == to && !slice.size)\n        return null;\n    let $from = doc.resolve(from), $to = doc.resolve(to);\n    // Optimization -- avoid work if it's obvious that it's not needed.\n    if (fitsTrivially($from, $to, slice))\n        return new ReplaceStep(from, to, slice);\n    return new Fitter($from, $to, slice).fit();\n}\nfunction fitsTrivially($from, $to, slice) {\n    return !slice.openStart && !slice.openEnd && $from.start() == $to.start() &&\n        $from.parent.canReplace($from.index(), $to.index(), slice.content);\n}\n// Algorithm for 'placing' the elements of a slice into a gap:\n//\n// We consider the content of each node that is open to the left to be\n// independently placeable. I.e. in <p(\"foo\"), p(\"bar\")>, when the\n// paragraph on the left is open, \"foo\" can be placed (somewhere on\n// the left side of the replacement gap) independently from p(\"bar\").\n//\n// This class tracks the state of the placement progress in the\n// following properties:\n//\n//  - `frontier` holds a stack of `{type, match}` objects that\n//    represent the open side of the replacement. It starts at\n//    `$from`, then moves forward as content is placed, and is finally\n//    reconciled with `$to`.\n//\n//  - `unplaced` is a slice that represents the content that hasn't\n//    been placed yet.\n//\n//  - `placed` is a fragment of placed content. Its open-start value\n//    is implicit in `$from`, and its open-end value in `frontier`.\nclass Fitter {\n    constructor($from, $to, unplaced) {\n        this.$from = $from;\n        this.$to = $to;\n        this.unplaced = unplaced;\n        this.frontier = [];\n        this.placed = Fragment.empty;\n        for (let i = 0; i <= $from.depth; i++) {\n            let node = $from.node(i);\n            this.frontier.push({\n                type: node.type,\n                match: node.contentMatchAt($from.indexAfter(i))\n            });\n        }\n        for (let i = $from.depth; i > 0; i--)\n            this.placed = Fragment.from($from.node(i).copy(this.placed));\n    }\n    get depth() { return this.frontier.length - 1; }\n    fit() {\n        // As long as there's unplaced content, try to place some of it.\n        // If that fails, either increase the open score of the unplaced\n        // slice, or drop nodes from it, and then try again.\n        while (this.unplaced.size) {\n            let fit = this.findFittable();\n            if (fit)\n                this.placeNodes(fit);\n            else\n                this.openMore() || this.dropNode();\n        }\n        // When there's inline content directly after the frontier _and_\n        // directly after `this.$to`, we must generate a `ReplaceAround`\n        // step that pulls that content into the node after the frontier.\n        // That means the fitting must be done to the end of the textblock\n        // node after `this.$to`, not `this.$to` itself.\n        let moveInline = this.mustMoveInline(), placedSize = this.placed.size - this.depth - this.$from.depth;\n        let $from = this.$from, $to = this.close(moveInline < 0 ? this.$to : $from.doc.resolve(moveInline));\n        if (!$to)\n            return null;\n        // If closing to `$to` succeeded, create a step\n        let content = this.placed, openStart = $from.depth, openEnd = $to.depth;\n        while (openStart && openEnd && content.childCount == 1) { // Normalize by dropping open parent nodes\n            content = content.firstChild.content;\n            openStart--;\n            openEnd--;\n        }\n        let slice = new Slice(content, openStart, openEnd);\n        if (moveInline > -1)\n            return new ReplaceAroundStep($from.pos, moveInline, this.$to.pos, this.$to.end(), slice, placedSize);\n        if (slice.size || $from.pos != this.$to.pos) // Don't generate no-op steps\n            return new ReplaceStep($from.pos, $to.pos, slice);\n        return null;\n    }\n    // Find a position on the start spine of `this.unplaced` that has\n    // content that can be moved somewhere on the frontier. Returns two\n    // depths, one for the slice and one for the frontier.\n    findFittable() {\n        let startDepth = this.unplaced.openStart;\n        for (let cur = this.unplaced.content, d = 0, openEnd = this.unplaced.openEnd; d < startDepth; d++) {\n            let node = cur.firstChild;\n            if (cur.childCount > 1)\n                openEnd = 0;\n            if (node.type.spec.isolating && openEnd <= d) {\n                startDepth = d;\n                break;\n            }\n            cur = node.content;\n        }\n        // Only try wrapping nodes (pass 2) after finding a place without\n        // wrapping failed.\n        for (let pass = 1; pass <= 2; pass++) {\n            for (let sliceDepth = pass == 1 ? startDepth : this.unplaced.openStart; sliceDepth >= 0; sliceDepth--) {\n                let fragment, parent = null;\n                if (sliceDepth) {\n                    parent = contentAt(this.unplaced.content, sliceDepth - 1).firstChild;\n                    fragment = parent.content;\n                }\n                else {\n                    fragment = this.unplaced.content;\n                }\n                let first = fragment.firstChild;\n                for (let frontierDepth = this.depth; frontierDepth >= 0; frontierDepth--) {\n                    let { type, match } = this.frontier[frontierDepth], wrap, inject = null;\n                    // In pass 1, if the next node matches, or there is no next\n                    // node but the parents look compatible, we've found a\n                    // place.\n                    if (pass == 1 && (first ? match.matchType(first.type) || (inject = match.fillBefore(Fragment.from(first), false))\n                        : parent && type.compatibleContent(parent.type)))\n                        return { sliceDepth, frontierDepth, parent, inject };\n                    // In pass 2, look for a set of wrapping nodes that make\n                    // `first` fit here.\n                    else if (pass == 2 && first && (wrap = match.findWrapping(first.type)))\n                        return { sliceDepth, frontierDepth, parent, wrap };\n                    // Don't continue looking further up if the parent node\n                    // would fit here.\n                    if (parent && match.matchType(parent.type))\n                        break;\n                }\n            }\n        }\n    }\n    openMore() {\n        let { content, openStart, openEnd } = this.unplaced;\n        let inner = contentAt(content, openStart);\n        if (!inner.childCount || inner.firstChild.isLeaf)\n            return false;\n        this.unplaced = new Slice(content, openStart + 1, Math.max(openEnd, inner.size + openStart >= content.size - openEnd ? openStart + 1 : 0));\n        return true;\n    }\n    dropNode() {\n        let { content, openStart, openEnd } = this.unplaced;\n        let inner = contentAt(content, openStart);\n        if (inner.childCount <= 1 && openStart > 0) {\n            let openAtEnd = content.size - openStart <= openStart + inner.size;\n            this.unplaced = new Slice(dropFromFragment(content, openStart - 1, 1), openStart - 1, openAtEnd ? openStart - 1 : openEnd);\n        }\n        else {\n            this.unplaced = new Slice(dropFromFragment(content, openStart, 1), openStart, openEnd);\n        }\n    }\n    // Move content from the unplaced slice at `sliceDepth` to the\n    // frontier node at `frontierDepth`. Close that frontier node when\n    // applicable.\n    placeNodes({ sliceDepth, frontierDepth, parent, inject, wrap }) {\n        while (this.depth > frontierDepth)\n            this.closeFrontierNode();\n        if (wrap)\n            for (let i = 0; i < wrap.length; i++)\n                this.openFrontierNode(wrap[i]);\n        let slice = this.unplaced, fragment = parent ? parent.content : slice.content;\n        let openStart = slice.openStart - sliceDepth;\n        let taken = 0, add = [];\n        let { match, type } = this.frontier[frontierDepth];\n        if (inject) {\n            for (let i = 0; i < inject.childCount; i++)\n                add.push(inject.child(i));\n            match = match.matchFragment(inject);\n        }\n        // Computes the amount of (end) open nodes at the end of the\n        // fragment. When 0, the parent is open, but no more. When\n        // negative, nothing is open.\n        let openEndCount = (fragment.size + sliceDepth) - (slice.content.size - slice.openEnd);\n        // Scan over the fragment, fitting as many child nodes as\n        // possible.\n        while (taken < fragment.childCount) {\n            let next = fragment.child(taken), matches = match.matchType(next.type);\n            if (!matches)\n                break;\n            taken++;\n            if (taken > 1 || openStart == 0 || next.content.size) { // Drop empty open nodes\n                match = matches;\n                add.push(closeNodeStart(next.mark(type.allowedMarks(next.marks)), taken == 1 ? openStart : 0, taken == fragment.childCount ? openEndCount : -1));\n            }\n        }\n        let toEnd = taken == fragment.childCount;\n        if (!toEnd)\n            openEndCount = -1;\n        this.placed = addToFragment(this.placed, frontierDepth, Fragment.from(add));\n        this.frontier[frontierDepth].match = match;\n        // If the parent types match, and the entire node was moved, and\n        // it's not open, close this frontier node right away.\n        if (toEnd && openEndCount < 0 && parent && parent.type == this.frontier[this.depth].type && this.frontier.length > 1)\n            this.closeFrontierNode();\n        // Add new frontier nodes for any open nodes at the end.\n        for (let i = 0, cur = fragment; i < openEndCount; i++) {\n            let node = cur.lastChild;\n            this.frontier.push({ type: node.type, match: node.contentMatchAt(node.childCount) });\n            cur = node.content;\n        }\n        // Update `this.unplaced`. Drop the entire node from which we\n        // placed it we got to its end, otherwise just drop the placed\n        // nodes.\n        this.unplaced = !toEnd ? new Slice(dropFromFragment(slice.content, sliceDepth, taken), slice.openStart, slice.openEnd)\n            : sliceDepth == 0 ? Slice.empty\n                : new Slice(dropFromFragment(slice.content, sliceDepth - 1, 1), sliceDepth - 1, openEndCount < 0 ? slice.openEnd : sliceDepth - 1);\n    }\n    mustMoveInline() {\n        if (!this.$to.parent.isTextblock)\n            return -1;\n        let top = this.frontier[this.depth], level;\n        if (!top.type.isTextblock || !contentAfterFits(this.$to, this.$to.depth, top.type, top.match, false) ||\n            (this.$to.depth == this.depth && (level = this.findCloseLevel(this.$to)) && level.depth == this.depth))\n            return -1;\n        let { depth } = this.$to, after = this.$to.after(depth);\n        while (depth > 1 && after == this.$to.end(--depth))\n            ++after;\n        return after;\n    }\n    findCloseLevel($to) {\n        scan: for (let i = Math.min(this.depth, $to.depth); i >= 0; i--) {\n            let { match, type } = this.frontier[i];\n            let dropInner = i < $to.depth && $to.end(i + 1) == $to.pos + ($to.depth - (i + 1));\n            let fit = contentAfterFits($to, i, type, match, dropInner);\n            if (!fit)\n                continue;\n            for (let d = i - 1; d >= 0; d--) {\n                let { match, type } = this.frontier[d];\n                let matches = contentAfterFits($to, d, type, match, true);\n                if (!matches || matches.childCount)\n                    continue scan;\n            }\n            return { depth: i, fit, move: dropInner ? $to.doc.resolve($to.after(i + 1)) : $to };\n        }\n    }\n    close($to) {\n        let close = this.findCloseLevel($to);\n        if (!close)\n            return null;\n        while (this.depth > close.depth)\n            this.closeFrontierNode();\n        if (close.fit.childCount)\n            this.placed = addToFragment(this.placed, close.depth, close.fit);\n        $to = close.move;\n        for (let d = close.depth + 1; d <= $to.depth; d++) {\n            let node = $to.node(d), add = node.type.contentMatch.fillBefore(node.content, true, $to.index(d));\n            this.openFrontierNode(node.type, node.attrs, add);\n        }\n        return $to;\n    }\n    openFrontierNode(type, attrs = null, content) {\n        let top = this.frontier[this.depth];\n        top.match = top.match.matchType(type);\n        this.placed = addToFragment(this.placed, this.depth, Fragment.from(type.create(attrs, content)));\n        this.frontier.push({ type, match: type.contentMatch });\n    }\n    closeFrontierNode() {\n        let open = this.frontier.pop();\n        let add = open.match.fillBefore(Fragment.empty, true);\n        if (add.childCount)\n            this.placed = addToFragment(this.placed, this.frontier.length, add);\n    }\n}\nfunction dropFromFragment(fragment, depth, count) {\n    if (depth == 0)\n        return fragment.cutByIndex(count, fragment.childCount);\n    return fragment.replaceChild(0, fragment.firstChild.copy(dropFromFragment(fragment.firstChild.content, depth - 1, count)));\n}\nfunction addToFragment(fragment, depth, content) {\n    if (depth == 0)\n        return fragment.append(content);\n    return fragment.replaceChild(fragment.childCount - 1, fragment.lastChild.copy(addToFragment(fragment.lastChild.content, depth - 1, content)));\n}\nfunction contentAt(fragment, depth) {\n    for (let i = 0; i < depth; i++)\n        fragment = fragment.firstChild.content;\n    return fragment;\n}\nfunction closeNodeStart(node, openStart, openEnd) {\n    if (openStart <= 0)\n        return node;\n    let frag = node.content;\n    if (openStart > 1)\n        frag = frag.replaceChild(0, closeNodeStart(frag.firstChild, openStart - 1, frag.childCount == 1 ? openEnd - 1 : 0));\n    if (openStart > 0) {\n        frag = node.type.contentMatch.fillBefore(frag).append(frag);\n        if (openEnd <= 0)\n            frag = frag.append(node.type.contentMatch.matchFragment(frag).fillBefore(Fragment.empty, true));\n    }\n    return node.copy(frag);\n}\nfunction contentAfterFits($to, depth, type, match, open) {\n    let node = $to.node(depth), index = open ? $to.indexAfter(depth) : $to.index(depth);\n    if (index == node.childCount && !type.compatibleContent(node.type))\n        return null;\n    let fit = match.fillBefore(node.content, true, index);\n    return fit && !invalidMarks(type, node.content, index) ? fit : null;\n}\nfunction invalidMarks(type, fragment, start) {\n    for (let i = start; i < fragment.childCount; i++)\n        if (!type.allowsMarks(fragment.child(i).marks))\n            return true;\n    return false;\n}\nfunction definesContent(type) {\n    return type.spec.defining || type.spec.definingForContent;\n}\nfunction replaceRange(tr, from, to, slice) {\n    if (!slice.size)\n        return tr.deleteRange(from, to);\n    let $from = tr.doc.resolve(from), $to = tr.doc.resolve(to);\n    if (fitsTrivially($from, $to, slice))\n        return tr.step(new ReplaceStep(from, to, slice));\n    let targetDepths = coveredDepths($from, tr.doc.resolve(to));\n    // Can't replace the whole document, so remove 0 if it's present\n    if (targetDepths[targetDepths.length - 1] == 0)\n        targetDepths.pop();\n    // Negative numbers represent not expansion over the whole node at\n    // that depth, but replacing from $from.before(-D) to $to.pos.\n    let preferredTarget = -($from.depth + 1);\n    targetDepths.unshift(preferredTarget);\n    // This loop picks a preferred target depth, if one of the covering\n    // depths is not outside of a defining node, and adds negative\n    // depths for any depth that has $from at its start and does not\n    // cross a defining node.\n    for (let d = $from.depth, pos = $from.pos - 1; d > 0; d--, pos--) {\n        let spec = $from.node(d).type.spec;\n        if (spec.defining || spec.definingAsContext || spec.isolating)\n            break;\n        if (targetDepths.indexOf(d) > -1)\n            preferredTarget = d;\n        else if ($from.before(d) == pos)\n            targetDepths.splice(1, 0, -d);\n    }\n    // Try to fit each possible depth of the slice into each possible\n    // target depth, starting with the preferred depths.\n    let preferredTargetIndex = targetDepths.indexOf(preferredTarget);\n    let leftNodes = [], preferredDepth = slice.openStart;\n    for (let content = slice.content, i = 0;; i++) {\n        let node = content.firstChild;\n        leftNodes.push(node);\n        if (i == slice.openStart)\n            break;\n        content = node.content;\n    }\n    // Back up preferredDepth to cover defining textblocks directly\n    // above it, possibly skipping a non-defining textblock.\n    for (let d = preferredDepth - 1; d >= 0; d--) {\n        let leftNode = leftNodes[d], def = definesContent(leftNode.type);\n        if (def && !leftNode.sameMarkup($from.node(Math.abs(preferredTarget) - 1)))\n            preferredDepth = d;\n        else if (def || !leftNode.type.isTextblock)\n            break;\n    }\n    for (let j = slice.openStart; j >= 0; j--) {\n        let openDepth = (j + preferredDepth + 1) % (slice.openStart + 1);\n        let insert = leftNodes[openDepth];\n        if (!insert)\n            continue;\n        for (let i = 0; i < targetDepths.length; i++) {\n            // Loop over possible expansion levels, starting with the\n            // preferred one\n            let targetDepth = targetDepths[(i + preferredTargetIndex) % targetDepths.length], expand = true;\n            if (targetDepth < 0) {\n                expand = false;\n                targetDepth = -targetDepth;\n            }\n            let parent = $from.node(targetDepth - 1), index = $from.index(targetDepth - 1);\n            if (parent.canReplaceWith(index, index, insert.type, insert.marks))\n                return tr.replace($from.before(targetDepth), expand ? $to.after(targetDepth) : to, new Slice(closeFragment(slice.content, 0, slice.openStart, openDepth), openDepth, slice.openEnd));\n        }\n    }\n    let startSteps = tr.steps.length;\n    for (let i = targetDepths.length - 1; i >= 0; i--) {\n        tr.replace(from, to, slice);\n        if (tr.steps.length > startSteps)\n            break;\n        let depth = targetDepths[i];\n        if (depth < 0)\n            continue;\n        from = $from.before(depth);\n        to = $to.after(depth);\n    }\n}\nfunction closeFragment(fragment, depth, oldOpen, newOpen, parent) {\n    if (depth < oldOpen) {\n        let first = fragment.firstChild;\n        fragment = fragment.replaceChild(0, first.copy(closeFragment(first.content, depth + 1, oldOpen, newOpen, first)));\n    }\n    if (depth > newOpen) {\n        let match = parent.contentMatchAt(0);\n        let start = match.fillBefore(fragment).append(fragment);\n        fragment = start.append(match.matchFragment(start).fillBefore(Fragment.empty, true));\n    }\n    return fragment;\n}\nfunction replaceRangeWith(tr, from, to, node) {\n    if (!node.isInline && from == to && tr.doc.resolve(from).parent.content.size) {\n        let point = insertPoint(tr.doc, from, node.type);\n        if (point != null)\n            from = to = point;\n    }\n    tr.replaceRange(from, to, new Slice(Fragment.from(node), 0, 0));\n}\nfunction deleteRange(tr, from, to) {\n    let $from = tr.doc.resolve(from), $to = tr.doc.resolve(to);\n    let covered = coveredDepths($from, $to);\n    for (let i = 0; i < covered.length; i++) {\n        let depth = covered[i], last = i == covered.length - 1;\n        if ((last && depth == 0) || $from.node(depth).type.contentMatch.validEnd)\n            return tr.delete($from.start(depth), $to.end(depth));\n        if (depth > 0 && (last || $from.node(depth - 1).canReplace($from.index(depth - 1), $to.indexAfter(depth - 1))))\n            return tr.delete($from.before(depth), $to.after(depth));\n    }\n    for (let d = 1; d <= $from.depth && d <= $to.depth; d++) {\n        if (from - $from.start(d) == $from.depth - d && to > $from.end(d) && $to.end(d) - to != $to.depth - d)\n            return tr.delete($from.before(d), to);\n    }\n    tr.delete(from, to);\n}\n// Returns an array of all depths for which $from - $to spans the\n// whole content of the nodes at that depth.\nfunction coveredDepths($from, $to) {\n    let result = [], minDepth = Math.min($from.depth, $to.depth);\n    for (let d = minDepth; d >= 0; d--) {\n        let start = $from.start(d);\n        if (start < $from.pos - ($from.depth - d) ||\n            $to.end(d) > $to.pos + ($to.depth - d) ||\n            $from.node(d).type.spec.isolating ||\n            $to.node(d).type.spec.isolating)\n            break;\n        if (start == $to.start(d) ||\n            (d == $from.depth && d == $to.depth && $from.parent.inlineContent && $to.parent.inlineContent &&\n                d && $to.start(d - 1) == start - 1))\n            result.push(d);\n    }\n    return result;\n}\n\n/**\nUpdate an attribute in a specific node.\n*/\nclass AttrStep extends Step {\n    /**\n    Construct an attribute step.\n    */\n    constructor(\n    /**\n    The position of the target node.\n    */\n    pos, \n    /**\n    The attribute to set.\n    */\n    attr, \n    // The attribute's new value.\n    value) {\n        super();\n        this.pos = pos;\n        this.attr = attr;\n        this.value = value;\n    }\n    apply(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node)\n            return StepResult.fail(\"No node at attribute step's position\");\n        let attrs = Object.create(null);\n        for (let name in node.attrs)\n            attrs[name] = node.attrs[name];\n        attrs[this.attr] = this.value;\n        let updated = node.type.create(attrs, null, node.marks);\n        return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n    }\n    getMap() {\n        return StepMap.empty;\n    }\n    invert(doc) {\n        return new AttrStep(this.pos, this.attr, doc.nodeAt(this.pos).attrs[this.attr]);\n    }\n    map(mapping) {\n        let pos = mapping.mapResult(this.pos, 1);\n        return pos.deletedAfter ? null : new AttrStep(pos.pos, this.attr, this.value);\n    }\n    toJSON() {\n        return { stepType: \"attr\", pos: this.pos, attr: this.attr, value: this.value };\n    }\n    static fromJSON(schema, json) {\n        if (typeof json.pos != \"number\" || typeof json.attr != \"string\")\n            throw new RangeError(\"Invalid input for AttrStep.fromJSON\");\n        return new AttrStep(json.pos, json.attr, json.value);\n    }\n}\nStep.jsonID(\"attr\", AttrStep);\n/**\nUpdate an attribute in the doc node.\n*/\nclass DocAttrStep extends Step {\n    /**\n    Construct an attribute step.\n    */\n    constructor(\n    /**\n    The attribute to set.\n    */\n    attr, \n    // The attribute's new value.\n    value) {\n        super();\n        this.attr = attr;\n        this.value = value;\n    }\n    apply(doc) {\n        let attrs = Object.create(null);\n        for (let name in doc.attrs)\n            attrs[name] = doc.attrs[name];\n        attrs[this.attr] = this.value;\n        let updated = doc.type.create(attrs, doc.content, doc.marks);\n        return StepResult.ok(updated);\n    }\n    getMap() {\n        return StepMap.empty;\n    }\n    invert(doc) {\n        return new DocAttrStep(this.attr, doc.attrs[this.attr]);\n    }\n    map(mapping) {\n        return this;\n    }\n    toJSON() {\n        return { stepType: \"docAttr\", attr: this.attr, value: this.value };\n    }\n    static fromJSON(schema, json) {\n        if (typeof json.attr != \"string\")\n            throw new RangeError(\"Invalid input for DocAttrStep.fromJSON\");\n        return new DocAttrStep(json.attr, json.value);\n    }\n}\nStep.jsonID(\"docAttr\", DocAttrStep);\n\n/**\n@internal\n*/\nlet TransformError = class extends Error {\n};\nTransformError = function TransformError(message) {\n    let err = Error.call(this, message);\n    err.__proto__ = TransformError.prototype;\n    return err;\n};\nTransformError.prototype = Object.create(Error.prototype);\nTransformError.prototype.constructor = TransformError;\nTransformError.prototype.name = \"TransformError\";\n/**\nAbstraction to build up and track an array of\n[steps](https://prosemirror.net/docs/ref/#transform.Step) representing a document transformation.\n\nMost transforming methods return the `Transform` object itself, so\nthat they can be chained.\n*/\nclass Transform {\n    /**\n    Create a transform that starts with the given document.\n    */\n    constructor(\n    /**\n    The current document (the result of applying the steps in the\n    transform).\n    */\n    doc) {\n        this.doc = doc;\n        /**\n        The steps in this transform.\n        */\n        this.steps = [];\n        /**\n        The documents before each of the steps.\n        */\n        this.docs = [];\n        /**\n        A mapping with the maps for each of the steps in this transform.\n        */\n        this.mapping = new Mapping;\n    }\n    /**\n    The starting document.\n    */\n    get before() { return this.docs.length ? this.docs[0] : this.doc; }\n    /**\n    Apply a new step in this transform, saving the result. Throws an\n    error when the step fails.\n    */\n    step(step) {\n        let result = this.maybeStep(step);\n        if (result.failed)\n            throw new TransformError(result.failed);\n        return this;\n    }\n    /**\n    Try to apply a step in this transformation, ignoring it if it\n    fails. Returns the step result.\n    */\n    maybeStep(step) {\n        let result = step.apply(this.doc);\n        if (!result.failed)\n            this.addStep(step, result.doc);\n        return result;\n    }\n    /**\n    True when the document has been changed (when there are any\n    steps).\n    */\n    get docChanged() {\n        return this.steps.length > 0;\n    }\n    /**\n    @internal\n    */\n    addStep(step, doc) {\n        this.docs.push(this.doc);\n        this.steps.push(step);\n        this.mapping.appendMap(step.getMap());\n        this.doc = doc;\n    }\n    /**\n    Replace the part of the document between `from` and `to` with the\n    given `slice`.\n    */\n    replace(from, to = from, slice = Slice.empty) {\n        let step = replaceStep(this.doc, from, to, slice);\n        if (step)\n            this.step(step);\n        return this;\n    }\n    /**\n    Replace the given range with the given content, which may be a\n    fragment, node, or array of nodes.\n    */\n    replaceWith(from, to, content) {\n        return this.replace(from, to, new Slice(Fragment.from(content), 0, 0));\n    }\n    /**\n    Delete the content between the given positions.\n    */\n    delete(from, to) {\n        return this.replace(from, to, Slice.empty);\n    }\n    /**\n    Insert the given content at the given position.\n    */\n    insert(pos, content) {\n        return this.replaceWith(pos, pos, content);\n    }\n    /**\n    Replace a range of the document with a given slice, using\n    `from`, `to`, and the slice's\n    [`openStart`](https://prosemirror.net/docs/ref/#model.Slice.openStart) property as hints, rather\n    than fixed start and end points. This method may grow the\n    replaced area or close open nodes in the slice in order to get a\n    fit that is more in line with WYSIWYG expectations, by dropping\n    fully covered parent nodes of the replaced region when they are\n    marked [non-defining as\n    context](https://prosemirror.net/docs/ref/#model.NodeSpec.definingAsContext), or including an\n    open parent node from the slice that _is_ marked as [defining\n    its content](https://prosemirror.net/docs/ref/#model.NodeSpec.definingForContent).\n    \n    This is the method, for example, to handle paste. The similar\n    [`replace`](https://prosemirror.net/docs/ref/#transform.Transform.replace) method is a more\n    primitive tool which will _not_ move the start and end of its given\n    range, and is useful in situations where you need more precise\n    control over what happens.\n    */\n    replaceRange(from, to, slice) {\n        replaceRange(this, from, to, slice);\n        return this;\n    }\n    /**\n    Replace the given range with a node, but use `from` and `to` as\n    hints, rather than precise positions. When from and to are the same\n    and are at the start or end of a parent node in which the given\n    node doesn't fit, this method may _move_ them out towards a parent\n    that does allow the given node to be placed. When the given range\n    completely covers a parent node, this method may completely replace\n    that parent node.\n    */\n    replaceRangeWith(from, to, node) {\n        replaceRangeWith(this, from, to, node);\n        return this;\n    }\n    /**\n    Delete the given range, expanding it to cover fully covered\n    parent nodes until a valid replace is found.\n    */\n    deleteRange(from, to) {\n        deleteRange(this, from, to);\n        return this;\n    }\n    /**\n    Split the content in the given range off from its parent, if there\n    is sibling content before or after it, and move it up the tree to\n    the depth specified by `target`. You'll probably want to use\n    [`liftTarget`](https://prosemirror.net/docs/ref/#transform.liftTarget) to compute `target`, to make\n    sure the lift is valid.\n    */\n    lift(range, target) {\n        lift(this, range, target);\n        return this;\n    }\n    /**\n    Join the blocks around the given position. If depth is 2, their\n    last and first siblings are also joined, and so on.\n    */\n    join(pos, depth = 1) {\n        join(this, pos, depth);\n        return this;\n    }\n    /**\n    Wrap the given [range](https://prosemirror.net/docs/ref/#model.NodeRange) in the given set of wrappers.\n    The wrappers are assumed to be valid in this position, and should\n    probably be computed with [`findWrapping`](https://prosemirror.net/docs/ref/#transform.findWrapping).\n    */\n    wrap(range, wrappers) {\n        wrap(this, range, wrappers);\n        return this;\n    }\n    /**\n    Set the type of all textblocks (partly) between `from` and `to` to\n    the given node type with the given attributes.\n    */\n    setBlockType(from, to = from, type, attrs = null) {\n        setBlockType(this, from, to, type, attrs);\n        return this;\n    }\n    /**\n    Change the type, attributes, and/or marks of the node at `pos`.\n    When `type` isn't given, the existing node type is preserved,\n    */\n    setNodeMarkup(pos, type, attrs = null, marks) {\n        setNodeMarkup(this, pos, type, attrs, marks);\n        return this;\n    }\n    /**\n    Set a single attribute on a given node to a new value.\n    The `pos` addresses the document content. Use `setDocAttribute`\n    to set attributes on the document itself.\n    */\n    setNodeAttribute(pos, attr, value) {\n        this.step(new AttrStep(pos, attr, value));\n        return this;\n    }\n    /**\n    Set a single attribute on the document to a new value.\n    */\n    setDocAttribute(attr, value) {\n        this.step(new DocAttrStep(attr, value));\n        return this;\n    }\n    /**\n    Add a mark to the node at position `pos`.\n    */\n    addNodeMark(pos, mark) {\n        this.step(new AddNodeMarkStep(pos, mark));\n        return this;\n    }\n    /**\n    Remove a mark (or a mark of the given type) from the node at\n    position `pos`.\n    */\n    removeNodeMark(pos, mark) {\n        if (!(mark instanceof Mark)) {\n            let node = this.doc.nodeAt(pos);\n            if (!node)\n                throw new RangeError(\"No node at position \" + pos);\n            mark = mark.isInSet(node.marks);\n            if (!mark)\n                return this;\n        }\n        this.step(new RemoveNodeMarkStep(pos, mark));\n        return this;\n    }\n    /**\n    Split the node at the given position, and optionally, if `depth` is\n    greater than one, any number of nodes above that. By default, the\n    parts split off will inherit the node type of the original node.\n    This can be changed by passing an array of types and attributes to\n    use after the split.\n    */\n    split(pos, depth = 1, typesAfter) {\n        split(this, pos, depth, typesAfter);\n        return this;\n    }\n    /**\n    Add the given mark to the inline content between `from` and `to`.\n    */\n    addMark(from, to, mark) {\n        addMark(this, from, to, mark);\n        return this;\n    }\n    /**\n    Remove marks from inline nodes between `from` and `to`. When\n    `mark` is a single mark, remove precisely that mark. When it is\n    a mark type, remove all marks of that type. When it is null,\n    remove all marks of any type.\n    */\n    removeMark(from, to, mark) {\n        removeMark(this, from, to, mark);\n        return this;\n    }\n    /**\n    Removes all marks and nodes from the content of the node at\n    `pos` that don't match the given new parent node type. Accepts\n    an optional starting [content match](https://prosemirror.net/docs/ref/#model.ContentMatch) as\n    third argument.\n    */\n    clearIncompatible(pos, parentType, match) {\n        clearIncompatible(this, pos, parentType, match);\n        return this;\n    }\n}\n\nexport { AddMarkStep, AddNodeMarkStep, AttrStep, DocAttrStep, MapResult, Mapping, RemoveMarkStep, RemoveNodeMarkStep, ReplaceAroundStep, ReplaceStep, Step, StepMap, StepResult, Transform, TransformError, canJoin, canSplit, dropPoint, findWrapping, insertPoint, joinPoint, liftTarget, replaceStep };\n","import { Slice, Fragment, Mark, Node } from 'prosemirror-model';\nimport { ReplaceStep, ReplaceAroundStep, Transform } from 'prosemirror-transform';\n\nconst classesById = Object.create(null);\n/**\nSuperclass for editor selections. Every selection type should\nextend this. Should not be instantiated directly.\n*/\nclass Selection {\n    /**\n    Initialize a selection with the head and anchor and ranges. If no\n    ranges are given, constructs a single range across `$anchor` and\n    `$head`.\n    */\n    constructor(\n    /**\n    The resolved anchor of the selection (the side that stays in\n    place when the selection is modified).\n    */\n    $anchor, \n    /**\n    The resolved head of the selection (the side that moves when\n    the selection is modified).\n    */\n    $head, ranges) {\n        this.$anchor = $anchor;\n        this.$head = $head;\n        this.ranges = ranges || [new SelectionRange($anchor.min($head), $anchor.max($head))];\n    }\n    /**\n    The selection's anchor, as an unresolved position.\n    */\n    get anchor() { return this.$anchor.pos; }\n    /**\n    The selection's head.\n    */\n    get head() { return this.$head.pos; }\n    /**\n    The lower bound of the selection's main range.\n    */\n    get from() { return this.$from.pos; }\n    /**\n    The upper bound of the selection's main range.\n    */\n    get to() { return this.$to.pos; }\n    /**\n    The resolved lower  bound of the selection's main range.\n    */\n    get $from() {\n        return this.ranges[0].$from;\n    }\n    /**\n    The resolved upper bound of the selection's main range.\n    */\n    get $to() {\n        return this.ranges[0].$to;\n    }\n    /**\n    Indicates whether the selection contains any content.\n    */\n    get empty() {\n        let ranges = this.ranges;\n        for (let i = 0; i < ranges.length; i++)\n            if (ranges[i].$from.pos != ranges[i].$to.pos)\n                return false;\n        return true;\n    }\n    /**\n    Get the content of this selection as a slice.\n    */\n    content() {\n        return this.$from.doc.slice(this.from, this.to, true);\n    }\n    /**\n    Replace the selection with a slice or, if no slice is given,\n    delete the selection. Will append to the given transaction.\n    */\n    replace(tr, content = Slice.empty) {\n        // Put the new selection at the position after the inserted\n        // content. When that ended in an inline node, search backwards,\n        // to get the position after that node. If not, search forward.\n        let lastNode = content.content.lastChild, lastParent = null;\n        for (let i = 0; i < content.openEnd; i++) {\n            lastParent = lastNode;\n            lastNode = lastNode.lastChild;\n        }\n        let mapFrom = tr.steps.length, ranges = this.ranges;\n        for (let i = 0; i < ranges.length; i++) {\n            let { $from, $to } = ranges[i], mapping = tr.mapping.slice(mapFrom);\n            tr.replaceRange(mapping.map($from.pos), mapping.map($to.pos), i ? Slice.empty : content);\n            if (i == 0)\n                selectionToInsertionEnd(tr, mapFrom, (lastNode ? lastNode.isInline : lastParent && lastParent.isTextblock) ? -1 : 1);\n        }\n    }\n    /**\n    Replace the selection with the given node, appending the changes\n    to the given transaction.\n    */\n    replaceWith(tr, node) {\n        let mapFrom = tr.steps.length, ranges = this.ranges;\n        for (let i = 0; i < ranges.length; i++) {\n            let { $from, $to } = ranges[i], mapping = tr.mapping.slice(mapFrom);\n            let from = mapping.map($from.pos), to = mapping.map($to.pos);\n            if (i) {\n                tr.deleteRange(from, to);\n            }\n            else {\n                tr.replaceRangeWith(from, to, node);\n                selectionToInsertionEnd(tr, mapFrom, node.isInline ? -1 : 1);\n            }\n        }\n    }\n    /**\n    Find a valid cursor or leaf node selection starting at the given\n    position and searching back if `dir` is negative, and forward if\n    positive. When `textOnly` is true, only consider cursor\n    selections. Will return null when no valid selection position is\n    found.\n    */\n    static findFrom($pos, dir, textOnly = false) {\n        let inner = $pos.parent.inlineContent ? new TextSelection($pos)\n            : findSelectionIn($pos.node(0), $pos.parent, $pos.pos, $pos.index(), dir, textOnly);\n        if (inner)\n            return inner;\n        for (let depth = $pos.depth - 1; depth >= 0; depth--) {\n            let found = dir < 0\n                ? findSelectionIn($pos.node(0), $pos.node(depth), $pos.before(depth + 1), $pos.index(depth), dir, textOnly)\n                : findSelectionIn($pos.node(0), $pos.node(depth), $pos.after(depth + 1), $pos.index(depth) + 1, dir, textOnly);\n            if (found)\n                return found;\n        }\n        return null;\n    }\n    /**\n    Find a valid cursor or leaf node selection near the given\n    position. Searches forward first by default, but if `bias` is\n    negative, it will search backwards first.\n    */\n    static near($pos, bias = 1) {\n        return this.findFrom($pos, bias) || this.findFrom($pos, -bias) || new AllSelection($pos.node(0));\n    }\n    /**\n    Find the cursor or leaf node selection closest to the start of\n    the given document. Will return an\n    [`AllSelection`](https://prosemirror.net/docs/ref/#state.AllSelection) if no valid position\n    exists.\n    */\n    static atStart(doc) {\n        return findSelectionIn(doc, doc, 0, 0, 1) || new AllSelection(doc);\n    }\n    /**\n    Find the cursor or leaf node selection closest to the end of the\n    given document.\n    */\n    static atEnd(doc) {\n        return findSelectionIn(doc, doc, doc.content.size, doc.childCount, -1) || new AllSelection(doc);\n    }\n    /**\n    Deserialize the JSON representation of a selection. Must be\n    implemented for custom classes (as a static class method).\n    */\n    static fromJSON(doc, json) {\n        if (!json || !json.type)\n            throw new RangeError(\"Invalid input for Selection.fromJSON\");\n        let cls = classesById[json.type];\n        if (!cls)\n            throw new RangeError(`No selection type ${json.type} defined`);\n        return cls.fromJSON(doc, json);\n    }\n    /**\n    To be able to deserialize selections from JSON, custom selection\n    classes must register themselves with an ID string, so that they\n    can be disambiguated. Try to pick something that's unlikely to\n    clash with classes from other modules.\n    */\n    static jsonID(id, selectionClass) {\n        if (id in classesById)\n            throw new RangeError(\"Duplicate use of selection JSON ID \" + id);\n        classesById[id] = selectionClass;\n        selectionClass.prototype.jsonID = id;\n        return selectionClass;\n    }\n    /**\n    Get a [bookmark](https://prosemirror.net/docs/ref/#state.SelectionBookmark) for this selection,\n    which is a value that can be mapped without having access to a\n    current document, and later resolved to a real selection for a\n    given document again. (This is used mostly by the history to\n    track and restore old selections.) The default implementation of\n    this method just converts the selection to a text selection and\n    returns the bookmark for that.\n    */\n    getBookmark() {\n        return TextSelection.between(this.$anchor, this.$head).getBookmark();\n    }\n}\nSelection.prototype.visible = true;\n/**\nRepresents a selected range in a document.\n*/\nclass SelectionRange {\n    /**\n    Create a range.\n    */\n    constructor(\n    /**\n    The lower bound of the range.\n    */\n    $from, \n    /**\n    The upper bound of the range.\n    */\n    $to) {\n        this.$from = $from;\n        this.$to = $to;\n    }\n}\nlet warnedAboutTextSelection = false;\nfunction checkTextSelection($pos) {\n    if (!warnedAboutTextSelection && !$pos.parent.inlineContent) {\n        warnedAboutTextSelection = true;\n        console[\"warn\"](\"TextSelection endpoint not pointing into a node with inline content (\" + $pos.parent.type.name + \")\");\n    }\n}\n/**\nA text selection represents a classical editor selection, with a\nhead (the moving side) and anchor (immobile side), both of which\npoint into textblock nodes. It can be empty (a regular cursor\nposition).\n*/\nclass TextSelection extends Selection {\n    /**\n    Construct a text selection between the given points.\n    */\n    constructor($anchor, $head = $anchor) {\n        checkTextSelection($anchor);\n        checkTextSelection($head);\n        super($anchor, $head);\n    }\n    /**\n    Returns a resolved position if this is a cursor selection (an\n    empty text selection), and null otherwise.\n    */\n    get $cursor() { return this.$anchor.pos == this.$head.pos ? this.$head : null; }\n    map(doc, mapping) {\n        let $head = doc.resolve(mapping.map(this.head));\n        if (!$head.parent.inlineContent)\n            return Selection.near($head);\n        let $anchor = doc.resolve(mapping.map(this.anchor));\n        return new TextSelection($anchor.parent.inlineContent ? $anchor : $head, $head);\n    }\n    replace(tr, content = Slice.empty) {\n        super.replace(tr, content);\n        if (content == Slice.empty) {\n            let marks = this.$from.marksAcross(this.$to);\n            if (marks)\n                tr.ensureMarks(marks);\n        }\n    }\n    eq(other) {\n        return other instanceof TextSelection && other.anchor == this.anchor && other.head == this.head;\n    }\n    getBookmark() {\n        return new TextBookmark(this.anchor, this.head);\n    }\n    toJSON() {\n        return { type: \"text\", anchor: this.anchor, head: this.head };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(doc, json) {\n        if (typeof json.anchor != \"number\" || typeof json.head != \"number\")\n            throw new RangeError(\"Invalid input for TextSelection.fromJSON\");\n        return new TextSelection(doc.resolve(json.anchor), doc.resolve(json.head));\n    }\n    /**\n    Create a text selection from non-resolved positions.\n    */\n    static create(doc, anchor, head = anchor) {\n        let $anchor = doc.resolve(anchor);\n        return new this($anchor, head == anchor ? $anchor : doc.resolve(head));\n    }\n    /**\n    Return a text selection that spans the given positions or, if\n    they aren't text positions, find a text selection near them.\n    `bias` determines whether the method searches forward (default)\n    or backwards (negative number) first. Will fall back to calling\n    [`Selection.near`](https://prosemirror.net/docs/ref/#state.Selection^near) when the document\n    doesn't contain a valid text position.\n    */\n    static between($anchor, $head, bias) {\n        let dPos = $anchor.pos - $head.pos;\n        if (!bias || dPos)\n            bias = dPos >= 0 ? 1 : -1;\n        if (!$head.parent.inlineContent) {\n            let found = Selection.findFrom($head, bias, true) || Selection.findFrom($head, -bias, true);\n            if (found)\n                $head = found.$head;\n            else\n                return Selection.near($head, bias);\n        }\n        if (!$anchor.parent.inlineContent) {\n            if (dPos == 0) {\n                $anchor = $head;\n            }\n            else {\n                $anchor = (Selection.findFrom($anchor, -bias, true) || Selection.findFrom($anchor, bias, true)).$anchor;\n                if (($anchor.pos < $head.pos) != (dPos < 0))\n                    $anchor = $head;\n            }\n        }\n        return new TextSelection($anchor, $head);\n    }\n}\nSelection.jsonID(\"text\", TextSelection);\nclass TextBookmark {\n    constructor(anchor, head) {\n        this.anchor = anchor;\n        this.head = head;\n    }\n    map(mapping) {\n        return new TextBookmark(mapping.map(this.anchor), mapping.map(this.head));\n    }\n    resolve(doc) {\n        return TextSelection.between(doc.resolve(this.anchor), doc.resolve(this.head));\n    }\n}\n/**\nA node selection is a selection that points at a single node. All\nnodes marked [selectable](https://prosemirror.net/docs/ref/#model.NodeSpec.selectable) can be the\ntarget of a node selection. In such a selection, `from` and `to`\npoint directly before and after the selected node, `anchor` equals\n`from`, and `head` equals `to`..\n*/\nclass NodeSelection extends Selection {\n    /**\n    Create a node selection. Does not verify the validity of its\n    argument.\n    */\n    constructor($pos) {\n        let node = $pos.nodeAfter;\n        let $end = $pos.node(0).resolve($pos.pos + node.nodeSize);\n        super($pos, $end);\n        this.node = node;\n    }\n    map(doc, mapping) {\n        let { deleted, pos } = mapping.mapResult(this.anchor);\n        let $pos = doc.resolve(pos);\n        if (deleted)\n            return Selection.near($pos);\n        return new NodeSelection($pos);\n    }\n    content() {\n        return new Slice(Fragment.from(this.node), 0, 0);\n    }\n    eq(other) {\n        return other instanceof NodeSelection && other.anchor == this.anchor;\n    }\n    toJSON() {\n        return { type: \"node\", anchor: this.anchor };\n    }\n    getBookmark() { return new NodeBookmark(this.anchor); }\n    /**\n    @internal\n    */\n    static fromJSON(doc, json) {\n        if (typeof json.anchor != \"number\")\n            throw new RangeError(\"Invalid input for NodeSelection.fromJSON\");\n        return new NodeSelection(doc.resolve(json.anchor));\n    }\n    /**\n    Create a node selection from non-resolved positions.\n    */\n    static create(doc, from) {\n        return new NodeSelection(doc.resolve(from));\n    }\n    /**\n    Determines whether the given node may be selected as a node\n    selection.\n    */\n    static isSelectable(node) {\n        return !node.isText && node.type.spec.selectable !== false;\n    }\n}\nNodeSelection.prototype.visible = false;\nSelection.jsonID(\"node\", NodeSelection);\nclass NodeBookmark {\n    constructor(anchor) {\n        this.anchor = anchor;\n    }\n    map(mapping) {\n        let { deleted, pos } = mapping.mapResult(this.anchor);\n        return deleted ? new TextBookmark(pos, pos) : new NodeBookmark(pos);\n    }\n    resolve(doc) {\n        let $pos = doc.resolve(this.anchor), node = $pos.nodeAfter;\n        if (node && NodeSelection.isSelectable(node))\n            return new NodeSelection($pos);\n        return Selection.near($pos);\n    }\n}\n/**\nA selection type that represents selecting the whole document\n(which can not necessarily be expressed with a text selection, when\nthere are for example leaf block nodes at the start or end of the\ndocument).\n*/\nclass AllSelection extends Selection {\n    /**\n    Create an all-selection over the given document.\n    */\n    constructor(doc) {\n        super(doc.resolve(0), doc.resolve(doc.content.size));\n    }\n    replace(tr, content = Slice.empty) {\n        if (content == Slice.empty) {\n            tr.delete(0, tr.doc.content.size);\n            let sel = Selection.atStart(tr.doc);\n            if (!sel.eq(tr.selection))\n                tr.setSelection(sel);\n        }\n        else {\n            super.replace(tr, content);\n        }\n    }\n    toJSON() { return { type: \"all\" }; }\n    /**\n    @internal\n    */\n    static fromJSON(doc) { return new AllSelection(doc); }\n    map(doc) { return new AllSelection(doc); }\n    eq(other) { return other instanceof AllSelection; }\n    getBookmark() { return AllBookmark; }\n}\nSelection.jsonID(\"all\", AllSelection);\nconst AllBookmark = {\n    map() { return this; },\n    resolve(doc) { return new AllSelection(doc); }\n};\n// FIXME we'll need some awareness of text direction when scanning for selections\n// Try to find a selection inside the given node. `pos` points at the\n// position where the search starts. When `text` is true, only return\n// text selections.\nfunction findSelectionIn(doc, node, pos, index, dir, text = false) {\n    if (node.inlineContent)\n        return TextSelection.create(doc, pos);\n    for (let i = index - (dir > 0 ? 0 : 1); dir > 0 ? i < node.childCount : i >= 0; i += dir) {\n        let child = node.child(i);\n        if (!child.isAtom) {\n            let inner = findSelectionIn(doc, child, pos + dir, dir < 0 ? child.childCount : 0, dir, text);\n            if (inner)\n                return inner;\n        }\n        else if (!text && NodeSelection.isSelectable(child)) {\n            return NodeSelection.create(doc, pos - (dir < 0 ? child.nodeSize : 0));\n        }\n        pos += child.nodeSize * dir;\n    }\n    return null;\n}\nfunction selectionToInsertionEnd(tr, startLen, bias) {\n    let last = tr.steps.length - 1;\n    if (last < startLen)\n        return;\n    let step = tr.steps[last];\n    if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep))\n        return;\n    let map = tr.mapping.maps[last], end;\n    map.forEach((_from, _to, _newFrom, newTo) => { if (end == null)\n        end = newTo; });\n    tr.setSelection(Selection.near(tr.doc.resolve(end), bias));\n}\n\nconst UPDATED_SEL = 1, UPDATED_MARKS = 2, UPDATED_SCROLL = 4;\n/**\nAn editor state transaction, which can be applied to a state to\ncreate an updated state. Use\n[`EditorState.tr`](https://prosemirror.net/docs/ref/#state.EditorState.tr) to create an instance.\n\nTransactions track changes to the document (they are a subclass of\n[`Transform`](https://prosemirror.net/docs/ref/#transform.Transform)), but also other state changes,\nlike selection updates and adjustments of the set of [stored\nmarks](https://prosemirror.net/docs/ref/#state.EditorState.storedMarks). In addition, you can store\nmetadata properties in a transaction, which are extra pieces of\ninformation that client code or plugins can use to describe what a\ntransaction represents, so that they can update their [own\nstate](https://prosemirror.net/docs/ref/#state.StateField) accordingly.\n\nThe [editor view](https://prosemirror.net/docs/ref/#view.EditorView) uses a few metadata\nproperties: it will attach a property `\"pointer\"` with the value\n`true` to selection transactions directly caused by mouse or touch\ninput, a `\"composition\"` property holding an ID identifying the\ncomposition that caused it to transactions caused by composed DOM\ninput, and a `\"uiEvent\"` property of that may be `\"paste\"`,\n`\"cut\"`, or `\"drop\"`.\n*/\nclass Transaction extends Transform {\n    /**\n    @internal\n    */\n    constructor(state) {\n        super(state.doc);\n        // The step count for which the current selection is valid.\n        this.curSelectionFor = 0;\n        // Bitfield to track which aspects of the state were updated by\n        // this transaction.\n        this.updated = 0;\n        // Object used to store metadata properties for the transaction.\n        this.meta = Object.create(null);\n        this.time = Date.now();\n        this.curSelection = state.selection;\n        this.storedMarks = state.storedMarks;\n    }\n    /**\n    The transaction's current selection. This defaults to the editor\n    selection [mapped](https://prosemirror.net/docs/ref/#state.Selection.map) through the steps in the\n    transaction, but can be overwritten with\n    [`setSelection`](https://prosemirror.net/docs/ref/#state.Transaction.setSelection).\n    */\n    get selection() {\n        if (this.curSelectionFor < this.steps.length) {\n            this.curSelection = this.curSelection.map(this.doc, this.mapping.slice(this.curSelectionFor));\n            this.curSelectionFor = this.steps.length;\n        }\n        return this.curSelection;\n    }\n    /**\n    Update the transaction's current selection. Will determine the\n    selection that the editor gets when the transaction is applied.\n    */\n    setSelection(selection) {\n        if (selection.$from.doc != this.doc)\n            throw new RangeError(\"Selection passed to setSelection must point at the current document\");\n        this.curSelection = selection;\n        this.curSelectionFor = this.steps.length;\n        this.updated = (this.updated | UPDATED_SEL) & ~UPDATED_MARKS;\n        this.storedMarks = null;\n        return this;\n    }\n    /**\n    Whether the selection was explicitly updated by this transaction.\n    */\n    get selectionSet() {\n        return (this.updated & UPDATED_SEL) > 0;\n    }\n    /**\n    Set the current stored marks.\n    */\n    setStoredMarks(marks) {\n        this.storedMarks = marks;\n        this.updated |= UPDATED_MARKS;\n        return this;\n    }\n    /**\n    Make sure the current stored marks or, if that is null, the marks\n    at the selection, match the given set of marks. Does nothing if\n    this is already the case.\n    */\n    ensureMarks(marks) {\n        if (!Mark.sameSet(this.storedMarks || this.selection.$from.marks(), marks))\n            this.setStoredMarks(marks);\n        return this;\n    }\n    /**\n    Add a mark to the set of stored marks.\n    */\n    addStoredMark(mark) {\n        return this.ensureMarks(mark.addToSet(this.storedMarks || this.selection.$head.marks()));\n    }\n    /**\n    Remove a mark or mark type from the set of stored marks.\n    */\n    removeStoredMark(mark) {\n        return this.ensureMarks(mark.removeFromSet(this.storedMarks || this.selection.$head.marks()));\n    }\n    /**\n    Whether the stored marks were explicitly set for this transaction.\n    */\n    get storedMarksSet() {\n        return (this.updated & UPDATED_MARKS) > 0;\n    }\n    /**\n    @internal\n    */\n    addStep(step, doc) {\n        super.addStep(step, doc);\n        this.updated = this.updated & ~UPDATED_MARKS;\n        this.storedMarks = null;\n    }\n    /**\n    Update the timestamp for the transaction.\n    */\n    setTime(time) {\n        this.time = time;\n        return this;\n    }\n    /**\n    Replace the current selection with the given slice.\n    */\n    replaceSelection(slice) {\n        this.selection.replace(this, slice);\n        return this;\n    }\n    /**\n    Replace the selection with the given node. When `inheritMarks` is\n    true and the content is inline, it inherits the marks from the\n    place where it is inserted.\n    */\n    replaceSelectionWith(node, inheritMarks = true) {\n        let selection = this.selection;\n        if (inheritMarks)\n            node = node.mark(this.storedMarks || (selection.empty ? selection.$from.marks() : (selection.$from.marksAcross(selection.$to) || Mark.none)));\n        selection.replaceWith(this, node);\n        return this;\n    }\n    /**\n    Delete the selection.\n    */\n    deleteSelection() {\n        this.selection.replace(this);\n        return this;\n    }\n    /**\n    Replace the given range, or the selection if no range is given,\n    with a text node containing the given string.\n    */\n    insertText(text, from, to) {\n        let schema = this.doc.type.schema;\n        if (from == null) {\n            if (!text)\n                return this.deleteSelection();\n            return this.replaceSelectionWith(schema.text(text), true);\n        }\n        else {\n            if (to == null)\n                to = from;\n            to = to == null ? from : to;\n            if (!text)\n                return this.deleteRange(from, to);\n            let marks = this.storedMarks;\n            if (!marks) {\n                let $from = this.doc.resolve(from);\n                marks = to == from ? $from.marks() : $from.marksAcross(this.doc.resolve(to));\n            }\n            this.replaceRangeWith(from, to, schema.text(text, marks));\n            if (!this.selection.empty)\n                this.setSelection(Selection.near(this.selection.$to));\n            return this;\n        }\n    }\n    /**\n    Store a metadata property in this transaction, keyed either by\n    name or by plugin.\n    */\n    setMeta(key, value) {\n        this.meta[typeof key == \"string\" ? key : key.key] = value;\n        return this;\n    }\n    /**\n    Retrieve a metadata property for a given name or plugin.\n    */\n    getMeta(key) {\n        return this.meta[typeof key == \"string\" ? key : key.key];\n    }\n    /**\n    Returns true if this transaction doesn't contain any metadata,\n    and can thus safely be extended.\n    */\n    get isGeneric() {\n        for (let _ in this.meta)\n            return false;\n        return true;\n    }\n    /**\n    Indicate that the editor should scroll the selection into view\n    when updated to the state produced by this transaction.\n    */\n    scrollIntoView() {\n        this.updated |= UPDATED_SCROLL;\n        return this;\n    }\n    /**\n    True when this transaction has had `scrollIntoView` called on it.\n    */\n    get scrolledIntoView() {\n        return (this.updated & UPDATED_SCROLL) > 0;\n    }\n}\n\nfunction bind(f, self) {\n    return !self || !f ? f : f.bind(self);\n}\nclass FieldDesc {\n    constructor(name, desc, self) {\n        this.name = name;\n        this.init = bind(desc.init, self);\n        this.apply = bind(desc.apply, self);\n    }\n}\nconst baseFields = [\n    new FieldDesc(\"doc\", {\n        init(config) { return config.doc || config.schema.topNodeType.createAndFill(); },\n        apply(tr) { return tr.doc; }\n    }),\n    new FieldDesc(\"selection\", {\n        init(config, instance) { return config.selection || Selection.atStart(instance.doc); },\n        apply(tr) { return tr.selection; }\n    }),\n    new FieldDesc(\"storedMarks\", {\n        init(config) { return config.storedMarks || null; },\n        apply(tr, _marks, _old, state) { return state.selection.$cursor ? tr.storedMarks : null; }\n    }),\n    new FieldDesc(\"scrollToSelection\", {\n        init() { return 0; },\n        apply(tr, prev) { return tr.scrolledIntoView ? prev + 1 : prev; }\n    })\n];\n// Object wrapping the part of a state object that stays the same\n// across transactions. Stored in the state's `config` property.\nclass Configuration {\n    constructor(schema, plugins) {\n        this.schema = schema;\n        this.plugins = [];\n        this.pluginsByKey = Object.create(null);\n        this.fields = baseFields.slice();\n        if (plugins)\n            plugins.forEach(plugin => {\n                if (this.pluginsByKey[plugin.key])\n                    throw new RangeError(\"Adding different instances of a keyed plugin (\" + plugin.key + \")\");\n                this.plugins.push(plugin);\n                this.pluginsByKey[plugin.key] = plugin;\n                if (plugin.spec.state)\n                    this.fields.push(new FieldDesc(plugin.key, plugin.spec.state, plugin));\n            });\n    }\n}\n/**\nThe state of a ProseMirror editor is represented by an object of\nthis type. A state is a persistent data structure—it isn't\nupdated, but rather a new state value is computed from an old one\nusing the [`apply`](https://prosemirror.net/docs/ref/#state.EditorState.apply) method.\n\nA state holds a number of built-in fields, and plugins can\n[define](https://prosemirror.net/docs/ref/#state.PluginSpec.state) additional fields.\n*/\nclass EditorState {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    @internal\n    */\n    config) {\n        this.config = config;\n    }\n    /**\n    The schema of the state's document.\n    */\n    get schema() {\n        return this.config.schema;\n    }\n    /**\n    The plugins that are active in this state.\n    */\n    get plugins() {\n        return this.config.plugins;\n    }\n    /**\n    Apply the given transaction to produce a new state.\n    */\n    apply(tr) {\n        return this.applyTransaction(tr).state;\n    }\n    /**\n    @internal\n    */\n    filterTransaction(tr, ignore = -1) {\n        for (let i = 0; i < this.config.plugins.length; i++)\n            if (i != ignore) {\n                let plugin = this.config.plugins[i];\n                if (plugin.spec.filterTransaction && !plugin.spec.filterTransaction.call(plugin, tr, this))\n                    return false;\n            }\n        return true;\n    }\n    /**\n    Verbose variant of [`apply`](https://prosemirror.net/docs/ref/#state.EditorState.apply) that\n    returns the precise transactions that were applied (which might\n    be influenced by the [transaction\n    hooks](https://prosemirror.net/docs/ref/#state.PluginSpec.filterTransaction) of\n    plugins) along with the new state.\n    */\n    applyTransaction(rootTr) {\n        if (!this.filterTransaction(rootTr))\n            return { state: this, transactions: [] };\n        let trs = [rootTr], newState = this.applyInner(rootTr), seen = null;\n        // This loop repeatedly gives plugins a chance to respond to\n        // transactions as new transactions are added, making sure to only\n        // pass the transactions the plugin did not see before.\n        for (;;) {\n            let haveNew = false;\n            for (let i = 0; i < this.config.plugins.length; i++) {\n                let plugin = this.config.plugins[i];\n                if (plugin.spec.appendTransaction) {\n                    let n = seen ? seen[i].n : 0, oldState = seen ? seen[i].state : this;\n                    let tr = n < trs.length &&\n                        plugin.spec.appendTransaction.call(plugin, n ? trs.slice(n) : trs, oldState, newState);\n                    if (tr && newState.filterTransaction(tr, i)) {\n                        tr.setMeta(\"appendedTransaction\", rootTr);\n                        if (!seen) {\n                            seen = [];\n                            for (let j = 0; j < this.config.plugins.length; j++)\n                                seen.push(j < i ? { state: newState, n: trs.length } : { state: this, n: 0 });\n                        }\n                        trs.push(tr);\n                        newState = newState.applyInner(tr);\n                        haveNew = true;\n                    }\n                    if (seen)\n                        seen[i] = { state: newState, n: trs.length };\n                }\n            }\n            if (!haveNew)\n                return { state: newState, transactions: trs };\n        }\n    }\n    /**\n    @internal\n    */\n    applyInner(tr) {\n        if (!tr.before.eq(this.doc))\n            throw new RangeError(\"Applying a mismatched transaction\");\n        let newInstance = new EditorState(this.config), fields = this.config.fields;\n        for (let i = 0; i < fields.length; i++) {\n            let field = fields[i];\n            newInstance[field.name] = field.apply(tr, this[field.name], this, newInstance);\n        }\n        return newInstance;\n    }\n    /**\n    Start a [transaction](https://prosemirror.net/docs/ref/#state.Transaction) from this state.\n    */\n    get tr() { return new Transaction(this); }\n    /**\n    Create a new state.\n    */\n    static create(config) {\n        let $config = new Configuration(config.doc ? config.doc.type.schema : config.schema, config.plugins);\n        let instance = new EditorState($config);\n        for (let i = 0; i < $config.fields.length; i++)\n            instance[$config.fields[i].name] = $config.fields[i].init(config, instance);\n        return instance;\n    }\n    /**\n    Create a new state based on this one, but with an adjusted set\n    of active plugins. State fields that exist in both sets of\n    plugins are kept unchanged. Those that no longer exist are\n    dropped, and those that are new are initialized using their\n    [`init`](https://prosemirror.net/docs/ref/#state.StateField.init) method, passing in the new\n    configuration object..\n    */\n    reconfigure(config) {\n        let $config = new Configuration(this.schema, config.plugins);\n        let fields = $config.fields, instance = new EditorState($config);\n        for (let i = 0; i < fields.length; i++) {\n            let name = fields[i].name;\n            instance[name] = this.hasOwnProperty(name) ? this[name] : fields[i].init(config, instance);\n        }\n        return instance;\n    }\n    /**\n    Serialize this state to JSON. If you want to serialize the state\n    of plugins, pass an object mapping property names to use in the\n    resulting JSON object to plugin objects. The argument may also be\n    a string or number, in which case it is ignored, to support the\n    way `JSON.stringify` calls `toString` methods.\n    */\n    toJSON(pluginFields) {\n        let result = { doc: this.doc.toJSON(), selection: this.selection.toJSON() };\n        if (this.storedMarks)\n            result.storedMarks = this.storedMarks.map(m => m.toJSON());\n        if (pluginFields && typeof pluginFields == 'object')\n            for (let prop in pluginFields) {\n                if (prop == \"doc\" || prop == \"selection\")\n                    throw new RangeError(\"The JSON fields `doc` and `selection` are reserved\");\n                let plugin = pluginFields[prop], state = plugin.spec.state;\n                if (state && state.toJSON)\n                    result[prop] = state.toJSON.call(plugin, this[plugin.key]);\n            }\n        return result;\n    }\n    /**\n    Deserialize a JSON representation of a state. `config` should\n    have at least a `schema` field, and should contain array of\n    plugins to initialize the state with. `pluginFields` can be used\n    to deserialize the state of plugins, by associating plugin\n    instances with the property names they use in the JSON object.\n    */\n    static fromJSON(config, json, pluginFields) {\n        if (!json)\n            throw new RangeError(\"Invalid input for EditorState.fromJSON\");\n        if (!config.schema)\n            throw new RangeError(\"Required config field 'schema' missing\");\n        let $config = new Configuration(config.schema, config.plugins);\n        let instance = new EditorState($config);\n        $config.fields.forEach(field => {\n            if (field.name == \"doc\") {\n                instance.doc = Node.fromJSON(config.schema, json.doc);\n            }\n            else if (field.name == \"selection\") {\n                instance.selection = Selection.fromJSON(instance.doc, json.selection);\n            }\n            else if (field.name == \"storedMarks\") {\n                if (json.storedMarks)\n                    instance.storedMarks = json.storedMarks.map(config.schema.markFromJSON);\n            }\n            else {\n                if (pluginFields)\n                    for (let prop in pluginFields) {\n                        let plugin = pluginFields[prop], state = plugin.spec.state;\n                        if (plugin.key == field.name && state && state.fromJSON &&\n                            Object.prototype.hasOwnProperty.call(json, prop)) {\n                            instance[field.name] = state.fromJSON.call(plugin, config, json[prop], instance);\n                            return;\n                        }\n                    }\n                instance[field.name] = field.init(config, instance);\n            }\n        });\n        return instance;\n    }\n}\n\nfunction bindProps(obj, self, target) {\n    for (let prop in obj) {\n        let val = obj[prop];\n        if (val instanceof Function)\n            val = val.bind(self);\n        else if (prop == \"handleDOMEvents\")\n            val = bindProps(val, self, {});\n        target[prop] = val;\n    }\n    return target;\n}\n/**\nPlugins bundle functionality that can be added to an editor.\nThey are part of the [editor state](https://prosemirror.net/docs/ref/#state.EditorState) and\nmay influence that state and the view that contains it.\n*/\nclass Plugin {\n    /**\n    Create a plugin.\n    */\n    constructor(\n    /**\n    The plugin's [spec object](https://prosemirror.net/docs/ref/#state.PluginSpec).\n    */\n    spec) {\n        this.spec = spec;\n        /**\n        The [props](https://prosemirror.net/docs/ref/#view.EditorProps) exported by this plugin.\n        */\n        this.props = {};\n        if (spec.props)\n            bindProps(spec.props, this, this.props);\n        this.key = spec.key ? spec.key.key : createKey(\"plugin\");\n    }\n    /**\n    Extract the plugin's state field from an editor state.\n    */\n    getState(state) { return state[this.key]; }\n}\nconst keys = Object.create(null);\nfunction createKey(name) {\n    if (name in keys)\n        return name + \"$\" + ++keys[name];\n    keys[name] = 0;\n    return name + \"$\";\n}\n/**\nA key is used to [tag](https://prosemirror.net/docs/ref/#state.PluginSpec.key) plugins in a way\nthat makes it possible to find them, given an editor state.\nAssigning a key does mean only one plugin of that type can be\nactive in a state.\n*/\nclass PluginKey {\n    /**\n    Create a plugin key.\n    */\n    constructor(name = \"key\") { this.key = createKey(name); }\n    /**\n    Get the active plugin with this key, if any, from an editor\n    state.\n    */\n    get(state) { return state.config.pluginsByKey[this.key]; }\n    /**\n    Get the plugin's state from an editor state.\n    */\n    getState(state) { return state[this.key]; }\n}\n\nexport { AllSelection, EditorState, NodeSelection, Plugin, PluginKey, Selection, SelectionRange, TextSelection, Transaction };\n","import { ReplaceError, Slice, Fragment, MarkType, Mark } from 'prosemirror-model';\n\n// Recovery values encode a range index and an offset. They are\n// represented as numbers, because tons of them will be created when\n// mapping, for example, a large number of decorations. The number's\n// lower 16 bits provide the index, the remaining bits the offset.\n//\n// Note: We intentionally don't use bit shift operators to en- and\n// decode these, since those clip to 32 bits, which we might in rare\n// cases want to overflow. A 64-bit float can represent 48-bit\n// integers precisely.\nconst lower16 = 0xffff;\nconst factor16 = Math.pow(2, 16);\nfunction makeRecover(index, offset) { return index + offset * factor16; }\nfunction recoverIndex(value) { return value & lower16; }\nfunction recoverOffset(value) { return (value - (value & lower16)) / factor16; }\nconst DEL_BEFORE = 1, DEL_AFTER = 2, DEL_ACROSS = 4, DEL_SIDE = 8;\n/**\nAn object representing a mapped position with extra\ninformation.\n*/\nclass MapResult {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The mapped version of the position.\n    */\n    pos, \n    /**\n    @internal\n    */\n    delInfo, \n    /**\n    @internal\n    */\n    recover) {\n        this.pos = pos;\n        this.delInfo = delInfo;\n        this.recover = recover;\n    }\n    /**\n    Tells you whether the position was deleted, that is, whether the\n    step removed the token on the side queried (via the `assoc`)\n    argument from the document.\n    */\n    get deleted() { return (this.delInfo & DEL_SIDE) > 0; }\n    /**\n    Tells you whether the token before the mapped position was deleted.\n    */\n    get deletedBefore() { return (this.delInfo & (DEL_BEFORE | DEL_ACROSS)) > 0; }\n    /**\n    True when the token after the mapped position was deleted.\n    */\n    get deletedAfter() { return (this.delInfo & (DEL_AFTER | DEL_ACROSS)) > 0; }\n    /**\n    Tells whether any of the steps mapped through deletes across the\n    position (including both the token before and after the\n    position).\n    */\n    get deletedAcross() { return (this.delInfo & DEL_ACROSS) > 0; }\n}\n/**\nA map describing the deletions and insertions made by a step, which\ncan be used to find the correspondence between positions in the\npre-step version of a document and the same position in the\npost-step version.\n*/\nclass StepMap {\n    /**\n    Create a position map. The modifications to the document are\n    represented as an array of numbers, in which each group of three\n    represents a modified chunk as `[start, oldSize, newSize]`.\n    */\n    constructor(\n    /**\n    @internal\n    */\n    ranges, \n    /**\n    @internal\n    */\n    inverted = false) {\n        this.ranges = ranges;\n        this.inverted = inverted;\n        if (!ranges.length && StepMap.empty)\n            return StepMap.empty;\n    }\n    /**\n    @internal\n    */\n    recover(value) {\n        let diff = 0, index = recoverIndex(value);\n        if (!this.inverted)\n            for (let i = 0; i < index; i++)\n                diff += this.ranges[i * 3 + 2] - this.ranges[i * 3 + 1];\n        return this.ranges[index * 3] + diff + recoverOffset(value);\n    }\n    mapResult(pos, assoc = 1) { return this._map(pos, assoc, false); }\n    map(pos, assoc = 1) { return this._map(pos, assoc, true); }\n    /**\n    @internal\n    */\n    _map(pos, assoc, simple) {\n        let diff = 0, oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n        for (let i = 0; i < this.ranges.length; i += 3) {\n            let start = this.ranges[i] - (this.inverted ? diff : 0);\n            if (start > pos)\n                break;\n            let oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex], end = start + oldSize;\n            if (pos <= end) {\n                let side = !oldSize ? assoc : pos == start ? -1 : pos == end ? 1 : assoc;\n                let result = start + diff + (side < 0 ? 0 : newSize);\n                if (simple)\n                    return result;\n                let recover = pos == (assoc < 0 ? start : end) ? null : makeRecover(i / 3, pos - start);\n                let del = pos == start ? DEL_AFTER : pos == end ? DEL_BEFORE : DEL_ACROSS;\n                if (assoc < 0 ? pos != start : pos != end)\n                    del |= DEL_SIDE;\n                return new MapResult(result, del, recover);\n            }\n            diff += newSize - oldSize;\n        }\n        return simple ? pos + diff : new MapResult(pos + diff, 0, null);\n    }\n    /**\n    @internal\n    */\n    touches(pos, recover) {\n        let diff = 0, index = recoverIndex(recover);\n        let oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n        for (let i = 0; i < this.ranges.length; i += 3) {\n            let start = this.ranges[i] - (this.inverted ? diff : 0);\n            if (start > pos)\n                break;\n            let oldSize = this.ranges[i + oldIndex], end = start + oldSize;\n            if (pos <= end && i == index * 3)\n                return true;\n            diff += this.ranges[i + newIndex] - oldSize;\n        }\n        return false;\n    }\n    /**\n    Calls the given function on each of the changed ranges included in\n    this map.\n    */\n    forEach(f) {\n        let oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n        for (let i = 0, diff = 0; i < this.ranges.length; i += 3) {\n            let start = this.ranges[i], oldStart = start - (this.inverted ? diff : 0), newStart = start + (this.inverted ? 0 : diff);\n            let oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex];\n            f(oldStart, oldStart + oldSize, newStart, newStart + newSize);\n            diff += newSize - oldSize;\n        }\n    }\n    /**\n    Create an inverted version of this map. The result can be used to\n    map positions in the post-step document to the pre-step document.\n    */\n    invert() {\n        return new StepMap(this.ranges, !this.inverted);\n    }\n    /**\n    @internal\n    */\n    toString() {\n        return (this.inverted ? \"-\" : \"\") + JSON.stringify(this.ranges);\n    }\n    /**\n    Create a map that moves all positions by offset `n` (which may be\n    negative). This can be useful when applying steps meant for a\n    sub-document to a larger document, or vice-versa.\n    */\n    static offset(n) {\n        return n == 0 ? StepMap.empty : new StepMap(n < 0 ? [0, -n, 0] : [0, 0, n]);\n    }\n}\n/**\nA StepMap that contains no changed ranges.\n*/\nStepMap.empty = new StepMap([]);\n/**\nA mapping represents a pipeline of zero or more [step\nmaps](https://prosemirror.net/docs/ref/#transform.StepMap). It has special provisions for losslessly\nhandling mapping positions through a series of steps in which some\nsteps are inverted versions of earlier steps. (This comes up when\n‘[rebasing](/docs/guide/#transform.rebasing)’ steps for\ncollaboration or history management.)\n*/\nclass Mapping {\n    /**\n    Create a new mapping with the given position maps.\n    */\n    constructor(\n    /**\n    The step maps in this mapping.\n    */\n    maps = [], \n    /**\n    @internal\n    */\n    mirror, \n    /**\n    The starting position in the `maps` array, used when `map` or\n    `mapResult` is called.\n    */\n    from = 0, \n    /**\n    The end position in the `maps` array.\n    */\n    to = maps.length) {\n        this.maps = maps;\n        this.mirror = mirror;\n        this.from = from;\n        this.to = to;\n    }\n    /**\n    Create a mapping that maps only through a part of this one.\n    */\n    slice(from = 0, to = this.maps.length) {\n        return new Mapping(this.maps, this.mirror, from, to);\n    }\n    /**\n    @internal\n    */\n    copy() {\n        return new Mapping(this.maps.slice(), this.mirror && this.mirror.slice(), this.from, this.to);\n    }\n    /**\n    Add a step map to the end of this mapping. If `mirrors` is\n    given, it should be the index of the step map that is the mirror\n    image of this one.\n    */\n    appendMap(map, mirrors) {\n        this.to = this.maps.push(map);\n        if (mirrors != null)\n            this.setMirror(this.maps.length - 1, mirrors);\n    }\n    /**\n    Add all the step maps in a given mapping to this one (preserving\n    mirroring information).\n    */\n    appendMapping(mapping) {\n        for (let i = 0, startSize = this.maps.length; i < mapping.maps.length; i++) {\n            let mirr = mapping.getMirror(i);\n            this.appendMap(mapping.maps[i], mirr != null && mirr < i ? startSize + mirr : undefined);\n        }\n    }\n    /**\n    Finds the offset of the step map that mirrors the map at the\n    given offset, in this mapping (as per the second argument to\n    `appendMap`).\n    */\n    getMirror(n) {\n        if (this.mirror)\n            for (let i = 0; i < this.mirror.length; i++)\n                if (this.mirror[i] == n)\n                    return this.mirror[i + (i % 2 ? -1 : 1)];\n    }\n    /**\n    @internal\n    */\n    setMirror(n, m) {\n        if (!this.mirror)\n            this.mirror = [];\n        this.mirror.push(n, m);\n    }\n    /**\n    Append the inverse of the given mapping to this one.\n    */\n    appendMappingInverted(mapping) {\n        for (let i = mapping.maps.length - 1, totalSize = this.maps.length + mapping.maps.length; i >= 0; i--) {\n            let mirr = mapping.getMirror(i);\n            this.appendMap(mapping.maps[i].invert(), mirr != null && mirr > i ? totalSize - mirr - 1 : undefined);\n        }\n    }\n    /**\n    Create an inverted version of this mapping.\n    */\n    invert() {\n        let inverse = new Mapping;\n        inverse.appendMappingInverted(this);\n        return inverse;\n    }\n    /**\n    Map a position through this mapping.\n    */\n    map(pos, assoc = 1) {\n        if (this.mirror)\n            return this._map(pos, assoc, true);\n        for (let i = this.from; i < this.to; i++)\n            pos = this.maps[i].map(pos, assoc);\n        return pos;\n    }\n    /**\n    Map a position through this mapping, returning a mapping\n    result.\n    */\n    mapResult(pos, assoc = 1) { return this._map(pos, assoc, false); }\n    /**\n    @internal\n    */\n    _map(pos, assoc, simple) {\n        let delInfo = 0;\n        for (let i = this.from; i < this.to; i++) {\n            let map = this.maps[i], result = map.mapResult(pos, assoc);\n            if (result.recover != null) {\n                let corr = this.getMirror(i);\n                if (corr != null && corr > i && corr < this.to) {\n                    i = corr;\n                    pos = this.maps[corr].recover(result.recover);\n                    continue;\n                }\n            }\n            delInfo |= result.delInfo;\n            pos = result.pos;\n        }\n        return simple ? pos : new MapResult(pos, delInfo, null);\n    }\n}\n\nconst stepsByID = Object.create(null);\n/**\nA step object represents an atomic change. It generally applies\nonly to the document it was created for, since the positions\nstored in it will only make sense for that document.\n\nNew steps are defined by creating classes that extend `Step`,\noverriding the `apply`, `invert`, `map`, `getMap` and `fromJSON`\nmethods, and registering your class with a unique\nJSON-serialization identifier using\n[`Step.jsonID`](https://prosemirror.net/docs/ref/#transform.Step^jsonID).\n*/\nclass Step {\n    /**\n    Get the step map that represents the changes made by this step,\n    and which can be used to transform between positions in the old\n    and the new document.\n    */\n    getMap() { return StepMap.empty; }\n    /**\n    Try to merge this step with another one, to be applied directly\n    after it. Returns the merged step when possible, null if the\n    steps can't be merged.\n    */\n    merge(other) { return null; }\n    /**\n    Deserialize a step from its JSON representation. Will call\n    through to the step class' own implementation of this method.\n    */\n    static fromJSON(schema, json) {\n        if (!json || !json.stepType)\n            throw new RangeError(\"Invalid input for Step.fromJSON\");\n        let type = stepsByID[json.stepType];\n        if (!type)\n            throw new RangeError(`No step type ${json.stepType} defined`);\n        return type.fromJSON(schema, json);\n    }\n    /**\n    To be able to serialize steps to JSON, each step needs a string\n    ID to attach to its JSON representation. Use this method to\n    register an ID for your step classes. Try to pick something\n    that's unlikely to clash with steps from other modules.\n    */\n    static jsonID(id, stepClass) {\n        if (id in stepsByID)\n            throw new RangeError(\"Duplicate use of step JSON ID \" + id);\n        stepsByID[id] = stepClass;\n        stepClass.prototype.jsonID = id;\n        return stepClass;\n    }\n}\n/**\nThe result of [applying](https://prosemirror.net/docs/ref/#transform.Step.apply) a step. Contains either a\nnew document or a failure value.\n*/\nclass StepResult {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The transformed document, if successful.\n    */\n    doc, \n    /**\n    The failure message, if unsuccessful.\n    */\n    failed) {\n        this.doc = doc;\n        this.failed = failed;\n    }\n    /**\n    Create a successful step result.\n    */\n    static ok(doc) { return new StepResult(doc, null); }\n    /**\n    Create a failed step result.\n    */\n    static fail(message) { return new StepResult(null, message); }\n    /**\n    Call [`Node.replace`](https://prosemirror.net/docs/ref/#model.Node.replace) with the given\n    arguments. Create a successful result if it succeeds, and a\n    failed one if it throws a `ReplaceError`.\n    */\n    static fromReplace(doc, from, to, slice) {\n        try {\n            return StepResult.ok(doc.replace(from, to, slice));\n        }\n        catch (e) {\n            if (e instanceof ReplaceError)\n                return StepResult.fail(e.message);\n            throw e;\n        }\n    }\n}\n\nfunction mapFragment(fragment, f, parent) {\n    let mapped = [];\n    for (let i = 0; i < fragment.childCount; i++) {\n        let child = fragment.child(i);\n        if (child.content.size)\n            child = child.copy(mapFragment(child.content, f, child));\n        if (child.isInline)\n            child = f(child, parent, i);\n        mapped.push(child);\n    }\n    return Fragment.fromArray(mapped);\n}\n/**\nAdd a mark to all inline content between two positions.\n*/\nclass AddMarkStep extends Step {\n    /**\n    Create a mark step.\n    */\n    constructor(\n    /**\n    The start of the marked range.\n    */\n    from, \n    /**\n    The end of the marked range.\n    */\n    to, \n    /**\n    The mark to add.\n    */\n    mark) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let oldSlice = doc.slice(this.from, this.to), $from = doc.resolve(this.from);\n        let parent = $from.node($from.sharedDepth(this.to));\n        let slice = new Slice(mapFragment(oldSlice.content, (node, parent) => {\n            if (!node.isAtom || !parent.type.allowsMarkType(this.mark.type))\n                return node;\n            return node.mark(this.mark.addToSet(node.marks));\n        }, parent), oldSlice.openStart, oldSlice.openEnd);\n        return StepResult.fromReplace(doc, this.from, this.to, slice);\n    }\n    invert() {\n        return new RemoveMarkStep(this.from, this.to, this.mark);\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        if (from.deleted && to.deleted || from.pos >= to.pos)\n            return null;\n        return new AddMarkStep(from.pos, to.pos, this.mark);\n    }\n    merge(other) {\n        if (other instanceof AddMarkStep &&\n            other.mark.eq(this.mark) &&\n            this.from <= other.to && this.to >= other.from)\n            return new AddMarkStep(Math.min(this.from, other.from), Math.max(this.to, other.to), this.mark);\n        return null;\n    }\n    toJSON() {\n        return { stepType: \"addMark\", mark: this.mark.toJSON(),\n            from: this.from, to: this.to };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\")\n            throw new RangeError(\"Invalid input for AddMarkStep.fromJSON\");\n        return new AddMarkStep(json.from, json.to, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"addMark\", AddMarkStep);\n/**\nRemove a mark from all inline content between two positions.\n*/\nclass RemoveMarkStep extends Step {\n    /**\n    Create a mark-removing step.\n    */\n    constructor(\n    /**\n    The start of the unmarked range.\n    */\n    from, \n    /**\n    The end of the unmarked range.\n    */\n    to, \n    /**\n    The mark to remove.\n    */\n    mark) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let oldSlice = doc.slice(this.from, this.to);\n        let slice = new Slice(mapFragment(oldSlice.content, node => {\n            return node.mark(this.mark.removeFromSet(node.marks));\n        }, doc), oldSlice.openStart, oldSlice.openEnd);\n        return StepResult.fromReplace(doc, this.from, this.to, slice);\n    }\n    invert() {\n        return new AddMarkStep(this.from, this.to, this.mark);\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        if (from.deleted && to.deleted || from.pos >= to.pos)\n            return null;\n        return new RemoveMarkStep(from.pos, to.pos, this.mark);\n    }\n    merge(other) {\n        if (other instanceof RemoveMarkStep &&\n            other.mark.eq(this.mark) &&\n            this.from <= other.to && this.to >= other.from)\n            return new RemoveMarkStep(Math.min(this.from, other.from), Math.max(this.to, other.to), this.mark);\n        return null;\n    }\n    toJSON() {\n        return { stepType: \"removeMark\", mark: this.mark.toJSON(),\n            from: this.from, to: this.to };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\")\n            throw new RangeError(\"Invalid input for RemoveMarkStep.fromJSON\");\n        return new RemoveMarkStep(json.from, json.to, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"removeMark\", RemoveMarkStep);\n/**\nAdd a mark to a specific node.\n*/\nclass AddNodeMarkStep extends Step {\n    /**\n    Create a node mark step.\n    */\n    constructor(\n    /**\n    The position of the target node.\n    */\n    pos, \n    /**\n    The mark to add.\n    */\n    mark) {\n        super();\n        this.pos = pos;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node)\n            return StepResult.fail(\"No node at mark step's position\");\n        let updated = node.type.create(node.attrs, null, this.mark.addToSet(node.marks));\n        return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n    }\n    invert(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (node) {\n            let newSet = this.mark.addToSet(node.marks);\n            if (newSet.length == node.marks.length) {\n                for (let i = 0; i < node.marks.length; i++)\n                    if (!node.marks[i].isInSet(newSet))\n                        return new AddNodeMarkStep(this.pos, node.marks[i]);\n                return new AddNodeMarkStep(this.pos, this.mark);\n            }\n        }\n        return new RemoveNodeMarkStep(this.pos, this.mark);\n    }\n    map(mapping) {\n        let pos = mapping.mapResult(this.pos, 1);\n        return pos.deletedAfter ? null : new AddNodeMarkStep(pos.pos, this.mark);\n    }\n    toJSON() {\n        return { stepType: \"addNodeMark\", pos: this.pos, mark: this.mark.toJSON() };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.pos != \"number\")\n            throw new RangeError(\"Invalid input for AddNodeMarkStep.fromJSON\");\n        return new AddNodeMarkStep(json.pos, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"addNodeMark\", AddNodeMarkStep);\n/**\nRemove a mark from a specific node.\n*/\nclass RemoveNodeMarkStep extends Step {\n    /**\n    Create a mark-removing step.\n    */\n    constructor(\n    /**\n    The position of the target node.\n    */\n    pos, \n    /**\n    The mark to remove.\n    */\n    mark) {\n        super();\n        this.pos = pos;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node)\n            return StepResult.fail(\"No node at mark step's position\");\n        let updated = node.type.create(node.attrs, null, this.mark.removeFromSet(node.marks));\n        return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n    }\n    invert(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node || !this.mark.isInSet(node.marks))\n            return this;\n        return new AddNodeMarkStep(this.pos, this.mark);\n    }\n    map(mapping) {\n        let pos = mapping.mapResult(this.pos, 1);\n        return pos.deletedAfter ? null : new RemoveNodeMarkStep(pos.pos, this.mark);\n    }\n    toJSON() {\n        return { stepType: \"removeNodeMark\", pos: this.pos, mark: this.mark.toJSON() };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.pos != \"number\")\n            throw new RangeError(\"Invalid input for RemoveNodeMarkStep.fromJSON\");\n        return new RemoveNodeMarkStep(json.pos, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"removeNodeMark\", RemoveNodeMarkStep);\n\n/**\nReplace a part of the document with a slice of new content.\n*/\nclass ReplaceStep extends Step {\n    /**\n    The given `slice` should fit the 'gap' between `from` and\n    `to`—the depths must line up, and the surrounding nodes must be\n    able to be joined with the open sides of the slice. When\n    `structure` is true, the step will fail if the content between\n    from and to is not just a sequence of closing and then opening\n    tokens (this is to guard against rebased replace steps\n    overwriting something they weren't supposed to).\n    */\n    constructor(\n    /**\n    The start position of the replaced range.\n    */\n    from, \n    /**\n    The end position of the replaced range.\n    */\n    to, \n    /**\n    The slice to insert.\n    */\n    slice, \n    /**\n    @internal\n    */\n    structure = false) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.slice = slice;\n        this.structure = structure;\n    }\n    apply(doc) {\n        if (this.structure && contentBetween(doc, this.from, this.to))\n            return StepResult.fail(\"Structure replace would overwrite content\");\n        return StepResult.fromReplace(doc, this.from, this.to, this.slice);\n    }\n    getMap() {\n        return new StepMap([this.from, this.to - this.from, this.slice.size]);\n    }\n    invert(doc) {\n        return new ReplaceStep(this.from, this.from + this.slice.size, doc.slice(this.from, this.to));\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        if (from.deletedAcross && to.deletedAcross)\n            return null;\n        return new ReplaceStep(from.pos, Math.max(from.pos, to.pos), this.slice);\n    }\n    merge(other) {\n        if (!(other instanceof ReplaceStep) || other.structure || this.structure)\n            return null;\n        if (this.from + this.slice.size == other.from && !this.slice.openEnd && !other.slice.openStart) {\n            let slice = this.slice.size + other.slice.size == 0 ? Slice.empty\n                : new Slice(this.slice.content.append(other.slice.content), this.slice.openStart, other.slice.openEnd);\n            return new ReplaceStep(this.from, this.to + (other.to - other.from), slice, this.structure);\n        }\n        else if (other.to == this.from && !this.slice.openStart && !other.slice.openEnd) {\n            let slice = this.slice.size + other.slice.size == 0 ? Slice.empty\n                : new Slice(other.slice.content.append(this.slice.content), other.slice.openStart, this.slice.openEnd);\n            return new ReplaceStep(other.from, this.to, slice, this.structure);\n        }\n        else {\n            return null;\n        }\n    }\n    toJSON() {\n        let json = { stepType: \"replace\", from: this.from, to: this.to };\n        if (this.slice.size)\n            json.slice = this.slice.toJSON();\n        if (this.structure)\n            json.structure = true;\n        return json;\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\")\n            throw new RangeError(\"Invalid input for ReplaceStep.fromJSON\");\n        return new ReplaceStep(json.from, json.to, Slice.fromJSON(schema, json.slice), !!json.structure);\n    }\n}\nStep.jsonID(\"replace\", ReplaceStep);\n/**\nReplace a part of the document with a slice of content, but\npreserve a range of the replaced content by moving it into the\nslice.\n*/\nclass ReplaceAroundStep extends Step {\n    /**\n    Create a replace-around step with the given range and gap.\n    `insert` should be the point in the slice into which the content\n    of the gap should be moved. `structure` has the same meaning as\n    it has in the [`ReplaceStep`](https://prosemirror.net/docs/ref/#transform.ReplaceStep) class.\n    */\n    constructor(\n    /**\n    The start position of the replaced range.\n    */\n    from, \n    /**\n    The end position of the replaced range.\n    */\n    to, \n    /**\n    The start of preserved range.\n    */\n    gapFrom, \n    /**\n    The end of preserved range.\n    */\n    gapTo, \n    /**\n    The slice to insert.\n    */\n    slice, \n    /**\n    The position in the slice where the preserved range should be\n    inserted.\n    */\n    insert, \n    /**\n    @internal\n    */\n    structure = false) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.gapFrom = gapFrom;\n        this.gapTo = gapTo;\n        this.slice = slice;\n        this.insert = insert;\n        this.structure = structure;\n    }\n    apply(doc) {\n        if (this.structure && (contentBetween(doc, this.from, this.gapFrom) ||\n            contentBetween(doc, this.gapTo, this.to)))\n            return StepResult.fail(\"Structure gap-replace would overwrite content\");\n        let gap = doc.slice(this.gapFrom, this.gapTo);\n        if (gap.openStart || gap.openEnd)\n            return StepResult.fail(\"Gap is not a flat range\");\n        let inserted = this.slice.insertAt(this.insert, gap.content);\n        if (!inserted)\n            return StepResult.fail(\"Content does not fit in gap\");\n        return StepResult.fromReplace(doc, this.from, this.to, inserted);\n    }\n    getMap() {\n        return new StepMap([this.from, this.gapFrom - this.from, this.insert,\n            this.gapTo, this.to - this.gapTo, this.slice.size - this.insert]);\n    }\n    invert(doc) {\n        let gap = this.gapTo - this.gapFrom;\n        return new ReplaceAroundStep(this.from, this.from + this.slice.size + gap, this.from + this.insert, this.from + this.insert + gap, doc.slice(this.from, this.to).removeBetween(this.gapFrom - this.from, this.gapTo - this.from), this.gapFrom - this.from, this.structure);\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        let gapFrom = mapping.map(this.gapFrom, -1), gapTo = mapping.map(this.gapTo, 1);\n        if ((from.deletedAcross && to.deletedAcross) || gapFrom < from.pos || gapTo > to.pos)\n            return null;\n        return new ReplaceAroundStep(from.pos, to.pos, gapFrom, gapTo, this.slice, this.insert, this.structure);\n    }\n    toJSON() {\n        let json = { stepType: \"replaceAround\", from: this.from, to: this.to,\n            gapFrom: this.gapFrom, gapTo: this.gapTo, insert: this.insert };\n        if (this.slice.size)\n            json.slice = this.slice.toJSON();\n        if (this.structure)\n            json.structure = true;\n        return json;\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\" ||\n            typeof json.gapFrom != \"number\" || typeof json.gapTo != \"number\" || typeof json.insert != \"number\")\n            throw new RangeError(\"Invalid input for ReplaceAroundStep.fromJSON\");\n        return new ReplaceAroundStep(json.from, json.to, json.gapFrom, json.gapTo, Slice.fromJSON(schema, json.slice), json.insert, !!json.structure);\n    }\n}\nStep.jsonID(\"replaceAround\", ReplaceAroundStep);\nfunction contentBetween(doc, from, to) {\n    let $from = doc.resolve(from), dist = to - from, depth = $from.depth;\n    while (dist > 0 && depth > 0 && $from.indexAfter(depth) == $from.node(depth).childCount) {\n        depth--;\n        dist--;\n    }\n    if (dist > 0) {\n        let next = $from.node(depth).maybeChild($from.indexAfter(depth));\n        while (dist > 0) {\n            if (!next || next.isLeaf)\n                return true;\n            next = next.firstChild;\n            dist--;\n        }\n    }\n    return false;\n}\n\nfunction addMark(tr, from, to, mark) {\n    let removed = [], added = [];\n    let removing, adding;\n    tr.doc.nodesBetween(from, to, (node, pos, parent) => {\n        if (!node.isInline)\n            return;\n        let marks = node.marks;\n        if (!mark.isInSet(marks) && parent.type.allowsMarkType(mark.type)) {\n            let start = Math.max(pos, from), end = Math.min(pos + node.nodeSize, to);\n            let newSet = mark.addToSet(marks);\n            for (let i = 0; i < marks.length; i++) {\n                if (!marks[i].isInSet(newSet)) {\n                    if (removing && removing.to == start && removing.mark.eq(marks[i]))\n                        removing.to = end;\n                    else\n                        removed.push(removing = new RemoveMarkStep(start, end, marks[i]));\n                }\n            }\n            if (adding && adding.to == start)\n                adding.to = end;\n            else\n                added.push(adding = new AddMarkStep(start, end, mark));\n        }\n    });\n    removed.forEach(s => tr.step(s));\n    added.forEach(s => tr.step(s));\n}\nfunction removeMark(tr, from, to, mark) {\n    let matched = [], step = 0;\n    tr.doc.nodesBetween(from, to, (node, pos) => {\n        if (!node.isInline)\n            return;\n        step++;\n        let toRemove = null;\n        if (mark instanceof MarkType) {\n            let set = node.marks, found;\n            while (found = mark.isInSet(set)) {\n                (toRemove || (toRemove = [])).push(found);\n                set = found.removeFromSet(set);\n            }\n        }\n        else if (mark) {\n            if (mark.isInSet(node.marks))\n                toRemove = [mark];\n        }\n        else {\n            toRemove = node.marks;\n        }\n        if (toRemove && toRemove.length) {\n            let end = Math.min(pos + node.nodeSize, to);\n            for (let i = 0; i < toRemove.length; i++) {\n                let style = toRemove[i], found;\n                for (let j = 0; j < matched.length; j++) {\n                    let m = matched[j];\n                    if (m.step == step - 1 && style.eq(matched[j].style))\n                        found = m;\n                }\n                if (found) {\n                    found.to = end;\n                    found.step = step;\n                }\n                else {\n                    matched.push({ style, from: Math.max(pos, from), to: end, step });\n                }\n            }\n        }\n    });\n    matched.forEach(m => tr.step(new RemoveMarkStep(m.from, m.to, m.style)));\n}\nfunction clearIncompatible(tr, pos, parentType, match = parentType.contentMatch) {\n    let node = tr.doc.nodeAt(pos);\n    let replSteps = [], cur = pos + 1;\n    for (let i = 0; i < node.childCount; i++) {\n        let child = node.child(i), end = cur + child.nodeSize;\n        let allowed = match.matchType(child.type);\n        if (!allowed) {\n            replSteps.push(new ReplaceStep(cur, end, Slice.empty));\n        }\n        else {\n            match = allowed;\n            for (let j = 0; j < child.marks.length; j++)\n                if (!parentType.allowsMarkType(child.marks[j].type))\n                    tr.step(new RemoveMarkStep(cur, end, child.marks[j]));\n            if (child.isText && !parentType.spec.code) {\n                let m, newline = /\\r?\\n|\\r/g, slice;\n                while (m = newline.exec(child.text)) {\n                    if (!slice)\n                        slice = new Slice(Fragment.from(parentType.schema.text(\" \", parentType.allowedMarks(child.marks))), 0, 0);\n                    replSteps.push(new ReplaceStep(cur + m.index, cur + m.index + m[0].length, slice));\n                }\n            }\n        }\n        cur = end;\n    }\n    if (!match.validEnd) {\n        let fill = match.fillBefore(Fragment.empty, true);\n        tr.replace(cur, cur, new Slice(fill, 0, 0));\n    }\n    for (let i = replSteps.length - 1; i >= 0; i--)\n        tr.step(replSteps[i]);\n}\n\nfunction canCut(node, start, end) {\n    return (start == 0 || node.canReplace(start, node.childCount)) &&\n        (end == node.childCount || node.canReplace(0, end));\n}\n/**\nTry to find a target depth to which the content in the given range\ncan be lifted. Will not go across\n[isolating](https://prosemirror.net/docs/ref/#model.NodeSpec.isolating) parent nodes.\n*/\nfunction liftTarget(range) {\n    let parent = range.parent;\n    let content = parent.content.cutByIndex(range.startIndex, range.endIndex);\n    for (let depth = range.depth;; --depth) {\n        let node = range.$from.node(depth);\n        let index = range.$from.index(depth), endIndex = range.$to.indexAfter(depth);\n        if (depth < range.depth && node.canReplace(index, endIndex, content))\n            return depth;\n        if (depth == 0 || node.type.spec.isolating || !canCut(node, index, endIndex))\n            break;\n    }\n    return null;\n}\nfunction lift(tr, range, target) {\n    let { $from, $to, depth } = range;\n    let gapStart = $from.before(depth + 1), gapEnd = $to.after(depth + 1);\n    let start = gapStart, end = gapEnd;\n    let before = Fragment.empty, openStart = 0;\n    for (let d = depth, splitting = false; d > target; d--)\n        if (splitting || $from.index(d) > 0) {\n            splitting = true;\n            before = Fragment.from($from.node(d).copy(before));\n            openStart++;\n        }\n        else {\n            start--;\n        }\n    let after = Fragment.empty, openEnd = 0;\n    for (let d = depth, splitting = false; d > target; d--)\n        if (splitting || $to.after(d + 1) < $to.end(d)) {\n            splitting = true;\n            after = Fragment.from($to.node(d).copy(after));\n            openEnd++;\n        }\n        else {\n            end++;\n        }\n    tr.step(new ReplaceAroundStep(start, end, gapStart, gapEnd, new Slice(before.append(after), openStart, openEnd), before.size - openStart, true));\n}\n/**\nTry to find a valid way to wrap the content in the given range in a\nnode of the given type. May introduce extra nodes around and inside\nthe wrapper node, if necessary. Returns null if no valid wrapping\ncould be found. When `innerRange` is given, that range's content is\nused as the content to fit into the wrapping, instead of the\ncontent of `range`.\n*/\nfunction findWrapping(range, nodeType, attrs = null, innerRange = range) {\n    let around = findWrappingOutside(range, nodeType);\n    let inner = around && findWrappingInside(innerRange, nodeType);\n    if (!inner)\n        return null;\n    return around.map(withAttrs)\n        .concat({ type: nodeType, attrs }).concat(inner.map(withAttrs));\n}\nfunction withAttrs(type) { return { type, attrs: null }; }\nfunction findWrappingOutside(range, type) {\n    let { parent, startIndex, endIndex } = range;\n    let around = parent.contentMatchAt(startIndex).findWrapping(type);\n    if (!around)\n        return null;\n    let outer = around.length ? around[0] : type;\n    return parent.canReplaceWith(startIndex, endIndex, outer) ? around : null;\n}\nfunction findWrappingInside(range, type) {\n    let { parent, startIndex, endIndex } = range;\n    let inner = parent.child(startIndex);\n    let inside = type.contentMatch.findWrapping(inner.type);\n    if (!inside)\n        return null;\n    let lastType = inside.length ? inside[inside.length - 1] : type;\n    let innerMatch = lastType.contentMatch;\n    for (let i = startIndex; innerMatch && i < endIndex; i++)\n        innerMatch = innerMatch.matchType(parent.child(i).type);\n    if (!innerMatch || !innerMatch.validEnd)\n        return null;\n    return inside;\n}\nfunction wrap(tr, range, wrappers) {\n    let content = Fragment.empty;\n    for (let i = wrappers.length - 1; i >= 0; i--) {\n        if (content.size) {\n            let match = wrappers[i].type.contentMatch.matchFragment(content);\n            if (!match || !match.validEnd)\n                throw new RangeError(\"Wrapper type given to Transform.wrap does not form valid content of its parent wrapper\");\n        }\n        content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content));\n    }\n    let start = range.start, end = range.end;\n    tr.step(new ReplaceAroundStep(start, end, start, end, new Slice(content, 0, 0), wrappers.length, true));\n}\nfunction setBlockType(tr, from, to, type, attrs) {\n    if (!type.isTextblock)\n        throw new RangeError(\"Type given to setBlockType should be a textblock\");\n    let mapFrom = tr.steps.length;\n    tr.doc.nodesBetween(from, to, (node, pos) => {\n        if (node.isTextblock && !node.hasMarkup(type, attrs) && canChangeType(tr.doc, tr.mapping.slice(mapFrom).map(pos), type)) {\n            // Ensure all markup that isn't allowed in the new node type is cleared\n            tr.clearIncompatible(tr.mapping.slice(mapFrom).map(pos, 1), type);\n            let mapping = tr.mapping.slice(mapFrom);\n            let startM = mapping.map(pos, 1), endM = mapping.map(pos + node.nodeSize, 1);\n            tr.step(new ReplaceAroundStep(startM, endM, startM + 1, endM - 1, new Slice(Fragment.from(type.create(attrs, null, node.marks)), 0, 0), 1, true));\n            return false;\n        }\n    });\n}\nfunction canChangeType(doc, pos, type) {\n    let $pos = doc.resolve(pos), index = $pos.index();\n    return $pos.parent.canReplaceWith(index, index + 1, type);\n}\n/**\nChange the type, attributes, and/or marks of the node at `pos`.\nWhen `type` isn't given, the existing node type is preserved,\n*/\nfunction setNodeMarkup(tr, pos, type, attrs, marks) {\n    let node = tr.doc.nodeAt(pos);\n    if (!node)\n        throw new RangeError(\"No node at given position\");\n    if (!type)\n        type = node.type;\n    let newNode = type.create(attrs, null, marks || node.marks);\n    if (node.isLeaf)\n        return tr.replaceWith(pos, pos + node.nodeSize, newNode);\n    if (!type.validContent(node.content))\n        throw new RangeError(\"Invalid content for node type \" + type.name);\n    tr.step(new ReplaceAroundStep(pos, pos + node.nodeSize, pos + 1, pos + node.nodeSize - 1, new Slice(Fragment.from(newNode), 0, 0), 1, true));\n}\n/**\nCheck whether splitting at the given position is allowed.\n*/\nfunction canSplit(doc, pos, depth = 1, typesAfter) {\n    let $pos = doc.resolve(pos), base = $pos.depth - depth;\n    let innerType = (typesAfter && typesAfter[typesAfter.length - 1]) || $pos.parent;\n    if (base < 0 || $pos.parent.type.spec.isolating ||\n        !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) ||\n        !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount)))\n        return false;\n    for (let d = $pos.depth - 1, i = depth - 2; d > base; d--, i--) {\n        let node = $pos.node(d), index = $pos.index(d);\n        if (node.type.spec.isolating)\n            return false;\n        let rest = node.content.cutByIndex(index, node.childCount);\n        let overrideChild = typesAfter && typesAfter[i + 1];\n        if (overrideChild)\n            rest = rest.replaceChild(0, overrideChild.type.create(overrideChild.attrs));\n        let after = (typesAfter && typesAfter[i]) || node;\n        if (!node.canReplace(index + 1, node.childCount) || !after.type.validContent(rest))\n            return false;\n    }\n    let index = $pos.indexAfter(base);\n    let baseType = typesAfter && typesAfter[0];\n    return $pos.node(base).canReplaceWith(index, index, baseType ? baseType.type : $pos.node(base + 1).type);\n}\nfunction split(tr, pos, depth = 1, typesAfter) {\n    let $pos = tr.doc.resolve(pos), before = Fragment.empty, after = Fragment.empty;\n    for (let d = $pos.depth, e = $pos.depth - depth, i = depth - 1; d > e; d--, i--) {\n        before = Fragment.from($pos.node(d).copy(before));\n        let typeAfter = typesAfter && typesAfter[i];\n        after = Fragment.from(typeAfter ? typeAfter.type.create(typeAfter.attrs, after) : $pos.node(d).copy(after));\n    }\n    tr.step(new ReplaceStep(pos, pos, new Slice(before.append(after), depth, depth), true));\n}\n/**\nTest whether the blocks before and after a given position can be\njoined.\n*/\nfunction canJoin(doc, pos) {\n    let $pos = doc.resolve(pos), index = $pos.index();\n    return joinable($pos.nodeBefore, $pos.nodeAfter) &&\n        $pos.parent.canReplace(index, index + 1);\n}\nfunction joinable(a, b) {\n    return !!(a && b && !a.isLeaf && a.canAppend(b));\n}\n/**\nFind an ancestor of the given position that can be joined to the\nblock before (or after if `dir` is positive). Returns the joinable\npoint, if any.\n*/\nfunction joinPoint(doc, pos, dir = -1) {\n    let $pos = doc.resolve(pos);\n    for (let d = $pos.depth;; d--) {\n        let before, after, index = $pos.index(d);\n        if (d == $pos.depth) {\n            before = $pos.nodeBefore;\n            after = $pos.nodeAfter;\n        }\n        else if (dir > 0) {\n            before = $pos.node(d + 1);\n            index++;\n            after = $pos.node(d).maybeChild(index);\n        }\n        else {\n            before = $pos.node(d).maybeChild(index - 1);\n            after = $pos.node(d + 1);\n        }\n        if (before && !before.isTextblock && joinable(before, after) &&\n            $pos.node(d).canReplace(index, index + 1))\n            return pos;\n        if (d == 0)\n            break;\n        pos = dir < 0 ? $pos.before(d) : $pos.after(d);\n    }\n}\nfunction join(tr, pos, depth) {\n    let step = new ReplaceStep(pos - depth, pos + depth, Slice.empty, true);\n    tr.step(step);\n}\n/**\nTry to find a point where a node of the given type can be inserted\nnear `pos`, by searching up the node hierarchy when `pos` itself\nisn't a valid place but is at the start or end of a node. Return\nnull if no position was found.\n*/\nfunction insertPoint(doc, pos, nodeType) {\n    let $pos = doc.resolve(pos);\n    if ($pos.parent.canReplaceWith($pos.index(), $pos.index(), nodeType))\n        return pos;\n    if ($pos.parentOffset == 0)\n        for (let d = $pos.depth - 1; d >= 0; d--) {\n            let index = $pos.index(d);\n            if ($pos.node(d).canReplaceWith(index, index, nodeType))\n                return $pos.before(d + 1);\n            if (index > 0)\n                return null;\n        }\n    if ($pos.parentOffset == $pos.parent.content.size)\n        for (let d = $pos.depth - 1; d >= 0; d--) {\n            let index = $pos.indexAfter(d);\n            if ($pos.node(d).canReplaceWith(index, index, nodeType))\n                return $pos.after(d + 1);\n            if (index < $pos.node(d).childCount)\n                return null;\n        }\n    return null;\n}\n/**\nFinds a position at or around the given position where the given\nslice can be inserted. Will look at parent nodes' nearest boundary\nand try there, even if the original position wasn't directly at the\nstart or end of that node. Returns null when no position was found.\n*/\nfunction dropPoint(doc, pos, slice) {\n    let $pos = doc.resolve(pos);\n    if (!slice.content.size)\n        return pos;\n    let content = slice.content;\n    for (let i = 0; i < slice.openStart; i++)\n        content = content.firstChild.content;\n    for (let pass = 1; pass <= (slice.openStart == 0 && slice.size ? 2 : 1); pass++) {\n        for (let d = $pos.depth; d >= 0; d--) {\n            let bias = d == $pos.depth ? 0 : $pos.pos <= ($pos.start(d + 1) + $pos.end(d + 1)) / 2 ? -1 : 1;\n            let insertPos = $pos.index(d) + (bias > 0 ? 1 : 0);\n            let parent = $pos.node(d), fits = false;\n            if (pass == 1) {\n                fits = parent.canReplace(insertPos, insertPos, content);\n            }\n            else {\n                let wrapping = parent.contentMatchAt(insertPos).findWrapping(content.firstChild.type);\n                fits = wrapping && parent.canReplaceWith(insertPos, insertPos, wrapping[0]);\n            }\n            if (fits)\n                return bias == 0 ? $pos.pos : bias < 0 ? $pos.before(d + 1) : $pos.after(d + 1);\n        }\n    }\n    return null;\n}\n\n/**\n‘Fit’ a slice into a given position in the document, producing a\n[step](https://prosemirror.net/docs/ref/#transform.Step) that inserts it. Will return null if\nthere's no meaningful way to insert the slice here, or inserting it\nwould be a no-op (an empty slice over an empty range).\n*/\nfunction replaceStep(doc, from, to = from, slice = Slice.empty) {\n    if (from == to && !slice.size)\n        return null;\n    let $from = doc.resolve(from), $to = doc.resolve(to);\n    // Optimization -- avoid work if it's obvious that it's not needed.\n    if (fitsTrivially($from, $to, slice))\n        return new ReplaceStep(from, to, slice);\n    return new Fitter($from, $to, slice).fit();\n}\nfunction fitsTrivially($from, $to, slice) {\n    return !slice.openStart && !slice.openEnd && $from.start() == $to.start() &&\n        $from.parent.canReplace($from.index(), $to.index(), slice.content);\n}\n// Algorithm for 'placing' the elements of a slice into a gap:\n//\n// We consider the content of each node that is open to the left to be\n// independently placeable. I.e. in <p(\"foo\"), p(\"bar\")>, when the\n// paragraph on the left is open, \"foo\" can be placed (somewhere on\n// the left side of the replacement gap) independently from p(\"bar\").\n//\n// This class tracks the state of the placement progress in the\n// following properties:\n//\n//  - `frontier` holds a stack of `{type, match}` objects that\n//    represent the open side of the replacement. It starts at\n//    `$from`, then moves forward as content is placed, and is finally\n//    reconciled with `$to`.\n//\n//  - `unplaced` is a slice that represents the content that hasn't\n//    been placed yet.\n//\n//  - `placed` is a fragment of placed content. Its open-start value\n//    is implicit in `$from`, and its open-end value in `frontier`.\nclass Fitter {\n    constructor($from, $to, unplaced) {\n        this.$from = $from;\n        this.$to = $to;\n        this.unplaced = unplaced;\n        this.frontier = [];\n        this.placed = Fragment.empty;\n        for (let i = 0; i <= $from.depth; i++) {\n            let node = $from.node(i);\n            this.frontier.push({\n                type: node.type,\n                match: node.contentMatchAt($from.indexAfter(i))\n            });\n        }\n        for (let i = $from.depth; i > 0; i--)\n            this.placed = Fragment.from($from.node(i).copy(this.placed));\n    }\n    get depth() { return this.frontier.length - 1; }\n    fit() {\n        // As long as there's unplaced content, try to place some of it.\n        // If that fails, either increase the open score of the unplaced\n        // slice, or drop nodes from it, and then try again.\n        while (this.unplaced.size) {\n            let fit = this.findFittable();\n            if (fit)\n                this.placeNodes(fit);\n            else\n                this.openMore() || this.dropNode();\n        }\n        // When there's inline content directly after the frontier _and_\n        // directly after `this.$to`, we must generate a `ReplaceAround`\n        // step that pulls that content into the node after the frontier.\n        // That means the fitting must be done to the end of the textblock\n        // node after `this.$to`, not `this.$to` itself.\n        let moveInline = this.mustMoveInline(), placedSize = this.placed.size - this.depth - this.$from.depth;\n        let $from = this.$from, $to = this.close(moveInline < 0 ? this.$to : $from.doc.resolve(moveInline));\n        if (!$to)\n            return null;\n        // If closing to `$to` succeeded, create a step\n        let content = this.placed, openStart = $from.depth, openEnd = $to.depth;\n        while (openStart && openEnd && content.childCount == 1) { // Normalize by dropping open parent nodes\n            content = content.firstChild.content;\n            openStart--;\n            openEnd--;\n        }\n        let slice = new Slice(content, openStart, openEnd);\n        if (moveInline > -1)\n            return new ReplaceAroundStep($from.pos, moveInline, this.$to.pos, this.$to.end(), slice, placedSize);\n        if (slice.size || $from.pos != this.$to.pos) // Don't generate no-op steps\n            return new ReplaceStep($from.pos, $to.pos, slice);\n        return null;\n    }\n    // Find a position on the start spine of `this.unplaced` that has\n    // content that can be moved somewhere on the frontier. Returns two\n    // depths, one for the slice and one for the frontier.\n    findFittable() {\n        let startDepth = this.unplaced.openStart;\n        for (let cur = this.unplaced.content, d = 0, openEnd = this.unplaced.openEnd; d < startDepth; d++) {\n            let node = cur.firstChild;\n            if (cur.childCount > 1)\n                openEnd = 0;\n            if (node.type.spec.isolating && openEnd <= d) {\n                startDepth = d;\n                break;\n            }\n            cur = node.content;\n        }\n        // Only try wrapping nodes (pass 2) after finding a place without\n        // wrapping failed.\n        for (let pass = 1; pass <= 2; pass++) {\n            for (let sliceDepth = pass == 1 ? startDepth : this.unplaced.openStart; sliceDepth >= 0; sliceDepth--) {\n                let fragment, parent = null;\n                if (sliceDepth) {\n                    parent = contentAt(this.unplaced.content, sliceDepth - 1).firstChild;\n                    fragment = parent.content;\n                }\n                else {\n                    fragment = this.unplaced.content;\n                }\n                let first = fragment.firstChild;\n                for (let frontierDepth = this.depth; frontierDepth >= 0; frontierDepth--) {\n                    let { type, match } = this.frontier[frontierDepth], wrap, inject = null;\n                    // In pass 1, if the next node matches, or there is no next\n                    // node but the parents look compatible, we've found a\n                    // place.\n                    if (pass == 1 && (first ? match.matchType(first.type) || (inject = match.fillBefore(Fragment.from(first), false))\n                        : parent && type.compatibleContent(parent.type)))\n                        return { sliceDepth, frontierDepth, parent, inject };\n                    // In pass 2, look for a set of wrapping nodes that make\n                    // `first` fit here.\n                    else if (pass == 2 && first && (wrap = match.findWrapping(first.type)))\n                        return { sliceDepth, frontierDepth, parent, wrap };\n                    // Don't continue looking further up if the parent node\n                    // would fit here.\n                    if (parent && match.matchType(parent.type))\n                        break;\n                }\n            }\n        }\n    }\n    openMore() {\n        let { content, openStart, openEnd } = this.unplaced;\n        let inner = contentAt(content, openStart);\n        if (!inner.childCount || inner.firstChild.isLeaf)\n            return false;\n        this.unplaced = new Slice(content, openStart + 1, Math.max(openEnd, inner.size + openStart >= content.size - openEnd ? openStart + 1 : 0));\n        return true;\n    }\n    dropNode() {\n        let { content, openStart, openEnd } = this.unplaced;\n        let inner = contentAt(content, openStart);\n        if (inner.childCount <= 1 && openStart > 0) {\n            let openAtEnd = content.size - openStart <= openStart + inner.size;\n            this.unplaced = new Slice(dropFromFragment(content, openStart - 1, 1), openStart - 1, openAtEnd ? openStart - 1 : openEnd);\n        }\n        else {\n            this.unplaced = new Slice(dropFromFragment(content, openStart, 1), openStart, openEnd);\n        }\n    }\n    // Move content from the unplaced slice at `sliceDepth` to the\n    // frontier node at `frontierDepth`. Close that frontier node when\n    // applicable.\n    placeNodes({ sliceDepth, frontierDepth, parent, inject, wrap }) {\n        while (this.depth > frontierDepth)\n            this.closeFrontierNode();\n        if (wrap)\n            for (let i = 0; i < wrap.length; i++)\n                this.openFrontierNode(wrap[i]);\n        let slice = this.unplaced, fragment = parent ? parent.content : slice.content;\n        let openStart = slice.openStart - sliceDepth;\n        let taken = 0, add = [];\n        let { match, type } = this.frontier[frontierDepth];\n        if (inject) {\n            for (let i = 0; i < inject.childCount; i++)\n                add.push(inject.child(i));\n            match = match.matchFragment(inject);\n        }\n        // Computes the amount of (end) open nodes at the end of the\n        // fragment. When 0, the parent is open, but no more. When\n        // negative, nothing is open.\n        let openEndCount = (fragment.size + sliceDepth) - (slice.content.size - slice.openEnd);\n        // Scan over the fragment, fitting as many child nodes as\n        // possible.\n        while (taken < fragment.childCount) {\n            let next = fragment.child(taken), matches = match.matchType(next.type);\n            if (!matches)\n                break;\n            taken++;\n            if (taken > 1 || openStart == 0 || next.content.size) { // Drop empty open nodes\n                match = matches;\n                add.push(closeNodeStart(next.mark(type.allowedMarks(next.marks)), taken == 1 ? openStart : 0, taken == fragment.childCount ? openEndCount : -1));\n            }\n        }\n        let toEnd = taken == fragment.childCount;\n        if (!toEnd)\n            openEndCount = -1;\n        this.placed = addToFragment(this.placed, frontierDepth, Fragment.from(add));\n        this.frontier[frontierDepth].match = match;\n        // If the parent types match, and the entire node was moved, and\n        // it's not open, close this frontier node right away.\n        if (toEnd && openEndCount < 0 && parent && parent.type == this.frontier[this.depth].type && this.frontier.length > 1)\n            this.closeFrontierNode();\n        // Add new frontier nodes for any open nodes at the end.\n        for (let i = 0, cur = fragment; i < openEndCount; i++) {\n            let node = cur.lastChild;\n            this.frontier.push({ type: node.type, match: node.contentMatchAt(node.childCount) });\n            cur = node.content;\n        }\n        // Update `this.unplaced`. Drop the entire node from which we\n        // placed it we got to its end, otherwise just drop the placed\n        // nodes.\n        this.unplaced = !toEnd ? new Slice(dropFromFragment(slice.content, sliceDepth, taken), slice.openStart, slice.openEnd)\n            : sliceDepth == 0 ? Slice.empty\n                : new Slice(dropFromFragment(slice.content, sliceDepth - 1, 1), sliceDepth - 1, openEndCount < 0 ? slice.openEnd : sliceDepth - 1);\n    }\n    mustMoveInline() {\n        if (!this.$to.parent.isTextblock)\n            return -1;\n        let top = this.frontier[this.depth], level;\n        if (!top.type.isTextblock || !contentAfterFits(this.$to, this.$to.depth, top.type, top.match, false) ||\n            (this.$to.depth == this.depth && (level = this.findCloseLevel(this.$to)) && level.depth == this.depth))\n            return -1;\n        let { depth } = this.$to, after = this.$to.after(depth);\n        while (depth > 1 && after == this.$to.end(--depth))\n            ++after;\n        return after;\n    }\n    findCloseLevel($to) {\n        scan: for (let i = Math.min(this.depth, $to.depth); i >= 0; i--) {\n            let { match, type } = this.frontier[i];\n            let dropInner = i < $to.depth && $to.end(i + 1) == $to.pos + ($to.depth - (i + 1));\n            let fit = contentAfterFits($to, i, type, match, dropInner);\n            if (!fit)\n                continue;\n            for (let d = i - 1; d >= 0; d--) {\n                let { match, type } = this.frontier[d];\n                let matches = contentAfterFits($to, d, type, match, true);\n                if (!matches || matches.childCount)\n                    continue scan;\n            }\n            return { depth: i, fit, move: dropInner ? $to.doc.resolve($to.after(i + 1)) : $to };\n        }\n    }\n    close($to) {\n        let close = this.findCloseLevel($to);\n        if (!close)\n            return null;\n        while (this.depth > close.depth)\n            this.closeFrontierNode();\n        if (close.fit.childCount)\n            this.placed = addToFragment(this.placed, close.depth, close.fit);\n        $to = close.move;\n        for (let d = close.depth + 1; d <= $to.depth; d++) {\n            let node = $to.node(d), add = node.type.contentMatch.fillBefore(node.content, true, $to.index(d));\n            this.openFrontierNode(node.type, node.attrs, add);\n        }\n        return $to;\n    }\n    openFrontierNode(type, attrs = null, content) {\n        let top = this.frontier[this.depth];\n        top.match = top.match.matchType(type);\n        this.placed = addToFragment(this.placed, this.depth, Fragment.from(type.create(attrs, content)));\n        this.frontier.push({ type, match: type.contentMatch });\n    }\n    closeFrontierNode() {\n        let open = this.frontier.pop();\n        let add = open.match.fillBefore(Fragment.empty, true);\n        if (add.childCount)\n            this.placed = addToFragment(this.placed, this.frontier.length, add);\n    }\n}\nfunction dropFromFragment(fragment, depth, count) {\n    if (depth == 0)\n        return fragment.cutByIndex(count, fragment.childCount);\n    return fragment.replaceChild(0, fragment.firstChild.copy(dropFromFragment(fragment.firstChild.content, depth - 1, count)));\n}\nfunction addToFragment(fragment, depth, content) {\n    if (depth == 0)\n        return fragment.append(content);\n    return fragment.replaceChild(fragment.childCount - 1, fragment.lastChild.copy(addToFragment(fragment.lastChild.content, depth - 1, content)));\n}\nfunction contentAt(fragment, depth) {\n    for (let i = 0; i < depth; i++)\n        fragment = fragment.firstChild.content;\n    return fragment;\n}\nfunction closeNodeStart(node, openStart, openEnd) {\n    if (openStart <= 0)\n        return node;\n    let frag = node.content;\n    if (openStart > 1)\n        frag = frag.replaceChild(0, closeNodeStart(frag.firstChild, openStart - 1, frag.childCount == 1 ? openEnd - 1 : 0));\n    if (openStart > 0) {\n        frag = node.type.contentMatch.fillBefore(frag).append(frag);\n        if (openEnd <= 0)\n            frag = frag.append(node.type.contentMatch.matchFragment(frag).fillBefore(Fragment.empty, true));\n    }\n    return node.copy(frag);\n}\nfunction contentAfterFits($to, depth, type, match, open) {\n    let node = $to.node(depth), index = open ? $to.indexAfter(depth) : $to.index(depth);\n    if (index == node.childCount && !type.compatibleContent(node.type))\n        return null;\n    let fit = match.fillBefore(node.content, true, index);\n    return fit && !invalidMarks(type, node.content, index) ? fit : null;\n}\nfunction invalidMarks(type, fragment, start) {\n    for (let i = start; i < fragment.childCount; i++)\n        if (!type.allowsMarks(fragment.child(i).marks))\n            return true;\n    return false;\n}\nfunction definesContent(type) {\n    return type.spec.defining || type.spec.definingForContent;\n}\nfunction replaceRange(tr, from, to, slice) {\n    if (!slice.size)\n        return tr.deleteRange(from, to);\n    let $from = tr.doc.resolve(from), $to = tr.doc.resolve(to);\n    if (fitsTrivially($from, $to, slice))\n        return tr.step(new ReplaceStep(from, to, slice));\n    let targetDepths = coveredDepths($from, tr.doc.resolve(to));\n    // Can't replace the whole document, so remove 0 if it's present\n    if (targetDepths[targetDepths.length - 1] == 0)\n        targetDepths.pop();\n    // Negative numbers represent not expansion over the whole node at\n    // that depth, but replacing from $from.before(-D) to $to.pos.\n    let preferredTarget = -($from.depth + 1);\n    targetDepths.unshift(preferredTarget);\n    // This loop picks a preferred target depth, if one of the covering\n    // depths is not outside of a defining node, and adds negative\n    // depths for any depth that has $from at its start and does not\n    // cross a defining node.\n    for (let d = $from.depth, pos = $from.pos - 1; d > 0; d--, pos--) {\n        let spec = $from.node(d).type.spec;\n        if (spec.defining || spec.definingAsContext || spec.isolating)\n            break;\n        if (targetDepths.indexOf(d) > -1)\n            preferredTarget = d;\n        else if ($from.before(d) == pos)\n            targetDepths.splice(1, 0, -d);\n    }\n    // Try to fit each possible depth of the slice into each possible\n    // target depth, starting with the preferred depths.\n    let preferredTargetIndex = targetDepths.indexOf(preferredTarget);\n    let leftNodes = [], preferredDepth = slice.openStart;\n    for (let content = slice.content, i = 0;; i++) {\n        let node = content.firstChild;\n        leftNodes.push(node);\n        if (i == slice.openStart)\n            break;\n        content = node.content;\n    }\n    // Back up preferredDepth to cover defining textblocks directly\n    // above it, possibly skipping a non-defining textblock.\n    for (let d = preferredDepth - 1; d >= 0; d--) {\n        let leftNode = leftNodes[d], def = definesContent(leftNode.type);\n        if (def && !leftNode.sameMarkup($from.node(Math.abs(preferredTarget) - 1)))\n            preferredDepth = d;\n        else if (def || !leftNode.type.isTextblock)\n            break;\n    }\n    for (let j = slice.openStart; j >= 0; j--) {\n        let openDepth = (j + preferredDepth + 1) % (slice.openStart + 1);\n        let insert = leftNodes[openDepth];\n        if (!insert)\n            continue;\n        for (let i = 0; i < targetDepths.length; i++) {\n            // Loop over possible expansion levels, starting with the\n            // preferred one\n            let targetDepth = targetDepths[(i + preferredTargetIndex) % targetDepths.length], expand = true;\n            if (targetDepth < 0) {\n                expand = false;\n                targetDepth = -targetDepth;\n            }\n            let parent = $from.node(targetDepth - 1), index = $from.index(targetDepth - 1);\n            if (parent.canReplaceWith(index, index, insert.type, insert.marks))\n                return tr.replace($from.before(targetDepth), expand ? $to.after(targetDepth) : to, new Slice(closeFragment(slice.content, 0, slice.openStart, openDepth), openDepth, slice.openEnd));\n        }\n    }\n    let startSteps = tr.steps.length;\n    for (let i = targetDepths.length - 1; i >= 0; i--) {\n        tr.replace(from, to, slice);\n        if (tr.steps.length > startSteps)\n            break;\n        let depth = targetDepths[i];\n        if (depth < 0)\n            continue;\n        from = $from.before(depth);\n        to = $to.after(depth);\n    }\n}\nfunction closeFragment(fragment, depth, oldOpen, newOpen, parent) {\n    if (depth < oldOpen) {\n        let first = fragment.firstChild;\n        fragment = fragment.replaceChild(0, first.copy(closeFragment(first.content, depth + 1, oldOpen, newOpen, first)));\n    }\n    if (depth > newOpen) {\n        let match = parent.contentMatchAt(0);\n        let start = match.fillBefore(fragment).append(fragment);\n        fragment = start.append(match.matchFragment(start).fillBefore(Fragment.empty, true));\n    }\n    return fragment;\n}\nfunction replaceRangeWith(tr, from, to, node) {\n    if (!node.isInline && from == to && tr.doc.resolve(from).parent.content.size) {\n        let point = insertPoint(tr.doc, from, node.type);\n        if (point != null)\n            from = to = point;\n    }\n    tr.replaceRange(from, to, new Slice(Fragment.from(node), 0, 0));\n}\nfunction deleteRange(tr, from, to) {\n    let $from = tr.doc.resolve(from), $to = tr.doc.resolve(to);\n    let covered = coveredDepths($from, $to);\n    for (let i = 0; i < covered.length; i++) {\n        let depth = covered[i], last = i == covered.length - 1;\n        if ((last && depth == 0) || $from.node(depth).type.contentMatch.validEnd)\n            return tr.delete($from.start(depth), $to.end(depth));\n        if (depth > 0 && (last || $from.node(depth - 1).canReplace($from.index(depth - 1), $to.indexAfter(depth - 1))))\n            return tr.delete($from.before(depth), $to.after(depth));\n    }\n    for (let d = 1; d <= $from.depth && d <= $to.depth; d++) {\n        if (from - $from.start(d) == $from.depth - d && to > $from.end(d) && $to.end(d) - to != $to.depth - d)\n            return tr.delete($from.before(d), to);\n    }\n    tr.delete(from, to);\n}\n// Returns an array of all depths for which $from - $to spans the\n// whole content of the nodes at that depth.\nfunction coveredDepths($from, $to) {\n    let result = [], minDepth = Math.min($from.depth, $to.depth);\n    for (let d = minDepth; d >= 0; d--) {\n        let start = $from.start(d);\n        if (start < $from.pos - ($from.depth - d) ||\n            $to.end(d) > $to.pos + ($to.depth - d) ||\n            $from.node(d).type.spec.isolating ||\n            $to.node(d).type.spec.isolating)\n            break;\n        if (start == $to.start(d) ||\n            (d == $from.depth && d == $to.depth && $from.parent.inlineContent && $to.parent.inlineContent &&\n                d && $to.start(d - 1) == start - 1))\n            result.push(d);\n    }\n    return result;\n}\n\n/**\nUpdate an attribute in a specific node.\n*/\nclass AttrStep extends Step {\n    /**\n    Construct an attribute step.\n    */\n    constructor(\n    /**\n    The position of the target node.\n    */\n    pos, \n    /**\n    The attribute to set.\n    */\n    attr, \n    // The attribute's new value.\n    value) {\n        super();\n        this.pos = pos;\n        this.attr = attr;\n        this.value = value;\n    }\n    apply(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node)\n            return StepResult.fail(\"No node at attribute step's position\");\n        let attrs = Object.create(null);\n        for (let name in node.attrs)\n            attrs[name] = node.attrs[name];\n        attrs[this.attr] = this.value;\n        let updated = node.type.create(attrs, null, node.marks);\n        return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n    }\n    getMap() {\n        return StepMap.empty;\n    }\n    invert(doc) {\n        return new AttrStep(this.pos, this.attr, doc.nodeAt(this.pos).attrs[this.attr]);\n    }\n    map(mapping) {\n        let pos = mapping.mapResult(this.pos, 1);\n        return pos.deletedAfter ? null : new AttrStep(pos.pos, this.attr, this.value);\n    }\n    toJSON() {\n        return { stepType: \"attr\", pos: this.pos, attr: this.attr, value: this.value };\n    }\n    static fromJSON(schema, json) {\n        if (typeof json.pos != \"number\" || typeof json.attr != \"string\")\n            throw new RangeError(\"Invalid input for AttrStep.fromJSON\");\n        return new AttrStep(json.pos, json.attr, json.value);\n    }\n}\nStep.jsonID(\"attr\", AttrStep);\n/**\nUpdate an attribute in the doc node.\n*/\nclass DocAttrStep extends Step {\n    /**\n    Construct an attribute step.\n    */\n    constructor(\n    /**\n    The attribute to set.\n    */\n    attr, \n    // The attribute's new value.\n    value) {\n        super();\n        this.attr = attr;\n        this.value = value;\n    }\n    apply(doc) {\n        let attrs = Object.create(null);\n        for (let name in doc.attrs)\n            attrs[name] = doc.attrs[name];\n        attrs[this.attr] = this.value;\n        let updated = doc.type.create(attrs, doc.content, doc.marks);\n        return StepResult.ok(updated);\n    }\n    getMap() {\n        return StepMap.empty;\n    }\n    invert(doc) {\n        return new DocAttrStep(this.attr, doc.attrs[this.attr]);\n    }\n    map(mapping) {\n        return this;\n    }\n    toJSON() {\n        return { stepType: \"docAttr\", attr: this.attr, value: this.value };\n    }\n    static fromJSON(schema, json) {\n        if (typeof json.attr != \"string\")\n            throw new RangeError(\"Invalid input for DocAttrStep.fromJSON\");\n        return new DocAttrStep(json.attr, json.value);\n    }\n}\nStep.jsonID(\"docAttr\", DocAttrStep);\n\n/**\n@internal\n*/\nlet TransformError = class extends Error {\n};\nTransformError = function TransformError(message) {\n    let err = Error.call(this, message);\n    err.__proto__ = TransformError.prototype;\n    return err;\n};\nTransformError.prototype = Object.create(Error.prototype);\nTransformError.prototype.constructor = TransformError;\nTransformError.prototype.name = \"TransformError\";\n/**\nAbstraction to build up and track an array of\n[steps](https://prosemirror.net/docs/ref/#transform.Step) representing a document transformation.\n\nMost transforming methods return the `Transform` object itself, so\nthat they can be chained.\n*/\nclass Transform {\n    /**\n    Create a transform that starts with the given document.\n    */\n    constructor(\n    /**\n    The current document (the result of applying the steps in the\n    transform).\n    */\n    doc) {\n        this.doc = doc;\n        /**\n        The steps in this transform.\n        */\n        this.steps = [];\n        /**\n        The documents before each of the steps.\n        */\n        this.docs = [];\n        /**\n        A mapping with the maps for each of the steps in this transform.\n        */\n        this.mapping = new Mapping;\n    }\n    /**\n    The starting document.\n    */\n    get before() { return this.docs.length ? this.docs[0] : this.doc; }\n    /**\n    Apply a new step in this transform, saving the result. Throws an\n    error when the step fails.\n    */\n    step(step) {\n        let result = this.maybeStep(step);\n        if (result.failed)\n            throw new TransformError(result.failed);\n        return this;\n    }\n    /**\n    Try to apply a step in this transformation, ignoring it if it\n    fails. Returns the step result.\n    */\n    maybeStep(step) {\n        let result = step.apply(this.doc);\n        if (!result.failed)\n            this.addStep(step, result.doc);\n        return result;\n    }\n    /**\n    True when the document has been changed (when there are any\n    steps).\n    */\n    get docChanged() {\n        return this.steps.length > 0;\n    }\n    /**\n    @internal\n    */\n    addStep(step, doc) {\n        this.docs.push(this.doc);\n        this.steps.push(step);\n        this.mapping.appendMap(step.getMap());\n        this.doc = doc;\n    }\n    /**\n    Replace the part of the document between `from` and `to` with the\n    given `slice`.\n    */\n    replace(from, to = from, slice = Slice.empty) {\n        let step = replaceStep(this.doc, from, to, slice);\n        if (step)\n            this.step(step);\n        return this;\n    }\n    /**\n    Replace the given range with the given content, which may be a\n    fragment, node, or array of nodes.\n    */\n    replaceWith(from, to, content) {\n        return this.replace(from, to, new Slice(Fragment.from(content), 0, 0));\n    }\n    /**\n    Delete the content between the given positions.\n    */\n    delete(from, to) {\n        return this.replace(from, to, Slice.empty);\n    }\n    /**\n    Insert the given content at the given position.\n    */\n    insert(pos, content) {\n        return this.replaceWith(pos, pos, content);\n    }\n    /**\n    Replace a range of the document with a given slice, using\n    `from`, `to`, and the slice's\n    [`openStart`](https://prosemirror.net/docs/ref/#model.Slice.openStart) property as hints, rather\n    than fixed start and end points. This method may grow the\n    replaced area or close open nodes in the slice in order to get a\n    fit that is more in line with WYSIWYG expectations, by dropping\n    fully covered parent nodes of the replaced region when they are\n    marked [non-defining as\n    context](https://prosemirror.net/docs/ref/#model.NodeSpec.definingAsContext), or including an\n    open parent node from the slice that _is_ marked as [defining\n    its content](https://prosemirror.net/docs/ref/#model.NodeSpec.definingForContent).\n    \n    This is the method, for example, to handle paste. The similar\n    [`replace`](https://prosemirror.net/docs/ref/#transform.Transform.replace) method is a more\n    primitive tool which will _not_ move the start and end of its given\n    range, and is useful in situations where you need more precise\n    control over what happens.\n    */\n    replaceRange(from, to, slice) {\n        replaceRange(this, from, to, slice);\n        return this;\n    }\n    /**\n    Replace the given range with a node, but use `from` and `to` as\n    hints, rather than precise positions. When from and to are the same\n    and are at the start or end of a parent node in which the given\n    node doesn't fit, this method may _move_ them out towards a parent\n    that does allow the given node to be placed. When the given range\n    completely covers a parent node, this method may completely replace\n    that parent node.\n    */\n    replaceRangeWith(from, to, node) {\n        replaceRangeWith(this, from, to, node);\n        return this;\n    }\n    /**\n    Delete the given range, expanding it to cover fully covered\n    parent nodes until a valid replace is found.\n    */\n    deleteRange(from, to) {\n        deleteRange(this, from, to);\n        return this;\n    }\n    /**\n    Split the content in the given range off from its parent, if there\n    is sibling content before or after it, and move it up the tree to\n    the depth specified by `target`. You'll probably want to use\n    [`liftTarget`](https://prosemirror.net/docs/ref/#transform.liftTarget) to compute `target`, to make\n    sure the lift is valid.\n    */\n    lift(range, target) {\n        lift(this, range, target);\n        return this;\n    }\n    /**\n    Join the blocks around the given position. If depth is 2, their\n    last and first siblings are also joined, and so on.\n    */\n    join(pos, depth = 1) {\n        join(this, pos, depth);\n        return this;\n    }\n    /**\n    Wrap the given [range](https://prosemirror.net/docs/ref/#model.NodeRange) in the given set of wrappers.\n    The wrappers are assumed to be valid in this position, and should\n    probably be computed with [`findWrapping`](https://prosemirror.net/docs/ref/#transform.findWrapping).\n    */\n    wrap(range, wrappers) {\n        wrap(this, range, wrappers);\n        return this;\n    }\n    /**\n    Set the type of all textblocks (partly) between `from` and `to` to\n    the given node type with the given attributes.\n    */\n    setBlockType(from, to = from, type, attrs = null) {\n        setBlockType(this, from, to, type, attrs);\n        return this;\n    }\n    /**\n    Change the type, attributes, and/or marks of the node at `pos`.\n    When `type` isn't given, the existing node type is preserved,\n    */\n    setNodeMarkup(pos, type, attrs = null, marks) {\n        setNodeMarkup(this, pos, type, attrs, marks);\n        return this;\n    }\n    /**\n    Set a single attribute on a given node to a new value.\n    The `pos` addresses the document content. Use `setDocAttribute`\n    to set attributes on the document itself.\n    */\n    setNodeAttribute(pos, attr, value) {\n        this.step(new AttrStep(pos, attr, value));\n        return this;\n    }\n    /**\n    Set a single attribute on the document to a new value.\n    */\n    setDocAttribute(attr, value) {\n        this.step(new DocAttrStep(attr, value));\n        return this;\n    }\n    /**\n    Add a mark to the node at position `pos`.\n    */\n    addNodeMark(pos, mark) {\n        this.step(new AddNodeMarkStep(pos, mark));\n        return this;\n    }\n    /**\n    Remove a mark (or a mark of the given type) from the node at\n    position `pos`.\n    */\n    removeNodeMark(pos, mark) {\n        if (!(mark instanceof Mark)) {\n            let node = this.doc.nodeAt(pos);\n            if (!node)\n                throw new RangeError(\"No node at position \" + pos);\n            mark = mark.isInSet(node.marks);\n            if (!mark)\n                return this;\n        }\n        this.step(new RemoveNodeMarkStep(pos, mark));\n        return this;\n    }\n    /**\n    Split the node at the given position, and optionally, if `depth` is\n    greater than one, any number of nodes above that. By default, the\n    parts split off will inherit the node type of the original node.\n    This can be changed by passing an array of types and attributes to\n    use after the split.\n    */\n    split(pos, depth = 1, typesAfter) {\n        split(this, pos, depth, typesAfter);\n        return this;\n    }\n    /**\n    Add the given mark to the inline content between `from` and `to`.\n    */\n    addMark(from, to, mark) {\n        addMark(this, from, to, mark);\n        return this;\n    }\n    /**\n    Remove marks from inline nodes between `from` and `to`. When\n    `mark` is a single mark, remove precisely that mark. When it is\n    a mark type, remove all marks of that type. When it is null,\n    remove all marks of any type.\n    */\n    removeMark(from, to, mark) {\n        removeMark(this, from, to, mark);\n        return this;\n    }\n    /**\n    Removes all marks and nodes from the content of the node at\n    `pos` that don't match the given new parent node type. Accepts\n    an optional starting [content match](https://prosemirror.net/docs/ref/#model.ContentMatch) as\n    third argument.\n    */\n    clearIncompatible(pos, parentType, match) {\n        clearIncompatible(this, pos, parentType, match);\n        return this;\n    }\n}\n\nexport { AddMarkStep, AddNodeMarkStep, AttrStep, DocAttrStep, MapResult, Mapping, RemoveMarkStep, RemoveNodeMarkStep, ReplaceAroundStep, ReplaceStep, Step, StepMap, StepResult, Transform, TransformError, canJoin, canSplit, dropPoint, findWrapping, insertPoint, joinPoint, liftTarget, replaceStep };\n","import { TextSelection, NodeSelection, AllSelection, Selection } from 'prosemirror-state';\nimport { DOMSerializer, Fragment, Mark, Slice, DOMParser } from 'prosemirror-model';\nimport { dropPoint } from 'prosemirror-transform';\n\nconst domIndex = function (node) {\n    for (var index = 0;; index++) {\n        node = node.previousSibling;\n        if (!node)\n            return index;\n    }\n};\nconst parentNode = function (node) {\n    let parent = node.assignedSlot || node.parentNode;\n    return parent && parent.nodeType == 11 ? parent.host : parent;\n};\nlet reusedRange = null;\n// Note that this will always return the same range, because DOM range\n// objects are every expensive, and keep slowing down subsequent DOM\n// updates, for some reason.\nconst textRange = function (node, from, to) {\n    let range = reusedRange || (reusedRange = document.createRange());\n    range.setEnd(node, to == null ? node.nodeValue.length : to);\n    range.setStart(node, from || 0);\n    return range;\n};\nconst clearReusedRange = function () {\n    reusedRange = null;\n};\n// Scans forward and backward through DOM positions equivalent to the\n// given one to see if the two are in the same place (i.e. after a\n// text node vs at the end of that text node)\nconst isEquivalentPosition = function (node, off, targetNode, targetOff) {\n    return targetNode && (scanFor(node, off, targetNode, targetOff, -1) ||\n        scanFor(node, off, targetNode, targetOff, 1));\n};\nconst atomElements = /^(img|br|input|textarea|hr)$/i;\nfunction scanFor(node, off, targetNode, targetOff, dir) {\n    for (;;) {\n        if (node == targetNode && off == targetOff)\n            return true;\n        if (off == (dir < 0 ? 0 : nodeSize(node))) {\n            let parent = node.parentNode;\n            if (!parent || parent.nodeType != 1 || hasBlockDesc(node) || atomElements.test(node.nodeName) ||\n                node.contentEditable == \"false\")\n                return false;\n            off = domIndex(node) + (dir < 0 ? 0 : 1);\n            node = parent;\n        }\n        else if (node.nodeType == 1) {\n            node = node.childNodes[off + (dir < 0 ? -1 : 0)];\n            if (node.contentEditable == \"false\")\n                return false;\n            off = dir < 0 ? nodeSize(node) : 0;\n        }\n        else {\n            return false;\n        }\n    }\n}\nfunction nodeSize(node) {\n    return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;\n}\nfunction textNodeBefore$1(node, offset) {\n    for (;;) {\n        if (node.nodeType == 3 && offset)\n            return node;\n        if (node.nodeType == 1 && offset > 0) {\n            if (node.contentEditable == \"false\")\n                return null;\n            node = node.childNodes[offset - 1];\n            offset = nodeSize(node);\n        }\n        else if (node.parentNode && !hasBlockDesc(node)) {\n            offset = domIndex(node);\n            node = node.parentNode;\n        }\n        else {\n            return null;\n        }\n    }\n}\nfunction textNodeAfter$1(node, offset) {\n    for (;;) {\n        if (node.nodeType == 3 && offset < node.nodeValue.length)\n            return node;\n        if (node.nodeType == 1 && offset < node.childNodes.length) {\n            if (node.contentEditable == \"false\")\n                return null;\n            node = node.childNodes[offset];\n            offset = 0;\n        }\n        else if (node.parentNode && !hasBlockDesc(node)) {\n            offset = domIndex(node) + 1;\n            node = node.parentNode;\n        }\n        else {\n            return null;\n        }\n    }\n}\nfunction isOnEdge(node, offset, parent) {\n    for (let atStart = offset == 0, atEnd = offset == nodeSize(node); atStart || atEnd;) {\n        if (node == parent)\n            return true;\n        let index = domIndex(node);\n        node = node.parentNode;\n        if (!node)\n            return false;\n        atStart = atStart && index == 0;\n        atEnd = atEnd && index == nodeSize(node);\n    }\n}\nfunction hasBlockDesc(dom) {\n    let desc;\n    for (let cur = dom; cur; cur = cur.parentNode)\n        if (desc = cur.pmViewDesc)\n            break;\n    return desc && desc.node && desc.node.isBlock && (desc.dom == dom || desc.contentDOM == dom);\n}\n// Work around Chrome issue https://bugs.chromium.org/p/chromium/issues/detail?id=447523\n// (isCollapsed inappropriately returns true in shadow dom)\nconst selectionCollapsed = function (domSel) {\n    return domSel.focusNode && isEquivalentPosition(domSel.focusNode, domSel.focusOffset, domSel.anchorNode, domSel.anchorOffset);\n};\nfunction keyEvent(keyCode, key) {\n    let event = document.createEvent(\"Event\");\n    event.initEvent(\"keydown\", true, true);\n    event.keyCode = keyCode;\n    event.key = event.code = key;\n    return event;\n}\nfunction deepActiveElement(doc) {\n    let elt = doc.activeElement;\n    while (elt && elt.shadowRoot)\n        elt = elt.shadowRoot.activeElement;\n    return elt;\n}\nfunction caretFromPoint(doc, x, y) {\n    if (doc.caretPositionFromPoint) {\n        try { // Firefox throws for this call in hard-to-predict circumstances (#994)\n            let pos = doc.caretPositionFromPoint(x, y);\n            if (pos)\n                return { node: pos.offsetNode, offset: pos.offset };\n        }\n        catch (_) { }\n    }\n    if (doc.caretRangeFromPoint) {\n        let range = doc.caretRangeFromPoint(x, y);\n        if (range)\n            return { node: range.startContainer, offset: range.startOffset };\n    }\n}\n\nconst nav = typeof navigator != \"undefined\" ? navigator : null;\nconst doc = typeof document != \"undefined\" ? document : null;\nconst agent = (nav && nav.userAgent) || \"\";\nconst ie_edge = /Edge\\/(\\d+)/.exec(agent);\nconst ie_upto10 = /MSIE \\d/.exec(agent);\nconst ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(agent);\nconst ie = !!(ie_upto10 || ie_11up || ie_edge);\nconst ie_version = ie_upto10 ? document.documentMode : ie_11up ? +ie_11up[1] : ie_edge ? +ie_edge[1] : 0;\nconst gecko = !ie && /gecko\\/(\\d+)/i.test(agent);\ngecko && +(/Firefox\\/(\\d+)/.exec(agent) || [0, 0])[1];\nconst _chrome = !ie && /Chrome\\/(\\d+)/.exec(agent);\nconst chrome = !!_chrome;\nconst chrome_version = _chrome ? +_chrome[1] : 0;\nconst safari = !ie && !!nav && /Apple Computer/.test(nav.vendor);\n// Is true for both iOS and iPadOS for convenience\nconst ios = safari && (/Mobile\\/\\w+/.test(agent) || !!nav && nav.maxTouchPoints > 2);\nconst mac = ios || (nav ? /Mac/.test(nav.platform) : false);\nconst windows = nav ? /Win/.test(nav.platform) : false;\nconst android = /Android \\d/.test(agent);\nconst webkit = !!doc && \"webkitFontSmoothing\" in doc.documentElement.style;\nconst webkit_version = webkit ? +(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1] : 0;\n\nfunction windowRect(doc) {\n    let vp = doc.defaultView && doc.defaultView.visualViewport;\n    if (vp)\n        return {\n            left: 0, right: vp.width,\n            top: 0, bottom: vp.height\n        };\n    return { left: 0, right: doc.documentElement.clientWidth,\n        top: 0, bottom: doc.documentElement.clientHeight };\n}\nfunction getSide(value, side) {\n    return typeof value == \"number\" ? value : value[side];\n}\nfunction clientRect(node) {\n    let rect = node.getBoundingClientRect();\n    // Adjust for elements with style \"transform: scale()\"\n    let scaleX = (rect.width / node.offsetWidth) || 1;\n    let scaleY = (rect.height / node.offsetHeight) || 1;\n    // Make sure scrollbar width isn't included in the rectangle\n    return { left: rect.left, right: rect.left + node.clientWidth * scaleX,\n        top: rect.top, bottom: rect.top + node.clientHeight * scaleY };\n}\nfunction scrollRectIntoView(view, rect, startDOM) {\n    let scrollThreshold = view.someProp(\"scrollThreshold\") || 0, scrollMargin = view.someProp(\"scrollMargin\") || 5;\n    let doc = view.dom.ownerDocument;\n    for (let parent = startDOM || view.dom;; parent = parentNode(parent)) {\n        if (!parent)\n            break;\n        if (parent.nodeType != 1)\n            continue;\n        let elt = parent;\n        let atTop = elt == doc.body;\n        let bounding = atTop ? windowRect(doc) : clientRect(elt);\n        let moveX = 0, moveY = 0;\n        if (rect.top < bounding.top + getSide(scrollThreshold, \"top\"))\n            moveY = -(bounding.top - rect.top + getSide(scrollMargin, \"top\"));\n        else if (rect.bottom > bounding.bottom - getSide(scrollThreshold, \"bottom\"))\n            moveY = rect.bottom - rect.top > bounding.bottom - bounding.top\n                ? rect.top + getSide(scrollMargin, \"top\") - bounding.top\n                : rect.bottom - bounding.bottom + getSide(scrollMargin, \"bottom\");\n        if (rect.left < bounding.left + getSide(scrollThreshold, \"left\"))\n            moveX = -(bounding.left - rect.left + getSide(scrollMargin, \"left\"));\n        else if (rect.right > bounding.right - getSide(scrollThreshold, \"right\"))\n            moveX = rect.right - bounding.right + getSide(scrollMargin, \"right\");\n        if (moveX || moveY) {\n            if (atTop) {\n                doc.defaultView.scrollBy(moveX, moveY);\n            }\n            else {\n                let startX = elt.scrollLeft, startY = elt.scrollTop;\n                if (moveY)\n                    elt.scrollTop += moveY;\n                if (moveX)\n                    elt.scrollLeft += moveX;\n                let dX = elt.scrollLeft - startX, dY = elt.scrollTop - startY;\n                rect = { left: rect.left - dX, top: rect.top - dY, right: rect.right - dX, bottom: rect.bottom - dY };\n            }\n        }\n        if (atTop || /^(fixed|sticky)$/.test(getComputedStyle(parent).position))\n            break;\n    }\n}\n// Store the scroll position of the editor's parent nodes, along with\n// the top position of an element near the top of the editor, which\n// will be used to make sure the visible viewport remains stable even\n// when the size of the content above changes.\nfunction storeScrollPos(view) {\n    let rect = view.dom.getBoundingClientRect(), startY = Math.max(0, rect.top);\n    let refDOM, refTop;\n    for (let x = (rect.left + rect.right) / 2, y = startY + 1; y < Math.min(innerHeight, rect.bottom); y += 5) {\n        let dom = view.root.elementFromPoint(x, y);\n        if (!dom || dom == view.dom || !view.dom.contains(dom))\n            continue;\n        let localRect = dom.getBoundingClientRect();\n        if (localRect.top >= startY - 20) {\n            refDOM = dom;\n            refTop = localRect.top;\n            break;\n        }\n    }\n    return { refDOM: refDOM, refTop: refTop, stack: scrollStack(view.dom) };\n}\nfunction scrollStack(dom) {\n    let stack = [], doc = dom.ownerDocument;\n    for (let cur = dom; cur; cur = parentNode(cur)) {\n        stack.push({ dom: cur, top: cur.scrollTop, left: cur.scrollLeft });\n        if (dom == doc)\n            break;\n    }\n    return stack;\n}\n// Reset the scroll position of the editor's parent nodes to that what\n// it was before, when storeScrollPos was called.\nfunction resetScrollPos({ refDOM, refTop, stack }) {\n    let newRefTop = refDOM ? refDOM.getBoundingClientRect().top : 0;\n    restoreScrollStack(stack, newRefTop == 0 ? 0 : newRefTop - refTop);\n}\nfunction restoreScrollStack(stack, dTop) {\n    for (let i = 0; i < stack.length; i++) {\n        let { dom, top, left } = stack[i];\n        if (dom.scrollTop != top + dTop)\n            dom.scrollTop = top + dTop;\n        if (dom.scrollLeft != left)\n            dom.scrollLeft = left;\n    }\n}\nlet preventScrollSupported = null;\n// Feature-detects support for .focus({preventScroll: true}), and uses\n// a fallback kludge when not supported.\nfunction focusPreventScroll(dom) {\n    if (dom.setActive)\n        return dom.setActive(); // in IE\n    if (preventScrollSupported)\n        return dom.focus(preventScrollSupported);\n    let stored = scrollStack(dom);\n    dom.focus(preventScrollSupported == null ? {\n        get preventScroll() {\n            preventScrollSupported = { preventScroll: true };\n            return true;\n        }\n    } : undefined);\n    if (!preventScrollSupported) {\n        preventScrollSupported = false;\n        restoreScrollStack(stored, 0);\n    }\n}\nfunction findOffsetInNode(node, coords) {\n    let closest, dxClosest = 2e8, coordsClosest, offset = 0;\n    let rowBot = coords.top, rowTop = coords.top;\n    let firstBelow, coordsBelow;\n    for (let child = node.firstChild, childIndex = 0; child; child = child.nextSibling, childIndex++) {\n        let rects;\n        if (child.nodeType == 1)\n            rects = child.getClientRects();\n        else if (child.nodeType == 3)\n            rects = textRange(child).getClientRects();\n        else\n            continue;\n        for (let i = 0; i < rects.length; i++) {\n            let rect = rects[i];\n            if (rect.top <= rowBot && rect.bottom >= rowTop) {\n                rowBot = Math.max(rect.bottom, rowBot);\n                rowTop = Math.min(rect.top, rowTop);\n                let dx = rect.left > coords.left ? rect.left - coords.left\n                    : rect.right < coords.left ? coords.left - rect.right : 0;\n                if (dx < dxClosest) {\n                    closest = child;\n                    dxClosest = dx;\n                    coordsClosest = dx && closest.nodeType == 3 ? {\n                        left: rect.right < coords.left ? rect.right : rect.left,\n                        top: coords.top\n                    } : coords;\n                    if (child.nodeType == 1 && dx)\n                        offset = childIndex + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0);\n                    continue;\n                }\n            }\n            else if (rect.top > coords.top && !firstBelow && rect.left <= coords.left && rect.right >= coords.left) {\n                firstBelow = child;\n                coordsBelow = { left: Math.max(rect.left, Math.min(rect.right, coords.left)), top: rect.top };\n            }\n            if (!closest && (coords.left >= rect.right && coords.top >= rect.top ||\n                coords.left >= rect.left && coords.top >= rect.bottom))\n                offset = childIndex + 1;\n        }\n    }\n    if (!closest && firstBelow) {\n        closest = firstBelow;\n        coordsClosest = coordsBelow;\n        dxClosest = 0;\n    }\n    if (closest && closest.nodeType == 3)\n        return findOffsetInText(closest, coordsClosest);\n    if (!closest || (dxClosest && closest.nodeType == 1))\n        return { node, offset };\n    return findOffsetInNode(closest, coordsClosest);\n}\nfunction findOffsetInText(node, coords) {\n    let len = node.nodeValue.length;\n    let range = document.createRange();\n    for (let i = 0; i < len; i++) {\n        range.setEnd(node, i + 1);\n        range.setStart(node, i);\n        let rect = singleRect(range, 1);\n        if (rect.top == rect.bottom)\n            continue;\n        if (inRect(coords, rect))\n            return { node, offset: i + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0) };\n    }\n    return { node, offset: 0 };\n}\nfunction inRect(coords, rect) {\n    return coords.left >= rect.left - 1 && coords.left <= rect.right + 1 &&\n        coords.top >= rect.top - 1 && coords.top <= rect.bottom + 1;\n}\nfunction targetKludge(dom, coords) {\n    let parent = dom.parentNode;\n    if (parent && /^li$/i.test(parent.nodeName) && coords.left < dom.getBoundingClientRect().left)\n        return parent;\n    return dom;\n}\nfunction posFromElement(view, elt, coords) {\n    let { node, offset } = findOffsetInNode(elt, coords), bias = -1;\n    if (node.nodeType == 1 && !node.firstChild) {\n        let rect = node.getBoundingClientRect();\n        bias = rect.left != rect.right && coords.left > (rect.left + rect.right) / 2 ? 1 : -1;\n    }\n    return view.docView.posFromDOM(node, offset, bias);\n}\nfunction posFromCaret(view, node, offset, coords) {\n    // Browser (in caretPosition/RangeFromPoint) will agressively\n    // normalize towards nearby inline nodes. Since we are interested in\n    // positions between block nodes too, we first walk up the hierarchy\n    // of nodes to see if there are block nodes that the coordinates\n    // fall outside of. If so, we take the position before/after that\n    // block. If not, we call `posFromDOM` on the raw node/offset.\n    let outsideBlock = -1;\n    for (let cur = node, sawBlock = false;;) {\n        if (cur == view.dom)\n            break;\n        let desc = view.docView.nearestDesc(cur, true);\n        if (!desc)\n            return null;\n        if (desc.dom.nodeType == 1 && (desc.node.isBlock && desc.parent || !desc.contentDOM)) {\n            let rect = desc.dom.getBoundingClientRect();\n            if (desc.node.isBlock && desc.parent) {\n                // Only apply the horizontal test to the innermost block. Vertical for any parent.\n                if (!sawBlock && rect.left > coords.left || rect.top > coords.top)\n                    outsideBlock = desc.posBefore;\n                else if (!sawBlock && rect.right < coords.left || rect.bottom < coords.top)\n                    outsideBlock = desc.posAfter;\n                sawBlock = true;\n            }\n            if (!desc.contentDOM && outsideBlock < 0 && !desc.node.isText) {\n                // If we are inside a leaf, return the side of the leaf closer to the coords\n                let before = desc.node.isBlock ? coords.top < (rect.top + rect.bottom) / 2\n                    : coords.left < (rect.left + rect.right) / 2;\n                return before ? desc.posBefore : desc.posAfter;\n            }\n        }\n        cur = desc.dom.parentNode;\n    }\n    return outsideBlock > -1 ? outsideBlock : view.docView.posFromDOM(node, offset, -1);\n}\nfunction elementFromPoint(element, coords, box) {\n    let len = element.childNodes.length;\n    if (len && box.top < box.bottom) {\n        for (let startI = Math.max(0, Math.min(len - 1, Math.floor(len * (coords.top - box.top) / (box.bottom - box.top)) - 2)), i = startI;;) {\n            let child = element.childNodes[i];\n            if (child.nodeType == 1) {\n                let rects = child.getClientRects();\n                for (let j = 0; j < rects.length; j++) {\n                    let rect = rects[j];\n                    if (inRect(coords, rect))\n                        return elementFromPoint(child, coords, rect);\n                }\n            }\n            if ((i = (i + 1) % len) == startI)\n                break;\n        }\n    }\n    return element;\n}\n// Given an x,y position on the editor, get the position in the document.\nfunction posAtCoords(view, coords) {\n    let doc = view.dom.ownerDocument, node, offset = 0;\n    let caret = caretFromPoint(doc, coords.left, coords.top);\n    if (caret)\n        ({ node, offset } = caret);\n    let elt = (view.root.elementFromPoint ? view.root : doc)\n        .elementFromPoint(coords.left, coords.top);\n    let pos;\n    if (!elt || !view.dom.contains(elt.nodeType != 1 ? elt.parentNode : elt)) {\n        let box = view.dom.getBoundingClientRect();\n        if (!inRect(coords, box))\n            return null;\n        elt = elementFromPoint(view.dom, coords, box);\n        if (!elt)\n            return null;\n    }\n    // Safari's caretRangeFromPoint returns nonsense when on a draggable element\n    if (safari) {\n        for (let p = elt; node && p; p = parentNode(p))\n            if (p.draggable)\n                node = undefined;\n    }\n    elt = targetKludge(elt, coords);\n    if (node) {\n        if (gecko && node.nodeType == 1) {\n            // Firefox will sometimes return offsets into <input> nodes, which\n            // have no actual children, from caretPositionFromPoint (#953)\n            offset = Math.min(offset, node.childNodes.length);\n            // It'll also move the returned position before image nodes,\n            // even if those are behind it.\n            if (offset < node.childNodes.length) {\n                let next = node.childNodes[offset], box;\n                if (next.nodeName == \"IMG\" && (box = next.getBoundingClientRect()).right <= coords.left &&\n                    box.bottom > coords.top)\n                    offset++;\n            }\n        }\n        let prev;\n        // When clicking above the right side of an uneditable node, Chrome will report a cursor position after that node.\n        if (webkit && offset && node.nodeType == 1 && (prev = node.childNodes[offset - 1]).nodeType == 1 &&\n            prev.contentEditable == \"false\" && prev.getBoundingClientRect().top >= coords.top)\n            offset--;\n        // Suspiciously specific kludge to work around caret*FromPoint\n        // never returning a position at the end of the document\n        if (node == view.dom && offset == node.childNodes.length - 1 && node.lastChild.nodeType == 1 &&\n            coords.top > node.lastChild.getBoundingClientRect().bottom)\n            pos = view.state.doc.content.size;\n        // Ignore positions directly after a BR, since caret*FromPoint\n        // 'round up' positions that would be more accurately placed\n        // before the BR node.\n        else if (offset == 0 || node.nodeType != 1 || node.childNodes[offset - 1].nodeName != \"BR\")\n            pos = posFromCaret(view, node, offset, coords);\n    }\n    if (pos == null)\n        pos = posFromElement(view, elt, coords);\n    let desc = view.docView.nearestDesc(elt, true);\n    return { pos, inside: desc ? desc.posAtStart - desc.border : -1 };\n}\nfunction nonZero(rect) {\n    return rect.top < rect.bottom || rect.left < rect.right;\n}\nfunction singleRect(target, bias) {\n    let rects = target.getClientRects();\n    if (rects.length) {\n        let first = rects[bias < 0 ? 0 : rects.length - 1];\n        if (nonZero(first))\n            return first;\n    }\n    return Array.prototype.find.call(rects, nonZero) || target.getBoundingClientRect();\n}\nconst BIDI = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n// Given a position in the document model, get a bounding box of the\n// character at that position, relative to the window.\nfunction coordsAtPos(view, pos, side) {\n    let { node, offset, atom } = view.docView.domFromPos(pos, side < 0 ? -1 : 1);\n    let supportEmptyRange = webkit || gecko;\n    if (node.nodeType == 3) {\n        // These browsers support querying empty text ranges. Prefer that in\n        // bidi context or when at the end of a node.\n        if (supportEmptyRange && (BIDI.test(node.nodeValue) || (side < 0 ? !offset : offset == node.nodeValue.length))) {\n            let rect = singleRect(textRange(node, offset, offset), side);\n            // Firefox returns bad results (the position before the space)\n            // when querying a position directly after line-broken\n            // whitespace. Detect this situation and and kludge around it\n            if (gecko && offset && /\\s/.test(node.nodeValue[offset - 1]) && offset < node.nodeValue.length) {\n                let rectBefore = singleRect(textRange(node, offset - 1, offset - 1), -1);\n                if (rectBefore.top == rect.top) {\n                    let rectAfter = singleRect(textRange(node, offset, offset + 1), -1);\n                    if (rectAfter.top != rect.top)\n                        return flattenV(rectAfter, rectAfter.left < rectBefore.left);\n                }\n            }\n            return rect;\n        }\n        else {\n            let from = offset, to = offset, takeSide = side < 0 ? 1 : -1;\n            if (side < 0 && !offset) {\n                to++;\n                takeSide = -1;\n            }\n            else if (side >= 0 && offset == node.nodeValue.length) {\n                from--;\n                takeSide = 1;\n            }\n            else if (side < 0) {\n                from--;\n            }\n            else {\n                to++;\n            }\n            return flattenV(singleRect(textRange(node, from, to), takeSide), takeSide < 0);\n        }\n    }\n    let $dom = view.state.doc.resolve(pos - (atom || 0));\n    // Return a horizontal line in block context\n    if (!$dom.parent.inlineContent) {\n        if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {\n            let before = node.childNodes[offset - 1];\n            if (before.nodeType == 1)\n                return flattenH(before.getBoundingClientRect(), false);\n        }\n        if (atom == null && offset < nodeSize(node)) {\n            let after = node.childNodes[offset];\n            if (after.nodeType == 1)\n                return flattenH(after.getBoundingClientRect(), true);\n        }\n        return flattenH(node.getBoundingClientRect(), side >= 0);\n    }\n    // Inline, not in text node (this is not Bidi-safe)\n    if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {\n        let before = node.childNodes[offset - 1];\n        let target = before.nodeType == 3 ? textRange(before, nodeSize(before) - (supportEmptyRange ? 0 : 1))\n            // BR nodes tend to only return the rectangle before them.\n            // Only use them if they are the last element in their parent\n            : before.nodeType == 1 && (before.nodeName != \"BR\" || !before.nextSibling) ? before : null;\n        if (target)\n            return flattenV(singleRect(target, 1), false);\n    }\n    if (atom == null && offset < nodeSize(node)) {\n        let after = node.childNodes[offset];\n        while (after.pmViewDesc && after.pmViewDesc.ignoreForCoords)\n            after = after.nextSibling;\n        let target = !after ? null : after.nodeType == 3 ? textRange(after, 0, (supportEmptyRange ? 0 : 1))\n            : after.nodeType == 1 ? after : null;\n        if (target)\n            return flattenV(singleRect(target, -1), true);\n    }\n    // All else failed, just try to get a rectangle for the target node\n    return flattenV(singleRect(node.nodeType == 3 ? textRange(node) : node, -side), side >= 0);\n}\nfunction flattenV(rect, left) {\n    if (rect.width == 0)\n        return rect;\n    let x = left ? rect.left : rect.right;\n    return { top: rect.top, bottom: rect.bottom, left: x, right: x };\n}\nfunction flattenH(rect, top) {\n    if (rect.height == 0)\n        return rect;\n    let y = top ? rect.top : rect.bottom;\n    return { top: y, bottom: y, left: rect.left, right: rect.right };\n}\nfunction withFlushedState(view, state, f) {\n    let viewState = view.state, active = view.root.activeElement;\n    if (viewState != state)\n        view.updateState(state);\n    if (active != view.dom)\n        view.focus();\n    try {\n        return f();\n    }\n    finally {\n        if (viewState != state)\n            view.updateState(viewState);\n        if (active != view.dom && active)\n            active.focus();\n    }\n}\n// Whether vertical position motion in a given direction\n// from a position would leave a text block.\nfunction endOfTextblockVertical(view, state, dir) {\n    let sel = state.selection;\n    let $pos = dir == \"up\" ? sel.$from : sel.$to;\n    return withFlushedState(view, state, () => {\n        let { node: dom } = view.docView.domFromPos($pos.pos, dir == \"up\" ? -1 : 1);\n        for (;;) {\n            let nearest = view.docView.nearestDesc(dom, true);\n            if (!nearest)\n                break;\n            if (nearest.node.isBlock) {\n                dom = nearest.contentDOM || nearest.dom;\n                break;\n            }\n            dom = nearest.dom.parentNode;\n        }\n        let coords = coordsAtPos(view, $pos.pos, 1);\n        for (let child = dom.firstChild; child; child = child.nextSibling) {\n            let boxes;\n            if (child.nodeType == 1)\n                boxes = child.getClientRects();\n            else if (child.nodeType == 3)\n                boxes = textRange(child, 0, child.nodeValue.length).getClientRects();\n            else\n                continue;\n            for (let i = 0; i < boxes.length; i++) {\n                let box = boxes[i];\n                if (box.bottom > box.top + 1 &&\n                    (dir == \"up\" ? coords.top - box.top > (box.bottom - coords.top) * 2\n                        : box.bottom - coords.bottom > (coords.bottom - box.top) * 2))\n                    return false;\n            }\n        }\n        return true;\n    });\n}\nconst maybeRTL = /[\\u0590-\\u08ac]/;\nfunction endOfTextblockHorizontal(view, state, dir) {\n    let { $head } = state.selection;\n    if (!$head.parent.isTextblock)\n        return false;\n    let offset = $head.parentOffset, atStart = !offset, atEnd = offset == $head.parent.content.size;\n    let sel = view.domSelection();\n    // If the textblock is all LTR, or the browser doesn't support\n    // Selection.modify (Edge), fall back to a primitive approach\n    if (!maybeRTL.test($head.parent.textContent) || !sel.modify)\n        return dir == \"left\" || dir == \"backward\" ? atStart : atEnd;\n    return withFlushedState(view, state, () => {\n        // This is a huge hack, but appears to be the best we can\n        // currently do: use `Selection.modify` to move the selection by\n        // one character, and see if that moves the cursor out of the\n        // textblock (or doesn't move it at all, when at the start/end of\n        // the document).\n        let { focusNode: oldNode, focusOffset: oldOff, anchorNode, anchorOffset } = view.domSelectionRange();\n        let oldBidiLevel = sel.caretBidiLevel // Only for Firefox\n        ;\n        sel.modify(\"move\", dir, \"character\");\n        let parentDOM = $head.depth ? view.docView.domAfterPos($head.before()) : view.dom;\n        let { focusNode: newNode, focusOffset: newOff } = view.domSelectionRange();\n        let result = newNode && !parentDOM.contains(newNode.nodeType == 1 ? newNode : newNode.parentNode) ||\n            (oldNode == newNode && oldOff == newOff);\n        // Restore the previous selection\n        try {\n            sel.collapse(anchorNode, anchorOffset);\n            if (oldNode && (oldNode != anchorNode || oldOff != anchorOffset) && sel.extend)\n                sel.extend(oldNode, oldOff);\n        }\n        catch (_) { }\n        if (oldBidiLevel != null)\n            sel.caretBidiLevel = oldBidiLevel;\n        return result;\n    });\n}\nlet cachedState = null;\nlet cachedDir = null;\nlet cachedResult = false;\nfunction endOfTextblock(view, state, dir) {\n    if (cachedState == state && cachedDir == dir)\n        return cachedResult;\n    cachedState = state;\n    cachedDir = dir;\n    return cachedResult = dir == \"up\" || dir == \"down\"\n        ? endOfTextblockVertical(view, state, dir)\n        : endOfTextblockHorizontal(view, state, dir);\n}\n\n// View descriptions are data structures that describe the DOM that is\n// used to represent the editor's content. They are used for:\n//\n// - Incremental redrawing when the document changes\n//\n// - Figuring out what part of the document a given DOM position\n//   corresponds to\n//\n// - Wiring in custom implementations of the editing interface for a\n//   given node\n//\n// They form a doubly-linked mutable tree, starting at `view.docView`.\nconst NOT_DIRTY = 0, CHILD_DIRTY = 1, CONTENT_DIRTY = 2, NODE_DIRTY = 3;\n// Superclass for the various kinds of descriptions. Defines their\n// basic structure and shared methods.\nclass ViewDesc {\n    constructor(parent, children, dom, \n    // This is the node that holds the child views. It may be null for\n    // descs that don't have children.\n    contentDOM) {\n        this.parent = parent;\n        this.children = children;\n        this.dom = dom;\n        this.contentDOM = contentDOM;\n        this.dirty = NOT_DIRTY;\n        // An expando property on the DOM node provides a link back to its\n        // description.\n        dom.pmViewDesc = this;\n    }\n    // Used to check whether a given description corresponds to a\n    // widget/mark/node.\n    matchesWidget(widget) { return false; }\n    matchesMark(mark) { return false; }\n    matchesNode(node, outerDeco, innerDeco) { return false; }\n    matchesHack(nodeName) { return false; }\n    // When parsing in-editor content (in domchange.js), we allow\n    // descriptions to determine the parse rules that should be used to\n    // parse them.\n    parseRule() { return null; }\n    // Used by the editor's event handler to ignore events that come\n    // from certain descs.\n    stopEvent(event) { return false; }\n    // The size of the content represented by this desc.\n    get size() {\n        let size = 0;\n        for (let i = 0; i < this.children.length; i++)\n            size += this.children[i].size;\n        return size;\n    }\n    // For block nodes, this represents the space taken up by their\n    // start/end tokens.\n    get border() { return 0; }\n    destroy() {\n        this.parent = undefined;\n        if (this.dom.pmViewDesc == this)\n            this.dom.pmViewDesc = undefined;\n        for (let i = 0; i < this.children.length; i++)\n            this.children[i].destroy();\n    }\n    posBeforeChild(child) {\n        for (let i = 0, pos = this.posAtStart;; i++) {\n            let cur = this.children[i];\n            if (cur == child)\n                return pos;\n            pos += cur.size;\n        }\n    }\n    get posBefore() {\n        return this.parent.posBeforeChild(this);\n    }\n    get posAtStart() {\n        return this.parent ? this.parent.posBeforeChild(this) + this.border : 0;\n    }\n    get posAfter() {\n        return this.posBefore + this.size;\n    }\n    get posAtEnd() {\n        return this.posAtStart + this.size - 2 * this.border;\n    }\n    localPosFromDOM(dom, offset, bias) {\n        // If the DOM position is in the content, use the child desc after\n        // it to figure out a position.\n        if (this.contentDOM && this.contentDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode)) {\n            if (bias < 0) {\n                let domBefore, desc;\n                if (dom == this.contentDOM) {\n                    domBefore = dom.childNodes[offset - 1];\n                }\n                else {\n                    while (dom.parentNode != this.contentDOM)\n                        dom = dom.parentNode;\n                    domBefore = dom.previousSibling;\n                }\n                while (domBefore && !((desc = domBefore.pmViewDesc) && desc.parent == this))\n                    domBefore = domBefore.previousSibling;\n                return domBefore ? this.posBeforeChild(desc) + desc.size : this.posAtStart;\n            }\n            else {\n                let domAfter, desc;\n                if (dom == this.contentDOM) {\n                    domAfter = dom.childNodes[offset];\n                }\n                else {\n                    while (dom.parentNode != this.contentDOM)\n                        dom = dom.parentNode;\n                    domAfter = dom.nextSibling;\n                }\n                while (domAfter && !((desc = domAfter.pmViewDesc) && desc.parent == this))\n                    domAfter = domAfter.nextSibling;\n                return domAfter ? this.posBeforeChild(desc) : this.posAtEnd;\n            }\n        }\n        // Otherwise, use various heuristics, falling back on the bias\n        // parameter, to determine whether to return the position at the\n        // start or at the end of this view desc.\n        let atEnd;\n        if (dom == this.dom && this.contentDOM) {\n            atEnd = offset > domIndex(this.contentDOM);\n        }\n        else if (this.contentDOM && this.contentDOM != this.dom && this.dom.contains(this.contentDOM)) {\n            atEnd = dom.compareDocumentPosition(this.contentDOM) & 2;\n        }\n        else if (this.dom.firstChild) {\n            if (offset == 0)\n                for (let search = dom;; search = search.parentNode) {\n                    if (search == this.dom) {\n                        atEnd = false;\n                        break;\n                    }\n                    if (search.previousSibling)\n                        break;\n                }\n            if (atEnd == null && offset == dom.childNodes.length)\n                for (let search = dom;; search = search.parentNode) {\n                    if (search == this.dom) {\n                        atEnd = true;\n                        break;\n                    }\n                    if (search.nextSibling)\n                        break;\n                }\n        }\n        return (atEnd == null ? bias > 0 : atEnd) ? this.posAtEnd : this.posAtStart;\n    }\n    nearestDesc(dom, onlyNodes = false) {\n        for (let first = true, cur = dom; cur; cur = cur.parentNode) {\n            let desc = this.getDesc(cur), nodeDOM;\n            if (desc && (!onlyNodes || desc.node)) {\n                // If dom is outside of this desc's nodeDOM, don't count it.\n                if (first && (nodeDOM = desc.nodeDOM) &&\n                    !(nodeDOM.nodeType == 1 ? nodeDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode) : nodeDOM == dom))\n                    first = false;\n                else\n                    return desc;\n            }\n        }\n    }\n    getDesc(dom) {\n        let desc = dom.pmViewDesc;\n        for (let cur = desc; cur; cur = cur.parent)\n            if (cur == this)\n                return desc;\n    }\n    posFromDOM(dom, offset, bias) {\n        for (let scan = dom; scan; scan = scan.parentNode) {\n            let desc = this.getDesc(scan);\n            if (desc)\n                return desc.localPosFromDOM(dom, offset, bias);\n        }\n        return -1;\n    }\n    // Find the desc for the node after the given pos, if any. (When a\n    // parent node overrode rendering, there might not be one.)\n    descAt(pos) {\n        for (let i = 0, offset = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (offset == pos && end != offset) {\n                while (!child.border && child.children.length)\n                    child = child.children[0];\n                return child;\n            }\n            if (pos < end)\n                return child.descAt(pos - offset - child.border);\n            offset = end;\n        }\n    }\n    domFromPos(pos, side) {\n        if (!this.contentDOM)\n            return { node: this.dom, offset: 0, atom: pos + 1 };\n        // First find the position in the child array\n        let i = 0, offset = 0;\n        for (let curPos = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = curPos + child.size;\n            if (end > pos || child instanceof TrailingHackViewDesc) {\n                offset = pos - curPos;\n                break;\n            }\n            curPos = end;\n        }\n        // If this points into the middle of a child, call through\n        if (offset)\n            return this.children[i].domFromPos(offset - this.children[i].border, side);\n        // Go back if there were any zero-length widgets with side >= 0 before this point\n        for (let prev; i && !(prev = this.children[i - 1]).size && prev instanceof WidgetViewDesc && prev.side >= 0; i--) { }\n        // Scan towards the first useable node\n        if (side <= 0) {\n            let prev, enter = true;\n            for (;; i--, enter = false) {\n                prev = i ? this.children[i - 1] : null;\n                if (!prev || prev.dom.parentNode == this.contentDOM)\n                    break;\n            }\n            if (prev && side && enter && !prev.border && !prev.domAtom)\n                return prev.domFromPos(prev.size, side);\n            return { node: this.contentDOM, offset: prev ? domIndex(prev.dom) + 1 : 0 };\n        }\n        else {\n            let next, enter = true;\n            for (;; i++, enter = false) {\n                next = i < this.children.length ? this.children[i] : null;\n                if (!next || next.dom.parentNode == this.contentDOM)\n                    break;\n            }\n            if (next && enter && !next.border && !next.domAtom)\n                return next.domFromPos(0, side);\n            return { node: this.contentDOM, offset: next ? domIndex(next.dom) : this.contentDOM.childNodes.length };\n        }\n    }\n    // Used to find a DOM range in a single parent for a given changed\n    // range.\n    parseRange(from, to, base = 0) {\n        if (this.children.length == 0)\n            return { node: this.contentDOM, from, to, fromOffset: 0, toOffset: this.contentDOM.childNodes.length };\n        let fromOffset = -1, toOffset = -1;\n        for (let offset = base, i = 0;; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (fromOffset == -1 && from <= end) {\n                let childBase = offset + child.border;\n                // FIXME maybe descend mark views to parse a narrower range?\n                if (from >= childBase && to <= end - child.border && child.node &&\n                    child.contentDOM && this.contentDOM.contains(child.contentDOM))\n                    return child.parseRange(from, to, childBase);\n                from = offset;\n                for (let j = i; j > 0; j--) {\n                    let prev = this.children[j - 1];\n                    if (prev.size && prev.dom.parentNode == this.contentDOM && !prev.emptyChildAt(1)) {\n                        fromOffset = domIndex(prev.dom) + 1;\n                        break;\n                    }\n                    from -= prev.size;\n                }\n                if (fromOffset == -1)\n                    fromOffset = 0;\n            }\n            if (fromOffset > -1 && (end > to || i == this.children.length - 1)) {\n                to = end;\n                for (let j = i + 1; j < this.children.length; j++) {\n                    let next = this.children[j];\n                    if (next.size && next.dom.parentNode == this.contentDOM && !next.emptyChildAt(-1)) {\n                        toOffset = domIndex(next.dom);\n                        break;\n                    }\n                    to += next.size;\n                }\n                if (toOffset == -1)\n                    toOffset = this.contentDOM.childNodes.length;\n                break;\n            }\n            offset = end;\n        }\n        return { node: this.contentDOM, from, to, fromOffset, toOffset };\n    }\n    emptyChildAt(side) {\n        if (this.border || !this.contentDOM || !this.children.length)\n            return false;\n        let child = this.children[side < 0 ? 0 : this.children.length - 1];\n        return child.size == 0 || child.emptyChildAt(side);\n    }\n    domAfterPos(pos) {\n        let { node, offset } = this.domFromPos(pos, 0);\n        if (node.nodeType != 1 || offset == node.childNodes.length)\n            throw new RangeError(\"No node after pos \" + pos);\n        return node.childNodes[offset];\n    }\n    // View descs are responsible for setting any selection that falls\n    // entirely inside of them, so that custom implementations can do\n    // custom things with the selection. Note that this falls apart when\n    // a selection starts in such a node and ends in another, in which\n    // case we just use whatever domFromPos produces as a best effort.\n    setSelection(anchor, head, root, force = false) {\n        // If the selection falls entirely in a child, give it to that child\n        let from = Math.min(anchor, head), to = Math.max(anchor, head);\n        for (let i = 0, offset = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (from > offset && to < end)\n                return child.setSelection(anchor - offset - child.border, head - offset - child.border, root, force);\n            offset = end;\n        }\n        let anchorDOM = this.domFromPos(anchor, anchor ? -1 : 1);\n        let headDOM = head == anchor ? anchorDOM : this.domFromPos(head, head ? -1 : 1);\n        let domSel = root.getSelection();\n        let brKludge = false;\n        // On Firefox, using Selection.collapse to put the cursor after a\n        // BR node for some reason doesn't always work (#1073). On Safari,\n        // the cursor sometimes inexplicable visually lags behind its\n        // reported position in such situations (#1092).\n        if ((gecko || safari) && anchor == head) {\n            let { node, offset } = anchorDOM;\n            if (node.nodeType == 3) {\n                brKludge = !!(offset && node.nodeValue[offset - 1] == \"\\n\");\n                // Issue #1128\n                if (brKludge && offset == node.nodeValue.length) {\n                    for (let scan = node, after; scan; scan = scan.parentNode) {\n                        if (after = scan.nextSibling) {\n                            if (after.nodeName == \"BR\")\n                                anchorDOM = headDOM = { node: after.parentNode, offset: domIndex(after) + 1 };\n                            break;\n                        }\n                        let desc = scan.pmViewDesc;\n                        if (desc && desc.node && desc.node.isBlock)\n                            break;\n                    }\n                }\n            }\n            else {\n                let prev = node.childNodes[offset - 1];\n                brKludge = prev && (prev.nodeName == \"BR\" || prev.contentEditable == \"false\");\n            }\n        }\n        // Firefox can act strangely when the selection is in front of an\n        // uneditable node. See #1163 and https://bugzilla.mozilla.org/show_bug.cgi?id=1709536\n        if (gecko && domSel.focusNode && domSel.focusNode != headDOM.node && domSel.focusNode.nodeType == 1) {\n            let after = domSel.focusNode.childNodes[domSel.focusOffset];\n            if (after && after.contentEditable == \"false\")\n                force = true;\n        }\n        if (!(force || brKludge && safari) &&\n            isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset) &&\n            isEquivalentPosition(headDOM.node, headDOM.offset, domSel.focusNode, domSel.focusOffset))\n            return;\n        // Selection.extend can be used to create an 'inverted' selection\n        // (one where the focus is before the anchor), but not all\n        // browsers support it yet.\n        let domSelExtended = false;\n        if ((domSel.extend || anchor == head) && !brKludge) {\n            domSel.collapse(anchorDOM.node, anchorDOM.offset);\n            try {\n                if (anchor != head)\n                    domSel.extend(headDOM.node, headDOM.offset);\n                domSelExtended = true;\n            }\n            catch (_) {\n                // In some cases with Chrome the selection is empty after calling\n                // collapse, even when it should be valid. This appears to be a bug, but\n                // it is difficult to isolate. If this happens fallback to the old path\n                // without using extend.\n                // Similarly, this could crash on Safari if the editor is hidden, and\n                // there was no selection.\n            }\n        }\n        if (!domSelExtended) {\n            if (anchor > head) {\n                let tmp = anchorDOM;\n                anchorDOM = headDOM;\n                headDOM = tmp;\n            }\n            let range = document.createRange();\n            range.setEnd(headDOM.node, headDOM.offset);\n            range.setStart(anchorDOM.node, anchorDOM.offset);\n            domSel.removeAllRanges();\n            domSel.addRange(range);\n        }\n    }\n    ignoreMutation(mutation) {\n        return !this.contentDOM && mutation.type != \"selection\";\n    }\n    get contentLost() {\n        return this.contentDOM && this.contentDOM != this.dom && !this.dom.contains(this.contentDOM);\n    }\n    // Remove a subtree of the element tree that has been touched\n    // by a DOM change, so that the next update will redraw it.\n    markDirty(from, to) {\n        for (let offset = 0, i = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (offset == end ? from <= end && to >= offset : from < end && to > offset) {\n                let startInside = offset + child.border, endInside = end - child.border;\n                if (from >= startInside && to <= endInside) {\n                    this.dirty = from == offset || to == end ? CONTENT_DIRTY : CHILD_DIRTY;\n                    if (from == startInside && to == endInside &&\n                        (child.contentLost || child.dom.parentNode != this.contentDOM))\n                        child.dirty = NODE_DIRTY;\n                    else\n                        child.markDirty(from - startInside, to - startInside);\n                    return;\n                }\n                else {\n                    child.dirty = child.dom == child.contentDOM && child.dom.parentNode == this.contentDOM && !child.children.length\n                        ? CONTENT_DIRTY : NODE_DIRTY;\n                }\n            }\n            offset = end;\n        }\n        this.dirty = CONTENT_DIRTY;\n    }\n    markParentsDirty() {\n        let level = 1;\n        for (let node = this.parent; node; node = node.parent, level++) {\n            let dirty = level == 1 ? CONTENT_DIRTY : CHILD_DIRTY;\n            if (node.dirty < dirty)\n                node.dirty = dirty;\n        }\n    }\n    get domAtom() { return false; }\n    get ignoreForCoords() { return false; }\n    isText(text) { return false; }\n}\n// A widget desc represents a widget decoration, which is a DOM node\n// drawn between the document nodes.\nclass WidgetViewDesc extends ViewDesc {\n    constructor(parent, widget, view, pos) {\n        let self, dom = widget.type.toDOM;\n        if (typeof dom == \"function\")\n            dom = dom(view, () => {\n                if (!self)\n                    return pos;\n                if (self.parent)\n                    return self.parent.posBeforeChild(self);\n            });\n        if (!widget.type.spec.raw) {\n            if (dom.nodeType != 1) {\n                let wrap = document.createElement(\"span\");\n                wrap.appendChild(dom);\n                dom = wrap;\n            }\n            dom.contentEditable = \"false\";\n            dom.classList.add(\"ProseMirror-widget\");\n        }\n        super(parent, [], dom, null);\n        this.widget = widget;\n        this.widget = widget;\n        self = this;\n    }\n    matchesWidget(widget) {\n        return this.dirty == NOT_DIRTY && widget.type.eq(this.widget.type);\n    }\n    parseRule() { return { ignore: true }; }\n    stopEvent(event) {\n        let stop = this.widget.spec.stopEvent;\n        return stop ? stop(event) : false;\n    }\n    ignoreMutation(mutation) {\n        return mutation.type != \"selection\" || this.widget.spec.ignoreSelection;\n    }\n    destroy() {\n        this.widget.type.destroy(this.dom);\n        super.destroy();\n    }\n    get domAtom() { return true; }\n    get side() { return this.widget.type.side; }\n}\nclass CompositionViewDesc extends ViewDesc {\n    constructor(parent, dom, textDOM, text) {\n        super(parent, [], dom, null);\n        this.textDOM = textDOM;\n        this.text = text;\n    }\n    get size() { return this.text.length; }\n    localPosFromDOM(dom, offset) {\n        if (dom != this.textDOM)\n            return this.posAtStart + (offset ? this.size : 0);\n        return this.posAtStart + offset;\n    }\n    domFromPos(pos) {\n        return { node: this.textDOM, offset: pos };\n    }\n    ignoreMutation(mut) {\n        return mut.type === 'characterData' && mut.target.nodeValue == mut.oldValue;\n    }\n}\n// A mark desc represents a mark. May have multiple children,\n// depending on how the mark is split. Note that marks are drawn using\n// a fixed nesting order, for simplicity and predictability, so in\n// some cases they will be split more often than would appear\n// necessary.\nclass MarkViewDesc extends ViewDesc {\n    constructor(parent, mark, dom, contentDOM) {\n        super(parent, [], dom, contentDOM);\n        this.mark = mark;\n    }\n    static create(parent, mark, inline, view) {\n        let custom = view.nodeViews[mark.type.name];\n        let spec = custom && custom(mark, view, inline);\n        if (!spec || !spec.dom)\n            spec = DOMSerializer.renderSpec(document, mark.type.spec.toDOM(mark, inline));\n        return new MarkViewDesc(parent, mark, spec.dom, spec.contentDOM || spec.dom);\n    }\n    parseRule() {\n        if ((this.dirty & NODE_DIRTY) || this.mark.type.spec.reparseInView)\n            return null;\n        return { mark: this.mark.type.name, attrs: this.mark.attrs, contentElement: this.contentDOM };\n    }\n    matchesMark(mark) { return this.dirty != NODE_DIRTY && this.mark.eq(mark); }\n    markDirty(from, to) {\n        super.markDirty(from, to);\n        // Move dirty info to nearest node view\n        if (this.dirty != NOT_DIRTY) {\n            let parent = this.parent;\n            while (!parent.node)\n                parent = parent.parent;\n            if (parent.dirty < this.dirty)\n                parent.dirty = this.dirty;\n            this.dirty = NOT_DIRTY;\n        }\n    }\n    slice(from, to, view) {\n        let copy = MarkViewDesc.create(this.parent, this.mark, true, view);\n        let nodes = this.children, size = this.size;\n        if (to < size)\n            nodes = replaceNodes(nodes, to, size, view);\n        if (from > 0)\n            nodes = replaceNodes(nodes, 0, from, view);\n        for (let i = 0; i < nodes.length; i++)\n            nodes[i].parent = copy;\n        copy.children = nodes;\n        return copy;\n    }\n}\n// Node view descs are the main, most common type of view desc, and\n// correspond to an actual node in the document. Unlike mark descs,\n// they populate their child array themselves.\nclass NodeViewDesc extends ViewDesc {\n    constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos) {\n        super(parent, [], dom, contentDOM);\n        this.node = node;\n        this.outerDeco = outerDeco;\n        this.innerDeco = innerDeco;\n        this.nodeDOM = nodeDOM;\n    }\n    // By default, a node is rendered using the `toDOM` method from the\n    // node type spec. But client code can use the `nodeViews` spec to\n    // supply a custom node view, which can influence various aspects of\n    // the way the node works.\n    //\n    // (Using subclassing for this was intentionally decided against,\n    // since it'd require exposing a whole slew of finicky\n    // implementation details to the user code that they probably will\n    // never need.)\n    static create(parent, node, outerDeco, innerDeco, view, pos) {\n        let custom = view.nodeViews[node.type.name], descObj;\n        let spec = custom && custom(node, view, () => {\n            // (This is a function that allows the custom view to find its\n            // own position)\n            if (!descObj)\n                return pos;\n            if (descObj.parent)\n                return descObj.parent.posBeforeChild(descObj);\n        }, outerDeco, innerDeco);\n        let dom = spec && spec.dom, contentDOM = spec && spec.contentDOM;\n        if (node.isText) {\n            if (!dom)\n                dom = document.createTextNode(node.text);\n            else if (dom.nodeType != 3)\n                throw new RangeError(\"Text must be rendered as a DOM text node\");\n        }\n        else if (!dom) {\n            ({ dom, contentDOM } = DOMSerializer.renderSpec(document, node.type.spec.toDOM(node)));\n        }\n        if (!contentDOM && !node.isText && dom.nodeName != \"BR\") { // Chrome gets confused by <br contenteditable=false>\n            if (!dom.hasAttribute(\"contenteditable\"))\n                dom.contentEditable = \"false\";\n            if (node.type.spec.draggable)\n                dom.draggable = true;\n        }\n        let nodeDOM = dom;\n        dom = applyOuterDeco(dom, outerDeco, node);\n        if (spec)\n            return descObj = new CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, spec, view, pos + 1);\n        else if (node.isText)\n            return new TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM, view);\n        else\n            return new NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, view, pos + 1);\n    }\n    parseRule() {\n        // Experimental kludge to allow opt-in re-parsing of nodes\n        if (this.node.type.spec.reparseInView)\n            return null;\n        // FIXME the assumption that this can always return the current\n        // attrs means that if the user somehow manages to change the\n        // attrs in the dom, that won't be picked up. Not entirely sure\n        // whether this is a problem\n        let rule = { node: this.node.type.name, attrs: this.node.attrs };\n        if (this.node.type.whitespace == \"pre\")\n            rule.preserveWhitespace = \"full\";\n        if (!this.contentDOM) {\n            rule.getContent = () => this.node.content;\n        }\n        else if (!this.contentLost) {\n            rule.contentElement = this.contentDOM;\n        }\n        else {\n            // Chrome likes to randomly recreate parent nodes when\n            // backspacing things. When that happens, this tries to find the\n            // new parent.\n            for (let i = this.children.length - 1; i >= 0; i--) {\n                let child = this.children[i];\n                if (this.dom.contains(child.dom.parentNode)) {\n                    rule.contentElement = child.dom.parentNode;\n                    break;\n                }\n            }\n            if (!rule.contentElement)\n                rule.getContent = () => Fragment.empty;\n        }\n        return rule;\n    }\n    matchesNode(node, outerDeco, innerDeco) {\n        return this.dirty == NOT_DIRTY && node.eq(this.node) &&\n            sameOuterDeco(outerDeco, this.outerDeco) && innerDeco.eq(this.innerDeco);\n    }\n    get size() { return this.node.nodeSize; }\n    get border() { return this.node.isLeaf ? 0 : 1; }\n    // Syncs `this.children` to match `this.node.content` and the local\n    // decorations, possibly introducing nesting for marks. Then, in a\n    // separate step, syncs the DOM inside `this.contentDOM` to\n    // `this.children`.\n    updateChildren(view, pos) {\n        let inline = this.node.inlineContent, off = pos;\n        let composition = view.composing ? this.localCompositionInfo(view, pos) : null;\n        let localComposition = composition && composition.pos > -1 ? composition : null;\n        let compositionInChild = composition && composition.pos < 0;\n        let updater = new ViewTreeUpdater(this, localComposition && localComposition.node, view);\n        iterDeco(this.node, this.innerDeco, (widget, i, insideNode) => {\n            if (widget.spec.marks)\n                updater.syncToMarks(widget.spec.marks, inline, view);\n            else if (widget.type.side >= 0 && !insideNode)\n                updater.syncToMarks(i == this.node.childCount ? Mark.none : this.node.child(i).marks, inline, view);\n            // If the next node is a desc matching this widget, reuse it,\n            // otherwise insert the widget as a new view desc.\n            updater.placeWidget(widget, view, off);\n        }, (child, outerDeco, innerDeco, i) => {\n            // Make sure the wrapping mark descs match the node's marks.\n            updater.syncToMarks(child.marks, inline, view);\n            // Try several strategies for drawing this node\n            let compIndex;\n            if (updater.findNodeMatch(child, outerDeco, innerDeco, i)) ;\n            else if (compositionInChild && view.state.selection.from > off &&\n                view.state.selection.to < off + child.nodeSize &&\n                (compIndex = updater.findIndexWithChild(composition.node)) > -1 &&\n                updater.updateNodeAt(child, outerDeco, innerDeco, compIndex, view)) ;\n            else if (updater.updateNextNode(child, outerDeco, innerDeco, view, i, off)) ;\n            else {\n                // Add it as a new view\n                updater.addNode(child, outerDeco, innerDeco, view, off);\n            }\n            off += child.nodeSize;\n        });\n        // Drop all remaining descs after the current position.\n        updater.syncToMarks([], inline, view);\n        if (this.node.isTextblock)\n            updater.addTextblockHacks();\n        updater.destroyRest();\n        // Sync the DOM if anything changed\n        if (updater.changed || this.dirty == CONTENT_DIRTY) {\n            // May have to protect focused DOM from being changed if a composition is active\n            if (localComposition)\n                this.protectLocalComposition(view, localComposition);\n            renderDescs(this.contentDOM, this.children, view);\n            if (ios)\n                iosHacks(this.dom);\n        }\n    }\n    localCompositionInfo(view, pos) {\n        // Only do something if both the selection and a focused text node\n        // are inside of this node\n        let { from, to } = view.state.selection;\n        if (!(view.state.selection instanceof TextSelection) || from < pos || to > pos + this.node.content.size)\n            return null;\n        let textNode = view.input.compositionNode;\n        if (!textNode || !this.dom.contains(textNode.parentNode))\n            return null;\n        if (this.node.inlineContent) {\n            // Find the text in the focused node in the node, stop if it's not\n            // there (may have been modified through other means, in which\n            // case it should overwritten)\n            let text = textNode.nodeValue;\n            let textPos = findTextInFragment(this.node.content, text, from - pos, to - pos);\n            return textPos < 0 ? null : { node: textNode, pos: textPos, text };\n        }\n        else {\n            return { node: textNode, pos: -1, text: \"\" };\n        }\n    }\n    protectLocalComposition(view, { node, pos, text }) {\n        // The node is already part of a local view desc, leave it there\n        if (this.getDesc(node))\n            return;\n        // Create a composition view for the orphaned nodes\n        let topNode = node;\n        for (;; topNode = topNode.parentNode) {\n            if (topNode.parentNode == this.contentDOM)\n                break;\n            while (topNode.previousSibling)\n                topNode.parentNode.removeChild(topNode.previousSibling);\n            while (topNode.nextSibling)\n                topNode.parentNode.removeChild(topNode.nextSibling);\n            if (topNode.pmViewDesc)\n                topNode.pmViewDesc = undefined;\n        }\n        let desc = new CompositionViewDesc(this, topNode, node, text);\n        view.input.compositionNodes.push(desc);\n        // Patch up this.children to contain the composition view\n        this.children = replaceNodes(this.children, pos, pos + text.length, view, desc);\n    }\n    // If this desc must be updated to match the given node decoration,\n    // do so and return true.\n    update(node, outerDeco, innerDeco, view) {\n        if (this.dirty == NODE_DIRTY ||\n            !node.sameMarkup(this.node))\n            return false;\n        this.updateInner(node, outerDeco, innerDeco, view);\n        return true;\n    }\n    updateInner(node, outerDeco, innerDeco, view) {\n        this.updateOuterDeco(outerDeco);\n        this.node = node;\n        this.innerDeco = innerDeco;\n        if (this.contentDOM)\n            this.updateChildren(view, this.posAtStart);\n        this.dirty = NOT_DIRTY;\n    }\n    updateOuterDeco(outerDeco) {\n        if (sameOuterDeco(outerDeco, this.outerDeco))\n            return;\n        let needsWrap = this.nodeDOM.nodeType != 1;\n        let oldDOM = this.dom;\n        this.dom = patchOuterDeco(this.dom, this.nodeDOM, computeOuterDeco(this.outerDeco, this.node, needsWrap), computeOuterDeco(outerDeco, this.node, needsWrap));\n        if (this.dom != oldDOM) {\n            oldDOM.pmViewDesc = undefined;\n            this.dom.pmViewDesc = this;\n        }\n        this.outerDeco = outerDeco;\n    }\n    // Mark this node as being the selected node.\n    selectNode() {\n        if (this.nodeDOM.nodeType == 1)\n            this.nodeDOM.classList.add(\"ProseMirror-selectednode\");\n        if (this.contentDOM || !this.node.type.spec.draggable)\n            this.dom.draggable = true;\n    }\n    // Remove selected node marking from this node.\n    deselectNode() {\n        if (this.nodeDOM.nodeType == 1) {\n            this.nodeDOM.classList.remove(\"ProseMirror-selectednode\");\n            if (this.contentDOM || !this.node.type.spec.draggable)\n                this.dom.removeAttribute(\"draggable\");\n        }\n    }\n    get domAtom() { return this.node.isAtom; }\n}\n// Create a view desc for the top-level document node, to be exported\n// and used by the view class.\nfunction docViewDesc(doc, outerDeco, innerDeco, dom, view) {\n    applyOuterDeco(dom, outerDeco, doc);\n    let docView = new NodeViewDesc(undefined, doc, outerDeco, innerDeco, dom, dom, dom, view, 0);\n    if (docView.contentDOM)\n        docView.updateChildren(view, 0);\n    return docView;\n}\nclass TextViewDesc extends NodeViewDesc {\n    constructor(parent, node, outerDeco, innerDeco, dom, nodeDOM, view) {\n        super(parent, node, outerDeco, innerDeco, dom, null, nodeDOM, view, 0);\n    }\n    parseRule() {\n        let skip = this.nodeDOM.parentNode;\n        while (skip && skip != this.dom && !skip.pmIsDeco)\n            skip = skip.parentNode;\n        return { skip: (skip || true) };\n    }\n    update(node, outerDeco, innerDeco, view) {\n        if (this.dirty == NODE_DIRTY || (this.dirty != NOT_DIRTY && !this.inParent()) ||\n            !node.sameMarkup(this.node))\n            return false;\n        this.updateOuterDeco(outerDeco);\n        if ((this.dirty != NOT_DIRTY || node.text != this.node.text) && node.text != this.nodeDOM.nodeValue) {\n            this.nodeDOM.nodeValue = node.text;\n            if (view.trackWrites == this.nodeDOM)\n                view.trackWrites = null;\n        }\n        this.node = node;\n        this.dirty = NOT_DIRTY;\n        return true;\n    }\n    inParent() {\n        let parentDOM = this.parent.contentDOM;\n        for (let n = this.nodeDOM; n; n = n.parentNode)\n            if (n == parentDOM)\n                return true;\n        return false;\n    }\n    domFromPos(pos) {\n        return { node: this.nodeDOM, offset: pos };\n    }\n    localPosFromDOM(dom, offset, bias) {\n        if (dom == this.nodeDOM)\n            return this.posAtStart + Math.min(offset, this.node.text.length);\n        return super.localPosFromDOM(dom, offset, bias);\n    }\n    ignoreMutation(mutation) {\n        return mutation.type != \"characterData\" && mutation.type != \"selection\";\n    }\n    slice(from, to, view) {\n        let node = this.node.cut(from, to), dom = document.createTextNode(node.text);\n        return new TextViewDesc(this.parent, node, this.outerDeco, this.innerDeco, dom, dom, view);\n    }\n    markDirty(from, to) {\n        super.markDirty(from, to);\n        if (this.dom != this.nodeDOM && (from == 0 || to == this.nodeDOM.nodeValue.length))\n            this.dirty = NODE_DIRTY;\n    }\n    get domAtom() { return false; }\n    isText(text) { return this.node.text == text; }\n}\n// A dummy desc used to tag trailing BR or IMG nodes created to work\n// around contentEditable terribleness.\nclass TrailingHackViewDesc extends ViewDesc {\n    parseRule() { return { ignore: true }; }\n    matchesHack(nodeName) { return this.dirty == NOT_DIRTY && this.dom.nodeName == nodeName; }\n    get domAtom() { return true; }\n    get ignoreForCoords() { return this.dom.nodeName == \"IMG\"; }\n}\n// A separate subclass is used for customized node views, so that the\n// extra checks only have to be made for nodes that are actually\n// customized.\nclass CustomNodeViewDesc extends NodeViewDesc {\n    constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, spec, view, pos) {\n        super(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos);\n        this.spec = spec;\n    }\n    // A custom `update` method gets to decide whether the update goes\n    // through. If it does, and there's a `contentDOM` node, our logic\n    // updates the children.\n    update(node, outerDeco, innerDeco, view) {\n        if (this.dirty == NODE_DIRTY)\n            return false;\n        if (this.spec.update) {\n            let result = this.spec.update(node, outerDeco, innerDeco);\n            if (result)\n                this.updateInner(node, outerDeco, innerDeco, view);\n            return result;\n        }\n        else if (!this.contentDOM && !node.isLeaf) {\n            return false;\n        }\n        else {\n            return super.update(node, outerDeco, innerDeco, view);\n        }\n    }\n    selectNode() {\n        this.spec.selectNode ? this.spec.selectNode() : super.selectNode();\n    }\n    deselectNode() {\n        this.spec.deselectNode ? this.spec.deselectNode() : super.deselectNode();\n    }\n    setSelection(anchor, head, root, force) {\n        this.spec.setSelection ? this.spec.setSelection(anchor, head, root)\n            : super.setSelection(anchor, head, root, force);\n    }\n    destroy() {\n        if (this.spec.destroy)\n            this.spec.destroy();\n        super.destroy();\n    }\n    stopEvent(event) {\n        return this.spec.stopEvent ? this.spec.stopEvent(event) : false;\n    }\n    ignoreMutation(mutation) {\n        return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : super.ignoreMutation(mutation);\n    }\n}\n// Sync the content of the given DOM node with the nodes associated\n// with the given array of view descs, recursing into mark descs\n// because this should sync the subtree for a whole node at a time.\nfunction renderDescs(parentDOM, descs, view) {\n    let dom = parentDOM.firstChild, written = false;\n    for (let i = 0; i < descs.length; i++) {\n        let desc = descs[i], childDOM = desc.dom;\n        if (childDOM.parentNode == parentDOM) {\n            while (childDOM != dom) {\n                dom = rm(dom);\n                written = true;\n            }\n            dom = dom.nextSibling;\n        }\n        else {\n            written = true;\n            parentDOM.insertBefore(childDOM, dom);\n        }\n        if (desc instanceof MarkViewDesc) {\n            let pos = dom ? dom.previousSibling : parentDOM.lastChild;\n            renderDescs(desc.contentDOM, desc.children, view);\n            dom = pos ? pos.nextSibling : parentDOM.firstChild;\n        }\n    }\n    while (dom) {\n        dom = rm(dom);\n        written = true;\n    }\n    if (written && view.trackWrites == parentDOM)\n        view.trackWrites = null;\n}\nconst OuterDecoLevel = function (nodeName) {\n    if (nodeName)\n        this.nodeName = nodeName;\n};\nOuterDecoLevel.prototype = Object.create(null);\nconst noDeco = [new OuterDecoLevel];\nfunction computeOuterDeco(outerDeco, node, needsWrap) {\n    if (outerDeco.length == 0)\n        return noDeco;\n    let top = needsWrap ? noDeco[0] : new OuterDecoLevel, result = [top];\n    for (let i = 0; i < outerDeco.length; i++) {\n        let attrs = outerDeco[i].type.attrs;\n        if (!attrs)\n            continue;\n        if (attrs.nodeName)\n            result.push(top = new OuterDecoLevel(attrs.nodeName));\n        for (let name in attrs) {\n            let val = attrs[name];\n            if (val == null)\n                continue;\n            if (needsWrap && result.length == 1)\n                result.push(top = new OuterDecoLevel(node.isInline ? \"span\" : \"div\"));\n            if (name == \"class\")\n                top.class = (top.class ? top.class + \" \" : \"\") + val;\n            else if (name == \"style\")\n                top.style = (top.style ? top.style + \";\" : \"\") + val;\n            else if (name != \"nodeName\")\n                top[name] = val;\n        }\n    }\n    return result;\n}\nfunction patchOuterDeco(outerDOM, nodeDOM, prevComputed, curComputed) {\n    // Shortcut for trivial case\n    if (prevComputed == noDeco && curComputed == noDeco)\n        return nodeDOM;\n    let curDOM = nodeDOM;\n    for (let i = 0; i < curComputed.length; i++) {\n        let deco = curComputed[i], prev = prevComputed[i];\n        if (i) {\n            let parent;\n            if (prev && prev.nodeName == deco.nodeName && curDOM != outerDOM &&\n                (parent = curDOM.parentNode) && parent.nodeName.toLowerCase() == deco.nodeName) {\n                curDOM = parent;\n            }\n            else {\n                parent = document.createElement(deco.nodeName);\n                parent.pmIsDeco = true;\n                parent.appendChild(curDOM);\n                prev = noDeco[0];\n                curDOM = parent;\n            }\n        }\n        patchAttributes(curDOM, prev || noDeco[0], deco);\n    }\n    return curDOM;\n}\nfunction patchAttributes(dom, prev, cur) {\n    for (let name in prev)\n        if (name != \"class\" && name != \"style\" && name != \"nodeName\" && !(name in cur))\n            dom.removeAttribute(name);\n    for (let name in cur)\n        if (name != \"class\" && name != \"style\" && name != \"nodeName\" && cur[name] != prev[name])\n            dom.setAttribute(name, cur[name]);\n    if (prev.class != cur.class) {\n        let prevList = prev.class ? prev.class.split(\" \").filter(Boolean) : [];\n        let curList = cur.class ? cur.class.split(\" \").filter(Boolean) : [];\n        for (let i = 0; i < prevList.length; i++)\n            if (curList.indexOf(prevList[i]) == -1)\n                dom.classList.remove(prevList[i]);\n        for (let i = 0; i < curList.length; i++)\n            if (prevList.indexOf(curList[i]) == -1)\n                dom.classList.add(curList[i]);\n        if (dom.classList.length == 0)\n            dom.removeAttribute(\"class\");\n    }\n    if (prev.style != cur.style) {\n        if (prev.style) {\n            let prop = /\\s*([\\w\\-\\xa1-\\uffff]+)\\s*:(?:\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|\\(.*?\\)|[^;])*/g, m;\n            while (m = prop.exec(prev.style))\n                dom.style.removeProperty(m[1]);\n        }\n        if (cur.style)\n            dom.style.cssText += cur.style;\n    }\n}\nfunction applyOuterDeco(dom, deco, node) {\n    return patchOuterDeco(dom, dom, noDeco, computeOuterDeco(deco, node, dom.nodeType != 1));\n}\nfunction sameOuterDeco(a, b) {\n    if (a.length != b.length)\n        return false;\n    for (let i = 0; i < a.length; i++)\n        if (!a[i].type.eq(b[i].type))\n            return false;\n    return true;\n}\n// Remove a DOM node and return its next sibling.\nfunction rm(dom) {\n    let next = dom.nextSibling;\n    dom.parentNode.removeChild(dom);\n    return next;\n}\n// Helper class for incrementally updating a tree of mark descs and\n// the widget and node descs inside of them.\nclass ViewTreeUpdater {\n    constructor(top, lock, view) {\n        this.lock = lock;\n        this.view = view;\n        // Index into `this.top`'s child array, represents the current\n        // update position.\n        this.index = 0;\n        // When entering a mark, the current top and index are pushed\n        // onto this.\n        this.stack = [];\n        // Tracks whether anything was changed\n        this.changed = false;\n        this.top = top;\n        this.preMatch = preMatch(top.node.content, top);\n    }\n    // Destroy and remove the children between the given indices in\n    // `this.top`.\n    destroyBetween(start, end) {\n        if (start == end)\n            return;\n        for (let i = start; i < end; i++)\n            this.top.children[i].destroy();\n        this.top.children.splice(start, end - start);\n        this.changed = true;\n    }\n    // Destroy all remaining children in `this.top`.\n    destroyRest() {\n        this.destroyBetween(this.index, this.top.children.length);\n    }\n    // Sync the current stack of mark descs with the given array of\n    // marks, reusing existing mark descs when possible.\n    syncToMarks(marks, inline, view) {\n        let keep = 0, depth = this.stack.length >> 1;\n        let maxKeep = Math.min(depth, marks.length);\n        while (keep < maxKeep &&\n            (keep == depth - 1 ? this.top : this.stack[(keep + 1) << 1])\n                .matchesMark(marks[keep]) && marks[keep].type.spec.spanning !== false)\n            keep++;\n        while (keep < depth) {\n            this.destroyRest();\n            this.top.dirty = NOT_DIRTY;\n            this.index = this.stack.pop();\n            this.top = this.stack.pop();\n            depth--;\n        }\n        while (depth < marks.length) {\n            this.stack.push(this.top, this.index + 1);\n            let found = -1;\n            for (let i = this.index; i < Math.min(this.index + 3, this.top.children.length); i++) {\n                let next = this.top.children[i];\n                if (next.matchesMark(marks[depth]) && !this.isLocked(next.dom)) {\n                    found = i;\n                    break;\n                }\n            }\n            if (found > -1) {\n                if (found > this.index) {\n                    this.changed = true;\n                    this.destroyBetween(this.index, found);\n                }\n                this.top = this.top.children[this.index];\n            }\n            else {\n                let markDesc = MarkViewDesc.create(this.top, marks[depth], inline, view);\n                this.top.children.splice(this.index, 0, markDesc);\n                this.top = markDesc;\n                this.changed = true;\n            }\n            this.index = 0;\n            depth++;\n        }\n    }\n    // Try to find a node desc matching the given data. Skip over it and\n    // return true when successful.\n    findNodeMatch(node, outerDeco, innerDeco, index) {\n        let found = -1, targetDesc;\n        if (index >= this.preMatch.index &&\n            (targetDesc = this.preMatch.matches[index - this.preMatch.index]).parent == this.top &&\n            targetDesc.matchesNode(node, outerDeco, innerDeco)) {\n            found = this.top.children.indexOf(targetDesc, this.index);\n        }\n        else {\n            for (let i = this.index, e = Math.min(this.top.children.length, i + 5); i < e; i++) {\n                let child = this.top.children[i];\n                if (child.matchesNode(node, outerDeco, innerDeco) && !this.preMatch.matched.has(child)) {\n                    found = i;\n                    break;\n                }\n            }\n        }\n        if (found < 0)\n            return false;\n        this.destroyBetween(this.index, found);\n        this.index++;\n        return true;\n    }\n    updateNodeAt(node, outerDeco, innerDeco, index, view) {\n        let child = this.top.children[index];\n        if (child.dirty == NODE_DIRTY && child.dom == child.contentDOM)\n            child.dirty = CONTENT_DIRTY;\n        if (!child.update(node, outerDeco, innerDeco, view))\n            return false;\n        this.destroyBetween(this.index, index);\n        this.index++;\n        return true;\n    }\n    findIndexWithChild(domNode) {\n        for (;;) {\n            let parent = domNode.parentNode;\n            if (!parent)\n                return -1;\n            if (parent == this.top.contentDOM) {\n                let desc = domNode.pmViewDesc;\n                if (desc)\n                    for (let i = this.index; i < this.top.children.length; i++) {\n                        if (this.top.children[i] == desc)\n                            return i;\n                    }\n                return -1;\n            }\n            domNode = parent;\n        }\n    }\n    // Try to update the next node, if any, to the given data. Checks\n    // pre-matches to avoid overwriting nodes that could still be used.\n    updateNextNode(node, outerDeco, innerDeco, view, index, pos) {\n        for (let i = this.index; i < this.top.children.length; i++) {\n            let next = this.top.children[i];\n            if (next instanceof NodeViewDesc) {\n                let preMatch = this.preMatch.matched.get(next);\n                if (preMatch != null && preMatch != index)\n                    return false;\n                let nextDOM = next.dom, updated;\n                // Can't update if nextDOM is or contains this.lock, except if\n                // it's a text node whose content already matches the new text\n                // and whose decorations match the new ones.\n                let locked = this.isLocked(nextDOM) &&\n                    !(node.isText && next.node && next.node.isText && next.nodeDOM.nodeValue == node.text &&\n                        next.dirty != NODE_DIRTY && sameOuterDeco(outerDeco, next.outerDeco));\n                if (!locked && next.update(node, outerDeco, innerDeco, view)) {\n                    this.destroyBetween(this.index, i);\n                    if (next.dom != nextDOM)\n                        this.changed = true;\n                    this.index++;\n                    return true;\n                }\n                else if (!locked && (updated = this.recreateWrapper(next, node, outerDeco, innerDeco, view, pos))) {\n                    this.top.children[this.index] = updated;\n                    if (updated.contentDOM) {\n                        updated.dirty = CONTENT_DIRTY;\n                        updated.updateChildren(view, pos + 1);\n                        updated.dirty = NOT_DIRTY;\n                    }\n                    this.changed = true;\n                    this.index++;\n                    return true;\n                }\n                break;\n            }\n        }\n        return false;\n    }\n    // When a node with content is replaced by a different node with\n    // identical content, move over its children.\n    recreateWrapper(next, node, outerDeco, innerDeco, view, pos) {\n        if (next.dirty || node.isAtom || !next.children.length ||\n            !next.node.content.eq(node.content))\n            return null;\n        let wrapper = NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos);\n        if (wrapper.contentDOM) {\n            wrapper.children = next.children;\n            next.children = [];\n            for (let ch of wrapper.children)\n                ch.parent = wrapper;\n        }\n        next.destroy();\n        return wrapper;\n    }\n    // Insert the node as a newly created node desc.\n    addNode(node, outerDeco, innerDeco, view, pos) {\n        let desc = NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos);\n        if (desc.contentDOM)\n            desc.updateChildren(view, pos + 1);\n        this.top.children.splice(this.index++, 0, desc);\n        this.changed = true;\n    }\n    placeWidget(widget, view, pos) {\n        let next = this.index < this.top.children.length ? this.top.children[this.index] : null;\n        if (next && next.matchesWidget(widget) &&\n            (widget == next.widget || !next.widget.type.toDOM.parentNode)) {\n            this.index++;\n        }\n        else {\n            let desc = new WidgetViewDesc(this.top, widget, view, pos);\n            this.top.children.splice(this.index++, 0, desc);\n            this.changed = true;\n        }\n    }\n    // Make sure a textblock looks and behaves correctly in\n    // contentEditable.\n    addTextblockHacks() {\n        let lastChild = this.top.children[this.index - 1], parent = this.top;\n        while (lastChild instanceof MarkViewDesc) {\n            parent = lastChild;\n            lastChild = parent.children[parent.children.length - 1];\n        }\n        if (!lastChild || // Empty textblock\n            !(lastChild instanceof TextViewDesc) ||\n            /\\n$/.test(lastChild.node.text) ||\n            (this.view.requiresGeckoHackNode && /\\s$/.test(lastChild.node.text))) {\n            // Avoid bugs in Safari's cursor drawing (#1165) and Chrome's mouse selection (#1152)\n            if ((safari || chrome) && lastChild && lastChild.dom.contentEditable == \"false\")\n                this.addHackNode(\"IMG\", parent);\n            this.addHackNode(\"BR\", this.top);\n        }\n    }\n    addHackNode(nodeName, parent) {\n        if (parent == this.top && this.index < parent.children.length && parent.children[this.index].matchesHack(nodeName)) {\n            this.index++;\n        }\n        else {\n            let dom = document.createElement(nodeName);\n            if (nodeName == \"IMG\") {\n                dom.className = \"ProseMirror-separator\";\n                dom.alt = \"\";\n            }\n            if (nodeName == \"BR\")\n                dom.className = \"ProseMirror-trailingBreak\";\n            let hack = new TrailingHackViewDesc(this.top, [], dom, null);\n            if (parent != this.top)\n                parent.children.push(hack);\n            else\n                parent.children.splice(this.index++, 0, hack);\n            this.changed = true;\n        }\n    }\n    isLocked(node) {\n        return this.lock && (node == this.lock || node.nodeType == 1 && node.contains(this.lock.parentNode));\n    }\n}\n// Iterate from the end of the fragment and array of descs to find\n// directly matching ones, in order to avoid overeagerly reusing those\n// for other nodes. Returns the fragment index of the first node that\n// is part of the sequence of matched nodes at the end of the\n// fragment.\nfunction preMatch(frag, parentDesc) {\n    let curDesc = parentDesc, descI = curDesc.children.length;\n    let fI = frag.childCount, matched = new Map, matches = [];\n    outer: while (fI > 0) {\n        let desc;\n        for (;;) {\n            if (descI) {\n                let next = curDesc.children[descI - 1];\n                if (next instanceof MarkViewDesc) {\n                    curDesc = next;\n                    descI = next.children.length;\n                }\n                else {\n                    desc = next;\n                    descI--;\n                    break;\n                }\n            }\n            else if (curDesc == parentDesc) {\n                break outer;\n            }\n            else {\n                // FIXME\n                descI = curDesc.parent.children.indexOf(curDesc);\n                curDesc = curDesc.parent;\n            }\n        }\n        let node = desc.node;\n        if (!node)\n            continue;\n        if (node != frag.child(fI - 1))\n            break;\n        --fI;\n        matched.set(desc, fI);\n        matches.push(desc);\n    }\n    return { index: fI, matched, matches: matches.reverse() };\n}\nfunction compareSide(a, b) {\n    return a.type.side - b.type.side;\n}\n// This function abstracts iterating over the nodes and decorations in\n// a fragment. Calls `onNode` for each node, with its local and child\n// decorations. Splits text nodes when there is a decoration starting\n// or ending inside of them. Calls `onWidget` for each widget.\nfunction iterDeco(parent, deco, onWidget, onNode) {\n    let locals = deco.locals(parent), offset = 0;\n    // Simple, cheap variant for when there are no local decorations\n    if (locals.length == 0) {\n        for (let i = 0; i < parent.childCount; i++) {\n            let child = parent.child(i);\n            onNode(child, locals, deco.forChild(offset, child), i);\n            offset += child.nodeSize;\n        }\n        return;\n    }\n    let decoIndex = 0, active = [], restNode = null;\n    for (let parentIndex = 0;;) {\n        let widget, widgets;\n        while (decoIndex < locals.length && locals[decoIndex].to == offset) {\n            let next = locals[decoIndex++];\n            if (next.widget) {\n                if (!widget)\n                    widget = next;\n                else\n                    (widgets || (widgets = [widget])).push(next);\n            }\n        }\n        if (widget) {\n            if (widgets) {\n                widgets.sort(compareSide);\n                for (let i = 0; i < widgets.length; i++)\n                    onWidget(widgets[i], parentIndex, !!restNode);\n            }\n            else {\n                onWidget(widget, parentIndex, !!restNode);\n            }\n        }\n        let child, index;\n        if (restNode) {\n            index = -1;\n            child = restNode;\n            restNode = null;\n        }\n        else if (parentIndex < parent.childCount) {\n            index = parentIndex;\n            child = parent.child(parentIndex++);\n        }\n        else {\n            break;\n        }\n        for (let i = 0; i < active.length; i++)\n            if (active[i].to <= offset)\n                active.splice(i--, 1);\n        while (decoIndex < locals.length && locals[decoIndex].from <= offset && locals[decoIndex].to > offset)\n            active.push(locals[decoIndex++]);\n        let end = offset + child.nodeSize;\n        if (child.isText) {\n            let cutAt = end;\n            if (decoIndex < locals.length && locals[decoIndex].from < cutAt)\n                cutAt = locals[decoIndex].from;\n            for (let i = 0; i < active.length; i++)\n                if (active[i].to < cutAt)\n                    cutAt = active[i].to;\n            if (cutAt < end) {\n                restNode = child.cut(cutAt - offset);\n                child = child.cut(0, cutAt - offset);\n                end = cutAt;\n                index = -1;\n            }\n        }\n        else {\n            while (decoIndex < locals.length && locals[decoIndex].to < end)\n                decoIndex++;\n        }\n        let outerDeco = child.isInline && !child.isLeaf ? active.filter(d => !d.inline) : active.slice();\n        onNode(child, outerDeco, deco.forChild(offset, child), index);\n        offset = end;\n    }\n}\n// List markers in Mobile Safari will mysteriously disappear\n// sometimes. This works around that.\nfunction iosHacks(dom) {\n    if (dom.nodeName == \"UL\" || dom.nodeName == \"OL\") {\n        let oldCSS = dom.style.cssText;\n        dom.style.cssText = oldCSS + \"; list-style: square !important\";\n        window.getComputedStyle(dom).listStyle;\n        dom.style.cssText = oldCSS;\n    }\n}\n// Find a piece of text in an inline fragment, overlapping from-to\nfunction findTextInFragment(frag, text, from, to) {\n    for (let i = 0, pos = 0; i < frag.childCount && pos <= to;) {\n        let child = frag.child(i++), childStart = pos;\n        pos += child.nodeSize;\n        if (!child.isText)\n            continue;\n        let str = child.text;\n        while (i < frag.childCount) {\n            let next = frag.child(i++);\n            pos += next.nodeSize;\n            if (!next.isText)\n                break;\n            str += next.text;\n        }\n        if (pos >= from) {\n            if (pos >= to && str.slice(to - text.length - childStart, to - childStart) == text)\n                return to - text.length;\n            let found = childStart < to ? str.lastIndexOf(text, to - childStart - 1) : -1;\n            if (found >= 0 && found + text.length + childStart >= from)\n                return childStart + found;\n            if (from == to && str.length >= (to + text.length) - childStart &&\n                str.slice(to - childStart, to - childStart + text.length) == text)\n                return to;\n        }\n    }\n    return -1;\n}\n// Replace range from-to in an array of view descs with replacement\n// (may be null to just delete). This goes very much against the grain\n// of the rest of this code, which tends to create nodes with the\n// right shape in one go, rather than messing with them after\n// creation, but is necessary in the composition hack.\nfunction replaceNodes(nodes, from, to, view, replacement) {\n    let result = [];\n    for (let i = 0, off = 0; i < nodes.length; i++) {\n        let child = nodes[i], start = off, end = off += child.size;\n        if (start >= to || end <= from) {\n            result.push(child);\n        }\n        else {\n            if (start < from)\n                result.push(child.slice(0, from - start, view));\n            if (replacement) {\n                result.push(replacement);\n                replacement = undefined;\n            }\n            if (end > to)\n                result.push(child.slice(to - start, child.size, view));\n        }\n    }\n    return result;\n}\n\nfunction selectionFromDOM(view, origin = null) {\n    let domSel = view.domSelectionRange(), doc = view.state.doc;\n    if (!domSel.focusNode)\n        return null;\n    let nearestDesc = view.docView.nearestDesc(domSel.focusNode), inWidget = nearestDesc && nearestDesc.size == 0;\n    let head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset, 1);\n    if (head < 0)\n        return null;\n    let $head = doc.resolve(head), $anchor, selection;\n    if (selectionCollapsed(domSel)) {\n        $anchor = $head;\n        while (nearestDesc && !nearestDesc.node)\n            nearestDesc = nearestDesc.parent;\n        let nearestDescNode = nearestDesc.node;\n        if (nearestDesc && nearestDescNode.isAtom && NodeSelection.isSelectable(nearestDescNode) && nearestDesc.parent\n            && !(nearestDescNode.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {\n            let pos = nearestDesc.posBefore;\n            selection = new NodeSelection(head == pos ? $head : doc.resolve(pos));\n        }\n    }\n    else {\n        let anchor = view.docView.posFromDOM(domSel.anchorNode, domSel.anchorOffset, 1);\n        if (anchor < 0)\n            return null;\n        $anchor = doc.resolve(anchor);\n    }\n    if (!selection) {\n        let bias = origin == \"pointer\" || (view.state.selection.head < $head.pos && !inWidget) ? 1 : -1;\n        selection = selectionBetween(view, $anchor, $head, bias);\n    }\n    return selection;\n}\nfunction editorOwnsSelection(view) {\n    return view.editable ? view.hasFocus() :\n        hasSelection(view) && document.activeElement && document.activeElement.contains(view.dom);\n}\nfunction selectionToDOM(view, force = false) {\n    let sel = view.state.selection;\n    syncNodeSelection(view, sel);\n    if (!editorOwnsSelection(view))\n        return;\n    // The delayed drag selection causes issues with Cell Selections\n    // in Safari. And the drag selection delay is to workarond issues\n    // which only present in Chrome.\n    if (!force && view.input.mouseDown && view.input.mouseDown.allowDefault && chrome) {\n        let domSel = view.domSelectionRange(), curSel = view.domObserver.currentSelection;\n        if (domSel.anchorNode && curSel.anchorNode &&\n            isEquivalentPosition(domSel.anchorNode, domSel.anchorOffset, curSel.anchorNode, curSel.anchorOffset)) {\n            view.input.mouseDown.delayedSelectionSync = true;\n            view.domObserver.setCurSelection();\n            return;\n        }\n    }\n    view.domObserver.disconnectSelection();\n    if (view.cursorWrapper) {\n        selectCursorWrapper(view);\n    }\n    else {\n        let { anchor, head } = sel, resetEditableFrom, resetEditableTo;\n        if (brokenSelectBetweenUneditable && !(sel instanceof TextSelection)) {\n            if (!sel.$from.parent.inlineContent)\n                resetEditableFrom = temporarilyEditableNear(view, sel.from);\n            if (!sel.empty && !sel.$from.parent.inlineContent)\n                resetEditableTo = temporarilyEditableNear(view, sel.to);\n        }\n        view.docView.setSelection(anchor, head, view.root, force);\n        if (brokenSelectBetweenUneditable) {\n            if (resetEditableFrom)\n                resetEditable(resetEditableFrom);\n            if (resetEditableTo)\n                resetEditable(resetEditableTo);\n        }\n        if (sel.visible) {\n            view.dom.classList.remove(\"ProseMirror-hideselection\");\n        }\n        else {\n            view.dom.classList.add(\"ProseMirror-hideselection\");\n            if (\"onselectionchange\" in document)\n                removeClassOnSelectionChange(view);\n        }\n    }\n    view.domObserver.setCurSelection();\n    view.domObserver.connectSelection();\n}\n// Kludge to work around Webkit not allowing a selection to start/end\n// between non-editable block nodes. We briefly make something\n// editable, set the selection, then set it uneditable again.\nconst brokenSelectBetweenUneditable = safari || chrome && chrome_version < 63;\nfunction temporarilyEditableNear(view, pos) {\n    let { node, offset } = view.docView.domFromPos(pos, 0);\n    let after = offset < node.childNodes.length ? node.childNodes[offset] : null;\n    let before = offset ? node.childNodes[offset - 1] : null;\n    if (safari && after && after.contentEditable == \"false\")\n        return setEditable(after);\n    if ((!after || after.contentEditable == \"false\") &&\n        (!before || before.contentEditable == \"false\")) {\n        if (after)\n            return setEditable(after);\n        else if (before)\n            return setEditable(before);\n    }\n}\nfunction setEditable(element) {\n    element.contentEditable = \"true\";\n    if (safari && element.draggable) {\n        element.draggable = false;\n        element.wasDraggable = true;\n    }\n    return element;\n}\nfunction resetEditable(element) {\n    element.contentEditable = \"false\";\n    if (element.wasDraggable) {\n        element.draggable = true;\n        element.wasDraggable = null;\n    }\n}\nfunction removeClassOnSelectionChange(view) {\n    let doc = view.dom.ownerDocument;\n    doc.removeEventListener(\"selectionchange\", view.input.hideSelectionGuard);\n    let domSel = view.domSelectionRange();\n    let node = domSel.anchorNode, offset = domSel.anchorOffset;\n    doc.addEventListener(\"selectionchange\", view.input.hideSelectionGuard = () => {\n        if (domSel.anchorNode != node || domSel.anchorOffset != offset) {\n            doc.removeEventListener(\"selectionchange\", view.input.hideSelectionGuard);\n            setTimeout(() => {\n                if (!editorOwnsSelection(view) || view.state.selection.visible)\n                    view.dom.classList.remove(\"ProseMirror-hideselection\");\n            }, 20);\n        }\n    });\n}\nfunction selectCursorWrapper(view) {\n    let domSel = view.domSelection(), range = document.createRange();\n    let node = view.cursorWrapper.dom, img = node.nodeName == \"IMG\";\n    if (img)\n        range.setEnd(node.parentNode, domIndex(node) + 1);\n    else\n        range.setEnd(node, 0);\n    range.collapse(false);\n    domSel.removeAllRanges();\n    domSel.addRange(range);\n    // Kludge to kill 'control selection' in IE11 when selecting an\n    // invisible cursor wrapper, since that would result in those weird\n    // resize handles and a selection that considers the absolutely\n    // positioned wrapper, rather than the root editable node, the\n    // focused element.\n    if (!img && !view.state.selection.visible && ie && ie_version <= 11) {\n        node.disabled = true;\n        node.disabled = false;\n    }\n}\nfunction syncNodeSelection(view, sel) {\n    if (sel instanceof NodeSelection) {\n        let desc = view.docView.descAt(sel.from);\n        if (desc != view.lastSelectedViewDesc) {\n            clearNodeSelection(view);\n            if (desc)\n                desc.selectNode();\n            view.lastSelectedViewDesc = desc;\n        }\n    }\n    else {\n        clearNodeSelection(view);\n    }\n}\n// Clear all DOM statefulness of the last node selection.\nfunction clearNodeSelection(view) {\n    if (view.lastSelectedViewDesc) {\n        if (view.lastSelectedViewDesc.parent)\n            view.lastSelectedViewDesc.deselectNode();\n        view.lastSelectedViewDesc = undefined;\n    }\n}\nfunction selectionBetween(view, $anchor, $head, bias) {\n    return view.someProp(\"createSelectionBetween\", f => f(view, $anchor, $head))\n        || TextSelection.between($anchor, $head, bias);\n}\nfunction hasFocusAndSelection(view) {\n    if (view.editable && !view.hasFocus())\n        return false;\n    return hasSelection(view);\n}\nfunction hasSelection(view) {\n    let sel = view.domSelectionRange();\n    if (!sel.anchorNode)\n        return false;\n    try {\n        // Firefox will raise 'permission denied' errors when accessing\n        // properties of `sel.anchorNode` when it's in a generated CSS\n        // element.\n        return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) &&\n            (view.editable || view.dom.contains(sel.focusNode.nodeType == 3 ? sel.focusNode.parentNode : sel.focusNode));\n    }\n    catch (_) {\n        return false;\n    }\n}\nfunction anchorInRightPlace(view) {\n    let anchorDOM = view.docView.domFromPos(view.state.selection.anchor, 0);\n    let domSel = view.domSelectionRange();\n    return isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset);\n}\n\nfunction moveSelectionBlock(state, dir) {\n    let { $anchor, $head } = state.selection;\n    let $side = dir > 0 ? $anchor.max($head) : $anchor.min($head);\n    let $start = !$side.parent.inlineContent ? $side : $side.depth ? state.doc.resolve(dir > 0 ? $side.after() : $side.before()) : null;\n    return $start && Selection.findFrom($start, dir);\n}\nfunction apply(view, sel) {\n    view.dispatch(view.state.tr.setSelection(sel).scrollIntoView());\n    return true;\n}\nfunction selectHorizontally(view, dir, mods) {\n    let sel = view.state.selection;\n    if (sel instanceof TextSelection) {\n        if (mods.indexOf(\"s\") > -1) {\n            let { $head } = sel, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter;\n            if (!node || node.isText || !node.isLeaf)\n                return false;\n            let $newHead = view.state.doc.resolve($head.pos + node.nodeSize * (dir < 0 ? -1 : 1));\n            return apply(view, new TextSelection(sel.$anchor, $newHead));\n        }\n        else if (!sel.empty) {\n            return false;\n        }\n        else if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\")) {\n            let next = moveSelectionBlock(view.state, dir);\n            if (next && (next instanceof NodeSelection))\n                return apply(view, next);\n            return false;\n        }\n        else if (!(mac && mods.indexOf(\"m\") > -1)) {\n            let $head = sel.$head, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter, desc;\n            if (!node || node.isText)\n                return false;\n            let nodePos = dir < 0 ? $head.pos - node.nodeSize : $head.pos;\n            if (!(node.isAtom || (desc = view.docView.descAt(nodePos)) && !desc.contentDOM))\n                return false;\n            if (NodeSelection.isSelectable(node)) {\n                return apply(view, new NodeSelection(dir < 0 ? view.state.doc.resolve($head.pos - node.nodeSize) : $head));\n            }\n            else if (webkit) {\n                // Chrome and Safari will introduce extra pointless cursor\n                // positions around inline uneditable nodes, so we have to\n                // take over and move the cursor past them (#937)\n                return apply(view, new TextSelection(view.state.doc.resolve(dir < 0 ? nodePos : nodePos + node.nodeSize)));\n            }\n            else {\n                return false;\n            }\n        }\n    }\n    else if (sel instanceof NodeSelection && sel.node.isInline) {\n        return apply(view, new TextSelection(dir > 0 ? sel.$to : sel.$from));\n    }\n    else {\n        let next = moveSelectionBlock(view.state, dir);\n        if (next)\n            return apply(view, next);\n        return false;\n    }\n}\nfunction nodeLen(node) {\n    return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;\n}\nfunction isIgnorable(dom, dir) {\n    let desc = dom.pmViewDesc;\n    return desc && desc.size == 0 && (dir < 0 || dom.nextSibling || dom.nodeName != \"BR\");\n}\nfunction skipIgnoredNodes(view, dir) {\n    return dir < 0 ? skipIgnoredNodesBefore(view) : skipIgnoredNodesAfter(view);\n}\n// Make sure the cursor isn't directly after one or more ignored\n// nodes, which will confuse the browser's cursor motion logic.\nfunction skipIgnoredNodesBefore(view) {\n    let sel = view.domSelectionRange();\n    let node = sel.focusNode, offset = sel.focusOffset;\n    if (!node)\n        return;\n    let moveNode, moveOffset, force = false;\n    // Gecko will do odd things when the selection is directly in front\n    // of a non-editable node, so in that case, move it into the next\n    // node if possible. Issue prosemirror/prosemirror#832.\n    if (gecko && node.nodeType == 1 && offset < nodeLen(node) && isIgnorable(node.childNodes[offset], -1))\n        force = true;\n    for (;;) {\n        if (offset > 0) {\n            if (node.nodeType != 1) {\n                break;\n            }\n            else {\n                let before = node.childNodes[offset - 1];\n                if (isIgnorable(before, -1)) {\n                    moveNode = node;\n                    moveOffset = --offset;\n                }\n                else if (before.nodeType == 3) {\n                    node = before;\n                    offset = node.nodeValue.length;\n                }\n                else\n                    break;\n            }\n        }\n        else if (isBlockNode(node)) {\n            break;\n        }\n        else {\n            let prev = node.previousSibling;\n            while (prev && isIgnorable(prev, -1)) {\n                moveNode = node.parentNode;\n                moveOffset = domIndex(prev);\n                prev = prev.previousSibling;\n            }\n            if (!prev) {\n                node = node.parentNode;\n                if (node == view.dom)\n                    break;\n                offset = 0;\n            }\n            else {\n                node = prev;\n                offset = nodeLen(node);\n            }\n        }\n    }\n    if (force)\n        setSelFocus(view, node, offset);\n    else if (moveNode)\n        setSelFocus(view, moveNode, moveOffset);\n}\n// Make sure the cursor isn't directly before one or more ignored\n// nodes.\nfunction skipIgnoredNodesAfter(view) {\n    let sel = view.domSelectionRange();\n    let node = sel.focusNode, offset = sel.focusOffset;\n    if (!node)\n        return;\n    let len = nodeLen(node);\n    let moveNode, moveOffset;\n    for (;;) {\n        if (offset < len) {\n            if (node.nodeType != 1)\n                break;\n            let after = node.childNodes[offset];\n            if (isIgnorable(after, 1)) {\n                moveNode = node;\n                moveOffset = ++offset;\n            }\n            else\n                break;\n        }\n        else if (isBlockNode(node)) {\n            break;\n        }\n        else {\n            let next = node.nextSibling;\n            while (next && isIgnorable(next, 1)) {\n                moveNode = next.parentNode;\n                moveOffset = domIndex(next) + 1;\n                next = next.nextSibling;\n            }\n            if (!next) {\n                node = node.parentNode;\n                if (node == view.dom)\n                    break;\n                offset = len = 0;\n            }\n            else {\n                node = next;\n                offset = 0;\n                len = nodeLen(node);\n            }\n        }\n    }\n    if (moveNode)\n        setSelFocus(view, moveNode, moveOffset);\n}\nfunction isBlockNode(dom) {\n    let desc = dom.pmViewDesc;\n    return desc && desc.node && desc.node.isBlock;\n}\nfunction textNodeAfter(node, offset) {\n    while (node && offset == node.childNodes.length && !hasBlockDesc(node)) {\n        offset = domIndex(node) + 1;\n        node = node.parentNode;\n    }\n    while (node && offset < node.childNodes.length) {\n        let next = node.childNodes[offset];\n        if (next.nodeType == 3)\n            return next;\n        if (next.nodeType == 1 && next.contentEditable == \"false\")\n            break;\n        node = next;\n        offset = 0;\n    }\n}\nfunction textNodeBefore(node, offset) {\n    while (node && !offset && !hasBlockDesc(node)) {\n        offset = domIndex(node);\n        node = node.parentNode;\n    }\n    while (node && offset) {\n        let next = node.childNodes[offset - 1];\n        if (next.nodeType == 3)\n            return next;\n        if (next.nodeType == 1 && next.contentEditable == \"false\")\n            break;\n        node = next;\n        offset = node.childNodes.length;\n    }\n}\nfunction setSelFocus(view, node, offset) {\n    if (node.nodeType != 3) {\n        let before, after;\n        if (after = textNodeAfter(node, offset)) {\n            node = after;\n            offset = 0;\n        }\n        else if (before = textNodeBefore(node, offset)) {\n            node = before;\n            offset = before.nodeValue.length;\n        }\n    }\n    let sel = view.domSelection();\n    if (selectionCollapsed(sel)) {\n        let range = document.createRange();\n        range.setEnd(node, offset);\n        range.setStart(node, offset);\n        sel.removeAllRanges();\n        sel.addRange(range);\n    }\n    else if (sel.extend) {\n        sel.extend(node, offset);\n    }\n    view.domObserver.setCurSelection();\n    let { state } = view;\n    // If no state update ends up happening, reset the selection.\n    setTimeout(() => {\n        if (view.state == state)\n            selectionToDOM(view);\n    }, 50);\n}\nfunction findDirection(view, pos) {\n    let $pos = view.state.doc.resolve(pos);\n    if (!(chrome || windows) && $pos.parent.inlineContent) {\n        let coords = view.coordsAtPos(pos);\n        if (pos > $pos.start()) {\n            let before = view.coordsAtPos(pos - 1);\n            let mid = (before.top + before.bottom) / 2;\n            if (mid > coords.top && mid < coords.bottom && Math.abs(before.left - coords.left) > 1)\n                return before.left < coords.left ? \"ltr\" : \"rtl\";\n        }\n        if (pos < $pos.end()) {\n            let after = view.coordsAtPos(pos + 1);\n            let mid = (after.top + after.bottom) / 2;\n            if (mid > coords.top && mid < coords.bottom && Math.abs(after.left - coords.left) > 1)\n                return after.left > coords.left ? \"ltr\" : \"rtl\";\n        }\n    }\n    let computed = getComputedStyle(view.dom).direction;\n    return computed == \"rtl\" ? \"rtl\" : \"ltr\";\n}\n// Check whether vertical selection motion would involve node\n// selections. If so, apply it (if not, the result is left to the\n// browser)\nfunction selectVertically(view, dir, mods) {\n    let sel = view.state.selection;\n    if (sel instanceof TextSelection && !sel.empty || mods.indexOf(\"s\") > -1)\n        return false;\n    if (mac && mods.indexOf(\"m\") > -1)\n        return false;\n    let { $from, $to } = sel;\n    if (!$from.parent.inlineContent || view.endOfTextblock(dir < 0 ? \"up\" : \"down\")) {\n        let next = moveSelectionBlock(view.state, dir);\n        if (next && (next instanceof NodeSelection))\n            return apply(view, next);\n    }\n    if (!$from.parent.inlineContent) {\n        let side = dir < 0 ? $from : $to;\n        let beyond = sel instanceof AllSelection ? Selection.near(side, dir) : Selection.findFrom(side, dir);\n        return beyond ? apply(view, beyond) : false;\n    }\n    return false;\n}\nfunction stopNativeHorizontalDelete(view, dir) {\n    if (!(view.state.selection instanceof TextSelection))\n        return true;\n    let { $head, $anchor, empty } = view.state.selection;\n    if (!$head.sameParent($anchor))\n        return true;\n    if (!empty)\n        return false;\n    if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\"))\n        return true;\n    let nextNode = !$head.textOffset && (dir < 0 ? $head.nodeBefore : $head.nodeAfter);\n    if (nextNode && !nextNode.isText) {\n        let tr = view.state.tr;\n        if (dir < 0)\n            tr.delete($head.pos - nextNode.nodeSize, $head.pos);\n        else\n            tr.delete($head.pos, $head.pos + nextNode.nodeSize);\n        view.dispatch(tr);\n        return true;\n    }\n    return false;\n}\nfunction switchEditable(view, node, state) {\n    view.domObserver.stop();\n    node.contentEditable = state;\n    view.domObserver.start();\n}\n// Issue #867 / #1090 / https://bugs.chromium.org/p/chromium/issues/detail?id=903821\n// In which Safari (and at some point in the past, Chrome) does really\n// wrong things when the down arrow is pressed when the cursor is\n// directly at the start of a textblock and has an uneditable node\n// after it\nfunction safariDownArrowBug(view) {\n    if (!safari || view.state.selection.$head.parentOffset > 0)\n        return false;\n    let { focusNode, focusOffset } = view.domSelectionRange();\n    if (focusNode && focusNode.nodeType == 1 && focusOffset == 0 &&\n        focusNode.firstChild && focusNode.firstChild.contentEditable == \"false\") {\n        let child = focusNode.firstChild;\n        switchEditable(view, child, \"true\");\n        setTimeout(() => switchEditable(view, child, \"false\"), 20);\n    }\n    return false;\n}\n// A backdrop key mapping used to make sure we always suppress keys\n// that have a dangerous default effect, even if the commands they are\n// bound to return false, and to make sure that cursor-motion keys\n// find a cursor (as opposed to a node selection) when pressed. For\n// cursor-motion keys, the code in the handlers also takes care of\n// block selections.\nfunction getMods(event) {\n    let result = \"\";\n    if (event.ctrlKey)\n        result += \"c\";\n    if (event.metaKey)\n        result += \"m\";\n    if (event.altKey)\n        result += \"a\";\n    if (event.shiftKey)\n        result += \"s\";\n    return result;\n}\nfunction captureKeyDown(view, event) {\n    let code = event.keyCode, mods = getMods(event);\n    if (code == 8 || (mac && code == 72 && mods == \"c\")) { // Backspace, Ctrl-h on Mac\n        return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodes(view, -1);\n    }\n    else if ((code == 46 && !event.shiftKey) || (mac && code == 68 && mods == \"c\")) { // Delete, Ctrl-d on Mac\n        return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodes(view, 1);\n    }\n    else if (code == 13 || code == 27) { // Enter, Esc\n        return true;\n    }\n    else if (code == 37 || (mac && code == 66 && mods == \"c\")) { // Left arrow, Ctrl-b on Mac\n        let dir = code == 37 ? (findDirection(view, view.state.selection.from) == \"ltr\" ? -1 : 1) : -1;\n        return selectHorizontally(view, dir, mods) || skipIgnoredNodes(view, dir);\n    }\n    else if (code == 39 || (mac && code == 70 && mods == \"c\")) { // Right arrow, Ctrl-f on Mac\n        let dir = code == 39 ? (findDirection(view, view.state.selection.from) == \"ltr\" ? 1 : -1) : 1;\n        return selectHorizontally(view, dir, mods) || skipIgnoredNodes(view, dir);\n    }\n    else if (code == 38 || (mac && code == 80 && mods == \"c\")) { // Up arrow, Ctrl-p on Mac\n        return selectVertically(view, -1, mods) || skipIgnoredNodes(view, -1);\n    }\n    else if (code == 40 || (mac && code == 78 && mods == \"c\")) { // Down arrow, Ctrl-n on Mac\n        return safariDownArrowBug(view) || selectVertically(view, 1, mods) || skipIgnoredNodes(view, 1);\n    }\n    else if (mods == (mac ? \"m\" : \"c\") &&\n        (code == 66 || code == 73 || code == 89 || code == 90)) { // Mod-[biyz]\n        return true;\n    }\n    return false;\n}\n\nfunction serializeForClipboard(view, slice) {\n    view.someProp(\"transformCopied\", f => { slice = f(slice, view); });\n    let context = [], { content, openStart, openEnd } = slice;\n    while (openStart > 1 && openEnd > 1 && content.childCount == 1 && content.firstChild.childCount == 1) {\n        openStart--;\n        openEnd--;\n        let node = content.firstChild;\n        context.push(node.type.name, node.attrs != node.type.defaultAttrs ? node.attrs : null);\n        content = node.content;\n    }\n    let serializer = view.someProp(\"clipboardSerializer\") || DOMSerializer.fromSchema(view.state.schema);\n    let doc = detachedDoc(), wrap = doc.createElement(\"div\");\n    wrap.appendChild(serializer.serializeFragment(content, { document: doc }));\n    let firstChild = wrap.firstChild, needsWrap, wrappers = 0;\n    while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) {\n        for (let i = needsWrap.length - 1; i >= 0; i--) {\n            let wrapper = doc.createElement(needsWrap[i]);\n            while (wrap.firstChild)\n                wrapper.appendChild(wrap.firstChild);\n            wrap.appendChild(wrapper);\n            wrappers++;\n        }\n        firstChild = wrap.firstChild;\n    }\n    if (firstChild && firstChild.nodeType == 1)\n        firstChild.setAttribute(\"data-pm-slice\", `${openStart} ${openEnd}${wrappers ? ` -${wrappers}` : \"\"} ${JSON.stringify(context)}`);\n    let text = view.someProp(\"clipboardTextSerializer\", f => f(slice, view)) ||\n        slice.content.textBetween(0, slice.content.size, \"\\n\\n\");\n    return { dom: wrap, text, slice };\n}\n// Read a slice of content from the clipboard (or drop data).\nfunction parseFromClipboard(view, text, html, plainText, $context) {\n    let inCode = $context.parent.type.spec.code;\n    let dom, slice;\n    if (!html && !text)\n        return null;\n    let asText = text && (plainText || inCode || !html);\n    if (asText) {\n        view.someProp(\"transformPastedText\", f => { text = f(text, inCode || plainText, view); });\n        if (inCode)\n            return text ? new Slice(Fragment.from(view.state.schema.text(text.replace(/\\r\\n?/g, \"\\n\"))), 0, 0) : Slice.empty;\n        let parsed = view.someProp(\"clipboardTextParser\", f => f(text, $context, plainText, view));\n        if (parsed) {\n            slice = parsed;\n        }\n        else {\n            let marks = $context.marks();\n            let { schema } = view.state, serializer = DOMSerializer.fromSchema(schema);\n            dom = document.createElement(\"div\");\n            text.split(/(?:\\r\\n?|\\n)+/).forEach(block => {\n                let p = dom.appendChild(document.createElement(\"p\"));\n                if (block)\n                    p.appendChild(serializer.serializeNode(schema.text(block, marks)));\n            });\n        }\n    }\n    else {\n        view.someProp(\"transformPastedHTML\", f => { html = f(html, view); });\n        dom = readHTML(html);\n        if (webkit)\n            restoreReplacedSpaces(dom);\n    }\n    let contextNode = dom && dom.querySelector(\"[data-pm-slice]\");\n    let sliceData = contextNode && /^(\\d+) (\\d+)(?: -(\\d+))? (.*)/.exec(contextNode.getAttribute(\"data-pm-slice\") || \"\");\n    if (sliceData && sliceData[3])\n        for (let i = +sliceData[3]; i > 0; i--) {\n            let child = dom.firstChild;\n            while (child && child.nodeType != 1)\n                child = child.nextSibling;\n            if (!child)\n                break;\n            dom = child;\n        }\n    if (!slice) {\n        let parser = view.someProp(\"clipboardParser\") || view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n        slice = parser.parseSlice(dom, {\n            preserveWhitespace: !!(asText || sliceData),\n            context: $context,\n            ruleFromNode(dom) {\n                if (dom.nodeName == \"BR\" && !dom.nextSibling &&\n                    dom.parentNode && !inlineParents.test(dom.parentNode.nodeName))\n                    return { ignore: true };\n                return null;\n            }\n        });\n    }\n    if (sliceData) {\n        slice = addContext(closeSlice(slice, +sliceData[1], +sliceData[2]), sliceData[4]);\n    }\n    else { // HTML wasn't created by ProseMirror. Make sure top-level siblings are coherent\n        slice = Slice.maxOpen(normalizeSiblings(slice.content, $context), true);\n        if (slice.openStart || slice.openEnd) {\n            let openStart = 0, openEnd = 0;\n            for (let node = slice.content.firstChild; openStart < slice.openStart && !node.type.spec.isolating; openStart++, node = node.firstChild) { }\n            for (let node = slice.content.lastChild; openEnd < slice.openEnd && !node.type.spec.isolating; openEnd++, node = node.lastChild) { }\n            slice = closeSlice(slice, openStart, openEnd);\n        }\n    }\n    view.someProp(\"transformPasted\", f => { slice = f(slice, view); });\n    return slice;\n}\nconst inlineParents = /^(a|abbr|acronym|b|cite|code|del|em|i|ins|kbd|label|output|q|ruby|s|samp|span|strong|sub|sup|time|u|tt|var)$/i;\n// Takes a slice parsed with parseSlice, which means there hasn't been\n// any content-expression checking done on the top nodes, tries to\n// find a parent node in the current context that might fit the nodes,\n// and if successful, rebuilds the slice so that it fits into that parent.\n//\n// This addresses the problem that Transform.replace expects a\n// coherent slice, and will fail to place a set of siblings that don't\n// fit anywhere in the schema.\nfunction normalizeSiblings(fragment, $context) {\n    if (fragment.childCount < 2)\n        return fragment;\n    for (let d = $context.depth; d >= 0; d--) {\n        let parent = $context.node(d);\n        let match = parent.contentMatchAt($context.index(d));\n        let lastWrap, result = [];\n        fragment.forEach(node => {\n            if (!result)\n                return;\n            let wrap = match.findWrapping(node.type), inLast;\n            if (!wrap)\n                return result = null;\n            if (inLast = result.length && lastWrap.length && addToSibling(wrap, lastWrap, node, result[result.length - 1], 0)) {\n                result[result.length - 1] = inLast;\n            }\n            else {\n                if (result.length)\n                    result[result.length - 1] = closeRight(result[result.length - 1], lastWrap.length);\n                let wrapped = withWrappers(node, wrap);\n                result.push(wrapped);\n                match = match.matchType(wrapped.type);\n                lastWrap = wrap;\n            }\n        });\n        if (result)\n            return Fragment.from(result);\n    }\n    return fragment;\n}\nfunction withWrappers(node, wrap, from = 0) {\n    for (let i = wrap.length - 1; i >= from; i--)\n        node = wrap[i].create(null, Fragment.from(node));\n    return node;\n}\n// Used to group adjacent nodes wrapped in similar parents by\n// normalizeSiblings into the same parent node\nfunction addToSibling(wrap, lastWrap, node, sibling, depth) {\n    if (depth < wrap.length && depth < lastWrap.length && wrap[depth] == lastWrap[depth]) {\n        let inner = addToSibling(wrap, lastWrap, node, sibling.lastChild, depth + 1);\n        if (inner)\n            return sibling.copy(sibling.content.replaceChild(sibling.childCount - 1, inner));\n        let match = sibling.contentMatchAt(sibling.childCount);\n        if (match.matchType(depth == wrap.length - 1 ? node.type : wrap[depth + 1]))\n            return sibling.copy(sibling.content.append(Fragment.from(withWrappers(node, wrap, depth + 1))));\n    }\n}\nfunction closeRight(node, depth) {\n    if (depth == 0)\n        return node;\n    let fragment = node.content.replaceChild(node.childCount - 1, closeRight(node.lastChild, depth - 1));\n    let fill = node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true);\n    return node.copy(fragment.append(fill));\n}\nfunction closeRange(fragment, side, from, to, depth, openEnd) {\n    let node = side < 0 ? fragment.firstChild : fragment.lastChild, inner = node.content;\n    if (fragment.childCount > 1)\n        openEnd = 0;\n    if (depth < to - 1)\n        inner = closeRange(inner, side, from, to, depth + 1, openEnd);\n    if (depth >= from)\n        inner = side < 0 ? node.contentMatchAt(0).fillBefore(inner, openEnd <= depth).append(inner)\n            : inner.append(node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true));\n    return fragment.replaceChild(side < 0 ? 0 : fragment.childCount - 1, node.copy(inner));\n}\nfunction closeSlice(slice, openStart, openEnd) {\n    if (openStart < slice.openStart)\n        slice = new Slice(closeRange(slice.content, -1, openStart, slice.openStart, 0, slice.openEnd), openStart, slice.openEnd);\n    if (openEnd < slice.openEnd)\n        slice = new Slice(closeRange(slice.content, 1, openEnd, slice.openEnd, 0, 0), slice.openStart, openEnd);\n    return slice;\n}\n// Trick from jQuery -- some elements must be wrapped in other\n// elements for innerHTML to work. I.e. if you do `div.innerHTML =\n// \"<td>..</td>\"` the table cells are ignored.\nconst wrapMap = {\n    thead: [\"table\"],\n    tbody: [\"table\"],\n    tfoot: [\"table\"],\n    caption: [\"table\"],\n    colgroup: [\"table\"],\n    col: [\"table\", \"colgroup\"],\n    tr: [\"table\", \"tbody\"],\n    td: [\"table\", \"tbody\", \"tr\"],\n    th: [\"table\", \"tbody\", \"tr\"]\n};\nlet _detachedDoc = null;\nfunction detachedDoc() {\n    return _detachedDoc || (_detachedDoc = document.implementation.createHTMLDocument(\"title\"));\n}\nfunction readHTML(html) {\n    let metas = /^(\\s*<meta [^>]*>)*/.exec(html);\n    if (metas)\n        html = html.slice(metas[0].length);\n    let elt = detachedDoc().createElement(\"div\");\n    let firstTag = /<([a-z][^>\\s]+)/i.exec(html), wrap;\n    if (wrap = firstTag && wrapMap[firstTag[1].toLowerCase()])\n        html = wrap.map(n => \"<\" + n + \">\").join(\"\") + html + wrap.map(n => \"</\" + n + \">\").reverse().join(\"\");\n    elt.innerHTML = html;\n    if (wrap)\n        for (let i = 0; i < wrap.length; i++)\n            elt = elt.querySelector(wrap[i]) || elt;\n    return elt;\n}\n// Webkit browsers do some hard-to-predict replacement of regular\n// spaces with non-breaking spaces when putting content on the\n// clipboard. This tries to convert such non-breaking spaces (which\n// will be wrapped in a plain span on Chrome, a span with class\n// Apple-converted-space on Safari) back to regular spaces.\nfunction restoreReplacedSpaces(dom) {\n    let nodes = dom.querySelectorAll(chrome ? \"span:not([class]):not([style])\" : \"span.Apple-converted-space\");\n    for (let i = 0; i < nodes.length; i++) {\n        let node = nodes[i];\n        if (node.childNodes.length == 1 && node.textContent == \"\\u00a0\" && node.parentNode)\n            node.parentNode.replaceChild(dom.ownerDocument.createTextNode(\" \"), node);\n    }\n}\nfunction addContext(slice, context) {\n    if (!slice.size)\n        return slice;\n    let schema = slice.content.firstChild.type.schema, array;\n    try {\n        array = JSON.parse(context);\n    }\n    catch (e) {\n        return slice;\n    }\n    let { content, openStart, openEnd } = slice;\n    for (let i = array.length - 2; i >= 0; i -= 2) {\n        let type = schema.nodes[array[i]];\n        if (!type || type.hasRequiredAttrs())\n            break;\n        content = Fragment.from(type.create(array[i + 1], content));\n        openStart++;\n        openEnd++;\n    }\n    return new Slice(content, openStart, openEnd);\n}\n\n// A collection of DOM events that occur within the editor, and callback functions\n// to invoke when the event fires.\nconst handlers = {};\nconst editHandlers = {};\nconst passiveHandlers = { touchstart: true, touchmove: true };\nclass InputState {\n    constructor() {\n        this.shiftKey = false;\n        this.mouseDown = null;\n        this.lastKeyCode = null;\n        this.lastKeyCodeTime = 0;\n        this.lastClick = { time: 0, x: 0, y: 0, type: \"\" };\n        this.lastSelectionOrigin = null;\n        this.lastSelectionTime = 0;\n        this.lastIOSEnter = 0;\n        this.lastIOSEnterFallbackTimeout = -1;\n        this.lastFocus = 0;\n        this.lastTouch = 0;\n        this.lastAndroidDelete = 0;\n        this.composing = false;\n        this.compositionNode = null;\n        this.composingTimeout = -1;\n        this.compositionNodes = [];\n        this.compositionEndedAt = -2e8;\n        this.compositionID = 1;\n        // Set to a composition ID when there are pending changes at compositionend\n        this.compositionPendingChanges = 0;\n        this.domChangeCount = 0;\n        this.eventHandlers = Object.create(null);\n        this.hideSelectionGuard = null;\n    }\n}\nfunction initInput(view) {\n    for (let event in handlers) {\n        let handler = handlers[event];\n        view.dom.addEventListener(event, view.input.eventHandlers[event] = (event) => {\n            if (eventBelongsToView(view, event) && !runCustomHandler(view, event) &&\n                (view.editable || !(event.type in editHandlers)))\n                handler(view, event);\n        }, passiveHandlers[event] ? { passive: true } : undefined);\n    }\n    // On Safari, for reasons beyond my understanding, adding an input\n    // event handler makes an issue where the composition vanishes when\n    // you press enter go away.\n    if (safari)\n        view.dom.addEventListener(\"input\", () => null);\n    ensureListeners(view);\n}\nfunction setSelectionOrigin(view, origin) {\n    view.input.lastSelectionOrigin = origin;\n    view.input.lastSelectionTime = Date.now();\n}\nfunction destroyInput(view) {\n    view.domObserver.stop();\n    for (let type in view.input.eventHandlers)\n        view.dom.removeEventListener(type, view.input.eventHandlers[type]);\n    clearTimeout(view.input.composingTimeout);\n    clearTimeout(view.input.lastIOSEnterFallbackTimeout);\n}\nfunction ensureListeners(view) {\n    view.someProp(\"handleDOMEvents\", currentHandlers => {\n        for (let type in currentHandlers)\n            if (!view.input.eventHandlers[type])\n                view.dom.addEventListener(type, view.input.eventHandlers[type] = event => runCustomHandler(view, event));\n    });\n}\nfunction runCustomHandler(view, event) {\n    return view.someProp(\"handleDOMEvents\", handlers => {\n        let handler = handlers[event.type];\n        return handler ? handler(view, event) || event.defaultPrevented : false;\n    });\n}\nfunction eventBelongsToView(view, event) {\n    if (!event.bubbles)\n        return true;\n    if (event.defaultPrevented)\n        return false;\n    for (let node = event.target; node != view.dom; node = node.parentNode)\n        if (!node || node.nodeType == 11 ||\n            (node.pmViewDesc && node.pmViewDesc.stopEvent(event)))\n            return false;\n    return true;\n}\nfunction dispatchEvent(view, event) {\n    if (!runCustomHandler(view, event) && handlers[event.type] &&\n        (view.editable || !(event.type in editHandlers)))\n        handlers[event.type](view, event);\n}\neditHandlers.keydown = (view, _event) => {\n    let event = _event;\n    view.input.shiftKey = event.keyCode == 16 || event.shiftKey;\n    if (inOrNearComposition(view, event))\n        return;\n    view.input.lastKeyCode = event.keyCode;\n    view.input.lastKeyCodeTime = Date.now();\n    // Suppress enter key events on Chrome Android, because those tend\n    // to be part of a confused sequence of composition events fired,\n    // and handling them eagerly tends to corrupt the input.\n    if (android && chrome && event.keyCode == 13)\n        return;\n    if (event.keyCode != 229)\n        view.domObserver.forceFlush();\n    // On iOS, if we preventDefault enter key presses, the virtual\n    // keyboard gets confused. So the hack here is to set a flag that\n    // makes the DOM change code recognize that what just happens should\n    // be replaced by whatever the Enter key handlers do.\n    if (ios && event.keyCode == 13 && !event.ctrlKey && !event.altKey && !event.metaKey) {\n        let now = Date.now();\n        view.input.lastIOSEnter = now;\n        view.input.lastIOSEnterFallbackTimeout = setTimeout(() => {\n            if (view.input.lastIOSEnter == now) {\n                view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")));\n                view.input.lastIOSEnter = 0;\n            }\n        }, 200);\n    }\n    else if (view.someProp(\"handleKeyDown\", f => f(view, event)) || captureKeyDown(view, event)) {\n        event.preventDefault();\n    }\n    else {\n        setSelectionOrigin(view, \"key\");\n    }\n};\neditHandlers.keyup = (view, event) => {\n    if (event.keyCode == 16)\n        view.input.shiftKey = false;\n};\neditHandlers.keypress = (view, _event) => {\n    let event = _event;\n    if (inOrNearComposition(view, event) || !event.charCode ||\n        event.ctrlKey && !event.altKey || mac && event.metaKey)\n        return;\n    if (view.someProp(\"handleKeyPress\", f => f(view, event))) {\n        event.preventDefault();\n        return;\n    }\n    let sel = view.state.selection;\n    if (!(sel instanceof TextSelection) || !sel.$from.sameParent(sel.$to)) {\n        let text = String.fromCharCode(event.charCode);\n        if (!/[\\r\\n]/.test(text) && !view.someProp(\"handleTextInput\", f => f(view, sel.$from.pos, sel.$to.pos, text)))\n            view.dispatch(view.state.tr.insertText(text).scrollIntoView());\n        event.preventDefault();\n    }\n};\nfunction eventCoords(event) { return { left: event.clientX, top: event.clientY }; }\nfunction isNear(event, click) {\n    let dx = click.x - event.clientX, dy = click.y - event.clientY;\n    return dx * dx + dy * dy < 100;\n}\nfunction runHandlerOnContext(view, propName, pos, inside, event) {\n    if (inside == -1)\n        return false;\n    let $pos = view.state.doc.resolve(inside);\n    for (let i = $pos.depth + 1; i > 0; i--) {\n        if (view.someProp(propName, f => i > $pos.depth ? f(view, pos, $pos.nodeAfter, $pos.before(i), event, true)\n            : f(view, pos, $pos.node(i), $pos.before(i), event, false)))\n            return true;\n    }\n    return false;\n}\nfunction updateSelection(view, selection, origin) {\n    if (!view.focused)\n        view.focus();\n    let tr = view.state.tr.setSelection(selection);\n    if (origin == \"pointer\")\n        tr.setMeta(\"pointer\", true);\n    view.dispatch(tr);\n}\nfunction selectClickedLeaf(view, inside) {\n    if (inside == -1)\n        return false;\n    let $pos = view.state.doc.resolve(inside), node = $pos.nodeAfter;\n    if (node && node.isAtom && NodeSelection.isSelectable(node)) {\n        updateSelection(view, new NodeSelection($pos), \"pointer\");\n        return true;\n    }\n    return false;\n}\nfunction selectClickedNode(view, inside) {\n    if (inside == -1)\n        return false;\n    let sel = view.state.selection, selectedNode, selectAt;\n    if (sel instanceof NodeSelection)\n        selectedNode = sel.node;\n    let $pos = view.state.doc.resolve(inside);\n    for (let i = $pos.depth + 1; i > 0; i--) {\n        let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n        if (NodeSelection.isSelectable(node)) {\n            if (selectedNode && sel.$from.depth > 0 &&\n                i >= sel.$from.depth && $pos.before(sel.$from.depth + 1) == sel.$from.pos)\n                selectAt = $pos.before(sel.$from.depth);\n            else\n                selectAt = $pos.before(i);\n            break;\n        }\n    }\n    if (selectAt != null) {\n        updateSelection(view, NodeSelection.create(view.state.doc, selectAt), \"pointer\");\n        return true;\n    }\n    else {\n        return false;\n    }\n}\nfunction handleSingleClick(view, pos, inside, event, selectNode) {\n    return runHandlerOnContext(view, \"handleClickOn\", pos, inside, event) ||\n        view.someProp(\"handleClick\", f => f(view, pos, event)) ||\n        (selectNode ? selectClickedNode(view, inside) : selectClickedLeaf(view, inside));\n}\nfunction handleDoubleClick(view, pos, inside, event) {\n    return runHandlerOnContext(view, \"handleDoubleClickOn\", pos, inside, event) ||\n        view.someProp(\"handleDoubleClick\", f => f(view, pos, event));\n}\nfunction handleTripleClick(view, pos, inside, event) {\n    return runHandlerOnContext(view, \"handleTripleClickOn\", pos, inside, event) ||\n        view.someProp(\"handleTripleClick\", f => f(view, pos, event)) ||\n        defaultTripleClick(view, inside, event);\n}\nfunction defaultTripleClick(view, inside, event) {\n    if (event.button != 0)\n        return false;\n    let doc = view.state.doc;\n    if (inside == -1) {\n        if (doc.inlineContent) {\n            updateSelection(view, TextSelection.create(doc, 0, doc.content.size), \"pointer\");\n            return true;\n        }\n        return false;\n    }\n    let $pos = doc.resolve(inside);\n    for (let i = $pos.depth + 1; i > 0; i--) {\n        let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n        let nodePos = $pos.before(i);\n        if (node.inlineContent)\n            updateSelection(view, TextSelection.create(doc, nodePos + 1, nodePos + 1 + node.content.size), \"pointer\");\n        else if (NodeSelection.isSelectable(node))\n            updateSelection(view, NodeSelection.create(doc, nodePos), \"pointer\");\n        else\n            continue;\n        return true;\n    }\n}\nfunction forceDOMFlush(view) {\n    return endComposition(view);\n}\nconst selectNodeModifier = mac ? \"metaKey\" : \"ctrlKey\";\nhandlers.mousedown = (view, _event) => {\n    let event = _event;\n    view.input.shiftKey = event.shiftKey;\n    let flushed = forceDOMFlush(view);\n    let now = Date.now(), type = \"singleClick\";\n    if (now - view.input.lastClick.time < 500 && isNear(event, view.input.lastClick) && !event[selectNodeModifier]) {\n        if (view.input.lastClick.type == \"singleClick\")\n            type = \"doubleClick\";\n        else if (view.input.lastClick.type == \"doubleClick\")\n            type = \"tripleClick\";\n    }\n    view.input.lastClick = { time: now, x: event.clientX, y: event.clientY, type };\n    let pos = view.posAtCoords(eventCoords(event));\n    if (!pos)\n        return;\n    if (type == \"singleClick\") {\n        if (view.input.mouseDown)\n            view.input.mouseDown.done();\n        view.input.mouseDown = new MouseDown(view, pos, event, !!flushed);\n    }\n    else if ((type == \"doubleClick\" ? handleDoubleClick : handleTripleClick)(view, pos.pos, pos.inside, event)) {\n        event.preventDefault();\n    }\n    else {\n        setSelectionOrigin(view, \"pointer\");\n    }\n};\nclass MouseDown {\n    constructor(view, pos, event, flushed) {\n        this.view = view;\n        this.pos = pos;\n        this.event = event;\n        this.flushed = flushed;\n        this.delayedSelectionSync = false;\n        this.mightDrag = null;\n        this.startDoc = view.state.doc;\n        this.selectNode = !!event[selectNodeModifier];\n        this.allowDefault = event.shiftKey;\n        let targetNode, targetPos;\n        if (pos.inside > -1) {\n            targetNode = view.state.doc.nodeAt(pos.inside);\n            targetPos = pos.inside;\n        }\n        else {\n            let $pos = view.state.doc.resolve(pos.pos);\n            targetNode = $pos.parent;\n            targetPos = $pos.depth ? $pos.before() : 0;\n        }\n        const target = flushed ? null : event.target;\n        const targetDesc = target ? view.docView.nearestDesc(target, true) : null;\n        this.target = targetDesc && targetDesc.dom.nodeType == 1 ? targetDesc.dom : null;\n        let { selection } = view.state;\n        if (event.button == 0 &&\n            targetNode.type.spec.draggable && targetNode.type.spec.selectable !== false ||\n            selection instanceof NodeSelection && selection.from <= targetPos && selection.to > targetPos)\n            this.mightDrag = {\n                node: targetNode,\n                pos: targetPos,\n                addAttr: !!(this.target && !this.target.draggable),\n                setUneditable: !!(this.target && gecko && !this.target.hasAttribute(\"contentEditable\"))\n            };\n        if (this.target && this.mightDrag && (this.mightDrag.addAttr || this.mightDrag.setUneditable)) {\n            this.view.domObserver.stop();\n            if (this.mightDrag.addAttr)\n                this.target.draggable = true;\n            if (this.mightDrag.setUneditable)\n                setTimeout(() => {\n                    if (this.view.input.mouseDown == this)\n                        this.target.setAttribute(\"contentEditable\", \"false\");\n                }, 20);\n            this.view.domObserver.start();\n        }\n        view.root.addEventListener(\"mouseup\", this.up = this.up.bind(this));\n        view.root.addEventListener(\"mousemove\", this.move = this.move.bind(this));\n        setSelectionOrigin(view, \"pointer\");\n    }\n    done() {\n        this.view.root.removeEventListener(\"mouseup\", this.up);\n        this.view.root.removeEventListener(\"mousemove\", this.move);\n        if (this.mightDrag && this.target) {\n            this.view.domObserver.stop();\n            if (this.mightDrag.addAttr)\n                this.target.removeAttribute(\"draggable\");\n            if (this.mightDrag.setUneditable)\n                this.target.removeAttribute(\"contentEditable\");\n            this.view.domObserver.start();\n        }\n        if (this.delayedSelectionSync)\n            setTimeout(() => selectionToDOM(this.view));\n        this.view.input.mouseDown = null;\n    }\n    up(event) {\n        this.done();\n        if (!this.view.dom.contains(event.target))\n            return;\n        let pos = this.pos;\n        if (this.view.state.doc != this.startDoc)\n            pos = this.view.posAtCoords(eventCoords(event));\n        this.updateAllowDefault(event);\n        if (this.allowDefault || !pos) {\n            setSelectionOrigin(this.view, \"pointer\");\n        }\n        else if (handleSingleClick(this.view, pos.pos, pos.inside, event, this.selectNode)) {\n            event.preventDefault();\n        }\n        else if (event.button == 0 &&\n            (this.flushed ||\n                // Safari ignores clicks on draggable elements\n                (safari && this.mightDrag && !this.mightDrag.node.isAtom) ||\n                // Chrome will sometimes treat a node selection as a\n                // cursor, but still report that the node is selected\n                // when asked through getSelection. You'll then get a\n                // situation where clicking at the point where that\n                // (hidden) cursor is doesn't change the selection, and\n                // thus doesn't get a reaction from ProseMirror. This\n                // works around that.\n                (chrome && !this.view.state.selection.visible &&\n                    Math.min(Math.abs(pos.pos - this.view.state.selection.from), Math.abs(pos.pos - this.view.state.selection.to)) <= 2))) {\n            updateSelection(this.view, Selection.near(this.view.state.doc.resolve(pos.pos)), \"pointer\");\n            event.preventDefault();\n        }\n        else {\n            setSelectionOrigin(this.view, \"pointer\");\n        }\n    }\n    move(event) {\n        this.updateAllowDefault(event);\n        setSelectionOrigin(this.view, \"pointer\");\n        if (event.buttons == 0)\n            this.done();\n    }\n    updateAllowDefault(event) {\n        if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 ||\n            Math.abs(this.event.y - event.clientY) > 4))\n            this.allowDefault = true;\n    }\n}\nhandlers.touchstart = view => {\n    view.input.lastTouch = Date.now();\n    forceDOMFlush(view);\n    setSelectionOrigin(view, \"pointer\");\n};\nhandlers.touchmove = view => {\n    view.input.lastTouch = Date.now();\n    setSelectionOrigin(view, \"pointer\");\n};\nhandlers.contextmenu = view => forceDOMFlush(view);\nfunction inOrNearComposition(view, event) {\n    if (view.composing)\n        return true;\n    // See https://www.stum.de/2016/06/24/handling-ime-events-in-javascript/.\n    // On Japanese input method editors (IMEs), the Enter key is used to confirm character\n    // selection. On Safari, when Enter is pressed, compositionend and keydown events are\n    // emitted. The keydown event triggers newline insertion, which we don't want.\n    // This method returns true if the keydown event should be ignored.\n    // We only ignore it once, as pressing Enter a second time *should* insert a newline.\n    // Furthermore, the keydown event timestamp must be close to the compositionEndedAt timestamp.\n    // This guards against the case where compositionend is triggered without the keyboard\n    // (e.g. character confirmation may be done with the mouse), and keydown is triggered\n    // afterwards- we wouldn't want to ignore the keydown event in this case.\n    if (safari && Math.abs(event.timeStamp - view.input.compositionEndedAt) < 500) {\n        view.input.compositionEndedAt = -2e8;\n        return true;\n    }\n    return false;\n}\n// Drop active composition after 5 seconds of inactivity on Android\nconst timeoutComposition = android ? 5000 : -1;\neditHandlers.compositionstart = editHandlers.compositionupdate = view => {\n    if (!view.composing) {\n        view.domObserver.flush();\n        let { state } = view, $pos = state.selection.$from;\n        if (state.selection.empty &&\n            (state.storedMarks ||\n                (!$pos.textOffset && $pos.parentOffset && $pos.nodeBefore.marks.some(m => m.type.spec.inclusive === false)))) {\n            // Need to wrap the cursor in mark nodes different from the ones in the DOM context\n            view.markCursor = view.state.storedMarks || $pos.marks();\n            endComposition(view, true);\n            view.markCursor = null;\n        }\n        else {\n            endComposition(view);\n            // In firefox, if the cursor is after but outside a marked node,\n            // the inserted text won't inherit the marks. So this moves it\n            // inside if necessary.\n            if (gecko && state.selection.empty && $pos.parentOffset && !$pos.textOffset && $pos.nodeBefore.marks.length) {\n                let sel = view.domSelectionRange();\n                for (let node = sel.focusNode, offset = sel.focusOffset; node && node.nodeType == 1 && offset != 0;) {\n                    let before = offset < 0 ? node.lastChild : node.childNodes[offset - 1];\n                    if (!before)\n                        break;\n                    if (before.nodeType == 3) {\n                        view.domSelection().collapse(before, before.nodeValue.length);\n                        break;\n                    }\n                    else {\n                        node = before;\n                        offset = -1;\n                    }\n                }\n            }\n        }\n        view.input.composing = true;\n    }\n    scheduleComposeEnd(view, timeoutComposition);\n};\neditHandlers.compositionend = (view, event) => {\n    if (view.composing) {\n        view.input.composing = false;\n        view.input.compositionEndedAt = event.timeStamp;\n        view.input.compositionPendingChanges = view.domObserver.pendingRecords().length ? view.input.compositionID : 0;\n        view.input.compositionNode = null;\n        if (view.input.compositionPendingChanges)\n            Promise.resolve().then(() => view.domObserver.flush());\n        view.input.compositionID++;\n        scheduleComposeEnd(view, 20);\n    }\n};\nfunction scheduleComposeEnd(view, delay) {\n    clearTimeout(view.input.composingTimeout);\n    if (delay > -1)\n        view.input.composingTimeout = setTimeout(() => endComposition(view), delay);\n}\nfunction clearComposition(view) {\n    if (view.composing) {\n        view.input.composing = false;\n        view.input.compositionEndedAt = timestampFromCustomEvent();\n    }\n    while (view.input.compositionNodes.length > 0)\n        view.input.compositionNodes.pop().markParentsDirty();\n}\nfunction findCompositionNode(view) {\n    let sel = view.domSelectionRange();\n    if (!sel.focusNode)\n        return null;\n    let textBefore = textNodeBefore$1(sel.focusNode, sel.focusOffset);\n    let textAfter = textNodeAfter$1(sel.focusNode, sel.focusOffset);\n    if (textBefore && textAfter && textBefore != textAfter) {\n        let descAfter = textAfter.pmViewDesc, lastChanged = view.domObserver.lastChangedTextNode;\n        if (textBefore == lastChanged || textAfter == lastChanged)\n            return lastChanged;\n        if (!descAfter || !descAfter.isText(textAfter.nodeValue)) {\n            return textAfter;\n        }\n        else if (view.input.compositionNode == textAfter) {\n            let descBefore = textBefore.pmViewDesc;\n            if (!(!descBefore || !descBefore.isText(textBefore.nodeValue)))\n                return textAfter;\n        }\n    }\n    return textBefore || textAfter;\n}\nfunction timestampFromCustomEvent() {\n    let event = document.createEvent(\"Event\");\n    event.initEvent(\"event\", true, true);\n    return event.timeStamp;\n}\n/**\n@internal\n*/\nfunction endComposition(view, forceUpdate = false) {\n    if (android && view.domObserver.flushingSoon >= 0)\n        return;\n    view.domObserver.forceFlush();\n    clearComposition(view);\n    if (forceUpdate || view.docView && view.docView.dirty) {\n        let sel = selectionFromDOM(view);\n        if (sel && !sel.eq(view.state.selection))\n            view.dispatch(view.state.tr.setSelection(sel));\n        else\n            view.updateState(view.state);\n        return true;\n    }\n    return false;\n}\nfunction captureCopy(view, dom) {\n    // The extra wrapper is somehow necessary on IE/Edge to prevent the\n    // content from being mangled when it is put onto the clipboard\n    if (!view.dom.parentNode)\n        return;\n    let wrap = view.dom.parentNode.appendChild(document.createElement(\"div\"));\n    wrap.appendChild(dom);\n    wrap.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n    let sel = getSelection(), range = document.createRange();\n    range.selectNodeContents(dom);\n    // Done because IE will fire a selectionchange moving the selection\n    // to its start when removeAllRanges is called and the editor still\n    // has focus (which will mess up the editor's selection state).\n    view.dom.blur();\n    sel.removeAllRanges();\n    sel.addRange(range);\n    setTimeout(() => {\n        if (wrap.parentNode)\n            wrap.parentNode.removeChild(wrap);\n        view.focus();\n    }, 50);\n}\n// This is very crude, but unfortunately both these browsers _pretend_\n// that they have a clipboard API—all the objects and methods are\n// there, they just don't work, and they are hard to test.\nconst brokenClipboardAPI = (ie && ie_version < 15) ||\n    (ios && webkit_version < 604);\nhandlers.copy = editHandlers.cut = (view, _event) => {\n    let event = _event;\n    let sel = view.state.selection, cut = event.type == \"cut\";\n    if (sel.empty)\n        return;\n    // IE and Edge's clipboard interface is completely broken\n    let data = brokenClipboardAPI ? null : event.clipboardData;\n    let slice = sel.content(), { dom, text } = serializeForClipboard(view, slice);\n    if (data) {\n        event.preventDefault();\n        data.clearData();\n        data.setData(\"text/html\", dom.innerHTML);\n        data.setData(\"text/plain\", text);\n    }\n    else {\n        captureCopy(view, dom);\n    }\n    if (cut)\n        view.dispatch(view.state.tr.deleteSelection().scrollIntoView().setMeta(\"uiEvent\", \"cut\"));\n};\nfunction sliceSingleNode(slice) {\n    return slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1 ? slice.content.firstChild : null;\n}\nfunction capturePaste(view, event) {\n    if (!view.dom.parentNode)\n        return;\n    let plainText = view.input.shiftKey || view.state.selection.$from.parent.type.spec.code;\n    let target = view.dom.parentNode.appendChild(document.createElement(plainText ? \"textarea\" : \"div\"));\n    if (!plainText)\n        target.contentEditable = \"true\";\n    target.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n    target.focus();\n    let plain = view.input.shiftKey && view.input.lastKeyCode != 45;\n    setTimeout(() => {\n        view.focus();\n        if (target.parentNode)\n            target.parentNode.removeChild(target);\n        if (plainText)\n            doPaste(view, target.value, null, plain, event);\n        else\n            doPaste(view, target.textContent, target.innerHTML, plain, event);\n    }, 50);\n}\nfunction doPaste(view, text, html, preferPlain, event) {\n    let slice = parseFromClipboard(view, text, html, preferPlain, view.state.selection.$from);\n    if (view.someProp(\"handlePaste\", f => f(view, event, slice || Slice.empty)))\n        return true;\n    if (!slice)\n        return false;\n    let singleNode = sliceSingleNode(slice);\n    let tr = singleNode\n        ? view.state.tr.replaceSelectionWith(singleNode, preferPlain)\n        : view.state.tr.replaceSelection(slice);\n    view.dispatch(tr.scrollIntoView().setMeta(\"paste\", true).setMeta(\"uiEvent\", \"paste\"));\n    return true;\n}\nfunction getText(clipboardData) {\n    let text = clipboardData.getData(\"text/plain\") || clipboardData.getData(\"Text\");\n    if (text)\n        return text;\n    let uris = clipboardData.getData(\"text/uri-list\");\n    return uris ? uris.replace(/\\r?\\n/g, \" \") : \"\";\n}\neditHandlers.paste = (view, _event) => {\n    let event = _event;\n    // Handling paste from JavaScript during composition is very poorly\n    // handled by browsers, so as a dodgy but preferable kludge, we just\n    // let the browser do its native thing there, except on Android,\n    // where the editor is almost always composing.\n    if (view.composing && !android)\n        return;\n    let data = brokenClipboardAPI ? null : event.clipboardData;\n    let plain = view.input.shiftKey && view.input.lastKeyCode != 45;\n    if (data && doPaste(view, getText(data), data.getData(\"text/html\"), plain, event))\n        event.preventDefault();\n    else\n        capturePaste(view, event);\n};\nclass Dragging {\n    constructor(slice, move, node) {\n        this.slice = slice;\n        this.move = move;\n        this.node = node;\n    }\n}\nconst dragCopyModifier = mac ? \"altKey\" : \"ctrlKey\";\nhandlers.dragstart = (view, _event) => {\n    let event = _event;\n    let mouseDown = view.input.mouseDown;\n    if (mouseDown)\n        mouseDown.done();\n    if (!event.dataTransfer)\n        return;\n    let sel = view.state.selection;\n    let pos = sel.empty ? null : view.posAtCoords(eventCoords(event));\n    let node;\n    if (pos && pos.pos >= sel.from && pos.pos <= (sel instanceof NodeSelection ? sel.to - 1 : sel.to)) ;\n    else if (mouseDown && mouseDown.mightDrag) {\n        node = NodeSelection.create(view.state.doc, mouseDown.mightDrag.pos);\n    }\n    else if (event.target && event.target.nodeType == 1) {\n        let desc = view.docView.nearestDesc(event.target, true);\n        if (desc && desc.node.type.spec.draggable && desc != view.docView)\n            node = NodeSelection.create(view.state.doc, desc.posBefore);\n    }\n    let draggedSlice = (node || view.state.selection).content();\n    let { dom, text, slice } = serializeForClipboard(view, draggedSlice);\n    event.dataTransfer.clearData();\n    event.dataTransfer.setData(brokenClipboardAPI ? \"Text\" : \"text/html\", dom.innerHTML);\n    // See https://github.com/ProseMirror/prosemirror/issues/1156\n    event.dataTransfer.effectAllowed = \"copyMove\";\n    if (!brokenClipboardAPI)\n        event.dataTransfer.setData(\"text/plain\", text);\n    view.dragging = new Dragging(slice, !event[dragCopyModifier], node);\n};\nhandlers.dragend = view => {\n    let dragging = view.dragging;\n    window.setTimeout(() => {\n        if (view.dragging == dragging)\n            view.dragging = null;\n    }, 50);\n};\neditHandlers.dragover = editHandlers.dragenter = (_, e) => e.preventDefault();\neditHandlers.drop = (view, _event) => {\n    let event = _event;\n    let dragging = view.dragging;\n    view.dragging = null;\n    if (!event.dataTransfer)\n        return;\n    let eventPos = view.posAtCoords(eventCoords(event));\n    if (!eventPos)\n        return;\n    let $mouse = view.state.doc.resolve(eventPos.pos);\n    let slice = dragging && dragging.slice;\n    if (slice) {\n        view.someProp(\"transformPasted\", f => { slice = f(slice, view); });\n    }\n    else {\n        slice = parseFromClipboard(view, getText(event.dataTransfer), brokenClipboardAPI ? null : event.dataTransfer.getData(\"text/html\"), false, $mouse);\n    }\n    let move = !!(dragging && !event[dragCopyModifier]);\n    if (view.someProp(\"handleDrop\", f => f(view, event, slice || Slice.empty, move))) {\n        event.preventDefault();\n        return;\n    }\n    if (!slice)\n        return;\n    event.preventDefault();\n    let insertPos = slice ? dropPoint(view.state.doc, $mouse.pos, slice) : $mouse.pos;\n    if (insertPos == null)\n        insertPos = $mouse.pos;\n    let tr = view.state.tr;\n    if (move) {\n        let { node } = dragging;\n        if (node)\n            node.replace(tr);\n        else\n            tr.deleteSelection();\n    }\n    let pos = tr.mapping.map(insertPos);\n    let isNode = slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1;\n    let beforeInsert = tr.doc;\n    if (isNode)\n        tr.replaceRangeWith(pos, pos, slice.content.firstChild);\n    else\n        tr.replaceRange(pos, pos, slice);\n    if (tr.doc.eq(beforeInsert))\n        return;\n    let $pos = tr.doc.resolve(pos);\n    if (isNode && NodeSelection.isSelectable(slice.content.firstChild) &&\n        $pos.nodeAfter && $pos.nodeAfter.sameMarkup(slice.content.firstChild)) {\n        tr.setSelection(new NodeSelection($pos));\n    }\n    else {\n        let end = tr.mapping.map(insertPos);\n        tr.mapping.maps[tr.mapping.maps.length - 1].forEach((_from, _to, _newFrom, newTo) => end = newTo);\n        tr.setSelection(selectionBetween(view, $pos, tr.doc.resolve(end)));\n    }\n    view.focus();\n    view.dispatch(tr.setMeta(\"uiEvent\", \"drop\"));\n};\nhandlers.focus = view => {\n    view.input.lastFocus = Date.now();\n    if (!view.focused) {\n        view.domObserver.stop();\n        view.dom.classList.add(\"ProseMirror-focused\");\n        view.domObserver.start();\n        view.focused = true;\n        setTimeout(() => {\n            if (view.docView && view.hasFocus() && !view.domObserver.currentSelection.eq(view.domSelectionRange()))\n                selectionToDOM(view);\n        }, 20);\n    }\n};\nhandlers.blur = (view, _event) => {\n    let event = _event;\n    if (view.focused) {\n        view.domObserver.stop();\n        view.dom.classList.remove(\"ProseMirror-focused\");\n        view.domObserver.start();\n        if (event.relatedTarget && view.dom.contains(event.relatedTarget))\n            view.domObserver.currentSelection.clear();\n        view.focused = false;\n    }\n};\nhandlers.beforeinput = (view, _event) => {\n    let event = _event;\n    // We should probably do more with beforeinput events, but support\n    // is so spotty that I'm still waiting to see where they are going.\n    // Very specific hack to deal with backspace sometimes failing on\n    // Chrome Android when after an uneditable node.\n    if (chrome && android && event.inputType == \"deleteContentBackward\") {\n        view.domObserver.flushSoon();\n        let { domChangeCount } = view.input;\n        setTimeout(() => {\n            if (view.input.domChangeCount != domChangeCount)\n                return; // Event already had some effect\n            // This bug tends to close the virtual keyboard, so we refocus\n            view.dom.blur();\n            view.focus();\n            if (view.someProp(\"handleKeyDown\", f => f(view, keyEvent(8, \"Backspace\"))))\n                return;\n            let { $cursor } = view.state.selection;\n            // Crude approximation of backspace behavior when no command handled it\n            if ($cursor && $cursor.pos > 0)\n                view.dispatch(view.state.tr.delete($cursor.pos - 1, $cursor.pos).scrollIntoView());\n        }, 50);\n    }\n};\n// Make sure all handlers get registered\nfor (let prop in editHandlers)\n    handlers[prop] = editHandlers[prop];\n\nfunction compareObjs(a, b) {\n    if (a == b)\n        return true;\n    for (let p in a)\n        if (a[p] !== b[p])\n            return false;\n    for (let p in b)\n        if (!(p in a))\n            return false;\n    return true;\n}\nclass WidgetType {\n    constructor(toDOM, spec) {\n        this.toDOM = toDOM;\n        this.spec = spec || noSpec;\n        this.side = this.spec.side || 0;\n    }\n    map(mapping, span, offset, oldOffset) {\n        let { pos, deleted } = mapping.mapResult(span.from + oldOffset, this.side < 0 ? -1 : 1);\n        return deleted ? null : new Decoration(pos - offset, pos - offset, this);\n    }\n    valid() { return true; }\n    eq(other) {\n        return this == other ||\n            (other instanceof WidgetType &&\n                (this.spec.key && this.spec.key == other.spec.key ||\n                    this.toDOM == other.toDOM && compareObjs(this.spec, other.spec)));\n    }\n    destroy(node) {\n        if (this.spec.destroy)\n            this.spec.destroy(node);\n    }\n}\nclass InlineType {\n    constructor(attrs, spec) {\n        this.attrs = attrs;\n        this.spec = spec || noSpec;\n    }\n    map(mapping, span, offset, oldOffset) {\n        let from = mapping.map(span.from + oldOffset, this.spec.inclusiveStart ? -1 : 1) - offset;\n        let to = mapping.map(span.to + oldOffset, this.spec.inclusiveEnd ? 1 : -1) - offset;\n        return from >= to ? null : new Decoration(from, to, this);\n    }\n    valid(_, span) { return span.from < span.to; }\n    eq(other) {\n        return this == other ||\n            (other instanceof InlineType && compareObjs(this.attrs, other.attrs) &&\n                compareObjs(this.spec, other.spec));\n    }\n    static is(span) { return span.type instanceof InlineType; }\n    destroy() { }\n}\nclass NodeType {\n    constructor(attrs, spec) {\n        this.attrs = attrs;\n        this.spec = spec || noSpec;\n    }\n    map(mapping, span, offset, oldOffset) {\n        let from = mapping.mapResult(span.from + oldOffset, 1);\n        if (from.deleted)\n            return null;\n        let to = mapping.mapResult(span.to + oldOffset, -1);\n        if (to.deleted || to.pos <= from.pos)\n            return null;\n        return new Decoration(from.pos - offset, to.pos - offset, this);\n    }\n    valid(node, span) {\n        let { index, offset } = node.content.findIndex(span.from), child;\n        return offset == span.from && !(child = node.child(index)).isText && offset + child.nodeSize == span.to;\n    }\n    eq(other) {\n        return this == other ||\n            (other instanceof NodeType && compareObjs(this.attrs, other.attrs) &&\n                compareObjs(this.spec, other.spec));\n    }\n    destroy() { }\n}\n/**\nDecoration objects can be provided to the view through the\n[`decorations` prop](https://prosemirror.net/docs/ref/#view.EditorProps.decorations). They come in\nseveral variants—see the static members of this class for details.\n*/\nclass Decoration {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The start position of the decoration.\n    */\n    from, \n    /**\n    The end position. Will be the same as `from` for [widget\n    decorations](https://prosemirror.net/docs/ref/#view.Decoration^widget).\n    */\n    to, \n    /**\n    @internal\n    */\n    type) {\n        this.from = from;\n        this.to = to;\n        this.type = type;\n    }\n    /**\n    @internal\n    */\n    copy(from, to) {\n        return new Decoration(from, to, this.type);\n    }\n    /**\n    @internal\n    */\n    eq(other, offset = 0) {\n        return this.type.eq(other.type) && this.from + offset == other.from && this.to + offset == other.to;\n    }\n    /**\n    @internal\n    */\n    map(mapping, offset, oldOffset) {\n        return this.type.map(mapping, this, offset, oldOffset);\n    }\n    /**\n    Creates a widget decoration, which is a DOM node that's shown in\n    the document at the given position. It is recommended that you\n    delay rendering the widget by passing a function that will be\n    called when the widget is actually drawn in a view, but you can\n    also directly pass a DOM node. `getPos` can be used to find the\n    widget's current document position.\n    */\n    static widget(pos, toDOM, spec) {\n        return new Decoration(pos, pos, new WidgetType(toDOM, spec));\n    }\n    /**\n    Creates an inline decoration, which adds the given attributes to\n    each inline node between `from` and `to`.\n    */\n    static inline(from, to, attrs, spec) {\n        return new Decoration(from, to, new InlineType(attrs, spec));\n    }\n    /**\n    Creates a node decoration. `from` and `to` should point precisely\n    before and after a node in the document. That node, and only that\n    node, will receive the given attributes.\n    */\n    static node(from, to, attrs, spec) {\n        return new Decoration(from, to, new NodeType(attrs, spec));\n    }\n    /**\n    The spec provided when creating this decoration. Can be useful\n    if you've stored extra information in that object.\n    */\n    get spec() { return this.type.spec; }\n    /**\n    @internal\n    */\n    get inline() { return this.type instanceof InlineType; }\n    /**\n    @internal\n    */\n    get widget() { return this.type instanceof WidgetType; }\n}\nconst none = [], noSpec = {};\n/**\nA collection of [decorations](https://prosemirror.net/docs/ref/#view.Decoration), organized in such\na way that the drawing algorithm can efficiently use and compare\nthem. This is a persistent data structure—it is not modified,\nupdates create a new value.\n*/\nclass DecorationSet {\n    /**\n    @internal\n    */\n    constructor(local, children) {\n        this.local = local.length ? local : none;\n        this.children = children.length ? children : none;\n    }\n    /**\n    Create a set of decorations, using the structure of the given\n    document. This will consume (modify) the `decorations` array, so\n    you must make a copy if you want need to preserve that.\n    */\n    static create(doc, decorations) {\n        return decorations.length ? buildTree(decorations, doc, 0, noSpec) : empty;\n    }\n    /**\n    Find all decorations in this set which touch the given range\n    (including decorations that start or end directly at the\n    boundaries) and match the given predicate on their spec. When\n    `start` and `end` are omitted, all decorations in the set are\n    considered. When `predicate` isn't given, all decorations are\n    assumed to match.\n    */\n    find(start, end, predicate) {\n        let result = [];\n        this.findInner(start == null ? 0 : start, end == null ? 1e9 : end, result, 0, predicate);\n        return result;\n    }\n    findInner(start, end, result, offset, predicate) {\n        for (let i = 0; i < this.local.length; i++) {\n            let span = this.local[i];\n            if (span.from <= end && span.to >= start && (!predicate || predicate(span.spec)))\n                result.push(span.copy(span.from + offset, span.to + offset));\n        }\n        for (let i = 0; i < this.children.length; i += 3) {\n            if (this.children[i] < end && this.children[i + 1] > start) {\n                let childOff = this.children[i] + 1;\n                this.children[i + 2].findInner(start - childOff, end - childOff, result, offset + childOff, predicate);\n            }\n        }\n    }\n    /**\n    Map the set of decorations in response to a change in the\n    document.\n    */\n    map(mapping, doc, options) {\n        if (this == empty || mapping.maps.length == 0)\n            return this;\n        return this.mapInner(mapping, doc, 0, 0, options || noSpec);\n    }\n    /**\n    @internal\n    */\n    mapInner(mapping, node, offset, oldOffset, options) {\n        let newLocal;\n        for (let i = 0; i < this.local.length; i++) {\n            let mapped = this.local[i].map(mapping, offset, oldOffset);\n            if (mapped && mapped.type.valid(node, mapped))\n                (newLocal || (newLocal = [])).push(mapped);\n            else if (options.onRemove)\n                options.onRemove(this.local[i].spec);\n        }\n        if (this.children.length)\n            return mapChildren(this.children, newLocal || [], mapping, node, offset, oldOffset, options);\n        else\n            return newLocal ? new DecorationSet(newLocal.sort(byPos), none) : empty;\n    }\n    /**\n    Add the given array of decorations to the ones in the set,\n    producing a new set. Consumes the `decorations` array. Needs\n    access to the current document to create the appropriate tree\n    structure.\n    */\n    add(doc, decorations) {\n        if (!decorations.length)\n            return this;\n        if (this == empty)\n            return DecorationSet.create(doc, decorations);\n        return this.addInner(doc, decorations, 0);\n    }\n    addInner(doc, decorations, offset) {\n        let children, childIndex = 0;\n        doc.forEach((childNode, childOffset) => {\n            let baseOffset = childOffset + offset, found;\n            if (!(found = takeSpansForNode(decorations, childNode, baseOffset)))\n                return;\n            if (!children)\n                children = this.children.slice();\n            while (childIndex < children.length && children[childIndex] < childOffset)\n                childIndex += 3;\n            if (children[childIndex] == childOffset)\n                children[childIndex + 2] = children[childIndex + 2].addInner(childNode, found, baseOffset + 1);\n            else\n                children.splice(childIndex, 0, childOffset, childOffset + childNode.nodeSize, buildTree(found, childNode, baseOffset + 1, noSpec));\n            childIndex += 3;\n        });\n        let local = moveSpans(childIndex ? withoutNulls(decorations) : decorations, -offset);\n        for (let i = 0; i < local.length; i++)\n            if (!local[i].type.valid(doc, local[i]))\n                local.splice(i--, 1);\n        return new DecorationSet(local.length ? this.local.concat(local).sort(byPos) : this.local, children || this.children);\n    }\n    /**\n    Create a new set that contains the decorations in this set, minus\n    the ones in the given array.\n    */\n    remove(decorations) {\n        if (decorations.length == 0 || this == empty)\n            return this;\n        return this.removeInner(decorations, 0);\n    }\n    removeInner(decorations, offset) {\n        let children = this.children, local = this.local;\n        for (let i = 0; i < children.length; i += 3) {\n            let found;\n            let from = children[i] + offset, to = children[i + 1] + offset;\n            for (let j = 0, span; j < decorations.length; j++)\n                if (span = decorations[j]) {\n                    if (span.from > from && span.to < to) {\n                        decorations[j] = null;\n                        (found || (found = [])).push(span);\n                    }\n                }\n            if (!found)\n                continue;\n            if (children == this.children)\n                children = this.children.slice();\n            let removed = children[i + 2].removeInner(found, from + 1);\n            if (removed != empty) {\n                children[i + 2] = removed;\n            }\n            else {\n                children.splice(i, 3);\n                i -= 3;\n            }\n        }\n        if (local.length)\n            for (let i = 0, span; i < decorations.length; i++)\n                if (span = decorations[i]) {\n                    for (let j = 0; j < local.length; j++)\n                        if (local[j].eq(span, offset)) {\n                            if (local == this.local)\n                                local = this.local.slice();\n                            local.splice(j--, 1);\n                        }\n                }\n        if (children == this.children && local == this.local)\n            return this;\n        return local.length || children.length ? new DecorationSet(local, children) : empty;\n    }\n    forChild(offset, node) {\n        if (this == empty)\n            return this;\n        if (node.isLeaf)\n            return DecorationSet.empty;\n        let child, local;\n        for (let i = 0; i < this.children.length; i += 3)\n            if (this.children[i] >= offset) {\n                if (this.children[i] == offset)\n                    child = this.children[i + 2];\n                break;\n            }\n        let start = offset + 1, end = start + node.content.size;\n        for (let i = 0; i < this.local.length; i++) {\n            let dec = this.local[i];\n            if (dec.from < end && dec.to > start && (dec.type instanceof InlineType)) {\n                let from = Math.max(start, dec.from) - start, to = Math.min(end, dec.to) - start;\n                if (from < to)\n                    (local || (local = [])).push(dec.copy(from, to));\n            }\n        }\n        if (local) {\n            let localSet = new DecorationSet(local.sort(byPos), none);\n            return child ? new DecorationGroup([localSet, child]) : localSet;\n        }\n        return child || empty;\n    }\n    /**\n    @internal\n    */\n    eq(other) {\n        if (this == other)\n            return true;\n        if (!(other instanceof DecorationSet) ||\n            this.local.length != other.local.length ||\n            this.children.length != other.children.length)\n            return false;\n        for (let i = 0; i < this.local.length; i++)\n            if (!this.local[i].eq(other.local[i]))\n                return false;\n        for (let i = 0; i < this.children.length; i += 3)\n            if (this.children[i] != other.children[i] ||\n                this.children[i + 1] != other.children[i + 1] ||\n                !this.children[i + 2].eq(other.children[i + 2]))\n                return false;\n        return true;\n    }\n    /**\n    @internal\n    */\n    locals(node) {\n        return removeOverlap(this.localsInner(node));\n    }\n    /**\n    @internal\n    */\n    localsInner(node) {\n        if (this == empty)\n            return none;\n        if (node.inlineContent || !this.local.some(InlineType.is))\n            return this.local;\n        let result = [];\n        for (let i = 0; i < this.local.length; i++) {\n            if (!(this.local[i].type instanceof InlineType))\n                result.push(this.local[i]);\n        }\n        return result;\n    }\n}\n/**\nThe empty set of decorations.\n*/\nDecorationSet.empty = new DecorationSet([], []);\n/**\n@internal\n*/\nDecorationSet.removeOverlap = removeOverlap;\nconst empty = DecorationSet.empty;\n// An abstraction that allows the code dealing with decorations to\n// treat multiple DecorationSet objects as if it were a single object\n// with (a subset of) the same interface.\nclass DecorationGroup {\n    constructor(members) {\n        this.members = members;\n    }\n    map(mapping, doc) {\n        const mappedDecos = this.members.map(member => member.map(mapping, doc, noSpec));\n        return DecorationGroup.from(mappedDecos);\n    }\n    forChild(offset, child) {\n        if (child.isLeaf)\n            return DecorationSet.empty;\n        let found = [];\n        for (let i = 0; i < this.members.length; i++) {\n            let result = this.members[i].forChild(offset, child);\n            if (result == empty)\n                continue;\n            if (result instanceof DecorationGroup)\n                found = found.concat(result.members);\n            else\n                found.push(result);\n        }\n        return DecorationGroup.from(found);\n    }\n    eq(other) {\n        if (!(other instanceof DecorationGroup) ||\n            other.members.length != this.members.length)\n            return false;\n        for (let i = 0; i < this.members.length; i++)\n            if (!this.members[i].eq(other.members[i]))\n                return false;\n        return true;\n    }\n    locals(node) {\n        let result, sorted = true;\n        for (let i = 0; i < this.members.length; i++) {\n            let locals = this.members[i].localsInner(node);\n            if (!locals.length)\n                continue;\n            if (!result) {\n                result = locals;\n            }\n            else {\n                if (sorted) {\n                    result = result.slice();\n                    sorted = false;\n                }\n                for (let j = 0; j < locals.length; j++)\n                    result.push(locals[j]);\n            }\n        }\n        return result ? removeOverlap(sorted ? result : result.sort(byPos)) : none;\n    }\n    // Create a group for the given array of decoration sets, or return\n    // a single set when possible.\n    static from(members) {\n        switch (members.length) {\n            case 0: return empty;\n            case 1: return members[0];\n            default: return new DecorationGroup(members.every(m => m instanceof DecorationSet) ? members :\n                members.reduce((r, m) => r.concat(m instanceof DecorationSet ? m : m.members), []));\n        }\n    }\n}\nfunction mapChildren(oldChildren, newLocal, mapping, node, offset, oldOffset, options) {\n    let children = oldChildren.slice();\n    // Mark the children that are directly touched by changes, and\n    // move those that are after the changes.\n    for (let i = 0, baseOffset = oldOffset; i < mapping.maps.length; i++) {\n        let moved = 0;\n        mapping.maps[i].forEach((oldStart, oldEnd, newStart, newEnd) => {\n            let dSize = (newEnd - newStart) - (oldEnd - oldStart);\n            for (let i = 0; i < children.length; i += 3) {\n                let end = children[i + 1];\n                if (end < 0 || oldStart > end + baseOffset - moved)\n                    continue;\n                let start = children[i] + baseOffset - moved;\n                if (oldEnd >= start) {\n                    children[i + 1] = oldStart <= start ? -2 : -1;\n                }\n                else if (oldStart >= baseOffset && dSize) {\n                    children[i] += dSize;\n                    children[i + 1] += dSize;\n                }\n            }\n            moved += dSize;\n        });\n        baseOffset = mapping.maps[i].map(baseOffset, -1);\n    }\n    // Find the child nodes that still correspond to a single node,\n    // recursively call mapInner on them and update their positions.\n    let mustRebuild = false;\n    for (let i = 0; i < children.length; i += 3)\n        if (children[i + 1] < 0) { // Touched nodes\n            if (children[i + 1] == -2) {\n                mustRebuild = true;\n                children[i + 1] = -1;\n                continue;\n            }\n            let from = mapping.map(oldChildren[i] + oldOffset), fromLocal = from - offset;\n            if (fromLocal < 0 || fromLocal >= node.content.size) {\n                mustRebuild = true;\n                continue;\n            }\n            // Must read oldChildren because children was tagged with -1\n            let to = mapping.map(oldChildren[i + 1] + oldOffset, -1), toLocal = to - offset;\n            let { index, offset: childOffset } = node.content.findIndex(fromLocal);\n            let childNode = node.maybeChild(index);\n            if (childNode && childOffset == fromLocal && childOffset + childNode.nodeSize == toLocal) {\n                let mapped = children[i + 2]\n                    .mapInner(mapping, childNode, from + 1, oldChildren[i] + oldOffset + 1, options);\n                if (mapped != empty) {\n                    children[i] = fromLocal;\n                    children[i + 1] = toLocal;\n                    children[i + 2] = mapped;\n                }\n                else {\n                    children[i + 1] = -2;\n                    mustRebuild = true;\n                }\n            }\n            else {\n                mustRebuild = true;\n            }\n        }\n    // Remaining children must be collected and rebuilt into the appropriate structure\n    if (mustRebuild) {\n        let decorations = mapAndGatherRemainingDecorations(children, oldChildren, newLocal, mapping, offset, oldOffset, options);\n        let built = buildTree(decorations, node, 0, options);\n        newLocal = built.local;\n        for (let i = 0; i < children.length; i += 3)\n            if (children[i + 1] < 0) {\n                children.splice(i, 3);\n                i -= 3;\n            }\n        for (let i = 0, j = 0; i < built.children.length; i += 3) {\n            let from = built.children[i];\n            while (j < children.length && children[j] < from)\n                j += 3;\n            children.splice(j, 0, built.children[i], built.children[i + 1], built.children[i + 2]);\n        }\n    }\n    return new DecorationSet(newLocal.sort(byPos), children);\n}\nfunction moveSpans(spans, offset) {\n    if (!offset || !spans.length)\n        return spans;\n    let result = [];\n    for (let i = 0; i < spans.length; i++) {\n        let span = spans[i];\n        result.push(new Decoration(span.from + offset, span.to + offset, span.type));\n    }\n    return result;\n}\nfunction mapAndGatherRemainingDecorations(children, oldChildren, decorations, mapping, offset, oldOffset, options) {\n    // Gather all decorations from the remaining marked children\n    function gather(set, oldOffset) {\n        for (let i = 0; i < set.local.length; i++) {\n            let mapped = set.local[i].map(mapping, offset, oldOffset);\n            if (mapped)\n                decorations.push(mapped);\n            else if (options.onRemove)\n                options.onRemove(set.local[i].spec);\n        }\n        for (let i = 0; i < set.children.length; i += 3)\n            gather(set.children[i + 2], set.children[i] + oldOffset + 1);\n    }\n    for (let i = 0; i < children.length; i += 3)\n        if (children[i + 1] == -1)\n            gather(children[i + 2], oldChildren[i] + oldOffset + 1);\n    return decorations;\n}\nfunction takeSpansForNode(spans, node, offset) {\n    if (node.isLeaf)\n        return null;\n    let end = offset + node.nodeSize, found = null;\n    for (let i = 0, span; i < spans.length; i++) {\n        if ((span = spans[i]) && span.from > offset && span.to < end) {\n            (found || (found = [])).push(span);\n            spans[i] = null;\n        }\n    }\n    return found;\n}\nfunction withoutNulls(array) {\n    let result = [];\n    for (let i = 0; i < array.length; i++)\n        if (array[i] != null)\n            result.push(array[i]);\n    return result;\n}\n// Build up a tree that corresponds to a set of decorations. `offset`\n// is a base offset that should be subtracted from the `from` and `to`\n// positions in the spans (so that we don't have to allocate new spans\n// for recursive calls).\nfunction buildTree(spans, node, offset, options) {\n    let children = [], hasNulls = false;\n    node.forEach((childNode, localStart) => {\n        let found = takeSpansForNode(spans, childNode, localStart + offset);\n        if (found) {\n            hasNulls = true;\n            let subtree = buildTree(found, childNode, offset + localStart + 1, options);\n            if (subtree != empty)\n                children.push(localStart, localStart + childNode.nodeSize, subtree);\n        }\n    });\n    let locals = moveSpans(hasNulls ? withoutNulls(spans) : spans, -offset).sort(byPos);\n    for (let i = 0; i < locals.length; i++)\n        if (!locals[i].type.valid(node, locals[i])) {\n            if (options.onRemove)\n                options.onRemove(locals[i].spec);\n            locals.splice(i--, 1);\n        }\n    return locals.length || children.length ? new DecorationSet(locals, children) : empty;\n}\n// Used to sort decorations so that ones with a low start position\n// come first, and within a set with the same start position, those\n// with an smaller end position come first.\nfunction byPos(a, b) {\n    return a.from - b.from || a.to - b.to;\n}\n// Scan a sorted array of decorations for partially overlapping spans,\n// and split those so that only fully overlapping spans are left (to\n// make subsequent rendering easier). Will return the input array if\n// no partially overlapping spans are found (the common case).\nfunction removeOverlap(spans) {\n    let working = spans;\n    for (let i = 0; i < working.length - 1; i++) {\n        let span = working[i];\n        if (span.from != span.to)\n            for (let j = i + 1; j < working.length; j++) {\n                let next = working[j];\n                if (next.from == span.from) {\n                    if (next.to != span.to) {\n                        if (working == spans)\n                            working = spans.slice();\n                        // Followed by a partially overlapping larger span. Split that\n                        // span.\n                        working[j] = next.copy(next.from, span.to);\n                        insertAhead(working, j + 1, next.copy(span.to, next.to));\n                    }\n                    continue;\n                }\n                else {\n                    if (next.from < span.to) {\n                        if (working == spans)\n                            working = spans.slice();\n                        // The end of this one overlaps with a subsequent span. Split\n                        // this one.\n                        working[i] = span.copy(span.from, next.from);\n                        insertAhead(working, j, span.copy(next.from, span.to));\n                    }\n                    break;\n                }\n            }\n    }\n    return working;\n}\nfunction insertAhead(array, i, deco) {\n    while (i < array.length && byPos(deco, array[i]) > 0)\n        i++;\n    array.splice(i, 0, deco);\n}\n// Get the decorations associated with the current props of a view.\nfunction viewDecorations(view) {\n    let found = [];\n    view.someProp(\"decorations\", f => {\n        let result = f(view.state);\n        if (result && result != empty)\n            found.push(result);\n    });\n    if (view.cursorWrapper)\n        found.push(DecorationSet.create(view.state.doc, [view.cursorWrapper.deco]));\n    return DecorationGroup.from(found);\n}\n\nconst observeOptions = {\n    childList: true,\n    characterData: true,\n    characterDataOldValue: true,\n    attributes: true,\n    attributeOldValue: true,\n    subtree: true\n};\n// IE11 has very broken mutation observers, so we also listen to DOMCharacterDataModified\nconst useCharData = ie && ie_version <= 11;\nclass SelectionState {\n    constructor() {\n        this.anchorNode = null;\n        this.anchorOffset = 0;\n        this.focusNode = null;\n        this.focusOffset = 0;\n    }\n    set(sel) {\n        this.anchorNode = sel.anchorNode;\n        this.anchorOffset = sel.anchorOffset;\n        this.focusNode = sel.focusNode;\n        this.focusOffset = sel.focusOffset;\n    }\n    clear() {\n        this.anchorNode = this.focusNode = null;\n    }\n    eq(sel) {\n        return sel.anchorNode == this.anchorNode && sel.anchorOffset == this.anchorOffset &&\n            sel.focusNode == this.focusNode && sel.focusOffset == this.focusOffset;\n    }\n}\nclass DOMObserver {\n    constructor(view, handleDOMChange) {\n        this.view = view;\n        this.handleDOMChange = handleDOMChange;\n        this.queue = [];\n        this.flushingSoon = -1;\n        this.observer = null;\n        this.currentSelection = new SelectionState;\n        this.onCharData = null;\n        this.suppressingSelectionUpdates = false;\n        this.lastChangedTextNode = null;\n        this.observer = window.MutationObserver &&\n            new window.MutationObserver(mutations => {\n                for (let i = 0; i < mutations.length; i++)\n                    this.queue.push(mutations[i]);\n                // IE11 will sometimes (on backspacing out a single character\n                // text node after a BR node) call the observer callback\n                // before actually updating the DOM, which will cause\n                // ProseMirror to miss the change (see #930)\n                if (ie && ie_version <= 11 && mutations.some(m => m.type == \"childList\" && m.removedNodes.length ||\n                    m.type == \"characterData\" && m.oldValue.length > m.target.nodeValue.length))\n                    this.flushSoon();\n                else\n                    this.flush();\n            });\n        if (useCharData) {\n            this.onCharData = e => {\n                this.queue.push({ target: e.target, type: \"characterData\", oldValue: e.prevValue });\n                this.flushSoon();\n            };\n        }\n        this.onSelectionChange = this.onSelectionChange.bind(this);\n    }\n    flushSoon() {\n        if (this.flushingSoon < 0)\n            this.flushingSoon = window.setTimeout(() => { this.flushingSoon = -1; this.flush(); }, 20);\n    }\n    forceFlush() {\n        if (this.flushingSoon > -1) {\n            window.clearTimeout(this.flushingSoon);\n            this.flushingSoon = -1;\n            this.flush();\n        }\n    }\n    start() {\n        if (this.observer) {\n            this.observer.takeRecords();\n            this.observer.observe(this.view.dom, observeOptions);\n        }\n        if (this.onCharData)\n            this.view.dom.addEventListener(\"DOMCharacterDataModified\", this.onCharData);\n        this.connectSelection();\n    }\n    stop() {\n        if (this.observer) {\n            let take = this.observer.takeRecords();\n            if (take.length) {\n                for (let i = 0; i < take.length; i++)\n                    this.queue.push(take[i]);\n                window.setTimeout(() => this.flush(), 20);\n            }\n            this.observer.disconnect();\n        }\n        if (this.onCharData)\n            this.view.dom.removeEventListener(\"DOMCharacterDataModified\", this.onCharData);\n        this.disconnectSelection();\n    }\n    connectSelection() {\n        this.view.dom.ownerDocument.addEventListener(\"selectionchange\", this.onSelectionChange);\n    }\n    disconnectSelection() {\n        this.view.dom.ownerDocument.removeEventListener(\"selectionchange\", this.onSelectionChange);\n    }\n    suppressSelectionUpdates() {\n        this.suppressingSelectionUpdates = true;\n        setTimeout(() => this.suppressingSelectionUpdates = false, 50);\n    }\n    onSelectionChange() {\n        if (!hasFocusAndSelection(this.view))\n            return;\n        if (this.suppressingSelectionUpdates)\n            return selectionToDOM(this.view);\n        // Deletions on IE11 fire their events in the wrong order, giving\n        // us a selection change event before the DOM changes are\n        // reported.\n        if (ie && ie_version <= 11 && !this.view.state.selection.empty) {\n            let sel = this.view.domSelectionRange();\n            // Selection.isCollapsed isn't reliable on IE\n            if (sel.focusNode && isEquivalentPosition(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset))\n                return this.flushSoon();\n        }\n        this.flush();\n    }\n    setCurSelection() {\n        this.currentSelection.set(this.view.domSelectionRange());\n    }\n    ignoreSelectionChange(sel) {\n        if (!sel.focusNode)\n            return true;\n        let ancestors = new Set, container;\n        for (let scan = sel.focusNode; scan; scan = parentNode(scan))\n            ancestors.add(scan);\n        for (let scan = sel.anchorNode; scan; scan = parentNode(scan))\n            if (ancestors.has(scan)) {\n                container = scan;\n                break;\n            }\n        let desc = container && this.view.docView.nearestDesc(container);\n        if (desc && desc.ignoreMutation({\n            type: \"selection\",\n            target: container.nodeType == 3 ? container.parentNode : container\n        })) {\n            this.setCurSelection();\n            return true;\n        }\n    }\n    pendingRecords() {\n        if (this.observer)\n            for (let mut of this.observer.takeRecords())\n                this.queue.push(mut);\n        return this.queue;\n    }\n    flush() {\n        let { view } = this;\n        if (!view.docView || this.flushingSoon > -1)\n            return;\n        let mutations = this.pendingRecords();\n        if (mutations.length)\n            this.queue = [];\n        let sel = view.domSelectionRange();\n        let newSel = !this.suppressingSelectionUpdates && !this.currentSelection.eq(sel) && hasFocusAndSelection(view) && !this.ignoreSelectionChange(sel);\n        let from = -1, to = -1, typeOver = false, added = [];\n        if (view.editable) {\n            for (let i = 0; i < mutations.length; i++) {\n                let result = this.registerMutation(mutations[i], added);\n                if (result) {\n                    from = from < 0 ? result.from : Math.min(result.from, from);\n                    to = to < 0 ? result.to : Math.max(result.to, to);\n                    if (result.typeOver)\n                        typeOver = true;\n                }\n            }\n        }\n        if (gecko && added.length) {\n            let brs = added.filter(n => n.nodeName == \"BR\");\n            if (brs.length == 2) {\n                let [a, b] = brs;\n                if (a.parentNode && a.parentNode.parentNode == b.parentNode)\n                    b.remove();\n                else\n                    a.remove();\n            }\n            else {\n                let { focusNode } = this.currentSelection;\n                for (let br of brs) {\n                    let parent = br.parentNode;\n                    if (parent && parent.nodeName == \"LI\" && (!focusNode || blockParent(view, focusNode) != parent))\n                        br.remove();\n                }\n            }\n        }\n        let readSel = null;\n        // If it looks like the browser has reset the selection to the\n        // start of the document after focus, restore the selection from\n        // the state\n        if (from < 0 && newSel && view.input.lastFocus > Date.now() - 200 &&\n            Math.max(view.input.lastTouch, view.input.lastClick.time) < Date.now() - 300 &&\n            selectionCollapsed(sel) && (readSel = selectionFromDOM(view)) &&\n            readSel.eq(Selection.near(view.state.doc.resolve(0), 1))) {\n            view.input.lastFocus = 0;\n            selectionToDOM(view);\n            this.currentSelection.set(sel);\n            view.scrollToSelection();\n        }\n        else if (from > -1 || newSel) {\n            if (from > -1) {\n                view.docView.markDirty(from, to);\n                checkCSS(view);\n            }\n            this.handleDOMChange(from, to, typeOver, added);\n            if (view.docView && view.docView.dirty)\n                view.updateState(view.state);\n            else if (!this.currentSelection.eq(sel))\n                selectionToDOM(view);\n            this.currentSelection.set(sel);\n        }\n    }\n    registerMutation(mut, added) {\n        // Ignore mutations inside nodes that were already noted as inserted\n        if (added.indexOf(mut.target) > -1)\n            return null;\n        let desc = this.view.docView.nearestDesc(mut.target);\n        if (mut.type == \"attributes\" &&\n            (desc == this.view.docView || mut.attributeName == \"contenteditable\" ||\n                // Firefox sometimes fires spurious events for null/empty styles\n                (mut.attributeName == \"style\" && !mut.oldValue && !mut.target.getAttribute(\"style\"))))\n            return null;\n        if (!desc || desc.ignoreMutation(mut))\n            return null;\n        if (mut.type == \"childList\") {\n            for (let i = 0; i < mut.addedNodes.length; i++) {\n                let node = mut.addedNodes[i];\n                added.push(node);\n                if (node.nodeType == 3)\n                    this.lastChangedTextNode = node;\n            }\n            if (desc.contentDOM && desc.contentDOM != desc.dom && !desc.contentDOM.contains(mut.target))\n                return { from: desc.posBefore, to: desc.posAfter };\n            let prev = mut.previousSibling, next = mut.nextSibling;\n            if (ie && ie_version <= 11 && mut.addedNodes.length) {\n                // IE11 gives us incorrect next/prev siblings for some\n                // insertions, so if there are added nodes, recompute those\n                for (let i = 0; i < mut.addedNodes.length; i++) {\n                    let { previousSibling, nextSibling } = mut.addedNodes[i];\n                    if (!previousSibling || Array.prototype.indexOf.call(mut.addedNodes, previousSibling) < 0)\n                        prev = previousSibling;\n                    if (!nextSibling || Array.prototype.indexOf.call(mut.addedNodes, nextSibling) < 0)\n                        next = nextSibling;\n                }\n            }\n            let fromOffset = prev && prev.parentNode == mut.target\n                ? domIndex(prev) + 1 : 0;\n            let from = desc.localPosFromDOM(mut.target, fromOffset, -1);\n            let toOffset = next && next.parentNode == mut.target\n                ? domIndex(next) : mut.target.childNodes.length;\n            let to = desc.localPosFromDOM(mut.target, toOffset, 1);\n            return { from, to };\n        }\n        else if (mut.type == \"attributes\") {\n            return { from: desc.posAtStart - desc.border, to: desc.posAtEnd + desc.border };\n        }\n        else { // \"characterData\"\n            this.lastChangedTextNode = mut.target;\n            return {\n                from: desc.posAtStart,\n                to: desc.posAtEnd,\n                // An event was generated for a text change that didn't change\n                // any text. Mark the dom change to fall back to assuming the\n                // selection was typed over with an identical value if it can't\n                // find another change.\n                typeOver: mut.target.nodeValue == mut.oldValue\n            };\n        }\n    }\n}\nlet cssChecked = new WeakMap();\nlet cssCheckWarned = false;\nfunction checkCSS(view) {\n    if (cssChecked.has(view))\n        return;\n    cssChecked.set(view, null);\n    if (['normal', 'nowrap', 'pre-line'].indexOf(getComputedStyle(view.dom).whiteSpace) !== -1) {\n        view.requiresGeckoHackNode = gecko;\n        if (cssCheckWarned)\n            return;\n        console[\"warn\"](\"ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package.\");\n        cssCheckWarned = true;\n    }\n}\nfunction rangeToSelectionRange(view, range) {\n    let anchorNode = range.startContainer, anchorOffset = range.startOffset;\n    let focusNode = range.endContainer, focusOffset = range.endOffset;\n    let currentAnchor = view.domAtPos(view.state.selection.anchor);\n    // Since such a range doesn't distinguish between anchor and head,\n    // use a heuristic that flips it around if its end matches the\n    // current anchor.\n    if (isEquivalentPosition(currentAnchor.node, currentAnchor.offset, focusNode, focusOffset))\n        [anchorNode, anchorOffset, focusNode, focusOffset] = [focusNode, focusOffset, anchorNode, anchorOffset];\n    return { anchorNode, anchorOffset, focusNode, focusOffset };\n}\n// Used to work around a Safari Selection/shadow DOM bug\n// Based on https://github.com/codemirror/dev/issues/414 fix\nfunction safariShadowSelectionRange(view, selection) {\n    if (selection.getComposedRanges) {\n        let range = selection.getComposedRanges(view.root)[0];\n        if (range)\n            return rangeToSelectionRange(view, range);\n    }\n    let found;\n    function read(event) {\n        event.preventDefault();\n        event.stopImmediatePropagation();\n        found = event.getTargetRanges()[0];\n    }\n    // Because Safari (at least in 2018-2022) doesn't provide regular\n    // access to the selection inside a shadowRoot, we have to perform a\n    // ridiculous hack to get at it—using `execCommand` to trigger a\n    // `beforeInput` event so that we can read the target range from the\n    // event.\n    view.dom.addEventListener(\"beforeinput\", read, true);\n    document.execCommand(\"indent\");\n    view.dom.removeEventListener(\"beforeinput\", read, true);\n    return found ? rangeToSelectionRange(view, found) : null;\n}\nfunction blockParent(view, node) {\n    for (let p = node.parentNode; p && p != view.dom; p = p.parentNode) {\n        let desc = view.docView.nearestDesc(p, true);\n        if (desc && desc.node.isBlock)\n            return p;\n    }\n    return null;\n}\n\n// Note that all referencing and parsing is done with the\n// start-of-operation selection and document, since that's the one\n// that the DOM represents. If any changes came in in the meantime,\n// the modification is mapped over those before it is applied, in\n// readDOMChange.\nfunction parseBetween(view, from_, to_) {\n    let { node: parent, fromOffset, toOffset, from, to } = view.docView.parseRange(from_, to_);\n    let domSel = view.domSelectionRange();\n    let find;\n    let anchor = domSel.anchorNode;\n    if (anchor && view.dom.contains(anchor.nodeType == 1 ? anchor : anchor.parentNode)) {\n        find = [{ node: anchor, offset: domSel.anchorOffset }];\n        if (!selectionCollapsed(domSel))\n            find.push({ node: domSel.focusNode, offset: domSel.focusOffset });\n    }\n    // Work around issue in Chrome where backspacing sometimes replaces\n    // the deleted content with a random BR node (issues #799, #831)\n    if (chrome && view.input.lastKeyCode === 8) {\n        for (let off = toOffset; off > fromOffset; off--) {\n            let node = parent.childNodes[off - 1], desc = node.pmViewDesc;\n            if (node.nodeName == \"BR\" && !desc) {\n                toOffset = off;\n                break;\n            }\n            if (!desc || desc.size)\n                break;\n        }\n    }\n    let startDoc = view.state.doc;\n    let parser = view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n    let $from = startDoc.resolve(from);\n    let sel = null, doc = parser.parse(parent, {\n        topNode: $from.parent,\n        topMatch: $from.parent.contentMatchAt($from.index()),\n        topOpen: true,\n        from: fromOffset,\n        to: toOffset,\n        preserveWhitespace: $from.parent.type.whitespace == \"pre\" ? \"full\" : true,\n        findPositions: find,\n        ruleFromNode,\n        context: $from\n    });\n    if (find && find[0].pos != null) {\n        let anchor = find[0].pos, head = find[1] && find[1].pos;\n        if (head == null)\n            head = anchor;\n        sel = { anchor: anchor + from, head: head + from };\n    }\n    return { doc, sel, from, to };\n}\nfunction ruleFromNode(dom) {\n    let desc = dom.pmViewDesc;\n    if (desc) {\n        return desc.parseRule();\n    }\n    else if (dom.nodeName == \"BR\" && dom.parentNode) {\n        // Safari replaces the list item or table cell with a BR\n        // directly in the list node (?!) if you delete the last\n        // character in a list item or table cell (#708, #862)\n        if (safari && /^(ul|ol)$/i.test(dom.parentNode.nodeName)) {\n            let skip = document.createElement(\"div\");\n            skip.appendChild(document.createElement(\"li\"));\n            return { skip };\n        }\n        else if (dom.parentNode.lastChild == dom || safari && /^(tr|table)$/i.test(dom.parentNode.nodeName)) {\n            return { ignore: true };\n        }\n    }\n    else if (dom.nodeName == \"IMG\" && dom.getAttribute(\"mark-placeholder\")) {\n        return { ignore: true };\n    }\n    return null;\n}\nconst isInline = /^(a|abbr|acronym|b|bd[io]|big|br|button|cite|code|data(list)?|del|dfn|em|i|ins|kbd|label|map|mark|meter|output|q|ruby|s|samp|small|span|strong|su[bp]|time|u|tt|var)$/i;\nfunction readDOMChange(view, from, to, typeOver, addedNodes) {\n    let compositionID = view.input.compositionPendingChanges || (view.composing ? view.input.compositionID : 0);\n    view.input.compositionPendingChanges = 0;\n    if (from < 0) {\n        let origin = view.input.lastSelectionTime > Date.now() - 50 ? view.input.lastSelectionOrigin : null;\n        let newSel = selectionFromDOM(view, origin);\n        if (newSel && !view.state.selection.eq(newSel)) {\n            if (chrome && android &&\n                view.input.lastKeyCode === 13 && Date.now() - 100 < view.input.lastKeyCodeTime &&\n                view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\"))))\n                return;\n            let tr = view.state.tr.setSelection(newSel);\n            if (origin == \"pointer\")\n                tr.setMeta(\"pointer\", true);\n            else if (origin == \"key\")\n                tr.scrollIntoView();\n            if (compositionID)\n                tr.setMeta(\"composition\", compositionID);\n            view.dispatch(tr);\n        }\n        return;\n    }\n    let $before = view.state.doc.resolve(from);\n    let shared = $before.sharedDepth(to);\n    from = $before.before(shared + 1);\n    to = view.state.doc.resolve(to).after(shared + 1);\n    let sel = view.state.selection;\n    let parse = parseBetween(view, from, to);\n    let doc = view.state.doc, compare = doc.slice(parse.from, parse.to);\n    let preferredPos, preferredSide;\n    // Prefer anchoring to end when Backspace is pressed\n    if (view.input.lastKeyCode === 8 && Date.now() - 100 < view.input.lastKeyCodeTime) {\n        preferredPos = view.state.selection.to;\n        preferredSide = \"end\";\n    }\n    else {\n        preferredPos = view.state.selection.from;\n        preferredSide = \"start\";\n    }\n    view.input.lastKeyCode = null;\n    let change = findDiff(compare.content, parse.doc.content, parse.from, preferredPos, preferredSide);\n    if ((ios && view.input.lastIOSEnter > Date.now() - 225 || android) &&\n        addedNodes.some(n => n.nodeType == 1 && !isInline.test(n.nodeName)) &&\n        (!change || change.endA >= change.endB) &&\n        view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")))) {\n        view.input.lastIOSEnter = 0;\n        return;\n    }\n    if (!change) {\n        if (typeOver && sel instanceof TextSelection && !sel.empty && sel.$head.sameParent(sel.$anchor) &&\n            !view.composing && !(parse.sel && parse.sel.anchor != parse.sel.head)) {\n            change = { start: sel.from, endA: sel.to, endB: sel.to };\n        }\n        else {\n            if (parse.sel) {\n                let sel = resolveSelection(view, view.state.doc, parse.sel);\n                if (sel && !sel.eq(view.state.selection)) {\n                    let tr = view.state.tr.setSelection(sel);\n                    if (compositionID)\n                        tr.setMeta(\"composition\", compositionID);\n                    view.dispatch(tr);\n                }\n            }\n            return;\n        }\n    }\n    view.input.domChangeCount++;\n    // Handle the case where overwriting a selection by typing matches\n    // the start or end of the selected content, creating a change\n    // that's smaller than what was actually overwritten.\n    if (view.state.selection.from < view.state.selection.to &&\n        change.start == change.endB &&\n        view.state.selection instanceof TextSelection) {\n        if (change.start > view.state.selection.from && change.start <= view.state.selection.from + 2 &&\n            view.state.selection.from >= parse.from) {\n            change.start = view.state.selection.from;\n        }\n        else if (change.endA < view.state.selection.to && change.endA >= view.state.selection.to - 2 &&\n            view.state.selection.to <= parse.to) {\n            change.endB += (view.state.selection.to - change.endA);\n            change.endA = view.state.selection.to;\n        }\n    }\n    // IE11 will insert a non-breaking space _ahead_ of the space after\n    // the cursor space when adding a space before another space. When\n    // that happened, adjust the change to cover the space instead.\n    if (ie && ie_version <= 11 && change.endB == change.start + 1 &&\n        change.endA == change.start && change.start > parse.from &&\n        parse.doc.textBetween(change.start - parse.from - 1, change.start - parse.from + 1) == \" \\u00a0\") {\n        change.start--;\n        change.endA--;\n        change.endB--;\n    }\n    let $from = parse.doc.resolveNoCache(change.start - parse.from);\n    let $to = parse.doc.resolveNoCache(change.endB - parse.from);\n    let $fromA = doc.resolve(change.start);\n    let inlineChange = $from.sameParent($to) && $from.parent.inlineContent && $fromA.end() >= change.endA;\n    let nextSel;\n    // If this looks like the effect of pressing Enter (or was recorded\n    // as being an iOS enter press), just dispatch an Enter key instead.\n    if (((ios && view.input.lastIOSEnter > Date.now() - 225 &&\n        (!inlineChange || addedNodes.some(n => n.nodeName == \"DIV\" || n.nodeName == \"P\"))) ||\n        (!inlineChange && $from.pos < parse.doc.content.size && !$from.sameParent($to) &&\n            (nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) &&\n            nextSel.head == $to.pos)) &&\n        view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")))) {\n        view.input.lastIOSEnter = 0;\n        return;\n    }\n    // Same for backspace\n    if (view.state.selection.anchor > change.start &&\n        looksLikeBackspace(doc, change.start, change.endA, $from, $to) &&\n        view.someProp(\"handleKeyDown\", f => f(view, keyEvent(8, \"Backspace\")))) {\n        if (android && chrome)\n            view.domObserver.suppressSelectionUpdates(); // #820\n        return;\n    }\n    // Chrome Android will occasionally, during composition, delete the\n    // entire composition and then immediately insert it again. This is\n    // used to detect that situation.\n    if (chrome && android && change.endB == change.start)\n        view.input.lastAndroidDelete = Date.now();\n    // This tries to detect Android virtual keyboard\n    // enter-and-pick-suggestion action. That sometimes (see issue\n    // #1059) first fires a DOM mutation, before moving the selection to\n    // the newly created block. And then, because ProseMirror cleans up\n    // the DOM selection, it gives up moving the selection entirely,\n    // leaving the cursor in the wrong place. When that happens, we drop\n    // the new paragraph from the initial change, and fire a simulated\n    // enter key afterwards.\n    if (android && !inlineChange && $from.start() != $to.start() && $to.parentOffset == 0 && $from.depth == $to.depth &&\n        parse.sel && parse.sel.anchor == parse.sel.head && parse.sel.head == change.endA) {\n        change.endB -= 2;\n        $to = parse.doc.resolveNoCache(change.endB - parse.from);\n        setTimeout(() => {\n            view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); });\n        }, 20);\n    }\n    let chFrom = change.start, chTo = change.endA;\n    let tr, storedMarks, markChange;\n    if (inlineChange) {\n        if ($from.pos == $to.pos) { // Deletion\n            // IE11 sometimes weirdly moves the DOM selection around after\n            // backspacing out the first element in a textblock\n            if (ie && ie_version <= 11 && $from.parentOffset == 0) {\n                view.domObserver.suppressSelectionUpdates();\n                setTimeout(() => selectionToDOM(view), 20);\n            }\n            tr = view.state.tr.delete(chFrom, chTo);\n            storedMarks = doc.resolve(change.start).marksAcross(doc.resolve(change.endA));\n        }\n        else if ( // Adding or removing a mark\n        change.endA == change.endB &&\n            (markChange = isMarkChange($from.parent.content.cut($from.parentOffset, $to.parentOffset), $fromA.parent.content.cut($fromA.parentOffset, change.endA - $fromA.start())))) {\n            tr = view.state.tr;\n            if (markChange.type == \"add\")\n                tr.addMark(chFrom, chTo, markChange.mark);\n            else\n                tr.removeMark(chFrom, chTo, markChange.mark);\n        }\n        else if ($from.parent.child($from.index()).isText && $from.index() == $to.index() - ($to.textOffset ? 0 : 1)) {\n            // Both positions in the same text node -- simply insert text\n            let text = $from.parent.textBetween($from.parentOffset, $to.parentOffset);\n            if (view.someProp(\"handleTextInput\", f => f(view, chFrom, chTo, text)))\n                return;\n            tr = view.state.tr.insertText(text, chFrom, chTo);\n        }\n    }\n    if (!tr)\n        tr = view.state.tr.replace(chFrom, chTo, parse.doc.slice(change.start - parse.from, change.endB - parse.from));\n    if (parse.sel) {\n        let sel = resolveSelection(view, tr.doc, parse.sel);\n        // Chrome Android will sometimes, during composition, report the\n        // selection in the wrong place. If it looks like that is\n        // happening, don't update the selection.\n        // Edge just doesn't move the cursor forward when you start typing\n        // in an empty block or between br nodes.\n        if (sel && !(chrome && android && view.composing && sel.empty &&\n            (change.start != change.endB || view.input.lastAndroidDelete < Date.now() - 100) &&\n            (sel.head == chFrom || sel.head == tr.mapping.map(chTo) - 1) ||\n            ie && sel.empty && sel.head == chFrom))\n            tr.setSelection(sel);\n    }\n    if (storedMarks)\n        tr.ensureMarks(storedMarks);\n    if (compositionID)\n        tr.setMeta(\"composition\", compositionID);\n    view.dispatch(tr.scrollIntoView());\n}\nfunction resolveSelection(view, doc, parsedSel) {\n    if (Math.max(parsedSel.anchor, parsedSel.head) > doc.content.size)\n        return null;\n    return selectionBetween(view, doc.resolve(parsedSel.anchor), doc.resolve(parsedSel.head));\n}\n// Given two same-length, non-empty fragments of inline content,\n// determine whether the first could be created from the second by\n// removing or adding a single mark type.\nfunction isMarkChange(cur, prev) {\n    let curMarks = cur.firstChild.marks, prevMarks = prev.firstChild.marks;\n    let added = curMarks, removed = prevMarks, type, mark, update;\n    for (let i = 0; i < prevMarks.length; i++)\n        added = prevMarks[i].removeFromSet(added);\n    for (let i = 0; i < curMarks.length; i++)\n        removed = curMarks[i].removeFromSet(removed);\n    if (added.length == 1 && removed.length == 0) {\n        mark = added[0];\n        type = \"add\";\n        update = (node) => node.mark(mark.addToSet(node.marks));\n    }\n    else if (added.length == 0 && removed.length == 1) {\n        mark = removed[0];\n        type = \"remove\";\n        update = (node) => node.mark(mark.removeFromSet(node.marks));\n    }\n    else {\n        return null;\n    }\n    let updated = [];\n    for (let i = 0; i < prev.childCount; i++)\n        updated.push(update(prev.child(i)));\n    if (Fragment.from(updated).eq(cur))\n        return { mark, type };\n}\nfunction looksLikeBackspace(old, start, end, $newStart, $newEnd) {\n    if ( // The content must have shrunk\n    end - start <= $newEnd.pos - $newStart.pos ||\n        // newEnd must point directly at or after the end of the block that newStart points into\n        skipClosingAndOpening($newStart, true, false) < $newEnd.pos)\n        return false;\n    let $start = old.resolve(start);\n    // Handle the case where, rather than joining blocks, the change just removed an entire block\n    if (!$newStart.parent.isTextblock) {\n        let after = $start.nodeAfter;\n        return after != null && end == start + after.nodeSize;\n    }\n    // Start must be at the end of a block\n    if ($start.parentOffset < $start.parent.content.size || !$start.parent.isTextblock)\n        return false;\n    let $next = old.resolve(skipClosingAndOpening($start, true, true));\n    // The next textblock must start before end and end near it\n    if (!$next.parent.isTextblock || $next.pos > end ||\n        skipClosingAndOpening($next, true, false) < end)\n        return false;\n    // The fragments after the join point must match\n    return $newStart.parent.content.cut($newStart.parentOffset).eq($next.parent.content);\n}\nfunction skipClosingAndOpening($pos, fromEnd, mayOpen) {\n    let depth = $pos.depth, end = fromEnd ? $pos.end() : $pos.pos;\n    while (depth > 0 && (fromEnd || $pos.indexAfter(depth) == $pos.node(depth).childCount)) {\n        depth--;\n        end++;\n        fromEnd = false;\n    }\n    if (mayOpen) {\n        let next = $pos.node(depth).maybeChild($pos.indexAfter(depth));\n        while (next && !next.isLeaf) {\n            next = next.firstChild;\n            end++;\n        }\n    }\n    return end;\n}\nfunction findDiff(a, b, pos, preferredPos, preferredSide) {\n    let start = a.findDiffStart(b, pos);\n    if (start == null)\n        return null;\n    let { a: endA, b: endB } = a.findDiffEnd(b, pos + a.size, pos + b.size);\n    if (preferredSide == \"end\") {\n        let adjust = Math.max(0, start - Math.min(endA, endB));\n        preferredPos -= endA + adjust - start;\n    }\n    if (endA < start && a.size < b.size) {\n        let move = preferredPos <= start && preferredPos >= endA ? start - preferredPos : 0;\n        start -= move;\n        if (start && start < b.size && isSurrogatePair(b.textBetween(start - 1, start + 1)))\n            start += move ? 1 : -1;\n        endB = start + (endB - endA);\n        endA = start;\n    }\n    else if (endB < start) {\n        let move = preferredPos <= start && preferredPos >= endB ? start - preferredPos : 0;\n        start -= move;\n        if (start && start < a.size && isSurrogatePair(a.textBetween(start - 1, start + 1)))\n            start += move ? 1 : -1;\n        endA = start + (endA - endB);\n        endB = start;\n    }\n    return { start, endA, endB };\n}\nfunction isSurrogatePair(str) {\n    if (str.length != 2)\n        return false;\n    let a = str.charCodeAt(0), b = str.charCodeAt(1);\n    return a >= 0xDC00 && a <= 0xDFFF && b >= 0xD800 && b <= 0xDBFF;\n}\n\n/**\n@internal\n*/\nconst __serializeForClipboard = serializeForClipboard;\n/**\n@internal\n*/\nconst __parseFromClipboard = parseFromClipboard;\n/**\n@internal\n*/\nconst __endComposition = endComposition;\n/**\nAn editor view manages the DOM structure that represents an\neditable document. Its state and behavior are determined by its\n[props](https://prosemirror.net/docs/ref/#view.DirectEditorProps).\n*/\nclass EditorView {\n    /**\n    Create a view. `place` may be a DOM node that the editor should\n    be appended to, a function that will place it into the document,\n    or an object whose `mount` property holds the node to use as the\n    document container. If it is `null`, the editor will not be\n    added to the document.\n    */\n    constructor(place, props) {\n        this._root = null;\n        /**\n        @internal\n        */\n        this.focused = false;\n        /**\n        Kludge used to work around a Chrome bug @internal\n        */\n        this.trackWrites = null;\n        this.mounted = false;\n        /**\n        @internal\n        */\n        this.markCursor = null;\n        /**\n        @internal\n        */\n        this.cursorWrapper = null;\n        /**\n        @internal\n        */\n        this.lastSelectedViewDesc = undefined;\n        /**\n        @internal\n        */\n        this.input = new InputState;\n        this.prevDirectPlugins = [];\n        this.pluginViews = [];\n        /**\n        Holds `true` when a hack node is needed in Firefox to prevent the\n        [space is eaten issue](https://github.com/ProseMirror/prosemirror/issues/651)\n        @internal\n        */\n        this.requiresGeckoHackNode = false;\n        /**\n        When editor content is being dragged, this object contains\n        information about the dragged slice and whether it is being\n        copied or moved. At any other time, it is null.\n        */\n        this.dragging = null;\n        this._props = props;\n        this.state = props.state;\n        this.directPlugins = props.plugins || [];\n        this.directPlugins.forEach(checkStateComponent);\n        this.dispatch = this.dispatch.bind(this);\n        this.dom = (place && place.mount) || document.createElement(\"div\");\n        if (place) {\n            if (place.appendChild)\n                place.appendChild(this.dom);\n            else if (typeof place == \"function\")\n                place(this.dom);\n            else if (place.mount)\n                this.mounted = true;\n        }\n        this.editable = getEditable(this);\n        updateCursorWrapper(this);\n        this.nodeViews = buildNodeViews(this);\n        this.docView = docViewDesc(this.state.doc, computeDocDeco(this), viewDecorations(this), this.dom, this);\n        this.domObserver = new DOMObserver(this, (from, to, typeOver, added) => readDOMChange(this, from, to, typeOver, added));\n        this.domObserver.start();\n        initInput(this);\n        this.updatePluginViews();\n    }\n    /**\n    Holds `true` when a\n    [composition](https://w3c.github.io/uievents/#events-compositionevents)\n    is active.\n    */\n    get composing() { return this.input.composing; }\n    /**\n    The view's current [props](https://prosemirror.net/docs/ref/#view.EditorProps).\n    */\n    get props() {\n        if (this._props.state != this.state) {\n            let prev = this._props;\n            this._props = {};\n            for (let name in prev)\n                this._props[name] = prev[name];\n            this._props.state = this.state;\n        }\n        return this._props;\n    }\n    /**\n    Update the view's props. Will immediately cause an update to\n    the DOM.\n    */\n    update(props) {\n        if (props.handleDOMEvents != this._props.handleDOMEvents)\n            ensureListeners(this);\n        let prevProps = this._props;\n        this._props = props;\n        if (props.plugins) {\n            props.plugins.forEach(checkStateComponent);\n            this.directPlugins = props.plugins;\n        }\n        this.updateStateInner(props.state, prevProps);\n    }\n    /**\n    Update the view by updating existing props object with the object\n    given as argument. Equivalent to `view.update(Object.assign({},\n    view.props, props))`.\n    */\n    setProps(props) {\n        let updated = {};\n        for (let name in this._props)\n            updated[name] = this._props[name];\n        updated.state = this.state;\n        for (let name in props)\n            updated[name] = props[name];\n        this.update(updated);\n    }\n    /**\n    Update the editor's `state` prop, without touching any of the\n    other props.\n    */\n    updateState(state) {\n        this.updateStateInner(state, this._props);\n    }\n    updateStateInner(state, prevProps) {\n        var _a;\n        let prev = this.state, redraw = false, updateSel = false;\n        // When stored marks are added, stop composition, so that they can\n        // be displayed.\n        if (state.storedMarks && this.composing) {\n            clearComposition(this);\n            updateSel = true;\n        }\n        this.state = state;\n        let pluginsChanged = prev.plugins != state.plugins || this._props.plugins != prevProps.plugins;\n        if (pluginsChanged || this._props.plugins != prevProps.plugins || this._props.nodeViews != prevProps.nodeViews) {\n            let nodeViews = buildNodeViews(this);\n            if (changedNodeViews(nodeViews, this.nodeViews)) {\n                this.nodeViews = nodeViews;\n                redraw = true;\n            }\n        }\n        if (pluginsChanged || prevProps.handleDOMEvents != this._props.handleDOMEvents) {\n            ensureListeners(this);\n        }\n        this.editable = getEditable(this);\n        updateCursorWrapper(this);\n        let innerDeco = viewDecorations(this), outerDeco = computeDocDeco(this);\n        let scroll = prev.plugins != state.plugins && !prev.doc.eq(state.doc) ? \"reset\"\n            : state.scrollToSelection > prev.scrollToSelection ? \"to selection\" : \"preserve\";\n        let updateDoc = redraw || !this.docView.matchesNode(state.doc, outerDeco, innerDeco);\n        if (updateDoc || !state.selection.eq(prev.selection))\n            updateSel = true;\n        let oldScrollPos = scroll == \"preserve\" && updateSel && this.dom.style.overflowAnchor == null && storeScrollPos(this);\n        if (updateSel) {\n            this.domObserver.stop();\n            // Work around an issue in Chrome, IE, and Edge where changing\n            // the DOM around an active selection puts it into a broken\n            // state where the thing the user sees differs from the\n            // selection reported by the Selection object (#710, #973,\n            // #1011, #1013, #1035).\n            let forceSelUpdate = updateDoc && (ie || chrome) && !this.composing &&\n                !prev.selection.empty && !state.selection.empty && selectionContextChanged(prev.selection, state.selection);\n            if (updateDoc) {\n                // If the node that the selection points into is written to,\n                // Chrome sometimes starts misreporting the selection, so this\n                // tracks that and forces a selection reset when our update\n                // did write to the node.\n                let chromeKludge = chrome ? (this.trackWrites = this.domSelectionRange().focusNode) : null;\n                if (this.composing)\n                    this.input.compositionNode = findCompositionNode(this);\n                if (redraw || !this.docView.update(state.doc, outerDeco, innerDeco, this)) {\n                    this.docView.updateOuterDeco(outerDeco);\n                    this.docView.destroy();\n                    this.docView = docViewDesc(state.doc, outerDeco, innerDeco, this.dom, this);\n                }\n                if (chromeKludge && !this.trackWrites)\n                    forceSelUpdate = true;\n            }\n            // Work around for an issue where an update arriving right between\n            // a DOM selection change and the \"selectionchange\" event for it\n            // can cause a spurious DOM selection update, disrupting mouse\n            // drag selection.\n            if (forceSelUpdate ||\n                !(this.input.mouseDown && this.domObserver.currentSelection.eq(this.domSelectionRange()) &&\n                    anchorInRightPlace(this))) {\n                selectionToDOM(this, forceSelUpdate);\n            }\n            else {\n                syncNodeSelection(this, state.selection);\n                this.domObserver.setCurSelection();\n            }\n            this.domObserver.start();\n        }\n        this.updatePluginViews(prev);\n        if (((_a = this.dragging) === null || _a === void 0 ? void 0 : _a.node) && !prev.doc.eq(state.doc))\n            this.updateDraggedNode(this.dragging, prev);\n        if (scroll == \"reset\") {\n            this.dom.scrollTop = 0;\n        }\n        else if (scroll == \"to selection\") {\n            this.scrollToSelection();\n        }\n        else if (oldScrollPos) {\n            resetScrollPos(oldScrollPos);\n        }\n    }\n    /**\n    @internal\n    */\n    scrollToSelection() {\n        let startDOM = this.domSelectionRange().focusNode;\n        if (this.someProp(\"handleScrollToSelection\", f => f(this))) ;\n        else if (this.state.selection instanceof NodeSelection) {\n            let target = this.docView.domAfterPos(this.state.selection.from);\n            if (target.nodeType == 1)\n                scrollRectIntoView(this, target.getBoundingClientRect(), startDOM);\n        }\n        else {\n            scrollRectIntoView(this, this.coordsAtPos(this.state.selection.head, 1), startDOM);\n        }\n    }\n    destroyPluginViews() {\n        let view;\n        while (view = this.pluginViews.pop())\n            if (view.destroy)\n                view.destroy();\n    }\n    updatePluginViews(prevState) {\n        if (!prevState || prevState.plugins != this.state.plugins || this.directPlugins != this.prevDirectPlugins) {\n            this.prevDirectPlugins = this.directPlugins;\n            this.destroyPluginViews();\n            for (let i = 0; i < this.directPlugins.length; i++) {\n                let plugin = this.directPlugins[i];\n                if (plugin.spec.view)\n                    this.pluginViews.push(plugin.spec.view(this));\n            }\n            for (let i = 0; i < this.state.plugins.length; i++) {\n                let plugin = this.state.plugins[i];\n                if (plugin.spec.view)\n                    this.pluginViews.push(plugin.spec.view(this));\n            }\n        }\n        else {\n            for (let i = 0; i < this.pluginViews.length; i++) {\n                let pluginView = this.pluginViews[i];\n                if (pluginView.update)\n                    pluginView.update(this, prevState);\n            }\n        }\n    }\n    updateDraggedNode(dragging, prev) {\n        let sel = dragging.node, found = -1;\n        if (this.state.doc.nodeAt(sel.from) == sel.node) {\n            found = sel.from;\n        }\n        else {\n            let movedPos = sel.from + (this.state.doc.content.size - prev.doc.content.size);\n            let moved = movedPos > 0 && this.state.doc.nodeAt(movedPos);\n            if (moved == sel.node)\n                found = movedPos;\n        }\n        this.dragging = new Dragging(dragging.slice, dragging.move, found < 0 ? undefined : NodeSelection.create(this.state.doc, found));\n    }\n    someProp(propName, f) {\n        let prop = this._props && this._props[propName], value;\n        if (prop != null && (value = f ? f(prop) : prop))\n            return value;\n        for (let i = 0; i < this.directPlugins.length; i++) {\n            let prop = this.directPlugins[i].props[propName];\n            if (prop != null && (value = f ? f(prop) : prop))\n                return value;\n        }\n        let plugins = this.state.plugins;\n        if (plugins)\n            for (let i = 0; i < plugins.length; i++) {\n                let prop = plugins[i].props[propName];\n                if (prop != null && (value = f ? f(prop) : prop))\n                    return value;\n            }\n    }\n    /**\n    Query whether the view has focus.\n    */\n    hasFocus() {\n        // Work around IE not handling focus correctly if resize handles are shown.\n        // If the cursor is inside an element with resize handles, activeElement\n        // will be that element instead of this.dom.\n        if (ie) {\n            // If activeElement is within this.dom, and there are no other elements\n            // setting `contenteditable` to false in between, treat it as focused.\n            let node = this.root.activeElement;\n            if (node == this.dom)\n                return true;\n            if (!node || !this.dom.contains(node))\n                return false;\n            while (node && this.dom != node && this.dom.contains(node)) {\n                if (node.contentEditable == 'false')\n                    return false;\n                node = node.parentElement;\n            }\n            return true;\n        }\n        return this.root.activeElement == this.dom;\n    }\n    /**\n    Focus the editor.\n    */\n    focus() {\n        this.domObserver.stop();\n        if (this.editable)\n            focusPreventScroll(this.dom);\n        selectionToDOM(this);\n        this.domObserver.start();\n    }\n    /**\n    Get the document root in which the editor exists. This will\n    usually be the top-level `document`, but might be a [shadow\n    DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Shadow_DOM)\n    root if the editor is inside one.\n    */\n    get root() {\n        let cached = this._root;\n        if (cached == null)\n            for (let search = this.dom.parentNode; search; search = search.parentNode) {\n                if (search.nodeType == 9 || (search.nodeType == 11 && search.host)) {\n                    if (!search.getSelection)\n                        Object.getPrototypeOf(search).getSelection = () => search.ownerDocument.getSelection();\n                    return this._root = search;\n                }\n            }\n        return cached || document;\n    }\n    /**\n    When an existing editor view is moved to a new document or\n    shadow tree, call this to make it recompute its root.\n    */\n    updateRoot() {\n        this._root = null;\n    }\n    /**\n    Given a pair of viewport coordinates, return the document\n    position that corresponds to them. May return null if the given\n    coordinates aren't inside of the editor. When an object is\n    returned, its `pos` property is the position nearest to the\n    coordinates, and its `inside` property holds the position of the\n    inner node that the position falls inside of, or -1 if it is at\n    the top level, not in any node.\n    */\n    posAtCoords(coords) {\n        return posAtCoords(this, coords);\n    }\n    /**\n    Returns the viewport rectangle at a given document position.\n    `left` and `right` will be the same number, as this returns a\n    flat cursor-ish rectangle. If the position is between two things\n    that aren't directly adjacent, `side` determines which element\n    is used. When < 0, the element before the position is used,\n    otherwise the element after.\n    */\n    coordsAtPos(pos, side = 1) {\n        return coordsAtPos(this, pos, side);\n    }\n    /**\n    Find the DOM position that corresponds to the given document\n    position. When `side` is negative, find the position as close as\n    possible to the content before the position. When positive,\n    prefer positions close to the content after the position. When\n    zero, prefer as shallow a position as possible.\n    \n    Note that you should **not** mutate the editor's internal DOM,\n    only inspect it (and even that is usually not necessary).\n    */\n    domAtPos(pos, side = 0) {\n        return this.docView.domFromPos(pos, side);\n    }\n    /**\n    Find the DOM node that represents the document node after the\n    given position. May return `null` when the position doesn't point\n    in front of a node or if the node is inside an opaque node view.\n    \n    This is intended to be able to call things like\n    `getBoundingClientRect` on that DOM node. Do **not** mutate the\n    editor DOM directly, or add styling this way, since that will be\n    immediately overriden by the editor as it redraws the node.\n    */\n    nodeDOM(pos) {\n        let desc = this.docView.descAt(pos);\n        return desc ? desc.nodeDOM : null;\n    }\n    /**\n    Find the document position that corresponds to a given DOM\n    position. (Whenever possible, it is preferable to inspect the\n    document structure directly, rather than poking around in the\n    DOM, but sometimes—for example when interpreting an event\n    target—you don't have a choice.)\n    \n    The `bias` parameter can be used to influence which side of a DOM\n    node to use when the position is inside a leaf node.\n    */\n    posAtDOM(node, offset, bias = -1) {\n        let pos = this.docView.posFromDOM(node, offset, bias);\n        if (pos == null)\n            throw new RangeError(\"DOM position not inside the editor\");\n        return pos;\n    }\n    /**\n    Find out whether the selection is at the end of a textblock when\n    moving in a given direction. When, for example, given `\"left\"`,\n    it will return true if moving left from the current cursor\n    position would leave that position's parent textblock. Will apply\n    to the view's current state by default, but it is possible to\n    pass a different state.\n    */\n    endOfTextblock(dir, state) {\n        return endOfTextblock(this, state || this.state, dir);\n    }\n    /**\n    Run the editor's paste logic with the given HTML string. The\n    `event`, if given, will be passed to the\n    [`handlePaste`](https://prosemirror.net/docs/ref/#view.EditorProps.handlePaste) hook.\n    */\n    pasteHTML(html, event) {\n        return doPaste(this, \"\", html, false, event || new ClipboardEvent(\"paste\"));\n    }\n    /**\n    Run the editor's paste logic with the given plain-text input.\n    */\n    pasteText(text, event) {\n        return doPaste(this, text, null, true, event || new ClipboardEvent(\"paste\"));\n    }\n    /**\n    Removes the editor from the DOM and destroys all [node\n    views](https://prosemirror.net/docs/ref/#view.NodeView).\n    */\n    destroy() {\n        if (!this.docView)\n            return;\n        destroyInput(this);\n        this.destroyPluginViews();\n        if (this.mounted) {\n            this.docView.update(this.state.doc, [], viewDecorations(this), this);\n            this.dom.textContent = \"\";\n        }\n        else if (this.dom.parentNode) {\n            this.dom.parentNode.removeChild(this.dom);\n        }\n        this.docView.destroy();\n        this.docView = null;\n        clearReusedRange();\n    }\n    /**\n    This is true when the view has been\n    [destroyed](https://prosemirror.net/docs/ref/#view.EditorView.destroy) (and thus should not be\n    used anymore).\n    */\n    get isDestroyed() {\n        return this.docView == null;\n    }\n    /**\n    Used for testing.\n    */\n    dispatchEvent(event) {\n        return dispatchEvent(this, event);\n    }\n    /**\n    Dispatch a transaction. Will call\n    [`dispatchTransaction`](https://prosemirror.net/docs/ref/#view.DirectEditorProps.dispatchTransaction)\n    when given, and otherwise defaults to applying the transaction to\n    the current state and calling\n    [`updateState`](https://prosemirror.net/docs/ref/#view.EditorView.updateState) with the result.\n    This method is bound to the view instance, so that it can be\n    easily passed around.\n    */\n    dispatch(tr) {\n        let dispatchTransaction = this._props.dispatchTransaction;\n        if (dispatchTransaction)\n            dispatchTransaction.call(this, tr);\n        else\n            this.updateState(this.state.apply(tr));\n    }\n    /**\n    @internal\n    */\n    domSelectionRange() {\n        let sel = this.domSelection();\n        return safari && this.root.nodeType === 11 &&\n            deepActiveElement(this.dom.ownerDocument) == this.dom && safariShadowSelectionRange(this, sel) || sel;\n    }\n    /**\n    @internal\n    */\n    domSelection() {\n        return this.root.getSelection();\n    }\n}\nfunction computeDocDeco(view) {\n    let attrs = Object.create(null);\n    attrs.class = \"ProseMirror\";\n    attrs.contenteditable = String(view.editable);\n    view.someProp(\"attributes\", value => {\n        if (typeof value == \"function\")\n            value = value(view.state);\n        if (value)\n            for (let attr in value) {\n                if (attr == \"class\")\n                    attrs.class += \" \" + value[attr];\n                else if (attr == \"style\")\n                    attrs.style = (attrs.style ? attrs.style + \";\" : \"\") + value[attr];\n                else if (!attrs[attr] && attr != \"contenteditable\" && attr != \"nodeName\")\n                    attrs[attr] = String(value[attr]);\n            }\n    });\n    if (!attrs.translate)\n        attrs.translate = \"no\";\n    return [Decoration.node(0, view.state.doc.content.size, attrs)];\n}\nfunction updateCursorWrapper(view) {\n    if (view.markCursor) {\n        let dom = document.createElement(\"img\");\n        dom.className = \"ProseMirror-separator\";\n        dom.setAttribute(\"mark-placeholder\", \"true\");\n        dom.setAttribute(\"alt\", \"\");\n        view.cursorWrapper = { dom, deco: Decoration.widget(view.state.selection.head, dom, { raw: true, marks: view.markCursor }) };\n    }\n    else {\n        view.cursorWrapper = null;\n    }\n}\nfunction getEditable(view) {\n    return !view.someProp(\"editable\", value => value(view.state) === false);\n}\nfunction selectionContextChanged(sel1, sel2) {\n    let depth = Math.min(sel1.$anchor.sharedDepth(sel1.head), sel2.$anchor.sharedDepth(sel2.head));\n    return sel1.$anchor.start(depth) != sel2.$anchor.start(depth);\n}\nfunction buildNodeViews(view) {\n    let result = Object.create(null);\n    function add(obj) {\n        for (let prop in obj)\n            if (!Object.prototype.hasOwnProperty.call(result, prop))\n                result[prop] = obj[prop];\n    }\n    view.someProp(\"nodeViews\", add);\n    view.someProp(\"markViews\", add);\n    return result;\n}\nfunction changedNodeViews(a, b) {\n    let nA = 0, nB = 0;\n    for (let prop in a) {\n        if (a[prop] != b[prop])\n            return true;\n        nA++;\n    }\n    for (let _ in b)\n        nB++;\n    return nA != nB;\n}\nfunction checkStateComponent(plugin) {\n    if (plugin.spec.state || plugin.spec.filterTransaction || plugin.spec.appendTransaction)\n        throw new RangeError(\"Plugins passed directly to the view must not have a state component\");\n}\n\nexport { Decoration, DecorationSet, EditorView, __endComposition, __parseFromClipboard, __serializeForClipboard };\n","export var base = {\n  8: \"Backspace\",\n  9: \"Tab\",\n  10: \"Enter\",\n  12: \"NumLock\",\n  13: \"Enter\",\n  16: \"Shift\",\n  17: \"Control\",\n  18: \"Alt\",\n  20: \"CapsLock\",\n  27: \"Escape\",\n  32: \" \",\n  33: \"PageUp\",\n  34: \"PageDown\",\n  35: \"End\",\n  36: \"Home\",\n  37: \"ArrowLeft\",\n  38: \"ArrowUp\",\n  39: \"ArrowRight\",\n  40: \"ArrowDown\",\n  44: \"PrintScreen\",\n  45: \"Insert\",\n  46: \"Delete\",\n  59: \";\",\n  61: \"=\",\n  91: \"Meta\",\n  92: \"Meta\",\n  106: \"*\",\n  107: \"+\",\n  108: \",\",\n  109: \"-\",\n  110: \".\",\n  111: \"/\",\n  144: \"NumLock\",\n  145: \"ScrollLock\",\n  160: \"Shift\",\n  161: \"Shift\",\n  162: \"Control\",\n  163: \"Control\",\n  164: \"Alt\",\n  165: \"Alt\",\n  173: \"-\",\n  186: \";\",\n  187: \"=\",\n  188: \",\",\n  189: \"-\",\n  190: \".\",\n  191: \"/\",\n  192: \"`\",\n  219: \"[\",\n  220: \"\\\\\",\n  221: \"]\",\n  222: \"'\"\n}\n\nexport var shift = {\n  48: \")\",\n  49: \"!\",\n  50: \"@\",\n  51: \"#\",\n  52: \"$\",\n  53: \"%\",\n  54: \"^\",\n  55: \"&\",\n  56: \"*\",\n  57: \"(\",\n  59: \":\",\n  61: \"+\",\n  173: \"_\",\n  186: \":\",\n  187: \"+\",\n  188: \"<\",\n  189: \"_\",\n  190: \">\",\n  191: \"?\",\n  192: \"~\",\n  219: \"{\",\n  220: \"|\",\n  221: \"}\",\n  222: \"\\\"\"\n}\n\nvar mac = typeof navigator != \"undefined\" && /Mac/.test(navigator.platform)\nvar ie = typeof navigator != \"undefined\" && /MSIE \\d|Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(navigator.userAgent)\n\n// Fill in the digit keys\nfor (var i = 0; i < 10; i++) base[48 + i] = base[96 + i] = String(i)\n\n// The function keys\nfor (var i = 1; i <= 24; i++) base[i + 111] = \"F\" + i\n\n// And the alphabetic keys\nfor (var i = 65; i <= 90; i++) {\n  base[i] = String.fromCharCode(i + 32)\n  shift[i] = String.fromCharCode(i)\n}\n\n// For each code that doesn't have a shift-equivalent, copy the base name\nfor (var code in base) if (!shift.hasOwnProperty(code)) shift[code] = base[code]\n\nexport function keyName(event) {\n  // On macOS, keys held with Shift and Cmd don't reflect the effect of Shift in `.key`.\n  // On IE, shift effect is never included in `.key`.\n  var ignoreKey = mac && event.metaKey && event.shiftKey && !event.ctrlKey && !event.altKey ||\n      ie && event.shiftKey && event.key && event.key.length == 1 ||\n      event.key == \"Unidentified\"\n  var name = (!ignoreKey && event.key) ||\n    (event.shiftKey ? shift : base)[event.keyCode] ||\n    event.key || \"Unidentified\"\n  // Edge sometimes produces wrong names (Issue #3)\n  if (name == \"Esc\") name = \"Escape\"\n  if (name == \"Del\") name = \"Delete\"\n  // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8860571/\n  if (name == \"Left\") name = \"ArrowLeft\"\n  if (name == \"Up\") name = \"ArrowUp\"\n  if (name == \"Right\") name = \"ArrowRight\"\n  if (name == \"Down\") name = \"ArrowDown\"\n  return name\n}\n","import { keyName, base } from 'w3c-keyname';\nimport { Plugin } from 'prosemirror-state';\n\nconst mac = typeof navigator != \"undefined\" ? /Mac|iP(hone|[oa]d)/.test(navigator.platform) : false;\nfunction normalizeKeyName(name) {\n    let parts = name.split(/-(?!$)/), result = parts[parts.length - 1];\n    if (result == \"Space\")\n        result = \" \";\n    let alt, ctrl, shift, meta;\n    for (let i = 0; i < parts.length - 1; i++) {\n        let mod = parts[i];\n        if (/^(cmd|meta|m)$/i.test(mod))\n            meta = true;\n        else if (/^a(lt)?$/i.test(mod))\n            alt = true;\n        else if (/^(c|ctrl|control)$/i.test(mod))\n            ctrl = true;\n        else if (/^s(hift)?$/i.test(mod))\n            shift = true;\n        else if (/^mod$/i.test(mod)) {\n            if (mac)\n                meta = true;\n            else\n                ctrl = true;\n        }\n        else\n            throw new Error(\"Unrecognized modifier name: \" + mod);\n    }\n    if (alt)\n        result = \"Alt-\" + result;\n    if (ctrl)\n        result = \"Ctrl-\" + result;\n    if (meta)\n        result = \"Meta-\" + result;\n    if (shift)\n        result = \"Shift-\" + result;\n    return result;\n}\nfunction normalize(map) {\n    let copy = Object.create(null);\n    for (let prop in map)\n        copy[normalizeKeyName(prop)] = map[prop];\n    return copy;\n}\nfunction modifiers(name, event, shift = true) {\n    if (event.altKey)\n        name = \"Alt-\" + name;\n    if (event.ctrlKey)\n        name = \"Ctrl-\" + name;\n    if (event.metaKey)\n        name = \"Meta-\" + name;\n    if (shift && event.shiftKey)\n        name = \"Shift-\" + name;\n    return name;\n}\n/**\nCreate a keymap plugin for the given set of bindings.\n\nBindings should map key names to [command](https://prosemirror.net/docs/ref/#commands)-style\nfunctions, which will be called with `(EditorState, dispatch,\nEditorView)` arguments, and should return true when they've handled\nthe key. Note that the view argument isn't part of the command\nprotocol, but can be used as an escape hatch if a binding needs to\ndirectly interact with the UI.\n\nKey names may be strings like `\"Shift-Ctrl-Enter\"`—a key\nidentifier prefixed with zero or more modifiers. Key identifiers\nare based on the strings that can appear in\n[`KeyEvent.key`](https:developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key).\nUse lowercase letters to refer to letter keys (or uppercase letters\nif you want shift to be held). You may use `\"Space\"` as an alias\nfor the `\" \"` name.\n\nModifiers can be given in any order. `Shift-` (or `s-`), `Alt-` (or\n`a-`), `Ctrl-` (or `c-` or `Control-`) and `Cmd-` (or `m-` or\n`Meta-`) are recognized. For characters that are created by holding\nshift, the `Shift-` prefix is implied, and should not be added\nexplicitly.\n\nYou can use `Mod-` as a shorthand for `Cmd-` on Mac and `Ctrl-` on\nother platforms.\n\nYou can add multiple keymap plugins to an editor. The order in\nwhich they appear determines their precedence (the ones early in\nthe array get to dispatch first).\n*/\nfunction keymap(bindings) {\n    return new Plugin({ props: { handleKeyDown: keydownHandler(bindings) } });\n}\n/**\nGiven a set of bindings (using the same format as\n[`keymap`](https://prosemirror.net/docs/ref/#keymap.keymap)), return a [keydown\nhandler](https://prosemirror.net/docs/ref/#view.EditorProps.handleKeyDown) that handles them.\n*/\nfunction keydownHandler(bindings) {\n    let map = normalize(bindings);\n    return function (view, event) {\n        let name = keyName(event), baseName, direct = map[modifiers(name, event)];\n        if (direct && direct(view.state, view.dispatch, view))\n            return true;\n        // A character key\n        if (name.length == 1 && name != \" \") {\n            if (event.shiftKey) {\n                // In case the name was already modified by shift, try looking\n                // it up without its shift modifier\n                let noShift = map[modifiers(name, event, false)];\n                if (noShift && noShift(view.state, view.dispatch, view))\n                    return true;\n            }\n            if ((event.shiftKey || event.altKey || event.metaKey || name.charCodeAt(0) > 127) &&\n                (baseName = base[event.keyCode]) && baseName != name) {\n                // Try falling back to the keyCode when there's a modifier\n                // active or the character produced isn't ASCII, and our table\n                // produces a different name from the the keyCode. See #668,\n                // #1060\n                let fromCode = map[modifiers(baseName, event)];\n                if (fromCode && fromCode(view.state, view.dispatch, view))\n                    return true;\n            }\n        }\n        return false;\n    };\n}\n\nexport { keydownHandler, keymap };\n","import { ReplaceError, Slice, Fragment, MarkType, Mark } from 'prosemirror-model';\n\n// Recovery values encode a range index and an offset. They are\n// represented as numbers, because tons of them will be created when\n// mapping, for example, a large number of decorations. The number's\n// lower 16 bits provide the index, the remaining bits the offset.\n//\n// Note: We intentionally don't use bit shift operators to en- and\n// decode these, since those clip to 32 bits, which we might in rare\n// cases want to overflow. A 64-bit float can represent 48-bit\n// integers precisely.\nconst lower16 = 0xffff;\nconst factor16 = Math.pow(2, 16);\nfunction makeRecover(index, offset) { return index + offset * factor16; }\nfunction recoverIndex(value) { return value & lower16; }\nfunction recoverOffset(value) { return (value - (value & lower16)) / factor16; }\nconst DEL_BEFORE = 1, DEL_AFTER = 2, DEL_ACROSS = 4, DEL_SIDE = 8;\n/**\nAn object representing a mapped position with extra\ninformation.\n*/\nclass MapResult {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The mapped version of the position.\n    */\n    pos, \n    /**\n    @internal\n    */\n    delInfo, \n    /**\n    @internal\n    */\n    recover) {\n        this.pos = pos;\n        this.delInfo = delInfo;\n        this.recover = recover;\n    }\n    /**\n    Tells you whether the position was deleted, that is, whether the\n    step removed the token on the side queried (via the `assoc`)\n    argument from the document.\n    */\n    get deleted() { return (this.delInfo & DEL_SIDE) > 0; }\n    /**\n    Tells you whether the token before the mapped position was deleted.\n    */\n    get deletedBefore() { return (this.delInfo & (DEL_BEFORE | DEL_ACROSS)) > 0; }\n    /**\n    True when the token after the mapped position was deleted.\n    */\n    get deletedAfter() { return (this.delInfo & (DEL_AFTER | DEL_ACROSS)) > 0; }\n    /**\n    Tells whether any of the steps mapped through deletes across the\n    position (including both the token before and after the\n    position).\n    */\n    get deletedAcross() { return (this.delInfo & DEL_ACROSS) > 0; }\n}\n/**\nA map describing the deletions and insertions made by a step, which\ncan be used to find the correspondence between positions in the\npre-step version of a document and the same position in the\npost-step version.\n*/\nclass StepMap {\n    /**\n    Create a position map. The modifications to the document are\n    represented as an array of numbers, in which each group of three\n    represents a modified chunk as `[start, oldSize, newSize]`.\n    */\n    constructor(\n    /**\n    @internal\n    */\n    ranges, \n    /**\n    @internal\n    */\n    inverted = false) {\n        this.ranges = ranges;\n        this.inverted = inverted;\n        if (!ranges.length && StepMap.empty)\n            return StepMap.empty;\n    }\n    /**\n    @internal\n    */\n    recover(value) {\n        let diff = 0, index = recoverIndex(value);\n        if (!this.inverted)\n            for (let i = 0; i < index; i++)\n                diff += this.ranges[i * 3 + 2] - this.ranges[i * 3 + 1];\n        return this.ranges[index * 3] + diff + recoverOffset(value);\n    }\n    mapResult(pos, assoc = 1) { return this._map(pos, assoc, false); }\n    map(pos, assoc = 1) { return this._map(pos, assoc, true); }\n    /**\n    @internal\n    */\n    _map(pos, assoc, simple) {\n        let diff = 0, oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n        for (let i = 0; i < this.ranges.length; i += 3) {\n            let start = this.ranges[i] - (this.inverted ? diff : 0);\n            if (start > pos)\n                break;\n            let oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex], end = start + oldSize;\n            if (pos <= end) {\n                let side = !oldSize ? assoc : pos == start ? -1 : pos == end ? 1 : assoc;\n                let result = start + diff + (side < 0 ? 0 : newSize);\n                if (simple)\n                    return result;\n                let recover = pos == (assoc < 0 ? start : end) ? null : makeRecover(i / 3, pos - start);\n                let del = pos == start ? DEL_AFTER : pos == end ? DEL_BEFORE : DEL_ACROSS;\n                if (assoc < 0 ? pos != start : pos != end)\n                    del |= DEL_SIDE;\n                return new MapResult(result, del, recover);\n            }\n            diff += newSize - oldSize;\n        }\n        return simple ? pos + diff : new MapResult(pos + diff, 0, null);\n    }\n    /**\n    @internal\n    */\n    touches(pos, recover) {\n        let diff = 0, index = recoverIndex(recover);\n        let oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n        for (let i = 0; i < this.ranges.length; i += 3) {\n            let start = this.ranges[i] - (this.inverted ? diff : 0);\n            if (start > pos)\n                break;\n            let oldSize = this.ranges[i + oldIndex], end = start + oldSize;\n            if (pos <= end && i == index * 3)\n                return true;\n            diff += this.ranges[i + newIndex] - oldSize;\n        }\n        return false;\n    }\n    /**\n    Calls the given function on each of the changed ranges included in\n    this map.\n    */\n    forEach(f) {\n        let oldIndex = this.inverted ? 2 : 1, newIndex = this.inverted ? 1 : 2;\n        for (let i = 0, diff = 0; i < this.ranges.length; i += 3) {\n            let start = this.ranges[i], oldStart = start - (this.inverted ? diff : 0), newStart = start + (this.inverted ? 0 : diff);\n            let oldSize = this.ranges[i + oldIndex], newSize = this.ranges[i + newIndex];\n            f(oldStart, oldStart + oldSize, newStart, newStart + newSize);\n            diff += newSize - oldSize;\n        }\n    }\n    /**\n    Create an inverted version of this map. The result can be used to\n    map positions in the post-step document to the pre-step document.\n    */\n    invert() {\n        return new StepMap(this.ranges, !this.inverted);\n    }\n    /**\n    @internal\n    */\n    toString() {\n        return (this.inverted ? \"-\" : \"\") + JSON.stringify(this.ranges);\n    }\n    /**\n    Create a map that moves all positions by offset `n` (which may be\n    negative). This can be useful when applying steps meant for a\n    sub-document to a larger document, or vice-versa.\n    */\n    static offset(n) {\n        return n == 0 ? StepMap.empty : new StepMap(n < 0 ? [0, -n, 0] : [0, 0, n]);\n    }\n}\n/**\nA StepMap that contains no changed ranges.\n*/\nStepMap.empty = new StepMap([]);\n/**\nA mapping represents a pipeline of zero or more [step\nmaps](https://prosemirror.net/docs/ref/#transform.StepMap). It has special provisions for losslessly\nhandling mapping positions through a series of steps in which some\nsteps are inverted versions of earlier steps. (This comes up when\n‘[rebasing](/docs/guide/#transform.rebasing)’ steps for\ncollaboration or history management.)\n*/\nclass Mapping {\n    /**\n    Create a new mapping with the given position maps.\n    */\n    constructor(\n    /**\n    The step maps in this mapping.\n    */\n    maps = [], \n    /**\n    @internal\n    */\n    mirror, \n    /**\n    The starting position in the `maps` array, used when `map` or\n    `mapResult` is called.\n    */\n    from = 0, \n    /**\n    The end position in the `maps` array.\n    */\n    to = maps.length) {\n        this.maps = maps;\n        this.mirror = mirror;\n        this.from = from;\n        this.to = to;\n    }\n    /**\n    Create a mapping that maps only through a part of this one.\n    */\n    slice(from = 0, to = this.maps.length) {\n        return new Mapping(this.maps, this.mirror, from, to);\n    }\n    /**\n    @internal\n    */\n    copy() {\n        return new Mapping(this.maps.slice(), this.mirror && this.mirror.slice(), this.from, this.to);\n    }\n    /**\n    Add a step map to the end of this mapping. If `mirrors` is\n    given, it should be the index of the step map that is the mirror\n    image of this one.\n    */\n    appendMap(map, mirrors) {\n        this.to = this.maps.push(map);\n        if (mirrors != null)\n            this.setMirror(this.maps.length - 1, mirrors);\n    }\n    /**\n    Add all the step maps in a given mapping to this one (preserving\n    mirroring information).\n    */\n    appendMapping(mapping) {\n        for (let i = 0, startSize = this.maps.length; i < mapping.maps.length; i++) {\n            let mirr = mapping.getMirror(i);\n            this.appendMap(mapping.maps[i], mirr != null && mirr < i ? startSize + mirr : undefined);\n        }\n    }\n    /**\n    Finds the offset of the step map that mirrors the map at the\n    given offset, in this mapping (as per the second argument to\n    `appendMap`).\n    */\n    getMirror(n) {\n        if (this.mirror)\n            for (let i = 0; i < this.mirror.length; i++)\n                if (this.mirror[i] == n)\n                    return this.mirror[i + (i % 2 ? -1 : 1)];\n    }\n    /**\n    @internal\n    */\n    setMirror(n, m) {\n        if (!this.mirror)\n            this.mirror = [];\n        this.mirror.push(n, m);\n    }\n    /**\n    Append the inverse of the given mapping to this one.\n    */\n    appendMappingInverted(mapping) {\n        for (let i = mapping.maps.length - 1, totalSize = this.maps.length + mapping.maps.length; i >= 0; i--) {\n            let mirr = mapping.getMirror(i);\n            this.appendMap(mapping.maps[i].invert(), mirr != null && mirr > i ? totalSize - mirr - 1 : undefined);\n        }\n    }\n    /**\n    Create an inverted version of this mapping.\n    */\n    invert() {\n        let inverse = new Mapping;\n        inverse.appendMappingInverted(this);\n        return inverse;\n    }\n    /**\n    Map a position through this mapping.\n    */\n    map(pos, assoc = 1) {\n        if (this.mirror)\n            return this._map(pos, assoc, true);\n        for (let i = this.from; i < this.to; i++)\n            pos = this.maps[i].map(pos, assoc);\n        return pos;\n    }\n    /**\n    Map a position through this mapping, returning a mapping\n    result.\n    */\n    mapResult(pos, assoc = 1) { return this._map(pos, assoc, false); }\n    /**\n    @internal\n    */\n    _map(pos, assoc, simple) {\n        let delInfo = 0;\n        for (let i = this.from; i < this.to; i++) {\n            let map = this.maps[i], result = map.mapResult(pos, assoc);\n            if (result.recover != null) {\n                let corr = this.getMirror(i);\n                if (corr != null && corr > i && corr < this.to) {\n                    i = corr;\n                    pos = this.maps[corr].recover(result.recover);\n                    continue;\n                }\n            }\n            delInfo |= result.delInfo;\n            pos = result.pos;\n        }\n        return simple ? pos : new MapResult(pos, delInfo, null);\n    }\n}\n\nconst stepsByID = Object.create(null);\n/**\nA step object represents an atomic change. It generally applies\nonly to the document it was created for, since the positions\nstored in it will only make sense for that document.\n\nNew steps are defined by creating classes that extend `Step`,\noverriding the `apply`, `invert`, `map`, `getMap` and `fromJSON`\nmethods, and registering your class with a unique\nJSON-serialization identifier using\n[`Step.jsonID`](https://prosemirror.net/docs/ref/#transform.Step^jsonID).\n*/\nclass Step {\n    /**\n    Get the step map that represents the changes made by this step,\n    and which can be used to transform between positions in the old\n    and the new document.\n    */\n    getMap() { return StepMap.empty; }\n    /**\n    Try to merge this step with another one, to be applied directly\n    after it. Returns the merged step when possible, null if the\n    steps can't be merged.\n    */\n    merge(other) { return null; }\n    /**\n    Deserialize a step from its JSON representation. Will call\n    through to the step class' own implementation of this method.\n    */\n    static fromJSON(schema, json) {\n        if (!json || !json.stepType)\n            throw new RangeError(\"Invalid input for Step.fromJSON\");\n        let type = stepsByID[json.stepType];\n        if (!type)\n            throw new RangeError(`No step type ${json.stepType} defined`);\n        return type.fromJSON(schema, json);\n    }\n    /**\n    To be able to serialize steps to JSON, each step needs a string\n    ID to attach to its JSON representation. Use this method to\n    register an ID for your step classes. Try to pick something\n    that's unlikely to clash with steps from other modules.\n    */\n    static jsonID(id, stepClass) {\n        if (id in stepsByID)\n            throw new RangeError(\"Duplicate use of step JSON ID \" + id);\n        stepsByID[id] = stepClass;\n        stepClass.prototype.jsonID = id;\n        return stepClass;\n    }\n}\n/**\nThe result of [applying](https://prosemirror.net/docs/ref/#transform.Step.apply) a step. Contains either a\nnew document or a failure value.\n*/\nclass StepResult {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The transformed document, if successful.\n    */\n    doc, \n    /**\n    The failure message, if unsuccessful.\n    */\n    failed) {\n        this.doc = doc;\n        this.failed = failed;\n    }\n    /**\n    Create a successful step result.\n    */\n    static ok(doc) { return new StepResult(doc, null); }\n    /**\n    Create a failed step result.\n    */\n    static fail(message) { return new StepResult(null, message); }\n    /**\n    Call [`Node.replace`](https://prosemirror.net/docs/ref/#model.Node.replace) with the given\n    arguments. Create a successful result if it succeeds, and a\n    failed one if it throws a `ReplaceError`.\n    */\n    static fromReplace(doc, from, to, slice) {\n        try {\n            return StepResult.ok(doc.replace(from, to, slice));\n        }\n        catch (e) {\n            if (e instanceof ReplaceError)\n                return StepResult.fail(e.message);\n            throw e;\n        }\n    }\n}\n\nfunction mapFragment(fragment, f, parent) {\n    let mapped = [];\n    for (let i = 0; i < fragment.childCount; i++) {\n        let child = fragment.child(i);\n        if (child.content.size)\n            child = child.copy(mapFragment(child.content, f, child));\n        if (child.isInline)\n            child = f(child, parent, i);\n        mapped.push(child);\n    }\n    return Fragment.fromArray(mapped);\n}\n/**\nAdd a mark to all inline content between two positions.\n*/\nclass AddMarkStep extends Step {\n    /**\n    Create a mark step.\n    */\n    constructor(\n    /**\n    The start of the marked range.\n    */\n    from, \n    /**\n    The end of the marked range.\n    */\n    to, \n    /**\n    The mark to add.\n    */\n    mark) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let oldSlice = doc.slice(this.from, this.to), $from = doc.resolve(this.from);\n        let parent = $from.node($from.sharedDepth(this.to));\n        let slice = new Slice(mapFragment(oldSlice.content, (node, parent) => {\n            if (!node.isAtom || !parent.type.allowsMarkType(this.mark.type))\n                return node;\n            return node.mark(this.mark.addToSet(node.marks));\n        }, parent), oldSlice.openStart, oldSlice.openEnd);\n        return StepResult.fromReplace(doc, this.from, this.to, slice);\n    }\n    invert() {\n        return new RemoveMarkStep(this.from, this.to, this.mark);\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        if (from.deleted && to.deleted || from.pos >= to.pos)\n            return null;\n        return new AddMarkStep(from.pos, to.pos, this.mark);\n    }\n    merge(other) {\n        if (other instanceof AddMarkStep &&\n            other.mark.eq(this.mark) &&\n            this.from <= other.to && this.to >= other.from)\n            return new AddMarkStep(Math.min(this.from, other.from), Math.max(this.to, other.to), this.mark);\n        return null;\n    }\n    toJSON() {\n        return { stepType: \"addMark\", mark: this.mark.toJSON(),\n            from: this.from, to: this.to };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\")\n            throw new RangeError(\"Invalid input for AddMarkStep.fromJSON\");\n        return new AddMarkStep(json.from, json.to, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"addMark\", AddMarkStep);\n/**\nRemove a mark from all inline content between two positions.\n*/\nclass RemoveMarkStep extends Step {\n    /**\n    Create a mark-removing step.\n    */\n    constructor(\n    /**\n    The start of the unmarked range.\n    */\n    from, \n    /**\n    The end of the unmarked range.\n    */\n    to, \n    /**\n    The mark to remove.\n    */\n    mark) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let oldSlice = doc.slice(this.from, this.to);\n        let slice = new Slice(mapFragment(oldSlice.content, node => {\n            return node.mark(this.mark.removeFromSet(node.marks));\n        }, doc), oldSlice.openStart, oldSlice.openEnd);\n        return StepResult.fromReplace(doc, this.from, this.to, slice);\n    }\n    invert() {\n        return new AddMarkStep(this.from, this.to, this.mark);\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        if (from.deleted && to.deleted || from.pos >= to.pos)\n            return null;\n        return new RemoveMarkStep(from.pos, to.pos, this.mark);\n    }\n    merge(other) {\n        if (other instanceof RemoveMarkStep &&\n            other.mark.eq(this.mark) &&\n            this.from <= other.to && this.to >= other.from)\n            return new RemoveMarkStep(Math.min(this.from, other.from), Math.max(this.to, other.to), this.mark);\n        return null;\n    }\n    toJSON() {\n        return { stepType: \"removeMark\", mark: this.mark.toJSON(),\n            from: this.from, to: this.to };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\")\n            throw new RangeError(\"Invalid input for RemoveMarkStep.fromJSON\");\n        return new RemoveMarkStep(json.from, json.to, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"removeMark\", RemoveMarkStep);\n/**\nAdd a mark to a specific node.\n*/\nclass AddNodeMarkStep extends Step {\n    /**\n    Create a node mark step.\n    */\n    constructor(\n    /**\n    The position of the target node.\n    */\n    pos, \n    /**\n    The mark to add.\n    */\n    mark) {\n        super();\n        this.pos = pos;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node)\n            return StepResult.fail(\"No node at mark step's position\");\n        let updated = node.type.create(node.attrs, null, this.mark.addToSet(node.marks));\n        return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n    }\n    invert(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (node) {\n            let newSet = this.mark.addToSet(node.marks);\n            if (newSet.length == node.marks.length) {\n                for (let i = 0; i < node.marks.length; i++)\n                    if (!node.marks[i].isInSet(newSet))\n                        return new AddNodeMarkStep(this.pos, node.marks[i]);\n                return new AddNodeMarkStep(this.pos, this.mark);\n            }\n        }\n        return new RemoveNodeMarkStep(this.pos, this.mark);\n    }\n    map(mapping) {\n        let pos = mapping.mapResult(this.pos, 1);\n        return pos.deletedAfter ? null : new AddNodeMarkStep(pos.pos, this.mark);\n    }\n    toJSON() {\n        return { stepType: \"addNodeMark\", pos: this.pos, mark: this.mark.toJSON() };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.pos != \"number\")\n            throw new RangeError(\"Invalid input for AddNodeMarkStep.fromJSON\");\n        return new AddNodeMarkStep(json.pos, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"addNodeMark\", AddNodeMarkStep);\n/**\nRemove a mark from a specific node.\n*/\nclass RemoveNodeMarkStep extends Step {\n    /**\n    Create a mark-removing step.\n    */\n    constructor(\n    /**\n    The position of the target node.\n    */\n    pos, \n    /**\n    The mark to remove.\n    */\n    mark) {\n        super();\n        this.pos = pos;\n        this.mark = mark;\n    }\n    apply(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node)\n            return StepResult.fail(\"No node at mark step's position\");\n        let updated = node.type.create(node.attrs, null, this.mark.removeFromSet(node.marks));\n        return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n    }\n    invert(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node || !this.mark.isInSet(node.marks))\n            return this;\n        return new AddNodeMarkStep(this.pos, this.mark);\n    }\n    map(mapping) {\n        let pos = mapping.mapResult(this.pos, 1);\n        return pos.deletedAfter ? null : new RemoveNodeMarkStep(pos.pos, this.mark);\n    }\n    toJSON() {\n        return { stepType: \"removeNodeMark\", pos: this.pos, mark: this.mark.toJSON() };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.pos != \"number\")\n            throw new RangeError(\"Invalid input for RemoveNodeMarkStep.fromJSON\");\n        return new RemoveNodeMarkStep(json.pos, schema.markFromJSON(json.mark));\n    }\n}\nStep.jsonID(\"removeNodeMark\", RemoveNodeMarkStep);\n\n/**\nReplace a part of the document with a slice of new content.\n*/\nclass ReplaceStep extends Step {\n    /**\n    The given `slice` should fit the 'gap' between `from` and\n    `to`—the depths must line up, and the surrounding nodes must be\n    able to be joined with the open sides of the slice. When\n    `structure` is true, the step will fail if the content between\n    from and to is not just a sequence of closing and then opening\n    tokens (this is to guard against rebased replace steps\n    overwriting something they weren't supposed to).\n    */\n    constructor(\n    /**\n    The start position of the replaced range.\n    */\n    from, \n    /**\n    The end position of the replaced range.\n    */\n    to, \n    /**\n    The slice to insert.\n    */\n    slice, \n    /**\n    @internal\n    */\n    structure = false) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.slice = slice;\n        this.structure = structure;\n    }\n    apply(doc) {\n        if (this.structure && contentBetween(doc, this.from, this.to))\n            return StepResult.fail(\"Structure replace would overwrite content\");\n        return StepResult.fromReplace(doc, this.from, this.to, this.slice);\n    }\n    getMap() {\n        return new StepMap([this.from, this.to - this.from, this.slice.size]);\n    }\n    invert(doc) {\n        return new ReplaceStep(this.from, this.from + this.slice.size, doc.slice(this.from, this.to));\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        if (from.deletedAcross && to.deletedAcross)\n            return null;\n        return new ReplaceStep(from.pos, Math.max(from.pos, to.pos), this.slice);\n    }\n    merge(other) {\n        if (!(other instanceof ReplaceStep) || other.structure || this.structure)\n            return null;\n        if (this.from + this.slice.size == other.from && !this.slice.openEnd && !other.slice.openStart) {\n            let slice = this.slice.size + other.slice.size == 0 ? Slice.empty\n                : new Slice(this.slice.content.append(other.slice.content), this.slice.openStart, other.slice.openEnd);\n            return new ReplaceStep(this.from, this.to + (other.to - other.from), slice, this.structure);\n        }\n        else if (other.to == this.from && !this.slice.openStart && !other.slice.openEnd) {\n            let slice = this.slice.size + other.slice.size == 0 ? Slice.empty\n                : new Slice(other.slice.content.append(this.slice.content), other.slice.openStart, this.slice.openEnd);\n            return new ReplaceStep(other.from, this.to, slice, this.structure);\n        }\n        else {\n            return null;\n        }\n    }\n    toJSON() {\n        let json = { stepType: \"replace\", from: this.from, to: this.to };\n        if (this.slice.size)\n            json.slice = this.slice.toJSON();\n        if (this.structure)\n            json.structure = true;\n        return json;\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\")\n            throw new RangeError(\"Invalid input for ReplaceStep.fromJSON\");\n        return new ReplaceStep(json.from, json.to, Slice.fromJSON(schema, json.slice), !!json.structure);\n    }\n}\nStep.jsonID(\"replace\", ReplaceStep);\n/**\nReplace a part of the document with a slice of content, but\npreserve a range of the replaced content by moving it into the\nslice.\n*/\nclass ReplaceAroundStep extends Step {\n    /**\n    Create a replace-around step with the given range and gap.\n    `insert` should be the point in the slice into which the content\n    of the gap should be moved. `structure` has the same meaning as\n    it has in the [`ReplaceStep`](https://prosemirror.net/docs/ref/#transform.ReplaceStep) class.\n    */\n    constructor(\n    /**\n    The start position of the replaced range.\n    */\n    from, \n    /**\n    The end position of the replaced range.\n    */\n    to, \n    /**\n    The start of preserved range.\n    */\n    gapFrom, \n    /**\n    The end of preserved range.\n    */\n    gapTo, \n    /**\n    The slice to insert.\n    */\n    slice, \n    /**\n    The position in the slice where the preserved range should be\n    inserted.\n    */\n    insert, \n    /**\n    @internal\n    */\n    structure = false) {\n        super();\n        this.from = from;\n        this.to = to;\n        this.gapFrom = gapFrom;\n        this.gapTo = gapTo;\n        this.slice = slice;\n        this.insert = insert;\n        this.structure = structure;\n    }\n    apply(doc) {\n        if (this.structure && (contentBetween(doc, this.from, this.gapFrom) ||\n            contentBetween(doc, this.gapTo, this.to)))\n            return StepResult.fail(\"Structure gap-replace would overwrite content\");\n        let gap = doc.slice(this.gapFrom, this.gapTo);\n        if (gap.openStart || gap.openEnd)\n            return StepResult.fail(\"Gap is not a flat range\");\n        let inserted = this.slice.insertAt(this.insert, gap.content);\n        if (!inserted)\n            return StepResult.fail(\"Content does not fit in gap\");\n        return StepResult.fromReplace(doc, this.from, this.to, inserted);\n    }\n    getMap() {\n        return new StepMap([this.from, this.gapFrom - this.from, this.insert,\n            this.gapTo, this.to - this.gapTo, this.slice.size - this.insert]);\n    }\n    invert(doc) {\n        let gap = this.gapTo - this.gapFrom;\n        return new ReplaceAroundStep(this.from, this.from + this.slice.size + gap, this.from + this.insert, this.from + this.insert + gap, doc.slice(this.from, this.to).removeBetween(this.gapFrom - this.from, this.gapTo - this.from), this.gapFrom - this.from, this.structure);\n    }\n    map(mapping) {\n        let from = mapping.mapResult(this.from, 1), to = mapping.mapResult(this.to, -1);\n        let gapFrom = this.from == this.gapFrom ? from.pos : mapping.map(this.gapFrom, -1);\n        let gapTo = this.to == this.gapTo ? to.pos : mapping.map(this.gapTo, 1);\n        if ((from.deletedAcross && to.deletedAcross) || gapFrom < from.pos || gapTo > to.pos)\n            return null;\n        return new ReplaceAroundStep(from.pos, to.pos, gapFrom, gapTo, this.slice, this.insert, this.structure);\n    }\n    toJSON() {\n        let json = { stepType: \"replaceAround\", from: this.from, to: this.to,\n            gapFrom: this.gapFrom, gapTo: this.gapTo, insert: this.insert };\n        if (this.slice.size)\n            json.slice = this.slice.toJSON();\n        if (this.structure)\n            json.structure = true;\n        return json;\n    }\n    /**\n    @internal\n    */\n    static fromJSON(schema, json) {\n        if (typeof json.from != \"number\" || typeof json.to != \"number\" ||\n            typeof json.gapFrom != \"number\" || typeof json.gapTo != \"number\" || typeof json.insert != \"number\")\n            throw new RangeError(\"Invalid input for ReplaceAroundStep.fromJSON\");\n        return new ReplaceAroundStep(json.from, json.to, json.gapFrom, json.gapTo, Slice.fromJSON(schema, json.slice), json.insert, !!json.structure);\n    }\n}\nStep.jsonID(\"replaceAround\", ReplaceAroundStep);\nfunction contentBetween(doc, from, to) {\n    let $from = doc.resolve(from), dist = to - from, depth = $from.depth;\n    while (dist > 0 && depth > 0 && $from.indexAfter(depth) == $from.node(depth).childCount) {\n        depth--;\n        dist--;\n    }\n    if (dist > 0) {\n        let next = $from.node(depth).maybeChild($from.indexAfter(depth));\n        while (dist > 0) {\n            if (!next || next.isLeaf)\n                return true;\n            next = next.firstChild;\n            dist--;\n        }\n    }\n    return false;\n}\n\nfunction addMark(tr, from, to, mark) {\n    let removed = [], added = [];\n    let removing, adding;\n    tr.doc.nodesBetween(from, to, (node, pos, parent) => {\n        if (!node.isInline)\n            return;\n        let marks = node.marks;\n        if (!mark.isInSet(marks) && parent.type.allowsMarkType(mark.type)) {\n            let start = Math.max(pos, from), end = Math.min(pos + node.nodeSize, to);\n            let newSet = mark.addToSet(marks);\n            for (let i = 0; i < marks.length; i++) {\n                if (!marks[i].isInSet(newSet)) {\n                    if (removing && removing.to == start && removing.mark.eq(marks[i]))\n                        removing.to = end;\n                    else\n                        removed.push(removing = new RemoveMarkStep(start, end, marks[i]));\n                }\n            }\n            if (adding && adding.to == start)\n                adding.to = end;\n            else\n                added.push(adding = new AddMarkStep(start, end, mark));\n        }\n    });\n    removed.forEach(s => tr.step(s));\n    added.forEach(s => tr.step(s));\n}\nfunction removeMark(tr, from, to, mark) {\n    let matched = [], step = 0;\n    tr.doc.nodesBetween(from, to, (node, pos) => {\n        if (!node.isInline)\n            return;\n        step++;\n        let toRemove = null;\n        if (mark instanceof MarkType) {\n            let set = node.marks, found;\n            while (found = mark.isInSet(set)) {\n                (toRemove || (toRemove = [])).push(found);\n                set = found.removeFromSet(set);\n            }\n        }\n        else if (mark) {\n            if (mark.isInSet(node.marks))\n                toRemove = [mark];\n        }\n        else {\n            toRemove = node.marks;\n        }\n        if (toRemove && toRemove.length) {\n            let end = Math.min(pos + node.nodeSize, to);\n            for (let i = 0; i < toRemove.length; i++) {\n                let style = toRemove[i], found;\n                for (let j = 0; j < matched.length; j++) {\n                    let m = matched[j];\n                    if (m.step == step - 1 && style.eq(matched[j].style))\n                        found = m;\n                }\n                if (found) {\n                    found.to = end;\n                    found.step = step;\n                }\n                else {\n                    matched.push({ style, from: Math.max(pos, from), to: end, step });\n                }\n            }\n        }\n    });\n    matched.forEach(m => tr.step(new RemoveMarkStep(m.from, m.to, m.style)));\n}\nfunction clearIncompatible(tr, pos, parentType, match = parentType.contentMatch, clearNewlines = true) {\n    let node = tr.doc.nodeAt(pos);\n    let replSteps = [], cur = pos + 1;\n    for (let i = 0; i < node.childCount; i++) {\n        let child = node.child(i), end = cur + child.nodeSize;\n        let allowed = match.matchType(child.type);\n        if (!allowed) {\n            replSteps.push(new ReplaceStep(cur, end, Slice.empty));\n        }\n        else {\n            match = allowed;\n            for (let j = 0; j < child.marks.length; j++)\n                if (!parentType.allowsMarkType(child.marks[j].type))\n                    tr.step(new RemoveMarkStep(cur, end, child.marks[j]));\n            if (clearNewlines && child.isText && parentType.whitespace != \"pre\") {\n                let m, newline = /\\r?\\n|\\r/g, slice;\n                while (m = newline.exec(child.text)) {\n                    if (!slice)\n                        slice = new Slice(Fragment.from(parentType.schema.text(\" \", parentType.allowedMarks(child.marks))), 0, 0);\n                    replSteps.push(new ReplaceStep(cur + m.index, cur + m.index + m[0].length, slice));\n                }\n            }\n        }\n        cur = end;\n    }\n    if (!match.validEnd) {\n        let fill = match.fillBefore(Fragment.empty, true);\n        tr.replace(cur, cur, new Slice(fill, 0, 0));\n    }\n    for (let i = replSteps.length - 1; i >= 0; i--)\n        tr.step(replSteps[i]);\n}\n\nfunction canCut(node, start, end) {\n    return (start == 0 || node.canReplace(start, node.childCount)) &&\n        (end == node.childCount || node.canReplace(0, end));\n}\n/**\nTry to find a target depth to which the content in the given range\ncan be lifted. Will not go across\n[isolating](https://prosemirror.net/docs/ref/#model.NodeSpec.isolating) parent nodes.\n*/\nfunction liftTarget(range) {\n    let parent = range.parent;\n    let content = parent.content.cutByIndex(range.startIndex, range.endIndex);\n    for (let depth = range.depth;; --depth) {\n        let node = range.$from.node(depth);\n        let index = range.$from.index(depth), endIndex = range.$to.indexAfter(depth);\n        if (depth < range.depth && node.canReplace(index, endIndex, content))\n            return depth;\n        if (depth == 0 || node.type.spec.isolating || !canCut(node, index, endIndex))\n            break;\n    }\n    return null;\n}\nfunction lift(tr, range, target) {\n    let { $from, $to, depth } = range;\n    let gapStart = $from.before(depth + 1), gapEnd = $to.after(depth + 1);\n    let start = gapStart, end = gapEnd;\n    let before = Fragment.empty, openStart = 0;\n    for (let d = depth, splitting = false; d > target; d--)\n        if (splitting || $from.index(d) > 0) {\n            splitting = true;\n            before = Fragment.from($from.node(d).copy(before));\n            openStart++;\n        }\n        else {\n            start--;\n        }\n    let after = Fragment.empty, openEnd = 0;\n    for (let d = depth, splitting = false; d > target; d--)\n        if (splitting || $to.after(d + 1) < $to.end(d)) {\n            splitting = true;\n            after = Fragment.from($to.node(d).copy(after));\n            openEnd++;\n        }\n        else {\n            end++;\n        }\n    tr.step(new ReplaceAroundStep(start, end, gapStart, gapEnd, new Slice(before.append(after), openStart, openEnd), before.size - openStart, true));\n}\n/**\nTry to find a valid way to wrap the content in the given range in a\nnode of the given type. May introduce extra nodes around and inside\nthe wrapper node, if necessary. Returns null if no valid wrapping\ncould be found. When `innerRange` is given, that range's content is\nused as the content to fit into the wrapping, instead of the\ncontent of `range`.\n*/\nfunction findWrapping(range, nodeType, attrs = null, innerRange = range) {\n    let around = findWrappingOutside(range, nodeType);\n    let inner = around && findWrappingInside(innerRange, nodeType);\n    if (!inner)\n        return null;\n    return around.map(withAttrs)\n        .concat({ type: nodeType, attrs }).concat(inner.map(withAttrs));\n}\nfunction withAttrs(type) { return { type, attrs: null }; }\nfunction findWrappingOutside(range, type) {\n    let { parent, startIndex, endIndex } = range;\n    let around = parent.contentMatchAt(startIndex).findWrapping(type);\n    if (!around)\n        return null;\n    let outer = around.length ? around[0] : type;\n    return parent.canReplaceWith(startIndex, endIndex, outer) ? around : null;\n}\nfunction findWrappingInside(range, type) {\n    let { parent, startIndex, endIndex } = range;\n    let inner = parent.child(startIndex);\n    let inside = type.contentMatch.findWrapping(inner.type);\n    if (!inside)\n        return null;\n    let lastType = inside.length ? inside[inside.length - 1] : type;\n    let innerMatch = lastType.contentMatch;\n    for (let i = startIndex; innerMatch && i < endIndex; i++)\n        innerMatch = innerMatch.matchType(parent.child(i).type);\n    if (!innerMatch || !innerMatch.validEnd)\n        return null;\n    return inside;\n}\nfunction wrap(tr, range, wrappers) {\n    let content = Fragment.empty;\n    for (let i = wrappers.length - 1; i >= 0; i--) {\n        if (content.size) {\n            let match = wrappers[i].type.contentMatch.matchFragment(content);\n            if (!match || !match.validEnd)\n                throw new RangeError(\"Wrapper type given to Transform.wrap does not form valid content of its parent wrapper\");\n        }\n        content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content));\n    }\n    let start = range.start, end = range.end;\n    tr.step(new ReplaceAroundStep(start, end, start, end, new Slice(content, 0, 0), wrappers.length, true));\n}\nfunction setBlockType(tr, from, to, type, attrs) {\n    if (!type.isTextblock)\n        throw new RangeError(\"Type given to setBlockType should be a textblock\");\n    let mapFrom = tr.steps.length;\n    tr.doc.nodesBetween(from, to, (node, pos) => {\n        if (node.isTextblock && !node.hasMarkup(type, attrs) && canChangeType(tr.doc, tr.mapping.slice(mapFrom).map(pos), type)) {\n            let convertNewlines = null;\n            if (type.schema.linebreakReplacement) {\n                let pre = type.whitespace == \"pre\", supportLinebreak = !!type.contentMatch.matchType(type.schema.linebreakReplacement);\n                if (pre && !supportLinebreak)\n                    convertNewlines = false;\n                else if (!pre && supportLinebreak)\n                    convertNewlines = true;\n            }\n            // Ensure all markup that isn't allowed in the new node type is cleared\n            if (convertNewlines === false)\n                replaceLinebreaks(tr, node, pos, mapFrom);\n            clearIncompatible(tr, tr.mapping.slice(mapFrom).map(pos, 1), type, undefined, convertNewlines === null);\n            let mapping = tr.mapping.slice(mapFrom);\n            let startM = mapping.map(pos, 1), endM = mapping.map(pos + node.nodeSize, 1);\n            tr.step(new ReplaceAroundStep(startM, endM, startM + 1, endM - 1, new Slice(Fragment.from(type.create(attrs, null, node.marks)), 0, 0), 1, true));\n            if (convertNewlines === true)\n                replaceNewlines(tr, node, pos, mapFrom);\n            return false;\n        }\n    });\n}\nfunction replaceNewlines(tr, node, pos, mapFrom) {\n    node.forEach((child, offset) => {\n        if (child.isText) {\n            let m, newline = /\\r?\\n|\\r/g;\n            while (m = newline.exec(child.text)) {\n                let start = tr.mapping.slice(mapFrom).map(pos + 1 + offset + m.index);\n                tr.replaceWith(start, start + 1, node.type.schema.linebreakReplacement.create());\n            }\n        }\n    });\n}\nfunction replaceLinebreaks(tr, node, pos, mapFrom) {\n    node.forEach((child, offset) => {\n        if (child.type == child.type.schema.linebreakReplacement) {\n            let start = tr.mapping.slice(mapFrom).map(pos + 1 + offset);\n            tr.replaceWith(start, start + 1, node.type.schema.text(\"\\n\"));\n        }\n    });\n}\nfunction canChangeType(doc, pos, type) {\n    let $pos = doc.resolve(pos), index = $pos.index();\n    return $pos.parent.canReplaceWith(index, index + 1, type);\n}\n/**\nChange the type, attributes, and/or marks of the node at `pos`.\nWhen `type` isn't given, the existing node type is preserved,\n*/\nfunction setNodeMarkup(tr, pos, type, attrs, marks) {\n    let node = tr.doc.nodeAt(pos);\n    if (!node)\n        throw new RangeError(\"No node at given position\");\n    if (!type)\n        type = node.type;\n    let newNode = type.create(attrs, null, marks || node.marks);\n    if (node.isLeaf)\n        return tr.replaceWith(pos, pos + node.nodeSize, newNode);\n    if (!type.validContent(node.content))\n        throw new RangeError(\"Invalid content for node type \" + type.name);\n    tr.step(new ReplaceAroundStep(pos, pos + node.nodeSize, pos + 1, pos + node.nodeSize - 1, new Slice(Fragment.from(newNode), 0, 0), 1, true));\n}\n/**\nCheck whether splitting at the given position is allowed.\n*/\nfunction canSplit(doc, pos, depth = 1, typesAfter) {\n    let $pos = doc.resolve(pos), base = $pos.depth - depth;\n    let innerType = (typesAfter && typesAfter[typesAfter.length - 1]) || $pos.parent;\n    if (base < 0 || $pos.parent.type.spec.isolating ||\n        !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) ||\n        !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount)))\n        return false;\n    for (let d = $pos.depth - 1, i = depth - 2; d > base; d--, i--) {\n        let node = $pos.node(d), index = $pos.index(d);\n        if (node.type.spec.isolating)\n            return false;\n        let rest = node.content.cutByIndex(index, node.childCount);\n        let overrideChild = typesAfter && typesAfter[i + 1];\n        if (overrideChild)\n            rest = rest.replaceChild(0, overrideChild.type.create(overrideChild.attrs));\n        let after = (typesAfter && typesAfter[i]) || node;\n        if (!node.canReplace(index + 1, node.childCount) || !after.type.validContent(rest))\n            return false;\n    }\n    let index = $pos.indexAfter(base);\n    let baseType = typesAfter && typesAfter[0];\n    return $pos.node(base).canReplaceWith(index, index, baseType ? baseType.type : $pos.node(base + 1).type);\n}\nfunction split(tr, pos, depth = 1, typesAfter) {\n    let $pos = tr.doc.resolve(pos), before = Fragment.empty, after = Fragment.empty;\n    for (let d = $pos.depth, e = $pos.depth - depth, i = depth - 1; d > e; d--, i--) {\n        before = Fragment.from($pos.node(d).copy(before));\n        let typeAfter = typesAfter && typesAfter[i];\n        after = Fragment.from(typeAfter ? typeAfter.type.create(typeAfter.attrs, after) : $pos.node(d).copy(after));\n    }\n    tr.step(new ReplaceStep(pos, pos, new Slice(before.append(after), depth, depth), true));\n}\n/**\nTest whether the blocks before and after a given position can be\njoined.\n*/\nfunction canJoin(doc, pos) {\n    let $pos = doc.resolve(pos), index = $pos.index();\n    return joinable($pos.nodeBefore, $pos.nodeAfter) &&\n        $pos.parent.canReplace(index, index + 1);\n}\nfunction joinable(a, b) {\n    return !!(a && b && !a.isLeaf && a.canAppend(b));\n}\n/**\nFind an ancestor of the given position that can be joined to the\nblock before (or after if `dir` is positive). Returns the joinable\npoint, if any.\n*/\nfunction joinPoint(doc, pos, dir = -1) {\n    let $pos = doc.resolve(pos);\n    for (let d = $pos.depth;; d--) {\n        let before, after, index = $pos.index(d);\n        if (d == $pos.depth) {\n            before = $pos.nodeBefore;\n            after = $pos.nodeAfter;\n        }\n        else if (dir > 0) {\n            before = $pos.node(d + 1);\n            index++;\n            after = $pos.node(d).maybeChild(index);\n        }\n        else {\n            before = $pos.node(d).maybeChild(index - 1);\n            after = $pos.node(d + 1);\n        }\n        if (before && !before.isTextblock && joinable(before, after) &&\n            $pos.node(d).canReplace(index, index + 1))\n            return pos;\n        if (d == 0)\n            break;\n        pos = dir < 0 ? $pos.before(d) : $pos.after(d);\n    }\n}\nfunction join(tr, pos, depth) {\n    let step = new ReplaceStep(pos - depth, pos + depth, Slice.empty, true);\n    tr.step(step);\n}\n/**\nTry to find a point where a node of the given type can be inserted\nnear `pos`, by searching up the node hierarchy when `pos` itself\nisn't a valid place but is at the start or end of a node. Return\nnull if no position was found.\n*/\nfunction insertPoint(doc, pos, nodeType) {\n    let $pos = doc.resolve(pos);\n    if ($pos.parent.canReplaceWith($pos.index(), $pos.index(), nodeType))\n        return pos;\n    if ($pos.parentOffset == 0)\n        for (let d = $pos.depth - 1; d >= 0; d--) {\n            let index = $pos.index(d);\n            if ($pos.node(d).canReplaceWith(index, index, nodeType))\n                return $pos.before(d + 1);\n            if (index > 0)\n                return null;\n        }\n    if ($pos.parentOffset == $pos.parent.content.size)\n        for (let d = $pos.depth - 1; d >= 0; d--) {\n            let index = $pos.indexAfter(d);\n            if ($pos.node(d).canReplaceWith(index, index, nodeType))\n                return $pos.after(d + 1);\n            if (index < $pos.node(d).childCount)\n                return null;\n        }\n    return null;\n}\n/**\nFinds a position at or around the given position where the given\nslice can be inserted. Will look at parent nodes' nearest boundary\nand try there, even if the original position wasn't directly at the\nstart or end of that node. Returns null when no position was found.\n*/\nfunction dropPoint(doc, pos, slice) {\n    let $pos = doc.resolve(pos);\n    if (!slice.content.size)\n        return pos;\n    let content = slice.content;\n    for (let i = 0; i < slice.openStart; i++)\n        content = content.firstChild.content;\n    for (let pass = 1; pass <= (slice.openStart == 0 && slice.size ? 2 : 1); pass++) {\n        for (let d = $pos.depth; d >= 0; d--) {\n            let bias = d == $pos.depth ? 0 : $pos.pos <= ($pos.start(d + 1) + $pos.end(d + 1)) / 2 ? -1 : 1;\n            let insertPos = $pos.index(d) + (bias > 0 ? 1 : 0);\n            let parent = $pos.node(d), fits = false;\n            if (pass == 1) {\n                fits = parent.canReplace(insertPos, insertPos, content);\n            }\n            else {\n                let wrapping = parent.contentMatchAt(insertPos).findWrapping(content.firstChild.type);\n                fits = wrapping && parent.canReplaceWith(insertPos, insertPos, wrapping[0]);\n            }\n            if (fits)\n                return bias == 0 ? $pos.pos : bias < 0 ? $pos.before(d + 1) : $pos.after(d + 1);\n        }\n    }\n    return null;\n}\n\n/**\n‘Fit’ a slice into a given position in the document, producing a\n[step](https://prosemirror.net/docs/ref/#transform.Step) that inserts it. Will return null if\nthere's no meaningful way to insert the slice here, or inserting it\nwould be a no-op (an empty slice over an empty range).\n*/\nfunction replaceStep(doc, from, to = from, slice = Slice.empty) {\n    if (from == to && !slice.size)\n        return null;\n    let $from = doc.resolve(from), $to = doc.resolve(to);\n    // Optimization -- avoid work if it's obvious that it's not needed.\n    if (fitsTrivially($from, $to, slice))\n        return new ReplaceStep(from, to, slice);\n    return new Fitter($from, $to, slice).fit();\n}\nfunction fitsTrivially($from, $to, slice) {\n    return !slice.openStart && !slice.openEnd && $from.start() == $to.start() &&\n        $from.parent.canReplace($from.index(), $to.index(), slice.content);\n}\n// Algorithm for 'placing' the elements of a slice into a gap:\n//\n// We consider the content of each node that is open to the left to be\n// independently placeable. I.e. in <p(\"foo\"), p(\"bar\")>, when the\n// paragraph on the left is open, \"foo\" can be placed (somewhere on\n// the left side of the replacement gap) independently from p(\"bar\").\n//\n// This class tracks the state of the placement progress in the\n// following properties:\n//\n//  - `frontier` holds a stack of `{type, match}` objects that\n//    represent the open side of the replacement. It starts at\n//    `$from`, then moves forward as content is placed, and is finally\n//    reconciled with `$to`.\n//\n//  - `unplaced` is a slice that represents the content that hasn't\n//    been placed yet.\n//\n//  - `placed` is a fragment of placed content. Its open-start value\n//    is implicit in `$from`, and its open-end value in `frontier`.\nclass Fitter {\n    constructor($from, $to, unplaced) {\n        this.$from = $from;\n        this.$to = $to;\n        this.unplaced = unplaced;\n        this.frontier = [];\n        this.placed = Fragment.empty;\n        for (let i = 0; i <= $from.depth; i++) {\n            let node = $from.node(i);\n            this.frontier.push({\n                type: node.type,\n                match: node.contentMatchAt($from.indexAfter(i))\n            });\n        }\n        for (let i = $from.depth; i > 0; i--)\n            this.placed = Fragment.from($from.node(i).copy(this.placed));\n    }\n    get depth() { return this.frontier.length - 1; }\n    fit() {\n        // As long as there's unplaced content, try to place some of it.\n        // If that fails, either increase the open score of the unplaced\n        // slice, or drop nodes from it, and then try again.\n        while (this.unplaced.size) {\n            let fit = this.findFittable();\n            if (fit)\n                this.placeNodes(fit);\n            else\n                this.openMore() || this.dropNode();\n        }\n        // When there's inline content directly after the frontier _and_\n        // directly after `this.$to`, we must generate a `ReplaceAround`\n        // step that pulls that content into the node after the frontier.\n        // That means the fitting must be done to the end of the textblock\n        // node after `this.$to`, not `this.$to` itself.\n        let moveInline = this.mustMoveInline(), placedSize = this.placed.size - this.depth - this.$from.depth;\n        let $from = this.$from, $to = this.close(moveInline < 0 ? this.$to : $from.doc.resolve(moveInline));\n        if (!$to)\n            return null;\n        // If closing to `$to` succeeded, create a step\n        let content = this.placed, openStart = $from.depth, openEnd = $to.depth;\n        while (openStart && openEnd && content.childCount == 1) { // Normalize by dropping open parent nodes\n            content = content.firstChild.content;\n            openStart--;\n            openEnd--;\n        }\n        let slice = new Slice(content, openStart, openEnd);\n        if (moveInline > -1)\n            return new ReplaceAroundStep($from.pos, moveInline, this.$to.pos, this.$to.end(), slice, placedSize);\n        if (slice.size || $from.pos != this.$to.pos) // Don't generate no-op steps\n            return new ReplaceStep($from.pos, $to.pos, slice);\n        return null;\n    }\n    // Find a position on the start spine of `this.unplaced` that has\n    // content that can be moved somewhere on the frontier. Returns two\n    // depths, one for the slice and one for the frontier.\n    findFittable() {\n        let startDepth = this.unplaced.openStart;\n        for (let cur = this.unplaced.content, d = 0, openEnd = this.unplaced.openEnd; d < startDepth; d++) {\n            let node = cur.firstChild;\n            if (cur.childCount > 1)\n                openEnd = 0;\n            if (node.type.spec.isolating && openEnd <= d) {\n                startDepth = d;\n                break;\n            }\n            cur = node.content;\n        }\n        // Only try wrapping nodes (pass 2) after finding a place without\n        // wrapping failed.\n        for (let pass = 1; pass <= 2; pass++) {\n            for (let sliceDepth = pass == 1 ? startDepth : this.unplaced.openStart; sliceDepth >= 0; sliceDepth--) {\n                let fragment, parent = null;\n                if (sliceDepth) {\n                    parent = contentAt(this.unplaced.content, sliceDepth - 1).firstChild;\n                    fragment = parent.content;\n                }\n                else {\n                    fragment = this.unplaced.content;\n                }\n                let first = fragment.firstChild;\n                for (let frontierDepth = this.depth; frontierDepth >= 0; frontierDepth--) {\n                    let { type, match } = this.frontier[frontierDepth], wrap, inject = null;\n                    // In pass 1, if the next node matches, or there is no next\n                    // node but the parents look compatible, we've found a\n                    // place.\n                    if (pass == 1 && (first ? match.matchType(first.type) || (inject = match.fillBefore(Fragment.from(first), false))\n                        : parent && type.compatibleContent(parent.type)))\n                        return { sliceDepth, frontierDepth, parent, inject };\n                    // In pass 2, look for a set of wrapping nodes that make\n                    // `first` fit here.\n                    else if (pass == 2 && first && (wrap = match.findWrapping(first.type)))\n                        return { sliceDepth, frontierDepth, parent, wrap };\n                    // Don't continue looking further up if the parent node\n                    // would fit here.\n                    if (parent && match.matchType(parent.type))\n                        break;\n                }\n            }\n        }\n    }\n    openMore() {\n        let { content, openStart, openEnd } = this.unplaced;\n        let inner = contentAt(content, openStart);\n        if (!inner.childCount || inner.firstChild.isLeaf)\n            return false;\n        this.unplaced = new Slice(content, openStart + 1, Math.max(openEnd, inner.size + openStart >= content.size - openEnd ? openStart + 1 : 0));\n        return true;\n    }\n    dropNode() {\n        let { content, openStart, openEnd } = this.unplaced;\n        let inner = contentAt(content, openStart);\n        if (inner.childCount <= 1 && openStart > 0) {\n            let openAtEnd = content.size - openStart <= openStart + inner.size;\n            this.unplaced = new Slice(dropFromFragment(content, openStart - 1, 1), openStart - 1, openAtEnd ? openStart - 1 : openEnd);\n        }\n        else {\n            this.unplaced = new Slice(dropFromFragment(content, openStart, 1), openStart, openEnd);\n        }\n    }\n    // Move content from the unplaced slice at `sliceDepth` to the\n    // frontier node at `frontierDepth`. Close that frontier node when\n    // applicable.\n    placeNodes({ sliceDepth, frontierDepth, parent, inject, wrap }) {\n        while (this.depth > frontierDepth)\n            this.closeFrontierNode();\n        if (wrap)\n            for (let i = 0; i < wrap.length; i++)\n                this.openFrontierNode(wrap[i]);\n        let slice = this.unplaced, fragment = parent ? parent.content : slice.content;\n        let openStart = slice.openStart - sliceDepth;\n        let taken = 0, add = [];\n        let { match, type } = this.frontier[frontierDepth];\n        if (inject) {\n            for (let i = 0; i < inject.childCount; i++)\n                add.push(inject.child(i));\n            match = match.matchFragment(inject);\n        }\n        // Computes the amount of (end) open nodes at the end of the\n        // fragment. When 0, the parent is open, but no more. When\n        // negative, nothing is open.\n        let openEndCount = (fragment.size + sliceDepth) - (slice.content.size - slice.openEnd);\n        // Scan over the fragment, fitting as many child nodes as\n        // possible.\n        while (taken < fragment.childCount) {\n            let next = fragment.child(taken), matches = match.matchType(next.type);\n            if (!matches)\n                break;\n            taken++;\n            if (taken > 1 || openStart == 0 || next.content.size) { // Drop empty open nodes\n                match = matches;\n                add.push(closeNodeStart(next.mark(type.allowedMarks(next.marks)), taken == 1 ? openStart : 0, taken == fragment.childCount ? openEndCount : -1));\n            }\n        }\n        let toEnd = taken == fragment.childCount;\n        if (!toEnd)\n            openEndCount = -1;\n        this.placed = addToFragment(this.placed, frontierDepth, Fragment.from(add));\n        this.frontier[frontierDepth].match = match;\n        // If the parent types match, and the entire node was moved, and\n        // it's not open, close this frontier node right away.\n        if (toEnd && openEndCount < 0 && parent && parent.type == this.frontier[this.depth].type && this.frontier.length > 1)\n            this.closeFrontierNode();\n        // Add new frontier nodes for any open nodes at the end.\n        for (let i = 0, cur = fragment; i < openEndCount; i++) {\n            let node = cur.lastChild;\n            this.frontier.push({ type: node.type, match: node.contentMatchAt(node.childCount) });\n            cur = node.content;\n        }\n        // Update `this.unplaced`. Drop the entire node from which we\n        // placed it we got to its end, otherwise just drop the placed\n        // nodes.\n        this.unplaced = !toEnd ? new Slice(dropFromFragment(slice.content, sliceDepth, taken), slice.openStart, slice.openEnd)\n            : sliceDepth == 0 ? Slice.empty\n                : new Slice(dropFromFragment(slice.content, sliceDepth - 1, 1), sliceDepth - 1, openEndCount < 0 ? slice.openEnd : sliceDepth - 1);\n    }\n    mustMoveInline() {\n        if (!this.$to.parent.isTextblock)\n            return -1;\n        let top = this.frontier[this.depth], level;\n        if (!top.type.isTextblock || !contentAfterFits(this.$to, this.$to.depth, top.type, top.match, false) ||\n            (this.$to.depth == this.depth && (level = this.findCloseLevel(this.$to)) && level.depth == this.depth))\n            return -1;\n        let { depth } = this.$to, after = this.$to.after(depth);\n        while (depth > 1 && after == this.$to.end(--depth))\n            ++after;\n        return after;\n    }\n    findCloseLevel($to) {\n        scan: for (let i = Math.min(this.depth, $to.depth); i >= 0; i--) {\n            let { match, type } = this.frontier[i];\n            let dropInner = i < $to.depth && $to.end(i + 1) == $to.pos + ($to.depth - (i + 1));\n            let fit = contentAfterFits($to, i, type, match, dropInner);\n            if (!fit)\n                continue;\n            for (let d = i - 1; d >= 0; d--) {\n                let { match, type } = this.frontier[d];\n                let matches = contentAfterFits($to, d, type, match, true);\n                if (!matches || matches.childCount)\n                    continue scan;\n            }\n            return { depth: i, fit, move: dropInner ? $to.doc.resolve($to.after(i + 1)) : $to };\n        }\n    }\n    close($to) {\n        let close = this.findCloseLevel($to);\n        if (!close)\n            return null;\n        while (this.depth > close.depth)\n            this.closeFrontierNode();\n        if (close.fit.childCount)\n            this.placed = addToFragment(this.placed, close.depth, close.fit);\n        $to = close.move;\n        for (let d = close.depth + 1; d <= $to.depth; d++) {\n            let node = $to.node(d), add = node.type.contentMatch.fillBefore(node.content, true, $to.index(d));\n            this.openFrontierNode(node.type, node.attrs, add);\n        }\n        return $to;\n    }\n    openFrontierNode(type, attrs = null, content) {\n        let top = this.frontier[this.depth];\n        top.match = top.match.matchType(type);\n        this.placed = addToFragment(this.placed, this.depth, Fragment.from(type.create(attrs, content)));\n        this.frontier.push({ type, match: type.contentMatch });\n    }\n    closeFrontierNode() {\n        let open = this.frontier.pop();\n        let add = open.match.fillBefore(Fragment.empty, true);\n        if (add.childCount)\n            this.placed = addToFragment(this.placed, this.frontier.length, add);\n    }\n}\nfunction dropFromFragment(fragment, depth, count) {\n    if (depth == 0)\n        return fragment.cutByIndex(count, fragment.childCount);\n    return fragment.replaceChild(0, fragment.firstChild.copy(dropFromFragment(fragment.firstChild.content, depth - 1, count)));\n}\nfunction addToFragment(fragment, depth, content) {\n    if (depth == 0)\n        return fragment.append(content);\n    return fragment.replaceChild(fragment.childCount - 1, fragment.lastChild.copy(addToFragment(fragment.lastChild.content, depth - 1, content)));\n}\nfunction contentAt(fragment, depth) {\n    for (let i = 0; i < depth; i++)\n        fragment = fragment.firstChild.content;\n    return fragment;\n}\nfunction closeNodeStart(node, openStart, openEnd) {\n    if (openStart <= 0)\n        return node;\n    let frag = node.content;\n    if (openStart > 1)\n        frag = frag.replaceChild(0, closeNodeStart(frag.firstChild, openStart - 1, frag.childCount == 1 ? openEnd - 1 : 0));\n    if (openStart > 0) {\n        frag = node.type.contentMatch.fillBefore(frag).append(frag);\n        if (openEnd <= 0)\n            frag = frag.append(node.type.contentMatch.matchFragment(frag).fillBefore(Fragment.empty, true));\n    }\n    return node.copy(frag);\n}\nfunction contentAfterFits($to, depth, type, match, open) {\n    let node = $to.node(depth), index = open ? $to.indexAfter(depth) : $to.index(depth);\n    if (index == node.childCount && !type.compatibleContent(node.type))\n        return null;\n    let fit = match.fillBefore(node.content, true, index);\n    return fit && !invalidMarks(type, node.content, index) ? fit : null;\n}\nfunction invalidMarks(type, fragment, start) {\n    for (let i = start; i < fragment.childCount; i++)\n        if (!type.allowsMarks(fragment.child(i).marks))\n            return true;\n    return false;\n}\nfunction definesContent(type) {\n    return type.spec.defining || type.spec.definingForContent;\n}\nfunction replaceRange(tr, from, to, slice) {\n    if (!slice.size)\n        return tr.deleteRange(from, to);\n    let $from = tr.doc.resolve(from), $to = tr.doc.resolve(to);\n    if (fitsTrivially($from, $to, slice))\n        return tr.step(new ReplaceStep(from, to, slice));\n    let targetDepths = coveredDepths($from, tr.doc.resolve(to));\n    // Can't replace the whole document, so remove 0 if it's present\n    if (targetDepths[targetDepths.length - 1] == 0)\n        targetDepths.pop();\n    // Negative numbers represent not expansion over the whole node at\n    // that depth, but replacing from $from.before(-D) to $to.pos.\n    let preferredTarget = -($from.depth + 1);\n    targetDepths.unshift(preferredTarget);\n    // This loop picks a preferred target depth, if one of the covering\n    // depths is not outside of a defining node, and adds negative\n    // depths for any depth that has $from at its start and does not\n    // cross a defining node.\n    for (let d = $from.depth, pos = $from.pos - 1; d > 0; d--, pos--) {\n        let spec = $from.node(d).type.spec;\n        if (spec.defining || spec.definingAsContext || spec.isolating)\n            break;\n        if (targetDepths.indexOf(d) > -1)\n            preferredTarget = d;\n        else if ($from.before(d) == pos)\n            targetDepths.splice(1, 0, -d);\n    }\n    // Try to fit each possible depth of the slice into each possible\n    // target depth, starting with the preferred depths.\n    let preferredTargetIndex = targetDepths.indexOf(preferredTarget);\n    let leftNodes = [], preferredDepth = slice.openStart;\n    for (let content = slice.content, i = 0;; i++) {\n        let node = content.firstChild;\n        leftNodes.push(node);\n        if (i == slice.openStart)\n            break;\n        content = node.content;\n    }\n    // Back up preferredDepth to cover defining textblocks directly\n    // above it, possibly skipping a non-defining textblock.\n    for (let d = preferredDepth - 1; d >= 0; d--) {\n        let leftNode = leftNodes[d], def = definesContent(leftNode.type);\n        if (def && !leftNode.sameMarkup($from.node(Math.abs(preferredTarget) - 1)))\n            preferredDepth = d;\n        else if (def || !leftNode.type.isTextblock)\n            break;\n    }\n    for (let j = slice.openStart; j >= 0; j--) {\n        let openDepth = (j + preferredDepth + 1) % (slice.openStart + 1);\n        let insert = leftNodes[openDepth];\n        if (!insert)\n            continue;\n        for (let i = 0; i < targetDepths.length; i++) {\n            // Loop over possible expansion levels, starting with the\n            // preferred one\n            let targetDepth = targetDepths[(i + preferredTargetIndex) % targetDepths.length], expand = true;\n            if (targetDepth < 0) {\n                expand = false;\n                targetDepth = -targetDepth;\n            }\n            let parent = $from.node(targetDepth - 1), index = $from.index(targetDepth - 1);\n            if (parent.canReplaceWith(index, index, insert.type, insert.marks))\n                return tr.replace($from.before(targetDepth), expand ? $to.after(targetDepth) : to, new Slice(closeFragment(slice.content, 0, slice.openStart, openDepth), openDepth, slice.openEnd));\n        }\n    }\n    let startSteps = tr.steps.length;\n    for (let i = targetDepths.length - 1; i >= 0; i--) {\n        tr.replace(from, to, slice);\n        if (tr.steps.length > startSteps)\n            break;\n        let depth = targetDepths[i];\n        if (depth < 0)\n            continue;\n        from = $from.before(depth);\n        to = $to.after(depth);\n    }\n}\nfunction closeFragment(fragment, depth, oldOpen, newOpen, parent) {\n    if (depth < oldOpen) {\n        let first = fragment.firstChild;\n        fragment = fragment.replaceChild(0, first.copy(closeFragment(first.content, depth + 1, oldOpen, newOpen, first)));\n    }\n    if (depth > newOpen) {\n        let match = parent.contentMatchAt(0);\n        let start = match.fillBefore(fragment).append(fragment);\n        fragment = start.append(match.matchFragment(start).fillBefore(Fragment.empty, true));\n    }\n    return fragment;\n}\nfunction replaceRangeWith(tr, from, to, node) {\n    if (!node.isInline && from == to && tr.doc.resolve(from).parent.content.size) {\n        let point = insertPoint(tr.doc, from, node.type);\n        if (point != null)\n            from = to = point;\n    }\n    tr.replaceRange(from, to, new Slice(Fragment.from(node), 0, 0));\n}\nfunction deleteRange(tr, from, to) {\n    let $from = tr.doc.resolve(from), $to = tr.doc.resolve(to);\n    let covered = coveredDepths($from, $to);\n    for (let i = 0; i < covered.length; i++) {\n        let depth = covered[i], last = i == covered.length - 1;\n        if ((last && depth == 0) || $from.node(depth).type.contentMatch.validEnd)\n            return tr.delete($from.start(depth), $to.end(depth));\n        if (depth > 0 && (last || $from.node(depth - 1).canReplace($from.index(depth - 1), $to.indexAfter(depth - 1))))\n            return tr.delete($from.before(depth), $to.after(depth));\n    }\n    for (let d = 1; d <= $from.depth && d <= $to.depth; d++) {\n        if (from - $from.start(d) == $from.depth - d && to > $from.end(d) && $to.end(d) - to != $to.depth - d)\n            return tr.delete($from.before(d), to);\n    }\n    tr.delete(from, to);\n}\n// Returns an array of all depths for which $from - $to spans the\n// whole content of the nodes at that depth.\nfunction coveredDepths($from, $to) {\n    let result = [], minDepth = Math.min($from.depth, $to.depth);\n    for (let d = minDepth; d >= 0; d--) {\n        let start = $from.start(d);\n        if (start < $from.pos - ($from.depth - d) ||\n            $to.end(d) > $to.pos + ($to.depth - d) ||\n            $from.node(d).type.spec.isolating ||\n            $to.node(d).type.spec.isolating)\n            break;\n        if (start == $to.start(d) ||\n            (d == $from.depth && d == $to.depth && $from.parent.inlineContent && $to.parent.inlineContent &&\n                d && $to.start(d - 1) == start - 1))\n            result.push(d);\n    }\n    return result;\n}\n\n/**\nUpdate an attribute in a specific node.\n*/\nclass AttrStep extends Step {\n    /**\n    Construct an attribute step.\n    */\n    constructor(\n    /**\n    The position of the target node.\n    */\n    pos, \n    /**\n    The attribute to set.\n    */\n    attr, \n    // The attribute's new value.\n    value) {\n        super();\n        this.pos = pos;\n        this.attr = attr;\n        this.value = value;\n    }\n    apply(doc) {\n        let node = doc.nodeAt(this.pos);\n        if (!node)\n            return StepResult.fail(\"No node at attribute step's position\");\n        let attrs = Object.create(null);\n        for (let name in node.attrs)\n            attrs[name] = node.attrs[name];\n        attrs[this.attr] = this.value;\n        let updated = node.type.create(attrs, null, node.marks);\n        return StepResult.fromReplace(doc, this.pos, this.pos + 1, new Slice(Fragment.from(updated), 0, node.isLeaf ? 0 : 1));\n    }\n    getMap() {\n        return StepMap.empty;\n    }\n    invert(doc) {\n        return new AttrStep(this.pos, this.attr, doc.nodeAt(this.pos).attrs[this.attr]);\n    }\n    map(mapping) {\n        let pos = mapping.mapResult(this.pos, 1);\n        return pos.deletedAfter ? null : new AttrStep(pos.pos, this.attr, this.value);\n    }\n    toJSON() {\n        return { stepType: \"attr\", pos: this.pos, attr: this.attr, value: this.value };\n    }\n    static fromJSON(schema, json) {\n        if (typeof json.pos != \"number\" || typeof json.attr != \"string\")\n            throw new RangeError(\"Invalid input for AttrStep.fromJSON\");\n        return new AttrStep(json.pos, json.attr, json.value);\n    }\n}\nStep.jsonID(\"attr\", AttrStep);\n/**\nUpdate an attribute in the doc node.\n*/\nclass DocAttrStep extends Step {\n    /**\n    Construct an attribute step.\n    */\n    constructor(\n    /**\n    The attribute to set.\n    */\n    attr, \n    // The attribute's new value.\n    value) {\n        super();\n        this.attr = attr;\n        this.value = value;\n    }\n    apply(doc) {\n        let attrs = Object.create(null);\n        for (let name in doc.attrs)\n            attrs[name] = doc.attrs[name];\n        attrs[this.attr] = this.value;\n        let updated = doc.type.create(attrs, doc.content, doc.marks);\n        return StepResult.ok(updated);\n    }\n    getMap() {\n        return StepMap.empty;\n    }\n    invert(doc) {\n        return new DocAttrStep(this.attr, doc.attrs[this.attr]);\n    }\n    map(mapping) {\n        return this;\n    }\n    toJSON() {\n        return { stepType: \"docAttr\", attr: this.attr, value: this.value };\n    }\n    static fromJSON(schema, json) {\n        if (typeof json.attr != \"string\")\n            throw new RangeError(\"Invalid input for DocAttrStep.fromJSON\");\n        return new DocAttrStep(json.attr, json.value);\n    }\n}\nStep.jsonID(\"docAttr\", DocAttrStep);\n\n/**\n@internal\n*/\nlet TransformError = class extends Error {\n};\nTransformError = function TransformError(message) {\n    let err = Error.call(this, message);\n    err.__proto__ = TransformError.prototype;\n    return err;\n};\nTransformError.prototype = Object.create(Error.prototype);\nTransformError.prototype.constructor = TransformError;\nTransformError.prototype.name = \"TransformError\";\n/**\nAbstraction to build up and track an array of\n[steps](https://prosemirror.net/docs/ref/#transform.Step) representing a document transformation.\n\nMost transforming methods return the `Transform` object itself, so\nthat they can be chained.\n*/\nclass Transform {\n    /**\n    Create a transform that starts with the given document.\n    */\n    constructor(\n    /**\n    The current document (the result of applying the steps in the\n    transform).\n    */\n    doc) {\n        this.doc = doc;\n        /**\n        The steps in this transform.\n        */\n        this.steps = [];\n        /**\n        The documents before each of the steps.\n        */\n        this.docs = [];\n        /**\n        A mapping with the maps for each of the steps in this transform.\n        */\n        this.mapping = new Mapping;\n    }\n    /**\n    The starting document.\n    */\n    get before() { return this.docs.length ? this.docs[0] : this.doc; }\n    /**\n    Apply a new step in this transform, saving the result. Throws an\n    error when the step fails.\n    */\n    step(step) {\n        let result = this.maybeStep(step);\n        if (result.failed)\n            throw new TransformError(result.failed);\n        return this;\n    }\n    /**\n    Try to apply a step in this transformation, ignoring it if it\n    fails. Returns the step result.\n    */\n    maybeStep(step) {\n        let result = step.apply(this.doc);\n        if (!result.failed)\n            this.addStep(step, result.doc);\n        return result;\n    }\n    /**\n    True when the document has been changed (when there are any\n    steps).\n    */\n    get docChanged() {\n        return this.steps.length > 0;\n    }\n    /**\n    @internal\n    */\n    addStep(step, doc) {\n        this.docs.push(this.doc);\n        this.steps.push(step);\n        this.mapping.appendMap(step.getMap());\n        this.doc = doc;\n    }\n    /**\n    Replace the part of the document between `from` and `to` with the\n    given `slice`.\n    */\n    replace(from, to = from, slice = Slice.empty) {\n        let step = replaceStep(this.doc, from, to, slice);\n        if (step)\n            this.step(step);\n        return this;\n    }\n    /**\n    Replace the given range with the given content, which may be a\n    fragment, node, or array of nodes.\n    */\n    replaceWith(from, to, content) {\n        return this.replace(from, to, new Slice(Fragment.from(content), 0, 0));\n    }\n    /**\n    Delete the content between the given positions.\n    */\n    delete(from, to) {\n        return this.replace(from, to, Slice.empty);\n    }\n    /**\n    Insert the given content at the given position.\n    */\n    insert(pos, content) {\n        return this.replaceWith(pos, pos, content);\n    }\n    /**\n    Replace a range of the document with a given slice, using\n    `from`, `to`, and the slice's\n    [`openStart`](https://prosemirror.net/docs/ref/#model.Slice.openStart) property as hints, rather\n    than fixed start and end points. This method may grow the\n    replaced area or close open nodes in the slice in order to get a\n    fit that is more in line with WYSIWYG expectations, by dropping\n    fully covered parent nodes of the replaced region when they are\n    marked [non-defining as\n    context](https://prosemirror.net/docs/ref/#model.NodeSpec.definingAsContext), or including an\n    open parent node from the slice that _is_ marked as [defining\n    its content](https://prosemirror.net/docs/ref/#model.NodeSpec.definingForContent).\n    \n    This is the method, for example, to handle paste. The similar\n    [`replace`](https://prosemirror.net/docs/ref/#transform.Transform.replace) method is a more\n    primitive tool which will _not_ move the start and end of its given\n    range, and is useful in situations where you need more precise\n    control over what happens.\n    */\n    replaceRange(from, to, slice) {\n        replaceRange(this, from, to, slice);\n        return this;\n    }\n    /**\n    Replace the given range with a node, but use `from` and `to` as\n    hints, rather than precise positions. When from and to are the same\n    and are at the start or end of a parent node in which the given\n    node doesn't fit, this method may _move_ them out towards a parent\n    that does allow the given node to be placed. When the given range\n    completely covers a parent node, this method may completely replace\n    that parent node.\n    */\n    replaceRangeWith(from, to, node) {\n        replaceRangeWith(this, from, to, node);\n        return this;\n    }\n    /**\n    Delete the given range, expanding it to cover fully covered\n    parent nodes until a valid replace is found.\n    */\n    deleteRange(from, to) {\n        deleteRange(this, from, to);\n        return this;\n    }\n    /**\n    Split the content in the given range off from its parent, if there\n    is sibling content before or after it, and move it up the tree to\n    the depth specified by `target`. You'll probably want to use\n    [`liftTarget`](https://prosemirror.net/docs/ref/#transform.liftTarget) to compute `target`, to make\n    sure the lift is valid.\n    */\n    lift(range, target) {\n        lift(this, range, target);\n        return this;\n    }\n    /**\n    Join the blocks around the given position. If depth is 2, their\n    last and first siblings are also joined, and so on.\n    */\n    join(pos, depth = 1) {\n        join(this, pos, depth);\n        return this;\n    }\n    /**\n    Wrap the given [range](https://prosemirror.net/docs/ref/#model.NodeRange) in the given set of wrappers.\n    The wrappers are assumed to be valid in this position, and should\n    probably be computed with [`findWrapping`](https://prosemirror.net/docs/ref/#transform.findWrapping).\n    */\n    wrap(range, wrappers) {\n        wrap(this, range, wrappers);\n        return this;\n    }\n    /**\n    Set the type of all textblocks (partly) between `from` and `to` to\n    the given node type with the given attributes.\n    */\n    setBlockType(from, to = from, type, attrs = null) {\n        setBlockType(this, from, to, type, attrs);\n        return this;\n    }\n    /**\n    Change the type, attributes, and/or marks of the node at `pos`.\n    When `type` isn't given, the existing node type is preserved,\n    */\n    setNodeMarkup(pos, type, attrs = null, marks) {\n        setNodeMarkup(this, pos, type, attrs, marks);\n        return this;\n    }\n    /**\n    Set a single attribute on a given node to a new value.\n    The `pos` addresses the document content. Use `setDocAttribute`\n    to set attributes on the document itself.\n    */\n    setNodeAttribute(pos, attr, value) {\n        this.step(new AttrStep(pos, attr, value));\n        return this;\n    }\n    /**\n    Set a single attribute on the document to a new value.\n    */\n    setDocAttribute(attr, value) {\n        this.step(new DocAttrStep(attr, value));\n        return this;\n    }\n    /**\n    Add a mark to the node at position `pos`.\n    */\n    addNodeMark(pos, mark) {\n        this.step(new AddNodeMarkStep(pos, mark));\n        return this;\n    }\n    /**\n    Remove a mark (or a mark of the given type) from the node at\n    position `pos`.\n    */\n    removeNodeMark(pos, mark) {\n        if (!(mark instanceof Mark)) {\n            let node = this.doc.nodeAt(pos);\n            if (!node)\n                throw new RangeError(\"No node at position \" + pos);\n            mark = mark.isInSet(node.marks);\n            if (!mark)\n                return this;\n        }\n        this.step(new RemoveNodeMarkStep(pos, mark));\n        return this;\n    }\n    /**\n    Split the node at the given position, and optionally, if `depth` is\n    greater than one, any number of nodes above that. By default, the\n    parts split off will inherit the node type of the original node.\n    This can be changed by passing an array of types and attributes to\n    use after the split.\n    */\n    split(pos, depth = 1, typesAfter) {\n        split(this, pos, depth, typesAfter);\n        return this;\n    }\n    /**\n    Add the given mark to the inline content between `from` and `to`.\n    */\n    addMark(from, to, mark) {\n        addMark(this, from, to, mark);\n        return this;\n    }\n    /**\n    Remove marks from inline nodes between `from` and `to`. When\n    `mark` is a single mark, remove precisely that mark. When it is\n    a mark type, remove all marks of that type. When it is null,\n    remove all marks of any type.\n    */\n    removeMark(from, to, mark) {\n        removeMark(this, from, to, mark);\n        return this;\n    }\n    /**\n    Removes all marks and nodes from the content of the node at\n    `pos` that don't match the given new parent node type. Accepts\n    an optional starting [content match](https://prosemirror.net/docs/ref/#model.ContentMatch) as\n    third argument.\n    */\n    clearIncompatible(pos, parentType, match) {\n        clearIncompatible(this, pos, parentType, match);\n        return this;\n    }\n}\n\nexport { AddMarkStep, AddNodeMarkStep, AttrStep, DocAttrStep, MapResult, Mapping, RemoveMarkStep, RemoveNodeMarkStep, ReplaceAroundStep, ReplaceStep, Step, StepMap, StepResult, Transform, TransformError, canJoin, canSplit, dropPoint, findWrapping, insertPoint, joinPoint, liftTarget, replaceStep };\n","import { liftTarget, replaceStep, ReplaceStep, canJoin, joinPoint, canSplit, ReplaceAroundStep, findWrapping } from 'prosemirror-transform';\nimport { Slice, Fragment } from 'prosemirror-model';\nimport { NodeSelection, Selection, TextSelection, AllSelection } from 'prosemirror-state';\n\n/**\nDelete the selection, if there is one.\n*/\nconst deleteSelection = (state, dispatch) => {\n    if (state.selection.empty)\n        return false;\n    if (dispatch)\n        dispatch(state.tr.deleteSelection().scrollIntoView());\n    return true;\n};\nfunction atBlockStart(state, view) {\n    let { $cursor } = state.selection;\n    if (!$cursor || (view ? !view.endOfTextblock(\"backward\", state)\n        : $cursor.parentOffset > 0))\n        return null;\n    return $cursor;\n}\n/**\nIf the selection is empty and at the start of a textblock, try to\nreduce the distance between that block and the one before it—if\nthere's a block directly before it that can be joined, join them.\nIf not, try to move the selected block closer to the next one in\nthe document structure by lifting it out of its parent or moving it\ninto a parent of the previous block. Will use the view for accurate\n(bidi-aware) start-of-textblock detection if given.\n*/\nconst joinBackward = (state, dispatch, view) => {\n    let $cursor = atBlockStart(state, view);\n    if (!$cursor)\n        return false;\n    let $cut = findCutBefore($cursor);\n    // If there is no node before this, try to lift\n    if (!$cut) {\n        let range = $cursor.blockRange(), target = range && liftTarget(range);\n        if (target == null)\n            return false;\n        if (dispatch)\n            dispatch(state.tr.lift(range, target).scrollIntoView());\n        return true;\n    }\n    let before = $cut.nodeBefore;\n    // Apply the joining algorithm\n    if (!before.type.spec.isolating && deleteBarrier(state, $cut, dispatch))\n        return true;\n    // If the node below has no content and the node above is\n    // selectable, delete the node below and select the one above.\n    if ($cursor.parent.content.size == 0 &&\n        (textblockAt(before, \"end\") || NodeSelection.isSelectable(before))) {\n        let delStep = replaceStep(state.doc, $cursor.before(), $cursor.after(), Slice.empty);\n        if (delStep && delStep.slice.size < delStep.to - delStep.from) {\n            if (dispatch) {\n                let tr = state.tr.step(delStep);\n                tr.setSelection(textblockAt(before, \"end\") ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos, -1)), -1)\n                    : NodeSelection.create(tr.doc, $cut.pos - before.nodeSize));\n                dispatch(tr.scrollIntoView());\n            }\n            return true;\n        }\n    }\n    // If the node before is an atom, delete it\n    if (before.isAtom && $cut.depth == $cursor.depth - 1) {\n        if (dispatch)\n            dispatch(state.tr.delete($cut.pos - before.nodeSize, $cut.pos).scrollIntoView());\n        return true;\n    }\n    return false;\n};\n/**\nA more limited form of [`joinBackward`]($commands.joinBackward)\nthat only tries to join the current textblock to the one before\nit, if the cursor is at the start of a textblock.\n*/\nconst joinTextblockBackward = (state, dispatch, view) => {\n    let $cursor = atBlockStart(state, view);\n    if (!$cursor)\n        return false;\n    let $cut = findCutBefore($cursor);\n    return $cut ? joinTextblocksAround(state, $cut, dispatch) : false;\n};\n/**\nA more limited form of [`joinForward`]($commands.joinForward)\nthat only tries to join the current textblock to the one after\nit, if the cursor is at the end of a textblock.\n*/\nconst joinTextblockForward = (state, dispatch, view) => {\n    let $cursor = atBlockEnd(state, view);\n    if (!$cursor)\n        return false;\n    let $cut = findCutAfter($cursor);\n    return $cut ? joinTextblocksAround(state, $cut, dispatch) : false;\n};\nfunction joinTextblocksAround(state, $cut, dispatch) {\n    let before = $cut.nodeBefore, beforeText = before, beforePos = $cut.pos - 1;\n    for (; !beforeText.isTextblock; beforePos--) {\n        if (beforeText.type.spec.isolating)\n            return false;\n        let child = beforeText.lastChild;\n        if (!child)\n            return false;\n        beforeText = child;\n    }\n    let after = $cut.nodeAfter, afterText = after, afterPos = $cut.pos + 1;\n    for (; !afterText.isTextblock; afterPos++) {\n        if (afterText.type.spec.isolating)\n            return false;\n        let child = afterText.firstChild;\n        if (!child)\n            return false;\n        afterText = child;\n    }\n    let step = replaceStep(state.doc, beforePos, afterPos, Slice.empty);\n    if (!step || step.from != beforePos ||\n        step instanceof ReplaceStep && step.slice.size >= afterPos - beforePos)\n        return false;\n    if (dispatch) {\n        let tr = state.tr.step(step);\n        tr.setSelection(TextSelection.create(tr.doc, beforePos));\n        dispatch(tr.scrollIntoView());\n    }\n    return true;\n}\nfunction textblockAt(node, side, only = false) {\n    for (let scan = node; scan; scan = (side == \"start\" ? scan.firstChild : scan.lastChild)) {\n        if (scan.isTextblock)\n            return true;\n        if (only && scan.childCount != 1)\n            return false;\n    }\n    return false;\n}\n/**\nWhen the selection is empty and at the start of a textblock, select\nthe node before that textblock, if possible. This is intended to be\nbound to keys like backspace, after\n[`joinBackward`](https://prosemirror.net/docs/ref/#commands.joinBackward) or other deleting\ncommands, as a fall-back behavior when the schema doesn't allow\ndeletion at the selected point.\n*/\nconst selectNodeBackward = (state, dispatch, view) => {\n    let { $head, empty } = state.selection, $cut = $head;\n    if (!empty)\n        return false;\n    if ($head.parent.isTextblock) {\n        if (view ? !view.endOfTextblock(\"backward\", state) : $head.parentOffset > 0)\n            return false;\n        $cut = findCutBefore($head);\n    }\n    let node = $cut && $cut.nodeBefore;\n    if (!node || !NodeSelection.isSelectable(node))\n        return false;\n    if (dispatch)\n        dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos - node.nodeSize)).scrollIntoView());\n    return true;\n};\nfunction findCutBefore($pos) {\n    if (!$pos.parent.type.spec.isolating)\n        for (let i = $pos.depth - 1; i >= 0; i--) {\n            if ($pos.index(i) > 0)\n                return $pos.doc.resolve($pos.before(i + 1));\n            if ($pos.node(i).type.spec.isolating)\n                break;\n        }\n    return null;\n}\nfunction atBlockEnd(state, view) {\n    let { $cursor } = state.selection;\n    if (!$cursor || (view ? !view.endOfTextblock(\"forward\", state)\n        : $cursor.parentOffset < $cursor.parent.content.size))\n        return null;\n    return $cursor;\n}\n/**\nIf the selection is empty and the cursor is at the end of a\ntextblock, try to reduce or remove the boundary between that block\nand the one after it, either by joining them or by moving the other\nblock closer to this one in the tree structure. Will use the view\nfor accurate start-of-textblock detection if given.\n*/\nconst joinForward = (state, dispatch, view) => {\n    let $cursor = atBlockEnd(state, view);\n    if (!$cursor)\n        return false;\n    let $cut = findCutAfter($cursor);\n    // If there is no node after this, there's nothing to do\n    if (!$cut)\n        return false;\n    let after = $cut.nodeAfter;\n    // Try the joining algorithm\n    if (deleteBarrier(state, $cut, dispatch))\n        return true;\n    // If the node above has no content and the node below is\n    // selectable, delete the node above and select the one below.\n    if ($cursor.parent.content.size == 0 &&\n        (textblockAt(after, \"start\") || NodeSelection.isSelectable(after))) {\n        let delStep = replaceStep(state.doc, $cursor.before(), $cursor.after(), Slice.empty);\n        if (delStep && delStep.slice.size < delStep.to - delStep.from) {\n            if (dispatch) {\n                let tr = state.tr.step(delStep);\n                tr.setSelection(textblockAt(after, \"start\") ? Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos)), 1)\n                    : NodeSelection.create(tr.doc, tr.mapping.map($cut.pos)));\n                dispatch(tr.scrollIntoView());\n            }\n            return true;\n        }\n    }\n    // If the next node is an atom, delete it\n    if (after.isAtom && $cut.depth == $cursor.depth - 1) {\n        if (dispatch)\n            dispatch(state.tr.delete($cut.pos, $cut.pos + after.nodeSize).scrollIntoView());\n        return true;\n    }\n    return false;\n};\n/**\nWhen the selection is empty and at the end of a textblock, select\nthe node coming after that textblock, if possible. This is intended\nto be bound to keys like delete, after\n[`joinForward`](https://prosemirror.net/docs/ref/#commands.joinForward) and similar deleting\ncommands, to provide a fall-back behavior when the schema doesn't\nallow deletion at the selected point.\n*/\nconst selectNodeForward = (state, dispatch, view) => {\n    let { $head, empty } = state.selection, $cut = $head;\n    if (!empty)\n        return false;\n    if ($head.parent.isTextblock) {\n        if (view ? !view.endOfTextblock(\"forward\", state) : $head.parentOffset < $head.parent.content.size)\n            return false;\n        $cut = findCutAfter($head);\n    }\n    let node = $cut && $cut.nodeAfter;\n    if (!node || !NodeSelection.isSelectable(node))\n        return false;\n    if (dispatch)\n        dispatch(state.tr.setSelection(NodeSelection.create(state.doc, $cut.pos)).scrollIntoView());\n    return true;\n};\nfunction findCutAfter($pos) {\n    if (!$pos.parent.type.spec.isolating)\n        for (let i = $pos.depth - 1; i >= 0; i--) {\n            let parent = $pos.node(i);\n            if ($pos.index(i) + 1 < parent.childCount)\n                return $pos.doc.resolve($pos.after(i + 1));\n            if (parent.type.spec.isolating)\n                break;\n        }\n    return null;\n}\n/**\nJoin the selected block or, if there is a text selection, the\nclosest ancestor block of the selection that can be joined, with\nthe sibling above it.\n*/\nconst joinUp = (state, dispatch) => {\n    let sel = state.selection, nodeSel = sel instanceof NodeSelection, point;\n    if (nodeSel) {\n        if (sel.node.isTextblock || !canJoin(state.doc, sel.from))\n            return false;\n        point = sel.from;\n    }\n    else {\n        point = joinPoint(state.doc, sel.from, -1);\n        if (point == null)\n            return false;\n    }\n    if (dispatch) {\n        let tr = state.tr.join(point);\n        if (nodeSel)\n            tr.setSelection(NodeSelection.create(tr.doc, point - state.doc.resolve(point).nodeBefore.nodeSize));\n        dispatch(tr.scrollIntoView());\n    }\n    return true;\n};\n/**\nJoin the selected block, or the closest ancestor of the selection\nthat can be joined, with the sibling after it.\n*/\nconst joinDown = (state, dispatch) => {\n    let sel = state.selection, point;\n    if (sel instanceof NodeSelection) {\n        if (sel.node.isTextblock || !canJoin(state.doc, sel.to))\n            return false;\n        point = sel.to;\n    }\n    else {\n        point = joinPoint(state.doc, sel.to, 1);\n        if (point == null)\n            return false;\n    }\n    if (dispatch)\n        dispatch(state.tr.join(point).scrollIntoView());\n    return true;\n};\n/**\nLift the selected block, or the closest ancestor block of the\nselection that can be lifted, out of its parent node.\n*/\nconst lift = (state, dispatch) => {\n    let { $from, $to } = state.selection;\n    let range = $from.blockRange($to), target = range && liftTarget(range);\n    if (target == null)\n        return false;\n    if (dispatch)\n        dispatch(state.tr.lift(range, target).scrollIntoView());\n    return true;\n};\n/**\nIf the selection is in a node whose type has a truthy\n[`code`](https://prosemirror.net/docs/ref/#model.NodeSpec.code) property in its spec, replace the\nselection with a newline character.\n*/\nconst newlineInCode = (state, dispatch) => {\n    let { $head, $anchor } = state.selection;\n    if (!$head.parent.type.spec.code || !$head.sameParent($anchor))\n        return false;\n    if (dispatch)\n        dispatch(state.tr.insertText(\"\\n\").scrollIntoView());\n    return true;\n};\nfunction defaultBlockAt(match) {\n    for (let i = 0; i < match.edgeCount; i++) {\n        let { type } = match.edge(i);\n        if (type.isTextblock && !type.hasRequiredAttrs())\n            return type;\n    }\n    return null;\n}\n/**\nWhen the selection is in a node with a truthy\n[`code`](https://prosemirror.net/docs/ref/#model.NodeSpec.code) property in its spec, create a\ndefault block after the code block, and move the cursor there.\n*/\nconst exitCode = (state, dispatch) => {\n    let { $head, $anchor } = state.selection;\n    if (!$head.parent.type.spec.code || !$head.sameParent($anchor))\n        return false;\n    let above = $head.node(-1), after = $head.indexAfter(-1), type = defaultBlockAt(above.contentMatchAt(after));\n    if (!type || !above.canReplaceWith(after, after, type))\n        return false;\n    if (dispatch) {\n        let pos = $head.after(), tr = state.tr.replaceWith(pos, pos, type.createAndFill());\n        tr.setSelection(Selection.near(tr.doc.resolve(pos), 1));\n        dispatch(tr.scrollIntoView());\n    }\n    return true;\n};\n/**\nIf a block node is selected, create an empty paragraph before (if\nit is its parent's first child) or after it.\n*/\nconst createParagraphNear = (state, dispatch) => {\n    let sel = state.selection, { $from, $to } = sel;\n    if (sel instanceof AllSelection || $from.parent.inlineContent || $to.parent.inlineContent)\n        return false;\n    let type = defaultBlockAt($to.parent.contentMatchAt($to.indexAfter()));\n    if (!type || !type.isTextblock)\n        return false;\n    if (dispatch) {\n        let side = (!$from.parentOffset && $to.index() < $to.parent.childCount ? $from : $to).pos;\n        let tr = state.tr.insert(side, type.createAndFill());\n        tr.setSelection(TextSelection.create(tr.doc, side + 1));\n        dispatch(tr.scrollIntoView());\n    }\n    return true;\n};\n/**\nIf the cursor is in an empty textblock that can be lifted, lift the\nblock.\n*/\nconst liftEmptyBlock = (state, dispatch) => {\n    let { $cursor } = state.selection;\n    if (!$cursor || $cursor.parent.content.size)\n        return false;\n    if ($cursor.depth > 1 && $cursor.after() != $cursor.end(-1)) {\n        let before = $cursor.before();\n        if (canSplit(state.doc, before)) {\n            if (dispatch)\n                dispatch(state.tr.split(before).scrollIntoView());\n            return true;\n        }\n    }\n    let range = $cursor.blockRange(), target = range && liftTarget(range);\n    if (target == null)\n        return false;\n    if (dispatch)\n        dispatch(state.tr.lift(range, target).scrollIntoView());\n    return true;\n};\n/**\nCreate a variant of [`splitBlock`](https://prosemirror.net/docs/ref/#commands.splitBlock) that uses\na custom function to determine the type of the newly split off block.\n*/\nfunction splitBlockAs(splitNode) {\n    return (state, dispatch) => {\n        let { $from, $to } = state.selection;\n        if (state.selection instanceof NodeSelection && state.selection.node.isBlock) {\n            if (!$from.parentOffset || !canSplit(state.doc, $from.pos))\n                return false;\n            if (dispatch)\n                dispatch(state.tr.split($from.pos).scrollIntoView());\n            return true;\n        }\n        if (!$from.parent.isBlock)\n            return false;\n        if (dispatch) {\n            let atEnd = $to.parentOffset == $to.parent.content.size;\n            let tr = state.tr;\n            if (state.selection instanceof TextSelection || state.selection instanceof AllSelection)\n                tr.deleteSelection();\n            let deflt = $from.depth == 0 ? null : defaultBlockAt($from.node(-1).contentMatchAt($from.indexAfter(-1)));\n            let splitType = splitNode && splitNode($to.parent, atEnd);\n            let types = splitType ? [splitType] : atEnd && deflt ? [{ type: deflt }] : undefined;\n            let can = canSplit(tr.doc, tr.mapping.map($from.pos), 1, types);\n            if (!types && !can && canSplit(tr.doc, tr.mapping.map($from.pos), 1, deflt ? [{ type: deflt }] : undefined)) {\n                if (deflt)\n                    types = [{ type: deflt }];\n                can = true;\n            }\n            if (can) {\n                tr.split(tr.mapping.map($from.pos), 1, types);\n                if (!atEnd && !$from.parentOffset && $from.parent.type != deflt) {\n                    let first = tr.mapping.map($from.before()), $first = tr.doc.resolve(first);\n                    if (deflt && $from.node(-1).canReplaceWith($first.index(), $first.index() + 1, deflt))\n                        tr.setNodeMarkup(tr.mapping.map($from.before()), deflt);\n                }\n            }\n            dispatch(tr.scrollIntoView());\n        }\n        return true;\n    };\n}\n/**\nSplit the parent block of the selection. If the selection is a text\nselection, also delete its content.\n*/\nconst splitBlock = splitBlockAs();\n/**\nActs like [`splitBlock`](https://prosemirror.net/docs/ref/#commands.splitBlock), but without\nresetting the set of active marks at the cursor.\n*/\nconst splitBlockKeepMarks = (state, dispatch) => {\n    return splitBlock(state, dispatch && (tr => {\n        let marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());\n        if (marks)\n            tr.ensureMarks(marks);\n        dispatch(tr);\n    }));\n};\n/**\nMove the selection to the node wrapping the current selection, if\nany. (Will not select the document node.)\n*/\nconst selectParentNode = (state, dispatch) => {\n    let { $from, to } = state.selection, pos;\n    let same = $from.sharedDepth(to);\n    if (same == 0)\n        return false;\n    pos = $from.before(same);\n    if (dispatch)\n        dispatch(state.tr.setSelection(NodeSelection.create(state.doc, pos)));\n    return true;\n};\n/**\nSelect the whole document.\n*/\nconst selectAll = (state, dispatch) => {\n    if (dispatch)\n        dispatch(state.tr.setSelection(new AllSelection(state.doc)));\n    return true;\n};\nfunction joinMaybeClear(state, $pos, dispatch) {\n    let before = $pos.nodeBefore, after = $pos.nodeAfter, index = $pos.index();\n    if (!before || !after || !before.type.compatibleContent(after.type))\n        return false;\n    if (!before.content.size && $pos.parent.canReplace(index - 1, index)) {\n        if (dispatch)\n            dispatch(state.tr.delete($pos.pos - before.nodeSize, $pos.pos).scrollIntoView());\n        return true;\n    }\n    if (!$pos.parent.canReplace(index, index + 1) || !(after.isTextblock || canJoin(state.doc, $pos.pos)))\n        return false;\n    if (dispatch)\n        dispatch(state.tr\n            .clearIncompatible($pos.pos, before.type, before.contentMatchAt(before.childCount))\n            .join($pos.pos)\n            .scrollIntoView());\n    return true;\n}\nfunction deleteBarrier(state, $cut, dispatch) {\n    let before = $cut.nodeBefore, after = $cut.nodeAfter, conn, match;\n    if (before.type.spec.isolating || after.type.spec.isolating)\n        return false;\n    if (joinMaybeClear(state, $cut, dispatch))\n        return true;\n    let canDelAfter = $cut.parent.canReplace($cut.index(), $cut.index() + 1);\n    if (canDelAfter &&\n        (conn = (match = before.contentMatchAt(before.childCount)).findWrapping(after.type)) &&\n        match.matchType(conn[0] || after.type).validEnd) {\n        if (dispatch) {\n            let end = $cut.pos + after.nodeSize, wrap = Fragment.empty;\n            for (let i = conn.length - 1; i >= 0; i--)\n                wrap = Fragment.from(conn[i].create(null, wrap));\n            wrap = Fragment.from(before.copy(wrap));\n            let tr = state.tr.step(new ReplaceAroundStep($cut.pos - 1, end, $cut.pos, end, new Slice(wrap, 1, 0), conn.length, true));\n            let joinAt = end + 2 * conn.length;\n            if (canJoin(tr.doc, joinAt))\n                tr.join(joinAt);\n            dispatch(tr.scrollIntoView());\n        }\n        return true;\n    }\n    let selAfter = Selection.findFrom($cut, 1);\n    let range = selAfter && selAfter.$from.blockRange(selAfter.$to), target = range && liftTarget(range);\n    if (target != null && target >= $cut.depth) {\n        if (dispatch)\n            dispatch(state.tr.lift(range, target).scrollIntoView());\n        return true;\n    }\n    if (canDelAfter && textblockAt(after, \"start\", true) && textblockAt(before, \"end\")) {\n        let at = before, wrap = [];\n        for (;;) {\n            wrap.push(at);\n            if (at.isTextblock)\n                break;\n            at = at.lastChild;\n        }\n        let afterText = after, afterDepth = 1;\n        for (; !afterText.isTextblock; afterText = afterText.firstChild)\n            afterDepth++;\n        if (at.canReplace(at.childCount, at.childCount, afterText.content)) {\n            if (dispatch) {\n                let end = Fragment.empty;\n                for (let i = wrap.length - 1; i >= 0; i--)\n                    end = Fragment.from(wrap[i].copy(end));\n                let tr = state.tr.step(new ReplaceAroundStep($cut.pos - wrap.length, $cut.pos + after.nodeSize, $cut.pos + afterDepth, $cut.pos + after.nodeSize - afterDepth, new Slice(end, wrap.length, 0), 0, true));\n                dispatch(tr.scrollIntoView());\n            }\n            return true;\n        }\n    }\n    return false;\n}\nfunction selectTextblockSide(side) {\n    return function (state, dispatch) {\n        let sel = state.selection, $pos = side < 0 ? sel.$from : sel.$to;\n        let depth = $pos.depth;\n        while ($pos.node(depth).isInline) {\n            if (!depth)\n                return false;\n            depth--;\n        }\n        if (!$pos.node(depth).isTextblock)\n            return false;\n        if (dispatch)\n            dispatch(state.tr.setSelection(TextSelection.create(state.doc, side < 0 ? $pos.start(depth) : $pos.end(depth))));\n        return true;\n    };\n}\n/**\nMoves the cursor to the start of current text block.\n*/\nconst selectTextblockStart = selectTextblockSide(-1);\n/**\nMoves the cursor to the end of current text block.\n*/\nconst selectTextblockEnd = selectTextblockSide(1);\n// Parameterized commands\n/**\nWrap the selection in a node of the given type with the given\nattributes.\n*/\nfunction wrapIn(nodeType, attrs = null) {\n    return function (state, dispatch) {\n        let { $from, $to } = state.selection;\n        let range = $from.blockRange($to), wrapping = range && findWrapping(range, nodeType, attrs);\n        if (!wrapping)\n            return false;\n        if (dispatch)\n            dispatch(state.tr.wrap(range, wrapping).scrollIntoView());\n        return true;\n    };\n}\n/**\nReturns a command that tries to set the selected textblocks to the\ngiven node type with the given attributes.\n*/\nfunction setBlockType(nodeType, attrs = null) {\n    return function (state, dispatch) {\n        let applicable = false;\n        for (let i = 0; i < state.selection.ranges.length && !applicable; i++) {\n            let { $from: { pos: from }, $to: { pos: to } } = state.selection.ranges[i];\n            state.doc.nodesBetween(from, to, (node, pos) => {\n                if (applicable)\n                    return false;\n                if (!node.isTextblock || node.hasMarkup(nodeType, attrs))\n                    return;\n                if (node.type == nodeType) {\n                    applicable = true;\n                }\n                else {\n                    let $pos = state.doc.resolve(pos), index = $pos.index();\n                    applicable = $pos.parent.canReplaceWith(index, index + 1, nodeType);\n                }\n            });\n        }\n        if (!applicable)\n            return false;\n        if (dispatch) {\n            let tr = state.tr;\n            for (let i = 0; i < state.selection.ranges.length; i++) {\n                let { $from: { pos: from }, $to: { pos: to } } = state.selection.ranges[i];\n                tr.setBlockType(from, to, nodeType, attrs);\n            }\n            dispatch(tr.scrollIntoView());\n        }\n        return true;\n    };\n}\nfunction markApplies(doc, ranges, type) {\n    for (let i = 0; i < ranges.length; i++) {\n        let { $from, $to } = ranges[i];\n        let can = $from.depth == 0 ? doc.inlineContent && doc.type.allowsMarkType(type) : false;\n        doc.nodesBetween($from.pos, $to.pos, node => {\n            if (can)\n                return false;\n            can = node.inlineContent && node.type.allowsMarkType(type);\n        });\n        if (can)\n            return true;\n    }\n    return false;\n}\n/**\nCreate a command function that toggles the given mark with the\ngiven attributes. Will return `false` when the current selection\ndoesn't support that mark. This will remove the mark if any marks\nof that type exist in the selection, or add it otherwise. If the\nselection is empty, this applies to the [stored\nmarks](https://prosemirror.net/docs/ref/#state.EditorState.storedMarks) instead of a range of the\ndocument.\n*/\nfunction toggleMark(markType, attrs = null) {\n    return function (state, dispatch) {\n        let { empty, $cursor, ranges } = state.selection;\n        if ((empty && !$cursor) || !markApplies(state.doc, ranges, markType))\n            return false;\n        if (dispatch) {\n            if ($cursor) {\n                if (markType.isInSet(state.storedMarks || $cursor.marks()))\n                    dispatch(state.tr.removeStoredMark(markType));\n                else\n                    dispatch(state.tr.addStoredMark(markType.create(attrs)));\n            }\n            else {\n                let has = false, tr = state.tr;\n                for (let i = 0; !has && i < ranges.length; i++) {\n                    let { $from, $to } = ranges[i];\n                    has = state.doc.rangeHasMark($from.pos, $to.pos, markType);\n                }\n                for (let i = 0; i < ranges.length; i++) {\n                    let { $from, $to } = ranges[i];\n                    if (has) {\n                        tr.removeMark($from.pos, $to.pos, markType);\n                    }\n                    else {\n                        let from = $from.pos, to = $to.pos, start = $from.nodeAfter, end = $to.nodeBefore;\n                        let spaceStart = start && start.isText ? /^\\s*/.exec(start.text)[0].length : 0;\n                        let spaceEnd = end && end.isText ? /\\s*$/.exec(end.text)[0].length : 0;\n                        if (from + spaceStart < to) {\n                            from += spaceStart;\n                            to -= spaceEnd;\n                        }\n                        tr.addMark(from, to, markType.create(attrs));\n                    }\n                }\n                dispatch(tr.scrollIntoView());\n            }\n        }\n        return true;\n    };\n}\nfunction wrapDispatchForJoin(dispatch, isJoinable) {\n    return (tr) => {\n        if (!tr.isGeneric)\n            return dispatch(tr);\n        let ranges = [];\n        for (let i = 0; i < tr.mapping.maps.length; i++) {\n            let map = tr.mapping.maps[i];\n            for (let j = 0; j < ranges.length; j++)\n                ranges[j] = map.map(ranges[j]);\n            map.forEach((_s, _e, from, to) => ranges.push(from, to));\n        }\n        // Figure out which joinable points exist inside those ranges,\n        // by checking all node boundaries in their parent nodes.\n        let joinable = [];\n        for (let i = 0; i < ranges.length; i += 2) {\n            let from = ranges[i], to = ranges[i + 1];\n            let $from = tr.doc.resolve(from), depth = $from.sharedDepth(to), parent = $from.node(depth);\n            for (let index = $from.indexAfter(depth), pos = $from.after(depth + 1); pos <= to; ++index) {\n                let after = parent.maybeChild(index);\n                if (!after)\n                    break;\n                if (index && joinable.indexOf(pos) == -1) {\n                    let before = parent.child(index - 1);\n                    if (before.type == after.type && isJoinable(before, after))\n                        joinable.push(pos);\n                }\n                pos += after.nodeSize;\n            }\n        }\n        // Join the joinable points\n        joinable.sort((a, b) => a - b);\n        for (let i = joinable.length - 1; i >= 0; i--) {\n            if (canJoin(tr.doc, joinable[i]))\n                tr.join(joinable[i]);\n        }\n        dispatch(tr);\n    };\n}\n/**\nWrap a command so that, when it produces a transform that causes\ntwo joinable nodes to end up next to each other, those are joined.\nNodes are considered joinable when they are of the same type and\nwhen the `isJoinable` predicate returns true for them or, if an\narray of strings was passed, if their node type name is in that\narray.\n*/\nfunction autoJoin(command, isJoinable) {\n    let canJoin = Array.isArray(isJoinable) ? (node) => isJoinable.indexOf(node.type.name) > -1\n        : isJoinable;\n    return (state, dispatch, view) => command(state, dispatch && wrapDispatchForJoin(dispatch, canJoin), view);\n}\n/**\nCombine a number of command functions into a single function (which\ncalls them one by one until one returns true).\n*/\nfunction chainCommands(...commands) {\n    return function (state, dispatch, view) {\n        for (let i = 0; i < commands.length; i++)\n            if (commands[i](state, dispatch, view))\n                return true;\n        return false;\n    };\n}\nlet backspace = chainCommands(deleteSelection, joinBackward, selectNodeBackward);\nlet del = chainCommands(deleteSelection, joinForward, selectNodeForward);\n/**\nA basic keymap containing bindings not specific to any schema.\nBinds the following keys (when multiple commands are listed, they\nare chained with [`chainCommands`](https://prosemirror.net/docs/ref/#commands.chainCommands)):\n\n* **Enter** to `newlineInCode`, `createParagraphNear`, `liftEmptyBlock`, `splitBlock`\n* **Mod-Enter** to `exitCode`\n* **Backspace** and **Mod-Backspace** to `deleteSelection`, `joinBackward`, `selectNodeBackward`\n* **Delete** and **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n* **Mod-Delete** to `deleteSelection`, `joinForward`, `selectNodeForward`\n* **Mod-a** to `selectAll`\n*/\nconst pcBaseKeymap = {\n    \"Enter\": chainCommands(newlineInCode, createParagraphNear, liftEmptyBlock, splitBlock),\n    \"Mod-Enter\": exitCode,\n    \"Backspace\": backspace,\n    \"Mod-Backspace\": backspace,\n    \"Shift-Backspace\": backspace,\n    \"Delete\": del,\n    \"Mod-Delete\": del,\n    \"Mod-a\": selectAll\n};\n/**\nA copy of `pcBaseKeymap` that also binds **Ctrl-h** like Backspace,\n**Ctrl-d** like Delete, **Alt-Backspace** like Ctrl-Backspace, and\n**Ctrl-Alt-Backspace**, **Alt-Delete**, and **Alt-d** like\nCtrl-Delete.\n*/\nconst macBaseKeymap = {\n    \"Ctrl-h\": pcBaseKeymap[\"Backspace\"],\n    \"Alt-Backspace\": pcBaseKeymap[\"Mod-Backspace\"],\n    \"Ctrl-d\": pcBaseKeymap[\"Delete\"],\n    \"Ctrl-Alt-Backspace\": pcBaseKeymap[\"Mod-Delete\"],\n    \"Alt-Delete\": pcBaseKeymap[\"Mod-Delete\"],\n    \"Alt-d\": pcBaseKeymap[\"Mod-Delete\"],\n    \"Ctrl-a\": selectTextblockStart,\n    \"Ctrl-e\": selectTextblockEnd\n};\nfor (let key in pcBaseKeymap)\n    macBaseKeymap[key] = pcBaseKeymap[key];\nconst mac = typeof navigator != \"undefined\" ? /Mac|iP(hone|[oa]d)/.test(navigator.platform)\n    // @ts-ignore\n    : typeof os != \"undefined\" && os.platform ? os.platform() == \"darwin\" : false;\n/**\nDepending on the detected platform, this will hold\n[`pcBasekeymap`](https://prosemirror.net/docs/ref/#commands.pcBaseKeymap) or\n[`macBaseKeymap`](https://prosemirror.net/docs/ref/#commands.macBaseKeymap).\n*/\nconst baseKeymap = mac ? macBaseKeymap : pcBaseKeymap;\n\nexport { autoJoin, baseKeymap, chainCommands, createParagraphNear, deleteSelection, exitCode, joinBackward, joinDown, joinForward, joinTextblockBackward, joinTextblockForward, joinUp, lift, liftEmptyBlock, macBaseKeymap, newlineInCode, pcBaseKeymap, selectAll, selectNodeBackward, selectNodeForward, selectParentNode, selectTextblockEnd, selectTextblockStart, setBlockType, splitBlock, splitBlockAs, splitBlockKeepMarks, toggleMark, wrapIn };\n","import { findWrapping, ReplaceAroundStep, canSplit, liftTarget, canJoin } from 'prosemirror-transform';\nimport { NodeRange, Fragment, Slice } from 'prosemirror-model';\nimport { Selection } from 'prosemirror-state';\n\nconst olDOM = [\"ol\", 0], ulDOM = [\"ul\", 0], liDOM = [\"li\", 0];\n/**\nAn ordered list [node spec](https://prosemirror.net/docs/ref/#model.NodeSpec). Has a single\nattribute, `order`, which determines the number at which the list\nstarts counting, and defaults to 1. Represented as an `<ol>`\nelement.\n*/\nconst orderedList = {\n    attrs: { order: { default: 1, validate: \"number\" } },\n    parseDOM: [{ tag: \"ol\", getAttrs(dom) {\n                return { order: dom.hasAttribute(\"start\") ? +dom.getAttribute(\"start\") : 1 };\n            } }],\n    toDOM(node) {\n        return node.attrs.order == 1 ? olDOM : [\"ol\", { start: node.attrs.order }, 0];\n    }\n};\n/**\nA bullet list node spec, represented in the DOM as `<ul>`.\n*/\nconst bulletList = {\n    parseDOM: [{ tag: \"ul\" }],\n    toDOM() { return ulDOM; }\n};\n/**\nA list item (`<li>`) spec.\n*/\nconst listItem = {\n    parseDOM: [{ tag: \"li\" }],\n    toDOM() { return liDOM; },\n    defining: true\n};\nfunction add(obj, props) {\n    let copy = {};\n    for (let prop in obj)\n        copy[prop] = obj[prop];\n    for (let prop in props)\n        copy[prop] = props[prop];\n    return copy;\n}\n/**\nConvenience function for adding list-related node types to a map\nspecifying the nodes for a schema. Adds\n[`orderedList`](https://prosemirror.net/docs/ref/#schema-list.orderedList) as `\"ordered_list\"`,\n[`bulletList`](https://prosemirror.net/docs/ref/#schema-list.bulletList) as `\"bullet_list\"`, and\n[`listItem`](https://prosemirror.net/docs/ref/#schema-list.listItem) as `\"list_item\"`.\n\n`itemContent` determines the content expression for the list items.\nIf you want the commands defined in this module to apply to your\nlist structure, it should have a shape like `\"paragraph block*\"` or\n`\"paragraph (ordered_list | bullet_list)*\"`. `listGroup` can be\ngiven to assign a group name to the list node types, for example\n`\"block\"`.\n*/\nfunction addListNodes(nodes, itemContent, listGroup) {\n    return nodes.append({\n        ordered_list: add(orderedList, { content: \"list_item+\", group: listGroup }),\n        bullet_list: add(bulletList, { content: \"list_item+\", group: listGroup }),\n        list_item: add(listItem, { content: itemContent })\n    });\n}\n/**\nReturns a command function that wraps the selection in a list with\nthe given type an attributes. If `dispatch` is null, only return a\nvalue to indicate whether this is possible, but don't actually\nperform the change.\n*/\nfunction wrapInList(listType, attrs = null) {\n    return function (state, dispatch) {\n        let { $from, $to } = state.selection;\n        let range = $from.blockRange($to), doJoin = false, outerRange = range;\n        if (!range)\n            return false;\n        // This is at the top of an existing list item\n        if (range.depth >= 2 && $from.node(range.depth - 1).type.compatibleContent(listType) && range.startIndex == 0) {\n            // Don't do anything if this is the top of the list\n            if ($from.index(range.depth - 1) == 0)\n                return false;\n            let $insert = state.doc.resolve(range.start - 2);\n            outerRange = new NodeRange($insert, $insert, range.depth);\n            if (range.endIndex < range.parent.childCount)\n                range = new NodeRange($from, state.doc.resolve($to.end(range.depth)), range.depth);\n            doJoin = true;\n        }\n        let wrap = findWrapping(outerRange, listType, attrs, range);\n        if (!wrap)\n            return false;\n        if (dispatch)\n            dispatch(doWrapInList(state.tr, range, wrap, doJoin, listType).scrollIntoView());\n        return true;\n    };\n}\nfunction doWrapInList(tr, range, wrappers, joinBefore, listType) {\n    let content = Fragment.empty;\n    for (let i = wrappers.length - 1; i >= 0; i--)\n        content = Fragment.from(wrappers[i].type.create(wrappers[i].attrs, content));\n    tr.step(new ReplaceAroundStep(range.start - (joinBefore ? 2 : 0), range.end, range.start, range.end, new Slice(content, 0, 0), wrappers.length, true));\n    let found = 0;\n    for (let i = 0; i < wrappers.length; i++)\n        if (wrappers[i].type == listType)\n            found = i + 1;\n    let splitDepth = wrappers.length - found;\n    let splitPos = range.start + wrappers.length - (joinBefore ? 2 : 0), parent = range.parent;\n    for (let i = range.startIndex, e = range.endIndex, first = true; i < e; i++, first = false) {\n        if (!first && canSplit(tr.doc, splitPos, splitDepth)) {\n            tr.split(splitPos, splitDepth);\n            splitPos += 2 * splitDepth;\n        }\n        splitPos += parent.child(i).nodeSize;\n    }\n    return tr;\n}\n/**\nBuild a command that splits a non-empty textblock at the top level\nof a list item by also splitting that list item.\n*/\nfunction splitListItem(itemType, itemAttrs) {\n    return function (state, dispatch) {\n        let { $from, $to, node } = state.selection;\n        if ((node && node.isBlock) || $from.depth < 2 || !$from.sameParent($to))\n            return false;\n        let grandParent = $from.node(-1);\n        if (grandParent.type != itemType)\n            return false;\n        if ($from.parent.content.size == 0 && $from.node(-1).childCount == $from.indexAfter(-1)) {\n            // In an empty block. If this is a nested list, the wrapping\n            // list item should be split. Otherwise, bail out and let next\n            // command handle lifting.\n            if ($from.depth == 3 || $from.node(-3).type != itemType ||\n                $from.index(-2) != $from.node(-2).childCount - 1)\n                return false;\n            if (dispatch) {\n                let wrap = Fragment.empty;\n                let depthBefore = $from.index(-1) ? 1 : $from.index(-2) ? 2 : 3;\n                // Build a fragment containing empty versions of the structure\n                // from the outer list item to the parent node of the cursor\n                for (let d = $from.depth - depthBefore; d >= $from.depth - 3; d--)\n                    wrap = Fragment.from($from.node(d).copy(wrap));\n                let depthAfter = $from.indexAfter(-1) < $from.node(-2).childCount ? 1\n                    : $from.indexAfter(-2) < $from.node(-3).childCount ? 2 : 3;\n                // Add a second list item with an empty default start node\n                wrap = wrap.append(Fragment.from(itemType.createAndFill()));\n                let start = $from.before($from.depth - (depthBefore - 1));\n                let tr = state.tr.replace(start, $from.after(-depthAfter), new Slice(wrap, 4 - depthBefore, 0));\n                let sel = -1;\n                tr.doc.nodesBetween(start, tr.doc.content.size, (node, pos) => {\n                    if (sel > -1)\n                        return false;\n                    if (node.isTextblock && node.content.size == 0)\n                        sel = pos + 1;\n                });\n                if (sel > -1)\n                    tr.setSelection(Selection.near(tr.doc.resolve(sel)));\n                dispatch(tr.scrollIntoView());\n            }\n            return true;\n        }\n        let nextType = $to.pos == $from.end() ? grandParent.contentMatchAt(0).defaultType : null;\n        let tr = state.tr.delete($from.pos, $to.pos);\n        let types = nextType ? [itemAttrs ? { type: itemType, attrs: itemAttrs } : null, { type: nextType }] : undefined;\n        if (!canSplit(tr.doc, $from.pos, 2, types))\n            return false;\n        if (dispatch)\n            dispatch(tr.split($from.pos, 2, types).scrollIntoView());\n        return true;\n    };\n}\n/**\nActs like [`splitListItem`](https://prosemirror.net/docs/ref/#schema-list.splitListItem), but\nwithout resetting the set of active marks at the cursor.\n*/\nfunction splitListItemKeepMarks(itemType, itemAttrs) {\n    let split = splitListItem(itemType, itemAttrs);\n    return (state, dispatch) => {\n        return split(state, dispatch && (tr => {\n            let marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());\n            if (marks)\n                tr.ensureMarks(marks);\n            dispatch(tr);\n        }));\n    };\n}\n/**\nCreate a command to lift the list item around the selection up into\na wrapping list.\n*/\nfunction liftListItem(itemType) {\n    return function (state, dispatch) {\n        let { $from, $to } = state.selection;\n        let range = $from.blockRange($to, node => node.childCount > 0 && node.firstChild.type == itemType);\n        if (!range)\n            return false;\n        if (!dispatch)\n            return true;\n        if ($from.node(range.depth - 1).type == itemType) // Inside a parent list\n            return liftToOuterList(state, dispatch, itemType, range);\n        else // Outer list node\n            return liftOutOfList(state, dispatch, range);\n    };\n}\nfunction liftToOuterList(state, dispatch, itemType, range) {\n    let tr = state.tr, end = range.end, endOfList = range.$to.end(range.depth);\n    if (end < endOfList) {\n        // There are siblings after the lifted items, which must become\n        // children of the last item\n        tr.step(new ReplaceAroundStep(end - 1, endOfList, end, endOfList, new Slice(Fragment.from(itemType.create(null, range.parent.copy())), 1, 0), 1, true));\n        range = new NodeRange(tr.doc.resolve(range.$from.pos), tr.doc.resolve(endOfList), range.depth);\n    }\n    const target = liftTarget(range);\n    if (target == null)\n        return false;\n    tr.lift(range, target);\n    let after = tr.mapping.map(end, -1) - 1;\n    if (canJoin(tr.doc, after))\n        tr.join(after);\n    dispatch(tr.scrollIntoView());\n    return true;\n}\nfunction liftOutOfList(state, dispatch, range) {\n    let tr = state.tr, list = range.parent;\n    // Merge the list items into a single big item\n    for (let pos = range.end, i = range.endIndex - 1, e = range.startIndex; i > e; i--) {\n        pos -= list.child(i).nodeSize;\n        tr.delete(pos - 1, pos + 1);\n    }\n    let $start = tr.doc.resolve(range.start), item = $start.nodeAfter;\n    if (tr.mapping.map(range.end) != range.start + $start.nodeAfter.nodeSize)\n        return false;\n    let atStart = range.startIndex == 0, atEnd = range.endIndex == list.childCount;\n    let parent = $start.node(-1), indexBefore = $start.index(-1);\n    if (!parent.canReplace(indexBefore + (atStart ? 0 : 1), indexBefore + 1, item.content.append(atEnd ? Fragment.empty : Fragment.from(list))))\n        return false;\n    let start = $start.pos, end = start + item.nodeSize;\n    // Strip off the surrounding list. At the sides where we're not at\n    // the end of the list, the existing list is closed. At sides where\n    // this is the end, it is overwritten to its end.\n    tr.step(new ReplaceAroundStep(start - (atStart ? 1 : 0), end + (atEnd ? 1 : 0), start + 1, end - 1, new Slice((atStart ? Fragment.empty : Fragment.from(list.copy(Fragment.empty)))\n        .append(atEnd ? Fragment.empty : Fragment.from(list.copy(Fragment.empty))), atStart ? 0 : 1, atEnd ? 0 : 1), atStart ? 0 : 1));\n    dispatch(tr.scrollIntoView());\n    return true;\n}\n/**\nCreate a command to sink the list item around the selection down\ninto an inner list.\n*/\nfunction sinkListItem(itemType) {\n    return function (state, dispatch) {\n        let { $from, $to } = state.selection;\n        let range = $from.blockRange($to, node => node.childCount > 0 && node.firstChild.type == itemType);\n        if (!range)\n            return false;\n        let startIndex = range.startIndex;\n        if (startIndex == 0)\n            return false;\n        let parent = range.parent, nodeBefore = parent.child(startIndex - 1);\n        if (nodeBefore.type != itemType)\n            return false;\n        if (dispatch) {\n            let nestedBefore = nodeBefore.lastChild && nodeBefore.lastChild.type == parent.type;\n            let inner = Fragment.from(nestedBefore ? itemType.create() : null);\n            let slice = new Slice(Fragment.from(itemType.create(null, Fragment.from(parent.type.create(null, inner)))), nestedBefore ? 3 : 1, 0);\n            let before = range.start, after = range.end;\n            dispatch(state.tr.step(new ReplaceAroundStep(before - (nestedBefore ? 3 : 1), after, before, after, slice, 1, true))\n                .scrollIntoView());\n        }\n        return true;\n    };\n}\n\nexport { addListNodes, bulletList, liftListItem, listItem, orderedList, sinkListItem, splitListItem, splitListItemKeepMarks, wrapInList };\n","import { Plugin, PluginKey, TextSelection, Selection, NodeSelection, EditorState } from '@tiptap/pm/state';\nimport { EditorView } from '@tiptap/pm/view';\nimport { keymap } from '@tiptap/pm/keymap';\nimport { Schema, Fragment, DOMParser, DOMSerializer, Node as Node$1, Slice } from '@tiptap/pm/model';\nimport { liftTarget, ReplaceStep, ReplaceAroundStep, joinPoint, Transform, canSplit, canJoin, findWrapping } from '@tiptap/pm/transform';\nimport { createParagraphNear as createParagraphNear$1, deleteSelection as deleteSelection$1, exitCode as exitCode$1, joinUp as joinUp$1, joinDown as joinDown$1, joinBackward as joinBackward$1, joinForward as joinForward$1, joinTextblockBackward as joinTextblockBackward$1, joinTextblockForward as joinTextblockForward$1, lift as lift$1, liftEmptyBlock as liftEmptyBlock$1, newlineInCode as newlineInCode$1, selectNodeBackward as selectNodeBackward$1, selectNodeForward as selectNodeForward$1, selectParentNode as selectParentNode$1, selectTextblockEnd as selectTextblockEnd$1, selectTextblockStart as selectTextblockStart$1, setBlockType, wrapIn as wrapIn$1 } from '@tiptap/pm/commands';\nimport { liftListItem as liftListItem$1, sinkListItem as sinkListItem$1, wrapInList as wrapInList$1 } from '@tiptap/pm/schema-list';\n\n/**\n * Takes a Transaction & Editor State and turns it into a chainable state object\n * @param config The transaction and state to create the chainable state from\n * @returns A chainable Editor state object\n */\nfunction createChainableState(config) {\n    const { state, transaction } = config;\n    let { selection } = transaction;\n    let { doc } = transaction;\n    let { storedMarks } = transaction;\n    return {\n        ...state,\n        apply: state.apply.bind(state),\n        applyTransaction: state.applyTransaction.bind(state),\n        plugins: state.plugins,\n        schema: state.schema,\n        reconfigure: state.reconfigure.bind(state),\n        toJSON: state.toJSON.bind(state),\n        get storedMarks() {\n            return storedMarks;\n        },\n        get selection() {\n            return selection;\n        },\n        get doc() {\n            return doc;\n        },\n        get tr() {\n            selection = transaction.selection;\n            doc = transaction.doc;\n            storedMarks = transaction.storedMarks;\n            return transaction;\n        },\n    };\n}\n\nclass CommandManager {\n    constructor(props) {\n        this.editor = props.editor;\n        this.rawCommands = this.editor.extensionManager.commands;\n        this.customState = props.state;\n    }\n    get hasCustomState() {\n        return !!this.customState;\n    }\n    get state() {\n        return this.customState || this.editor.state;\n    }\n    get commands() {\n        const { rawCommands, editor, state } = this;\n        const { view } = editor;\n        const { tr } = state;\n        const props = this.buildProps(tr);\n        return Object.fromEntries(Object.entries(rawCommands).map(([name, command]) => {\n            const method = (...args) => {\n                const callback = command(...args)(props);\n                if (!tr.getMeta('preventDispatch') && !this.hasCustomState) {\n                    view.dispatch(tr);\n                }\n                return callback;\n            };\n            return [name, method];\n        }));\n    }\n    get chain() {\n        return () => this.createChain();\n    }\n    get can() {\n        return () => this.createCan();\n    }\n    createChain(startTr, shouldDispatch = true) {\n        const { rawCommands, editor, state } = this;\n        const { view } = editor;\n        const callbacks = [];\n        const hasStartTransaction = !!startTr;\n        const tr = startTr || state.tr;\n        const run = () => {\n            if (!hasStartTransaction\n                && shouldDispatch\n                && !tr.getMeta('preventDispatch')\n                && !this.hasCustomState) {\n                view.dispatch(tr);\n            }\n            return callbacks.every(callback => callback === true);\n        };\n        const chain = {\n            ...Object.fromEntries(Object.entries(rawCommands).map(([name, command]) => {\n                const chainedCommand = (...args) => {\n                    const props = this.buildProps(tr, shouldDispatch);\n                    const callback = command(...args)(props);\n                    callbacks.push(callback);\n                    return chain;\n                };\n                return [name, chainedCommand];\n            })),\n            run,\n        };\n        return chain;\n    }\n    createCan(startTr) {\n        const { rawCommands, state } = this;\n        const dispatch = false;\n        const tr = startTr || state.tr;\n        const props = this.buildProps(tr, dispatch);\n        const formattedCommands = Object.fromEntries(Object.entries(rawCommands).map(([name, command]) => {\n            return [name, (...args) => command(...args)({ ...props, dispatch: undefined })];\n        }));\n        return {\n            ...formattedCommands,\n            chain: () => this.createChain(tr, dispatch),\n        };\n    }\n    buildProps(tr, shouldDispatch = true) {\n        const { rawCommands, editor, state } = this;\n        const { view } = editor;\n        const props = {\n            tr,\n            editor,\n            view,\n            state: createChainableState({\n                state,\n                transaction: tr,\n            }),\n            dispatch: shouldDispatch ? () => undefined : undefined,\n            chain: () => this.createChain(tr, shouldDispatch),\n            can: () => this.createCan(tr),\n            get commands() {\n                return Object.fromEntries(Object.entries(rawCommands).map(([name, command]) => {\n                    return [name, (...args) => command(...args)(props)];\n                }));\n            },\n        };\n        return props;\n    }\n}\n\nclass EventEmitter {\n    constructor() {\n        this.callbacks = {};\n    }\n    on(event, fn) {\n        if (!this.callbacks[event]) {\n            this.callbacks[event] = [];\n        }\n        this.callbacks[event].push(fn);\n        return this;\n    }\n    emit(event, ...args) {\n        const callbacks = this.callbacks[event];\n        if (callbacks) {\n            callbacks.forEach(callback => callback.apply(this, args));\n        }\n        return this;\n    }\n    off(event, fn) {\n        const callbacks = this.callbacks[event];\n        if (callbacks) {\n            if (fn) {\n                this.callbacks[event] = callbacks.filter(callback => callback !== fn);\n            }\n            else {\n                delete this.callbacks[event];\n            }\n        }\n        return this;\n    }\n    removeAllListeners() {\n        this.callbacks = {};\n    }\n}\n\n/**\n * Returns a field from an extension\n * @param extension The Tiptap extension\n * @param field The field, for example `renderHTML` or `priority`\n * @param context The context object that should be passed as `this` into the function\n * @returns The field value\n */\nfunction getExtensionField(extension, field, context) {\n    if (extension.config[field] === undefined && extension.parent) {\n        return getExtensionField(extension.parent, field, context);\n    }\n    if (typeof extension.config[field] === 'function') {\n        const value = extension.config[field].bind({\n            ...context,\n            parent: extension.parent\n                ? getExtensionField(extension.parent, field, context)\n                : null,\n        });\n        return value;\n    }\n    return extension.config[field];\n}\n\nfunction splitExtensions(extensions) {\n    const baseExtensions = extensions.filter(extension => extension.type === 'extension');\n    const nodeExtensions = extensions.filter(extension => extension.type === 'node');\n    const markExtensions = extensions.filter(extension => extension.type === 'mark');\n    return {\n        baseExtensions,\n        nodeExtensions,\n        markExtensions,\n    };\n}\n\n/**\n * Get a list of all extension attributes defined in `addAttribute` and `addGlobalAttribute`.\n * @param extensions List of extensions\n */\nfunction getAttributesFromExtensions(extensions) {\n    const extensionAttributes = [];\n    const { nodeExtensions, markExtensions } = splitExtensions(extensions);\n    const nodeAndMarkExtensions = [...nodeExtensions, ...markExtensions];\n    const defaultAttribute = {\n        default: null,\n        rendered: true,\n        renderHTML: null,\n        parseHTML: null,\n        keepOnSplit: true,\n        isRequired: false,\n    };\n    extensions.forEach(extension => {\n        const context = {\n            name: extension.name,\n            options: extension.options,\n            storage: extension.storage,\n            extensions: nodeAndMarkExtensions,\n        };\n        const addGlobalAttributes = getExtensionField(extension, 'addGlobalAttributes', context);\n        if (!addGlobalAttributes) {\n            return;\n        }\n        const globalAttributes = addGlobalAttributes();\n        globalAttributes.forEach(globalAttribute => {\n            globalAttribute.types.forEach(type => {\n                Object\n                    .entries(globalAttribute.attributes)\n                    .forEach(([name, attribute]) => {\n                    extensionAttributes.push({\n                        type,\n                        name,\n                        attribute: {\n                            ...defaultAttribute,\n                            ...attribute,\n                        },\n                    });\n                });\n            });\n        });\n    });\n    nodeAndMarkExtensions.forEach(extension => {\n        const context = {\n            name: extension.name,\n            options: extension.options,\n            storage: extension.storage,\n        };\n        const addAttributes = getExtensionField(extension, 'addAttributes', context);\n        if (!addAttributes) {\n            return;\n        }\n        // TODO: remove `as Attributes`\n        const attributes = addAttributes();\n        Object\n            .entries(attributes)\n            .forEach(([name, attribute]) => {\n            const mergedAttr = {\n                ...defaultAttribute,\n                ...attribute,\n            };\n            if (typeof (mergedAttr === null || mergedAttr === void 0 ? void 0 : mergedAttr.default) === 'function') {\n                mergedAttr.default = mergedAttr.default();\n            }\n            if ((mergedAttr === null || mergedAttr === void 0 ? void 0 : mergedAttr.isRequired) && (mergedAttr === null || mergedAttr === void 0 ? void 0 : mergedAttr.default) === undefined) {\n                delete mergedAttr.default;\n            }\n            extensionAttributes.push({\n                type: extension.name,\n                name,\n                attribute: mergedAttr,\n            });\n        });\n    });\n    return extensionAttributes;\n}\n\nfunction getNodeType(nameOrType, schema) {\n    if (typeof nameOrType === 'string') {\n        if (!schema.nodes[nameOrType]) {\n            throw Error(`There is no node type named '${nameOrType}'. Maybe you forgot to add the extension?`);\n        }\n        return schema.nodes[nameOrType];\n    }\n    return nameOrType;\n}\n\nfunction mergeAttributes(...objects) {\n    return objects\n        .filter(item => !!item)\n        .reduce((items, item) => {\n        const mergedAttributes = { ...items };\n        Object.entries(item).forEach(([key, value]) => {\n            const exists = mergedAttributes[key];\n            if (!exists) {\n                mergedAttributes[key] = value;\n                return;\n            }\n            if (key === 'class') {\n                const valueClasses = value ? value.split(' ') : [];\n                const existingClasses = mergedAttributes[key] ? mergedAttributes[key].split(' ') : [];\n                const insertClasses = valueClasses.filter(valueClass => !existingClasses.includes(valueClass));\n                mergedAttributes[key] = [...existingClasses, ...insertClasses].join(' ');\n            }\n            else if (key === 'style') {\n                mergedAttributes[key] = [mergedAttributes[key], value].join('; ');\n            }\n            else {\n                mergedAttributes[key] = value;\n            }\n        });\n        return mergedAttributes;\n    }, {});\n}\n\nfunction getRenderedAttributes(nodeOrMark, extensionAttributes) {\n    return extensionAttributes\n        .filter(item => item.attribute.rendered)\n        .map(item => {\n        if (!item.attribute.renderHTML) {\n            return {\n                [item.name]: nodeOrMark.attrs[item.name],\n            };\n        }\n        return item.attribute.renderHTML(nodeOrMark.attrs) || {};\n    })\n        .reduce((attributes, attribute) => mergeAttributes(attributes, attribute), {});\n}\n\nfunction isFunction(value) {\n    return typeof value === 'function';\n}\n\n/**\n * Optionally calls `value` as a function.\n * Otherwise it is returned directly.\n * @param value Function or any value.\n * @param context Optional context to bind to function.\n * @param props Optional props to pass to function.\n */\nfunction callOrReturn(value, context = undefined, ...props) {\n    if (isFunction(value)) {\n        if (context) {\n            return value.bind(context)(...props);\n        }\n        return value(...props);\n    }\n    return value;\n}\n\nfunction isEmptyObject(value = {}) {\n    return Object.keys(value).length === 0 && value.constructor === Object;\n}\n\nfunction fromString(value) {\n    if (typeof value !== 'string') {\n        return value;\n    }\n    if (value.match(/^[+-]?(?:\\d*\\.)?\\d+$/)) {\n        return Number(value);\n    }\n    if (value === 'true') {\n        return true;\n    }\n    if (value === 'false') {\n        return false;\n    }\n    return value;\n}\n\n/**\n * This function merges extension attributes into parserule attributes (`attrs` or `getAttrs`).\n * Cancels when `getAttrs` returned `false`.\n * @param parseRule ProseMirror ParseRule\n * @param extensionAttributes List of attributes to inject\n */\nfunction injectExtensionAttributesToParseRule(parseRule, extensionAttributes) {\n    if ('style' in parseRule) {\n        return parseRule;\n    }\n    return {\n        ...parseRule,\n        getAttrs: (node) => {\n            const oldAttributes = parseRule.getAttrs ? parseRule.getAttrs(node) : parseRule.attrs;\n            if (oldAttributes === false) {\n                return false;\n            }\n            const newAttributes = extensionAttributes.reduce((items, item) => {\n                const value = item.attribute.parseHTML\n                    ? item.attribute.parseHTML(node)\n                    : fromString((node).getAttribute(item.name));\n                if (value === null || value === undefined) {\n                    return items;\n                }\n                return {\n                    ...items,\n                    [item.name]: value,\n                };\n            }, {});\n            return { ...oldAttributes, ...newAttributes };\n        },\n    };\n}\n\nfunction cleanUpSchemaItem(data) {\n    return Object.fromEntries(\n    // @ts-ignore\n    Object.entries(data).filter(([key, value]) => {\n        if (key === 'attrs' && isEmptyObject(value)) {\n            return false;\n        }\n        return value !== null && value !== undefined;\n    }));\n}\n/**\n * Creates a new Prosemirror schema based on the given extensions.\n * @param extensions An array of Tiptap extensions\n * @param editor The editor instance\n * @returns A Prosemirror schema\n */\nfunction getSchemaByResolvedExtensions(extensions, editor) {\n    var _a;\n    const allAttributes = getAttributesFromExtensions(extensions);\n    const { nodeExtensions, markExtensions } = splitExtensions(extensions);\n    const topNode = (_a = nodeExtensions.find(extension => getExtensionField(extension, 'topNode'))) === null || _a === void 0 ? void 0 : _a.name;\n    const nodes = Object.fromEntries(nodeExtensions.map(extension => {\n        const extensionAttributes = allAttributes.filter(attribute => attribute.type === extension.name);\n        const context = {\n            name: extension.name,\n            options: extension.options,\n            storage: extension.storage,\n            editor,\n        };\n        const extraNodeFields = extensions.reduce((fields, e) => {\n            const extendNodeSchema = getExtensionField(e, 'extendNodeSchema', context);\n            return {\n                ...fields,\n                ...(extendNodeSchema ? extendNodeSchema(extension) : {}),\n            };\n        }, {});\n        const schema = cleanUpSchemaItem({\n            ...extraNodeFields,\n            content: callOrReturn(getExtensionField(extension, 'content', context)),\n            marks: callOrReturn(getExtensionField(extension, 'marks', context)),\n            group: callOrReturn(getExtensionField(extension, 'group', context)),\n            inline: callOrReturn(getExtensionField(extension, 'inline', context)),\n            atom: callOrReturn(getExtensionField(extension, 'atom', context)),\n            selectable: callOrReturn(getExtensionField(extension, 'selectable', context)),\n            draggable: callOrReturn(getExtensionField(extension, 'draggable', context)),\n            code: callOrReturn(getExtensionField(extension, 'code', context)),\n            whitespace: callOrReturn(getExtensionField(extension, 'whitespace', context)),\n            defining: callOrReturn(getExtensionField(extension, 'defining', context)),\n            isolating: callOrReturn(getExtensionField(extension, 'isolating', context)),\n            attrs: Object.fromEntries(extensionAttributes.map(extensionAttribute => {\n                var _a;\n                return [extensionAttribute.name, { default: (_a = extensionAttribute === null || extensionAttribute === void 0 ? void 0 : extensionAttribute.attribute) === null || _a === void 0 ? void 0 : _a.default }];\n            })),\n        });\n        const parseHTML = callOrReturn(getExtensionField(extension, 'parseHTML', context));\n        if (parseHTML) {\n            schema.parseDOM = parseHTML.map(parseRule => injectExtensionAttributesToParseRule(parseRule, extensionAttributes));\n        }\n        const renderHTML = getExtensionField(extension, 'renderHTML', context);\n        if (renderHTML) {\n            schema.toDOM = node => renderHTML({\n                node,\n                HTMLAttributes: getRenderedAttributes(node, extensionAttributes),\n            });\n        }\n        const renderText = getExtensionField(extension, 'renderText', context);\n        if (renderText) {\n            schema.toText = renderText;\n        }\n        return [extension.name, schema];\n    }));\n    const marks = Object.fromEntries(markExtensions.map(extension => {\n        const extensionAttributes = allAttributes.filter(attribute => attribute.type === extension.name);\n        const context = {\n            name: extension.name,\n            options: extension.options,\n            storage: extension.storage,\n            editor,\n        };\n        const extraMarkFields = extensions.reduce((fields, e) => {\n            const extendMarkSchema = getExtensionField(e, 'extendMarkSchema', context);\n            return {\n                ...fields,\n                ...(extendMarkSchema ? extendMarkSchema(extension) : {}),\n            };\n        }, {});\n        const schema = cleanUpSchemaItem({\n            ...extraMarkFields,\n            inclusive: callOrReturn(getExtensionField(extension, 'inclusive', context)),\n            excludes: callOrReturn(getExtensionField(extension, 'excludes', context)),\n            group: callOrReturn(getExtensionField(extension, 'group', context)),\n            spanning: callOrReturn(getExtensionField(extension, 'spanning', context)),\n            code: callOrReturn(getExtensionField(extension, 'code', context)),\n            attrs: Object.fromEntries(extensionAttributes.map(extensionAttribute => {\n                var _a;\n                return [extensionAttribute.name, { default: (_a = extensionAttribute === null || extensionAttribute === void 0 ? void 0 : extensionAttribute.attribute) === null || _a === void 0 ? void 0 : _a.default }];\n            })),\n        });\n        const parseHTML = callOrReturn(getExtensionField(extension, 'parseHTML', context));\n        if (parseHTML) {\n            schema.parseDOM = parseHTML.map(parseRule => injectExtensionAttributesToParseRule(parseRule, extensionAttributes));\n        }\n        const renderHTML = getExtensionField(extension, 'renderHTML', context);\n        if (renderHTML) {\n            schema.toDOM = mark => renderHTML({\n                mark,\n                HTMLAttributes: getRenderedAttributes(mark, extensionAttributes),\n            });\n        }\n        return [extension.name, schema];\n    }));\n    return new Schema({\n        topNode,\n        nodes,\n        marks,\n    });\n}\n\n/**\n * Tries to get a node or mark type by its name.\n * @param name The name of the node or mark type\n * @param schema The Prosemiror schema to search in\n * @returns The node or mark type, or null if it doesn't exist\n */\nfunction getSchemaTypeByName(name, schema) {\n    return schema.nodes[name] || schema.marks[name] || null;\n}\n\nfunction isExtensionRulesEnabled(extension, enabled) {\n    if (Array.isArray(enabled)) {\n        return enabled.some(enabledExtension => {\n            const name = typeof enabledExtension === 'string'\n                ? enabledExtension\n                : enabledExtension.name;\n            return name === extension.name;\n        });\n    }\n    return enabled;\n}\n\n/**\n * Returns the text content of a resolved prosemirror position\n * @param $from The resolved position to get the text content from\n * @param maxMatch The maximum number of characters to match\n * @returns The text content\n */\nconst getTextContentFromNodes = ($from, maxMatch = 500) => {\n    let textBefore = '';\n    const sliceEndPos = $from.parentOffset;\n    $from.parent.nodesBetween(Math.max(0, sliceEndPos - maxMatch), sliceEndPos, (node, pos, parent, index) => {\n        var _a, _b;\n        const chunk = ((_b = (_a = node.type.spec).toText) === null || _b === void 0 ? void 0 : _b.call(_a, {\n            node,\n            pos,\n            parent,\n            index,\n        }))\n            || node.textContent\n            || '%leaf%';\n        textBefore += chunk.slice(0, Math.max(0, sliceEndPos - pos));\n    });\n    return textBefore;\n};\n\nfunction isRegExp(value) {\n    return Object.prototype.toString.call(value) === '[object RegExp]';\n}\n\nclass InputRule {\n    constructor(config) {\n        this.find = config.find;\n        this.handler = config.handler;\n    }\n}\nconst inputRuleMatcherHandler = (text, find) => {\n    if (isRegExp(find)) {\n        return find.exec(text);\n    }\n    const inputRuleMatch = find(text);\n    if (!inputRuleMatch) {\n        return null;\n    }\n    const result = [inputRuleMatch.text];\n    result.index = inputRuleMatch.index;\n    result.input = text;\n    result.data = inputRuleMatch.data;\n    if (inputRuleMatch.replaceWith) {\n        if (!inputRuleMatch.text.includes(inputRuleMatch.replaceWith)) {\n            console.warn('[tiptap warn]: \"inputRuleMatch.replaceWith\" must be part of \"inputRuleMatch.text\".');\n        }\n        result.push(inputRuleMatch.replaceWith);\n    }\n    return result;\n};\nfunction run$1(config) {\n    var _a;\n    const { editor, from, to, text, rules, plugin, } = config;\n    const { view } = editor;\n    if (view.composing) {\n        return false;\n    }\n    const $from = view.state.doc.resolve(from);\n    if (\n    // check for code node\n    $from.parent.type.spec.code\n        // check for code mark\n        || !!((_a = ($from.nodeBefore || $from.nodeAfter)) === null || _a === void 0 ? void 0 : _a.marks.find(mark => mark.type.spec.code))) {\n        return false;\n    }\n    let matched = false;\n    const textBefore = getTextContentFromNodes($from) + text;\n    rules.forEach(rule => {\n        if (matched) {\n            return;\n        }\n        const match = inputRuleMatcherHandler(textBefore, rule.find);\n        if (!match) {\n            return;\n        }\n        const tr = view.state.tr;\n        const state = createChainableState({\n            state: view.state,\n            transaction: tr,\n        });\n        const range = {\n            from: from - (match[0].length - text.length),\n            to,\n        };\n        const { commands, chain, can } = new CommandManager({\n            editor,\n            state,\n        });\n        const handler = rule.handler({\n            state,\n            range,\n            match,\n            commands,\n            chain,\n            can,\n        });\n        // stop if there are no changes\n        if (handler === null || !tr.steps.length) {\n            return;\n        }\n        // store transform as meta data\n        // so we can undo input rules within the `undoInputRules` command\n        tr.setMeta(plugin, {\n            transform: tr,\n            from,\n            to,\n            text,\n        });\n        view.dispatch(tr);\n        matched = true;\n    });\n    return matched;\n}\n/**\n * Create an input rules plugin. When enabled, it will cause text\n * input that matches any of the given rules to trigger the rule’s\n * action.\n */\nfunction inputRulesPlugin(props) {\n    const { editor, rules } = props;\n    const plugin = new Plugin({\n        state: {\n            init() {\n                return null;\n            },\n            apply(tr, prev) {\n                const stored = tr.getMeta(plugin);\n                if (stored) {\n                    return stored;\n                }\n                // if InputRule is triggered by insertContent()\n                const simulatedInputMeta = tr.getMeta('applyInputRules');\n                const isSimulatedInput = !!simulatedInputMeta;\n                if (isSimulatedInput) {\n                    setTimeout(() => {\n                        const { from, text } = simulatedInputMeta;\n                        const to = from + text.length;\n                        run$1({\n                            editor,\n                            from,\n                            to,\n                            text,\n                            rules,\n                            plugin,\n                        });\n                    });\n                }\n                return tr.selectionSet || tr.docChanged ? null : prev;\n            },\n        },\n        props: {\n            handleTextInput(view, from, to, text) {\n                return run$1({\n                    editor,\n                    from,\n                    to,\n                    text,\n                    rules,\n                    plugin,\n                });\n            },\n            handleDOMEvents: {\n                compositionend: view => {\n                    setTimeout(() => {\n                        const { $cursor } = view.state.selection;\n                        if ($cursor) {\n                            run$1({\n                                editor,\n                                from: $cursor.pos,\n                                to: $cursor.pos,\n                                text: '',\n                                rules,\n                                plugin,\n                            });\n                        }\n                    });\n                    return false;\n                },\n            },\n            // add support for input rules to trigger on enter\n            // this is useful for example for code blocks\n            handleKeyDown(view, event) {\n                if (event.key !== 'Enter') {\n                    return false;\n                }\n                const { $cursor } = view.state.selection;\n                if ($cursor) {\n                    return run$1({\n                        editor,\n                        from: $cursor.pos,\n                        to: $cursor.pos,\n                        text: '\\n',\n                        rules,\n                        plugin,\n                    });\n                }\n                return false;\n            },\n        },\n        // @ts-ignore\n        isInputRules: true,\n    });\n    return plugin;\n}\n\nfunction isNumber(value) {\n    return typeof value === 'number';\n}\n\n/**\n * Paste rules are used to react to pasted content.\n * @see https://tiptap.dev/guide/custom-extensions/#paste-rules\n */\nclass PasteRule {\n    constructor(config) {\n        this.find = config.find;\n        this.handler = config.handler;\n    }\n}\nconst pasteRuleMatcherHandler = (text, find, event) => {\n    if (isRegExp(find)) {\n        return [...text.matchAll(find)];\n    }\n    const matches = find(text, event);\n    if (!matches) {\n        return [];\n    }\n    return matches.map(pasteRuleMatch => {\n        const result = [pasteRuleMatch.text];\n        result.index = pasteRuleMatch.index;\n        result.input = text;\n        result.data = pasteRuleMatch.data;\n        if (pasteRuleMatch.replaceWith) {\n            if (!pasteRuleMatch.text.includes(pasteRuleMatch.replaceWith)) {\n                console.warn('[tiptap warn]: \"pasteRuleMatch.replaceWith\" must be part of \"pasteRuleMatch.text\".');\n            }\n            result.push(pasteRuleMatch.replaceWith);\n        }\n        return result;\n    });\n};\nfunction run(config) {\n    const { editor, state, from, to, rule, pasteEvent, dropEvent, } = config;\n    const { commands, chain, can } = new CommandManager({\n        editor,\n        state,\n    });\n    const handlers = [];\n    state.doc.nodesBetween(from, to, (node, pos) => {\n        if (!node.isTextblock || node.type.spec.code) {\n            return;\n        }\n        const resolvedFrom = Math.max(from, pos);\n        const resolvedTo = Math.min(to, pos + node.content.size);\n        const textToMatch = node.textBetween(resolvedFrom - pos, resolvedTo - pos, undefined, '\\ufffc');\n        const matches = pasteRuleMatcherHandler(textToMatch, rule.find, pasteEvent);\n        matches.forEach(match => {\n            if (match.index === undefined) {\n                return;\n            }\n            const start = resolvedFrom + match.index + 1;\n            const end = start + match[0].length;\n            const range = {\n                from: state.tr.mapping.map(start),\n                to: state.tr.mapping.map(end),\n            };\n            const handler = rule.handler({\n                state,\n                range,\n                match,\n                commands,\n                chain,\n                can,\n                pasteEvent,\n                dropEvent,\n            });\n            handlers.push(handler);\n        });\n    });\n    const success = handlers.every(handler => handler !== null);\n    return success;\n}\nconst createClipboardPasteEvent = (text) => {\n    var _a;\n    const event = new ClipboardEvent('paste', {\n        clipboardData: new DataTransfer(),\n    });\n    (_a = event.clipboardData) === null || _a === void 0 ? void 0 : _a.setData('text/html', text);\n    return event;\n};\n/**\n * Create an paste rules plugin. When enabled, it will cause pasted\n * text that matches any of the given rules to trigger the rule’s\n * action.\n */\nfunction pasteRulesPlugin(props) {\n    const { editor, rules } = props;\n    let dragSourceElement = null;\n    let isPastedFromProseMirror = false;\n    let isDroppedFromProseMirror = false;\n    let pasteEvent = typeof ClipboardEvent !== 'undefined' ? new ClipboardEvent('paste') : null;\n    let dropEvent = typeof DragEvent !== 'undefined' ? new DragEvent('drop') : null;\n    const processEvent = ({ state, from, to, rule, pasteEvt, }) => {\n        const tr = state.tr;\n        const chainableState = createChainableState({\n            state,\n            transaction: tr,\n        });\n        const handler = run({\n            editor,\n            state: chainableState,\n            from: Math.max(from - 1, 0),\n            to: to.b - 1,\n            rule,\n            pasteEvent: pasteEvt,\n            dropEvent,\n        });\n        if (!handler || !tr.steps.length) {\n            return;\n        }\n        dropEvent = typeof DragEvent !== 'undefined' ? new DragEvent('drop') : null;\n        pasteEvent = typeof ClipboardEvent !== 'undefined' ? new ClipboardEvent('paste') : null;\n        return tr;\n    };\n    const plugins = rules.map(rule => {\n        return new Plugin({\n            // we register a global drag handler to track the current drag source element\n            view(view) {\n                const handleDragstart = (event) => {\n                    var _a;\n                    dragSourceElement = ((_a = view.dom.parentElement) === null || _a === void 0 ? void 0 : _a.contains(event.target))\n                        ? view.dom.parentElement\n                        : null;\n                };\n                window.addEventListener('dragstart', handleDragstart);\n                return {\n                    destroy() {\n                        window.removeEventListener('dragstart', handleDragstart);\n                    },\n                };\n            },\n            props: {\n                handleDOMEvents: {\n                    drop: (view, event) => {\n                        isDroppedFromProseMirror = dragSourceElement === view.dom.parentElement;\n                        dropEvent = event;\n                        return false;\n                    },\n                    paste: (_view, event) => {\n                        var _a;\n                        const html = (_a = event.clipboardData) === null || _a === void 0 ? void 0 : _a.getData('text/html');\n                        pasteEvent = event;\n                        isPastedFromProseMirror = !!(html === null || html === void 0 ? void 0 : html.includes('data-pm-slice'));\n                        return false;\n                    },\n                },\n            },\n            appendTransaction: (transactions, oldState, state) => {\n                const transaction = transactions[0];\n                const isPaste = transaction.getMeta('uiEvent') === 'paste' && !isPastedFromProseMirror;\n                const isDrop = transaction.getMeta('uiEvent') === 'drop' && !isDroppedFromProseMirror;\n                // if PasteRule is triggered by insertContent()\n                const simulatedPasteMeta = transaction.getMeta('applyPasteRules');\n                const isSimulatedPaste = !!simulatedPasteMeta;\n                if (!isPaste && !isDrop && !isSimulatedPaste) {\n                    return;\n                }\n                // Handle simulated paste\n                if (isSimulatedPaste) {\n                    const { from, text } = simulatedPasteMeta;\n                    const to = from + text.length;\n                    const pasteEvt = createClipboardPasteEvent(text);\n                    return processEvent({\n                        rule,\n                        state,\n                        from,\n                        to: { b: to },\n                        pasteEvt,\n                    });\n                }\n                // handle actual paste/drop\n                const from = oldState.doc.content.findDiffStart(state.doc.content);\n                const to = oldState.doc.content.findDiffEnd(state.doc.content);\n                // stop if there is no changed range\n                if (!isNumber(from) || !to || from === to.b) {\n                    return;\n                }\n                return processEvent({\n                    rule,\n                    state,\n                    from,\n                    to,\n                    pasteEvt: pasteEvent,\n                });\n            },\n        });\n    });\n    return plugins;\n}\n\nfunction findDuplicates(items) {\n    const filtered = items.filter((el, index) => items.indexOf(el) !== index);\n    return [...new Set(filtered)];\n}\n\nclass ExtensionManager {\n    constructor(extensions, editor) {\n        this.splittableMarks = [];\n        this.editor = editor;\n        this.extensions = ExtensionManager.resolve(extensions);\n        this.schema = getSchemaByResolvedExtensions(this.extensions, editor);\n        this.setupExtensions();\n    }\n    /**\n     * Returns a flattened and sorted extension list while\n     * also checking for duplicated extensions and warns the user.\n     * @param extensions An array of Tiptap extensions\n     * @returns An flattened and sorted array of Tiptap extensions\n     */\n    static resolve(extensions) {\n        const resolvedExtensions = ExtensionManager.sort(ExtensionManager.flatten(extensions));\n        const duplicatedNames = findDuplicates(resolvedExtensions.map(extension => extension.name));\n        if (duplicatedNames.length) {\n            console.warn(`[tiptap warn]: Duplicate extension names found: [${duplicatedNames\n                .map(item => `'${item}'`)\n                .join(', ')}]. This can lead to issues.`);\n        }\n        return resolvedExtensions;\n    }\n    /**\n     * Create a flattened array of extensions by traversing the `addExtensions` field.\n     * @param extensions An array of Tiptap extensions\n     * @returns A flattened array of Tiptap extensions\n     */\n    static flatten(extensions) {\n        return (extensions\n            .map(extension => {\n            const context = {\n                name: extension.name,\n                options: extension.options,\n                storage: extension.storage,\n            };\n            const addExtensions = getExtensionField(extension, 'addExtensions', context);\n            if (addExtensions) {\n                return [extension, ...this.flatten(addExtensions())];\n            }\n            return extension;\n        })\n            // `Infinity` will break TypeScript so we set a number that is probably high enough\n            .flat(10));\n    }\n    /**\n     * Sort extensions by priority.\n     * @param extensions An array of Tiptap extensions\n     * @returns A sorted array of Tiptap extensions by priority\n     */\n    static sort(extensions) {\n        const defaultPriority = 100;\n        return extensions.sort((a, b) => {\n            const priorityA = getExtensionField(a, 'priority') || defaultPriority;\n            const priorityB = getExtensionField(b, 'priority') || defaultPriority;\n            if (priorityA > priorityB) {\n                return -1;\n            }\n            if (priorityA < priorityB) {\n                return 1;\n            }\n            return 0;\n        });\n    }\n    /**\n     * Get all commands from the extensions.\n     * @returns An object with all commands where the key is the command name and the value is the command function\n     */\n    get commands() {\n        return this.extensions.reduce((commands, extension) => {\n            const context = {\n                name: extension.name,\n                options: extension.options,\n                storage: extension.storage,\n                editor: this.editor,\n                type: getSchemaTypeByName(extension.name, this.schema),\n            };\n            const addCommands = getExtensionField(extension, 'addCommands', context);\n            if (!addCommands) {\n                return commands;\n            }\n            return {\n                ...commands,\n                ...addCommands(),\n            };\n        }, {});\n    }\n    /**\n     * Get all registered Prosemirror plugins from the extensions.\n     * @returns An array of Prosemirror plugins\n     */\n    get plugins() {\n        const { editor } = this;\n        // With ProseMirror, first plugins within an array are executed first.\n        // In Tiptap, we provide the ability to override plugins,\n        // so it feels more natural to run plugins at the end of an array first.\n        // That’s why we have to reverse the `extensions` array and sort again\n        // based on the `priority` option.\n        const extensions = ExtensionManager.sort([...this.extensions].reverse());\n        const inputRules = [];\n        const pasteRules = [];\n        const allPlugins = extensions\n            .map(extension => {\n            const context = {\n                name: extension.name,\n                options: extension.options,\n                storage: extension.storage,\n                editor,\n                type: getSchemaTypeByName(extension.name, this.schema),\n            };\n            const plugins = [];\n            const addKeyboardShortcuts = getExtensionField(extension, 'addKeyboardShortcuts', context);\n            let defaultBindings = {};\n            // bind exit handling\n            if (extension.type === 'mark' && getExtensionField(extension, 'exitable', context)) {\n                defaultBindings.ArrowRight = () => Mark.handleExit({ editor, mark: extension });\n            }\n            if (addKeyboardShortcuts) {\n                const bindings = Object.fromEntries(Object.entries(addKeyboardShortcuts()).map(([shortcut, method]) => {\n                    return [shortcut, () => method({ editor })];\n                }));\n                defaultBindings = { ...defaultBindings, ...bindings };\n            }\n            const keyMapPlugin = keymap(defaultBindings);\n            plugins.push(keyMapPlugin);\n            const addInputRules = getExtensionField(extension, 'addInputRules', context);\n            if (isExtensionRulesEnabled(extension, editor.options.enableInputRules) && addInputRules) {\n                inputRules.push(...addInputRules());\n            }\n            const addPasteRules = getExtensionField(extension, 'addPasteRules', context);\n            if (isExtensionRulesEnabled(extension, editor.options.enablePasteRules) && addPasteRules) {\n                pasteRules.push(...addPasteRules());\n            }\n            const addProseMirrorPlugins = getExtensionField(extension, 'addProseMirrorPlugins', context);\n            if (addProseMirrorPlugins) {\n                const proseMirrorPlugins = addProseMirrorPlugins();\n                plugins.push(...proseMirrorPlugins);\n            }\n            return plugins;\n        })\n            .flat();\n        return [\n            inputRulesPlugin({\n                editor,\n                rules: inputRules,\n            }),\n            ...pasteRulesPlugin({\n                editor,\n                rules: pasteRules,\n            }),\n            ...allPlugins,\n        ];\n    }\n    /**\n     * Get all attributes from the extensions.\n     * @returns An array of attributes\n     */\n    get attributes() {\n        return getAttributesFromExtensions(this.extensions);\n    }\n    /**\n     * Get all node views from the extensions.\n     * @returns An object with all node views where the key is the node name and the value is the node view function\n     */\n    get nodeViews() {\n        const { editor } = this;\n        const { nodeExtensions } = splitExtensions(this.extensions);\n        return Object.fromEntries(nodeExtensions\n            .filter(extension => !!getExtensionField(extension, 'addNodeView'))\n            .map(extension => {\n            const extensionAttributes = this.attributes.filter(attribute => attribute.type === extension.name);\n            const context = {\n                name: extension.name,\n                options: extension.options,\n                storage: extension.storage,\n                editor,\n                type: getNodeType(extension.name, this.schema),\n            };\n            const addNodeView = getExtensionField(extension, 'addNodeView', context);\n            if (!addNodeView) {\n                return [];\n            }\n            const nodeview = (node, view, getPos, decorations) => {\n                const HTMLAttributes = getRenderedAttributes(node, extensionAttributes);\n                return addNodeView()({\n                    editor,\n                    node,\n                    getPos,\n                    decorations,\n                    HTMLAttributes,\n                    extension,\n                });\n            };\n            return [extension.name, nodeview];\n        }));\n    }\n    /**\n     * Go through all extensions, create extension storages & setup marks\n     * & bind editor event listener.\n     */\n    setupExtensions() {\n        this.extensions.forEach(extension => {\n            var _a;\n            // store extension storage in editor\n            this.editor.extensionStorage[extension.name] = extension.storage;\n            const context = {\n                name: extension.name,\n                options: extension.options,\n                storage: extension.storage,\n                editor: this.editor,\n                type: getSchemaTypeByName(extension.name, this.schema),\n            };\n            if (extension.type === 'mark') {\n                const keepOnSplit = (_a = callOrReturn(getExtensionField(extension, 'keepOnSplit', context))) !== null && _a !== void 0 ? _a : true;\n                if (keepOnSplit) {\n                    this.splittableMarks.push(extension.name);\n                }\n            }\n            const onBeforeCreate = getExtensionField(extension, 'onBeforeCreate', context);\n            const onCreate = getExtensionField(extension, 'onCreate', context);\n            const onUpdate = getExtensionField(extension, 'onUpdate', context);\n            const onSelectionUpdate = getExtensionField(extension, 'onSelectionUpdate', context);\n            const onTransaction = getExtensionField(extension, 'onTransaction', context);\n            const onFocus = getExtensionField(extension, 'onFocus', context);\n            const onBlur = getExtensionField(extension, 'onBlur', context);\n            const onDestroy = getExtensionField(extension, 'onDestroy', context);\n            if (onBeforeCreate) {\n                this.editor.on('beforeCreate', onBeforeCreate);\n            }\n            if (onCreate) {\n                this.editor.on('create', onCreate);\n            }\n            if (onUpdate) {\n                this.editor.on('update', onUpdate);\n            }\n            if (onSelectionUpdate) {\n                this.editor.on('selectionUpdate', onSelectionUpdate);\n            }\n            if (onTransaction) {\n                this.editor.on('transaction', onTransaction);\n            }\n            if (onFocus) {\n                this.editor.on('focus', onFocus);\n            }\n            if (onBlur) {\n                this.editor.on('blur', onBlur);\n            }\n            if (onDestroy) {\n                this.editor.on('destroy', onDestroy);\n            }\n        });\n    }\n}\n\n// see: https://github.com/mesqueeb/is-what/blob/88d6e4ca92fb2baab6003c54e02eedf4e729e5ab/src/index.ts\nfunction getType(value) {\n    return Object.prototype.toString.call(value).slice(8, -1);\n}\nfunction isPlainObject(value) {\n    if (getType(value) !== 'Object') {\n        return false;\n    }\n    return value.constructor === Object && Object.getPrototypeOf(value) === Object.prototype;\n}\n\nfunction mergeDeep(target, source) {\n    const output = { ...target };\n    if (isPlainObject(target) && isPlainObject(source)) {\n        Object.keys(source).forEach(key => {\n            if (isPlainObject(source[key]) && isPlainObject(target[key])) {\n                output[key] = mergeDeep(target[key], source[key]);\n            }\n            else {\n                output[key] = source[key];\n            }\n        });\n    }\n    return output;\n}\n\n/**\n * The Extension class is the base class for all extensions.\n * @see https://tiptap.dev/api/extensions#create-a-new-extension\n */\nclass Extension {\n    constructor(config = {}) {\n        this.type = 'extension';\n        this.name = 'extension';\n        this.parent = null;\n        this.child = null;\n        this.config = {\n            name: this.name,\n            defaultOptions: {},\n        };\n        this.config = {\n            ...this.config,\n            ...config,\n        };\n        this.name = this.config.name;\n        if (config.defaultOptions && Object.keys(config.defaultOptions).length > 0) {\n            console.warn(`[tiptap warn]: BREAKING CHANGE: \"defaultOptions\" is deprecated. Please use \"addOptions\" instead. Found in extension: \"${this.name}\".`);\n        }\n        // TODO: remove `addOptions` fallback\n        this.options = this.config.defaultOptions;\n        if (this.config.addOptions) {\n            this.options = callOrReturn(getExtensionField(this, 'addOptions', {\n                name: this.name,\n            }));\n        }\n        this.storage = callOrReturn(getExtensionField(this, 'addStorage', {\n            name: this.name,\n            options: this.options,\n        })) || {};\n    }\n    static create(config = {}) {\n        return new Extension(config);\n    }\n    configure(options = {}) {\n        // return a new instance so we can use the same extension\n        // with different calls of `configure`\n        const extension = this.extend({\n            ...this.config,\n            addOptions() {\n                var _a;\n                return mergeDeep(((_a = this.parent) === null || _a === void 0 ? void 0 : _a.call(this)) || {}, options);\n            },\n        });\n        // Always preserve the current name\n        extension.name = this.name;\n        // Set the parent to be our parent\n        extension.parent = this.parent;\n        return extension;\n    }\n    extend(extendedConfig = {}) {\n        const extension = new Extension({ ...this.config, ...extendedConfig });\n        extension.parent = this;\n        this.child = extension;\n        extension.name = extendedConfig.name ? extendedConfig.name : extension.parent.name;\n        if (extendedConfig.defaultOptions && Object.keys(extendedConfig.defaultOptions).length > 0) {\n            console.warn(`[tiptap warn]: BREAKING CHANGE: \"defaultOptions\" is deprecated. Please use \"addOptions\" instead. Found in extension: \"${extension.name}\".`);\n        }\n        extension.options = callOrReturn(getExtensionField(extension, 'addOptions', {\n            name: extension.name,\n        }));\n        extension.storage = callOrReturn(getExtensionField(extension, 'addStorage', {\n            name: extension.name,\n            options: extension.options,\n        }));\n        return extension;\n    }\n}\n\n/**\n * Gets the text between two positions in a Prosemirror node\n * and serializes it using the given text serializers and block separator (see getText)\n * @param startNode The Prosemirror node to start from\n * @param range The range of the text to get\n * @param options Options for the text serializer & block separator\n * @returns The text between the two positions\n */\nfunction getTextBetween(startNode, range, options) {\n    const { from, to } = range;\n    const { blockSeparator = '\\n\\n', textSerializers = {} } = options || {};\n    let text = '';\n    startNode.nodesBetween(from, to, (node, pos, parent, index) => {\n        var _a;\n        if (node.isBlock && pos > from) {\n            text += blockSeparator;\n        }\n        const textSerializer = textSerializers === null || textSerializers === void 0 ? void 0 : textSerializers[node.type.name];\n        if (textSerializer) {\n            if (parent) {\n                text += textSerializer({\n                    node,\n                    pos,\n                    parent,\n                    index,\n                    range,\n                });\n            }\n            // do not descend into child nodes when there exists a serializer\n            return false;\n        }\n        if (node.isText) {\n            text += (_a = node === null || node === void 0 ? void 0 : node.text) === null || _a === void 0 ? void 0 : _a.slice(Math.max(from, pos) - pos, to - pos); // eslint-disable-line\n        }\n    });\n    return text;\n}\n\n/**\n * Find text serializers `toText` in a Prosemirror schema\n * @param schema The Prosemirror schema to search in\n * @returns A record of text serializers by node name\n */\nfunction getTextSerializersFromSchema(schema) {\n    return Object.fromEntries(Object.entries(schema.nodes)\n        .filter(([, node]) => node.spec.toText)\n        .map(([name, node]) => [name, node.spec.toText]));\n}\n\nconst ClipboardTextSerializer = Extension.create({\n    name: 'clipboardTextSerializer',\n    addOptions() {\n        return {\n            blockSeparator: undefined,\n        };\n    },\n    addProseMirrorPlugins() {\n        return [\n            new Plugin({\n                key: new PluginKey('clipboardTextSerializer'),\n                props: {\n                    clipboardTextSerializer: () => {\n                        const { editor } = this;\n                        const { state, schema } = editor;\n                        const { doc, selection } = state;\n                        const { ranges } = selection;\n                        const from = Math.min(...ranges.map(range => range.$from.pos));\n                        const to = Math.max(...ranges.map(range => range.$to.pos));\n                        const textSerializers = getTextSerializersFromSchema(schema);\n                        const range = { from, to };\n                        return getTextBetween(doc, range, {\n                            ...(this.options.blockSeparator !== undefined\n                                ? { blockSeparator: this.options.blockSeparator }\n                                : {}),\n                            textSerializers,\n                        });\n                    },\n                },\n            }),\n        ];\n    },\n});\n\nconst blur = () => ({ editor, view }) => {\n    requestAnimationFrame(() => {\n        var _a;\n        if (!editor.isDestroyed) {\n            view.dom.blur();\n            // Browsers should remove the caret on blur but safari does not.\n            // See: https://github.com/ueberdosis/tiptap/issues/2405\n            (_a = window === null || window === void 0 ? void 0 : window.getSelection()) === null || _a === void 0 ? void 0 : _a.removeAllRanges();\n        }\n    });\n    return true;\n};\n\nconst clearContent = (emitUpdate = false) => ({ commands }) => {\n    return commands.setContent('', emitUpdate);\n};\n\nconst clearNodes = () => ({ state, tr, dispatch }) => {\n    const { selection } = tr;\n    const { ranges } = selection;\n    if (!dispatch) {\n        return true;\n    }\n    ranges.forEach(({ $from, $to }) => {\n        state.doc.nodesBetween($from.pos, $to.pos, (node, pos) => {\n            if (node.type.isText) {\n                return;\n            }\n            const { doc, mapping } = tr;\n            const $mappedFrom = doc.resolve(mapping.map(pos));\n            const $mappedTo = doc.resolve(mapping.map(pos + node.nodeSize));\n            const nodeRange = $mappedFrom.blockRange($mappedTo);\n            if (!nodeRange) {\n                return;\n            }\n            const targetLiftDepth = liftTarget(nodeRange);\n            if (node.type.isTextblock) {\n                const { defaultType } = $mappedFrom.parent.contentMatchAt($mappedFrom.index());\n                tr.setNodeMarkup(nodeRange.start, defaultType);\n            }\n            if (targetLiftDepth || targetLiftDepth === 0) {\n                tr.lift(nodeRange, targetLiftDepth);\n            }\n        });\n    });\n    return true;\n};\n\nconst command = fn => props => {\n    return fn(props);\n};\n\nconst createParagraphNear = () => ({ state, dispatch }) => {\n    return createParagraphNear$1(state, dispatch);\n};\n\nconst cut = (originRange, targetPos) => ({ editor, tr }) => {\n    const { state } = editor;\n    const contentSlice = state.doc.slice(originRange.from, originRange.to);\n    tr.deleteRange(originRange.from, originRange.to);\n    const newPos = tr.mapping.map(targetPos);\n    tr.insert(newPos, contentSlice.content);\n    tr.setSelection(new TextSelection(tr.doc.resolve(newPos - 1)));\n    return true;\n};\n\nconst deleteCurrentNode = () => ({ tr, dispatch }) => {\n    const { selection } = tr;\n    const currentNode = selection.$anchor.node();\n    // if there is content inside the current node, break out of this command\n    if (currentNode.content.size > 0) {\n        return false;\n    }\n    const $pos = tr.selection.$anchor;\n    for (let depth = $pos.depth; depth > 0; depth -= 1) {\n        const node = $pos.node(depth);\n        if (node.type === currentNode.type) {\n            if (dispatch) {\n                const from = $pos.before(depth);\n                const to = $pos.after(depth);\n                tr.delete(from, to).scrollIntoView();\n            }\n            return true;\n        }\n    }\n    return false;\n};\n\nconst deleteNode = typeOrName => ({ tr, state, dispatch }) => {\n    const type = getNodeType(typeOrName, state.schema);\n    const $pos = tr.selection.$anchor;\n    for (let depth = $pos.depth; depth > 0; depth -= 1) {\n        const node = $pos.node(depth);\n        if (node.type === type) {\n            if (dispatch) {\n                const from = $pos.before(depth);\n                const to = $pos.after(depth);\n                tr.delete(from, to).scrollIntoView();\n            }\n            return true;\n        }\n    }\n    return false;\n};\n\nconst deleteRange = range => ({ tr, dispatch }) => {\n    const { from, to } = range;\n    if (dispatch) {\n        tr.delete(from, to);\n    }\n    return true;\n};\n\nconst deleteSelection = () => ({ state, dispatch }) => {\n    return deleteSelection$1(state, dispatch);\n};\n\nconst enter = () => ({ commands }) => {\n    return commands.keyboardShortcut('Enter');\n};\n\nconst exitCode = () => ({ state, dispatch }) => {\n    return exitCode$1(state, dispatch);\n};\n\n/**\n * Check if object1 includes object2\n * @param object1 Object\n * @param object2 Object\n */\nfunction objectIncludes(object1, object2, options = { strict: true }) {\n    const keys = Object.keys(object2);\n    if (!keys.length) {\n        return true;\n    }\n    return keys.every(key => {\n        if (options.strict) {\n            return object2[key] === object1[key];\n        }\n        if (isRegExp(object2[key])) {\n            return object2[key].test(object1[key]);\n        }\n        return object2[key] === object1[key];\n    });\n}\n\nfunction findMarkInSet(marks, type, attributes = {}) {\n    return marks.find(item => {\n        return item.type === type && objectIncludes(item.attrs, attributes);\n    });\n}\nfunction isMarkInSet(marks, type, attributes = {}) {\n    return !!findMarkInSet(marks, type, attributes);\n}\nfunction getMarkRange($pos, type, attributes = {}) {\n    if (!$pos || !type) {\n        return;\n    }\n    let start = $pos.parent.childAfter($pos.parentOffset);\n    if ($pos.parentOffset === start.offset && start.offset !== 0) {\n        start = $pos.parent.childBefore($pos.parentOffset);\n    }\n    if (!start.node) {\n        return;\n    }\n    const mark = findMarkInSet([...start.node.marks], type, attributes);\n    if (!mark) {\n        return;\n    }\n    let startIndex = start.index;\n    let startPos = $pos.start() + start.offset;\n    let endIndex = startIndex + 1;\n    let endPos = startPos + start.node.nodeSize;\n    findMarkInSet([...start.node.marks], type, attributes);\n    while (startIndex > 0 && mark.isInSet($pos.parent.child(startIndex - 1).marks)) {\n        startIndex -= 1;\n        startPos -= $pos.parent.child(startIndex).nodeSize;\n    }\n    while (endIndex < $pos.parent.childCount\n        && isMarkInSet([...$pos.parent.child(endIndex).marks], type, attributes)) {\n        endPos += $pos.parent.child(endIndex).nodeSize;\n        endIndex += 1;\n    }\n    return {\n        from: startPos,\n        to: endPos,\n    };\n}\n\nfunction getMarkType(nameOrType, schema) {\n    if (typeof nameOrType === 'string') {\n        if (!schema.marks[nameOrType]) {\n            throw Error(`There is no mark type named '${nameOrType}'. Maybe you forgot to add the extension?`);\n        }\n        return schema.marks[nameOrType];\n    }\n    return nameOrType;\n}\n\nconst extendMarkRange = (typeOrName, attributes = {}) => ({ tr, state, dispatch }) => {\n    const type = getMarkType(typeOrName, state.schema);\n    const { doc, selection } = tr;\n    const { $from, from, to } = selection;\n    if (dispatch) {\n        const range = getMarkRange($from, type, attributes);\n        if (range && range.from <= from && range.to >= to) {\n            const newSelection = TextSelection.create(doc, range.from, range.to);\n            tr.setSelection(newSelection);\n        }\n    }\n    return true;\n};\n\nconst first = commands => props => {\n    const items = typeof commands === 'function'\n        ? commands(props)\n        : commands;\n    for (let i = 0; i < items.length; i += 1) {\n        if (items[i](props)) {\n            return true;\n        }\n    }\n    return false;\n};\n\nfunction isTextSelection(value) {\n    return value instanceof TextSelection;\n}\n\nfunction minMax(value = 0, min = 0, max = 0) {\n    return Math.min(Math.max(value, min), max);\n}\n\nfunction resolveFocusPosition(doc, position = null) {\n    if (!position) {\n        return null;\n    }\n    const selectionAtStart = Selection.atStart(doc);\n    const selectionAtEnd = Selection.atEnd(doc);\n    if (position === 'start' || position === true) {\n        return selectionAtStart;\n    }\n    if (position === 'end') {\n        return selectionAtEnd;\n    }\n    const minPos = selectionAtStart.from;\n    const maxPos = selectionAtEnd.to;\n    if (position === 'all') {\n        return TextSelection.create(doc, minMax(0, minPos, maxPos), minMax(doc.content.size, minPos, maxPos));\n    }\n    return TextSelection.create(doc, minMax(position, minPos, maxPos), minMax(position, minPos, maxPos));\n}\n\nfunction isiOS() {\n    return [\n        'iPad Simulator',\n        'iPhone Simulator',\n        'iPod Simulator',\n        'iPad',\n        'iPhone',\n        'iPod',\n    ].includes(navigator.platform)\n        // iPad on iOS 13 detection\n        || (navigator.userAgent.includes('Mac') && 'ontouchend' in document);\n}\n\nconst focus = (position = null, options = {}) => ({ editor, view, tr, dispatch, }) => {\n    options = {\n        scrollIntoView: true,\n        ...options,\n    };\n    const delayedFocus = () => {\n        // focus within `requestAnimationFrame` breaks focus on iOS\n        // so we have to call this\n        if (isiOS()) {\n            view.dom.focus();\n        }\n        // For React we have to focus asynchronously. Otherwise wild things happen.\n        // see: https://github.com/ueberdosis/tiptap/issues/1520\n        requestAnimationFrame(() => {\n            if (!editor.isDestroyed) {\n                view.focus();\n                if (options === null || options === void 0 ? void 0 : options.scrollIntoView) {\n                    editor.commands.scrollIntoView();\n                }\n            }\n        });\n    };\n    if ((view.hasFocus() && position === null) || position === false) {\n        return true;\n    }\n    // we don’t try to resolve a NodeSelection or CellSelection\n    if (dispatch && position === null && !isTextSelection(editor.state.selection)) {\n        delayedFocus();\n        return true;\n    }\n    // pass through tr.doc instead of editor.state.doc\n    // since transactions could change the editors state before this command has been run\n    const selection = resolveFocusPosition(tr.doc, position) || editor.state.selection;\n    const isSameSelection = editor.state.selection.eq(selection);\n    if (dispatch) {\n        if (!isSameSelection) {\n            tr.setSelection(selection);\n        }\n        // `tr.setSelection` resets the stored marks\n        // so we’ll restore them if the selection is the same as before\n        if (isSameSelection && tr.storedMarks) {\n            tr.setStoredMarks(tr.storedMarks);\n        }\n        delayedFocus();\n    }\n    return true;\n};\n\nconst forEach = (items, fn) => props => {\n    return items.every((item, index) => fn(item, { ...props, index }));\n};\n\nconst insertContent = (value, options) => ({ tr, commands }) => {\n    return commands.insertContentAt({ from: tr.selection.from, to: tr.selection.to }, value, options);\n};\n\nconst removeWhitespaces = (node) => {\n    const children = node.childNodes;\n    for (let i = children.length - 1; i >= 0; i -= 1) {\n        const child = children[i];\n        if (child.nodeType === 3 && child.nodeValue && /^(\\n\\s\\s|\\n)$/.test(child.nodeValue)) {\n            node.removeChild(child);\n        }\n        else if (child.nodeType === 1) {\n            removeWhitespaces(child);\n        }\n    }\n    return node;\n};\nfunction elementFromString(value) {\n    // add a wrapper to preserve leading and trailing whitespace\n    const wrappedValue = `<body>${value}</body>`;\n    const html = new window.DOMParser().parseFromString(wrappedValue, 'text/html').body;\n    return removeWhitespaces(html);\n}\n\n/**\n * Takes a JSON or HTML content and creates a Prosemirror node or fragment from it.\n * @param content The JSON or HTML content to create the node from\n * @param schema The Prosemirror schema to use for the node\n * @param options Options for the parser\n * @returns The created Prosemirror node or fragment\n */\nfunction createNodeFromContent(content, schema, options) {\n    options = {\n        slice: true,\n        parseOptions: {},\n        ...options,\n    };\n    const isJSONContent = typeof content === 'object' && content !== null;\n    const isTextContent = typeof content === 'string';\n    if (isJSONContent) {\n        try {\n            const isArrayContent = Array.isArray(content) && content.length > 0;\n            // if the JSON Content is an array of nodes, create a fragment for each node\n            if (isArrayContent) {\n                return Fragment.fromArray(content.map(item => schema.nodeFromJSON(item)));\n            }\n            return schema.nodeFromJSON(content);\n        }\n        catch (error) {\n            if (options.errorOnInvalidContent) {\n                throw new Error('[tiptap error]: Invalid JSON content', { cause: error });\n            }\n            console.warn('[tiptap warn]: Invalid content.', 'Passed value:', content, 'Error:', error);\n            return createNodeFromContent('', schema, options);\n        }\n    }\n    if (isTextContent) {\n        let schemaToUse = schema;\n        let hasInvalidContent = false;\n        let invalidContent = '';\n        // Only ever check for invalid content if we're supposed to throw an error\n        if (options.errorOnInvalidContent) {\n            schemaToUse = new Schema({\n                topNode: schema.spec.topNode,\n                marks: schema.spec.marks,\n                // Prosemirror's schemas are executed such that: the last to execute, matches last\n                // This means that we can add a catch-all node at the end of the schema to catch any content that we don't know how to handle\n                nodes: schema.spec.nodes.append({\n                    __tiptap__private__unknown__catch__all__node: {\n                        content: 'inline*',\n                        group: 'block',\n                        parseDOM: [\n                            {\n                                tag: '*',\n                                getAttrs: e => {\n                                    // If this is ever called, we know that the content has something that we don't know how to handle in the schema\n                                    hasInvalidContent = true;\n                                    // Try to stringify the element for a more helpful error message\n                                    invalidContent = typeof e === 'string' ? e : e.outerHTML;\n                                    return null;\n                                },\n                            },\n                        ],\n                    },\n                }),\n            });\n        }\n        const parser = DOMParser.fromSchema(schemaToUse);\n        const response = options.slice\n            ? parser.parseSlice(elementFromString(content), options.parseOptions).content\n            : parser.parse(elementFromString(content), options.parseOptions);\n        if (options.errorOnInvalidContent && hasInvalidContent) {\n            throw new Error('[tiptap error]: Invalid HTML content', { cause: new Error(`Invalid element found: ${invalidContent}`) });\n        }\n        return response;\n    }\n    return createNodeFromContent('', schema, options);\n}\n\n// source: https://github.com/ProseMirror/prosemirror-state/blob/master/src/selection.js#L466\nfunction selectionToInsertionEnd(tr, startLen, bias) {\n    const last = tr.steps.length - 1;\n    if (last < startLen) {\n        return;\n    }\n    const step = tr.steps[last];\n    if (!(step instanceof ReplaceStep || step instanceof ReplaceAroundStep)) {\n        return;\n    }\n    const map = tr.mapping.maps[last];\n    let end = 0;\n    map.forEach((_from, _to, _newFrom, newTo) => {\n        if (end === 0) {\n            end = newTo;\n        }\n    });\n    tr.setSelection(Selection.near(tr.doc.resolve(end), bias));\n}\n\nconst isFragment = (nodeOrFragment) => {\n    return !('type' in nodeOrFragment);\n};\nconst insertContentAt = (position, value, options) => ({ tr, dispatch, editor }) => {\n    var _a;\n    if (dispatch) {\n        options = {\n            parseOptions: {},\n            updateSelection: true,\n            applyInputRules: false,\n            applyPasteRules: false,\n            ...options,\n        };\n        let content;\n        try {\n            content = createNodeFromContent(value, editor.schema, {\n                parseOptions: {\n                    preserveWhitespace: 'full',\n                    ...options.parseOptions,\n                },\n                errorOnInvalidContent: (_a = options.errorOnInvalidContent) !== null && _a !== void 0 ? _a : editor.options.enableContentCheck,\n            });\n        }\n        catch (e) {\n            return false;\n        }\n        let { from, to } = typeof position === 'number' ? { from: position, to: position } : { from: position.from, to: position.to };\n        let isOnlyTextContent = true;\n        let isOnlyBlockContent = true;\n        const nodes = isFragment(content) ? content : [content];\n        nodes.forEach(node => {\n            // check if added node is valid\n            node.check();\n            isOnlyTextContent = isOnlyTextContent ? node.isText && node.marks.length === 0 : false;\n            isOnlyBlockContent = isOnlyBlockContent ? node.isBlock : false;\n        });\n        // check if we can replace the wrapping node by\n        // the newly inserted content\n        // example:\n        // replace an empty paragraph by an inserted image\n        // instead of inserting the image below the paragraph\n        if (from === to && isOnlyBlockContent) {\n            const { parent } = tr.doc.resolve(from);\n            const isEmptyTextBlock = parent.isTextblock && !parent.type.spec.code && !parent.childCount;\n            if (isEmptyTextBlock) {\n                from -= 1;\n                to += 1;\n            }\n        }\n        let newContent;\n        // if there is only plain text we have to use `insertText`\n        // because this will keep the current marks\n        if (isOnlyTextContent) {\n            // if value is string, we can use it directly\n            // otherwise if it is an array, we have to join it\n            if (Array.isArray(value)) {\n                newContent = value.map(v => v.text || '').join('');\n            }\n            else if (typeof value === 'object' && !!value && !!value.text) {\n                newContent = value.text;\n            }\n            else {\n                newContent = value;\n            }\n            tr.insertText(newContent, from, to);\n        }\n        else {\n            newContent = content;\n            tr.replaceWith(from, to, newContent);\n        }\n        // set cursor at end of inserted content\n        if (options.updateSelection) {\n            selectionToInsertionEnd(tr, tr.steps.length - 1, -1);\n        }\n        if (options.applyInputRules) {\n            tr.setMeta('applyInputRules', { from, text: newContent });\n        }\n        if (options.applyPasteRules) {\n            tr.setMeta('applyPasteRules', { from, text: newContent });\n        }\n    }\n    return true;\n};\n\nconst joinUp = () => ({ state, dispatch }) => {\n    return joinUp$1(state, dispatch);\n};\nconst joinDown = () => ({ state, dispatch }) => {\n    return joinDown$1(state, dispatch);\n};\nconst joinBackward = () => ({ state, dispatch }) => {\n    return joinBackward$1(state, dispatch);\n};\nconst joinForward = () => ({ state, dispatch }) => {\n    return joinForward$1(state, dispatch);\n};\n\nconst joinItemBackward = () => ({ state, dispatch, tr, }) => {\n    try {\n        const point = joinPoint(state.doc, state.selection.$from.pos, -1);\n        if (point === null || point === undefined) {\n            return false;\n        }\n        tr.join(point, 2);\n        if (dispatch) {\n            dispatch(tr);\n        }\n        return true;\n    }\n    catch (e) {\n        return false;\n    }\n};\n\nconst joinItemForward = () => ({ state, dispatch, tr, }) => {\n    try {\n        const point = joinPoint(state.doc, state.selection.$from.pos, +1);\n        if (point === null || point === undefined) {\n            return false;\n        }\n        tr.join(point, 2);\n        if (dispatch) {\n            dispatch(tr);\n        }\n        return true;\n    }\n    catch (e) {\n        return false;\n    }\n};\n\nconst joinTextblockBackward = () => ({ state, dispatch }) => {\n    return joinTextblockBackward$1(state, dispatch);\n};\n\nconst joinTextblockForward = () => ({ state, dispatch }) => {\n    return joinTextblockForward$1(state, dispatch);\n};\n\nfunction isMacOS() {\n    return typeof navigator !== 'undefined'\n        ? /Mac/.test(navigator.platform)\n        : false;\n}\n\nfunction normalizeKeyName(name) {\n    const parts = name.split(/-(?!$)/);\n    let result = parts[parts.length - 1];\n    if (result === 'Space') {\n        result = ' ';\n    }\n    let alt;\n    let ctrl;\n    let shift;\n    let meta;\n    for (let i = 0; i < parts.length - 1; i += 1) {\n        const mod = parts[i];\n        if (/^(cmd|meta|m)$/i.test(mod)) {\n            meta = true;\n        }\n        else if (/^a(lt)?$/i.test(mod)) {\n            alt = true;\n        }\n        else if (/^(c|ctrl|control)$/i.test(mod)) {\n            ctrl = true;\n        }\n        else if (/^s(hift)?$/i.test(mod)) {\n            shift = true;\n        }\n        else if (/^mod$/i.test(mod)) {\n            if (isiOS() || isMacOS()) {\n                meta = true;\n            }\n            else {\n                ctrl = true;\n            }\n        }\n        else {\n            throw new Error(`Unrecognized modifier name: ${mod}`);\n        }\n    }\n    if (alt) {\n        result = `Alt-${result}`;\n    }\n    if (ctrl) {\n        result = `Ctrl-${result}`;\n    }\n    if (meta) {\n        result = `Meta-${result}`;\n    }\n    if (shift) {\n        result = `Shift-${result}`;\n    }\n    return result;\n}\nconst keyboardShortcut = name => ({ editor, view, tr, dispatch, }) => {\n    const keys = normalizeKeyName(name).split(/-(?!$)/);\n    const key = keys.find(item => !['Alt', 'Ctrl', 'Meta', 'Shift'].includes(item));\n    const event = new KeyboardEvent('keydown', {\n        key: key === 'Space'\n            ? ' '\n            : key,\n        altKey: keys.includes('Alt'),\n        ctrlKey: keys.includes('Ctrl'),\n        metaKey: keys.includes('Meta'),\n        shiftKey: keys.includes('Shift'),\n        bubbles: true,\n        cancelable: true,\n    });\n    const capturedTransaction = editor.captureTransaction(() => {\n        view.someProp('handleKeyDown', f => f(view, event));\n    });\n    capturedTransaction === null || capturedTransaction === void 0 ? void 0 : capturedTransaction.steps.forEach(step => {\n        const newStep = step.map(tr.mapping);\n        if (newStep && dispatch) {\n            tr.maybeStep(newStep);\n        }\n    });\n    return true;\n};\n\nfunction isNodeActive(state, typeOrName, attributes = {}) {\n    const { from, to, empty } = state.selection;\n    const type = typeOrName ? getNodeType(typeOrName, state.schema) : null;\n    const nodeRanges = [];\n    state.doc.nodesBetween(from, to, (node, pos) => {\n        if (node.isText) {\n            return;\n        }\n        const relativeFrom = Math.max(from, pos);\n        const relativeTo = Math.min(to, pos + node.nodeSize);\n        nodeRanges.push({\n            node,\n            from: relativeFrom,\n            to: relativeTo,\n        });\n    });\n    const selectionRange = to - from;\n    const matchedNodeRanges = nodeRanges\n        .filter(nodeRange => {\n        if (!type) {\n            return true;\n        }\n        return type.name === nodeRange.node.type.name;\n    })\n        .filter(nodeRange => objectIncludes(nodeRange.node.attrs, attributes, { strict: false }));\n    if (empty) {\n        return !!matchedNodeRanges.length;\n    }\n    const range = matchedNodeRanges.reduce((sum, nodeRange) => sum + nodeRange.to - nodeRange.from, 0);\n    return range >= selectionRange;\n}\n\nconst lift = (typeOrName, attributes = {}) => ({ state, dispatch }) => {\n    const type = getNodeType(typeOrName, state.schema);\n    const isActive = isNodeActive(state, type, attributes);\n    if (!isActive) {\n        return false;\n    }\n    return lift$1(state, dispatch);\n};\n\nconst liftEmptyBlock = () => ({ state, dispatch }) => {\n    return liftEmptyBlock$1(state, dispatch);\n};\n\nconst liftListItem = typeOrName => ({ state, dispatch }) => {\n    const type = getNodeType(typeOrName, state.schema);\n    return liftListItem$1(type)(state, dispatch);\n};\n\nconst newlineInCode = () => ({ state, dispatch }) => {\n    return newlineInCode$1(state, dispatch);\n};\n\n/**\n * Get the type of a schema item by its name.\n * @param name The name of the schema item\n * @param schema The Prosemiror schema to search in\n * @returns The type of the schema item (`node` or `mark`), or null if it doesn't exist\n */\nfunction getSchemaTypeNameByName(name, schema) {\n    if (schema.nodes[name]) {\n        return 'node';\n    }\n    if (schema.marks[name]) {\n        return 'mark';\n    }\n    return null;\n}\n\n/**\n * Remove a property or an array of properties from an object\n * @param obj Object\n * @param key Key to remove\n */\nfunction deleteProps(obj, propOrProps) {\n    const props = typeof propOrProps === 'string'\n        ? [propOrProps]\n        : propOrProps;\n    return Object\n        .keys(obj)\n        .reduce((newObj, prop) => {\n        if (!props.includes(prop)) {\n            newObj[prop] = obj[prop];\n        }\n        return newObj;\n    }, {});\n}\n\nconst resetAttributes = (typeOrName, attributes) => ({ tr, state, dispatch }) => {\n    let nodeType = null;\n    let markType = null;\n    const schemaType = getSchemaTypeNameByName(typeof typeOrName === 'string' ? typeOrName : typeOrName.name, state.schema);\n    if (!schemaType) {\n        return false;\n    }\n    if (schemaType === 'node') {\n        nodeType = getNodeType(typeOrName, state.schema);\n    }\n    if (schemaType === 'mark') {\n        markType = getMarkType(typeOrName, state.schema);\n    }\n    if (dispatch) {\n        tr.selection.ranges.forEach(range => {\n            state.doc.nodesBetween(range.$from.pos, range.$to.pos, (node, pos) => {\n                if (nodeType && nodeType === node.type) {\n                    tr.setNodeMarkup(pos, undefined, deleteProps(node.attrs, attributes));\n                }\n                if (markType && node.marks.length) {\n                    node.marks.forEach(mark => {\n                        if (markType === mark.type) {\n                            tr.addMark(pos, pos + node.nodeSize, markType.create(deleteProps(mark.attrs, attributes)));\n                        }\n                    });\n                }\n            });\n        });\n    }\n    return true;\n};\n\nconst scrollIntoView = () => ({ tr, dispatch }) => {\n    if (dispatch) {\n        tr.scrollIntoView();\n    }\n    return true;\n};\n\nconst selectAll = () => ({ tr, commands }) => {\n    return commands.setTextSelection({\n        from: 0,\n        to: tr.doc.content.size,\n    });\n};\n\nconst selectNodeBackward = () => ({ state, dispatch }) => {\n    return selectNodeBackward$1(state, dispatch);\n};\n\nconst selectNodeForward = () => ({ state, dispatch }) => {\n    return selectNodeForward$1(state, dispatch);\n};\n\nconst selectParentNode = () => ({ state, dispatch }) => {\n    return selectParentNode$1(state, dispatch);\n};\n\n// @ts-ignore\n// TODO: add types to @types/prosemirror-commands\nconst selectTextblockEnd = () => ({ state, dispatch }) => {\n    return selectTextblockEnd$1(state, dispatch);\n};\n\n// @ts-ignore\n// TODO: add types to @types/prosemirror-commands\nconst selectTextblockStart = () => ({ state, dispatch }) => {\n    return selectTextblockStart$1(state, dispatch);\n};\n\n/**\n * Create a new Prosemirror document node from content.\n * @param content The JSON or HTML content to create the document from\n * @param schema The Prosemirror schema to use for the document\n * @param parseOptions Options for the parser\n * @returns The created Prosemirror document node\n */\nfunction createDocument(content, schema, parseOptions = {}, options = {}) {\n    return createNodeFromContent(content, schema, {\n        slice: false,\n        parseOptions,\n        errorOnInvalidContent: options.errorOnInvalidContent,\n    });\n}\n\nconst setContent = (content, emitUpdate = false, parseOptions = {}, options = {}) => ({ editor, tr, dispatch, commands, }) => {\n    var _a, _b;\n    const { doc } = tr;\n    // This is to keep backward compatibility with the previous behavior\n    // TODO remove this in the next major version\n    if (parseOptions.preserveWhitespace !== 'full') {\n        const document = createDocument(content, editor.schema, parseOptions, {\n            errorOnInvalidContent: (_a = options.errorOnInvalidContent) !== null && _a !== void 0 ? _a : editor.options.enableContentCheck,\n        });\n        if (dispatch) {\n            tr.replaceWith(0, doc.content.size, document).setMeta('preventUpdate', !emitUpdate);\n        }\n        return true;\n    }\n    if (dispatch) {\n        tr.setMeta('preventUpdate', !emitUpdate);\n    }\n    return commands.insertContentAt({ from: 0, to: doc.content.size }, content, {\n        parseOptions,\n        errorOnInvalidContent: (_b = options.errorOnInvalidContent) !== null && _b !== void 0 ? _b : editor.options.enableContentCheck,\n    });\n};\n\nfunction getMarkAttributes(state, typeOrName) {\n    const type = getMarkType(typeOrName, state.schema);\n    const { from, to, empty } = state.selection;\n    const marks = [];\n    if (empty) {\n        if (state.storedMarks) {\n            marks.push(...state.storedMarks);\n        }\n        marks.push(...state.selection.$head.marks());\n    }\n    else {\n        state.doc.nodesBetween(from, to, node => {\n            marks.push(...node.marks);\n        });\n    }\n    const mark = marks.find(markItem => markItem.type.name === type.name);\n    if (!mark) {\n        return {};\n    }\n    return { ...mark.attrs };\n}\n\n/**\n * Returns a new `Transform` based on all steps of the passed transactions.\n * @param oldDoc The Prosemirror node to start from\n * @param transactions The transactions to combine\n * @returns A new `Transform` with all steps of the passed transactions\n */\nfunction combineTransactionSteps(oldDoc, transactions) {\n    const transform = new Transform(oldDoc);\n    transactions.forEach(transaction => {\n        transaction.steps.forEach(step => {\n            transform.step(step);\n        });\n    });\n    return transform;\n}\n\n/**\n * Gets the default block type at a given match\n * @param match The content match to get the default block type from\n * @returns The default block type or null\n */\nfunction defaultBlockAt(match) {\n    for (let i = 0; i < match.edgeCount; i += 1) {\n        const { type } = match.edge(i);\n        if (type.isTextblock && !type.hasRequiredAttrs()) {\n            return type;\n        }\n    }\n    return null;\n}\n\n/**\n * Find children inside a Prosemirror node that match a predicate.\n * @param node The Prosemirror node to search in\n * @param predicate The predicate to match\n * @returns An array of nodes with their positions\n */\nfunction findChildren(node, predicate) {\n    const nodesWithPos = [];\n    node.descendants((child, pos) => {\n        if (predicate(child)) {\n            nodesWithPos.push({\n                node: child,\n                pos,\n            });\n        }\n    });\n    return nodesWithPos;\n}\n\n/**\n * Same as `findChildren` but searches only within a `range`.\n * @param node The Prosemirror node to search in\n * @param range The range to search in\n * @param predicate The predicate to match\n * @returns An array of nodes with their positions\n */\nfunction findChildrenInRange(node, range, predicate) {\n    const nodesWithPos = [];\n    // if (range.from === range.to) {\n    //   const nodeAt = node.nodeAt(range.from)\n    //   if (nodeAt) {\n    //     nodesWithPos.push({\n    //       node: nodeAt,\n    //       pos: range.from,\n    //     })\n    //   }\n    // }\n    node.nodesBetween(range.from, range.to, (child, pos) => {\n        if (predicate(child)) {\n            nodesWithPos.push({\n                node: child,\n                pos,\n            });\n        }\n    });\n    return nodesWithPos;\n}\n\n/**\n * Finds the closest parent node to a resolved position that matches a predicate.\n * @param $pos The resolved position to search from\n * @param predicate The predicate to match\n * @returns The closest parent node to the resolved position that matches the predicate\n * @example ```js\n * findParentNodeClosestToPos($from, node => node.type.name === 'paragraph')\n * ```\n */\nfunction findParentNodeClosestToPos($pos, predicate) {\n    for (let i = $pos.depth; i > 0; i -= 1) {\n        const node = $pos.node(i);\n        if (predicate(node)) {\n            return {\n                pos: i > 0 ? $pos.before(i) : 0,\n                start: $pos.start(i),\n                depth: i,\n                node,\n            };\n        }\n    }\n}\n\n/**\n * Finds the closest parent node to the current selection that matches a predicate.\n * @param predicate The predicate to match\n * @returns A command that finds the closest parent node to the current selection that matches the predicate\n * @example ```js\n * findParentNode(node => node.type.name === 'paragraph')\n * ```\n */\nfunction findParentNode(predicate) {\n    return (selection) => findParentNodeClosestToPos(selection.$from, predicate);\n}\n\nfunction getHTMLFromFragment(fragment, schema) {\n    const documentFragment = DOMSerializer.fromSchema(schema).serializeFragment(fragment);\n    const temporaryDocument = document.implementation.createHTMLDocument();\n    const container = temporaryDocument.createElement('div');\n    container.appendChild(documentFragment);\n    return container.innerHTML;\n}\n\nfunction getSchema(extensions, editor) {\n    const resolvedExtensions = ExtensionManager.resolve(extensions);\n    return getSchemaByResolvedExtensions(resolvedExtensions, editor);\n}\n\n/**\n * Generate HTML from a JSONContent\n * @param doc The JSONContent to generate HTML from\n * @param extensions The extensions to use for the schema\n * @returns The generated HTML\n */\nfunction generateHTML(doc, extensions) {\n    const schema = getSchema(extensions);\n    const contentNode = Node$1.fromJSON(schema, doc);\n    return getHTMLFromFragment(contentNode.content, schema);\n}\n\n/**\n * Generate JSONContent from HTML\n * @param html The HTML to generate JSONContent from\n * @param extensions The extensions to use for the schema\n * @returns The generated JSONContent\n */\nfunction generateJSON(html, extensions) {\n    const schema = getSchema(extensions);\n    const dom = elementFromString(html);\n    return DOMParser.fromSchema(schema).parse(dom).toJSON();\n}\n\n/**\n * Gets the text of a Prosemirror node\n * @param node The Prosemirror node\n * @param options Options for the text serializer & block separator\n * @returns The text of the node\n * @example ```js\n * const text = getText(node, { blockSeparator: '\\n' })\n * ```\n */\nfunction getText(node, options) {\n    const range = {\n        from: 0,\n        to: node.content.size,\n    };\n    return getTextBetween(node, range, options);\n}\n\n/**\n * Generate raw text from a JSONContent\n * @param doc The JSONContent to generate text from\n * @param extensions The extensions to use for the schema\n * @param options Options for the text generation f.e. blockSeparator or textSerializers\n * @returns The generated text\n */\nfunction generateText(doc, extensions, options) {\n    const { blockSeparator = '\\n\\n', textSerializers = {} } = options || {};\n    const schema = getSchema(extensions);\n    const contentNode = Node$1.fromJSON(schema, doc);\n    return getText(contentNode, {\n        blockSeparator,\n        textSerializers: {\n            ...getTextSerializersFromSchema(schema),\n            ...textSerializers,\n        },\n    });\n}\n\nfunction getNodeAttributes(state, typeOrName) {\n    const type = getNodeType(typeOrName, state.schema);\n    const { from, to } = state.selection;\n    const nodes = [];\n    state.doc.nodesBetween(from, to, node => {\n        nodes.push(node);\n    });\n    const node = nodes.reverse().find(nodeItem => nodeItem.type.name === type.name);\n    if (!node) {\n        return {};\n    }\n    return { ...node.attrs };\n}\n\n/**\n * Get node or mark attributes by type or name on the current editor state\n * @param state The current editor state\n * @param typeOrName The node or mark type or name\n * @returns The attributes of the node or mark or an empty object\n */\nfunction getAttributes(state, typeOrName) {\n    const schemaType = getSchemaTypeNameByName(typeof typeOrName === 'string' ? typeOrName : typeOrName.name, state.schema);\n    if (schemaType === 'node') {\n        return getNodeAttributes(state, typeOrName);\n    }\n    if (schemaType === 'mark') {\n        return getMarkAttributes(state, typeOrName);\n    }\n    return {};\n}\n\n/**\n * Removes duplicated values within an array.\n * Supports numbers, strings and objects.\n */\nfunction removeDuplicates(array, by = JSON.stringify) {\n    const seen = {};\n    return array.filter(item => {\n        const key = by(item);\n        return Object.prototype.hasOwnProperty.call(seen, key)\n            ? false\n            : (seen[key] = true);\n    });\n}\n\n/**\n * Removes duplicated ranges and ranges that are\n * fully captured by other ranges.\n */\nfunction simplifyChangedRanges(changes) {\n    const uniqueChanges = removeDuplicates(changes);\n    return uniqueChanges.length === 1\n        ? uniqueChanges\n        : uniqueChanges.filter((change, index) => {\n            const rest = uniqueChanges.filter((_, i) => i !== index);\n            return !rest.some(otherChange => {\n                return change.oldRange.from >= otherChange.oldRange.from\n                    && change.oldRange.to <= otherChange.oldRange.to\n                    && change.newRange.from >= otherChange.newRange.from\n                    && change.newRange.to <= otherChange.newRange.to;\n            });\n        });\n}\n/**\n * Returns a list of changed ranges\n * based on the first and last state of all steps.\n */\nfunction getChangedRanges(transform) {\n    const { mapping, steps } = transform;\n    const changes = [];\n    mapping.maps.forEach((stepMap, index) => {\n        const ranges = [];\n        // This accounts for step changes where no range was actually altered\n        // e.g. when setting a mark, node attribute, etc.\n        // @ts-ignore\n        if (!stepMap.ranges.length) {\n            const { from, to } = steps[index];\n            if (from === undefined || to === undefined) {\n                return;\n            }\n            ranges.push({ from, to });\n        }\n        else {\n            stepMap.forEach((from, to) => {\n                ranges.push({ from, to });\n            });\n        }\n        ranges.forEach(({ from, to }) => {\n            const newStart = mapping.slice(index).map(from, -1);\n            const newEnd = mapping.slice(index).map(to);\n            const oldStart = mapping.invert().map(newStart, -1);\n            const oldEnd = mapping.invert().map(newEnd);\n            changes.push({\n                oldRange: {\n                    from: oldStart,\n                    to: oldEnd,\n                },\n                newRange: {\n                    from: newStart,\n                    to: newEnd,\n                },\n            });\n        });\n    });\n    return simplifyChangedRanges(changes);\n}\n\nfunction getDebugJSON(node, startOffset = 0) {\n    const isTopNode = node.type === node.type.schema.topNodeType;\n    const increment = isTopNode ? 0 : 1;\n    const from = startOffset;\n    const to = from + node.nodeSize;\n    const marks = node.marks.map(mark => {\n        const output = {\n            type: mark.type.name,\n        };\n        if (Object.keys(mark.attrs).length) {\n            output.attrs = { ...mark.attrs };\n        }\n        return output;\n    });\n    const attrs = { ...node.attrs };\n    const output = {\n        type: node.type.name,\n        from,\n        to,\n    };\n    if (Object.keys(attrs).length) {\n        output.attrs = attrs;\n    }\n    if (marks.length) {\n        output.marks = marks;\n    }\n    if (node.content.childCount) {\n        output.content = [];\n        node.forEach((child, offset) => {\n            var _a;\n            (_a = output.content) === null || _a === void 0 ? void 0 : _a.push(getDebugJSON(child, startOffset + offset + increment));\n        });\n    }\n    if (node.text) {\n        output.text = node.text;\n    }\n    return output;\n}\n\nfunction getMarksBetween(from, to, doc) {\n    const marks = [];\n    // get all inclusive marks on empty selection\n    if (from === to) {\n        doc\n            .resolve(from)\n            .marks()\n            .forEach(mark => {\n            const $pos = doc.resolve(from - 1);\n            const range = getMarkRange($pos, mark.type);\n            if (!range) {\n                return;\n            }\n            marks.push({\n                mark,\n                ...range,\n            });\n        });\n    }\n    else {\n        doc.nodesBetween(from, to, (node, pos) => {\n            if (!node || (node === null || node === void 0 ? void 0 : node.nodeSize) === undefined) {\n                return;\n            }\n            marks.push(...node.marks.map(mark => ({\n                from: pos,\n                to: pos + node.nodeSize,\n                mark,\n            })));\n        });\n    }\n    return marks;\n}\n\n/**\n * Finds the first node of a given type or name in the current selection.\n * @param state The editor state.\n * @param typeOrName The node type or name.\n * @param pos The position to start searching from.\n * @param maxDepth The maximum depth to search.\n * @returns The node and the depth as an array.\n */\nconst getNodeAtPosition = (state, typeOrName, pos, maxDepth = 20) => {\n    const $pos = state.doc.resolve(pos);\n    let currentDepth = maxDepth;\n    let node = null;\n    while (currentDepth > 0 && node === null) {\n        const currentNode = $pos.node(currentDepth);\n        if ((currentNode === null || currentNode === void 0 ? void 0 : currentNode.type.name) === typeOrName) {\n            node = currentNode;\n        }\n        else {\n            currentDepth -= 1;\n        }\n    }\n    return [node, currentDepth];\n};\n\n/**\n * Return attributes of an extension that should be splitted by keepOnSplit flag\n * @param extensionAttributes Array of extension attributes\n * @param typeName The type of the extension\n * @param attributes The attributes of the extension\n * @returns The splitted attributes\n */\nfunction getSplittedAttributes(extensionAttributes, typeName, attributes) {\n    return Object.fromEntries(Object\n        .entries(attributes)\n        .filter(([name]) => {\n        const extensionAttribute = extensionAttributes.find(item => {\n            return item.type === typeName && item.name === name;\n        });\n        if (!extensionAttribute) {\n            return false;\n        }\n        return extensionAttribute.attribute.keepOnSplit;\n    }));\n}\n\nfunction isMarkActive(state, typeOrName, attributes = {}) {\n    const { empty, ranges } = state.selection;\n    const type = typeOrName ? getMarkType(typeOrName, state.schema) : null;\n    if (empty) {\n        return !!(state.storedMarks || state.selection.$from.marks())\n            .filter(mark => {\n            if (!type) {\n                return true;\n            }\n            return type.name === mark.type.name;\n        })\n            .find(mark => objectIncludes(mark.attrs, attributes, { strict: false }));\n    }\n    let selectionRange = 0;\n    const markRanges = [];\n    ranges.forEach(({ $from, $to }) => {\n        const from = $from.pos;\n        const to = $to.pos;\n        state.doc.nodesBetween(from, to, (node, pos) => {\n            if (!node.isText && !node.marks.length) {\n                return;\n            }\n            const relativeFrom = Math.max(from, pos);\n            const relativeTo = Math.min(to, pos + node.nodeSize);\n            const range = relativeTo - relativeFrom;\n            selectionRange += range;\n            markRanges.push(...node.marks.map(mark => ({\n                mark,\n                from: relativeFrom,\n                to: relativeTo,\n            })));\n        });\n    });\n    if (selectionRange === 0) {\n        return false;\n    }\n    // calculate range of matched mark\n    const matchedRange = markRanges\n        .filter(markRange => {\n        if (!type) {\n            return true;\n        }\n        return type.name === markRange.mark.type.name;\n    })\n        .filter(markRange => objectIncludes(markRange.mark.attrs, attributes, { strict: false }))\n        .reduce((sum, markRange) => sum + markRange.to - markRange.from, 0);\n    // calculate range of marks that excludes the searched mark\n    // for example `code` doesn’t allow any other marks\n    const excludedRange = markRanges\n        .filter(markRange => {\n        if (!type) {\n            return true;\n        }\n        return markRange.mark.type !== type && markRange.mark.type.excludes(type);\n    })\n        .reduce((sum, markRange) => sum + markRange.to - markRange.from, 0);\n    // we only include the result of `excludedRange`\n    // if there is a match at all\n    const range = matchedRange > 0 ? matchedRange + excludedRange : matchedRange;\n    return range >= selectionRange;\n}\n\nfunction isActive(state, name, attributes = {}) {\n    if (!name) {\n        return isNodeActive(state, null, attributes) || isMarkActive(state, null, attributes);\n    }\n    const schemaType = getSchemaTypeNameByName(name, state.schema);\n    if (schemaType === 'node') {\n        return isNodeActive(state, name, attributes);\n    }\n    if (schemaType === 'mark') {\n        return isMarkActive(state, name, attributes);\n    }\n    return false;\n}\n\nconst isAtEndOfNode = (state, nodeType) => {\n    const { $from, $to, $anchor } = state.selection;\n    if (nodeType) {\n        const parentNode = findParentNode(node => node.type.name === nodeType)(state.selection);\n        if (!parentNode) {\n            return false;\n        }\n        const $parentPos = state.doc.resolve(parentNode.pos + 1);\n        if ($anchor.pos + 1 === $parentPos.end()) {\n            return true;\n        }\n        return false;\n    }\n    if ($to.parentOffset < $to.parent.nodeSize - 2 || $from.pos !== $to.pos) {\n        return false;\n    }\n    return true;\n};\n\nconst isAtStartOfNode = (state) => {\n    const { $from, $to } = state.selection;\n    if ($from.parentOffset > 0 || $from.pos !== $to.pos) {\n        return false;\n    }\n    return true;\n};\n\nfunction isList(name, extensions) {\n    const { nodeExtensions } = splitExtensions(extensions);\n    const extension = nodeExtensions.find(item => item.name === name);\n    if (!extension) {\n        return false;\n    }\n    const context = {\n        name: extension.name,\n        options: extension.options,\n        storage: extension.storage,\n    };\n    const group = callOrReturn(getExtensionField(extension, 'group', context));\n    if (typeof group !== 'string') {\n        return false;\n    }\n    return group.split(' ').includes('list');\n}\n\nfunction isNodeEmpty(node) {\n    const defaultContent = node.type.createAndFill();\n    if (!defaultContent) {\n        return false;\n    }\n    return node.eq(defaultContent);\n}\n\nfunction isNodeSelection(value) {\n    return value instanceof NodeSelection;\n}\n\nfunction posToDOMRect(view, from, to) {\n    const minPos = 0;\n    const maxPos = view.state.doc.content.size;\n    const resolvedFrom = minMax(from, minPos, maxPos);\n    const resolvedEnd = minMax(to, minPos, maxPos);\n    const start = view.coordsAtPos(resolvedFrom);\n    const end = view.coordsAtPos(resolvedEnd, -1);\n    const top = Math.min(start.top, end.top);\n    const bottom = Math.max(start.bottom, end.bottom);\n    const left = Math.min(start.left, end.left);\n    const right = Math.max(start.right, end.right);\n    const width = right - left;\n    const height = bottom - top;\n    const x = left;\n    const y = top;\n    const data = {\n        top,\n        bottom,\n        left,\n        right,\n        width,\n        height,\n        x,\n        y,\n    };\n    return {\n        ...data,\n        toJSON: () => data,\n    };\n}\n\nfunction canSetMark(state, tr, newMarkType) {\n    var _a;\n    const { selection } = tr;\n    let cursor = null;\n    if (isTextSelection(selection)) {\n        cursor = selection.$cursor;\n    }\n    if (cursor) {\n        const currentMarks = (_a = state.storedMarks) !== null && _a !== void 0 ? _a : cursor.marks();\n        // There can be no current marks that exclude the new mark\n        return (!!newMarkType.isInSet(currentMarks)\n            || !currentMarks.some(mark => mark.type.excludes(newMarkType)));\n    }\n    const { ranges } = selection;\n    return ranges.some(({ $from, $to }) => {\n        let someNodeSupportsMark = $from.depth === 0\n            ? state.doc.inlineContent && state.doc.type.allowsMarkType(newMarkType)\n            : false;\n        state.doc.nodesBetween($from.pos, $to.pos, (node, _pos, parent) => {\n            // If we already found a mark that we can enable, return false to bypass the remaining search\n            if (someNodeSupportsMark) {\n                return false;\n            }\n            if (node.isInline) {\n                const parentAllowsMarkType = !parent || parent.type.allowsMarkType(newMarkType);\n                const currentMarksAllowMarkType = !!newMarkType.isInSet(node.marks)\n                    || !node.marks.some(otherMark => otherMark.type.excludes(newMarkType));\n                someNodeSupportsMark = parentAllowsMarkType && currentMarksAllowMarkType;\n            }\n            return !someNodeSupportsMark;\n        });\n        return someNodeSupportsMark;\n    });\n}\nconst setMark = (typeOrName, attributes = {}) => ({ tr, state, dispatch }) => {\n    const { selection } = tr;\n    const { empty, ranges } = selection;\n    const type = getMarkType(typeOrName, state.schema);\n    if (dispatch) {\n        if (empty) {\n            const oldAttributes = getMarkAttributes(state, type);\n            tr.addStoredMark(type.create({\n                ...oldAttributes,\n                ...attributes,\n            }));\n        }\n        else {\n            ranges.forEach(range => {\n                const from = range.$from.pos;\n                const to = range.$to.pos;\n                state.doc.nodesBetween(from, to, (node, pos) => {\n                    const trimmedFrom = Math.max(pos, from);\n                    const trimmedTo = Math.min(pos + node.nodeSize, to);\n                    const someHasMark = node.marks.find(mark => mark.type === type);\n                    // if there is already a mark of this type\n                    // we know that we have to merge its attributes\n                    // otherwise we add a fresh new mark\n                    if (someHasMark) {\n                        node.marks.forEach(mark => {\n                            if (type === mark.type) {\n                                tr.addMark(trimmedFrom, trimmedTo, type.create({\n                                    ...mark.attrs,\n                                    ...attributes,\n                                }));\n                            }\n                        });\n                    }\n                    else {\n                        tr.addMark(trimmedFrom, trimmedTo, type.create(attributes));\n                    }\n                });\n            });\n        }\n    }\n    return canSetMark(state, tr, type);\n};\n\nconst setMeta = (key, value) => ({ tr }) => {\n    tr.setMeta(key, value);\n    return true;\n};\n\nconst setNode = (typeOrName, attributes = {}) => ({ state, dispatch, chain }) => {\n    const type = getNodeType(typeOrName, state.schema);\n    // TODO: use a fallback like insertContent?\n    if (!type.isTextblock) {\n        console.warn('[tiptap warn]: Currently \"setNode()\" only supports text block nodes.');\n        return false;\n    }\n    return (chain()\n        // try to convert node to default node if needed\n        .command(({ commands }) => {\n        const canSetBlock = setBlockType(type, attributes)(state);\n        if (canSetBlock) {\n            return true;\n        }\n        return commands.clearNodes();\n    })\n        .command(({ state: updatedState }) => {\n        return setBlockType(type, attributes)(updatedState, dispatch);\n    })\n        .run());\n};\n\nconst setNodeSelection = position => ({ tr, dispatch }) => {\n    if (dispatch) {\n        const { doc } = tr;\n        const from = minMax(position, 0, doc.content.size);\n        const selection = NodeSelection.create(doc, from);\n        tr.setSelection(selection);\n    }\n    return true;\n};\n\nconst setTextSelection = position => ({ tr, dispatch }) => {\n    if (dispatch) {\n        const { doc } = tr;\n        const { from, to } = typeof position === 'number' ? { from: position, to: position } : position;\n        const minPos = TextSelection.atStart(doc).from;\n        const maxPos = TextSelection.atEnd(doc).to;\n        const resolvedFrom = minMax(from, minPos, maxPos);\n        const resolvedEnd = minMax(to, minPos, maxPos);\n        const selection = TextSelection.create(doc, resolvedFrom, resolvedEnd);\n        tr.setSelection(selection);\n    }\n    return true;\n};\n\nconst sinkListItem = typeOrName => ({ state, dispatch }) => {\n    const type = getNodeType(typeOrName, state.schema);\n    return sinkListItem$1(type)(state, dispatch);\n};\n\nfunction ensureMarks(state, splittableMarks) {\n    const marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks());\n    if (marks) {\n        const filteredMarks = marks.filter(mark => splittableMarks === null || splittableMarks === void 0 ? void 0 : splittableMarks.includes(mark.type.name));\n        state.tr.ensureMarks(filteredMarks);\n    }\n}\nconst splitBlock = ({ keepMarks = true } = {}) => ({ tr, state, dispatch, editor, }) => {\n    const { selection, doc } = tr;\n    const { $from, $to } = selection;\n    const extensionAttributes = editor.extensionManager.attributes;\n    const newAttributes = getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs);\n    if (selection instanceof NodeSelection && selection.node.isBlock) {\n        if (!$from.parentOffset || !canSplit(doc, $from.pos)) {\n            return false;\n        }\n        if (dispatch) {\n            if (keepMarks) {\n                ensureMarks(state, editor.extensionManager.splittableMarks);\n            }\n            tr.split($from.pos).scrollIntoView();\n        }\n        return true;\n    }\n    if (!$from.parent.isBlock) {\n        return false;\n    }\n    if (dispatch) {\n        const atEnd = $to.parentOffset === $to.parent.content.size;\n        if (selection instanceof TextSelection) {\n            tr.deleteSelection();\n        }\n        const deflt = $from.depth === 0\n            ? undefined\n            : defaultBlockAt($from.node(-1).contentMatchAt($from.indexAfter(-1)));\n        let types = atEnd && deflt\n            ? [\n                {\n                    type: deflt,\n                    attrs: newAttributes,\n                },\n            ]\n            : undefined;\n        let can = canSplit(tr.doc, tr.mapping.map($from.pos), 1, types);\n        if (!types\n            && !can\n            && canSplit(tr.doc, tr.mapping.map($from.pos), 1, deflt ? [{ type: deflt }] : undefined)) {\n            can = true;\n            types = deflt\n                ? [\n                    {\n                        type: deflt,\n                        attrs: newAttributes,\n                    },\n                ]\n                : undefined;\n        }\n        if (can) {\n            tr.split(tr.mapping.map($from.pos), 1, types);\n            if (deflt && !atEnd && !$from.parentOffset && $from.parent.type !== deflt) {\n                const first = tr.mapping.map($from.before());\n                const $first = tr.doc.resolve(first);\n                if ($from.node(-1).canReplaceWith($first.index(), $first.index() + 1, deflt)) {\n                    tr.setNodeMarkup(tr.mapping.map($from.before()), deflt);\n                }\n            }\n        }\n        if (keepMarks) {\n            ensureMarks(state, editor.extensionManager.splittableMarks);\n        }\n        tr.scrollIntoView();\n    }\n    return true;\n};\n\nconst splitListItem = typeOrName => ({ tr, state, dispatch, editor, }) => {\n    var _a;\n    const type = getNodeType(typeOrName, state.schema);\n    const { $from, $to } = state.selection;\n    // @ts-ignore\n    // eslint-disable-next-line\n    const node = state.selection.node;\n    if ((node && node.isBlock) || $from.depth < 2 || !$from.sameParent($to)) {\n        return false;\n    }\n    const grandParent = $from.node(-1);\n    if (grandParent.type !== type) {\n        return false;\n    }\n    const extensionAttributes = editor.extensionManager.attributes;\n    if ($from.parent.content.size === 0 && $from.node(-1).childCount === $from.indexAfter(-1)) {\n        // In an empty block. If this is a nested list, the wrapping\n        // list item should be split. Otherwise, bail out and let next\n        // command handle lifting.\n        if ($from.depth === 2\n            || $from.node(-3).type !== type\n            || $from.index(-2) !== $from.node(-2).childCount - 1) {\n            return false;\n        }\n        if (dispatch) {\n            let wrap = Fragment.empty;\n            // eslint-disable-next-line\n            const depthBefore = $from.index(-1) ? 1 : $from.index(-2) ? 2 : 3;\n            // Build a fragment containing empty versions of the structure\n            // from the outer list item to the parent node of the cursor\n            for (let d = $from.depth - depthBefore; d >= $from.depth - 3; d -= 1) {\n                wrap = Fragment.from($from.node(d).copy(wrap));\n            }\n            // eslint-disable-next-line\n            const depthAfter = $from.indexAfter(-1) < $from.node(-2).childCount ? 1 : $from.indexAfter(-2) < $from.node(-3).childCount ? 2 : 3;\n            // Add a second list item with an empty default start node\n            const newNextTypeAttributes = getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs);\n            const nextType = ((_a = type.contentMatch.defaultType) === null || _a === void 0 ? void 0 : _a.createAndFill(newNextTypeAttributes)) || undefined;\n            wrap = wrap.append(Fragment.from(type.createAndFill(null, nextType) || undefined));\n            const start = $from.before($from.depth - (depthBefore - 1));\n            tr.replace(start, $from.after(-depthAfter), new Slice(wrap, 4 - depthBefore, 0));\n            let sel = -1;\n            tr.doc.nodesBetween(start, tr.doc.content.size, (n, pos) => {\n                if (sel > -1) {\n                    return false;\n                }\n                if (n.isTextblock && n.content.size === 0) {\n                    sel = pos + 1;\n                }\n            });\n            if (sel > -1) {\n                tr.setSelection(TextSelection.near(tr.doc.resolve(sel)));\n            }\n            tr.scrollIntoView();\n        }\n        return true;\n    }\n    const nextType = $to.pos === $from.end() ? grandParent.contentMatchAt(0).defaultType : null;\n    const newTypeAttributes = getSplittedAttributes(extensionAttributes, grandParent.type.name, grandParent.attrs);\n    const newNextTypeAttributes = getSplittedAttributes(extensionAttributes, $from.node().type.name, $from.node().attrs);\n    tr.delete($from.pos, $to.pos);\n    const types = nextType\n        ? [\n            { type, attrs: newTypeAttributes },\n            { type: nextType, attrs: newNextTypeAttributes },\n        ]\n        : [{ type, attrs: newTypeAttributes }];\n    if (!canSplit(tr.doc, $from.pos, 2)) {\n        return false;\n    }\n    if (dispatch) {\n        const { selection, storedMarks } = state;\n        const { splittableMarks } = editor.extensionManager;\n        const marks = storedMarks || (selection.$to.parentOffset && selection.$from.marks());\n        tr.split($from.pos, 2, types).scrollIntoView();\n        if (!marks || !dispatch) {\n            return true;\n        }\n        const filteredMarks = marks.filter(mark => splittableMarks.includes(mark.type.name));\n        tr.ensureMarks(filteredMarks);\n    }\n    return true;\n};\n\nconst joinListBackwards = (tr, listType) => {\n    const list = findParentNode(node => node.type === listType)(tr.selection);\n    if (!list) {\n        return true;\n    }\n    const before = tr.doc.resolve(Math.max(0, list.pos - 1)).before(list.depth);\n    if (before === undefined) {\n        return true;\n    }\n    const nodeBefore = tr.doc.nodeAt(before);\n    const canJoinBackwards = list.node.type === (nodeBefore === null || nodeBefore === void 0 ? void 0 : nodeBefore.type) && canJoin(tr.doc, list.pos);\n    if (!canJoinBackwards) {\n        return true;\n    }\n    tr.join(list.pos);\n    return true;\n};\nconst joinListForwards = (tr, listType) => {\n    const list = findParentNode(node => node.type === listType)(tr.selection);\n    if (!list) {\n        return true;\n    }\n    const after = tr.doc.resolve(list.start).after(list.depth);\n    if (after === undefined) {\n        return true;\n    }\n    const nodeAfter = tr.doc.nodeAt(after);\n    const canJoinForwards = list.node.type === (nodeAfter === null || nodeAfter === void 0 ? void 0 : nodeAfter.type) && canJoin(tr.doc, after);\n    if (!canJoinForwards) {\n        return true;\n    }\n    tr.join(after);\n    return true;\n};\nconst toggleList = (listTypeOrName, itemTypeOrName, keepMarks, attributes = {}) => ({ editor, tr, state, dispatch, chain, commands, can, }) => {\n    const { extensions, splittableMarks } = editor.extensionManager;\n    const listType = getNodeType(listTypeOrName, state.schema);\n    const itemType = getNodeType(itemTypeOrName, state.schema);\n    const { selection, storedMarks } = state;\n    const { $from, $to } = selection;\n    const range = $from.blockRange($to);\n    const marks = storedMarks || (selection.$to.parentOffset && selection.$from.marks());\n    if (!range) {\n        return false;\n    }\n    const parentList = findParentNode(node => isList(node.type.name, extensions))(selection);\n    if (range.depth >= 1 && parentList && range.depth - parentList.depth <= 1) {\n        // remove list\n        if (parentList.node.type === listType) {\n            return commands.liftListItem(itemType);\n        }\n        // change list type\n        if (isList(parentList.node.type.name, extensions)\n            && listType.validContent(parentList.node.content)\n            && dispatch) {\n            return chain()\n                .command(() => {\n                tr.setNodeMarkup(parentList.pos, listType);\n                return true;\n            })\n                .command(() => joinListBackwards(tr, listType))\n                .command(() => joinListForwards(tr, listType))\n                .run();\n        }\n    }\n    if (!keepMarks || !marks || !dispatch) {\n        return chain()\n            // try to convert node to default node if needed\n            .command(() => {\n            const canWrapInList = can().wrapInList(listType, attributes);\n            if (canWrapInList) {\n                return true;\n            }\n            return commands.clearNodes();\n        })\n            .wrapInList(listType, attributes)\n            .command(() => joinListBackwards(tr, listType))\n            .command(() => joinListForwards(tr, listType))\n            .run();\n    }\n    return (chain()\n        // try to convert node to default node if needed\n        .command(() => {\n        const canWrapInList = can().wrapInList(listType, attributes);\n        const filteredMarks = marks.filter(mark => splittableMarks.includes(mark.type.name));\n        tr.ensureMarks(filteredMarks);\n        if (canWrapInList) {\n            return true;\n        }\n        return commands.clearNodes();\n    })\n        .wrapInList(listType, attributes)\n        .command(() => joinListBackwards(tr, listType))\n        .command(() => joinListForwards(tr, listType))\n        .run());\n};\n\nconst toggleMark = (typeOrName, attributes = {}, options = {}) => ({ state, commands }) => {\n    const { extendEmptyMarkRange = false } = options;\n    const type = getMarkType(typeOrName, state.schema);\n    const isActive = isMarkActive(state, type, attributes);\n    if (isActive) {\n        return commands.unsetMark(type, { extendEmptyMarkRange });\n    }\n    return commands.setMark(type, attributes);\n};\n\nconst toggleNode = (typeOrName, toggleTypeOrName, attributes = {}) => ({ state, commands }) => {\n    const type = getNodeType(typeOrName, state.schema);\n    const toggleType = getNodeType(toggleTypeOrName, state.schema);\n    const isActive = isNodeActive(state, type, attributes);\n    if (isActive) {\n        return commands.setNode(toggleType);\n    }\n    return commands.setNode(type, attributes);\n};\n\nconst toggleWrap = (typeOrName, attributes = {}) => ({ state, commands }) => {\n    const type = getNodeType(typeOrName, state.schema);\n    const isActive = isNodeActive(state, type, attributes);\n    if (isActive) {\n        return commands.lift(type);\n    }\n    return commands.wrapIn(type, attributes);\n};\n\nconst undoInputRule = () => ({ state, dispatch }) => {\n    const plugins = state.plugins;\n    for (let i = 0; i < plugins.length; i += 1) {\n        const plugin = plugins[i];\n        let undoable;\n        // @ts-ignore\n        // eslint-disable-next-line\n        if (plugin.spec.isInputRules && (undoable = plugin.getState(state))) {\n            if (dispatch) {\n                const tr = state.tr;\n                const toUndo = undoable.transform;\n                for (let j = toUndo.steps.length - 1; j >= 0; j -= 1) {\n                    tr.step(toUndo.steps[j].invert(toUndo.docs[j]));\n                }\n                if (undoable.text) {\n                    const marks = tr.doc.resolve(undoable.from).marks();\n                    tr.replaceWith(undoable.from, undoable.to, state.schema.text(undoable.text, marks));\n                }\n                else {\n                    tr.delete(undoable.from, undoable.to);\n                }\n            }\n            return true;\n        }\n    }\n    return false;\n};\n\nconst unsetAllMarks = () => ({ tr, dispatch }) => {\n    const { selection } = tr;\n    const { empty, ranges } = selection;\n    if (empty) {\n        return true;\n    }\n    if (dispatch) {\n        ranges.forEach(range => {\n            tr.removeMark(range.$from.pos, range.$to.pos);\n        });\n    }\n    return true;\n};\n\nconst unsetMark = (typeOrName, options = {}) => ({ tr, state, dispatch }) => {\n    var _a;\n    const { extendEmptyMarkRange = false } = options;\n    const { selection } = tr;\n    const type = getMarkType(typeOrName, state.schema);\n    const { $from, empty, ranges } = selection;\n    if (!dispatch) {\n        return true;\n    }\n    if (empty && extendEmptyMarkRange) {\n        let { from, to } = selection;\n        const attrs = (_a = $from.marks().find(mark => mark.type === type)) === null || _a === void 0 ? void 0 : _a.attrs;\n        const range = getMarkRange($from, type, attrs);\n        if (range) {\n            from = range.from;\n            to = range.to;\n        }\n        tr.removeMark(from, to, type);\n    }\n    else {\n        ranges.forEach(range => {\n            tr.removeMark(range.$from.pos, range.$to.pos, type);\n        });\n    }\n    tr.removeStoredMark(type);\n    return true;\n};\n\nconst updateAttributes = (typeOrName, attributes = {}) => ({ tr, state, dispatch }) => {\n    let nodeType = null;\n    let markType = null;\n    const schemaType = getSchemaTypeNameByName(typeof typeOrName === 'string' ? typeOrName : typeOrName.name, state.schema);\n    if (!schemaType) {\n        return false;\n    }\n    if (schemaType === 'node') {\n        nodeType = getNodeType(typeOrName, state.schema);\n    }\n    if (schemaType === 'mark') {\n        markType = getMarkType(typeOrName, state.schema);\n    }\n    if (dispatch) {\n        tr.selection.ranges.forEach(range => {\n            const from = range.$from.pos;\n            const to = range.$to.pos;\n            state.doc.nodesBetween(from, to, (node, pos) => {\n                if (nodeType && nodeType === node.type) {\n                    tr.setNodeMarkup(pos, undefined, {\n                        ...node.attrs,\n                        ...attributes,\n                    });\n                }\n                if (markType && node.marks.length) {\n                    node.marks.forEach(mark => {\n                        if (markType === mark.type) {\n                            const trimmedFrom = Math.max(pos, from);\n                            const trimmedTo = Math.min(pos + node.nodeSize, to);\n                            tr.addMark(trimmedFrom, trimmedTo, markType.create({\n                                ...mark.attrs,\n                                ...attributes,\n                            }));\n                        }\n                    });\n                }\n            });\n        });\n    }\n    return true;\n};\n\nconst wrapIn = (typeOrName, attributes = {}) => ({ state, dispatch }) => {\n    const type = getNodeType(typeOrName, state.schema);\n    return wrapIn$1(type, attributes)(state, dispatch);\n};\n\nconst wrapInList = (typeOrName, attributes = {}) => ({ state, dispatch }) => {\n    const type = getNodeType(typeOrName, state.schema);\n    return wrapInList$1(type, attributes)(state, dispatch);\n};\n\nvar commands = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  blur: blur,\n  clearContent: clearContent,\n  clearNodes: clearNodes,\n  command: command,\n  createParagraphNear: createParagraphNear,\n  cut: cut,\n  deleteCurrentNode: deleteCurrentNode,\n  deleteNode: deleteNode,\n  deleteRange: deleteRange,\n  deleteSelection: deleteSelection,\n  enter: enter,\n  exitCode: exitCode,\n  extendMarkRange: extendMarkRange,\n  first: first,\n  focus: focus,\n  forEach: forEach,\n  insertContent: insertContent,\n  insertContentAt: insertContentAt,\n  joinBackward: joinBackward,\n  joinDown: joinDown,\n  joinForward: joinForward,\n  joinItemBackward: joinItemBackward,\n  joinItemForward: joinItemForward,\n  joinTextblockBackward: joinTextblockBackward,\n  joinTextblockForward: joinTextblockForward,\n  joinUp: joinUp,\n  keyboardShortcut: keyboardShortcut,\n  lift: lift,\n  liftEmptyBlock: liftEmptyBlock,\n  liftListItem: liftListItem,\n  newlineInCode: newlineInCode,\n  resetAttributes: resetAttributes,\n  scrollIntoView: scrollIntoView,\n  selectAll: selectAll,\n  selectNodeBackward: selectNodeBackward,\n  selectNodeForward: selectNodeForward,\n  selectParentNode: selectParentNode,\n  selectTextblockEnd: selectTextblockEnd,\n  selectTextblockStart: selectTextblockStart,\n  setContent: setContent,\n  setMark: setMark,\n  setMeta: setMeta,\n  setNode: setNode,\n  setNodeSelection: setNodeSelection,\n  setTextSelection: setTextSelection,\n  sinkListItem: sinkListItem,\n  splitBlock: splitBlock,\n  splitListItem: splitListItem,\n  toggleList: toggleList,\n  toggleMark: toggleMark,\n  toggleNode: toggleNode,\n  toggleWrap: toggleWrap,\n  undoInputRule: undoInputRule,\n  unsetAllMarks: unsetAllMarks,\n  unsetMark: unsetMark,\n  updateAttributes: updateAttributes,\n  wrapIn: wrapIn,\n  wrapInList: wrapInList\n});\n\nconst Commands = Extension.create({\n    name: 'commands',\n    addCommands() {\n        return {\n            ...commands,\n        };\n    },\n});\n\nconst Editable = Extension.create({\n    name: 'editable',\n    addProseMirrorPlugins() {\n        return [\n            new Plugin({\n                key: new PluginKey('editable'),\n                props: {\n                    editable: () => this.editor.options.editable,\n                },\n            }),\n        ];\n    },\n});\n\nconst FocusEvents = Extension.create({\n    name: 'focusEvents',\n    addProseMirrorPlugins() {\n        const { editor } = this;\n        return [\n            new Plugin({\n                key: new PluginKey('focusEvents'),\n                props: {\n                    handleDOMEvents: {\n                        focus: (view, event) => {\n                            editor.isFocused = true;\n                            const transaction = editor.state.tr\n                                .setMeta('focus', { event })\n                                .setMeta('addToHistory', false);\n                            view.dispatch(transaction);\n                            return false;\n                        },\n                        blur: (view, event) => {\n                            editor.isFocused = false;\n                            const transaction = editor.state.tr\n                                .setMeta('blur', { event })\n                                .setMeta('addToHistory', false);\n                            view.dispatch(transaction);\n                            return false;\n                        },\n                    },\n                },\n            }),\n        ];\n    },\n});\n\nconst Keymap = Extension.create({\n    name: 'keymap',\n    addKeyboardShortcuts() {\n        const handleBackspace = () => this.editor.commands.first(({ commands }) => [\n            () => commands.undoInputRule(),\n            // maybe convert first text block node to default node\n            () => commands.command(({ tr }) => {\n                const { selection, doc } = tr;\n                const { empty, $anchor } = selection;\n                const { pos, parent } = $anchor;\n                const $parentPos = $anchor.parent.isTextblock && pos > 0 ? tr.doc.resolve(pos - 1) : $anchor;\n                const parentIsIsolating = $parentPos.parent.type.spec.isolating;\n                const parentPos = $anchor.pos - $anchor.parentOffset;\n                const isAtStart = (parentIsIsolating && $parentPos.parent.childCount === 1)\n                    ? parentPos === $anchor.pos\n                    : Selection.atStart(doc).from === pos;\n                if (!empty\n                    || !parent.type.isTextblock\n                    || parent.textContent.length\n                    || !isAtStart\n                    || (isAtStart && $anchor.parent.type.name === 'paragraph') // prevent clearNodes when no nodes to clear, otherwise history stack is appended\n                ) {\n                    return false;\n                }\n                return commands.clearNodes();\n            }),\n            () => commands.deleteSelection(),\n            () => commands.joinBackward(),\n            () => commands.selectNodeBackward(),\n        ]);\n        const handleDelete = () => this.editor.commands.first(({ commands }) => [\n            () => commands.deleteSelection(),\n            () => commands.deleteCurrentNode(),\n            () => commands.joinForward(),\n            () => commands.selectNodeForward(),\n        ]);\n        const handleEnter = () => this.editor.commands.first(({ commands }) => [\n            () => commands.newlineInCode(),\n            () => commands.createParagraphNear(),\n            () => commands.liftEmptyBlock(),\n            () => commands.splitBlock(),\n        ]);\n        const baseKeymap = {\n            Enter: handleEnter,\n            'Mod-Enter': () => this.editor.commands.exitCode(),\n            Backspace: handleBackspace,\n            'Mod-Backspace': handleBackspace,\n            'Shift-Backspace': handleBackspace,\n            Delete: handleDelete,\n            'Mod-Delete': handleDelete,\n            'Mod-a': () => this.editor.commands.selectAll(),\n        };\n        const pcKeymap = {\n            ...baseKeymap,\n        };\n        const macKeymap = {\n            ...baseKeymap,\n            'Ctrl-h': handleBackspace,\n            'Alt-Backspace': handleBackspace,\n            'Ctrl-d': handleDelete,\n            'Ctrl-Alt-Backspace': handleDelete,\n            'Alt-Delete': handleDelete,\n            'Alt-d': handleDelete,\n            'Ctrl-a': () => this.editor.commands.selectTextblockStart(),\n            'Ctrl-e': () => this.editor.commands.selectTextblockEnd(),\n        };\n        if (isiOS() || isMacOS()) {\n            return macKeymap;\n        }\n        return pcKeymap;\n    },\n    addProseMirrorPlugins() {\n        return [\n            // With this plugin we check if the whole document was selected and deleted.\n            // In this case we will additionally call `clearNodes()` to convert e.g. a heading\n            // to a paragraph if necessary.\n            // This is an alternative to ProseMirror's `AllSelection`, which doesn’t work well\n            // with many other commands.\n            new Plugin({\n                key: new PluginKey('clearDocument'),\n                appendTransaction: (transactions, oldState, newState) => {\n                    const docChanges = transactions.some(transaction => transaction.docChanged)\n                        && !oldState.doc.eq(newState.doc);\n                    if (!docChanges) {\n                        return;\n                    }\n                    const { empty, from, to } = oldState.selection;\n                    const allFrom = Selection.atStart(oldState.doc).from;\n                    const allEnd = Selection.atEnd(oldState.doc).to;\n                    const allWasSelected = from === allFrom && to === allEnd;\n                    if (empty || !allWasSelected) {\n                        return;\n                    }\n                    const isEmpty = newState.doc.textBetween(0, newState.doc.content.size, ' ', ' ').length === 0;\n                    if (!isEmpty) {\n                        return;\n                    }\n                    const tr = newState.tr;\n                    const state = createChainableState({\n                        state: newState,\n                        transaction: tr,\n                    });\n                    const { commands } = new CommandManager({\n                        editor: this.editor,\n                        state,\n                    });\n                    commands.clearNodes();\n                    if (!tr.steps.length) {\n                        return;\n                    }\n                    return tr;\n                },\n            }),\n        ];\n    },\n});\n\nconst Tabindex = Extension.create({\n    name: 'tabindex',\n    addProseMirrorPlugins() {\n        return [\n            new Plugin({\n                key: new PluginKey('tabindex'),\n                props: {\n                    attributes: () => (this.editor.isEditable ? { tabindex: '0' } : {}),\n                },\n            }),\n        ];\n    },\n});\n\nvar index = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  ClipboardTextSerializer: ClipboardTextSerializer,\n  Commands: Commands,\n  Editable: Editable,\n  FocusEvents: FocusEvents,\n  Keymap: Keymap,\n  Tabindex: Tabindex\n});\n\nclass NodePos {\n    get name() {\n        return this.node.type.name;\n    }\n    constructor(pos, editor, isBlock = false, node = null) {\n        this.currentNode = null;\n        this.actualDepth = null;\n        this.isBlock = isBlock;\n        this.resolvedPos = pos;\n        this.editor = editor;\n        this.currentNode = node;\n    }\n    get node() {\n        return this.currentNode || this.resolvedPos.node();\n    }\n    get element() {\n        return this.editor.view.domAtPos(this.pos).node;\n    }\n    get depth() {\n        var _a;\n        return (_a = this.actualDepth) !== null && _a !== void 0 ? _a : this.resolvedPos.depth;\n    }\n    get pos() {\n        return this.resolvedPos.pos;\n    }\n    get content() {\n        return this.node.content;\n    }\n    set content(content) {\n        let from = this.from;\n        let to = this.to;\n        if (this.isBlock) {\n            if (this.content.size === 0) {\n                console.error(`You can’t set content on a block node. Tried to set content on ${this.name} at ${this.pos}`);\n                return;\n            }\n            from = this.from + 1;\n            to = this.to - 1;\n        }\n        this.editor.commands.insertContentAt({ from, to }, content);\n    }\n    get attributes() {\n        return this.node.attrs;\n    }\n    get textContent() {\n        return this.node.textContent;\n    }\n    get size() {\n        return this.node.nodeSize;\n    }\n    get from() {\n        if (this.isBlock) {\n            return this.pos;\n        }\n        return this.resolvedPos.start(this.resolvedPos.depth);\n    }\n    get range() {\n        return {\n            from: this.from,\n            to: this.to,\n        };\n    }\n    get to() {\n        if (this.isBlock) {\n            return this.pos + this.size;\n        }\n        return this.resolvedPos.end(this.resolvedPos.depth) + (this.node.isText ? 0 : 1);\n    }\n    get parent() {\n        if (this.depth === 0) {\n            return null;\n        }\n        const parentPos = this.resolvedPos.start(this.resolvedPos.depth - 1);\n        const $pos = this.resolvedPos.doc.resolve(parentPos);\n        return new NodePos($pos, this.editor);\n    }\n    get before() {\n        let $pos = this.resolvedPos.doc.resolve(this.from - (this.isBlock ? 1 : 2));\n        if ($pos.depth !== this.depth) {\n            $pos = this.resolvedPos.doc.resolve(this.from - 3);\n        }\n        return new NodePos($pos, this.editor);\n    }\n    get after() {\n        let $pos = this.resolvedPos.doc.resolve(this.to + (this.isBlock ? 2 : 1));\n        if ($pos.depth !== this.depth) {\n            $pos = this.resolvedPos.doc.resolve(this.to + 3);\n        }\n        return new NodePos($pos, this.editor);\n    }\n    get children() {\n        const children = [];\n        this.node.content.forEach((node, offset) => {\n            const isBlock = node.isBlock && !node.isTextblock;\n            const targetPos = this.pos + offset + 1;\n            const $pos = this.resolvedPos.doc.resolve(targetPos);\n            if (!isBlock && $pos.depth <= this.depth) {\n                return;\n            }\n            const childNodePos = new NodePos($pos, this.editor, isBlock, isBlock ? node : null);\n            if (isBlock) {\n                childNodePos.actualDepth = this.depth + 1;\n            }\n            children.push(new NodePos($pos, this.editor, isBlock, isBlock ? node : null));\n        });\n        return children;\n    }\n    get firstChild() {\n        return this.children[0] || null;\n    }\n    get lastChild() {\n        const children = this.children;\n        return children[children.length - 1] || null;\n    }\n    closest(selector, attributes = {}) {\n        let node = null;\n        let currentNode = this.parent;\n        while (currentNode && !node) {\n            if (currentNode.node.type.name === selector) {\n                if (Object.keys(attributes).length > 0) {\n                    const nodeAttributes = currentNode.node.attrs;\n                    const attrKeys = Object.keys(attributes);\n                    for (let index = 0; index < attrKeys.length; index += 1) {\n                        const key = attrKeys[index];\n                        if (nodeAttributes[key] !== attributes[key]) {\n                            break;\n                        }\n                    }\n                }\n                else {\n                    node = currentNode;\n                }\n            }\n            currentNode = currentNode.parent;\n        }\n        return node;\n    }\n    querySelector(selector, attributes = {}) {\n        return this.querySelectorAll(selector, attributes, true)[0] || null;\n    }\n    querySelectorAll(selector, attributes = {}, firstItemOnly = false) {\n        let nodes = [];\n        if (!this.children || this.children.length === 0) {\n            return nodes;\n        }\n        const attrKeys = Object.keys(attributes);\n        /**\n         * Finds all children recursively that match the selector and attributes\n         * If firstItemOnly is true, it will return the first item found\n         */\n        this.children.forEach(childPos => {\n            // If we already found a node and we only want the first item, we dont need to keep going\n            if (firstItemOnly && nodes.length > 0) {\n                return;\n            }\n            if (childPos.node.type.name === selector) {\n                const doesAllAttributesMatch = attrKeys.every(key => attributes[key] === childPos.node.attrs[key]);\n                if (doesAllAttributesMatch) {\n                    nodes.push(childPos);\n                }\n            }\n            // If we already found a node and we only want the first item, we can stop here and skip the recursion\n            if (firstItemOnly && nodes.length > 0) {\n                return;\n            }\n            nodes = nodes.concat(childPos.querySelectorAll(selector, attributes, firstItemOnly));\n        });\n        return nodes;\n    }\n    setAttribute(attributes) {\n        const oldSelection = this.editor.state.selection;\n        this.editor.chain().setTextSelection(this.from).updateAttributes(this.node.type.name, attributes).setTextSelection(oldSelection.from)\n            .run();\n    }\n}\n\nconst style = `.ProseMirror {\n  position: relative;\n}\n\n.ProseMirror {\n  word-wrap: break-word;\n  white-space: pre-wrap;\n  white-space: break-spaces;\n  -webkit-font-variant-ligatures: none;\n  font-variant-ligatures: none;\n  font-feature-settings: \"liga\" 0; /* the above doesn't seem to work in Edge */\n}\n\n.ProseMirror [contenteditable=\"false\"] {\n  white-space: normal;\n}\n\n.ProseMirror [contenteditable=\"false\"] [contenteditable=\"true\"] {\n  white-space: pre-wrap;\n}\n\n.ProseMirror pre {\n  white-space: pre-wrap;\n}\n\nimg.ProseMirror-separator {\n  display: inline !important;\n  border: none !important;\n  margin: 0 !important;\n  width: 1px !important;\n  height: 1px !important;\n}\n\n.ProseMirror-gapcursor {\n  display: none;\n  pointer-events: none;\n  position: absolute;\n  margin: 0;\n}\n\n.ProseMirror-gapcursor:after {\n  content: \"\";\n  display: block;\n  position: absolute;\n  top: -2px;\n  width: 20px;\n  border-top: 1px solid black;\n  animation: ProseMirror-cursor-blink 1.1s steps(2, start) infinite;\n}\n\n@keyframes ProseMirror-cursor-blink {\n  to {\n    visibility: hidden;\n  }\n}\n\n.ProseMirror-hideselection *::selection {\n  background: transparent;\n}\n\n.ProseMirror-hideselection *::-moz-selection {\n  background: transparent;\n}\n\n.ProseMirror-hideselection * {\n  caret-color: transparent;\n}\n\n.ProseMirror-focused .ProseMirror-gapcursor {\n  display: block;\n}\n\n.tippy-box[data-animation=fade][data-state=hidden] {\n  opacity: 0\n}`;\n\nfunction createStyleTag(style, nonce, suffix) {\n    const tiptapStyleTag = document.querySelector(`style[data-tiptap-style${suffix ? `-${suffix}` : ''}]`);\n    if (tiptapStyleTag !== null) {\n        return tiptapStyleTag;\n    }\n    const styleNode = document.createElement('style');\n    if (nonce) {\n        styleNode.setAttribute('nonce', nonce);\n    }\n    styleNode.setAttribute(`data-tiptap-style${suffix ? `-${suffix}` : ''}`, '');\n    styleNode.innerHTML = style;\n    document.getElementsByTagName('head')[0].appendChild(styleNode);\n    return styleNode;\n}\n\nclass Editor extends EventEmitter {\n    constructor(options = {}) {\n        super();\n        this.isFocused = false;\n        this.extensionStorage = {};\n        this.options = {\n            element: document.createElement('div'),\n            content: '',\n            injectCSS: true,\n            injectNonce: undefined,\n            extensions: [],\n            autofocus: false,\n            editable: true,\n            editorProps: {},\n            parseOptions: {},\n            coreExtensionOptions: {},\n            enableInputRules: true,\n            enablePasteRules: true,\n            enableCoreExtensions: true,\n            enableContentCheck: false,\n            onBeforeCreate: () => null,\n            onCreate: () => null,\n            onUpdate: () => null,\n            onSelectionUpdate: () => null,\n            onTransaction: () => null,\n            onFocus: () => null,\n            onBlur: () => null,\n            onDestroy: () => null,\n            onContentError: ({ error }) => { throw error; },\n        };\n        this.isCapturingTransaction = false;\n        this.capturedTransaction = null;\n        this.setOptions(options);\n        this.createExtensionManager();\n        this.createCommandManager();\n        this.createSchema();\n        this.on('beforeCreate', this.options.onBeforeCreate);\n        this.emit('beforeCreate', { editor: this });\n        this.on('contentError', this.options.onContentError);\n        this.createView();\n        this.injectCSS();\n        this.on('create', this.options.onCreate);\n        this.on('update', this.options.onUpdate);\n        this.on('selectionUpdate', this.options.onSelectionUpdate);\n        this.on('transaction', this.options.onTransaction);\n        this.on('focus', this.options.onFocus);\n        this.on('blur', this.options.onBlur);\n        this.on('destroy', this.options.onDestroy);\n        window.setTimeout(() => {\n            if (this.isDestroyed) {\n                return;\n            }\n            this.commands.focus(this.options.autofocus);\n            this.emit('create', { editor: this });\n        }, 0);\n    }\n    /**\n     * Returns the editor storage.\n     */\n    get storage() {\n        return this.extensionStorage;\n    }\n    /**\n     * An object of all registered commands.\n     */\n    get commands() {\n        return this.commandManager.commands;\n    }\n    /**\n     * Create a command chain to call multiple commands at once.\n     */\n    chain() {\n        return this.commandManager.chain();\n    }\n    /**\n     * Check if a command or a command chain can be executed. Without executing it.\n     */\n    can() {\n        return this.commandManager.can();\n    }\n    /**\n     * Inject CSS styles.\n     */\n    injectCSS() {\n        if (this.options.injectCSS && document) {\n            this.css = createStyleTag(style, this.options.injectNonce);\n        }\n    }\n    /**\n     * Update editor options.\n     *\n     * @param options A list of options\n     */\n    setOptions(options = {}) {\n        this.options = {\n            ...this.options,\n            ...options,\n        };\n        if (!this.view || !this.state || this.isDestroyed) {\n            return;\n        }\n        if (this.options.editorProps) {\n            this.view.setProps(this.options.editorProps);\n        }\n        this.view.updateState(this.state);\n    }\n    /**\n     * Update editable state of the editor.\n     */\n    setEditable(editable, emitUpdate = true) {\n        this.setOptions({ editable });\n        if (emitUpdate) {\n            this.emit('update', { editor: this, transaction: this.state.tr });\n        }\n    }\n    /**\n     * Returns whether the editor is editable.\n     */\n    get isEditable() {\n        // since plugins are applied after creating the view\n        // `editable` is always `true` for one tick.\n        // that’s why we also have to check for `options.editable`\n        return this.options.editable && this.view && this.view.editable;\n    }\n    /**\n     * Returns the editor state.\n     */\n    get state() {\n        return this.view.state;\n    }\n    /**\n     * Register a ProseMirror plugin.\n     *\n     * @param plugin A ProseMirror plugin\n     * @param handlePlugins Control how to merge the plugin into the existing plugins.\n     */\n    registerPlugin(plugin, handlePlugins) {\n        const plugins = isFunction(handlePlugins)\n            ? handlePlugins(plugin, [...this.state.plugins])\n            : [...this.state.plugins, plugin];\n        const state = this.state.reconfigure({ plugins });\n        this.view.updateState(state);\n    }\n    /**\n     * Unregister a ProseMirror plugin.\n     *\n     * @param nameOrPluginKey The plugins name\n     */\n    unregisterPlugin(nameOrPluginKey) {\n        if (this.isDestroyed) {\n            return;\n        }\n        // @ts-ignore\n        const name = typeof nameOrPluginKey === 'string' ? `${nameOrPluginKey}$` : nameOrPluginKey.key;\n        const state = this.state.reconfigure({\n            // @ts-ignore\n            plugins: this.state.plugins.filter(plugin => !plugin.key.startsWith(name)),\n        });\n        this.view.updateState(state);\n    }\n    /**\n     * Creates an extension manager.\n     */\n    createExtensionManager() {\n        var _a, _b;\n        const coreExtensions = this.options.enableCoreExtensions ? [\n            Editable,\n            ClipboardTextSerializer.configure({\n                blockSeparator: (_b = (_a = this.options.coreExtensionOptions) === null || _a === void 0 ? void 0 : _a.clipboardTextSerializer) === null || _b === void 0 ? void 0 : _b.blockSeparator,\n            }),\n            Commands,\n            FocusEvents,\n            Keymap,\n            Tabindex,\n        ] : [];\n        const allExtensions = [...coreExtensions, ...this.options.extensions].filter(extension => {\n            return ['extension', 'node', 'mark'].includes(extension === null || extension === void 0 ? void 0 : extension.type);\n        });\n        this.extensionManager = new ExtensionManager(allExtensions, this);\n    }\n    /**\n     * Creates an command manager.\n     */\n    createCommandManager() {\n        this.commandManager = new CommandManager({\n            editor: this,\n        });\n    }\n    /**\n     * Creates a ProseMirror schema.\n     */\n    createSchema() {\n        this.schema = this.extensionManager.schema;\n    }\n    /**\n     * Creates a ProseMirror view.\n     */\n    createView() {\n        let doc;\n        try {\n            doc = createDocument(this.options.content, this.schema, this.options.parseOptions, { errorOnInvalidContent: this.options.enableContentCheck });\n        }\n        catch (e) {\n            if (!(e instanceof Error) || !['[tiptap error]: Invalid JSON content', '[tiptap error]: Invalid HTML content'].includes(e.message)) {\n                // Not the content error we were expecting\n                throw e;\n            }\n            this.emit('contentError', {\n                editor: this,\n                error: e,\n                disableCollaboration: () => {\n                    // To avoid syncing back invalid content, reinitialize the extensions without the collaboration extension\n                    this.options.extensions = this.options.extensions.filter(extension => extension.name !== 'collaboration');\n                    // Restart the initialization process by recreating the extension manager with the new set of extensions\n                    this.createExtensionManager();\n                },\n            });\n            // Content is invalid, but attempt to create it anyway, stripping out the invalid parts\n            doc = createDocument(this.options.content, this.schema, this.options.parseOptions, { errorOnInvalidContent: false });\n        }\n        const selection = resolveFocusPosition(doc, this.options.autofocus);\n        this.view = new EditorView(this.options.element, {\n            ...this.options.editorProps,\n            dispatchTransaction: this.dispatchTransaction.bind(this),\n            state: EditorState.create({\n                doc,\n                selection: selection || undefined,\n            }),\n        });\n        // `editor.view` is not yet available at this time.\n        // Therefore we will add all plugins and node views directly afterwards.\n        const newState = this.state.reconfigure({\n            plugins: this.extensionManager.plugins,\n        });\n        this.view.updateState(newState);\n        this.createNodeViews();\n        this.prependClass();\n        // Let’s store the editor instance in the DOM element.\n        // So we’ll have access to it for tests.\n        const dom = this.view.dom;\n        dom.editor = this;\n    }\n    /**\n     * Creates all node views.\n     */\n    createNodeViews() {\n        this.view.setProps({\n            nodeViews: this.extensionManager.nodeViews,\n        });\n    }\n    /**\n     * Prepend class name to element.\n     */\n    prependClass() {\n        this.view.dom.className = `tiptap ${this.view.dom.className}`;\n    }\n    captureTransaction(fn) {\n        this.isCapturingTransaction = true;\n        fn();\n        this.isCapturingTransaction = false;\n        const tr = this.capturedTransaction;\n        this.capturedTransaction = null;\n        return tr;\n    }\n    /**\n     * The callback over which to send transactions (state updates) produced by the view.\n     *\n     * @param transaction An editor state transaction\n     */\n    dispatchTransaction(transaction) {\n        // if the editor / the view of the editor was destroyed\n        // the transaction should not be dispatched as there is no view anymore.\n        if (this.view.isDestroyed) {\n            return;\n        }\n        if (this.isCapturingTransaction) {\n            if (!this.capturedTransaction) {\n                this.capturedTransaction = transaction;\n                return;\n            }\n            transaction.steps.forEach(step => { var _a; return (_a = this.capturedTransaction) === null || _a === void 0 ? void 0 : _a.step(step); });\n            return;\n        }\n        const state = this.state.apply(transaction);\n        const selectionHasChanged = !this.state.selection.eq(state.selection);\n        this.view.updateState(state);\n        this.emit('transaction', {\n            editor: this,\n            transaction,\n        });\n        if (selectionHasChanged) {\n            this.emit('selectionUpdate', {\n                editor: this,\n                transaction,\n            });\n        }\n        const focus = transaction.getMeta('focus');\n        const blur = transaction.getMeta('blur');\n        if (focus) {\n            this.emit('focus', {\n                editor: this,\n                event: focus.event,\n                transaction,\n            });\n        }\n        if (blur) {\n            this.emit('blur', {\n                editor: this,\n                event: blur.event,\n                transaction,\n            });\n        }\n        if (!transaction.docChanged || transaction.getMeta('preventUpdate')) {\n            return;\n        }\n        this.emit('update', {\n            editor: this,\n            transaction,\n        });\n    }\n    /**\n     * Get attributes of the currently selected node or mark.\n     */\n    getAttributes(nameOrType) {\n        return getAttributes(this.state, nameOrType);\n    }\n    isActive(nameOrAttributes, attributesOrUndefined) {\n        const name = typeof nameOrAttributes === 'string' ? nameOrAttributes : null;\n        const attributes = typeof nameOrAttributes === 'string' ? attributesOrUndefined : nameOrAttributes;\n        return isActive(this.state, name, attributes);\n    }\n    /**\n     * Get the document as JSON.\n     */\n    getJSON() {\n        return this.state.doc.toJSON();\n    }\n    /**\n     * Get the document as HTML.\n     */\n    getHTML() {\n        return getHTMLFromFragment(this.state.doc.content, this.schema);\n    }\n    /**\n     * Get the document as text.\n     */\n    getText(options) {\n        const { blockSeparator = '\\n\\n', textSerializers = {} } = options || {};\n        return getText(this.state.doc, {\n            blockSeparator,\n            textSerializers: {\n                ...getTextSerializersFromSchema(this.schema),\n                ...textSerializers,\n            },\n        });\n    }\n    /**\n     * Check if there is no content.\n     */\n    get isEmpty() {\n        return isNodeEmpty(this.state.doc);\n    }\n    /**\n     * Get the number of characters for the current document.\n     *\n     * @deprecated\n     */\n    getCharacterCount() {\n        console.warn('[tiptap warn]: \"editor.getCharacterCount()\" is deprecated. Please use \"editor.storage.characterCount.characters()\" instead.');\n        return this.state.doc.content.size - 2;\n    }\n    /**\n     * Destroy the editor.\n     */\n    destroy() {\n        this.emit('destroy');\n        if (this.view) {\n            this.view.destroy();\n        }\n        this.removeAllListeners();\n    }\n    /**\n     * Check if the editor is already destroyed.\n     */\n    get isDestroyed() {\n        var _a;\n        // @ts-ignore\n        return !((_a = this.view) === null || _a === void 0 ? void 0 : _a.docView);\n    }\n    $node(selector, attributes) {\n        var _a;\n        return ((_a = this.$doc) === null || _a === void 0 ? void 0 : _a.querySelector(selector, attributes)) || null;\n    }\n    $nodes(selector, attributes) {\n        var _a;\n        return ((_a = this.$doc) === null || _a === void 0 ? void 0 : _a.querySelectorAll(selector, attributes)) || null;\n    }\n    $pos(pos) {\n        const $pos = this.state.doc.resolve(pos);\n        return new NodePos($pos, this);\n    }\n    get $doc() {\n        return this.$pos(0);\n    }\n}\n\n/**\n * Build an input rule that adds a mark when the\n * matched text is typed into it.\n * @see https://tiptap.dev/guide/custom-extensions/#input-rules\n */\nfunction markInputRule(config) {\n    return new InputRule({\n        find: config.find,\n        handler: ({ state, range, match }) => {\n            const attributes = callOrReturn(config.getAttributes, undefined, match);\n            if (attributes === false || attributes === null) {\n                return null;\n            }\n            const { tr } = state;\n            const captureGroup = match[match.length - 1];\n            const fullMatch = match[0];\n            if (captureGroup) {\n                const startSpaces = fullMatch.search(/\\S/);\n                const textStart = range.from + fullMatch.indexOf(captureGroup);\n                const textEnd = textStart + captureGroup.length;\n                const excludedMarks = getMarksBetween(range.from, range.to, state.doc)\n                    .filter(item => {\n                    // @ts-ignore\n                    const excluded = item.mark.type.excluded;\n                    return excluded.find(type => type === config.type && type !== item.mark.type);\n                })\n                    .filter(item => item.to > textStart);\n                if (excludedMarks.length) {\n                    return null;\n                }\n                if (textEnd < range.to) {\n                    tr.delete(textEnd, range.to);\n                }\n                if (textStart > range.from) {\n                    tr.delete(range.from + startSpaces, textStart);\n                }\n                const markEnd = range.from + startSpaces + captureGroup.length;\n                tr.addMark(range.from + startSpaces, markEnd, config.type.create(attributes || {}));\n                tr.removeStoredMark(config.type);\n            }\n        },\n    });\n}\n\n/**\n * Build an input rule that adds a node when the\n * matched text is typed into it.\n * @see https://tiptap.dev/guide/custom-extensions/#input-rules\n */\nfunction nodeInputRule(config) {\n    return new InputRule({\n        find: config.find,\n        handler: ({ state, range, match }) => {\n            const attributes = callOrReturn(config.getAttributes, undefined, match) || {};\n            const { tr } = state;\n            const start = range.from;\n            let end = range.to;\n            const newNode = config.type.create(attributes);\n            if (match[1]) {\n                const offset = match[0].lastIndexOf(match[1]);\n                let matchStart = start + offset;\n                if (matchStart > end) {\n                    matchStart = end;\n                }\n                else {\n                    end = matchStart + match[1].length;\n                }\n                // insert last typed character\n                const lastChar = match[0][match[0].length - 1];\n                tr.insertText(lastChar, start + match[0].length - 1);\n                // insert node from input rule\n                tr.replaceWith(matchStart, end, newNode);\n            }\n            else if (match[0]) {\n                const insertionStart = config.type.isInline ? start : start - 1;\n                tr.insert(insertionStart, config.type.create(attributes)).delete(tr.mapping.map(start), tr.mapping.map(end));\n            }\n            tr.scrollIntoView();\n        },\n    });\n}\n\n/**\n * Build an input rule that changes the type of a textblock when the\n * matched text is typed into it. When using a regular expresion you’ll\n * probably want the regexp to start with `^`, so that the pattern can\n * only occur at the start of a textblock.\n * @see https://tiptap.dev/guide/custom-extensions/#input-rules\n */\nfunction textblockTypeInputRule(config) {\n    return new InputRule({\n        find: config.find,\n        handler: ({ state, range, match }) => {\n            const $start = state.doc.resolve(range.from);\n            const attributes = callOrReturn(config.getAttributes, undefined, match) || {};\n            if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), config.type)) {\n                return null;\n            }\n            state.tr\n                .delete(range.from, range.to)\n                .setBlockType(range.from, range.from, config.type, attributes);\n        },\n    });\n}\n\n/**\n * Build an input rule that replaces text when the\n * matched text is typed into it.\n * @see https://tiptap.dev/guide/custom-extensions/#input-rules\n */\nfunction textInputRule(config) {\n    return new InputRule({\n        find: config.find,\n        handler: ({ state, range, match }) => {\n            let insert = config.replace;\n            let start = range.from;\n            const end = range.to;\n            if (match[1]) {\n                const offset = match[0].lastIndexOf(match[1]);\n                insert += match[0].slice(offset + match[1].length);\n                start += offset;\n                const cutOff = start - end;\n                if (cutOff > 0) {\n                    insert = match[0].slice(offset - cutOff, offset) + insert;\n                    start = end;\n                }\n            }\n            state.tr.insertText(insert, start, end);\n        },\n    });\n}\n\n/**\n * Build an input rule for automatically wrapping a textblock when a\n * given string is typed. When using a regular expresion you’ll\n * probably want the regexp to start with `^`, so that the pattern can\n * only occur at the start of a textblock.\n *\n * `type` is the type of node to wrap in.\n *\n * By default, if there’s a node with the same type above the newly\n * wrapped node, the rule will try to join those\n * two nodes. You can pass a join predicate, which takes a regular\n * expression match and the node before the wrapped node, and can\n * return a boolean to indicate whether a join should happen.\n * @see https://tiptap.dev/guide/custom-extensions/#input-rules\n */\nfunction wrappingInputRule(config) {\n    return new InputRule({\n        find: config.find,\n        handler: ({ state, range, match, chain, }) => {\n            const attributes = callOrReturn(config.getAttributes, undefined, match) || {};\n            const tr = state.tr.delete(range.from, range.to);\n            const $start = tr.doc.resolve(range.from);\n            const blockRange = $start.blockRange();\n            const wrapping = blockRange && findWrapping(blockRange, config.type, attributes);\n            if (!wrapping) {\n                return null;\n            }\n            tr.wrap(blockRange, wrapping);\n            if (config.keepMarks && config.editor) {\n                const { selection, storedMarks } = state;\n                const { splittableMarks } = config.editor.extensionManager;\n                const marks = storedMarks || (selection.$to.parentOffset && selection.$from.marks());\n                if (marks) {\n                    const filteredMarks = marks.filter(mark => splittableMarks.includes(mark.type.name));\n                    tr.ensureMarks(filteredMarks);\n                }\n            }\n            if (config.keepAttributes) {\n                /** If the nodeType is `bulletList` or `orderedList` set the `nodeType` as `listItem` */\n                const nodeType = config.type.name === 'bulletList' || config.type.name === 'orderedList' ? 'listItem' : 'taskList';\n                chain().updateAttributes(nodeType, attributes).run();\n            }\n            const before = tr.doc.resolve(range.from - 1).nodeBefore;\n            if (before\n                && before.type === config.type\n                && canJoin(tr.doc, range.from - 1)\n                && (!config.joinPredicate || config.joinPredicate(match, before))) {\n                tr.join(range.from - 1);\n            }\n        },\n    });\n}\n\n/**\n * The Mark class is used to create custom mark extensions.\n * @see https://tiptap.dev/api/extensions#create-a-new-extension\n */\nclass Mark {\n    constructor(config = {}) {\n        this.type = 'mark';\n        this.name = 'mark';\n        this.parent = null;\n        this.child = null;\n        this.config = {\n            name: this.name,\n            defaultOptions: {},\n        };\n        this.config = {\n            ...this.config,\n            ...config,\n        };\n        this.name = this.config.name;\n        if (config.defaultOptions && Object.keys(config.defaultOptions).length > 0) {\n            console.warn(`[tiptap warn]: BREAKING CHANGE: \"defaultOptions\" is deprecated. Please use \"addOptions\" instead. Found in extension: \"${this.name}\".`);\n        }\n        // TODO: remove `addOptions` fallback\n        this.options = this.config.defaultOptions;\n        if (this.config.addOptions) {\n            this.options = callOrReturn(getExtensionField(this, 'addOptions', {\n                name: this.name,\n            }));\n        }\n        this.storage = callOrReturn(getExtensionField(this, 'addStorage', {\n            name: this.name,\n            options: this.options,\n        })) || {};\n    }\n    static create(config = {}) {\n        return new Mark(config);\n    }\n    configure(options = {}) {\n        // return a new instance so we can use the same extension\n        // with different calls of `configure`\n        const extension = this.extend({\n            ...this.config,\n            addOptions() {\n                var _a;\n                return mergeDeep(((_a = this.parent) === null || _a === void 0 ? void 0 : _a.call(this)) || {}, options);\n            },\n        });\n        // Always preserve the current name\n        extension.name = this.name;\n        // Set the parent to be our parent\n        extension.parent = this.parent;\n        return extension;\n    }\n    extend(extendedConfig = {}) {\n        const extension = new Mark(extendedConfig);\n        extension.parent = this;\n        this.child = extension;\n        extension.name = extendedConfig.name ? extendedConfig.name : extension.parent.name;\n        if (extendedConfig.defaultOptions && Object.keys(extendedConfig.defaultOptions).length > 0) {\n            console.warn(`[tiptap warn]: BREAKING CHANGE: \"defaultOptions\" is deprecated. Please use \"addOptions\" instead. Found in extension: \"${extension.name}\".`);\n        }\n        extension.options = callOrReturn(getExtensionField(extension, 'addOptions', {\n            name: extension.name,\n        }));\n        extension.storage = callOrReturn(getExtensionField(extension, 'addStorage', {\n            name: extension.name,\n            options: extension.options,\n        }));\n        return extension;\n    }\n    static handleExit({ editor, mark }) {\n        const { tr } = editor.state;\n        const currentPos = editor.state.selection.$from;\n        const isAtEnd = currentPos.pos === currentPos.end();\n        if (isAtEnd) {\n            const currentMarks = currentPos.marks();\n            const isInMark = !!currentMarks.find(m => (m === null || m === void 0 ? void 0 : m.type.name) === mark.name);\n            if (!isInMark) {\n                return false;\n            }\n            const removeMark = currentMarks.find(m => (m === null || m === void 0 ? void 0 : m.type.name) === mark.name);\n            if (removeMark) {\n                tr.removeStoredMark(removeMark);\n            }\n            tr.insertText(' ', currentPos.pos);\n            editor.view.dispatch(tr);\n            return true;\n        }\n        return false;\n    }\n}\n\n/**\n * The Node class is used to create custom node extensions.\n * @see https://tiptap.dev/api/extensions#create-a-new-extension\n */\nclass Node {\n    constructor(config = {}) {\n        this.type = 'node';\n        this.name = 'node';\n        this.parent = null;\n        this.child = null;\n        this.config = {\n            name: this.name,\n            defaultOptions: {},\n        };\n        this.config = {\n            ...this.config,\n            ...config,\n        };\n        this.name = this.config.name;\n        if (config.defaultOptions && Object.keys(config.defaultOptions).length > 0) {\n            console.warn(`[tiptap warn]: BREAKING CHANGE: \"defaultOptions\" is deprecated. Please use \"addOptions\" instead. Found in extension: \"${this.name}\".`);\n        }\n        // TODO: remove `addOptions` fallback\n        this.options = this.config.defaultOptions;\n        if (this.config.addOptions) {\n            this.options = callOrReturn(getExtensionField(this, 'addOptions', {\n                name: this.name,\n            }));\n        }\n        this.storage = callOrReturn(getExtensionField(this, 'addStorage', {\n            name: this.name,\n            options: this.options,\n        })) || {};\n    }\n    static create(config = {}) {\n        return new Node(config);\n    }\n    configure(options = {}) {\n        // return a new instance so we can use the same extension\n        // with different calls of `configure`\n        const extension = this.extend({\n            ...this.config,\n            addOptions() {\n                var _a;\n                return mergeDeep(((_a = this.parent) === null || _a === void 0 ? void 0 : _a.call(this)) || {}, options);\n            },\n        });\n        // Always preserve the current name\n        extension.name = this.name;\n        // Set the parent to be our parent\n        extension.parent = this.parent;\n        return extension;\n    }\n    extend(extendedConfig = {}) {\n        const extension = new Node(extendedConfig);\n        extension.parent = this;\n        this.child = extension;\n        extension.name = extendedConfig.name ? extendedConfig.name : extension.parent.name;\n        if (extendedConfig.defaultOptions && Object.keys(extendedConfig.defaultOptions).length > 0) {\n            console.warn(`[tiptap warn]: BREAKING CHANGE: \"defaultOptions\" is deprecated. Please use \"addOptions\" instead. Found in extension: \"${extension.name}\".`);\n        }\n        extension.options = callOrReturn(getExtensionField(extension, 'addOptions', {\n            name: extension.name,\n        }));\n        extension.storage = callOrReturn(getExtensionField(extension, 'addStorage', {\n            name: extension.name,\n            options: extension.options,\n        }));\n        return extension;\n    }\n}\n\nfunction isAndroid() {\n    return navigator.platform === 'Android' || /android/i.test(navigator.userAgent);\n}\n\n/**\n * Node views are used to customize the rendered DOM structure of a node.\n * @see https://tiptap.dev/guide/node-views\n */\nclass NodeView {\n    constructor(component, props, options) {\n        this.isDragging = false;\n        this.component = component;\n        this.editor = props.editor;\n        this.options = {\n            stopEvent: null,\n            ignoreMutation: null,\n            ...options,\n        };\n        this.extension = props.extension;\n        this.node = props.node;\n        this.decorations = props.decorations;\n        this.getPos = props.getPos;\n        this.mount();\n    }\n    mount() {\n        // eslint-disable-next-line\n        return;\n    }\n    get dom() {\n        return this.editor.view.dom;\n    }\n    get contentDOM() {\n        return null;\n    }\n    onDragStart(event) {\n        var _a, _b, _c, _d, _e, _f, _g;\n        const { view } = this.editor;\n        const target = event.target;\n        // get the drag handle element\n        // `closest` is not available for text nodes so we may have to use its parent\n        const dragHandle = target.nodeType === 3\n            ? (_a = target.parentElement) === null || _a === void 0 ? void 0 : _a.closest('[data-drag-handle]')\n            : target.closest('[data-drag-handle]');\n        if (!this.dom || ((_b = this.contentDOM) === null || _b === void 0 ? void 0 : _b.contains(target)) || !dragHandle) {\n            return;\n        }\n        let x = 0;\n        let y = 0;\n        // calculate offset for drag element if we use a different drag handle element\n        if (this.dom !== dragHandle) {\n            const domBox = this.dom.getBoundingClientRect();\n            const handleBox = dragHandle.getBoundingClientRect();\n            // In React, we have to go through nativeEvent to reach offsetX/offsetY.\n            const offsetX = (_c = event.offsetX) !== null && _c !== void 0 ? _c : (_d = event.nativeEvent) === null || _d === void 0 ? void 0 : _d.offsetX;\n            const offsetY = (_e = event.offsetY) !== null && _e !== void 0 ? _e : (_f = event.nativeEvent) === null || _f === void 0 ? void 0 : _f.offsetY;\n            x = handleBox.x - domBox.x + offsetX;\n            y = handleBox.y - domBox.y + offsetY;\n        }\n        (_g = event.dataTransfer) === null || _g === void 0 ? void 0 : _g.setDragImage(this.dom, x, y);\n        // we need to tell ProseMirror that we want to move the whole node\n        // so we create a NodeSelection\n        const selection = NodeSelection.create(view.state.doc, this.getPos());\n        const transaction = view.state.tr.setSelection(selection);\n        view.dispatch(transaction);\n    }\n    stopEvent(event) {\n        var _a;\n        if (!this.dom) {\n            return false;\n        }\n        if (typeof this.options.stopEvent === 'function') {\n            return this.options.stopEvent({ event });\n        }\n        const target = event.target;\n        const isInElement = this.dom.contains(target) && !((_a = this.contentDOM) === null || _a === void 0 ? void 0 : _a.contains(target));\n        // any event from child nodes should be handled by ProseMirror\n        if (!isInElement) {\n            return false;\n        }\n        const isDragEvent = event.type.startsWith('drag');\n        const isDropEvent = event.type === 'drop';\n        const isInput = ['INPUT', 'BUTTON', 'SELECT', 'TEXTAREA'].includes(target.tagName) || target.isContentEditable;\n        // any input event within node views should be ignored by ProseMirror\n        if (isInput && !isDropEvent && !isDragEvent) {\n            return true;\n        }\n        const { isEditable } = this.editor;\n        const { isDragging } = this;\n        const isDraggable = !!this.node.type.spec.draggable;\n        const isSelectable = NodeSelection.isSelectable(this.node);\n        const isCopyEvent = event.type === 'copy';\n        const isPasteEvent = event.type === 'paste';\n        const isCutEvent = event.type === 'cut';\n        const isClickEvent = event.type === 'mousedown';\n        // ProseMirror tries to drag selectable nodes\n        // even if `draggable` is set to `false`\n        // this fix prevents that\n        if (!isDraggable && isSelectable && isDragEvent) {\n            event.preventDefault();\n        }\n        if (isDraggable && isDragEvent && !isDragging) {\n            event.preventDefault();\n            return false;\n        }\n        // we have to store that dragging started\n        if (isDraggable && isEditable && !isDragging && isClickEvent) {\n            const dragHandle = target.closest('[data-drag-handle]');\n            const isValidDragHandle = dragHandle && (this.dom === dragHandle || this.dom.contains(dragHandle));\n            if (isValidDragHandle) {\n                this.isDragging = true;\n                document.addEventListener('dragend', () => {\n                    this.isDragging = false;\n                }, { once: true });\n                document.addEventListener('drop', () => {\n                    this.isDragging = false;\n                }, { once: true });\n                document.addEventListener('mouseup', () => {\n                    this.isDragging = false;\n                }, { once: true });\n            }\n        }\n        // these events are handled by prosemirror\n        if (isDragging\n            || isDropEvent\n            || isCopyEvent\n            || isPasteEvent\n            || isCutEvent\n            || (isClickEvent && isSelectable)) {\n            return false;\n        }\n        return true;\n    }\n    ignoreMutation(mutation) {\n        if (!this.dom || !this.contentDOM) {\n            return true;\n        }\n        if (typeof this.options.ignoreMutation === 'function') {\n            return this.options.ignoreMutation({ mutation });\n        }\n        // a leaf/atom node is like a black box for ProseMirror\n        // and should be fully handled by the node view\n        if (this.node.isLeaf || this.node.isAtom) {\n            return true;\n        }\n        // ProseMirror should handle any selections\n        if (mutation.type === 'selection') {\n            return false;\n        }\n        // try to prevent a bug on iOS and Android that will break node views on enter\n        // this is because ProseMirror can’t preventDispatch on enter\n        // this will lead to a re-render of the node view on enter\n        // see: https://github.com/ueberdosis/tiptap/issues/1214\n        // see: https://github.com/ueberdosis/tiptap/issues/2534\n        if (this.dom.contains(mutation.target)\n            && mutation.type === 'childList'\n            && (isiOS() || isAndroid())\n            && this.editor.isFocused) {\n            const changedNodes = [\n                ...Array.from(mutation.addedNodes),\n                ...Array.from(mutation.removedNodes),\n            ];\n            // we’ll check if every changed node is contentEditable\n            // to make sure it’s probably mutated by ProseMirror\n            if (changedNodes.every(node => node.isContentEditable)) {\n                return false;\n            }\n        }\n        // we will allow mutation contentDOM with attributes\n        // so we can for example adding classes within our node view\n        if (this.contentDOM === mutation.target && mutation.type === 'attributes') {\n            return true;\n        }\n        // ProseMirror should handle any changes within contentDOM\n        if (this.contentDOM.contains(mutation.target)) {\n            return false;\n        }\n        return true;\n    }\n    updateAttributes(attributes) {\n        this.editor.commands.command(({ tr }) => {\n            const pos = this.getPos();\n            tr.setNodeMarkup(pos, undefined, {\n                ...this.node.attrs,\n                ...attributes,\n            });\n            return true;\n        });\n    }\n    deleteNode() {\n        const from = this.getPos();\n        const to = from + this.node.nodeSize;\n        this.editor.commands.deleteRange({ from, to });\n    }\n}\n\n/**\n * Build an paste rule that adds a mark when the\n * matched text is pasted into it.\n * @see https://tiptap.dev/guide/custom-extensions/#paste-rules\n */\nfunction markPasteRule(config) {\n    return new PasteRule({\n        find: config.find,\n        handler: ({ state, range, match, pasteEvent, }) => {\n            const attributes = callOrReturn(config.getAttributes, undefined, match, pasteEvent);\n            if (attributes === false || attributes === null) {\n                return null;\n            }\n            const { tr } = state;\n            const captureGroup = match[match.length - 1];\n            const fullMatch = match[0];\n            let markEnd = range.to;\n            if (captureGroup) {\n                const startSpaces = fullMatch.search(/\\S/);\n                const textStart = range.from + fullMatch.indexOf(captureGroup);\n                const textEnd = textStart + captureGroup.length;\n                const excludedMarks = getMarksBetween(range.from, range.to, state.doc)\n                    .filter(item => {\n                    // @ts-ignore\n                    const excluded = item.mark.type.excluded;\n                    return excluded.find(type => type === config.type && type !== item.mark.type);\n                })\n                    .filter(item => item.to > textStart);\n                if (excludedMarks.length) {\n                    return null;\n                }\n                if (textEnd < range.to) {\n                    tr.delete(textEnd, range.to);\n                }\n                if (textStart > range.from) {\n                    tr.delete(range.from + startSpaces, textStart);\n                }\n                markEnd = range.from + startSpaces + captureGroup.length;\n                tr.addMark(range.from + startSpaces, markEnd, config.type.create(attributes || {}));\n                tr.removeStoredMark(config.type);\n            }\n        },\n    });\n}\n\n// source: https://stackoverflow.com/a/6969486\nfunction escapeForRegEx(string) {\n    return string.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nfunction isString(value) {\n    return typeof value === 'string';\n}\n\n/**\n * Build an paste rule that adds a node when the\n * matched text is pasted into it.\n * @see https://tiptap.dev/guide/custom-extensions/#paste-rules\n */\nfunction nodePasteRule(config) {\n    return new PasteRule({\n        find: config.find,\n        handler({ match, chain, range, pasteEvent, }) {\n            const attributes = callOrReturn(config.getAttributes, undefined, match, pasteEvent);\n            if (attributes === false || attributes === null) {\n                return null;\n            }\n            if (match.input) {\n                chain().deleteRange(range).insertContentAt(range.from, {\n                    type: config.type.name,\n                    attrs: attributes,\n                });\n            }\n        },\n    });\n}\n\n/**\n * Build an paste rule that replaces text when the\n * matched text is pasted into it.\n * @see https://tiptap.dev/guide/custom-extensions/#paste-rules\n */\nfunction textPasteRule(config) {\n    return new PasteRule({\n        find: config.find,\n        handler: ({ state, range, match }) => {\n            let insert = config.replace;\n            let start = range.from;\n            const end = range.to;\n            if (match[1]) {\n                const offset = match[0].lastIndexOf(match[1]);\n                insert += match[0].slice(offset + match[1].length);\n                start += offset;\n                const cutOff = start - end;\n                if (cutOff > 0) {\n                    insert = match[0].slice(offset - cutOff, offset) + insert;\n                    start = end;\n                }\n            }\n            state.tr.insertText(insert, start, end);\n        },\n    });\n}\n\nclass Tracker {\n    constructor(transaction) {\n        this.transaction = transaction;\n        this.currentStep = this.transaction.steps.length;\n    }\n    map(position) {\n        let deleted = false;\n        const mappedPosition = this.transaction.steps\n            .slice(this.currentStep)\n            .reduce((newPosition, step) => {\n            const mapResult = step.getMap().mapResult(newPosition);\n            if (mapResult.deleted) {\n                deleted = true;\n            }\n            return mapResult.pos;\n        }, position);\n        return {\n            position: mappedPosition,\n            deleted,\n        };\n    }\n}\n\nexport { CommandManager, Editor, Extension, InputRule, Mark, Node, NodePos, NodeView, PasteRule, Tracker, callOrReturn, combineTransactionSteps, createChainableState, createDocument, createNodeFromContent, createStyleTag, defaultBlockAt, deleteProps, elementFromString, escapeForRegEx, index as extensions, findChildren, findChildrenInRange, findDuplicates, findParentNode, findParentNodeClosestToPos, fromString, generateHTML, generateJSON, generateText, getAttributes, getAttributesFromExtensions, getChangedRanges, getDebugJSON, getExtensionField, getHTMLFromFragment, getMarkAttributes, getMarkRange, getMarkType, getMarksBetween, getNodeAtPosition, getNodeAttributes, getNodeType, getRenderedAttributes, getSchema, getSchemaByResolvedExtensions, getSchemaTypeByName, getSchemaTypeNameByName, getSplittedAttributes, getText, getTextBetween, getTextContentFromNodes, getTextSerializersFromSchema, injectExtensionAttributesToParseRule, inputRulesPlugin, isActive, isAtEndOfNode, isAtStartOfNode, isEmptyObject, isExtensionRulesEnabled, isFunction, isList, isMacOS, isMarkActive, isNodeActive, isNodeEmpty, isNodeSelection, isNumber, isPlainObject, isRegExp, isString, isTextSelection, isiOS, markInputRule, markPasteRule, mergeAttributes, mergeDeep, minMax, nodeInputRule, nodePasteRule, objectIncludes, pasteRulesPlugin, posToDOMRect, removeDuplicates, resolveFocusPosition, selectionToInsertionEnd, splitExtensions, textInputRule, textPasteRule, textblockTypeInputRule, wrappingInputRule };\n//# sourceMappingURL=index.js.map\n","import { Node, mergeAttributes, nodeInputRule } from '@tiptap/core';\n\n/**\n * Matches an image to a ![image](src \"title\") on input.\n */\nconst inputRegex = /(?:^|\\s)(!\\[(.+|:?)]\\((\\S+)(?:(?:\\s+)[\"'](\\S+)[\"'])?\\))$/;\n/**\n * This extension allows you to insert images.\n * @see https://www.tiptap.dev/api/nodes/image\n */\nconst Image = Node.create({\n    name: 'image',\n    addOptions() {\n        return {\n            inline: false,\n            allowBase64: false,\n            HTMLAttributes: {},\n        };\n    },\n    inline() {\n        return this.options.inline;\n    },\n    group() {\n        return this.options.inline ? 'inline' : 'block';\n    },\n    draggable: true,\n    addAttributes() {\n        return {\n            src: {\n                default: null,\n            },\n            alt: {\n                default: null,\n            },\n            title: {\n                default: null,\n            },\n        };\n    },\n    parseHTML() {\n        return [\n            {\n                tag: this.options.allowBase64\n                    ? 'img[src]'\n                    : 'img[src]:not([src^=\"data:\"])',\n            },\n        ];\n    },\n    renderHTML({ HTMLAttributes }) {\n        return ['img', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)];\n    },\n    addCommands() {\n        return {\n            setImage: options => ({ commands }) => {\n                return commands.insertContent({\n                    type: this.name,\n                    attrs: options,\n                });\n            },\n        };\n    },\n    addInputRules() {\n        return [\n            nodeInputRule({\n                find: inputRegex,\n                type: this.type,\n                getAttributes: match => {\n                    const [, , alt, src, title] = match;\n                    return { src, alt, title };\n                },\n            }),\n        ];\n    },\n});\n\nexport { Image, Image as default, inputRegex };\n//# sourceMappingURL=index.js.map\n","// THIS FILE IS AUTOMATICALLY GENERATED DO NOT EDIT DIRECTLY\n// See update-tlds.js for encoding/decoding format\n// https://data.iana.org/TLD/tlds-alpha-by-domain.txt\nconst encodedTlds = 'aaa1rp3bb0ott3vie4c1le2ogado5udhabi7c0ademy5centure6ountant0s9o1tor4d0s1ult4e0g1ro2tna4f0l1rica5g0akhan5ency5i0g1rbus3force5tel5kdn3l0ibaba4pay4lfinanz6state5y2sace3tom5m0azon4ericanexpress7family11x2fam3ica3sterdam8nalytics7droid5quan4z2o0l2partments8p0le4q0uarelle8r0ab1mco4chi3my2pa2t0e3s0da2ia2sociates9t0hleta5torney7u0ction5di0ble3o3spost5thor3o0s4vianca6w0s2x0a2z0ure5ba0by2idu3namex3narepublic11d1k2r0celona5laycard4s5efoot5gains6seball5ketball8uhaus5yern5b0c1t1va3cg1n2d1e0ats2uty4er2ntley5rlin4st0buy5t2f1g1h0arti5i0ble3d1ke2ng0o3o1z2j1lack0friday9ockbuster8g1omberg7ue3m0s1w2n0pparibas9o0ats3ehringer8fa2m1nd2o0k0ing5sch2tik2on4t1utique6x2r0adesco6idgestone9oadway5ker3ther5ussels7s1t1uild0ers6siness6y1zz3v1w1y1z0h3ca0b1fe2l0l1vinklein9m0era3p2non3petown5ital0one8r0avan4ds2e0er0s4s2sa1e1h1ino4t0ering5holic7ba1n1re3c1d1enter4o1rn3f0a1d2g1h0anel2nel4rity4se2t2eap3intai5ristmas6ome4urch5i0priani6rcle4sco3tadel4i0c2y3k1l0aims4eaning6ick2nic1que6othing5ud3ub0med6m1n1o0ach3des3ffee4llege4ogne5m0cast4mbank4unity6pany2re3uter5sec4ndos3struction8ulting7tact3ractors9oking4l1p2rsica5untry4pon0s4rses6pa2r0edit0card4union9icket5own3s1uise0s6u0isinella9v1w1x1y0mru3ou3z2dabur3d1nce3ta1e1ing3sun4y2clk3ds2e0al0er2s3gree4livery5l1oitte5ta3mocrat6ntal2ist5si0gn4v2hl2iamonds6et2gital5rect0ory7scount3ver5h2y2j1k1m1np2o0cs1tor4g1mains5t1wnload7rive4tv2ubai3nlop4pont4rban5vag2r2z2earth3t2c0o2deka3u0cation8e1g1mail3erck5nergy4gineer0ing9terprises10pson4quipment8r0icsson6ni3s0q1tate5t1u0rovision8s2vents5xchange6pert3osed4ress5traspace10fage2il1rwinds6th3mily4n0s2rm0ers5shion4t3edex3edback6rrari3ero6i0delity5o2lm2nal1nce1ial7re0stone6mdale6sh0ing5t0ness6j1k1lickr3ghts4r2orist4wers5y2m1o0o0d1tball6rd1ex2sale4um3undation8x2r0ee1senius7l1ogans4ntier7tr2ujitsu5n0d2rniture7tbol5yi3ga0l0lery3o1up4me0s3p1rden4y2b0iz3d0n2e0a1nt0ing5orge5f1g0ee3h1i0ft0s3ves2ing5l0ass3e1obal2o4m0ail3bh2o1x2n1odaddy5ld0point6f2o0dyear5g0le4p1t1v2p1q1r0ainger5phics5tis4een3ipe3ocery4up4s1t1u0ardian6cci3ge2ide2tars5ru3w1y2hair2mburg5ngout5us3bo2dfc0bank7ealth0care8lp1sinki6re1mes5iphop4samitsu7tachi5v2k0t2m1n1ockey4ldings5iday5medepot5goods5s0ense7nda3rse3spital5t0ing5t0els3mail5use3w2r1sbc3t1u0ghes5yatt3undai7ibm2cbc2e1u2d1e0ee3fm2kano4l1m0amat4db2mo0bilien9n0c1dustries8finiti5o2g1k1stitute6urance4e4t0ernational10uit4vestments10o1piranga7q1r0ish4s0maili5t0anbul7t0au2v3jaguar4va3cb2e0ep2tzt3welry6io2ll2m0p2nj2o0bs1urg4t1y2p0morgan6rs3uegos4niper7kaufen5ddi3e0rryhotels6logistics9properties14fh2g1h1i0a1ds2m1ndle4tchen5wi3m1n1oeln3matsu5sher5p0mg2n2r0d1ed3uokgroup8w1y0oto4z2la0caixa5mborghini8er3ncaster6d0rover6xess5salle5t0ino3robe5w0yer5b1c1ds2ease3clerc5frak4gal2o2xus4gbt3i0dl2fe0insurance9style7ghting6ke2lly3mited4o2ncoln4k2psy3ve1ing5k1lc1p2oan0s3cker3us3l1ndon4tte1o3ve3pl0financial11r1s1t0d0a3u0ndbeck6xe1ury5v1y2ma0drid4if1son4keup4n0agement7go3p1rket0ing3s4riott5shalls7ttel5ba2c0kinsey7d1e0d0ia3et2lbourne7me1orial6n0u2rckmsd7g1h1iami3crosoft7l1ni1t2t0subishi9k1l0b1s2m0a2n1o0bi0le4da2e1i1m1nash3ey2ster5rmon3tgage6scow4to0rcycles9v0ie4p1q1r1s0d2t0n1r2u0seum3ic4v1w1x1y1z2na0b1goya4me2tura4vy3ba2c1e0c1t0bank4flix4work5ustar5w0s2xt0direct7us4f0l2g0o2hk2i0co2ke1on3nja3ssan1y5l1o0kia3rton4w0ruz3tv4p1r0a1w2tt2u1yc2z2obi1server7ffice5kinawa6layan0group9dnavy5lo3m0ega4ne1g1l0ine5oo2pen3racle3nge4g0anic5igins6saka4tsuka4t2vh3pa0ge2nasonic7ris2s1tners4s1y3y2ccw3e0t2f0izer5g1h0armacy6d1ilips5one2to0graphy6s4ysio5ics1tet2ures6d1n0g1k2oneer5zza4k1l0ace2y0station9umbing5s3m1n0c2ohl2ker3litie5rn2st3r0america6xi3ess3ime3o0d0uctions8f1gressive8mo2perties3y5tection8u0dential9s1t1ub2w0c2y2qa1pon3uebec3st5racing4dio4e0ad1lestate6tor2y4cipes5d0stone5umbrella9hab3ise0n3t2liance6n0t0als5pair3ort3ublican8st0aurant8view0s5xroth6ich0ardli6oh3l1o1p2o0cks3deo3gers4om3s0vp3u0gby3hr2n2w0e2yukyu6sa0arland6fe0ty4kura4le1on3msclub4ung5ndvik0coromant12ofi4p1rl2s1ve2xo3b0i1s2c0a1b1haeffler7midt4olarships8ol3ule3warz5ience5ot3d1e0arch3t2cure1ity6ek2lect4ner3rvices6ven3w1x0y3fr2g1h0angrila6rp2w2ell3ia1ksha5oes2p0ping5uji3w3i0lk2na1gles5te3j1k0i0n2y0pe4l0ing4m0art3ile4n0cf3o0ccer3ial4ftbank4ware6hu2lar2utions7ng1y2y2pa0ce3ort2t3r0l2s1t0ada2ples4r1tebank4farm7c0group6ockholm6rage3e3ream4udio2y3yle4u0cks3pplies3y2ort5rf1gery5zuki5v1watch4iss4x1y0dney4stems6z2tab1ipei4lk2obao4rget4tamotors6r2too4x0i3c0i2d0k2eam2ch0nology8l1masek5nnis4va3f1g1h0d1eater2re6iaa2ckets5enda4ps2res2ol4j0maxx4x2k0maxx5l1m0all4n1o0day3kyo3ols3p1ray3shiba5tal3urs3wn2yota3s3r0ade1ing4ining5vel0ers0insurance16ust3v2t1ube2i1nes3shu4v0s2w1z2ua1bank3s2g1k1nicom3versity8o2ol2ps2s1y1z2va0cations7na1guard7c1e0gas3ntures6risign5mögensberater2ung14sicherung10t2g1i0ajes4deo3g1king4llas4n1p1rgin4sa1ion4va1o3laanderen9n1odka3lvo3te1ing3o2yage5u2wales2mart4ter4ng0gou5tch0es6eather0channel12bcam3er2site5d0ding5ibo2r3f1hoswho6ien2ki2lliamhill9n0dows4e1ners6me2olterskluwer11odside6rk0s2ld3w2s1tc1f3xbox3erox4finity6ihuan4n2xx2yz3yachts4hoo3maxun5ndex5e1odobashi7ga2kohama6u0tube6t1un3za0ppos4ra3ero3ip2m1one3uerich6w2';\n// Internationalized domain names containing non-ASCII\nconst encodedUtlds = 'ελ1υ2бг1ел3дети4ею2католик6ом3мкд2он1сква6онлайн5рг3рус2ф2сайт3рб3укр3қаз3հայ3ישראל5קום3ابوظبي5رامكو5لاردن4بحرين5جزائر5سعودية6عليان5مغرب5مارات5یران5بارت2زار4يتك3ھارت5تونس4سودان3رية5شبكة4عراق2ب2مان4فلسطين6قطر3كاثوليك6وم3مصر2ليسيا5وريتانيا7قع4همراه5پاکستان7ڀارت4कॉम3नेट3भारत0म्3ोत5संगठन5বাংলা5ভারত2ৰত4ਭਾਰਤ4ભારત4ଭାରତ4இந்தியா6லங்கை6சிங்கப்பூர்11భారత్5ಭಾರತ4ഭാരതം5ලංකා4คอม3ไทย3ລາວ3გე2みんな3アマゾン4クラウド4グーグル4コム2ストア3セール3ファッション6ポイント4世界2中信1国1國1文网3亚马逊3企业2佛山2信息2健康2八卦2公司1益2台湾1灣2商城1店1标2嘉里0大酒店5在线2大拿2天主教3娱乐2家電2广东2微博2慈善2我爱你3手机2招聘2政务1府2新加坡2闻2时尚2書籍2机构2淡马锡3游戏2澳門2点看2移动2组织机构4网址1店1站1络2联通2谷歌2购物2通販2集团2電訊盈科4飞利浦3食品2餐厅2香格里拉3港2닷넷1컴2삼성2한국2';\n\n/**\n * @template A\n * @template B\n * @param {A} target\n * @param {B} properties\n * @return {A & B}\n */\nconst assign = (target, properties) => {\n  for (const key in properties) {\n    target[key] = properties[key];\n  }\n  return target;\n};\n\n/**\n * Finite State Machine generation utilities\n */\n\n/**\n * @template T\n * @typedef {{ [group: string]: T[] }} Collections\n */\n\n/**\n * @typedef {{ [group: string]: true }} Flags\n */\n\n// Keys in scanner Collections instances\nconst numeric = 'numeric';\nconst ascii = 'ascii';\nconst alpha = 'alpha';\nconst asciinumeric = 'asciinumeric';\nconst alphanumeric = 'alphanumeric';\nconst domain = 'domain';\nconst emoji = 'emoji';\nconst scheme = 'scheme';\nconst slashscheme = 'slashscheme';\nconst whitespace = 'whitespace';\n\n/**\n * @template T\n * @param {string} name\n * @param {Collections<T>} groups to register in\n * @returns {T[]} Current list of tokens in the given collection\n */\nfunction registerGroup(name, groups) {\n  if (!(name in groups)) {\n    groups[name] = [];\n  }\n  return groups[name];\n}\n\n/**\n * @template T\n * @param {T} t token to add\n * @param {Collections<T>} groups\n * @param {Flags} flags\n */\nfunction addToGroups(t, flags, groups) {\n  if (flags[numeric]) {\n    flags[asciinumeric] = true;\n    flags[alphanumeric] = true;\n  }\n  if (flags[ascii]) {\n    flags[asciinumeric] = true;\n    flags[alpha] = true;\n  }\n  if (flags[asciinumeric]) {\n    flags[alphanumeric] = true;\n  }\n  if (flags[alpha]) {\n    flags[alphanumeric] = true;\n  }\n  if (flags[alphanumeric]) {\n    flags[domain] = true;\n  }\n  if (flags[emoji]) {\n    flags[domain] = true;\n  }\n  for (const k in flags) {\n    const group = registerGroup(k, groups);\n    if (group.indexOf(t) < 0) {\n      group.push(t);\n    }\n  }\n}\n\n/**\n * @template T\n * @param {T} t token to check\n * @param {Collections<T>} groups\n * @returns {Flags} group flags that contain this token\n */\nfunction flagsForToken(t, groups) {\n  const result = {};\n  for (const c in groups) {\n    if (groups[c].indexOf(t) >= 0) {\n      result[c] = true;\n    }\n  }\n  return result;\n}\n\n/**\n * @template T\n * @typedef {null | T } Transition\n */\n\n/**\n * Define a basic state machine state. j is the list of character transitions,\n * jr is the list of regex-match transitions, jd is the default state to\n * transition to t is the accepting token type, if any. If this is the terminal\n * state, then it does not emit a token.\n *\n * The template type T represents the type of the token this state accepts. This\n * should be a string (such as of the token exports in `text.js`) or a\n * MultiToken subclass (from `multi.js`)\n *\n * @template T\n * @param {T} [token] Token that this state emits\n */\nfunction State(token) {\n  if (token === void 0) {\n    token = null;\n  }\n  // this.n = null; // DEBUG: State name\n  /** @type {{ [input: string]: State<T> }} j */\n  this.j = {}; // IMPLEMENTATION 1\n  // this.j = []; // IMPLEMENTATION 2\n  /** @type {[RegExp, State<T>][]} jr */\n  this.jr = [];\n  /** @type {?State<T>} jd */\n  this.jd = null;\n  /** @type {?T} t */\n  this.t = token;\n}\n\n/**\n * Scanner token groups\n * @type Collections<string>\n */\nState.groups = {};\nState.prototype = {\n  accepts() {\n    return !!this.t;\n  },\n  /**\n   * Follow an existing transition from the given input to the next state.\n   * Does not mutate.\n   * @param {string} input character or token type to transition on\n   * @returns {?State<T>} the next state, if any\n   */\n  go(input) {\n    const state = this;\n    const nextState = state.j[input];\n    if (nextState) {\n      return nextState;\n    }\n    for (let i = 0; i < state.jr.length; i++) {\n      const regex = state.jr[i][0];\n      const nextState = state.jr[i][1]; // note: might be empty to prevent default jump\n      if (nextState && regex.test(input)) {\n        return nextState;\n      }\n    }\n    // Nowhere left to jump! Return default, if any\n    return state.jd;\n  },\n  /**\n   * Whether the state has a transition for the given input. Set the second\n   * argument to true to only look for an exact match (and not a default or\n   * regular-expression-based transition)\n   * @param {string} input\n   * @param {boolean} exactOnly\n   */\n  has(input, exactOnly) {\n    if (exactOnly === void 0) {\n      exactOnly = false;\n    }\n    return exactOnly ? input in this.j : !!this.go(input);\n  },\n  /**\n   * Short for \"transition all\"; create a transition from the array of items\n   * in the given list to the same final resulting state.\n   * @param {string | string[]} inputs Group of inputs to transition on\n   * @param {Transition<T> | State<T>} [next] Transition options\n   * @param {Flags} [flags] Collections flags to add token to\n   * @param {Collections<T>} [groups] Master list of token groups\n   */\n  ta(inputs, next, flags, groups) {\n    for (let i = 0; i < inputs.length; i++) {\n      this.tt(inputs[i], next, flags, groups);\n    }\n  },\n  /**\n   * Short for \"take regexp transition\"; defines a transition for this state\n   * when it encounters a token which matches the given regular expression\n   * @param {RegExp} regexp Regular expression transition (populate first)\n   * @param {T | State<T>} [next] Transition options\n   * @param {Flags} [flags] Collections flags to add token to\n   * @param {Collections<T>} [groups] Master list of token groups\n   * @returns {State<T>} taken after the given input\n   */\n  tr(regexp, next, flags, groups) {\n    groups = groups || State.groups;\n    let nextState;\n    if (next && next.j) {\n      nextState = next;\n    } else {\n      // Token with maybe token groups\n      nextState = new State(next);\n      if (flags && groups) {\n        addToGroups(next, flags, groups);\n      }\n    }\n    this.jr.push([regexp, nextState]);\n    return nextState;\n  },\n  /**\n   * Short for \"take transitions\", will take as many sequential transitions as\n   * the length of the given input and returns the\n   * resulting final state.\n   * @param {string | string[]} input\n   * @param {T | State<T>} [next] Transition options\n   * @param {Flags} [flags] Collections flags to add token to\n   * @param {Collections<T>} [groups] Master list of token groups\n   * @returns {State<T>} taken after the given input\n   */\n  ts(input, next, flags, groups) {\n    let state = this;\n    const len = input.length;\n    if (!len) {\n      return state;\n    }\n    for (let i = 0; i < len - 1; i++) {\n      state = state.tt(input[i]);\n    }\n    return state.tt(input[len - 1], next, flags, groups);\n  },\n  /**\n   * Short for \"take transition\", this is a method for building/working with\n   * state machines.\n   *\n   * If a state already exists for the given input, returns it.\n   *\n   * If a token is specified, that state will emit that token when reached by\n   * the linkify engine.\n   *\n   * If no state exists, it will be initialized with some default transitions\n   * that resemble existing default transitions.\n   *\n   * If a state is given for the second argument, that state will be\n   * transitioned to on the given input regardless of what that input\n   * previously did.\n   *\n   * Specify a token group flags to define groups that this token belongs to.\n   * The token will be added to corresponding entires in the given groups\n   * object.\n   *\n   * @param {string} input character, token type to transition on\n   * @param {T | State<T>} [next] Transition options\n   * @param {Flags} [flags] Collections flags to add token to\n   * @param {Collections<T>} [groups] Master list of groups\n   * @returns {State<T>} taken after the given input\n   */\n  tt(input, next, flags, groups) {\n    groups = groups || State.groups;\n    const state = this;\n\n    // Check if existing state given, just a basic transition\n    if (next && next.j) {\n      state.j[input] = next;\n      return next;\n    }\n    const t = next;\n\n    // Take the transition with the usual default mechanisms and use that as\n    // a template for creating the next state\n    let nextState,\n      templateState = state.go(input);\n    if (templateState) {\n      nextState = new State();\n      assign(nextState.j, templateState.j);\n      nextState.jr.push.apply(nextState.jr, templateState.jr);\n      nextState.jd = templateState.jd;\n      nextState.t = templateState.t;\n    } else {\n      nextState = new State();\n    }\n    if (t) {\n      // Ensure newly token is in the same groups as the old token\n      if (groups) {\n        if (nextState.t && typeof nextState.t === 'string') {\n          const allFlags = assign(flagsForToken(nextState.t, groups), flags);\n          addToGroups(t, allFlags, groups);\n        } else if (flags) {\n          addToGroups(t, flags, groups);\n        }\n      }\n      nextState.t = t; // overwrite anything that was previously there\n    }\n\n    state.j[input] = nextState;\n    return nextState;\n  }\n};\n\n// Helper functions to improve minification (not exported outside linkifyjs module)\n\n/**\n * @template T\n * @param {State<T>} state\n * @param {string | string[]} input\n * @param {Flags} [flags]\n * @param {Collections<T>} [groups]\n */\nconst ta = (state, input, next, flags, groups) => state.ta(input, next, flags, groups);\n\n/**\n * @template T\n * @param {State<T>} state\n * @param {RegExp} regexp\n * @param {T | State<T>} [next]\n * @param {Flags} [flags]\n * @param {Collections<T>} [groups]\n */\nconst tr = (state, regexp, next, flags, groups) => state.tr(regexp, next, flags, groups);\n\n/**\n * @template T\n * @param {State<T>} state\n * @param {string | string[]} input\n * @param {T | State<T>} [next]\n * @param {Flags} [flags]\n * @param {Collections<T>} [groups]\n */\nconst ts = (state, input, next, flags, groups) => state.ts(input, next, flags, groups);\n\n/**\n * @template T\n * @param {State<T>} state\n * @param {string} input\n * @param {T | State<T>} [next]\n * @param {Collections<T>} [groups]\n * @param {Flags} [flags]\n */\nconst tt = (state, input, next, flags, groups) => state.tt(input, next, flags, groups);\n\n/******************************************************************************\nText Tokens\nIdentifiers for token outputs from the regexp scanner\n******************************************************************************/\n\n// A valid web domain token\nconst WORD = 'WORD'; // only contains a-z\nconst UWORD = 'UWORD'; // contains letters other than a-z, used for IDN\n\n// Special case of word\nconst LOCALHOST = 'LOCALHOST';\n\n// Valid top-level domain, special case of WORD (see tlds.js)\nconst TLD = 'TLD';\n\n// Valid IDN TLD, special case of UWORD (see tlds.js)\nconst UTLD = 'UTLD';\n\n// The scheme portion of a web URI protocol. Supported types include: `mailto`,\n// `file`, and user-defined custom protocols. Limited to schemes that contain\n// only letters\nconst SCHEME = 'SCHEME';\n\n// Similar to SCHEME, except makes distinction for schemes that must always be\n// followed by `://`, not just `:`. Supported types include `http`, `https`,\n// `ftp`, `ftps`\nconst SLASH_SCHEME = 'SLASH_SCHEME';\n\n// Any sequence of digits 0-9\nconst NUM = 'NUM';\n\n// Any number of consecutive whitespace characters that are not newline\nconst WS = 'WS';\n\n// New line (unix style)\nconst NL$1 = 'NL'; // \\n\n\n// Opening/closing bracket classes\n// TODO: Rename OPEN -> LEFT and CLOSE -> RIGHT in v5 to fit with Unicode names\n// Also rename angle brackes to LESSTHAN and GREATER THAN\nconst OPENBRACE = 'OPENBRACE'; // {\nconst CLOSEBRACE = 'CLOSEBRACE'; // }\nconst OPENBRACKET = 'OPENBRACKET'; // [\nconst CLOSEBRACKET = 'CLOSEBRACKET'; // ]\nconst OPENPAREN = 'OPENPAREN'; // (\nconst CLOSEPAREN = 'CLOSEPAREN'; // )\nconst OPENANGLEBRACKET = 'OPENANGLEBRACKET'; // <\nconst CLOSEANGLEBRACKET = 'CLOSEANGLEBRACKET'; // >\nconst FULLWIDTHLEFTPAREN = 'FULLWIDTHLEFTPAREN'; // (\nconst FULLWIDTHRIGHTPAREN = 'FULLWIDTHRIGHTPAREN'; // )\nconst LEFTCORNERBRACKET = 'LEFTCORNERBRACKET'; // 「\nconst RIGHTCORNERBRACKET = 'RIGHTCORNERBRACKET'; // 」\nconst LEFTWHITECORNERBRACKET = 'LEFTWHITECORNERBRACKET'; // 『\nconst RIGHTWHITECORNERBRACKET = 'RIGHTWHITECORNERBRACKET'; // 』\nconst FULLWIDTHLESSTHAN = 'FULLWIDTHLESSTHAN'; // <\nconst FULLWIDTHGREATERTHAN = 'FULLWIDTHGREATERTHAN'; // >\n\n// Various symbols\nconst AMPERSAND = 'AMPERSAND'; // &\nconst APOSTROPHE = 'APOSTROPHE'; // '\nconst ASTERISK = 'ASTERISK'; // *\nconst AT = 'AT'; // @\nconst BACKSLASH = 'BACKSLASH'; // \\\nconst BACKTICK = 'BACKTICK'; // `\nconst CARET = 'CARET'; // ^\nconst COLON = 'COLON'; // :\nconst COMMA = 'COMMA'; // ,\nconst DOLLAR = 'DOLLAR'; // $\nconst DOT = 'DOT'; // .\nconst EQUALS = 'EQUALS'; // =\nconst EXCLAMATION = 'EXCLAMATION'; // !\nconst HYPHEN = 'HYPHEN'; // -\nconst PERCENT = 'PERCENT'; // %\nconst PIPE = 'PIPE'; // |\nconst PLUS = 'PLUS'; // +\nconst POUND = 'POUND'; // #\nconst QUERY = 'QUERY'; // ?\nconst QUOTE = 'QUOTE'; // \"\n\nconst SEMI = 'SEMI'; // ;\nconst SLASH = 'SLASH'; // /\nconst TILDE = 'TILDE'; // ~\nconst UNDERSCORE = 'UNDERSCORE'; // _\n\n// Emoji symbol\nconst EMOJI$1 = 'EMOJI';\n\n// Default token - anything that is not one of the above\nconst SYM = 'SYM';\n\nvar tk = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tWORD: WORD,\n\tUWORD: UWORD,\n\tLOCALHOST: LOCALHOST,\n\tTLD: TLD,\n\tUTLD: UTLD,\n\tSCHEME: SCHEME,\n\tSLASH_SCHEME: SLASH_SCHEME,\n\tNUM: NUM,\n\tWS: WS,\n\tNL: NL$1,\n\tOPENBRACE: OPENBRACE,\n\tCLOSEBRACE: CLOSEBRACE,\n\tOPENBRACKET: OPENBRACKET,\n\tCLOSEBRACKET: CLOSEBRACKET,\n\tOPENPAREN: OPENPAREN,\n\tCLOSEPAREN: CLOSEPAREN,\n\tOPENANGLEBRACKET: OPENANGLEBRACKET,\n\tCLOSEANGLEBRACKET: CLOSEANGLEBRACKET,\n\tFULLWIDTHLEFTPAREN: FULLWIDTHLEFTPAREN,\n\tFULLWIDTHRIGHTPAREN: FULLWIDTHRIGHTPAREN,\n\tLEFTCORNERBRACKET: LEFTCORNERBRACKET,\n\tRIGHTCORNERBRACKET: RIGHTCORNERBRACKET,\n\tLEFTWHITECORNERBRACKET: LEFTWHITECORNERBRACKET,\n\tRIGHTWHITECORNERBRACKET: RIGHTWHITECORNERBRACKET,\n\tFULLWIDTHLESSTHAN: FULLWIDTHLESSTHAN,\n\tFULLWIDTHGREATERTHAN: FULLWIDTHGREATERTHAN,\n\tAMPERSAND: AMPERSAND,\n\tAPOSTROPHE: APOSTROPHE,\n\tASTERISK: ASTERISK,\n\tAT: AT,\n\tBACKSLASH: BACKSLASH,\n\tBACKTICK: BACKTICK,\n\tCARET: CARET,\n\tCOLON: COLON,\n\tCOMMA: COMMA,\n\tDOLLAR: DOLLAR,\n\tDOT: DOT,\n\tEQUALS: EQUALS,\n\tEXCLAMATION: EXCLAMATION,\n\tHYPHEN: HYPHEN,\n\tPERCENT: PERCENT,\n\tPIPE: PIPE,\n\tPLUS: PLUS,\n\tPOUND: POUND,\n\tQUERY: QUERY,\n\tQUOTE: QUOTE,\n\tSEMI: SEMI,\n\tSLASH: SLASH,\n\tTILDE: TILDE,\n\tUNDERSCORE: UNDERSCORE,\n\tEMOJI: EMOJI$1,\n\tSYM: SYM\n});\n\n// Note that these two Unicode ones expand into a really big one with Babel\nconst ASCII_LETTER = /[a-z]/;\nconst LETTER = /\\p{L}/u; // Any Unicode character with letter data type\nconst EMOJI = /\\p{Emoji}/u; // Any Unicode emoji character\nconst EMOJI_VARIATION$1 = /\\ufe0f/;\nconst DIGIT = /\\d/;\nconst SPACE = /\\s/;\n\nvar regexp = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tASCII_LETTER: ASCII_LETTER,\n\tLETTER: LETTER,\n\tEMOJI: EMOJI,\n\tEMOJI_VARIATION: EMOJI_VARIATION$1,\n\tDIGIT: DIGIT,\n\tSPACE: SPACE\n});\n\n/**\n\tThe scanner provides an interface that takes a string of text as input, and\n\toutputs an array of tokens instances that can be used for easy URL parsing.\n*/\nconst NL = '\\n'; // New line character\nconst EMOJI_VARIATION = '\\ufe0f'; // Variation selector, follows heart and others\nconst EMOJI_JOINER = '\\u200d'; // zero-width joiner\n\nlet tlds = null,\n  utlds = null; // don't change so only have to be computed once\n\n/**\n * Scanner output token:\n * - `t` is the token name (e.g., 'NUM', 'EMOJI', 'TLD')\n * - `v` is the value of the token (e.g., '123', '❤️', 'com')\n * - `s` is the start index of the token in the original string\n * - `e` is the end index of the token in the original string\n * @typedef {{t: string, v: string, s: number, e: number}} Token\n */\n\n/**\n * @template T\n * @typedef {{ [collection: string]: T[] }} Collections\n */\n\n/**\n * Initialize the scanner character-based state machine for the given start\n * state\n * @param {[string, boolean][]} customSchemes List of custom schemes, where each\n * item is a length-2 tuple with the first element set to the string scheme, and\n * the second element set to `true` if the `://` after the scheme is optional\n */\nfunction init$2(customSchemes) {\n  if (customSchemes === void 0) {\n    customSchemes = [];\n  }\n  // Frequently used states (name argument removed during minification)\n  /** @type Collections<string> */\n  const groups = {}; // of tokens\n  State.groups = groups;\n  /** @type State<string> */\n  const Start = new State();\n  if (tlds == null) {\n    tlds = decodeTlds(encodedTlds);\n  }\n  if (utlds == null) {\n    utlds = decodeTlds(encodedUtlds);\n  }\n\n  // States for special URL symbols that accept immediately after start\n  tt(Start, \"'\", APOSTROPHE);\n  tt(Start, '{', OPENBRACE);\n  tt(Start, '}', CLOSEBRACE);\n  tt(Start, '[', OPENBRACKET);\n  tt(Start, ']', CLOSEBRACKET);\n  tt(Start, '(', OPENPAREN);\n  tt(Start, ')', CLOSEPAREN);\n  tt(Start, '<', OPENANGLEBRACKET);\n  tt(Start, '>', CLOSEANGLEBRACKET);\n  tt(Start, '(', FULLWIDTHLEFTPAREN);\n  tt(Start, ')', FULLWIDTHRIGHTPAREN);\n  tt(Start, '「', LEFTCORNERBRACKET);\n  tt(Start, '」', RIGHTCORNERBRACKET);\n  tt(Start, '『', LEFTWHITECORNERBRACKET);\n  tt(Start, '』', RIGHTWHITECORNERBRACKET);\n  tt(Start, '<', FULLWIDTHLESSTHAN);\n  tt(Start, '>', FULLWIDTHGREATERTHAN);\n  tt(Start, '&', AMPERSAND);\n  tt(Start, '*', ASTERISK);\n  tt(Start, '@', AT);\n  tt(Start, '`', BACKTICK);\n  tt(Start, '^', CARET);\n  tt(Start, ':', COLON);\n  tt(Start, ',', COMMA);\n  tt(Start, '$', DOLLAR);\n  tt(Start, '.', DOT);\n  tt(Start, '=', EQUALS);\n  tt(Start, '!', EXCLAMATION);\n  tt(Start, '-', HYPHEN);\n  tt(Start, '%', PERCENT);\n  tt(Start, '|', PIPE);\n  tt(Start, '+', PLUS);\n  tt(Start, '#', POUND);\n  tt(Start, '?', QUERY);\n  tt(Start, '\"', QUOTE);\n  tt(Start, '/', SLASH);\n  tt(Start, ';', SEMI);\n  tt(Start, '~', TILDE);\n  tt(Start, '_', UNDERSCORE);\n  tt(Start, '\\\\', BACKSLASH);\n  const Num = tr(Start, DIGIT, NUM, {\n    [numeric]: true\n  });\n  tr(Num, DIGIT, Num);\n\n  // State which emits a word token\n  const Word = tr(Start, ASCII_LETTER, WORD, {\n    [ascii]: true\n  });\n  tr(Word, ASCII_LETTER, Word);\n\n  // Same as previous, but specific to non-fsm.ascii alphabet words\n  const UWord = tr(Start, LETTER, UWORD, {\n    [alpha]: true\n  });\n  tr(UWord, ASCII_LETTER); // Non-accepting\n  tr(UWord, LETTER, UWord);\n\n  // Whitespace jumps\n  // Tokens of only non-newline whitespace are arbitrarily long\n  // If any whitespace except newline, more whitespace!\n  const Ws = tr(Start, SPACE, WS, {\n    [whitespace]: true\n  });\n  tt(Start, NL, NL$1, {\n    [whitespace]: true\n  });\n  tt(Ws, NL); // non-accepting state to avoid mixing whitespaces\n  tr(Ws, SPACE, Ws);\n\n  // Emoji tokens. They are not grouped by the scanner except in cases where a\n  // zero-width joiner is present\n  const Emoji = tr(Start, EMOJI, EMOJI$1, {\n    [emoji]: true\n  });\n  tr(Emoji, EMOJI, Emoji);\n  tt(Emoji, EMOJI_VARIATION, Emoji);\n  // tt(Start, EMOJI_VARIATION, Emoji); // This one is sketchy\n\n  const EmojiJoiner = tt(Emoji, EMOJI_JOINER);\n  tr(EmojiJoiner, EMOJI, Emoji);\n  // tt(EmojiJoiner, EMOJI_VARIATION, Emoji); // also sketchy\n\n  // Generates states for top-level domains\n  // Note that this is most accurate when tlds are in alphabetical order\n  const wordjr = [[ASCII_LETTER, Word]];\n  const uwordjr = [[ASCII_LETTER, null], [LETTER, UWord]];\n  for (let i = 0; i < tlds.length; i++) {\n    fastts(Start, tlds[i], TLD, WORD, wordjr);\n  }\n  for (let i = 0; i < utlds.length; i++) {\n    fastts(Start, utlds[i], UTLD, UWORD, uwordjr);\n  }\n  addToGroups(TLD, {\n    tld: true,\n    ascii: true\n  }, groups);\n  addToGroups(UTLD, {\n    utld: true,\n    alpha: true\n  }, groups);\n\n  // Collect the states generated by different protocols. NOTE: If any new TLDs\n  // get added that are also protocols, set the token to be the same as the\n  // protocol to ensure parsing works as expected.\n  fastts(Start, 'file', SCHEME, WORD, wordjr);\n  fastts(Start, 'mailto', SCHEME, WORD, wordjr);\n  fastts(Start, 'http', SLASH_SCHEME, WORD, wordjr);\n  fastts(Start, 'https', SLASH_SCHEME, WORD, wordjr);\n  fastts(Start, 'ftp', SLASH_SCHEME, WORD, wordjr);\n  fastts(Start, 'ftps', SLASH_SCHEME, WORD, wordjr);\n  addToGroups(SCHEME, {\n    scheme: true,\n    ascii: true\n  }, groups);\n  addToGroups(SLASH_SCHEME, {\n    slashscheme: true,\n    ascii: true\n  }, groups);\n\n  // Register custom schemes. Assumes each scheme is asciinumeric with hyphens\n  customSchemes = customSchemes.sort((a, b) => a[0] > b[0] ? 1 : -1);\n  for (let i = 0; i < customSchemes.length; i++) {\n    const sch = customSchemes[i][0];\n    const optionalSlashSlash = customSchemes[i][1];\n    const flags = optionalSlashSlash ? {\n      [scheme]: true\n    } : {\n      [slashscheme]: true\n    };\n    if (sch.indexOf('-') >= 0) {\n      flags[domain] = true;\n    } else if (!ASCII_LETTER.test(sch)) {\n      flags[numeric] = true; // numbers only\n    } else if (DIGIT.test(sch)) {\n      flags[asciinumeric] = true;\n    } else {\n      flags[ascii] = true;\n    }\n    ts(Start, sch, sch, flags);\n  }\n\n  // Localhost token\n  ts(Start, 'localhost', LOCALHOST, {\n    ascii: true\n  });\n\n  // Set default transition for start state (some symbol)\n  Start.jd = new State(SYM);\n  return {\n    start: Start,\n    tokens: assign({\n      groups\n    }, tk)\n  };\n}\n\n/**\n\tGiven a string, returns an array of TOKEN instances representing the\n\tcomposition of that string.\n\n\t@method run\n\t@param {State<string>} start scanner starting state\n\t@param {string} str input string to scan\n\t@return {Token[]} list of tokens, each with a type and value\n*/\nfunction run$1(start, str) {\n  // State machine is not case sensitive, so input is tokenized in lowercased\n  // form (still returns regular case). Uses selective `toLowerCase` because\n  // lowercasing the entire string causes the length and character position to\n  // vary in some non-English strings with V8-based runtimes.\n  const iterable = stringToArray(str.replace(/[A-Z]/g, c => c.toLowerCase()));\n  const charCount = iterable.length; // <= len if there are emojis, etc\n  const tokens = []; // return value\n\n  // cursor through the string itself, accounting for characters that have\n  // width with length 2 such as emojis\n  let cursor = 0;\n\n  // Cursor through the array-representation of the string\n  let charCursor = 0;\n\n  // Tokenize the string\n  while (charCursor < charCount) {\n    let state = start;\n    let nextState = null;\n    let tokenLength = 0;\n    let latestAccepting = null;\n    let sinceAccepts = -1;\n    let charsSinceAccepts = -1;\n    while (charCursor < charCount && (nextState = state.go(iterable[charCursor]))) {\n      state = nextState;\n\n      // Keep track of the latest accepting state\n      if (state.accepts()) {\n        sinceAccepts = 0;\n        charsSinceAccepts = 0;\n        latestAccepting = state;\n      } else if (sinceAccepts >= 0) {\n        sinceAccepts += iterable[charCursor].length;\n        charsSinceAccepts++;\n      }\n      tokenLength += iterable[charCursor].length;\n      cursor += iterable[charCursor].length;\n      charCursor++;\n    }\n\n    // Roll back to the latest accepting state\n    cursor -= sinceAccepts;\n    charCursor -= charsSinceAccepts;\n    tokenLength -= sinceAccepts;\n\n    // No more jumps, just make a new token from the last accepting one\n    tokens.push({\n      t: latestAccepting.t,\n      // token type/name\n      v: str.slice(cursor - tokenLength, cursor),\n      // string value\n      s: cursor - tokenLength,\n      // start index\n      e: cursor // end index (excluding)\n    });\n  }\n\n  return tokens;\n}\n\n/**\n * Convert a String to an Array of characters, taking into account that some\n * characters like emojis take up two string indexes.\n *\n * Adapted from core-js (MIT license)\n * https://github.com/zloirock/core-js/blob/2d69cf5f99ab3ea3463c395df81e5a15b68f49d9/packages/core-js/internals/string-multibyte.js\n *\n * @function stringToArray\n * @param {string} str\n * @returns {string[]}\n */\nfunction stringToArray(str) {\n  const result = [];\n  const len = str.length;\n  let index = 0;\n  while (index < len) {\n    let first = str.charCodeAt(index);\n    let second;\n    let char = first < 0xd800 || first > 0xdbff || index + 1 === len || (second = str.charCodeAt(index + 1)) < 0xdc00 || second > 0xdfff ? str[index] // single character\n    : str.slice(index, index + 2); // two-index characters\n    result.push(char);\n    index += char.length;\n  }\n  return result;\n}\n\n/**\n * Fast version of ts function for when transition defaults are well known\n * @param {State<string>} state\n * @param {string} input\n * @param {string} t\n * @param {string} defaultt\n * @param {[RegExp, State<string>][]} jr\n * @returns {State<string>}\n */\nfunction fastts(state, input, t, defaultt, jr) {\n  let next;\n  const len = input.length;\n  for (let i = 0; i < len - 1; i++) {\n    const char = input[i];\n    if (state.j[char]) {\n      next = state.j[char];\n    } else {\n      next = new State(defaultt);\n      next.jr = jr.slice();\n      state.j[char] = next;\n    }\n    state = next;\n  }\n  next = new State(t);\n  next.jr = jr.slice();\n  state.j[input[len - 1]] = next;\n  return next;\n}\n\n/**\n * Converts a string of Top-Level Domain names encoded in update-tlds.js back\n * into a list of strings.\n * @param {str} encoded encoded TLDs string\n * @returns {str[]} original TLDs list\n */\nfunction decodeTlds(encoded) {\n  const words = [];\n  const stack = [];\n  let i = 0;\n  let digits = '0123456789';\n  while (i < encoded.length) {\n    let popDigitCount = 0;\n    while (digits.indexOf(encoded[i + popDigitCount]) >= 0) {\n      popDigitCount++; // encountered some digits, have to pop to go one level up trie\n    }\n\n    if (popDigitCount > 0) {\n      words.push(stack.join('')); // whatever preceded the pop digits must be a word\n      for (let popCount = parseInt(encoded.substring(i, i + popDigitCount), 10); popCount > 0; popCount--) {\n        stack.pop();\n      }\n      i += popDigitCount;\n    } else {\n      stack.push(encoded[i]); // drop down a level into the trie\n      i++;\n    }\n  }\n  return words;\n}\n\n/**\n * An object where each key is a valid DOM Event Name such as `click` or `focus`\n * and each value is an event handler function.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/Element#events\n * @typedef {?{ [event: string]: Function }} EventListeners\n */\n\n/**\n * All formatted properties required to render a link, including `tagName`,\n * `attributes`, `content` and `eventListeners`.\n * @typedef {{ tagName: any, attributes: {[attr: string]: any}, content: string,\n * eventListeners: EventListeners }} IntermediateRepresentation\n */\n\n/**\n * Specify either an object described by the template type `O` or a function.\n *\n * The function takes a string value (usually the link's href attribute), the\n * link type (`'url'`, `'hashtag`', etc.) and an internal token representation\n * of the link. It should return an object of the template type `O`\n * @template O\n * @typedef {O | ((value: string, type: string, token: MultiToken) => O)} OptObj\n */\n\n/**\n * Specify either a function described by template type `F` or an object.\n *\n * Each key in the object should be a link type (`'url'`, `'hashtag`', etc.). Each\n * value should be a function with template type `F` that is called when the\n * corresponding link type is encountered.\n * @template F\n * @typedef {F | { [type: string]: F}} OptFn\n */\n\n/**\n * Specify either a value with template type `V`, a function that returns `V` or\n * an object where each value resolves to `V`.\n *\n * The function takes a string value (usually the link's href attribute), the\n * link type (`'url'`, `'hashtag`', etc.) and an internal token representation\n * of the link. It should return an object of the template type `V`\n *\n * For the object, each key should be a link type (`'url'`, `'hashtag`', etc.).\n * Each value should either have type `V` or a function that returns V. This\n * function similarly takes a string value and a token.\n *\n * Example valid types for `Opt<string>`:\n *\n * ```js\n * 'hello'\n * (value, type, token) => 'world'\n * { url: 'hello', email: (value, token) => 'world'}\n * ```\n * @template V\n * @typedef {V | ((value: string, type: string, token: MultiToken) => V) | { [type: string]: V | ((value: string, token: MultiToken) => V) }} Opt\n */\n\n/**\n * See available options: https://linkify.js.org/docs/options.html\n * @typedef {{\n * \tdefaultProtocol?: string,\n *  events?: OptObj<EventListeners>,\n * \tformat?: Opt<string>,\n * \tformatHref?: Opt<string>,\n * \tnl2br?: boolean,\n * \ttagName?: Opt<any>,\n * \ttarget?: Opt<string>,\n * \trel?: Opt<string>,\n * \tvalidate?: Opt<boolean>,\n * \ttruncate?: Opt<number>,\n * \tclassName?: Opt<string>,\n * \tattributes?: OptObj<({ [attr: string]: any })>,\n *  ignoreTags?: string[],\n * \trender?: OptFn<((ir: IntermediateRepresentation) => any)>\n * }} Opts\n */\n\n/**\n * @type Required<Opts>\n */\nconst defaults = {\n  defaultProtocol: 'http',\n  events: null,\n  format: noop,\n  formatHref: noop,\n  nl2br: false,\n  tagName: 'a',\n  target: null,\n  rel: null,\n  validate: true,\n  truncate: Infinity,\n  className: null,\n  attributes: null,\n  ignoreTags: [],\n  render: null\n};\n\n/**\n * Utility class for linkify interfaces to apply specified\n * {@link Opts formatting and rendering options}.\n *\n * @param {Opts | Options} [opts] Option value overrides.\n * @param {(ir: IntermediateRepresentation) => any} [defaultRender] (For\n *   internal use) default render function that determines how to generate an\n *   HTML element based on a link token's derived tagName, attributes and HTML.\n *   Similar to render option\n */\nfunction Options(opts, defaultRender) {\n  if (defaultRender === void 0) {\n    defaultRender = null;\n  }\n  let o = assign({}, defaults);\n  if (opts) {\n    o = assign(o, opts instanceof Options ? opts.o : opts);\n  }\n\n  // Ensure all ignored tags are uppercase\n  const ignoredTags = o.ignoreTags;\n  const uppercaseIgnoredTags = [];\n  for (let i = 0; i < ignoredTags.length; i++) {\n    uppercaseIgnoredTags.push(ignoredTags[i].toUpperCase());\n  }\n  /** @protected */\n  this.o = o;\n  if (defaultRender) {\n    this.defaultRender = defaultRender;\n  }\n  this.ignoreTags = uppercaseIgnoredTags;\n}\nOptions.prototype = {\n  o: defaults,\n  /**\n   * @type string[]\n   */\n  ignoreTags: [],\n  /**\n   * @param {IntermediateRepresentation} ir\n   * @returns {any}\n   */\n  defaultRender(ir) {\n    return ir;\n  },\n  /**\n   * Returns true or false based on whether a token should be displayed as a\n   * link based on the user options.\n   * @param {MultiToken} token\n   * @returns {boolean}\n   */\n  check(token) {\n    return this.get('validate', token.toString(), token);\n  },\n  // Private methods\n\n  /**\n   * Resolve an option's value based on the value of the option and the given\n   * params. If operator and token are specified and the target option is\n   * callable, automatically calls the function with the given argument.\n   * @template {keyof Opts} K\n   * @param {K} key Name of option to use\n   * @param {string} [operator] will be passed to the target option if it's a\n   * function. If not specified, RAW function value gets returned\n   * @param {MultiToken} [token] The token from linkify.tokenize\n   * @returns {Opts[K] | any}\n   */\n  get(key, operator, token) {\n    const isCallable = operator != null;\n    let option = this.o[key];\n    if (!option) {\n      return option;\n    }\n    if (typeof option === 'object') {\n      option = token.t in option ? option[token.t] : defaults[key];\n      if (typeof option === 'function' && isCallable) {\n        option = option(operator, token);\n      }\n    } else if (typeof option === 'function' && isCallable) {\n      option = option(operator, token.t, token);\n    }\n    return option;\n  },\n  /**\n   * @template {keyof Opts} L\n   * @param {L} key Name of options object to use\n   * @param {string} [operator]\n   * @param {MultiToken} [token]\n   * @returns {Opts[L] | any}\n   */\n  getObj(key, operator, token) {\n    let obj = this.o[key];\n    if (typeof obj === 'function' && operator != null) {\n      obj = obj(operator, token.t, token);\n    }\n    return obj;\n  },\n  /**\n   * Convert the given token to a rendered element that may be added to the\n   * calling-interface's DOM\n   * @param {MultiToken} token Token to render to an HTML element\n   * @returns {any} Render result; e.g., HTML string, DOM element, React\n   *   Component, etc.\n   */\n  render(token) {\n    const ir = token.render(this); // intermediate representation\n    const renderFn = this.get('render', null, token) || this.defaultRender;\n    return renderFn(ir, token.t, token);\n  }\n};\nfunction noop(val) {\n  return val;\n}\n\nvar options = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tdefaults: defaults,\n\tOptions: Options,\n\tassign: assign\n});\n\n/******************************************************************************\n\tMulti-Tokens\n\tTokens composed of arrays of TextTokens\n******************************************************************************/\n\n/**\n * @param {string} value\n * @param {Token[]} tokens\n */\nfunction MultiToken(value, tokens) {\n  this.t = 'token';\n  this.v = value;\n  this.tk = tokens;\n}\n\n/**\n * Abstract class used for manufacturing tokens of text tokens. That is rather\n * than the value for a token being a small string of text, it's value an array\n * of text tokens.\n *\n * Used for grouping together URLs, emails, hashtags, and other potential\n * creations.\n * @class MultiToken\n * @property {string} t\n * @property {string} v\n * @property {Token[]} tk\n * @abstract\n */\nMultiToken.prototype = {\n  isLink: false,\n  /**\n   * Return the string this token represents.\n   * @return {string}\n   */\n  toString() {\n    return this.v;\n  },\n  /**\n   * What should the value for this token be in the `href` HTML attribute?\n   * Returns the `.toString` value by default.\n   * @param {string} [scheme]\n   * @return {string}\n  */\n  toHref(scheme) {\n    return this.toString();\n  },\n  /**\n   * @param {Options} options Formatting options\n   * @returns {string}\n   */\n  toFormattedString(options) {\n    const val = this.toString();\n    const truncate = options.get('truncate', val, this);\n    const formatted = options.get('format', val, this);\n    return truncate && formatted.length > truncate ? formatted.substring(0, truncate) + '…' : formatted;\n  },\n  /**\n   *\n   * @param {Options} options\n   * @returns {string}\n   */\n  toFormattedHref(options) {\n    return options.get('formatHref', this.toHref(options.get('defaultProtocol')), this);\n  },\n  /**\n   * The start index of this token in the original input string\n   * @returns {number}\n   */\n  startIndex() {\n    return this.tk[0].s;\n  },\n  /**\n   * The end index of this token in the original input string (up to this\n   * index but not including it)\n   * @returns {number}\n   */\n  endIndex() {\n    return this.tk[this.tk.length - 1].e;\n  },\n  /**\n  \tReturns an object  of relevant values for this token, which includes keys\n  \t* type - Kind of token ('url', 'email', etc.)\n  \t* value - Original text\n  \t* href - The value that should be added to the anchor tag's href\n  \t\tattribute\n  \t\t@method toObject\n  \t@param {string} [protocol] `'http'` by default\n  */\n  toObject(protocol) {\n    if (protocol === void 0) {\n      protocol = defaults.defaultProtocol;\n    }\n    return {\n      type: this.t,\n      value: this.toString(),\n      isLink: this.isLink,\n      href: this.toHref(protocol),\n      start: this.startIndex(),\n      end: this.endIndex()\n    };\n  },\n  /**\n   *\n   * @param {Options} options Formatting option\n   */\n  toFormattedObject(options) {\n    return {\n      type: this.t,\n      value: this.toFormattedString(options),\n      isLink: this.isLink,\n      href: this.toFormattedHref(options),\n      start: this.startIndex(),\n      end: this.endIndex()\n    };\n  },\n  /**\n   * Whether this token should be rendered as a link according to the given options\n   * @param {Options} options\n   * @returns {boolean}\n   */\n  validate(options) {\n    return options.get('validate', this.toString(), this);\n  },\n  /**\n   * Return an object that represents how this link should be rendered.\n   * @param {Options} options Formattinng options\n   */\n  render(options) {\n    const token = this;\n    const href = this.toHref(options.get('defaultProtocol'));\n    const formattedHref = options.get('formatHref', href, this);\n    const tagName = options.get('tagName', href, token);\n    const content = this.toFormattedString(options);\n    const attributes = {};\n    const className = options.get('className', href, token);\n    const target = options.get('target', href, token);\n    const rel = options.get('rel', href, token);\n    const attrs = options.getObj('attributes', href, token);\n    const eventListeners = options.getObj('events', href, token);\n    attributes.href = formattedHref;\n    if (className) {\n      attributes.class = className;\n    }\n    if (target) {\n      attributes.target = target;\n    }\n    if (rel) {\n      attributes.rel = rel;\n    }\n    if (attrs) {\n      assign(attributes, attrs);\n    }\n    return {\n      tagName,\n      attributes,\n      content,\n      eventListeners\n    };\n  }\n};\n\n/**\n * Create a new token that can be emitted by the parser state machine\n * @param {string} type readable type of the token\n * @param {object} props properties to assign or override, including isLink = true or false\n * @returns {new (value: string, tokens: Token[]) => MultiToken} new token class\n */\nfunction createTokenClass(type, props) {\n  class Token extends MultiToken {\n    constructor(value, tokens) {\n      super(value, tokens);\n      this.t = type;\n    }\n  }\n  for (const p in props) {\n    Token.prototype[p] = props[p];\n  }\n  Token.t = type;\n  return Token;\n}\n\n/**\n\tRepresents a list of tokens making up a valid email address\n*/\nconst Email = createTokenClass('email', {\n  isLink: true,\n  toHref() {\n    return 'mailto:' + this.toString();\n  }\n});\n\n/**\n\tRepresents some plain text\n*/\nconst Text = createTokenClass('text');\n\n/**\n\tMulti-linebreak token - represents a line break\n\t@class Nl\n*/\nconst Nl = createTokenClass('nl');\n\n/**\n\tRepresents a list of text tokens making up a valid URL\n\t@class Url\n*/\nconst Url = createTokenClass('url', {\n  isLink: true,\n  /**\n  \tLowercases relevant parts of the domain and adds the protocol if\n  \trequired. Note that this will not escape unsafe HTML characters in the\n  \tURL.\n  \t\t@param {string} [scheme] default scheme (e.g., 'https')\n  \t@return {string} the full href\n  */\n  toHref(scheme) {\n    if (scheme === void 0) {\n      scheme = defaults.defaultProtocol;\n    }\n    // Check if already has a prefix scheme\n    return this.hasProtocol() ? this.v : `${scheme}://${this.v}`;\n  },\n  /**\n   * Check whether this URL token has a protocol\n   * @return {boolean}\n   */\n  hasProtocol() {\n    const tokens = this.tk;\n    return tokens.length >= 2 && tokens[0].t !== LOCALHOST && tokens[1].t === COLON;\n  }\n});\n\nvar multi = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tMultiToken: MultiToken,\n\tBase: MultiToken,\n\tcreateTokenClass: createTokenClass,\n\tEmail: Email,\n\tText: Text,\n\tNl: Nl,\n\tUrl: Url\n});\n\n/**\n\tNot exactly parser, more like the second-stage scanner (although we can\n\ttheoretically hotswap the code here with a real parser in the future... but\n\tfor a little URL-finding utility abstract syntax trees may be a little\n\toverkill).\n\n\tURL format: http://en.wikipedia.org/wiki/URI_scheme\n\tEmail format: http://en.wikipedia.org/wiki/EmailAddress (links to RFC in\n\treference)\n\n\t@module linkify\n\t@submodule parser\n\t@main run\n*/\nconst makeState = arg => new State(arg);\n\n/**\n * Generate the parser multi token-based state machine\n * @param {{ groups: Collections<string> }} tokens\n */\nfunction init$1(_ref) {\n  let {\n    groups\n  } = _ref;\n  // Types of characters the URL can definitely end in\n  const qsAccepting = groups.domain.concat([AMPERSAND, ASTERISK, AT, BACKSLASH, BACKTICK, CARET, DOLLAR, EQUALS, HYPHEN, NUM, PERCENT, PIPE, PLUS, POUND, SLASH, SYM, TILDE, UNDERSCORE]);\n\n  // Types of tokens that can follow a URL and be part of the query string\n  // but cannot be the very last characters\n  // Characters that cannot appear in the URL at all should be excluded\n  const qsNonAccepting = [APOSTROPHE, COLON, COMMA, DOT, EXCLAMATION, QUERY, QUOTE, SEMI, OPENANGLEBRACKET, CLOSEANGLEBRACKET, OPENBRACE, CLOSEBRACE, CLOSEBRACKET, OPENBRACKET, OPENPAREN, CLOSEPAREN, FULLWIDTHLEFTPAREN, FULLWIDTHRIGHTPAREN, LEFTCORNERBRACKET, RIGHTCORNERBRACKET, LEFTWHITECORNERBRACKET, RIGHTWHITECORNERBRACKET, FULLWIDTHLESSTHAN, FULLWIDTHGREATERTHAN];\n\n  // For addresses without the mailto prefix\n  // Tokens allowed in the localpart of the email\n  const localpartAccepting = [AMPERSAND, APOSTROPHE, ASTERISK, BACKSLASH, BACKTICK, CARET, DOLLAR, EQUALS, HYPHEN, OPENBRACE, CLOSEBRACE, PERCENT, PIPE, PLUS, POUND, QUERY, SLASH, SYM, TILDE, UNDERSCORE];\n\n  // The universal starting state.\n  /**\n   * @type State<Token>\n   */\n  const Start = makeState();\n  const Localpart = tt(Start, TILDE); // Local part of the email address\n  ta(Localpart, localpartAccepting, Localpart);\n  ta(Localpart, groups.domain, Localpart);\n  const Domain = makeState(),\n    Scheme = makeState(),\n    SlashScheme = makeState();\n  ta(Start, groups.domain, Domain); // parsed string ends with a potential domain name (A)\n  ta(Start, groups.scheme, Scheme); // e.g., 'mailto'\n  ta(Start, groups.slashscheme, SlashScheme); // e.g., 'http'\n\n  ta(Domain, localpartAccepting, Localpart);\n  ta(Domain, groups.domain, Domain);\n  const LocalpartAt = tt(Domain, AT); // Local part of the email address plus @\n\n  tt(Localpart, AT, LocalpartAt); // close to an email address now\n\n  // Local part of an email address can be e.g. 'http' or 'mailto'\n  tt(Scheme, AT, LocalpartAt);\n  tt(SlashScheme, AT, LocalpartAt);\n  const LocalpartDot = tt(Localpart, DOT); // Local part of the email address plus '.' (localpart cannot end in .)\n  ta(LocalpartDot, localpartAccepting, Localpart);\n  ta(LocalpartDot, groups.domain, Localpart);\n  const EmailDomain = makeState();\n  ta(LocalpartAt, groups.domain, EmailDomain); // parsed string starts with local email info + @ with a potential domain name\n  ta(EmailDomain, groups.domain, EmailDomain);\n  const EmailDomainDot = tt(EmailDomain, DOT); // domain followed by DOT\n  ta(EmailDomainDot, groups.domain, EmailDomain);\n  const Email$1 = makeState(Email); // Possible email address (could have more tlds)\n  ta(EmailDomainDot, groups.tld, Email$1);\n  ta(EmailDomainDot, groups.utld, Email$1);\n  tt(LocalpartAt, LOCALHOST, Email$1);\n\n  // Hyphen can jump back to a domain name\n  const EmailDomainHyphen = tt(EmailDomain, HYPHEN); // parsed string starts with local email info + @ with a potential domain name\n  ta(EmailDomainHyphen, groups.domain, EmailDomain);\n  ta(Email$1, groups.domain, EmailDomain);\n  tt(Email$1, DOT, EmailDomainDot);\n  tt(Email$1, HYPHEN, EmailDomainHyphen);\n\n  // Final possible email states\n  const EmailColon = tt(Email$1, COLON); // URL followed by colon (potential port number here)\n  /*const EmailColonPort = */\n  ta(EmailColon, groups.numeric, Email); // URL followed by colon and port number\n\n  // Account for dots and hyphens. Hyphens are usually parts of domain names\n  // (but not TLDs)\n  const DomainHyphen = tt(Domain, HYPHEN); // domain followed by hyphen\n  const DomainDot = tt(Domain, DOT); // domain followed by DOT\n  ta(DomainHyphen, groups.domain, Domain);\n  ta(DomainDot, localpartAccepting, Localpart);\n  ta(DomainDot, groups.domain, Domain);\n  const DomainDotTld = makeState(Url); // Simplest possible URL with no query string\n  ta(DomainDot, groups.tld, DomainDotTld);\n  ta(DomainDot, groups.utld, DomainDotTld);\n  ta(DomainDotTld, groups.domain, Domain);\n  ta(DomainDotTld, localpartAccepting, Localpart);\n  tt(DomainDotTld, DOT, DomainDot);\n  tt(DomainDotTld, HYPHEN, DomainHyphen);\n  tt(DomainDotTld, AT, LocalpartAt);\n  const DomainDotTldColon = tt(DomainDotTld, COLON); // URL followed by colon (potential port number here)\n  const DomainDotTldColonPort = makeState(Url); // TLD followed by a port number\n  ta(DomainDotTldColon, groups.numeric, DomainDotTldColonPort);\n\n  // Long URL with optional port and maybe query string\n  const Url$1 = makeState(Url);\n\n  // URL with extra symbols at the end, followed by an opening bracket\n  const UrlNonaccept = makeState(); // URL followed by some symbols (will not be part of the final URL)\n\n  // Query strings\n  ta(Url$1, qsAccepting, Url$1);\n  ta(Url$1, qsNonAccepting, UrlNonaccept);\n  ta(UrlNonaccept, qsAccepting, Url$1);\n  ta(UrlNonaccept, qsNonAccepting, UrlNonaccept);\n\n  // Become real URLs after `SLASH` or `COLON NUM SLASH`\n  // Here works with or without scheme:// prefix\n  tt(DomainDotTld, SLASH, Url$1);\n  tt(DomainDotTldColonPort, SLASH, Url$1);\n\n  // Note that domains that begin with schemes are treated slighly differently\n  const SchemeColon = tt(Scheme, COLON); // e.g., 'mailto:'\n  const SlashSchemeColon = tt(SlashScheme, COLON); // e.g., 'http:'\n  const SlashSchemeColonSlash = tt(SlashSchemeColon, SLASH); // e.g., 'http:/'\n\n  const UriPrefix = tt(SlashSchemeColonSlash, SLASH); // e.g., 'http://'\n\n  // Scheme states can transition to domain states\n  ta(Scheme, groups.domain, Domain);\n  tt(Scheme, DOT, DomainDot);\n  tt(Scheme, HYPHEN, DomainHyphen);\n  ta(SlashScheme, groups.domain, Domain);\n  tt(SlashScheme, DOT, DomainDot);\n  tt(SlashScheme, HYPHEN, DomainHyphen);\n\n  // Force URL with scheme prefix followed by anything sane\n  ta(SchemeColon, groups.domain, Url$1);\n  tt(SchemeColon, SLASH, Url$1);\n  ta(UriPrefix, groups.domain, Url$1);\n  ta(UriPrefix, qsAccepting, Url$1);\n  tt(UriPrefix, SLASH, Url$1);\n  const bracketPairs = [[OPENBRACE, CLOSEBRACE],\n  // {}\n  [OPENBRACKET, CLOSEBRACKET],\n  // []\n  [OPENPAREN, CLOSEPAREN],\n  // ()\n  [OPENANGLEBRACKET, CLOSEANGLEBRACKET],\n  // <>\n  [FULLWIDTHLEFTPAREN, FULLWIDTHRIGHTPAREN],\n  // ()\n  [LEFTCORNERBRACKET, RIGHTCORNERBRACKET],\n  // 「」\n  [LEFTWHITECORNERBRACKET, RIGHTWHITECORNERBRACKET],\n  // 『』\n  [FULLWIDTHLESSTHAN, FULLWIDTHGREATERTHAN] // <>\n  ];\n\n  for (let i = 0; i < bracketPairs.length; i++) {\n    const [OPEN, CLOSE] = bracketPairs[i];\n    const UrlOpen = tt(Url$1, OPEN); // URL followed by open bracket\n\n    // Continue not accepting for open brackets\n    tt(UrlNonaccept, OPEN, UrlOpen);\n\n    // Closing bracket component. This character WILL be included in the URL\n    tt(UrlOpen, CLOSE, Url$1);\n\n    // URL that beings with an opening bracket, followed by a symbols.\n    // Note that the final state can still be `UrlOpen` (if the URL has a\n    // single opening bracket for some reason).\n    const UrlOpenQ = makeState(Url);\n    ta(UrlOpen, qsAccepting, UrlOpenQ);\n    const UrlOpenSyms = makeState(); // UrlOpen followed by some symbols it cannot end it\n    ta(UrlOpen, qsNonAccepting);\n\n    // URL that begins with an opening bracket, followed by some symbols\n    ta(UrlOpenQ, qsAccepting, UrlOpenQ);\n    ta(UrlOpenQ, qsNonAccepting, UrlOpenSyms);\n    ta(UrlOpenSyms, qsAccepting, UrlOpenQ);\n    ta(UrlOpenSyms, qsNonAccepting, UrlOpenSyms);\n\n    // Close brace/bracket to become regular URL\n    tt(UrlOpenQ, CLOSE, Url$1);\n    tt(UrlOpenSyms, CLOSE, Url$1);\n  }\n  tt(Start, LOCALHOST, DomainDotTld); // localhost is a valid URL state\n  tt(Start, NL$1, Nl); // single new line\n\n  return {\n    start: Start,\n    tokens: tk\n  };\n}\n\n/**\n * Run the parser state machine on a list of scanned string-based tokens to\n * create a list of multi tokens, each of which represents a URL, email address,\n * plain text, etc.\n *\n * @param {State<MultiToken>} start parser start state\n * @param {string} input the original input used to generate the given tokens\n * @param {Token[]} tokens list of scanned tokens\n * @returns {MultiToken[]}\n */\nfunction run(start, input, tokens) {\n  let len = tokens.length;\n  let cursor = 0;\n  let multis = [];\n  let textTokens = [];\n  while (cursor < len) {\n    let state = start;\n    let secondState = null;\n    let nextState = null;\n    let multiLength = 0;\n    let latestAccepting = null;\n    let sinceAccepts = -1;\n    while (cursor < len && !(secondState = state.go(tokens[cursor].t))) {\n      // Starting tokens with nowhere to jump to.\n      // Consider these to be just plain text\n      textTokens.push(tokens[cursor++]);\n    }\n    while (cursor < len && (nextState = secondState || state.go(tokens[cursor].t))) {\n      // Get the next state\n      secondState = null;\n      state = nextState;\n\n      // Keep track of the latest accepting state\n      if (state.accepts()) {\n        sinceAccepts = 0;\n        latestAccepting = state;\n      } else if (sinceAccepts >= 0) {\n        sinceAccepts++;\n      }\n      cursor++;\n      multiLength++;\n    }\n    if (sinceAccepts < 0) {\n      // No accepting state was found, part of a regular text token add\n      // the first text token to the text tokens array and try again from\n      // the next\n      cursor -= multiLength;\n      if (cursor < len) {\n        textTokens.push(tokens[cursor]);\n        cursor++;\n      }\n    } else {\n      // Accepting state!\n      // First close off the textTokens (if available)\n      if (textTokens.length > 0) {\n        multis.push(initMultiToken(Text, input, textTokens));\n        textTokens = [];\n      }\n\n      // Roll back to the latest accepting state\n      cursor -= sinceAccepts;\n      multiLength -= sinceAccepts;\n\n      // Create a new multitoken\n      const Multi = latestAccepting.t;\n      const subtokens = tokens.slice(cursor - multiLength, cursor);\n      multis.push(initMultiToken(Multi, input, subtokens));\n    }\n  }\n\n  // Finally close off the textTokens (if available)\n  if (textTokens.length > 0) {\n    multis.push(initMultiToken(Text, input, textTokens));\n  }\n  return multis;\n}\n\n/**\n * Utility function for instantiating a new multitoken with all the relevant\n * fields during parsing.\n * @param {new (value: string, tokens: Token[]) => MultiToken} Multi class to instantiate\n * @param {string} input original input string\n * @param {Token[]} tokens consecutive tokens scanned from input string\n * @returns {MultiToken}\n */\nfunction initMultiToken(Multi, input, tokens) {\n  const startIdx = tokens[0].s;\n  const endIdx = tokens[tokens.length - 1].e;\n  const value = input.slice(startIdx, endIdx);\n  return new Multi(value, tokens);\n}\n\nconst warn = typeof console !== 'undefined' && console && console.warn || (() => {});\nconst warnAdvice = 'until manual call of linkify.init(). Register all schemes and plugins before invoking linkify the first time.';\n\n// Side-effect initialization state\nconst INIT = {\n  scanner: null,\n  parser: null,\n  tokenQueue: [],\n  pluginQueue: [],\n  customSchemes: [],\n  initialized: false\n};\n\n/**\n * @typedef {{\n * \tstart: State<string>,\n * \ttokens: { groups: Collections<string> } & typeof tk\n * }} ScannerInit\n */\n\n/**\n * @typedef {{\n * \tstart: State<MultiToken>,\n * \ttokens: typeof multi\n * }} ParserInit\n */\n\n/**\n * @typedef {(arg: { scanner: ScannerInit }) => void} TokenPlugin\n */\n\n/**\n * @typedef {(arg: { scanner: ScannerInit, parser: ParserInit }) => void} Plugin\n */\n\n/**\n * De-register all plugins and reset the internal state-machine. Used for\n * testing; not required in practice.\n * @private\n */\nfunction reset() {\n  State.groups = {};\n  INIT.scanner = null;\n  INIT.parser = null;\n  INIT.tokenQueue = [];\n  INIT.pluginQueue = [];\n  INIT.customSchemes = [];\n  INIT.initialized = false;\n}\n\n/**\n * Register a token plugin to allow the scanner to recognize additional token\n * types before the parser state machine is constructed from the results.\n * @param {string} name of plugin to register\n * @param {TokenPlugin} plugin function that accepts the scanner state machine\n * and available scanner tokens and collections and extends the state machine to\n * recognize additional tokens or groups.\n */\nfunction registerTokenPlugin(name, plugin) {\n  if (typeof plugin !== 'function') {\n    throw new Error(`linkifyjs: Invalid token plugin ${plugin} (expects function)`);\n  }\n  for (let i = 0; i < INIT.tokenQueue.length; i++) {\n    if (name === INIT.tokenQueue[i][0]) {\n      warn(`linkifyjs: token plugin \"${name}\" already registered - will be overwritten`);\n      INIT.tokenQueue[i] = [name, plugin];\n      return;\n    }\n  }\n  INIT.tokenQueue.push([name, plugin]);\n  if (INIT.initialized) {\n    warn(`linkifyjs: already initialized - will not register token plugin \"${name}\" ${warnAdvice}`);\n  }\n}\n\n/**\n * Register a linkify plugin\n * @param {string} name of plugin to register\n * @param {Plugin} plugin function that accepts the parser state machine and\n * extends the parser to recognize additional link types\n */\nfunction registerPlugin(name, plugin) {\n  if (typeof plugin !== 'function') {\n    throw new Error(`linkifyjs: Invalid plugin ${plugin} (expects function)`);\n  }\n  for (let i = 0; i < INIT.pluginQueue.length; i++) {\n    if (name === INIT.pluginQueue[i][0]) {\n      warn(`linkifyjs: plugin \"${name}\" already registered - will be overwritten`);\n      INIT.pluginQueue[i] = [name, plugin];\n      return;\n    }\n  }\n  INIT.pluginQueue.push([name, plugin]);\n  if (INIT.initialized) {\n    warn(`linkifyjs: already initialized - will not register plugin \"${name}\" ${warnAdvice}`);\n  }\n}\n\n/**\n * Detect URLs with the following additional protocol. Anything with format\n * \"protocol://...\" will be considered a link. If `optionalSlashSlash` is set to\n * `true`, anything with format \"protocol:...\" will be considered a link.\n * @param {string} protocol\n * @param {boolean} [optionalSlashSlash]\n */\nfunction registerCustomProtocol(scheme, optionalSlashSlash) {\n  if (optionalSlashSlash === void 0) {\n    optionalSlashSlash = false;\n  }\n  if (INIT.initialized) {\n    warn(`linkifyjs: already initialized - will not register custom scheme \"${scheme}\" ${warnAdvice}`);\n  }\n  if (!/^[0-9a-z]+(-[0-9a-z]+)*$/.test(scheme)) {\n    throw new Error(`linkifyjs: incorrect scheme format.\n1. Must only contain digits, lowercase ASCII letters or \"-\"\n2. Cannot start or end with \"-\"\n3. \"-\" cannot repeat`);\n  }\n  INIT.customSchemes.push([scheme, optionalSlashSlash]);\n}\n\n/**\n * Initialize the linkify state machine. Called automatically the first time\n * linkify is called on a string, but may be called manually as well.\n */\nfunction init() {\n  // Initialize scanner state machine and plugins\n  INIT.scanner = init$2(INIT.customSchemes);\n  for (let i = 0; i < INIT.tokenQueue.length; i++) {\n    INIT.tokenQueue[i][1]({\n      scanner: INIT.scanner\n    });\n  }\n\n  // Initialize parser state machine and plugins\n  INIT.parser = init$1(INIT.scanner.tokens);\n  for (let i = 0; i < INIT.pluginQueue.length; i++) {\n    INIT.pluginQueue[i][1]({\n      scanner: INIT.scanner,\n      parser: INIT.parser\n    });\n  }\n  INIT.initialized = true;\n}\n\n/**\n * Parse a string into tokens that represent linkable and non-linkable sub-components\n * @param {string} str\n * @return {MultiToken[]} tokens\n */\nfunction tokenize(str) {\n  if (!INIT.initialized) {\n    init();\n  }\n  return run(INIT.parser.start, str, run$1(INIT.scanner.start, str));\n}\n\n/**\n * Find a list of linkable items in the given string.\n * @param {string} str string to find links in\n * @param {string | Opts} [type] either formatting options or specific type of\n * links to find, e.g., 'url' or 'email'\n * @param {Opts} [opts] formatting options for final output. Cannot be specified\n * if opts already provided in `type` argument\n */\nfunction find(str, type, opts) {\n  if (type === void 0) {\n    type = null;\n  }\n  if (opts === void 0) {\n    opts = null;\n  }\n  if (type && typeof type === 'object') {\n    if (opts) {\n      throw Error(`linkifyjs: Invalid link type ${type}; must be a string`);\n    }\n    opts = type;\n    type = null;\n  }\n  const options = new Options(opts);\n  const tokens = tokenize(str);\n  const filtered = [];\n  for (let i = 0; i < tokens.length; i++) {\n    const token = tokens[i];\n    if (token.isLink && (!type || token.t === type) && options.check(token)) {\n      filtered.push(token.toFormattedObject(options));\n    }\n  }\n  return filtered;\n}\n\n/**\n * Is the given string valid linkable text of some sort. Note that this does not\n * trim the text for you.\n *\n * Optionally pass in a second `type` param, which is the type of link to test\n * for.\n *\n * For example,\n *\n *     linkify.test(str, 'email');\n *\n * Returns `true` if str is a valid email.\n * @param {string} str string to test for links\n * @param {string} [type] optional specific link type to look for\n * @returns boolean true/false\n */\nfunction test(str, type) {\n  if (type === void 0) {\n    type = null;\n  }\n  const tokens = tokenize(str);\n  return tokens.length === 1 && tokens[0].isLink && (!type || tokens[0].t === type);\n}\n\nexport { MultiToken, Options, State, createTokenClass, find, init, multi, options, regexp, registerCustomProtocol, registerPlugin, registerTokenPlugin, reset, stringToArray, test, tokenize };\n","import { combineTransactionSteps, getChangedRanges, findChildrenInRange, getMarksBetween, getAttributes, Mark, mergeAttributes, markPasteRule } from '@tiptap/core';\nimport { tokenize, find, registerCustomProtocol, reset } from 'linkifyjs';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\n\n/**\n * Check if the provided tokens form a valid link structure, which can either be a single link token\n * or a link token surrounded by parentheses or square brackets.\n *\n * This ensures that only complete and valid text is hyperlinked, preventing cases where a valid\n * top-level domain (TLD) is immediately followed by an invalid character, like a number. For\n * example, with the `find` method from Linkify, entering `example.com1` would result in\n * `example.com` being linked and the trailing `1` left as plain text. By using the `tokenize`\n * method, we can perform more comprehensive validation on the input text.\n */\nfunction isValidLinkStructure(tokens) {\n    if (tokens.length === 1) {\n        return tokens[0].isLink;\n    }\n    if (tokens.length === 3 && tokens[1].isLink) {\n        return ['()', '[]'].includes(tokens[0].value + tokens[2].value);\n    }\n    return false;\n}\n/**\n * This plugin allows you to automatically add links to your editor.\n * @param options The plugin options\n * @returns The plugin instance\n */\nfunction autolink(options) {\n    return new Plugin({\n        key: new PluginKey('autolink'),\n        appendTransaction: (transactions, oldState, newState) => {\n            /**\n             * Does the transaction change the document?\n             */\n            const docChanges = transactions.some(transaction => transaction.docChanged) && !oldState.doc.eq(newState.doc);\n            /**\n             * Prevent autolink if the transaction is not a document change or if the transaction has the meta `preventAutolink`.\n             */\n            const preventAutolink = transactions.some(transaction => transaction.getMeta('preventAutolink'));\n            /**\n             * Prevent autolink if the transaction is not a document change\n             * or if the transaction has the meta `preventAutolink`.\n             */\n            if (!docChanges || preventAutolink) {\n                return;\n            }\n            const { tr } = newState;\n            const transform = combineTransactionSteps(oldState.doc, [...transactions]);\n            const changes = getChangedRanges(transform);\n            changes.forEach(({ newRange }) => {\n                // Now let’s see if we can add new links.\n                const nodesInChangedRanges = findChildrenInRange(newState.doc, newRange, node => node.isTextblock);\n                let textBlock;\n                let textBeforeWhitespace;\n                if (nodesInChangedRanges.length > 1) {\n                    // Grab the first node within the changed ranges (ex. the first of two paragraphs when hitting enter).\n                    textBlock = nodesInChangedRanges[0];\n                    textBeforeWhitespace = newState.doc.textBetween(textBlock.pos, textBlock.pos + textBlock.node.nodeSize, undefined, ' ');\n                }\n                else if (nodesInChangedRanges.length\n                    // We want to make sure to include the block seperator argument to treat hard breaks like spaces.\n                    && newState.doc.textBetween(newRange.from, newRange.to, ' ', ' ').endsWith(' ')) {\n                    textBlock = nodesInChangedRanges[0];\n                    textBeforeWhitespace = newState.doc.textBetween(textBlock.pos, newRange.to, undefined, ' ');\n                }\n                if (textBlock && textBeforeWhitespace) {\n                    const wordsBeforeWhitespace = textBeforeWhitespace.split(' ').filter(s => s !== '');\n                    if (wordsBeforeWhitespace.length <= 0) {\n                        return false;\n                    }\n                    const lastWordBeforeSpace = wordsBeforeWhitespace[wordsBeforeWhitespace.length - 1];\n                    const lastWordAndBlockOffset = textBlock.pos + textBeforeWhitespace.lastIndexOf(lastWordBeforeSpace);\n                    if (!lastWordBeforeSpace) {\n                        return false;\n                    }\n                    const linksBeforeSpace = tokenize(lastWordBeforeSpace).map(t => t.toObject(options.defaultProtocol));\n                    if (!isValidLinkStructure(linksBeforeSpace)) {\n                        return false;\n                    }\n                    linksBeforeSpace\n                        .filter(link => link.isLink)\n                        // Calculate link position.\n                        .map(link => ({\n                        ...link,\n                        from: lastWordAndBlockOffset + link.start + 1,\n                        to: lastWordAndBlockOffset + link.end + 1,\n                    }))\n                        // ignore link inside code mark\n                        .filter(link => {\n                        if (!newState.schema.marks.code) {\n                            return true;\n                        }\n                        return !newState.doc.rangeHasMark(link.from, link.to, newState.schema.marks.code);\n                    })\n                        // validate link\n                        .filter(link => options.validate(link.value))\n                        // Add link mark.\n                        .forEach(link => {\n                        if (getMarksBetween(link.from, link.to, newState.doc).some(item => item.mark.type === options.type)) {\n                            return;\n                        }\n                        tr.addMark(link.from, link.to, options.type.create({\n                            href: link.href,\n                        }));\n                    });\n                }\n            });\n            if (!tr.steps.length) {\n                return;\n            }\n            return tr;\n        },\n    });\n}\n\nfunction clickHandler(options) {\n    return new Plugin({\n        key: new PluginKey('handleClickLink'),\n        props: {\n            handleClick: (view, pos, event) => {\n                var _a, _b;\n                if (event.button !== 0) {\n                    return false;\n                }\n                let a = event.target;\n                const els = [];\n                while (a.nodeName !== 'DIV') {\n                    els.push(a);\n                    a = a.parentNode;\n                }\n                if (!els.find(value => value.nodeName === 'A')) {\n                    return false;\n                }\n                const attrs = getAttributes(view.state, options.type.name);\n                const link = event.target;\n                const href = (_a = link === null || link === void 0 ? void 0 : link.href) !== null && _a !== void 0 ? _a : attrs.href;\n                const target = (_b = link === null || link === void 0 ? void 0 : link.target) !== null && _b !== void 0 ? _b : attrs.target;\n                if (link && href) {\n                    window.open(href, target);\n                    return true;\n                }\n                return false;\n            },\n        },\n    });\n}\n\nfunction pasteHandler(options) {\n    return new Plugin({\n        key: new PluginKey('handlePasteLink'),\n        props: {\n            handlePaste: (view, event, slice) => {\n                const { state } = view;\n                const { selection } = state;\n                const { empty } = selection;\n                if (empty) {\n                    return false;\n                }\n                let textContent = '';\n                slice.content.forEach(node => {\n                    textContent += node.textContent;\n                });\n                const link = find(textContent, { defaultProtocol: options.defaultProtocol }).find(item => item.isLink && item.value === textContent);\n                if (!textContent || !link) {\n                    return false;\n                }\n                options.editor.commands.setMark(options.type, {\n                    href: link.href,\n                });\n                return true;\n            },\n        },\n    });\n}\n\nconst pasteRegex = /https?:\\/\\/(?:www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z]{2,}\\b(?:[-a-zA-Z0-9@:%._+~#=?!&/]*)(?:[-a-zA-Z0-9@:%._+~#=?!&/]*)/gi;\n// From DOMPurify\n// https://github.com/cure53/DOMPurify/blob/main/src/regexp.js\nconst ATTR_WHITESPACE = /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g; // eslint-disable-line no-control-regex\nconst IS_ALLOWED_URI = /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i; // eslint-disable-line no-useless-escape\nfunction isAllowedUri(uri) {\n    return !uri || uri.replace(ATTR_WHITESPACE, '').match(IS_ALLOWED_URI);\n}\n/**\n * This extension allows you to create links.\n * @see https://www.tiptap.dev/api/marks/link\n */\nconst Link = Mark.create({\n    name: 'link',\n    priority: 1000,\n    keepOnSplit: false,\n    exitable: true,\n    onCreate() {\n        this.options.protocols.forEach(protocol => {\n            if (typeof protocol === 'string') {\n                registerCustomProtocol(protocol);\n                return;\n            }\n            registerCustomProtocol(protocol.scheme, protocol.optionalSlashes);\n        });\n    },\n    onDestroy() {\n        reset();\n    },\n    inclusive() {\n        return this.options.autolink;\n    },\n    addOptions() {\n        return {\n            openOnClick: true,\n            linkOnPaste: true,\n            autolink: true,\n            protocols: [],\n            defaultProtocol: 'http',\n            HTMLAttributes: {\n                target: '_blank',\n                rel: 'noopener noreferrer nofollow',\n                class: null,\n            },\n            validate: url => !!url,\n        };\n    },\n    addAttributes() {\n        return {\n            href: {\n                default: null,\n            },\n            target: {\n                default: this.options.HTMLAttributes.target,\n            },\n            rel: {\n                default: this.options.HTMLAttributes.rel,\n            },\n            class: {\n                default: this.options.HTMLAttributes.class,\n            },\n        };\n    },\n    parseHTML() {\n        return [{\n                tag: 'a[href]',\n                getAttrs: dom => {\n                    const href = dom.getAttribute('href');\n                    // prevent XSS attacks\n                    if (!href || !isAllowedUri(href)) {\n                        return false;\n                    }\n                    return { href };\n                },\n            }];\n    },\n    renderHTML({ HTMLAttributes }) {\n        // prevent XSS attacks\n        if (!isAllowedUri(HTMLAttributes.href)) {\n            // strip out the href\n            return ['a', mergeAttributes(this.options.HTMLAttributes, { ...HTMLAttributes, href: '' }), 0];\n        }\n        return ['a', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n    },\n    addCommands() {\n        return {\n            setLink: attributes => ({ chain }) => {\n                return chain().setMark(this.name, attributes).setMeta('preventAutolink', true).run();\n            },\n            toggleLink: attributes => ({ chain }) => {\n                return chain()\n                    .toggleMark(this.name, attributes, { extendEmptyMarkRange: true })\n                    .setMeta('preventAutolink', true)\n                    .run();\n            },\n            unsetLink: () => ({ chain }) => {\n                return chain()\n                    .unsetMark(this.name, { extendEmptyMarkRange: true })\n                    .setMeta('preventAutolink', true)\n                    .run();\n            },\n        };\n    },\n    addPasteRules() {\n        return [\n            markPasteRule({\n                find: text => {\n                    const foundLinks = [];\n                    if (text) {\n                        const { validate } = this.options;\n                        const links = find(text).filter(item => item.isLink && validate(item.value));\n                        if (links.length) {\n                            links.forEach(link => (foundLinks.push({\n                                text: link.value,\n                                data: {\n                                    href: link.href,\n                                },\n                                index: link.start,\n                            })));\n                        }\n                    }\n                    return foundLinks;\n                },\n                type: this.type,\n                getAttributes: match => {\n                    var _a;\n                    return {\n                        href: (_a = match.data) === null || _a === void 0 ? void 0 : _a.href,\n                    };\n                },\n            }),\n        ];\n    },\n    addProseMirrorPlugins() {\n        const plugins = [];\n        if (this.options.autolink) {\n            plugins.push(autolink({\n                type: this.type,\n                defaultProtocol: this.options.defaultProtocol,\n                validate: this.options.validate,\n            }));\n        }\n        if (this.options.openOnClick) {\n            plugins.push(clickHandler({\n                type: this.type,\n            }));\n        }\n        if (this.options.linkOnPaste) {\n            plugins.push(pasteHandler({\n                editor: this.editor,\n                defaultProtocol: this.options.defaultProtocol,\n                type: this.type,\n            }));\n        }\n        return plugins;\n    },\n});\n\nexport { Link, Link as default, pasteRegex };\n//# sourceMappingURL=index.js.map\n","import { Extension, textInputRule } from '@tiptap/core';\n\nconst emDash = (override) => textInputRule({\n    find: /--$/,\n    replace: override !== null && override !== void 0 ? override : '—',\n});\nconst ellipsis = (override) => textInputRule({\n    find: /\\.\\.\\.$/,\n    replace: override !== null && override !== void 0 ? override : '…',\n});\nconst openDoubleQuote = (override) => textInputRule({\n    find: /(?:^|[\\s{[(<'\"\\u2018\\u201C])(\")$/,\n    replace: override !== null && override !== void 0 ? override : '“',\n});\nconst closeDoubleQuote = (override) => textInputRule({\n    find: /\"$/,\n    replace: override !== null && override !== void 0 ? override : '”',\n});\nconst openSingleQuote = (override) => textInputRule({\n    find: /(?:^|[\\s{[(<'\"\\u2018\\u201C])(')$/,\n    replace: override !== null && override !== void 0 ? override : '‘',\n});\nconst closeSingleQuote = (override) => textInputRule({\n    find: /'$/,\n    replace: override !== null && override !== void 0 ? override : '’',\n});\nconst leftArrow = (override) => textInputRule({\n    find: /<-$/,\n    replace: override !== null && override !== void 0 ? override : '←',\n});\nconst rightArrow = (override) => textInputRule({\n    find: /->$/,\n    replace: override !== null && override !== void 0 ? override : '→',\n});\nconst copyright = (override) => textInputRule({\n    find: /\\(c\\)$/,\n    replace: override !== null && override !== void 0 ? override : '©',\n});\nconst trademark = (override) => textInputRule({\n    find: /\\(tm\\)$/,\n    replace: override !== null && override !== void 0 ? override : '™',\n});\nconst servicemark = (override) => textInputRule({\n    find: /\\(sm\\)$/,\n    replace: override !== null && override !== void 0 ? override : '℠',\n});\nconst registeredTrademark = (override) => textInputRule({\n    find: /\\(r\\)$/,\n    replace: override !== null && override !== void 0 ? override : '®',\n});\nconst oneHalf = (override) => textInputRule({\n    find: /(?:^|\\s)(1\\/2)\\s$/,\n    replace: override !== null && override !== void 0 ? override : '½',\n});\nconst plusMinus = (override) => textInputRule({\n    find: /\\+\\/-$/,\n    replace: override !== null && override !== void 0 ? override : '±',\n});\nconst notEqual = (override) => textInputRule({\n    find: /!=$/,\n    replace: override !== null && override !== void 0 ? override : '≠',\n});\nconst laquo = (override) => textInputRule({\n    find: /<<$/,\n    replace: override !== null && override !== void 0 ? override : '«',\n});\nconst raquo = (override) => textInputRule({\n    find: />>$/,\n    replace: override !== null && override !== void 0 ? override : '»',\n});\nconst multiplication = (override) => textInputRule({\n    find: /\\d+\\s?([*x])\\s?\\d+$/,\n    replace: override !== null && override !== void 0 ? override : '×',\n});\nconst superscriptTwo = (override) => textInputRule({\n    find: /\\^2$/,\n    replace: override !== null && override !== void 0 ? override : '²',\n});\nconst superscriptThree = (override) => textInputRule({\n    find: /\\^3$/,\n    replace: override !== null && override !== void 0 ? override : '³',\n});\nconst oneQuarter = (override) => textInputRule({\n    find: /(?:^|\\s)(1\\/4)\\s$/,\n    replace: override !== null && override !== void 0 ? override : '¼',\n});\nconst threeQuarters = (override) => textInputRule({\n    find: /(?:^|\\s)(3\\/4)\\s$/,\n    replace: override !== null && override !== void 0 ? override : '¾',\n});\n/**\n * This extension allows you to add typography replacements for specific characters.\n * @see https://www.tiptap.dev/api/extensions/typography\n */\nconst Typography = Extension.create({\n    name: 'typography',\n    addOptions() {\n        return {\n            closeDoubleQuote: '”',\n            closeSingleQuote: '’',\n            copyright: '©',\n            ellipsis: '…',\n            emDash: '—',\n            laquo: '«',\n            leftArrow: '←',\n            multiplication: '×',\n            notEqual: '≠',\n            oneHalf: '½',\n            oneQuarter: '¼',\n            openDoubleQuote: '“',\n            openSingleQuote: '‘',\n            plusMinus: '±',\n            raquo: '»',\n            registeredTrademark: '®',\n            rightArrow: '→',\n            servicemark: '℠',\n            superscriptThree: '³',\n            superscriptTwo: '²',\n            threeQuarters: '¾',\n            trademark: '™',\n        };\n    },\n    addInputRules() {\n        const rules = [];\n        if (this.options.emDash !== false) {\n            rules.push(emDash(this.options.emDash));\n        }\n        if (this.options.ellipsis !== false) {\n            rules.push(ellipsis(this.options.ellipsis));\n        }\n        if (this.options.openDoubleQuote !== false) {\n            rules.push(openDoubleQuote(this.options.openDoubleQuote));\n        }\n        if (this.options.closeDoubleQuote !== false) {\n            rules.push(closeDoubleQuote(this.options.closeDoubleQuote));\n        }\n        if (this.options.openSingleQuote !== false) {\n            rules.push(openSingleQuote(this.options.openSingleQuote));\n        }\n        if (this.options.closeSingleQuote !== false) {\n            rules.push(closeSingleQuote(this.options.closeSingleQuote));\n        }\n        if (this.options.leftArrow !== false) {\n            rules.push(leftArrow(this.options.leftArrow));\n        }\n        if (this.options.rightArrow !== false) {\n            rules.push(rightArrow(this.options.rightArrow));\n        }\n        if (this.options.copyright !== false) {\n            rules.push(copyright(this.options.copyright));\n        }\n        if (this.options.trademark !== false) {\n            rules.push(trademark(this.options.trademark));\n        }\n        if (this.options.servicemark !== false) {\n            rules.push(servicemark(this.options.servicemark));\n        }\n        if (this.options.registeredTrademark !== false) {\n            rules.push(registeredTrademark(this.options.registeredTrademark));\n        }\n        if (this.options.oneHalf !== false) {\n            rules.push(oneHalf(this.options.oneHalf));\n        }\n        if (this.options.plusMinus !== false) {\n            rules.push(plusMinus(this.options.plusMinus));\n        }\n        if (this.options.notEqual !== false) {\n            rules.push(notEqual(this.options.notEqual));\n        }\n        if (this.options.laquo !== false) {\n            rules.push(laquo(this.options.laquo));\n        }\n        if (this.options.raquo !== false) {\n            rules.push(raquo(this.options.raquo));\n        }\n        if (this.options.multiplication !== false) {\n            rules.push(multiplication(this.options.multiplication));\n        }\n        if (this.options.superscriptTwo !== false) {\n            rules.push(superscriptTwo(this.options.superscriptTwo));\n        }\n        if (this.options.superscriptThree !== false) {\n            rules.push(superscriptThree(this.options.superscriptThree));\n        }\n        if (this.options.oneQuarter !== false) {\n            rules.push(oneQuarter(this.options.oneQuarter));\n        }\n        if (this.options.threeQuarters !== false) {\n            rules.push(threeQuarters(this.options.threeQuarters));\n        }\n        return rules;\n    },\n});\n\nexport { Typography, closeDoubleQuote, closeSingleQuote, copyright, Typography as default, ellipsis, emDash, laquo, leftArrow, multiplication, notEqual, oneHalf, oneQuarter, openDoubleQuote, openSingleQuote, plusMinus, raquo, registeredTrademark, rightArrow, servicemark, superscriptThree, superscriptTwo, threeQuarters, trademark };\n//# sourceMappingURL=index.js.map\n","import { Mark, mergeAttributes } from '@tiptap/core';\n\n/**\n * This extension allows you to create underline text.\n * @see https://www.tiptap.dev/api/marks/underline\n */\nconst Underline = Mark.create({\n    name: 'underline',\n    addOptions() {\n        return {\n            HTMLAttributes: {},\n        };\n    },\n    parseHTML() {\n        return [\n            {\n                tag: 'u',\n            },\n            {\n                style: 'text-decoration',\n                consuming: false,\n                getAttrs: style => (style.includes('underline') ? {} : false),\n            },\n        ];\n    },\n    renderHTML({ HTMLAttributes }) {\n        return ['u', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n    },\n    addCommands() {\n        return {\n            setUnderline: () => ({ commands }) => {\n                return commands.setMark(this.name);\n            },\n            toggleUnderline: () => ({ commands }) => {\n                return commands.toggleMark(this.name);\n            },\n            unsetUnderline: () => ({ commands }) => {\n                return commands.unsetMark(this.name);\n            },\n        };\n    },\n    addKeyboardShortcuts() {\n        return {\n            'Mod-u': () => this.editor.commands.toggleUnderline(),\n            'Mod-U': () => this.editor.commands.toggleUnderline(),\n        };\n    },\n});\n\nexport { Underline, Underline as default };\n//# sourceMappingURL=index.js.map\n","import { Node, mergeAttributes, wrappingInputRule } from '@tiptap/core';\n\n/**\n * Matches a blockquote to a `>` as input.\n */\nconst inputRegex = /^\\s*>\\s$/;\n/**\n * This extension allows you to create blockquotes.\n * @see https://tiptap.dev/api/nodes/blockquote\n */\nconst Blockquote = Node.create({\n    name: 'blockquote',\n    addOptions() {\n        return {\n            HTMLAttributes: {},\n        };\n    },\n    content: 'block+',\n    group: 'block',\n    defining: true,\n    parseHTML() {\n        return [\n            { tag: 'blockquote' },\n        ];\n    },\n    renderHTML({ HTMLAttributes }) {\n        return ['blockquote', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n    },\n    addCommands() {\n        return {\n            setBlockquote: () => ({ commands }) => {\n                return commands.wrapIn(this.name);\n            },\n            toggleBlockquote: () => ({ commands }) => {\n                return commands.toggleWrap(this.name);\n            },\n            unsetBlockquote: () => ({ commands }) => {\n                return commands.lift(this.name);\n            },\n        };\n    },\n    addKeyboardShortcuts() {\n        return {\n            'Mod-Shift-b': () => this.editor.commands.toggleBlockquote(),\n        };\n    },\n    addInputRules() {\n        return [\n            wrappingInputRule({\n                find: inputRegex,\n                type: this.type,\n            }),\n        ];\n    },\n});\n\nexport { Blockquote, Blockquote as default, inputRegex };\n//# sourceMappingURL=index.js.map\n","import { Mark, mergeAttributes, markInputRule, markPasteRule } from '@tiptap/core';\n\n/**\n * Matches bold text via `**` as input.\n */\nconst starInputRegex = /(?:^|\\s)(\\*\\*(?!\\s+\\*\\*)((?:[^*]+))\\*\\*(?!\\s+\\*\\*))$/;\n/**\n * Matches bold text via `**` while pasting.\n */\nconst starPasteRegex = /(?:^|\\s)(\\*\\*(?!\\s+\\*\\*)((?:[^*]+))\\*\\*(?!\\s+\\*\\*))/g;\n/**\n * Matches bold text via `__` as input.\n */\nconst underscoreInputRegex = /(?:^|\\s)(__(?!\\s+__)((?:[^_]+))__(?!\\s+__))$/;\n/**\n * Matches bold text via `__` while pasting.\n */\nconst underscorePasteRegex = /(?:^|\\s)(__(?!\\s+__)((?:[^_]+))__(?!\\s+__))/g;\n/**\n * This extension allows you to mark text as bold.\n * @see https://tiptap.dev/api/marks/bold\n */\nconst Bold = Mark.create({\n    name: 'bold',\n    addOptions() {\n        return {\n            HTMLAttributes: {},\n        };\n    },\n    parseHTML() {\n        return [\n            {\n                tag: 'strong',\n            },\n            {\n                tag: 'b',\n                getAttrs: node => node.style.fontWeight !== 'normal' && null,\n            },\n            {\n                style: 'font-weight',\n                getAttrs: value => /^(bold(er)?|[5-9]\\d{2,})$/.test(value) && null,\n            },\n        ];\n    },\n    renderHTML({ HTMLAttributes }) {\n        return ['strong', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n    },\n    addCommands() {\n        return {\n            setBold: () => ({ commands }) => {\n                return commands.setMark(this.name);\n            },\n            toggleBold: () => ({ commands }) => {\n                return commands.toggleMark(this.name);\n            },\n            unsetBold: () => ({ commands }) => {\n                return commands.unsetMark(this.name);\n            },\n        };\n    },\n    addKeyboardShortcuts() {\n        return {\n            'Mod-b': () => this.editor.commands.toggleBold(),\n            'Mod-B': () => this.editor.commands.toggleBold(),\n        };\n    },\n    addInputRules() {\n        return [\n            markInputRule({\n                find: starInputRegex,\n                type: this.type,\n            }),\n            markInputRule({\n                find: underscoreInputRegex,\n                type: this.type,\n            }),\n        ];\n    },\n    addPasteRules() {\n        return [\n            markPasteRule({\n                find: starPasteRegex,\n                type: this.type,\n            }),\n            markPasteRule({\n                find: underscorePasteRegex,\n                type: this.type,\n            }),\n        ];\n    },\n});\n\nexport { Bold, Bold as default, starInputRegex, starPasteRegex, underscoreInputRegex, underscorePasteRegex };\n//# sourceMappingURL=index.js.map\n","import { Node, mergeAttributes, Mark, getMarkAttributes, wrappingInputRule } from '@tiptap/core';\n\n/**\n * This extension allows you to create list items.\n * @see https://www.tiptap.dev/api/nodes/list-item\n */\nconst ListItem = Node.create({\n    name: 'listItem',\n    addOptions() {\n        return {\n            HTMLAttributes: {},\n            bulletListTypeName: 'bulletList',\n            orderedListTypeName: 'orderedList',\n        };\n    },\n    content: 'paragraph block*',\n    defining: true,\n    parseHTML() {\n        return [\n            {\n                tag: 'li',\n            },\n        ];\n    },\n    renderHTML({ HTMLAttributes }) {\n        return ['li', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n    },\n    addKeyboardShortcuts() {\n        return {\n            Enter: () => this.editor.commands.splitListItem(this.name),\n            Tab: () => this.editor.commands.sinkListItem(this.name),\n            'Shift-Tab': () => this.editor.commands.liftListItem(this.name),\n        };\n    },\n});\n\n/**\n * This extension allows you to create text styles. It is required by default\n * for the `textColor` and `backgroundColor` extensions.\n * @see https://www.tiptap.dev/api/marks/text-style\n */\nconst TextStyle = Mark.create({\n    name: 'textStyle',\n    addOptions() {\n        return {\n            HTMLAttributes: {},\n        };\n    },\n    parseHTML() {\n        return [\n            {\n                tag: 'span',\n                getAttrs: element => {\n                    const hasStyles = element.hasAttribute('style');\n                    if (!hasStyles) {\n                        return false;\n                    }\n                    return {};\n                },\n            },\n        ];\n    },\n    renderHTML({ HTMLAttributes }) {\n        return ['span', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n    },\n    addCommands() {\n        return {\n            removeEmptyTextStyle: () => ({ state, commands }) => {\n                const attributes = getMarkAttributes(state, this.type);\n                const hasStyles = Object.entries(attributes).some(([, value]) => !!value);\n                if (hasStyles) {\n                    return true;\n                }\n                return commands.unsetMark(this.name);\n            },\n        };\n    },\n});\n\n/**\n * Matches a bullet list to a dash or asterisk.\n */\nconst inputRegex = /^\\s*([-+*])\\s$/;\n/**\n * This extension allows you to create bullet lists.\n * This requires the ListItem extension\n * @see https://tiptap.dev/api/nodes/bullet-list\n * @see https://tiptap.dev/api/nodes/list-item.\n */\nconst BulletList = Node.create({\n    name: 'bulletList',\n    addOptions() {\n        return {\n            itemTypeName: 'listItem',\n            HTMLAttributes: {},\n            keepMarks: false,\n            keepAttributes: false,\n        };\n    },\n    group: 'block list',\n    content() {\n        return `${this.options.itemTypeName}+`;\n    },\n    parseHTML() {\n        return [\n            { tag: 'ul' },\n        ];\n    },\n    renderHTML({ HTMLAttributes }) {\n        return ['ul', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n    },\n    addCommands() {\n        return {\n            toggleBulletList: () => ({ commands, chain }) => {\n                if (this.options.keepAttributes) {\n                    return chain().toggleList(this.name, this.options.itemTypeName, this.options.keepMarks).updateAttributes(ListItem.name, this.editor.getAttributes(TextStyle.name)).run();\n                }\n                return commands.toggleList(this.name, this.options.itemTypeName, this.options.keepMarks);\n            },\n        };\n    },\n    addKeyboardShortcuts() {\n        return {\n            'Mod-Shift-8': () => this.editor.commands.toggleBulletList(),\n        };\n    },\n    addInputRules() {\n        let inputRule = wrappingInputRule({\n            find: inputRegex,\n            type: this.type,\n        });\n        if (this.options.keepMarks || this.options.keepAttributes) {\n            inputRule = wrappingInputRule({\n                find: inputRegex,\n                type: this.type,\n                keepMarks: this.options.keepMarks,\n                keepAttributes: this.options.keepAttributes,\n                getAttributes: () => { return this.editor.getAttributes(TextStyle.name); },\n                editor: this.editor,\n            });\n        }\n        return [\n            inputRule,\n        ];\n    },\n});\n\nexport { BulletList, BulletList as default, inputRegex };\n//# sourceMappingURL=index.js.map\n","import { Mark, mergeAttributes, markInputRule, markPasteRule } from '@tiptap/core';\n\n/**\n * Matches inline code.\n */\nconst inputRegex = /(?:^|\\s)(`(?!\\s+`)((?:[^`]+))`(?!\\s+`))$/;\n/**\n * Matches inline code while pasting.\n */\nconst pasteRegex = /(?:^|\\s)(`(?!\\s+`)((?:[^`]+))`(?!\\s+`))/g;\n/**\n * This extension allows you to mark text as inline code.\n * @see https://tiptap.dev/api/marks/code\n */\nconst Code = Mark.create({\n    name: 'code',\n    addOptions() {\n        return {\n            HTMLAttributes: {},\n        };\n    },\n    excludes: '_',\n    code: true,\n    exitable: true,\n    parseHTML() {\n        return [\n            { tag: 'code' },\n        ];\n    },\n    renderHTML({ HTMLAttributes }) {\n        return ['code', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n    },\n    addCommands() {\n        return {\n            setCode: () => ({ commands }) => {\n                return commands.setMark(this.name);\n            },\n            toggleCode: () => ({ commands }) => {\n                return commands.toggleMark(this.name);\n            },\n            unsetCode: () => ({ commands }) => {\n                return commands.unsetMark(this.name);\n            },\n        };\n    },\n    addKeyboardShortcuts() {\n        return {\n            'Mod-e': () => this.editor.commands.toggleCode(),\n        };\n    },\n    addInputRules() {\n        return [\n            markInputRule({\n                find: inputRegex,\n                type: this.type,\n            }),\n        ];\n    },\n    addPasteRules() {\n        return [\n            markPasteRule({\n                find: pasteRegex,\n                type: this.type,\n            }),\n        ];\n    },\n});\n\nexport { Code, Code as default, inputRegex, pasteRegex };\n//# sourceMappingURL=index.js.map\n","import { Node, mergeAttributes, textblockTypeInputRule } from '@tiptap/core';\nimport { Plugin, PluginKey, TextSelection } from '@tiptap/pm/state';\n\n/**\n * Matches a code block with backticks.\n */\nconst backtickInputRegex = /^```([a-z]+)?[\\s\\n]$/;\n/**\n * Matches a code block with tildes.\n */\nconst tildeInputRegex = /^~~~([a-z]+)?[\\s\\n]$/;\n/**\n * This extension allows you to create code blocks.\n * @see https://tiptap.dev/api/nodes/code-block\n */\nconst CodeBlock = Node.create({\n    name: 'codeBlock',\n    addOptions() {\n        return {\n            languageClassPrefix: 'language-',\n            exitOnTripleEnter: true,\n            exitOnArrowDown: true,\n            HTMLAttributes: {},\n        };\n    },\n    content: 'text*',\n    marks: '',\n    group: 'block',\n    code: true,\n    defining: true,\n    addAttributes() {\n        return {\n            language: {\n                default: null,\n                parseHTML: element => {\n                    var _a;\n                    const { languageClassPrefix } = this.options;\n                    const classNames = [...(((_a = element.firstElementChild) === null || _a === void 0 ? void 0 : _a.classList) || [])];\n                    const languages = classNames\n                        .filter(className => className.startsWith(languageClassPrefix))\n                        .map(className => className.replace(languageClassPrefix, ''));\n                    const language = languages[0];\n                    if (!language) {\n                        return null;\n                    }\n                    return language;\n                },\n                rendered: false,\n            },\n        };\n    },\n    parseHTML() {\n        return [\n            {\n                tag: 'pre',\n                preserveWhitespace: 'full',\n            },\n        ];\n    },\n    renderHTML({ node, HTMLAttributes }) {\n        return [\n            'pre',\n            mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n            [\n                'code',\n                {\n                    class: node.attrs.language\n                        ? this.options.languageClassPrefix + node.attrs.language\n                        : null,\n                },\n                0,\n            ],\n        ];\n    },\n    addCommands() {\n        return {\n            setCodeBlock: attributes => ({ commands }) => {\n                return commands.setNode(this.name, attributes);\n            },\n            toggleCodeBlock: attributes => ({ commands }) => {\n                return commands.toggleNode(this.name, 'paragraph', attributes);\n            },\n        };\n    },\n    addKeyboardShortcuts() {\n        return {\n            'Mod-Alt-c': () => this.editor.commands.toggleCodeBlock(),\n            // remove code block when at start of document or code block is empty\n            Backspace: () => {\n                const { empty, $anchor } = this.editor.state.selection;\n                const isAtStart = $anchor.pos === 1;\n                if (!empty || $anchor.parent.type.name !== this.name) {\n                    return false;\n                }\n                if (isAtStart || !$anchor.parent.textContent.length) {\n                    return this.editor.commands.clearNodes();\n                }\n                return false;\n            },\n            // exit node on triple enter\n            Enter: ({ editor }) => {\n                if (!this.options.exitOnTripleEnter) {\n                    return false;\n                }\n                const { state } = editor;\n                const { selection } = state;\n                const { $from, empty } = selection;\n                if (!empty || $from.parent.type !== this.type) {\n                    return false;\n                }\n                const isAtEnd = $from.parentOffset === $from.parent.nodeSize - 2;\n                const endsWithDoubleNewline = $from.parent.textContent.endsWith('\\n\\n');\n                if (!isAtEnd || !endsWithDoubleNewline) {\n                    return false;\n                }\n                return editor\n                    .chain()\n                    .command(({ tr }) => {\n                    tr.delete($from.pos - 2, $from.pos);\n                    return true;\n                })\n                    .exitCode()\n                    .run();\n            },\n            // exit node on arrow down\n            ArrowDown: ({ editor }) => {\n                if (!this.options.exitOnArrowDown) {\n                    return false;\n                }\n                const { state } = editor;\n                const { selection, doc } = state;\n                const { $from, empty } = selection;\n                if (!empty || $from.parent.type !== this.type) {\n                    return false;\n                }\n                const isAtEnd = $from.parentOffset === $from.parent.nodeSize - 2;\n                if (!isAtEnd) {\n                    return false;\n                }\n                const after = $from.after();\n                if (after === undefined) {\n                    return false;\n                }\n                const nodeAfter = doc.nodeAt(after);\n                if (nodeAfter) {\n                    return false;\n                }\n                return editor.commands.exitCode();\n            },\n        };\n    },\n    addInputRules() {\n        return [\n            textblockTypeInputRule({\n                find: backtickInputRegex,\n                type: this.type,\n                getAttributes: match => ({\n                    language: match[1],\n                }),\n            }),\n            textblockTypeInputRule({\n                find: tildeInputRegex,\n                type: this.type,\n                getAttributes: match => ({\n                    language: match[1],\n                }),\n            }),\n        ];\n    },\n    addProseMirrorPlugins() {\n        return [\n            // this plugin creates a code block for pasted content from VS Code\n            // we can also detect the copied code language\n            new Plugin({\n                key: new PluginKey('codeBlockVSCodeHandler'),\n                props: {\n                    handlePaste: (view, event) => {\n                        if (!event.clipboardData) {\n                            return false;\n                        }\n                        // don’t create a new code block within code blocks\n                        if (this.editor.isActive(this.type.name)) {\n                            return false;\n                        }\n                        const text = event.clipboardData.getData('text/plain');\n                        const vscode = event.clipboardData.getData('vscode-editor-data');\n                        const vscodeData = vscode ? JSON.parse(vscode) : undefined;\n                        const language = vscodeData === null || vscodeData === void 0 ? void 0 : vscodeData.mode;\n                        if (!text || !language) {\n                            return false;\n                        }\n                        const { tr, schema } = view.state;\n                        // prepare a text node\n                        // strip carriage return chars from text pasted as code\n                        // see: https://github.com/ProseMirror/prosemirror-view/commit/a50a6bcceb4ce52ac8fcc6162488d8875613aacd\n                        const textNode = schema.text(text.replace(/\\r\\n?/g, '\\n'));\n                        // create a code block with the text node\n                        // replace selection with the code block\n                        tr.replaceSelectionWith(this.type.create({ language }, textNode));\n                        if (tr.selection.$from.parent.type !== this.type) {\n                            // put cursor inside the newly created code block\n                            tr.setSelection(TextSelection.near(tr.doc.resolve(Math.max(0, tr.selection.from - 2))));\n                        }\n                        // store meta information\n                        // this is useful for other plugins that depends on the paste event\n                        // like the paste rule plugin\n                        tr.setMeta('paste', true);\n                        view.dispatch(tr);\n                        return true;\n                    },\n                },\n            }),\n        ];\n    },\n});\n\nexport { CodeBlock, backtickInputRegex, CodeBlock as default, tildeInputRegex };\n//# sourceMappingURL=index.js.map\n","import { Node } from '@tiptap/core';\n\n/**\n * The default document node which represents the top level node of the editor.\n * @see https://tiptap.dev/api/nodes/document\n */\nconst Document = Node.create({\n    name: 'doc',\n    topNode: true,\n    content: 'block+',\n});\n\nexport { Document, Document as default };\n//# sourceMappingURL=index.js.map\n","import { Plugin } from 'prosemirror-state';\nimport { dropPoint } from 'prosemirror-transform';\n\n/**\nCreate a plugin that, when added to a ProseMirror instance,\ncauses a decoration to show up at the drop position when something\nis dragged over the editor.\n\nNodes may add a `disableDropCursor` property to their spec to\ncontrol the showing of a drop cursor inside them. This may be a\nboolean or a function, which will be called with a view and a\nposition, and should return a boolean.\n*/\nfunction dropCursor(options = {}) {\n    return new Plugin({\n        view(editorView) { return new DropCursorView(editorView, options); }\n    });\n}\nclass DropCursorView {\n    constructor(editorView, options) {\n        var _a;\n        this.editorView = editorView;\n        this.cursorPos = null;\n        this.element = null;\n        this.timeout = -1;\n        this.width = (_a = options.width) !== null && _a !== void 0 ? _a : 1;\n        this.color = options.color === false ? undefined : (options.color || \"black\");\n        this.class = options.class;\n        this.handlers = [\"dragover\", \"dragend\", \"drop\", \"dragleave\"].map(name => {\n            let handler = (e) => { this[name](e); };\n            editorView.dom.addEventListener(name, handler);\n            return { name, handler };\n        });\n    }\n    destroy() {\n        this.handlers.forEach(({ name, handler }) => this.editorView.dom.removeEventListener(name, handler));\n    }\n    update(editorView, prevState) {\n        if (this.cursorPos != null && prevState.doc != editorView.state.doc) {\n            if (this.cursorPos > editorView.state.doc.content.size)\n                this.setCursor(null);\n            else\n                this.updateOverlay();\n        }\n    }\n    setCursor(pos) {\n        if (pos == this.cursorPos)\n            return;\n        this.cursorPos = pos;\n        if (pos == null) {\n            this.element.parentNode.removeChild(this.element);\n            this.element = null;\n        }\n        else {\n            this.updateOverlay();\n        }\n    }\n    updateOverlay() {\n        let $pos = this.editorView.state.doc.resolve(this.cursorPos);\n        let isBlock = !$pos.parent.inlineContent, rect;\n        if (isBlock) {\n            let before = $pos.nodeBefore, after = $pos.nodeAfter;\n            if (before || after) {\n                let node = this.editorView.nodeDOM(this.cursorPos - (before ? before.nodeSize : 0));\n                if (node) {\n                    let nodeRect = node.getBoundingClientRect();\n                    let top = before ? nodeRect.bottom : nodeRect.top;\n                    if (before && after)\n                        top = (top + this.editorView.nodeDOM(this.cursorPos).getBoundingClientRect().top) / 2;\n                    rect = { left: nodeRect.left, right: nodeRect.right, top: top - this.width / 2, bottom: top + this.width / 2 };\n                }\n            }\n        }\n        if (!rect) {\n            let coords = this.editorView.coordsAtPos(this.cursorPos);\n            rect = { left: coords.left - this.width / 2, right: coords.left + this.width / 2, top: coords.top, bottom: coords.bottom };\n        }\n        let parent = this.editorView.dom.offsetParent;\n        if (!this.element) {\n            this.element = parent.appendChild(document.createElement(\"div\"));\n            if (this.class)\n                this.element.className = this.class;\n            this.element.style.cssText = \"position: absolute; z-index: 50; pointer-events: none;\";\n            if (this.color) {\n                this.element.style.backgroundColor = this.color;\n            }\n        }\n        this.element.classList.toggle(\"prosemirror-dropcursor-block\", isBlock);\n        this.element.classList.toggle(\"prosemirror-dropcursor-inline\", !isBlock);\n        let parentLeft, parentTop;\n        if (!parent || parent == document.body && getComputedStyle(parent).position == \"static\") {\n            parentLeft = -pageXOffset;\n            parentTop = -pageYOffset;\n        }\n        else {\n            let rect = parent.getBoundingClientRect();\n            parentLeft = rect.left - parent.scrollLeft;\n            parentTop = rect.top - parent.scrollTop;\n        }\n        this.element.style.left = (rect.left - parentLeft) + \"px\";\n        this.element.style.top = (rect.top - parentTop) + \"px\";\n        this.element.style.width = (rect.right - rect.left) + \"px\";\n        this.element.style.height = (rect.bottom - rect.top) + \"px\";\n    }\n    scheduleRemoval(timeout) {\n        clearTimeout(this.timeout);\n        this.timeout = setTimeout(() => this.setCursor(null), timeout);\n    }\n    dragover(event) {\n        if (!this.editorView.editable)\n            return;\n        let pos = this.editorView.posAtCoords({ left: event.clientX, top: event.clientY });\n        let node = pos && pos.inside >= 0 && this.editorView.state.doc.nodeAt(pos.inside);\n        let disableDropCursor = node && node.type.spec.disableDropCursor;\n        let disabled = typeof disableDropCursor == \"function\" ? disableDropCursor(this.editorView, pos, event) : disableDropCursor;\n        if (pos && !disabled) {\n            let target = pos.pos;\n            if (this.editorView.dragging && this.editorView.dragging.slice) {\n                let point = dropPoint(this.editorView.state.doc, target, this.editorView.dragging.slice);\n                if (point != null)\n                    target = point;\n            }\n            this.setCursor(target);\n            this.scheduleRemoval(5000);\n        }\n    }\n    dragend() {\n        this.scheduleRemoval(20);\n    }\n    drop() {\n        this.scheduleRemoval(20);\n    }\n    dragleave(event) {\n        if (event.target == this.editorView.dom || !this.editorView.dom.contains(event.relatedTarget))\n            this.setCursor(null);\n    }\n}\n\nexport { dropCursor };\n","import { Extension } from '@tiptap/core';\nimport { dropCursor } from '@tiptap/pm/dropcursor';\n\n/**\n * This extension allows you to add a drop cursor to your editor.\n * A drop cursor is a line that appears when you drag and drop content\n * inbetween nodes.\n * @see https://tiptap.dev/api/extensions/dropcursor\n */\nconst Dropcursor = Extension.create({\n    name: 'dropCursor',\n    addOptions() {\n        return {\n            color: 'currentColor',\n            width: 1,\n            class: undefined,\n        };\n    },\n    addProseMirrorPlugins() {\n        return [\n            dropCursor(this.options),\n        ];\n    },\n});\n\nexport { Dropcursor, Dropcursor as default };\n//# sourceMappingURL=index.js.map\n","import { TextSelection, NodeSelection, AllSelection, Selection } from 'prosemirror-state';\nimport { DOMSerializer, Fragment, Mark, Slice, DOMParser } from 'prosemirror-model';\nimport { dropPoint } from 'prosemirror-transform';\n\nconst domIndex = function (node) {\n    for (var index = 0;; index++) {\n        node = node.previousSibling;\n        if (!node)\n            return index;\n    }\n};\nconst parentNode = function (node) {\n    let parent = node.assignedSlot || node.parentNode;\n    return parent && parent.nodeType == 11 ? parent.host : parent;\n};\nlet reusedRange = null;\n// Note that this will always return the same range, because DOM range\n// objects are every expensive, and keep slowing down subsequent DOM\n// updates, for some reason.\nconst textRange = function (node, from, to) {\n    let range = reusedRange || (reusedRange = document.createRange());\n    range.setEnd(node, to == null ? node.nodeValue.length : to);\n    range.setStart(node, from || 0);\n    return range;\n};\nconst clearReusedRange = function () {\n    reusedRange = null;\n};\n// Scans forward and backward through DOM positions equivalent to the\n// given one to see if the two are in the same place (i.e. after a\n// text node vs at the end of that text node)\nconst isEquivalentPosition = function (node, off, targetNode, targetOff) {\n    return targetNode && (scanFor(node, off, targetNode, targetOff, -1) ||\n        scanFor(node, off, targetNode, targetOff, 1));\n};\nconst atomElements = /^(img|br|input|textarea|hr)$/i;\nfunction scanFor(node, off, targetNode, targetOff, dir) {\n    for (;;) {\n        if (node == targetNode && off == targetOff)\n            return true;\n        if (off == (dir < 0 ? 0 : nodeSize(node))) {\n            let parent = node.parentNode;\n            if (!parent || parent.nodeType != 1 || hasBlockDesc(node) || atomElements.test(node.nodeName) ||\n                node.contentEditable == \"false\")\n                return false;\n            off = domIndex(node) + (dir < 0 ? 0 : 1);\n            node = parent;\n        }\n        else if (node.nodeType == 1) {\n            node = node.childNodes[off + (dir < 0 ? -1 : 0)];\n            if (node.contentEditable == \"false\")\n                return false;\n            off = dir < 0 ? nodeSize(node) : 0;\n        }\n        else {\n            return false;\n        }\n    }\n}\nfunction nodeSize(node) {\n    return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;\n}\nfunction textNodeBefore$1(node, offset) {\n    for (;;) {\n        if (node.nodeType == 3 && offset)\n            return node;\n        if (node.nodeType == 1 && offset > 0) {\n            if (node.contentEditable == \"false\")\n                return null;\n            node = node.childNodes[offset - 1];\n            offset = nodeSize(node);\n        }\n        else if (node.parentNode && !hasBlockDesc(node)) {\n            offset = domIndex(node);\n            node = node.parentNode;\n        }\n        else {\n            return null;\n        }\n    }\n}\nfunction textNodeAfter$1(node, offset) {\n    for (;;) {\n        if (node.nodeType == 3 && offset < node.nodeValue.length)\n            return node;\n        if (node.nodeType == 1 && offset < node.childNodes.length) {\n            if (node.contentEditable == \"false\")\n                return null;\n            node = node.childNodes[offset];\n            offset = 0;\n        }\n        else if (node.parentNode && !hasBlockDesc(node)) {\n            offset = domIndex(node) + 1;\n            node = node.parentNode;\n        }\n        else {\n            return null;\n        }\n    }\n}\nfunction isOnEdge(node, offset, parent) {\n    for (let atStart = offset == 0, atEnd = offset == nodeSize(node); atStart || atEnd;) {\n        if (node == parent)\n            return true;\n        let index = domIndex(node);\n        node = node.parentNode;\n        if (!node)\n            return false;\n        atStart = atStart && index == 0;\n        atEnd = atEnd && index == nodeSize(node);\n    }\n}\nfunction hasBlockDesc(dom) {\n    let desc;\n    for (let cur = dom; cur; cur = cur.parentNode)\n        if (desc = cur.pmViewDesc)\n            break;\n    return desc && desc.node && desc.node.isBlock && (desc.dom == dom || desc.contentDOM == dom);\n}\n// Work around Chrome issue https://bugs.chromium.org/p/chromium/issues/detail?id=447523\n// (isCollapsed inappropriately returns true in shadow dom)\nconst selectionCollapsed = function (domSel) {\n    return domSel.focusNode && isEquivalentPosition(domSel.focusNode, domSel.focusOffset, domSel.anchorNode, domSel.anchorOffset);\n};\nfunction keyEvent(keyCode, key) {\n    let event = document.createEvent(\"Event\");\n    event.initEvent(\"keydown\", true, true);\n    event.keyCode = keyCode;\n    event.key = event.code = key;\n    return event;\n}\nfunction deepActiveElement(doc) {\n    let elt = doc.activeElement;\n    while (elt && elt.shadowRoot)\n        elt = elt.shadowRoot.activeElement;\n    return elt;\n}\nfunction caretFromPoint(doc, x, y) {\n    if (doc.caretPositionFromPoint) {\n        try { // Firefox throws for this call in hard-to-predict circumstances (#994)\n            let pos = doc.caretPositionFromPoint(x, y);\n            if (pos)\n                return { node: pos.offsetNode, offset: pos.offset };\n        }\n        catch (_) { }\n    }\n    if (doc.caretRangeFromPoint) {\n        let range = doc.caretRangeFromPoint(x, y);\n        if (range)\n            return { node: range.startContainer, offset: range.startOffset };\n    }\n}\n\nconst nav = typeof navigator != \"undefined\" ? navigator : null;\nconst doc = typeof document != \"undefined\" ? document : null;\nconst agent = (nav && nav.userAgent) || \"\";\nconst ie_edge = /Edge\\/(\\d+)/.exec(agent);\nconst ie_upto10 = /MSIE \\d/.exec(agent);\nconst ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(agent);\nconst ie = !!(ie_upto10 || ie_11up || ie_edge);\nconst ie_version = ie_upto10 ? document.documentMode : ie_11up ? +ie_11up[1] : ie_edge ? +ie_edge[1] : 0;\nconst gecko = !ie && /gecko\\/(\\d+)/i.test(agent);\ngecko && +(/Firefox\\/(\\d+)/.exec(agent) || [0, 0])[1];\nconst _chrome = !ie && /Chrome\\/(\\d+)/.exec(agent);\nconst chrome = !!_chrome;\nconst chrome_version = _chrome ? +_chrome[1] : 0;\nconst safari = !ie && !!nav && /Apple Computer/.test(nav.vendor);\n// Is true for both iOS and iPadOS for convenience\nconst ios = safari && (/Mobile\\/\\w+/.test(agent) || !!nav && nav.maxTouchPoints > 2);\nconst mac = ios || (nav ? /Mac/.test(nav.platform) : false);\nconst windows = nav ? /Win/.test(nav.platform) : false;\nconst android = /Android \\d/.test(agent);\nconst webkit = !!doc && \"webkitFontSmoothing\" in doc.documentElement.style;\nconst webkit_version = webkit ? +(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1] : 0;\n\nfunction windowRect(doc) {\n    let vp = doc.defaultView && doc.defaultView.visualViewport;\n    if (vp)\n        return {\n            left: 0, right: vp.width,\n            top: 0, bottom: vp.height\n        };\n    return { left: 0, right: doc.documentElement.clientWidth,\n        top: 0, bottom: doc.documentElement.clientHeight };\n}\nfunction getSide(value, side) {\n    return typeof value == \"number\" ? value : value[side];\n}\nfunction clientRect(node) {\n    let rect = node.getBoundingClientRect();\n    // Adjust for elements with style \"transform: scale()\"\n    let scaleX = (rect.width / node.offsetWidth) || 1;\n    let scaleY = (rect.height / node.offsetHeight) || 1;\n    // Make sure scrollbar width isn't included in the rectangle\n    return { left: rect.left, right: rect.left + node.clientWidth * scaleX,\n        top: rect.top, bottom: rect.top + node.clientHeight * scaleY };\n}\nfunction scrollRectIntoView(view, rect, startDOM) {\n    let scrollThreshold = view.someProp(\"scrollThreshold\") || 0, scrollMargin = view.someProp(\"scrollMargin\") || 5;\n    let doc = view.dom.ownerDocument;\n    for (let parent = startDOM || view.dom;; parent = parentNode(parent)) {\n        if (!parent)\n            break;\n        if (parent.nodeType != 1)\n            continue;\n        let elt = parent;\n        let atTop = elt == doc.body;\n        let bounding = atTop ? windowRect(doc) : clientRect(elt);\n        let moveX = 0, moveY = 0;\n        if (rect.top < bounding.top + getSide(scrollThreshold, \"top\"))\n            moveY = -(bounding.top - rect.top + getSide(scrollMargin, \"top\"));\n        else if (rect.bottom > bounding.bottom - getSide(scrollThreshold, \"bottom\"))\n            moveY = rect.bottom - rect.top > bounding.bottom - bounding.top\n                ? rect.top + getSide(scrollMargin, \"top\") - bounding.top\n                : rect.bottom - bounding.bottom + getSide(scrollMargin, \"bottom\");\n        if (rect.left < bounding.left + getSide(scrollThreshold, \"left\"))\n            moveX = -(bounding.left - rect.left + getSide(scrollMargin, \"left\"));\n        else if (rect.right > bounding.right - getSide(scrollThreshold, \"right\"))\n            moveX = rect.right - bounding.right + getSide(scrollMargin, \"right\");\n        if (moveX || moveY) {\n            if (atTop) {\n                doc.defaultView.scrollBy(moveX, moveY);\n            }\n            else {\n                let startX = elt.scrollLeft, startY = elt.scrollTop;\n                if (moveY)\n                    elt.scrollTop += moveY;\n                if (moveX)\n                    elt.scrollLeft += moveX;\n                let dX = elt.scrollLeft - startX, dY = elt.scrollTop - startY;\n                rect = { left: rect.left - dX, top: rect.top - dY, right: rect.right - dX, bottom: rect.bottom - dY };\n            }\n        }\n        if (atTop || /^(fixed|sticky)$/.test(getComputedStyle(parent).position))\n            break;\n    }\n}\n// Store the scroll position of the editor's parent nodes, along with\n// the top position of an element near the top of the editor, which\n// will be used to make sure the visible viewport remains stable even\n// when the size of the content above changes.\nfunction storeScrollPos(view) {\n    let rect = view.dom.getBoundingClientRect(), startY = Math.max(0, rect.top);\n    let refDOM, refTop;\n    for (let x = (rect.left + rect.right) / 2, y = startY + 1; y < Math.min(innerHeight, rect.bottom); y += 5) {\n        let dom = view.root.elementFromPoint(x, y);\n        if (!dom || dom == view.dom || !view.dom.contains(dom))\n            continue;\n        let localRect = dom.getBoundingClientRect();\n        if (localRect.top >= startY - 20) {\n            refDOM = dom;\n            refTop = localRect.top;\n            break;\n        }\n    }\n    return { refDOM: refDOM, refTop: refTop, stack: scrollStack(view.dom) };\n}\nfunction scrollStack(dom) {\n    let stack = [], doc = dom.ownerDocument;\n    for (let cur = dom; cur; cur = parentNode(cur)) {\n        stack.push({ dom: cur, top: cur.scrollTop, left: cur.scrollLeft });\n        if (dom == doc)\n            break;\n    }\n    return stack;\n}\n// Reset the scroll position of the editor's parent nodes to that what\n// it was before, when storeScrollPos was called.\nfunction resetScrollPos({ refDOM, refTop, stack }) {\n    let newRefTop = refDOM ? refDOM.getBoundingClientRect().top : 0;\n    restoreScrollStack(stack, newRefTop == 0 ? 0 : newRefTop - refTop);\n}\nfunction restoreScrollStack(stack, dTop) {\n    for (let i = 0; i < stack.length; i++) {\n        let { dom, top, left } = stack[i];\n        if (dom.scrollTop != top + dTop)\n            dom.scrollTop = top + dTop;\n        if (dom.scrollLeft != left)\n            dom.scrollLeft = left;\n    }\n}\nlet preventScrollSupported = null;\n// Feature-detects support for .focus({preventScroll: true}), and uses\n// a fallback kludge when not supported.\nfunction focusPreventScroll(dom) {\n    if (dom.setActive)\n        return dom.setActive(); // in IE\n    if (preventScrollSupported)\n        return dom.focus(preventScrollSupported);\n    let stored = scrollStack(dom);\n    dom.focus(preventScrollSupported == null ? {\n        get preventScroll() {\n            preventScrollSupported = { preventScroll: true };\n            return true;\n        }\n    } : undefined);\n    if (!preventScrollSupported) {\n        preventScrollSupported = false;\n        restoreScrollStack(stored, 0);\n    }\n}\nfunction findOffsetInNode(node, coords) {\n    let closest, dxClosest = 2e8, coordsClosest, offset = 0;\n    let rowBot = coords.top, rowTop = coords.top;\n    let firstBelow, coordsBelow;\n    for (let child = node.firstChild, childIndex = 0; child; child = child.nextSibling, childIndex++) {\n        let rects;\n        if (child.nodeType == 1)\n            rects = child.getClientRects();\n        else if (child.nodeType == 3)\n            rects = textRange(child).getClientRects();\n        else\n            continue;\n        for (let i = 0; i < rects.length; i++) {\n            let rect = rects[i];\n            if (rect.top <= rowBot && rect.bottom >= rowTop) {\n                rowBot = Math.max(rect.bottom, rowBot);\n                rowTop = Math.min(rect.top, rowTop);\n                let dx = rect.left > coords.left ? rect.left - coords.left\n                    : rect.right < coords.left ? coords.left - rect.right : 0;\n                if (dx < dxClosest) {\n                    closest = child;\n                    dxClosest = dx;\n                    coordsClosest = dx && closest.nodeType == 3 ? {\n                        left: rect.right < coords.left ? rect.right : rect.left,\n                        top: coords.top\n                    } : coords;\n                    if (child.nodeType == 1 && dx)\n                        offset = childIndex + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0);\n                    continue;\n                }\n            }\n            else if (rect.top > coords.top && !firstBelow && rect.left <= coords.left && rect.right >= coords.left) {\n                firstBelow = child;\n                coordsBelow = { left: Math.max(rect.left, Math.min(rect.right, coords.left)), top: rect.top };\n            }\n            if (!closest && (coords.left >= rect.right && coords.top >= rect.top ||\n                coords.left >= rect.left && coords.top >= rect.bottom))\n                offset = childIndex + 1;\n        }\n    }\n    if (!closest && firstBelow) {\n        closest = firstBelow;\n        coordsClosest = coordsBelow;\n        dxClosest = 0;\n    }\n    if (closest && closest.nodeType == 3)\n        return findOffsetInText(closest, coordsClosest);\n    if (!closest || (dxClosest && closest.nodeType == 1))\n        return { node, offset };\n    return findOffsetInNode(closest, coordsClosest);\n}\nfunction findOffsetInText(node, coords) {\n    let len = node.nodeValue.length;\n    let range = document.createRange();\n    for (let i = 0; i < len; i++) {\n        range.setEnd(node, i + 1);\n        range.setStart(node, i);\n        let rect = singleRect(range, 1);\n        if (rect.top == rect.bottom)\n            continue;\n        if (inRect(coords, rect))\n            return { node, offset: i + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0) };\n    }\n    return { node, offset: 0 };\n}\nfunction inRect(coords, rect) {\n    return coords.left >= rect.left - 1 && coords.left <= rect.right + 1 &&\n        coords.top >= rect.top - 1 && coords.top <= rect.bottom + 1;\n}\nfunction targetKludge(dom, coords) {\n    let parent = dom.parentNode;\n    if (parent && /^li$/i.test(parent.nodeName) && coords.left < dom.getBoundingClientRect().left)\n        return parent;\n    return dom;\n}\nfunction posFromElement(view, elt, coords) {\n    let { node, offset } = findOffsetInNode(elt, coords), bias = -1;\n    if (node.nodeType == 1 && !node.firstChild) {\n        let rect = node.getBoundingClientRect();\n        bias = rect.left != rect.right && coords.left > (rect.left + rect.right) / 2 ? 1 : -1;\n    }\n    return view.docView.posFromDOM(node, offset, bias);\n}\nfunction posFromCaret(view, node, offset, coords) {\n    // Browser (in caretPosition/RangeFromPoint) will agressively\n    // normalize towards nearby inline nodes. Since we are interested in\n    // positions between block nodes too, we first walk up the hierarchy\n    // of nodes to see if there are block nodes that the coordinates\n    // fall outside of. If so, we take the position before/after that\n    // block. If not, we call `posFromDOM` on the raw node/offset.\n    let outsideBlock = -1;\n    for (let cur = node, sawBlock = false;;) {\n        if (cur == view.dom)\n            break;\n        let desc = view.docView.nearestDesc(cur, true);\n        if (!desc)\n            return null;\n        if (desc.dom.nodeType == 1 && (desc.node.isBlock && desc.parent && !sawBlock || !desc.contentDOM)) {\n            let rect = desc.dom.getBoundingClientRect();\n            if (desc.node.isBlock && desc.parent && !sawBlock) {\n                sawBlock = true;\n                if (rect.left > coords.left || rect.top > coords.top)\n                    outsideBlock = desc.posBefore;\n                else if (rect.right < coords.left || rect.bottom < coords.top)\n                    outsideBlock = desc.posAfter;\n            }\n            if (!desc.contentDOM && outsideBlock < 0 && !desc.node.isText) {\n                // If we are inside a leaf, return the side of the leaf closer to the coords\n                let before = desc.node.isBlock ? coords.top < (rect.top + rect.bottom) / 2\n                    : coords.left < (rect.left + rect.right) / 2;\n                return before ? desc.posBefore : desc.posAfter;\n            }\n        }\n        cur = desc.dom.parentNode;\n    }\n    return outsideBlock > -1 ? outsideBlock : view.docView.posFromDOM(node, offset, -1);\n}\nfunction elementFromPoint(element, coords, box) {\n    let len = element.childNodes.length;\n    if (len && box.top < box.bottom) {\n        for (let startI = Math.max(0, Math.min(len - 1, Math.floor(len * (coords.top - box.top) / (box.bottom - box.top)) - 2)), i = startI;;) {\n            let child = element.childNodes[i];\n            if (child.nodeType == 1) {\n                let rects = child.getClientRects();\n                for (let j = 0; j < rects.length; j++) {\n                    let rect = rects[j];\n                    if (inRect(coords, rect))\n                        return elementFromPoint(child, coords, rect);\n                }\n            }\n            if ((i = (i + 1) % len) == startI)\n                break;\n        }\n    }\n    return element;\n}\n// Given an x,y position on the editor, get the position in the document.\nfunction posAtCoords(view, coords) {\n    let doc = view.dom.ownerDocument, node, offset = 0;\n    let caret = caretFromPoint(doc, coords.left, coords.top);\n    if (caret)\n        ({ node, offset } = caret);\n    let elt = (view.root.elementFromPoint ? view.root : doc)\n        .elementFromPoint(coords.left, coords.top);\n    let pos;\n    if (!elt || !view.dom.contains(elt.nodeType != 1 ? elt.parentNode : elt)) {\n        let box = view.dom.getBoundingClientRect();\n        if (!inRect(coords, box))\n            return null;\n        elt = elementFromPoint(view.dom, coords, box);\n        if (!elt)\n            return null;\n    }\n    // Safari's caretRangeFromPoint returns nonsense when on a draggable element\n    if (safari) {\n        for (let p = elt; node && p; p = parentNode(p))\n            if (p.draggable)\n                node = undefined;\n    }\n    elt = targetKludge(elt, coords);\n    if (node) {\n        if (gecko && node.nodeType == 1) {\n            // Firefox will sometimes return offsets into <input> nodes, which\n            // have no actual children, from caretPositionFromPoint (#953)\n            offset = Math.min(offset, node.childNodes.length);\n            // It'll also move the returned position before image nodes,\n            // even if those are behind it.\n            if (offset < node.childNodes.length) {\n                let next = node.childNodes[offset], box;\n                if (next.nodeName == \"IMG\" && (box = next.getBoundingClientRect()).right <= coords.left &&\n                    box.bottom > coords.top)\n                    offset++;\n            }\n        }\n        let prev;\n        // When clicking above the right side of an uneditable node, Chrome will report a cursor position after that node.\n        if (webkit && offset && node.nodeType == 1 && (prev = node.childNodes[offset - 1]).nodeType == 1 &&\n            prev.contentEditable == \"false\" && prev.getBoundingClientRect().top >= coords.top)\n            offset--;\n        // Suspiciously specific kludge to work around caret*FromPoint\n        // never returning a position at the end of the document\n        if (node == view.dom && offset == node.childNodes.length - 1 && node.lastChild.nodeType == 1 &&\n            coords.top > node.lastChild.getBoundingClientRect().bottom)\n            pos = view.state.doc.content.size;\n        // Ignore positions directly after a BR, since caret*FromPoint\n        // 'round up' positions that would be more accurately placed\n        // before the BR node.\n        else if (offset == 0 || node.nodeType != 1 || node.childNodes[offset - 1].nodeName != \"BR\")\n            pos = posFromCaret(view, node, offset, coords);\n    }\n    if (pos == null)\n        pos = posFromElement(view, elt, coords);\n    let desc = view.docView.nearestDesc(elt, true);\n    return { pos, inside: desc ? desc.posAtStart - desc.border : -1 };\n}\nfunction nonZero(rect) {\n    return rect.top < rect.bottom || rect.left < rect.right;\n}\nfunction singleRect(target, bias) {\n    let rects = target.getClientRects();\n    if (rects.length) {\n        let first = rects[bias < 0 ? 0 : rects.length - 1];\n        if (nonZero(first))\n            return first;\n    }\n    return Array.prototype.find.call(rects, nonZero) || target.getBoundingClientRect();\n}\nconst BIDI = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n// Given a position in the document model, get a bounding box of the\n// character at that position, relative to the window.\nfunction coordsAtPos(view, pos, side) {\n    let { node, offset, atom } = view.docView.domFromPos(pos, side < 0 ? -1 : 1);\n    let supportEmptyRange = webkit || gecko;\n    if (node.nodeType == 3) {\n        // These browsers support querying empty text ranges. Prefer that in\n        // bidi context or when at the end of a node.\n        if (supportEmptyRange && (BIDI.test(node.nodeValue) || (side < 0 ? !offset : offset == node.nodeValue.length))) {\n            let rect = singleRect(textRange(node, offset, offset), side);\n            // Firefox returns bad results (the position before the space)\n            // when querying a position directly after line-broken\n            // whitespace. Detect this situation and and kludge around it\n            if (gecko && offset && /\\s/.test(node.nodeValue[offset - 1]) && offset < node.nodeValue.length) {\n                let rectBefore = singleRect(textRange(node, offset - 1, offset - 1), -1);\n                if (rectBefore.top == rect.top) {\n                    let rectAfter = singleRect(textRange(node, offset, offset + 1), -1);\n                    if (rectAfter.top != rect.top)\n                        return flattenV(rectAfter, rectAfter.left < rectBefore.left);\n                }\n            }\n            return rect;\n        }\n        else {\n            let from = offset, to = offset, takeSide = side < 0 ? 1 : -1;\n            if (side < 0 && !offset) {\n                to++;\n                takeSide = -1;\n            }\n            else if (side >= 0 && offset == node.nodeValue.length) {\n                from--;\n                takeSide = 1;\n            }\n            else if (side < 0) {\n                from--;\n            }\n            else {\n                to++;\n            }\n            return flattenV(singleRect(textRange(node, from, to), takeSide), takeSide < 0);\n        }\n    }\n    let $dom = view.state.doc.resolve(pos - (atom || 0));\n    // Return a horizontal line in block context\n    if (!$dom.parent.inlineContent) {\n        if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {\n            let before = node.childNodes[offset - 1];\n            if (before.nodeType == 1)\n                return flattenH(before.getBoundingClientRect(), false);\n        }\n        if (atom == null && offset < nodeSize(node)) {\n            let after = node.childNodes[offset];\n            if (after.nodeType == 1)\n                return flattenH(after.getBoundingClientRect(), true);\n        }\n        return flattenH(node.getBoundingClientRect(), side >= 0);\n    }\n    // Inline, not in text node (this is not Bidi-safe)\n    if (atom == null && offset && (side < 0 || offset == nodeSize(node))) {\n        let before = node.childNodes[offset - 1];\n        let target = before.nodeType == 3 ? textRange(before, nodeSize(before) - (supportEmptyRange ? 0 : 1))\n            // BR nodes tend to only return the rectangle before them.\n            // Only use them if they are the last element in their parent\n            : before.nodeType == 1 && (before.nodeName != \"BR\" || !before.nextSibling) ? before : null;\n        if (target)\n            return flattenV(singleRect(target, 1), false);\n    }\n    if (atom == null && offset < nodeSize(node)) {\n        let after = node.childNodes[offset];\n        while (after.pmViewDesc && after.pmViewDesc.ignoreForCoords)\n            after = after.nextSibling;\n        let target = !after ? null : after.nodeType == 3 ? textRange(after, 0, (supportEmptyRange ? 0 : 1))\n            : after.nodeType == 1 ? after : null;\n        if (target)\n            return flattenV(singleRect(target, -1), true);\n    }\n    // All else failed, just try to get a rectangle for the target node\n    return flattenV(singleRect(node.nodeType == 3 ? textRange(node) : node, -side), side >= 0);\n}\nfunction flattenV(rect, left) {\n    if (rect.width == 0)\n        return rect;\n    let x = left ? rect.left : rect.right;\n    return { top: rect.top, bottom: rect.bottom, left: x, right: x };\n}\nfunction flattenH(rect, top) {\n    if (rect.height == 0)\n        return rect;\n    let y = top ? rect.top : rect.bottom;\n    return { top: y, bottom: y, left: rect.left, right: rect.right };\n}\nfunction withFlushedState(view, state, f) {\n    let viewState = view.state, active = view.root.activeElement;\n    if (viewState != state)\n        view.updateState(state);\n    if (active != view.dom)\n        view.focus();\n    try {\n        return f();\n    }\n    finally {\n        if (viewState != state)\n            view.updateState(viewState);\n        if (active != view.dom && active)\n            active.focus();\n    }\n}\n// Whether vertical position motion in a given direction\n// from a position would leave a text block.\nfunction endOfTextblockVertical(view, state, dir) {\n    let sel = state.selection;\n    let $pos = dir == \"up\" ? sel.$from : sel.$to;\n    return withFlushedState(view, state, () => {\n        let { node: dom } = view.docView.domFromPos($pos.pos, dir == \"up\" ? -1 : 1);\n        for (;;) {\n            let nearest = view.docView.nearestDesc(dom, true);\n            if (!nearest)\n                break;\n            if (nearest.node.isBlock) {\n                dom = nearest.contentDOM || nearest.dom;\n                break;\n            }\n            dom = nearest.dom.parentNode;\n        }\n        let coords = coordsAtPos(view, $pos.pos, 1);\n        for (let child = dom.firstChild; child; child = child.nextSibling) {\n            let boxes;\n            if (child.nodeType == 1)\n                boxes = child.getClientRects();\n            else if (child.nodeType == 3)\n                boxes = textRange(child, 0, child.nodeValue.length).getClientRects();\n            else\n                continue;\n            for (let i = 0; i < boxes.length; i++) {\n                let box = boxes[i];\n                if (box.bottom > box.top + 1 &&\n                    (dir == \"up\" ? coords.top - box.top > (box.bottom - coords.top) * 2\n                        : box.bottom - coords.bottom > (coords.bottom - box.top) * 2))\n                    return false;\n            }\n        }\n        return true;\n    });\n}\nconst maybeRTL = /[\\u0590-\\u08ac]/;\nfunction endOfTextblockHorizontal(view, state, dir) {\n    let { $head } = state.selection;\n    if (!$head.parent.isTextblock)\n        return false;\n    let offset = $head.parentOffset, atStart = !offset, atEnd = offset == $head.parent.content.size;\n    let sel = view.domSelection();\n    // If the textblock is all LTR, or the browser doesn't support\n    // Selection.modify (Edge), fall back to a primitive approach\n    if (!maybeRTL.test($head.parent.textContent) || !sel.modify)\n        return dir == \"left\" || dir == \"backward\" ? atStart : atEnd;\n    return withFlushedState(view, state, () => {\n        // This is a huge hack, but appears to be the best we can\n        // currently do: use `Selection.modify` to move the selection by\n        // one character, and see if that moves the cursor out of the\n        // textblock (or doesn't move it at all, when at the start/end of\n        // the document).\n        let { focusNode: oldNode, focusOffset: oldOff, anchorNode, anchorOffset } = view.domSelectionRange();\n        let oldBidiLevel = sel.caretBidiLevel // Only for Firefox\n        ;\n        sel.modify(\"move\", dir, \"character\");\n        let parentDOM = $head.depth ? view.docView.domAfterPos($head.before()) : view.dom;\n        let { focusNode: newNode, focusOffset: newOff } = view.domSelectionRange();\n        let result = newNode && !parentDOM.contains(newNode.nodeType == 1 ? newNode : newNode.parentNode) ||\n            (oldNode == newNode && oldOff == newOff);\n        // Restore the previous selection\n        try {\n            sel.collapse(anchorNode, anchorOffset);\n            if (oldNode && (oldNode != anchorNode || oldOff != anchorOffset) && sel.extend)\n                sel.extend(oldNode, oldOff);\n        }\n        catch (_) { }\n        if (oldBidiLevel != null)\n            sel.caretBidiLevel = oldBidiLevel;\n        return result;\n    });\n}\nlet cachedState = null;\nlet cachedDir = null;\nlet cachedResult = false;\nfunction endOfTextblock(view, state, dir) {\n    if (cachedState == state && cachedDir == dir)\n        return cachedResult;\n    cachedState = state;\n    cachedDir = dir;\n    return cachedResult = dir == \"up\" || dir == \"down\"\n        ? endOfTextblockVertical(view, state, dir)\n        : endOfTextblockHorizontal(view, state, dir);\n}\n\n// View descriptions are data structures that describe the DOM that is\n// used to represent the editor's content. They are used for:\n//\n// - Incremental redrawing when the document changes\n//\n// - Figuring out what part of the document a given DOM position\n//   corresponds to\n//\n// - Wiring in custom implementations of the editing interface for a\n//   given node\n//\n// They form a doubly-linked mutable tree, starting at `view.docView`.\nconst NOT_DIRTY = 0, CHILD_DIRTY = 1, CONTENT_DIRTY = 2, NODE_DIRTY = 3;\n// Superclass for the various kinds of descriptions. Defines their\n// basic structure and shared methods.\nclass ViewDesc {\n    constructor(parent, children, dom, \n    // This is the node that holds the child views. It may be null for\n    // descs that don't have children.\n    contentDOM) {\n        this.parent = parent;\n        this.children = children;\n        this.dom = dom;\n        this.contentDOM = contentDOM;\n        this.dirty = NOT_DIRTY;\n        // An expando property on the DOM node provides a link back to its\n        // description.\n        dom.pmViewDesc = this;\n    }\n    // Used to check whether a given description corresponds to a\n    // widget/mark/node.\n    matchesWidget(widget) { return false; }\n    matchesMark(mark) { return false; }\n    matchesNode(node, outerDeco, innerDeco) { return false; }\n    matchesHack(nodeName) { return false; }\n    // When parsing in-editor content (in domchange.js), we allow\n    // descriptions to determine the parse rules that should be used to\n    // parse them.\n    parseRule() { return null; }\n    // Used by the editor's event handler to ignore events that come\n    // from certain descs.\n    stopEvent(event) { return false; }\n    // The size of the content represented by this desc.\n    get size() {\n        let size = 0;\n        for (let i = 0; i < this.children.length; i++)\n            size += this.children[i].size;\n        return size;\n    }\n    // For block nodes, this represents the space taken up by their\n    // start/end tokens.\n    get border() { return 0; }\n    destroy() {\n        this.parent = undefined;\n        if (this.dom.pmViewDesc == this)\n            this.dom.pmViewDesc = undefined;\n        for (let i = 0; i < this.children.length; i++)\n            this.children[i].destroy();\n    }\n    posBeforeChild(child) {\n        for (let i = 0, pos = this.posAtStart;; i++) {\n            let cur = this.children[i];\n            if (cur == child)\n                return pos;\n            pos += cur.size;\n        }\n    }\n    get posBefore() {\n        return this.parent.posBeforeChild(this);\n    }\n    get posAtStart() {\n        return this.parent ? this.parent.posBeforeChild(this) + this.border : 0;\n    }\n    get posAfter() {\n        return this.posBefore + this.size;\n    }\n    get posAtEnd() {\n        return this.posAtStart + this.size - 2 * this.border;\n    }\n    localPosFromDOM(dom, offset, bias) {\n        // If the DOM position is in the content, use the child desc after\n        // it to figure out a position.\n        if (this.contentDOM && this.contentDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode)) {\n            if (bias < 0) {\n                let domBefore, desc;\n                if (dom == this.contentDOM) {\n                    domBefore = dom.childNodes[offset - 1];\n                }\n                else {\n                    while (dom.parentNode != this.contentDOM)\n                        dom = dom.parentNode;\n                    domBefore = dom.previousSibling;\n                }\n                while (domBefore && !((desc = domBefore.pmViewDesc) && desc.parent == this))\n                    domBefore = domBefore.previousSibling;\n                return domBefore ? this.posBeforeChild(desc) + desc.size : this.posAtStart;\n            }\n            else {\n                let domAfter, desc;\n                if (dom == this.contentDOM) {\n                    domAfter = dom.childNodes[offset];\n                }\n                else {\n                    while (dom.parentNode != this.contentDOM)\n                        dom = dom.parentNode;\n                    domAfter = dom.nextSibling;\n                }\n                while (domAfter && !((desc = domAfter.pmViewDesc) && desc.parent == this))\n                    domAfter = domAfter.nextSibling;\n                return domAfter ? this.posBeforeChild(desc) : this.posAtEnd;\n            }\n        }\n        // Otherwise, use various heuristics, falling back on the bias\n        // parameter, to determine whether to return the position at the\n        // start or at the end of this view desc.\n        let atEnd;\n        if (dom == this.dom && this.contentDOM) {\n            atEnd = offset > domIndex(this.contentDOM);\n        }\n        else if (this.contentDOM && this.contentDOM != this.dom && this.dom.contains(this.contentDOM)) {\n            atEnd = dom.compareDocumentPosition(this.contentDOM) & 2;\n        }\n        else if (this.dom.firstChild) {\n            if (offset == 0)\n                for (let search = dom;; search = search.parentNode) {\n                    if (search == this.dom) {\n                        atEnd = false;\n                        break;\n                    }\n                    if (search.previousSibling)\n                        break;\n                }\n            if (atEnd == null && offset == dom.childNodes.length)\n                for (let search = dom;; search = search.parentNode) {\n                    if (search == this.dom) {\n                        atEnd = true;\n                        break;\n                    }\n                    if (search.nextSibling)\n                        break;\n                }\n        }\n        return (atEnd == null ? bias > 0 : atEnd) ? this.posAtEnd : this.posAtStart;\n    }\n    nearestDesc(dom, onlyNodes = false) {\n        for (let first = true, cur = dom; cur; cur = cur.parentNode) {\n            let desc = this.getDesc(cur), nodeDOM;\n            if (desc && (!onlyNodes || desc.node)) {\n                // If dom is outside of this desc's nodeDOM, don't count it.\n                if (first && (nodeDOM = desc.nodeDOM) &&\n                    !(nodeDOM.nodeType == 1 ? nodeDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode) : nodeDOM == dom))\n                    first = false;\n                else\n                    return desc;\n            }\n        }\n    }\n    getDesc(dom) {\n        let desc = dom.pmViewDesc;\n        for (let cur = desc; cur; cur = cur.parent)\n            if (cur == this)\n                return desc;\n    }\n    posFromDOM(dom, offset, bias) {\n        for (let scan = dom; scan; scan = scan.parentNode) {\n            let desc = this.getDesc(scan);\n            if (desc)\n                return desc.localPosFromDOM(dom, offset, bias);\n        }\n        return -1;\n    }\n    // Find the desc for the node after the given pos, if any. (When a\n    // parent node overrode rendering, there might not be one.)\n    descAt(pos) {\n        for (let i = 0, offset = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (offset == pos && end != offset) {\n                while (!child.border && child.children.length)\n                    child = child.children[0];\n                return child;\n            }\n            if (pos < end)\n                return child.descAt(pos - offset - child.border);\n            offset = end;\n        }\n    }\n    domFromPos(pos, side) {\n        if (!this.contentDOM)\n            return { node: this.dom, offset: 0, atom: pos + 1 };\n        // First find the position in the child array\n        let i = 0, offset = 0;\n        for (let curPos = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = curPos + child.size;\n            if (end > pos || child instanceof TrailingHackViewDesc) {\n                offset = pos - curPos;\n                break;\n            }\n            curPos = end;\n        }\n        // If this points into the middle of a child, call through\n        if (offset)\n            return this.children[i].domFromPos(offset - this.children[i].border, side);\n        // Go back if there were any zero-length widgets with side >= 0 before this point\n        for (let prev; i && !(prev = this.children[i - 1]).size && prev instanceof WidgetViewDesc && prev.side >= 0; i--) { }\n        // Scan towards the first useable node\n        if (side <= 0) {\n            let prev, enter = true;\n            for (;; i--, enter = false) {\n                prev = i ? this.children[i - 1] : null;\n                if (!prev || prev.dom.parentNode == this.contentDOM)\n                    break;\n            }\n            if (prev && side && enter && !prev.border && !prev.domAtom)\n                return prev.domFromPos(prev.size, side);\n            return { node: this.contentDOM, offset: prev ? domIndex(prev.dom) + 1 : 0 };\n        }\n        else {\n            let next, enter = true;\n            for (;; i++, enter = false) {\n                next = i < this.children.length ? this.children[i] : null;\n                if (!next || next.dom.parentNode == this.contentDOM)\n                    break;\n            }\n            if (next && enter && !next.border && !next.domAtom)\n                return next.domFromPos(0, side);\n            return { node: this.contentDOM, offset: next ? domIndex(next.dom) : this.contentDOM.childNodes.length };\n        }\n    }\n    // Used to find a DOM range in a single parent for a given changed\n    // range.\n    parseRange(from, to, base = 0) {\n        if (this.children.length == 0)\n            return { node: this.contentDOM, from, to, fromOffset: 0, toOffset: this.contentDOM.childNodes.length };\n        let fromOffset = -1, toOffset = -1;\n        for (let offset = base, i = 0;; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (fromOffset == -1 && from <= end) {\n                let childBase = offset + child.border;\n                // FIXME maybe descend mark views to parse a narrower range?\n                if (from >= childBase && to <= end - child.border && child.node &&\n                    child.contentDOM && this.contentDOM.contains(child.contentDOM))\n                    return child.parseRange(from, to, childBase);\n                from = offset;\n                for (let j = i; j > 0; j--) {\n                    let prev = this.children[j - 1];\n                    if (prev.size && prev.dom.parentNode == this.contentDOM && !prev.emptyChildAt(1)) {\n                        fromOffset = domIndex(prev.dom) + 1;\n                        break;\n                    }\n                    from -= prev.size;\n                }\n                if (fromOffset == -1)\n                    fromOffset = 0;\n            }\n            if (fromOffset > -1 && (end > to || i == this.children.length - 1)) {\n                to = end;\n                for (let j = i + 1; j < this.children.length; j++) {\n                    let next = this.children[j];\n                    if (next.size && next.dom.parentNode == this.contentDOM && !next.emptyChildAt(-1)) {\n                        toOffset = domIndex(next.dom);\n                        break;\n                    }\n                    to += next.size;\n                }\n                if (toOffset == -1)\n                    toOffset = this.contentDOM.childNodes.length;\n                break;\n            }\n            offset = end;\n        }\n        return { node: this.contentDOM, from, to, fromOffset, toOffset };\n    }\n    emptyChildAt(side) {\n        if (this.border || !this.contentDOM || !this.children.length)\n            return false;\n        let child = this.children[side < 0 ? 0 : this.children.length - 1];\n        return child.size == 0 || child.emptyChildAt(side);\n    }\n    domAfterPos(pos) {\n        let { node, offset } = this.domFromPos(pos, 0);\n        if (node.nodeType != 1 || offset == node.childNodes.length)\n            throw new RangeError(\"No node after pos \" + pos);\n        return node.childNodes[offset];\n    }\n    // View descs are responsible for setting any selection that falls\n    // entirely inside of them, so that custom implementations can do\n    // custom things with the selection. Note that this falls apart when\n    // a selection starts in such a node and ends in another, in which\n    // case we just use whatever domFromPos produces as a best effort.\n    setSelection(anchor, head, root, force = false) {\n        // If the selection falls entirely in a child, give it to that child\n        let from = Math.min(anchor, head), to = Math.max(anchor, head);\n        for (let i = 0, offset = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (from > offset && to < end)\n                return child.setSelection(anchor - offset - child.border, head - offset - child.border, root, force);\n            offset = end;\n        }\n        let anchorDOM = this.domFromPos(anchor, anchor ? -1 : 1);\n        let headDOM = head == anchor ? anchorDOM : this.domFromPos(head, head ? -1 : 1);\n        let domSel = root.getSelection();\n        let brKludge = false;\n        // On Firefox, using Selection.collapse to put the cursor after a\n        // BR node for some reason doesn't always work (#1073). On Safari,\n        // the cursor sometimes inexplicable visually lags behind its\n        // reported position in such situations (#1092).\n        if ((gecko || safari) && anchor == head) {\n            let { node, offset } = anchorDOM;\n            if (node.nodeType == 3) {\n                brKludge = !!(offset && node.nodeValue[offset - 1] == \"\\n\");\n                // Issue #1128\n                if (brKludge && offset == node.nodeValue.length) {\n                    for (let scan = node, after; scan; scan = scan.parentNode) {\n                        if (after = scan.nextSibling) {\n                            if (after.nodeName == \"BR\")\n                                anchorDOM = headDOM = { node: after.parentNode, offset: domIndex(after) + 1 };\n                            break;\n                        }\n                        let desc = scan.pmViewDesc;\n                        if (desc && desc.node && desc.node.isBlock)\n                            break;\n                    }\n                }\n            }\n            else {\n                let prev = node.childNodes[offset - 1];\n                brKludge = prev && (prev.nodeName == \"BR\" || prev.contentEditable == \"false\");\n            }\n        }\n        // Firefox can act strangely when the selection is in front of an\n        // uneditable node. See #1163 and https://bugzilla.mozilla.org/show_bug.cgi?id=1709536\n        if (gecko && domSel.focusNode && domSel.focusNode != headDOM.node && domSel.focusNode.nodeType == 1) {\n            let after = domSel.focusNode.childNodes[domSel.focusOffset];\n            if (after && after.contentEditable == \"false\")\n                force = true;\n        }\n        if (!(force || brKludge && safari) &&\n            isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset) &&\n            isEquivalentPosition(headDOM.node, headDOM.offset, domSel.focusNode, domSel.focusOffset))\n            return;\n        // Selection.extend can be used to create an 'inverted' selection\n        // (one where the focus is before the anchor), but not all\n        // browsers support it yet.\n        let domSelExtended = false;\n        if ((domSel.extend || anchor == head) && !brKludge) {\n            domSel.collapse(anchorDOM.node, anchorDOM.offset);\n            try {\n                if (anchor != head)\n                    domSel.extend(headDOM.node, headDOM.offset);\n                domSelExtended = true;\n            }\n            catch (_) {\n                // In some cases with Chrome the selection is empty after calling\n                // collapse, even when it should be valid. This appears to be a bug, but\n                // it is difficult to isolate. If this happens fallback to the old path\n                // without using extend.\n                // Similarly, this could crash on Safari if the editor is hidden, and\n                // there was no selection.\n            }\n        }\n        if (!domSelExtended) {\n            if (anchor > head) {\n                let tmp = anchorDOM;\n                anchorDOM = headDOM;\n                headDOM = tmp;\n            }\n            let range = document.createRange();\n            range.setEnd(headDOM.node, headDOM.offset);\n            range.setStart(anchorDOM.node, anchorDOM.offset);\n            domSel.removeAllRanges();\n            domSel.addRange(range);\n        }\n    }\n    ignoreMutation(mutation) {\n        return !this.contentDOM && mutation.type != \"selection\";\n    }\n    get contentLost() {\n        return this.contentDOM && this.contentDOM != this.dom && !this.dom.contains(this.contentDOM);\n    }\n    // Remove a subtree of the element tree that has been touched\n    // by a DOM change, so that the next update will redraw it.\n    markDirty(from, to) {\n        for (let offset = 0, i = 0; i < this.children.length; i++) {\n            let child = this.children[i], end = offset + child.size;\n            if (offset == end ? from <= end && to >= offset : from < end && to > offset) {\n                let startInside = offset + child.border, endInside = end - child.border;\n                if (from >= startInside && to <= endInside) {\n                    this.dirty = from == offset || to == end ? CONTENT_DIRTY : CHILD_DIRTY;\n                    if (from == startInside && to == endInside &&\n                        (child.contentLost || child.dom.parentNode != this.contentDOM))\n                        child.dirty = NODE_DIRTY;\n                    else\n                        child.markDirty(from - startInside, to - startInside);\n                    return;\n                }\n                else {\n                    child.dirty = child.dom == child.contentDOM && child.dom.parentNode == this.contentDOM && !child.children.length\n                        ? CONTENT_DIRTY : NODE_DIRTY;\n                }\n            }\n            offset = end;\n        }\n        this.dirty = CONTENT_DIRTY;\n    }\n    markParentsDirty() {\n        let level = 1;\n        for (let node = this.parent; node; node = node.parent, level++) {\n            let dirty = level == 1 ? CONTENT_DIRTY : CHILD_DIRTY;\n            if (node.dirty < dirty)\n                node.dirty = dirty;\n        }\n    }\n    get domAtom() { return false; }\n    get ignoreForCoords() { return false; }\n    isText(text) { return false; }\n}\n// A widget desc represents a widget decoration, which is a DOM node\n// drawn between the document nodes.\nclass WidgetViewDesc extends ViewDesc {\n    constructor(parent, widget, view, pos) {\n        let self, dom = widget.type.toDOM;\n        if (typeof dom == \"function\")\n            dom = dom(view, () => {\n                if (!self)\n                    return pos;\n                if (self.parent)\n                    return self.parent.posBeforeChild(self);\n            });\n        if (!widget.type.spec.raw) {\n            if (dom.nodeType != 1) {\n                let wrap = document.createElement(\"span\");\n                wrap.appendChild(dom);\n                dom = wrap;\n            }\n            dom.contentEditable = \"false\";\n            dom.classList.add(\"ProseMirror-widget\");\n        }\n        super(parent, [], dom, null);\n        this.widget = widget;\n        this.widget = widget;\n        self = this;\n    }\n    matchesWidget(widget) {\n        return this.dirty == NOT_DIRTY && widget.type.eq(this.widget.type);\n    }\n    parseRule() { return { ignore: true }; }\n    stopEvent(event) {\n        let stop = this.widget.spec.stopEvent;\n        return stop ? stop(event) : false;\n    }\n    ignoreMutation(mutation) {\n        return mutation.type != \"selection\" || this.widget.spec.ignoreSelection;\n    }\n    destroy() {\n        this.widget.type.destroy(this.dom);\n        super.destroy();\n    }\n    get domAtom() { return true; }\n    get side() { return this.widget.type.side; }\n}\nclass CompositionViewDesc extends ViewDesc {\n    constructor(parent, dom, textDOM, text) {\n        super(parent, [], dom, null);\n        this.textDOM = textDOM;\n        this.text = text;\n    }\n    get size() { return this.text.length; }\n    localPosFromDOM(dom, offset) {\n        if (dom != this.textDOM)\n            return this.posAtStart + (offset ? this.size : 0);\n        return this.posAtStart + offset;\n    }\n    domFromPos(pos) {\n        return { node: this.textDOM, offset: pos };\n    }\n    ignoreMutation(mut) {\n        return mut.type === 'characterData' && mut.target.nodeValue == mut.oldValue;\n    }\n}\n// A mark desc represents a mark. May have multiple children,\n// depending on how the mark is split. Note that marks are drawn using\n// a fixed nesting order, for simplicity and predictability, so in\n// some cases they will be split more often than would appear\n// necessary.\nclass MarkViewDesc extends ViewDesc {\n    constructor(parent, mark, dom, contentDOM) {\n        super(parent, [], dom, contentDOM);\n        this.mark = mark;\n    }\n    static create(parent, mark, inline, view) {\n        let custom = view.nodeViews[mark.type.name];\n        let spec = custom && custom(mark, view, inline);\n        if (!spec || !spec.dom)\n            spec = DOMSerializer.renderSpec(document, mark.type.spec.toDOM(mark, inline));\n        return new MarkViewDesc(parent, mark, spec.dom, spec.contentDOM || spec.dom);\n    }\n    parseRule() {\n        if ((this.dirty & NODE_DIRTY) || this.mark.type.spec.reparseInView)\n            return null;\n        return { mark: this.mark.type.name, attrs: this.mark.attrs, contentElement: this.contentDOM };\n    }\n    matchesMark(mark) { return this.dirty != NODE_DIRTY && this.mark.eq(mark); }\n    markDirty(from, to) {\n        super.markDirty(from, to);\n        // Move dirty info to nearest node view\n        if (this.dirty != NOT_DIRTY) {\n            let parent = this.parent;\n            while (!parent.node)\n                parent = parent.parent;\n            if (parent.dirty < this.dirty)\n                parent.dirty = this.dirty;\n            this.dirty = NOT_DIRTY;\n        }\n    }\n    slice(from, to, view) {\n        let copy = MarkViewDesc.create(this.parent, this.mark, true, view);\n        let nodes = this.children, size = this.size;\n        if (to < size)\n            nodes = replaceNodes(nodes, to, size, view);\n        if (from > 0)\n            nodes = replaceNodes(nodes, 0, from, view);\n        for (let i = 0; i < nodes.length; i++)\n            nodes[i].parent = copy;\n        copy.children = nodes;\n        return copy;\n    }\n}\n// Node view descs are the main, most common type of view desc, and\n// correspond to an actual node in the document. Unlike mark descs,\n// they populate their child array themselves.\nclass NodeViewDesc extends ViewDesc {\n    constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos) {\n        super(parent, [], dom, contentDOM);\n        this.node = node;\n        this.outerDeco = outerDeco;\n        this.innerDeco = innerDeco;\n        this.nodeDOM = nodeDOM;\n    }\n    // By default, a node is rendered using the `toDOM` method from the\n    // node type spec. But client code can use the `nodeViews` spec to\n    // supply a custom node view, which can influence various aspects of\n    // the way the node works.\n    //\n    // (Using subclassing for this was intentionally decided against,\n    // since it'd require exposing a whole slew of finicky\n    // implementation details to the user code that they probably will\n    // never need.)\n    static create(parent, node, outerDeco, innerDeco, view, pos) {\n        let custom = view.nodeViews[node.type.name], descObj;\n        let spec = custom && custom(node, view, () => {\n            // (This is a function that allows the custom view to find its\n            // own position)\n            if (!descObj)\n                return pos;\n            if (descObj.parent)\n                return descObj.parent.posBeforeChild(descObj);\n        }, outerDeco, innerDeco);\n        let dom = spec && spec.dom, contentDOM = spec && spec.contentDOM;\n        if (node.isText) {\n            if (!dom)\n                dom = document.createTextNode(node.text);\n            else if (dom.nodeType != 3)\n                throw new RangeError(\"Text must be rendered as a DOM text node\");\n        }\n        else if (!dom) {\n            ({ dom, contentDOM } = DOMSerializer.renderSpec(document, node.type.spec.toDOM(node)));\n        }\n        if (!contentDOM && !node.isText && dom.nodeName != \"BR\") { // Chrome gets confused by <br contenteditable=false>\n            if (!dom.hasAttribute(\"contenteditable\"))\n                dom.contentEditable = \"false\";\n            if (node.type.spec.draggable)\n                dom.draggable = true;\n        }\n        let nodeDOM = dom;\n        dom = applyOuterDeco(dom, outerDeco, node);\n        if (spec)\n            return descObj = new CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, spec, view, pos + 1);\n        else if (node.isText)\n            return new TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM, view);\n        else\n            return new NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, view, pos + 1);\n    }\n    parseRule() {\n        // Experimental kludge to allow opt-in re-parsing of nodes\n        if (this.node.type.spec.reparseInView)\n            return null;\n        // FIXME the assumption that this can always return the current\n        // attrs means that if the user somehow manages to change the\n        // attrs in the dom, that won't be picked up. Not entirely sure\n        // whether this is a problem\n        let rule = { node: this.node.type.name, attrs: this.node.attrs };\n        if (this.node.type.whitespace == \"pre\")\n            rule.preserveWhitespace = \"full\";\n        if (!this.contentDOM) {\n            rule.getContent = () => this.node.content;\n        }\n        else if (!this.contentLost) {\n            rule.contentElement = this.contentDOM;\n        }\n        else {\n            // Chrome likes to randomly recreate parent nodes when\n            // backspacing things. When that happens, this tries to find the\n            // new parent.\n            for (let i = this.children.length - 1; i >= 0; i--) {\n                let child = this.children[i];\n                if (this.dom.contains(child.dom.parentNode)) {\n                    rule.contentElement = child.dom.parentNode;\n                    break;\n                }\n            }\n            if (!rule.contentElement)\n                rule.getContent = () => Fragment.empty;\n        }\n        return rule;\n    }\n    matchesNode(node, outerDeco, innerDeco) {\n        return this.dirty == NOT_DIRTY && node.eq(this.node) &&\n            sameOuterDeco(outerDeco, this.outerDeco) && innerDeco.eq(this.innerDeco);\n    }\n    get size() { return this.node.nodeSize; }\n    get border() { return this.node.isLeaf ? 0 : 1; }\n    // Syncs `this.children` to match `this.node.content` and the local\n    // decorations, possibly introducing nesting for marks. Then, in a\n    // separate step, syncs the DOM inside `this.contentDOM` to\n    // `this.children`.\n    updateChildren(view, pos) {\n        let inline = this.node.inlineContent, off = pos;\n        let composition = view.composing ? this.localCompositionInfo(view, pos) : null;\n        let localComposition = composition && composition.pos > -1 ? composition : null;\n        let compositionInChild = composition && composition.pos < 0;\n        let updater = new ViewTreeUpdater(this, localComposition && localComposition.node, view);\n        iterDeco(this.node, this.innerDeco, (widget, i, insideNode) => {\n            if (widget.spec.marks)\n                updater.syncToMarks(widget.spec.marks, inline, view);\n            else if (widget.type.side >= 0 && !insideNode)\n                updater.syncToMarks(i == this.node.childCount ? Mark.none : this.node.child(i).marks, inline, view);\n            // If the next node is a desc matching this widget, reuse it,\n            // otherwise insert the widget as a new view desc.\n            updater.placeWidget(widget, view, off);\n        }, (child, outerDeco, innerDeco, i) => {\n            // Make sure the wrapping mark descs match the node's marks.\n            updater.syncToMarks(child.marks, inline, view);\n            // Try several strategies for drawing this node\n            let compIndex;\n            if (updater.findNodeMatch(child, outerDeco, innerDeco, i)) ;\n            else if (compositionInChild && view.state.selection.from > off &&\n                view.state.selection.to < off + child.nodeSize &&\n                (compIndex = updater.findIndexWithChild(composition.node)) > -1 &&\n                updater.updateNodeAt(child, outerDeco, innerDeco, compIndex, view)) ;\n            else if (updater.updateNextNode(child, outerDeco, innerDeco, view, i, off)) ;\n            else {\n                // Add it as a new view\n                updater.addNode(child, outerDeco, innerDeco, view, off);\n            }\n            off += child.nodeSize;\n        });\n        // Drop all remaining descs after the current position.\n        updater.syncToMarks([], inline, view);\n        if (this.node.isTextblock)\n            updater.addTextblockHacks();\n        updater.destroyRest();\n        // Sync the DOM if anything changed\n        if (updater.changed || this.dirty == CONTENT_DIRTY) {\n            // May have to protect focused DOM from being changed if a composition is active\n            if (localComposition)\n                this.protectLocalComposition(view, localComposition);\n            renderDescs(this.contentDOM, this.children, view);\n            if (ios)\n                iosHacks(this.dom);\n        }\n    }\n    localCompositionInfo(view, pos) {\n        // Only do something if both the selection and a focused text node\n        // are inside of this node\n        let { from, to } = view.state.selection;\n        if (!(view.state.selection instanceof TextSelection) || from < pos || to > pos + this.node.content.size)\n            return null;\n        let textNode = view.input.compositionNode;\n        if (!textNode || !this.dom.contains(textNode.parentNode))\n            return null;\n        if (this.node.inlineContent) {\n            // Find the text in the focused node in the node, stop if it's not\n            // there (may have been modified through other means, in which\n            // case it should overwritten)\n            let text = textNode.nodeValue;\n            let textPos = findTextInFragment(this.node.content, text, from - pos, to - pos);\n            return textPos < 0 ? null : { node: textNode, pos: textPos, text };\n        }\n        else {\n            return { node: textNode, pos: -1, text: \"\" };\n        }\n    }\n    protectLocalComposition(view, { node, pos, text }) {\n        // The node is already part of a local view desc, leave it there\n        if (this.getDesc(node))\n            return;\n        // Create a composition view for the orphaned nodes\n        let topNode = node;\n        for (;; topNode = topNode.parentNode) {\n            if (topNode.parentNode == this.contentDOM)\n                break;\n            while (topNode.previousSibling)\n                topNode.parentNode.removeChild(topNode.previousSibling);\n            while (topNode.nextSibling)\n                topNode.parentNode.removeChild(topNode.nextSibling);\n            if (topNode.pmViewDesc)\n                topNode.pmViewDesc = undefined;\n        }\n        let desc = new CompositionViewDesc(this, topNode, node, text);\n        view.input.compositionNodes.push(desc);\n        // Patch up this.children to contain the composition view\n        this.children = replaceNodes(this.children, pos, pos + text.length, view, desc);\n    }\n    // If this desc must be updated to match the given node decoration,\n    // do so and return true.\n    update(node, outerDeco, innerDeco, view) {\n        if (this.dirty == NODE_DIRTY ||\n            !node.sameMarkup(this.node))\n            return false;\n        this.updateInner(node, outerDeco, innerDeco, view);\n        return true;\n    }\n    updateInner(node, outerDeco, innerDeco, view) {\n        this.updateOuterDeco(outerDeco);\n        this.node = node;\n        this.innerDeco = innerDeco;\n        if (this.contentDOM)\n            this.updateChildren(view, this.posAtStart);\n        this.dirty = NOT_DIRTY;\n    }\n    updateOuterDeco(outerDeco) {\n        if (sameOuterDeco(outerDeco, this.outerDeco))\n            return;\n        let needsWrap = this.nodeDOM.nodeType != 1;\n        let oldDOM = this.dom;\n        this.dom = patchOuterDeco(this.dom, this.nodeDOM, computeOuterDeco(this.outerDeco, this.node, needsWrap), computeOuterDeco(outerDeco, this.node, needsWrap));\n        if (this.dom != oldDOM) {\n            oldDOM.pmViewDesc = undefined;\n            this.dom.pmViewDesc = this;\n        }\n        this.outerDeco = outerDeco;\n    }\n    // Mark this node as being the selected node.\n    selectNode() {\n        if (this.nodeDOM.nodeType == 1)\n            this.nodeDOM.classList.add(\"ProseMirror-selectednode\");\n        if (this.contentDOM || !this.node.type.spec.draggable)\n            this.dom.draggable = true;\n    }\n    // Remove selected node marking from this node.\n    deselectNode() {\n        if (this.nodeDOM.nodeType == 1)\n            this.nodeDOM.classList.remove(\"ProseMirror-selectednode\");\n        if (this.contentDOM || !this.node.type.spec.draggable)\n            this.dom.removeAttribute(\"draggable\");\n    }\n    get domAtom() { return this.node.isAtom; }\n}\n// Create a view desc for the top-level document node, to be exported\n// and used by the view class.\nfunction docViewDesc(doc, outerDeco, innerDeco, dom, view) {\n    applyOuterDeco(dom, outerDeco, doc);\n    let docView = new NodeViewDesc(undefined, doc, outerDeco, innerDeco, dom, dom, dom, view, 0);\n    if (docView.contentDOM)\n        docView.updateChildren(view, 0);\n    return docView;\n}\nclass TextViewDesc extends NodeViewDesc {\n    constructor(parent, node, outerDeco, innerDeco, dom, nodeDOM, view) {\n        super(parent, node, outerDeco, innerDeco, dom, null, nodeDOM, view, 0);\n    }\n    parseRule() {\n        let skip = this.nodeDOM.parentNode;\n        while (skip && skip != this.dom && !skip.pmIsDeco)\n            skip = skip.parentNode;\n        return { skip: (skip || true) };\n    }\n    update(node, outerDeco, innerDeco, view) {\n        if (this.dirty == NODE_DIRTY || (this.dirty != NOT_DIRTY && !this.inParent()) ||\n            !node.sameMarkup(this.node))\n            return false;\n        this.updateOuterDeco(outerDeco);\n        if ((this.dirty != NOT_DIRTY || node.text != this.node.text) && node.text != this.nodeDOM.nodeValue) {\n            this.nodeDOM.nodeValue = node.text;\n            if (view.trackWrites == this.nodeDOM)\n                view.trackWrites = null;\n        }\n        this.node = node;\n        this.dirty = NOT_DIRTY;\n        return true;\n    }\n    inParent() {\n        let parentDOM = this.parent.contentDOM;\n        for (let n = this.nodeDOM; n; n = n.parentNode)\n            if (n == parentDOM)\n                return true;\n        return false;\n    }\n    domFromPos(pos) {\n        return { node: this.nodeDOM, offset: pos };\n    }\n    localPosFromDOM(dom, offset, bias) {\n        if (dom == this.nodeDOM)\n            return this.posAtStart + Math.min(offset, this.node.text.length);\n        return super.localPosFromDOM(dom, offset, bias);\n    }\n    ignoreMutation(mutation) {\n        return mutation.type != \"characterData\" && mutation.type != \"selection\";\n    }\n    slice(from, to, view) {\n        let node = this.node.cut(from, to), dom = document.createTextNode(node.text);\n        return new TextViewDesc(this.parent, node, this.outerDeco, this.innerDeco, dom, dom, view);\n    }\n    markDirty(from, to) {\n        super.markDirty(from, to);\n        if (this.dom != this.nodeDOM && (from == 0 || to == this.nodeDOM.nodeValue.length))\n            this.dirty = NODE_DIRTY;\n    }\n    get domAtom() { return false; }\n    isText(text) { return this.node.text == text; }\n}\n// A dummy desc used to tag trailing BR or IMG nodes created to work\n// around contentEditable terribleness.\nclass TrailingHackViewDesc extends ViewDesc {\n    parseRule() { return { ignore: true }; }\n    matchesHack(nodeName) { return this.dirty == NOT_DIRTY && this.dom.nodeName == nodeName; }\n    get domAtom() { return true; }\n    get ignoreForCoords() { return this.dom.nodeName == \"IMG\"; }\n}\n// A separate subclass is used for customized node views, so that the\n// extra checks only have to be made for nodes that are actually\n// customized.\nclass CustomNodeViewDesc extends NodeViewDesc {\n    constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, spec, view, pos) {\n        super(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos);\n        this.spec = spec;\n    }\n    // A custom `update` method gets to decide whether the update goes\n    // through. If it does, and there's a `contentDOM` node, our logic\n    // updates the children.\n    update(node, outerDeco, innerDeco, view) {\n        if (this.dirty == NODE_DIRTY)\n            return false;\n        if (this.spec.update) {\n            let result = this.spec.update(node, outerDeco, innerDeco);\n            if (result)\n                this.updateInner(node, outerDeco, innerDeco, view);\n            return result;\n        }\n        else if (!this.contentDOM && !node.isLeaf) {\n            return false;\n        }\n        else {\n            return super.update(node, outerDeco, innerDeco, view);\n        }\n    }\n    selectNode() {\n        this.spec.selectNode ? this.spec.selectNode() : super.selectNode();\n    }\n    deselectNode() {\n        this.spec.deselectNode ? this.spec.deselectNode() : super.deselectNode();\n    }\n    setSelection(anchor, head, root, force) {\n        this.spec.setSelection ? this.spec.setSelection(anchor, head, root)\n            : super.setSelection(anchor, head, root, force);\n    }\n    destroy() {\n        if (this.spec.destroy)\n            this.spec.destroy();\n        super.destroy();\n    }\n    stopEvent(event) {\n        return this.spec.stopEvent ? this.spec.stopEvent(event) : false;\n    }\n    ignoreMutation(mutation) {\n        return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : super.ignoreMutation(mutation);\n    }\n}\n// Sync the content of the given DOM node with the nodes associated\n// with the given array of view descs, recursing into mark descs\n// because this should sync the subtree for a whole node at a time.\nfunction renderDescs(parentDOM, descs, view) {\n    let dom = parentDOM.firstChild, written = false;\n    for (let i = 0; i < descs.length; i++) {\n        let desc = descs[i], childDOM = desc.dom;\n        if (childDOM.parentNode == parentDOM) {\n            while (childDOM != dom) {\n                dom = rm(dom);\n                written = true;\n            }\n            dom = dom.nextSibling;\n        }\n        else {\n            written = true;\n            parentDOM.insertBefore(childDOM, dom);\n        }\n        if (desc instanceof MarkViewDesc) {\n            let pos = dom ? dom.previousSibling : parentDOM.lastChild;\n            renderDescs(desc.contentDOM, desc.children, view);\n            dom = pos ? pos.nextSibling : parentDOM.firstChild;\n        }\n    }\n    while (dom) {\n        dom = rm(dom);\n        written = true;\n    }\n    if (written && view.trackWrites == parentDOM)\n        view.trackWrites = null;\n}\nconst OuterDecoLevel = function (nodeName) {\n    if (nodeName)\n        this.nodeName = nodeName;\n};\nOuterDecoLevel.prototype = Object.create(null);\nconst noDeco = [new OuterDecoLevel];\nfunction computeOuterDeco(outerDeco, node, needsWrap) {\n    if (outerDeco.length == 0)\n        return noDeco;\n    let top = needsWrap ? noDeco[0] : new OuterDecoLevel, result = [top];\n    for (let i = 0; i < outerDeco.length; i++) {\n        let attrs = outerDeco[i].type.attrs;\n        if (!attrs)\n            continue;\n        if (attrs.nodeName)\n            result.push(top = new OuterDecoLevel(attrs.nodeName));\n        for (let name in attrs) {\n            let val = attrs[name];\n            if (val == null)\n                continue;\n            if (needsWrap && result.length == 1)\n                result.push(top = new OuterDecoLevel(node.isInline ? \"span\" : \"div\"));\n            if (name == \"class\")\n                top.class = (top.class ? top.class + \" \" : \"\") + val;\n            else if (name == \"style\")\n                top.style = (top.style ? top.style + \";\" : \"\") + val;\n            else if (name != \"nodeName\")\n                top[name] = val;\n        }\n    }\n    return result;\n}\nfunction patchOuterDeco(outerDOM, nodeDOM, prevComputed, curComputed) {\n    // Shortcut for trivial case\n    if (prevComputed == noDeco && curComputed == noDeco)\n        return nodeDOM;\n    let curDOM = nodeDOM;\n    for (let i = 0; i < curComputed.length; i++) {\n        let deco = curComputed[i], prev = prevComputed[i];\n        if (i) {\n            let parent;\n            if (prev && prev.nodeName == deco.nodeName && curDOM != outerDOM &&\n                (parent = curDOM.parentNode) && parent.nodeName.toLowerCase() == deco.nodeName) {\n                curDOM = parent;\n            }\n            else {\n                parent = document.createElement(deco.nodeName);\n                parent.pmIsDeco = true;\n                parent.appendChild(curDOM);\n                prev = noDeco[0];\n                curDOM = parent;\n            }\n        }\n        patchAttributes(curDOM, prev || noDeco[0], deco);\n    }\n    return curDOM;\n}\nfunction patchAttributes(dom, prev, cur) {\n    for (let name in prev)\n        if (name != \"class\" && name != \"style\" && name != \"nodeName\" && !(name in cur))\n            dom.removeAttribute(name);\n    for (let name in cur)\n        if (name != \"class\" && name != \"style\" && name != \"nodeName\" && cur[name] != prev[name])\n            dom.setAttribute(name, cur[name]);\n    if (prev.class != cur.class) {\n        let prevList = prev.class ? prev.class.split(\" \").filter(Boolean) : [];\n        let curList = cur.class ? cur.class.split(\" \").filter(Boolean) : [];\n        for (let i = 0; i < prevList.length; i++)\n            if (curList.indexOf(prevList[i]) == -1)\n                dom.classList.remove(prevList[i]);\n        for (let i = 0; i < curList.length; i++)\n            if (prevList.indexOf(curList[i]) == -1)\n                dom.classList.add(curList[i]);\n        if (dom.classList.length == 0)\n            dom.removeAttribute(\"class\");\n    }\n    if (prev.style != cur.style) {\n        if (prev.style) {\n            let prop = /\\s*([\\w\\-\\xa1-\\uffff]+)\\s*:(?:\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|\\(.*?\\)|[^;])*/g, m;\n            while (m = prop.exec(prev.style))\n                dom.style.removeProperty(m[1]);\n        }\n        if (cur.style)\n            dom.style.cssText += cur.style;\n    }\n}\nfunction applyOuterDeco(dom, deco, node) {\n    return patchOuterDeco(dom, dom, noDeco, computeOuterDeco(deco, node, dom.nodeType != 1));\n}\nfunction sameOuterDeco(a, b) {\n    if (a.length != b.length)\n        return false;\n    for (let i = 0; i < a.length; i++)\n        if (!a[i].type.eq(b[i].type))\n            return false;\n    return true;\n}\n// Remove a DOM node and return its next sibling.\nfunction rm(dom) {\n    let next = dom.nextSibling;\n    dom.parentNode.removeChild(dom);\n    return next;\n}\n// Helper class for incrementally updating a tree of mark descs and\n// the widget and node descs inside of them.\nclass ViewTreeUpdater {\n    constructor(top, lock, view) {\n        this.lock = lock;\n        this.view = view;\n        // Index into `this.top`'s child array, represents the current\n        // update position.\n        this.index = 0;\n        // When entering a mark, the current top and index are pushed\n        // onto this.\n        this.stack = [];\n        // Tracks whether anything was changed\n        this.changed = false;\n        this.top = top;\n        this.preMatch = preMatch(top.node.content, top);\n    }\n    // Destroy and remove the children between the given indices in\n    // `this.top`.\n    destroyBetween(start, end) {\n        if (start == end)\n            return;\n        for (let i = start; i < end; i++)\n            this.top.children[i].destroy();\n        this.top.children.splice(start, end - start);\n        this.changed = true;\n    }\n    // Destroy all remaining children in `this.top`.\n    destroyRest() {\n        this.destroyBetween(this.index, this.top.children.length);\n    }\n    // Sync the current stack of mark descs with the given array of\n    // marks, reusing existing mark descs when possible.\n    syncToMarks(marks, inline, view) {\n        let keep = 0, depth = this.stack.length >> 1;\n        let maxKeep = Math.min(depth, marks.length);\n        while (keep < maxKeep &&\n            (keep == depth - 1 ? this.top : this.stack[(keep + 1) << 1])\n                .matchesMark(marks[keep]) && marks[keep].type.spec.spanning !== false)\n            keep++;\n        while (keep < depth) {\n            this.destroyRest();\n            this.top.dirty = NOT_DIRTY;\n            this.index = this.stack.pop();\n            this.top = this.stack.pop();\n            depth--;\n        }\n        while (depth < marks.length) {\n            this.stack.push(this.top, this.index + 1);\n            let found = -1;\n            for (let i = this.index; i < Math.min(this.index + 3, this.top.children.length); i++) {\n                let next = this.top.children[i];\n                if (next.matchesMark(marks[depth]) && !this.isLocked(next.dom)) {\n                    found = i;\n                    break;\n                }\n            }\n            if (found > -1) {\n                if (found > this.index) {\n                    this.changed = true;\n                    this.destroyBetween(this.index, found);\n                }\n                this.top = this.top.children[this.index];\n            }\n            else {\n                let markDesc = MarkViewDesc.create(this.top, marks[depth], inline, view);\n                this.top.children.splice(this.index, 0, markDesc);\n                this.top = markDesc;\n                this.changed = true;\n            }\n            this.index = 0;\n            depth++;\n        }\n    }\n    // Try to find a node desc matching the given data. Skip over it and\n    // return true when successful.\n    findNodeMatch(node, outerDeco, innerDeco, index) {\n        let found = -1, targetDesc;\n        if (index >= this.preMatch.index &&\n            (targetDesc = this.preMatch.matches[index - this.preMatch.index]).parent == this.top &&\n            targetDesc.matchesNode(node, outerDeco, innerDeco)) {\n            found = this.top.children.indexOf(targetDesc, this.index);\n        }\n        else {\n            for (let i = this.index, e = Math.min(this.top.children.length, i + 5); i < e; i++) {\n                let child = this.top.children[i];\n                if (child.matchesNode(node, outerDeco, innerDeco) && !this.preMatch.matched.has(child)) {\n                    found = i;\n                    break;\n                }\n            }\n        }\n        if (found < 0)\n            return false;\n        this.destroyBetween(this.index, found);\n        this.index++;\n        return true;\n    }\n    updateNodeAt(node, outerDeco, innerDeco, index, view) {\n        let child = this.top.children[index];\n        if (child.dirty == NODE_DIRTY && child.dom == child.contentDOM)\n            child.dirty = CONTENT_DIRTY;\n        if (!child.update(node, outerDeco, innerDeco, view))\n            return false;\n        this.destroyBetween(this.index, index);\n        this.index++;\n        return true;\n    }\n    findIndexWithChild(domNode) {\n        for (;;) {\n            let parent = domNode.parentNode;\n            if (!parent)\n                return -1;\n            if (parent == this.top.contentDOM) {\n                let desc = domNode.pmViewDesc;\n                if (desc)\n                    for (let i = this.index; i < this.top.children.length; i++) {\n                        if (this.top.children[i] == desc)\n                            return i;\n                    }\n                return -1;\n            }\n            domNode = parent;\n        }\n    }\n    // Try to update the next node, if any, to the given data. Checks\n    // pre-matches to avoid overwriting nodes that could still be used.\n    updateNextNode(node, outerDeco, innerDeco, view, index, pos) {\n        for (let i = this.index; i < this.top.children.length; i++) {\n            let next = this.top.children[i];\n            if (next instanceof NodeViewDesc) {\n                let preMatch = this.preMatch.matched.get(next);\n                if (preMatch != null && preMatch != index)\n                    return false;\n                let nextDOM = next.dom, updated;\n                // Can't update if nextDOM is or contains this.lock, except if\n                // it's a text node whose content already matches the new text\n                // and whose decorations match the new ones.\n                let locked = this.isLocked(nextDOM) &&\n                    !(node.isText && next.node && next.node.isText && next.nodeDOM.nodeValue == node.text &&\n                        next.dirty != NODE_DIRTY && sameOuterDeco(outerDeco, next.outerDeco));\n                if (!locked && next.update(node, outerDeco, innerDeco, view)) {\n                    this.destroyBetween(this.index, i);\n                    if (next.dom != nextDOM)\n                        this.changed = true;\n                    this.index++;\n                    return true;\n                }\n                else if (!locked && (updated = this.recreateWrapper(next, node, outerDeco, innerDeco, view, pos))) {\n                    this.top.children[this.index] = updated;\n                    if (updated.contentDOM) {\n                        updated.dirty = CONTENT_DIRTY;\n                        updated.updateChildren(view, pos + 1);\n                        updated.dirty = NOT_DIRTY;\n                    }\n                    this.changed = true;\n                    this.index++;\n                    return true;\n                }\n                break;\n            }\n        }\n        return false;\n    }\n    // When a node with content is replaced by a different node with\n    // identical content, move over its children.\n    recreateWrapper(next, node, outerDeco, innerDeco, view, pos) {\n        if (next.dirty || node.isAtom || !next.children.length ||\n            !next.node.content.eq(node.content))\n            return null;\n        let wrapper = NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos);\n        if (wrapper.contentDOM) {\n            wrapper.children = next.children;\n            next.children = [];\n            for (let ch of wrapper.children)\n                ch.parent = wrapper;\n        }\n        next.destroy();\n        return wrapper;\n    }\n    // Insert the node as a newly created node desc.\n    addNode(node, outerDeco, innerDeco, view, pos) {\n        let desc = NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos);\n        if (desc.contentDOM)\n            desc.updateChildren(view, pos + 1);\n        this.top.children.splice(this.index++, 0, desc);\n        this.changed = true;\n    }\n    placeWidget(widget, view, pos) {\n        let next = this.index < this.top.children.length ? this.top.children[this.index] : null;\n        if (next && next.matchesWidget(widget) &&\n            (widget == next.widget || !next.widget.type.toDOM.parentNode)) {\n            this.index++;\n        }\n        else {\n            let desc = new WidgetViewDesc(this.top, widget, view, pos);\n            this.top.children.splice(this.index++, 0, desc);\n            this.changed = true;\n        }\n    }\n    // Make sure a textblock looks and behaves correctly in\n    // contentEditable.\n    addTextblockHacks() {\n        let lastChild = this.top.children[this.index - 1], parent = this.top;\n        while (lastChild instanceof MarkViewDesc) {\n            parent = lastChild;\n            lastChild = parent.children[parent.children.length - 1];\n        }\n        if (!lastChild || // Empty textblock\n            !(lastChild instanceof TextViewDesc) ||\n            /\\n$/.test(lastChild.node.text) ||\n            (this.view.requiresGeckoHackNode && /\\s$/.test(lastChild.node.text))) {\n            // Avoid bugs in Safari's cursor drawing (#1165) and Chrome's mouse selection (#1152)\n            if ((safari || chrome) && lastChild && lastChild.dom.contentEditable == \"false\")\n                this.addHackNode(\"IMG\", parent);\n            this.addHackNode(\"BR\", this.top);\n        }\n    }\n    addHackNode(nodeName, parent) {\n        if (parent == this.top && this.index < parent.children.length && parent.children[this.index].matchesHack(nodeName)) {\n            this.index++;\n        }\n        else {\n            let dom = document.createElement(nodeName);\n            if (nodeName == \"IMG\") {\n                dom.className = \"ProseMirror-separator\";\n                dom.alt = \"\";\n            }\n            if (nodeName == \"BR\")\n                dom.className = \"ProseMirror-trailingBreak\";\n            let hack = new TrailingHackViewDesc(this.top, [], dom, null);\n            if (parent != this.top)\n                parent.children.push(hack);\n            else\n                parent.children.splice(this.index++, 0, hack);\n            this.changed = true;\n        }\n    }\n    isLocked(node) {\n        return this.lock && (node == this.lock || node.nodeType == 1 && node.contains(this.lock.parentNode));\n    }\n}\n// Iterate from the end of the fragment and array of descs to find\n// directly matching ones, in order to avoid overeagerly reusing those\n// for other nodes. Returns the fragment index of the first node that\n// is part of the sequence of matched nodes at the end of the\n// fragment.\nfunction preMatch(frag, parentDesc) {\n    let curDesc = parentDesc, descI = curDesc.children.length;\n    let fI = frag.childCount, matched = new Map, matches = [];\n    outer: while (fI > 0) {\n        let desc;\n        for (;;) {\n            if (descI) {\n                let next = curDesc.children[descI - 1];\n                if (next instanceof MarkViewDesc) {\n                    curDesc = next;\n                    descI = next.children.length;\n                }\n                else {\n                    desc = next;\n                    descI--;\n                    break;\n                }\n            }\n            else if (curDesc == parentDesc) {\n                break outer;\n            }\n            else {\n                // FIXME\n                descI = curDesc.parent.children.indexOf(curDesc);\n                curDesc = curDesc.parent;\n            }\n        }\n        let node = desc.node;\n        if (!node)\n            continue;\n        if (node != frag.child(fI - 1))\n            break;\n        --fI;\n        matched.set(desc, fI);\n        matches.push(desc);\n    }\n    return { index: fI, matched, matches: matches.reverse() };\n}\nfunction compareSide(a, b) {\n    return a.type.side - b.type.side;\n}\n// This function abstracts iterating over the nodes and decorations in\n// a fragment. Calls `onNode` for each node, with its local and child\n// decorations. Splits text nodes when there is a decoration starting\n// or ending inside of them. Calls `onWidget` for each widget.\nfunction iterDeco(parent, deco, onWidget, onNode) {\n    let locals = deco.locals(parent), offset = 0;\n    // Simple, cheap variant for when there are no local decorations\n    if (locals.length == 0) {\n        for (let i = 0; i < parent.childCount; i++) {\n            let child = parent.child(i);\n            onNode(child, locals, deco.forChild(offset, child), i);\n            offset += child.nodeSize;\n        }\n        return;\n    }\n    let decoIndex = 0, active = [], restNode = null;\n    for (let parentIndex = 0;;) {\n        let widget, widgets;\n        while (decoIndex < locals.length && locals[decoIndex].to == offset) {\n            let next = locals[decoIndex++];\n            if (next.widget) {\n                if (!widget)\n                    widget = next;\n                else\n                    (widgets || (widgets = [widget])).push(next);\n            }\n        }\n        if (widget) {\n            if (widgets) {\n                widgets.sort(compareSide);\n                for (let i = 0; i < widgets.length; i++)\n                    onWidget(widgets[i], parentIndex, !!restNode);\n            }\n            else {\n                onWidget(widget, parentIndex, !!restNode);\n            }\n        }\n        let child, index;\n        if (restNode) {\n            index = -1;\n            child = restNode;\n            restNode = null;\n        }\n        else if (parentIndex < parent.childCount) {\n            index = parentIndex;\n            child = parent.child(parentIndex++);\n        }\n        else {\n            break;\n        }\n        for (let i = 0; i < active.length; i++)\n            if (active[i].to <= offset)\n                active.splice(i--, 1);\n        while (decoIndex < locals.length && locals[decoIndex].from <= offset && locals[decoIndex].to > offset)\n            active.push(locals[decoIndex++]);\n        let end = offset + child.nodeSize;\n        if (child.isText) {\n            let cutAt = end;\n            if (decoIndex < locals.length && locals[decoIndex].from < cutAt)\n                cutAt = locals[decoIndex].from;\n            for (let i = 0; i < active.length; i++)\n                if (active[i].to < cutAt)\n                    cutAt = active[i].to;\n            if (cutAt < end) {\n                restNode = child.cut(cutAt - offset);\n                child = child.cut(0, cutAt - offset);\n                end = cutAt;\n                index = -1;\n            }\n        }\n        else {\n            while (decoIndex < locals.length && locals[decoIndex].to < end)\n                decoIndex++;\n        }\n        let outerDeco = child.isInline && !child.isLeaf ? active.filter(d => !d.inline) : active.slice();\n        onNode(child, outerDeco, deco.forChild(offset, child), index);\n        offset = end;\n    }\n}\n// List markers in Mobile Safari will mysteriously disappear\n// sometimes. This works around that.\nfunction iosHacks(dom) {\n    if (dom.nodeName == \"UL\" || dom.nodeName == \"OL\") {\n        let oldCSS = dom.style.cssText;\n        dom.style.cssText = oldCSS + \"; list-style: square !important\";\n        window.getComputedStyle(dom).listStyle;\n        dom.style.cssText = oldCSS;\n    }\n}\n// Find a piece of text in an inline fragment, overlapping from-to\nfunction findTextInFragment(frag, text, from, to) {\n    for (let i = 0, pos = 0; i < frag.childCount && pos <= to;) {\n        let child = frag.child(i++), childStart = pos;\n        pos += child.nodeSize;\n        if (!child.isText)\n            continue;\n        let str = child.text;\n        while (i < frag.childCount) {\n            let next = frag.child(i++);\n            pos += next.nodeSize;\n            if (!next.isText)\n                break;\n            str += next.text;\n        }\n        if (pos >= from) {\n            if (pos >= to && str.slice(to - text.length - childStart, to - childStart) == text)\n                return to - text.length;\n            let found = childStart < to ? str.lastIndexOf(text, to - childStart - 1) : -1;\n            if (found >= 0 && found + text.length + childStart >= from)\n                return childStart + found;\n            if (from == to && str.length >= (to + text.length) - childStart &&\n                str.slice(to - childStart, to - childStart + text.length) == text)\n                return to;\n        }\n    }\n    return -1;\n}\n// Replace range from-to in an array of view descs with replacement\n// (may be null to just delete). This goes very much against the grain\n// of the rest of this code, which tends to create nodes with the\n// right shape in one go, rather than messing with them after\n// creation, but is necessary in the composition hack.\nfunction replaceNodes(nodes, from, to, view, replacement) {\n    let result = [];\n    for (let i = 0, off = 0; i < nodes.length; i++) {\n        let child = nodes[i], start = off, end = off += child.size;\n        if (start >= to || end <= from) {\n            result.push(child);\n        }\n        else {\n            if (start < from)\n                result.push(child.slice(0, from - start, view));\n            if (replacement) {\n                result.push(replacement);\n                replacement = undefined;\n            }\n            if (end > to)\n                result.push(child.slice(to - start, child.size, view));\n        }\n    }\n    return result;\n}\n\nfunction selectionFromDOM(view, origin = null) {\n    let domSel = view.domSelectionRange(), doc = view.state.doc;\n    if (!domSel.focusNode)\n        return null;\n    let nearestDesc = view.docView.nearestDesc(domSel.focusNode), inWidget = nearestDesc && nearestDesc.size == 0;\n    let head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset, 1);\n    if (head < 0)\n        return null;\n    let $head = doc.resolve(head), $anchor, selection;\n    if (selectionCollapsed(domSel)) {\n        $anchor = $head;\n        while (nearestDesc && !nearestDesc.node)\n            nearestDesc = nearestDesc.parent;\n        let nearestDescNode = nearestDesc.node;\n        if (nearestDesc && nearestDescNode.isAtom && NodeSelection.isSelectable(nearestDescNode) && nearestDesc.parent\n            && !(nearestDescNode.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {\n            let pos = nearestDesc.posBefore;\n            selection = new NodeSelection(head == pos ? $head : doc.resolve(pos));\n        }\n    }\n    else {\n        let anchor = view.docView.posFromDOM(domSel.anchorNode, domSel.anchorOffset, 1);\n        if (anchor < 0)\n            return null;\n        $anchor = doc.resolve(anchor);\n    }\n    if (!selection) {\n        let bias = origin == \"pointer\" || (view.state.selection.head < $head.pos && !inWidget) ? 1 : -1;\n        selection = selectionBetween(view, $anchor, $head, bias);\n    }\n    return selection;\n}\nfunction editorOwnsSelection(view) {\n    return view.editable ? view.hasFocus() :\n        hasSelection(view) && document.activeElement && document.activeElement.contains(view.dom);\n}\nfunction selectionToDOM(view, force = false) {\n    let sel = view.state.selection;\n    syncNodeSelection(view, sel);\n    if (!editorOwnsSelection(view))\n        return;\n    // The delayed drag selection causes issues with Cell Selections\n    // in Safari. And the drag selection delay is to workarond issues\n    // which only present in Chrome.\n    if (!force && view.input.mouseDown && view.input.mouseDown.allowDefault && chrome) {\n        let domSel = view.domSelectionRange(), curSel = view.domObserver.currentSelection;\n        if (domSel.anchorNode && curSel.anchorNode &&\n            isEquivalentPosition(domSel.anchorNode, domSel.anchorOffset, curSel.anchorNode, curSel.anchorOffset)) {\n            view.input.mouseDown.delayedSelectionSync = true;\n            view.domObserver.setCurSelection();\n            return;\n        }\n    }\n    view.domObserver.disconnectSelection();\n    if (view.cursorWrapper) {\n        selectCursorWrapper(view);\n    }\n    else {\n        let { anchor, head } = sel, resetEditableFrom, resetEditableTo;\n        if (brokenSelectBetweenUneditable && !(sel instanceof TextSelection)) {\n            if (!sel.$from.parent.inlineContent)\n                resetEditableFrom = temporarilyEditableNear(view, sel.from);\n            if (!sel.empty && !sel.$from.parent.inlineContent)\n                resetEditableTo = temporarilyEditableNear(view, sel.to);\n        }\n        view.docView.setSelection(anchor, head, view.root, force);\n        if (brokenSelectBetweenUneditable) {\n            if (resetEditableFrom)\n                resetEditable(resetEditableFrom);\n            if (resetEditableTo)\n                resetEditable(resetEditableTo);\n        }\n        if (sel.visible) {\n            view.dom.classList.remove(\"ProseMirror-hideselection\");\n        }\n        else {\n            view.dom.classList.add(\"ProseMirror-hideselection\");\n            if (\"onselectionchange\" in document)\n                removeClassOnSelectionChange(view);\n        }\n    }\n    view.domObserver.setCurSelection();\n    view.domObserver.connectSelection();\n}\n// Kludge to work around Webkit not allowing a selection to start/end\n// between non-editable block nodes. We briefly make something\n// editable, set the selection, then set it uneditable again.\nconst brokenSelectBetweenUneditable = safari || chrome && chrome_version < 63;\nfunction temporarilyEditableNear(view, pos) {\n    let { node, offset } = view.docView.domFromPos(pos, 0);\n    let after = offset < node.childNodes.length ? node.childNodes[offset] : null;\n    let before = offset ? node.childNodes[offset - 1] : null;\n    if (safari && after && after.contentEditable == \"false\")\n        return setEditable(after);\n    if ((!after || after.contentEditable == \"false\") &&\n        (!before || before.contentEditable == \"false\")) {\n        if (after)\n            return setEditable(after);\n        else if (before)\n            return setEditable(before);\n    }\n}\nfunction setEditable(element) {\n    element.contentEditable = \"true\";\n    if (safari && element.draggable) {\n        element.draggable = false;\n        element.wasDraggable = true;\n    }\n    return element;\n}\nfunction resetEditable(element) {\n    element.contentEditable = \"false\";\n    if (element.wasDraggable) {\n        element.draggable = true;\n        element.wasDraggable = null;\n    }\n}\nfunction removeClassOnSelectionChange(view) {\n    let doc = view.dom.ownerDocument;\n    doc.removeEventListener(\"selectionchange\", view.input.hideSelectionGuard);\n    let domSel = view.domSelectionRange();\n    let node = domSel.anchorNode, offset = domSel.anchorOffset;\n    doc.addEventListener(\"selectionchange\", view.input.hideSelectionGuard = () => {\n        if (domSel.anchorNode != node || domSel.anchorOffset != offset) {\n            doc.removeEventListener(\"selectionchange\", view.input.hideSelectionGuard);\n            setTimeout(() => {\n                if (!editorOwnsSelection(view) || view.state.selection.visible)\n                    view.dom.classList.remove(\"ProseMirror-hideselection\");\n            }, 20);\n        }\n    });\n}\nfunction selectCursorWrapper(view) {\n    let domSel = view.domSelection(), range = document.createRange();\n    let node = view.cursorWrapper.dom, img = node.nodeName == \"IMG\";\n    if (img)\n        range.setEnd(node.parentNode, domIndex(node) + 1);\n    else\n        range.setEnd(node, 0);\n    range.collapse(false);\n    domSel.removeAllRanges();\n    domSel.addRange(range);\n    // Kludge to kill 'control selection' in IE11 when selecting an\n    // invisible cursor wrapper, since that would result in those weird\n    // resize handles and a selection that considers the absolutely\n    // positioned wrapper, rather than the root editable node, the\n    // focused element.\n    if (!img && !view.state.selection.visible && ie && ie_version <= 11) {\n        node.disabled = true;\n        node.disabled = false;\n    }\n}\nfunction syncNodeSelection(view, sel) {\n    if (sel instanceof NodeSelection) {\n        let desc = view.docView.descAt(sel.from);\n        if (desc != view.lastSelectedViewDesc) {\n            clearNodeSelection(view);\n            if (desc)\n                desc.selectNode();\n            view.lastSelectedViewDesc = desc;\n        }\n    }\n    else {\n        clearNodeSelection(view);\n    }\n}\n// Clear all DOM statefulness of the last node selection.\nfunction clearNodeSelection(view) {\n    if (view.lastSelectedViewDesc) {\n        if (view.lastSelectedViewDesc.parent)\n            view.lastSelectedViewDesc.deselectNode();\n        view.lastSelectedViewDesc = undefined;\n    }\n}\nfunction selectionBetween(view, $anchor, $head, bias) {\n    return view.someProp(\"createSelectionBetween\", f => f(view, $anchor, $head))\n        || TextSelection.between($anchor, $head, bias);\n}\nfunction hasFocusAndSelection(view) {\n    if (view.editable && !view.hasFocus())\n        return false;\n    return hasSelection(view);\n}\nfunction hasSelection(view) {\n    let sel = view.domSelectionRange();\n    if (!sel.anchorNode)\n        return false;\n    try {\n        // Firefox will raise 'permission denied' errors when accessing\n        // properties of `sel.anchorNode` when it's in a generated CSS\n        // element.\n        return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) &&\n            (view.editable || view.dom.contains(sel.focusNode.nodeType == 3 ? sel.focusNode.parentNode : sel.focusNode));\n    }\n    catch (_) {\n        return false;\n    }\n}\nfunction anchorInRightPlace(view) {\n    let anchorDOM = view.docView.domFromPos(view.state.selection.anchor, 0);\n    let domSel = view.domSelectionRange();\n    return isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset);\n}\n\nfunction moveSelectionBlock(state, dir) {\n    let { $anchor, $head } = state.selection;\n    let $side = dir > 0 ? $anchor.max($head) : $anchor.min($head);\n    let $start = !$side.parent.inlineContent ? $side : $side.depth ? state.doc.resolve(dir > 0 ? $side.after() : $side.before()) : null;\n    return $start && Selection.findFrom($start, dir);\n}\nfunction apply(view, sel) {\n    view.dispatch(view.state.tr.setSelection(sel).scrollIntoView());\n    return true;\n}\nfunction selectHorizontally(view, dir, mods) {\n    let sel = view.state.selection;\n    if (sel instanceof TextSelection) {\n        if (mods.indexOf(\"s\") > -1) {\n            let { $head } = sel, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter;\n            if (!node || node.isText || !node.isLeaf)\n                return false;\n            let $newHead = view.state.doc.resolve($head.pos + node.nodeSize * (dir < 0 ? -1 : 1));\n            return apply(view, new TextSelection(sel.$anchor, $newHead));\n        }\n        else if (!sel.empty) {\n            return false;\n        }\n        else if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\")) {\n            let next = moveSelectionBlock(view.state, dir);\n            if (next && (next instanceof NodeSelection))\n                return apply(view, next);\n            return false;\n        }\n        else if (!(mac && mods.indexOf(\"m\") > -1)) {\n            let $head = sel.$head, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter, desc;\n            if (!node || node.isText)\n                return false;\n            let nodePos = dir < 0 ? $head.pos - node.nodeSize : $head.pos;\n            if (!(node.isAtom || (desc = view.docView.descAt(nodePos)) && !desc.contentDOM))\n                return false;\n            if (NodeSelection.isSelectable(node)) {\n                return apply(view, new NodeSelection(dir < 0 ? view.state.doc.resolve($head.pos - node.nodeSize) : $head));\n            }\n            else if (webkit) {\n                // Chrome and Safari will introduce extra pointless cursor\n                // positions around inline uneditable nodes, so we have to\n                // take over and move the cursor past them (#937)\n                return apply(view, new TextSelection(view.state.doc.resolve(dir < 0 ? nodePos : nodePos + node.nodeSize)));\n            }\n            else {\n                return false;\n            }\n        }\n    }\n    else if (sel instanceof NodeSelection && sel.node.isInline) {\n        return apply(view, new TextSelection(dir > 0 ? sel.$to : sel.$from));\n    }\n    else {\n        let next = moveSelectionBlock(view.state, dir);\n        if (next)\n            return apply(view, next);\n        return false;\n    }\n}\nfunction nodeLen(node) {\n    return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;\n}\nfunction isIgnorable(dom, dir) {\n    let desc = dom.pmViewDesc;\n    return desc && desc.size == 0 && (dir < 0 || dom.nextSibling || dom.nodeName != \"BR\");\n}\nfunction skipIgnoredNodes(view, dir) {\n    return dir < 0 ? skipIgnoredNodesBefore(view) : skipIgnoredNodesAfter(view);\n}\n// Make sure the cursor isn't directly after one or more ignored\n// nodes, which will confuse the browser's cursor motion logic.\nfunction skipIgnoredNodesBefore(view) {\n    let sel = view.domSelectionRange();\n    let node = sel.focusNode, offset = sel.focusOffset;\n    if (!node)\n        return;\n    let moveNode, moveOffset, force = false;\n    // Gecko will do odd things when the selection is directly in front\n    // of a non-editable node, so in that case, move it into the next\n    // node if possible. Issue prosemirror/prosemirror#832.\n    if (gecko && node.nodeType == 1 && offset < nodeLen(node) && isIgnorable(node.childNodes[offset], -1))\n        force = true;\n    for (;;) {\n        if (offset > 0) {\n            if (node.nodeType != 1) {\n                break;\n            }\n            else {\n                let before = node.childNodes[offset - 1];\n                if (isIgnorable(before, -1)) {\n                    moveNode = node;\n                    moveOffset = --offset;\n                }\n                else if (before.nodeType == 3) {\n                    node = before;\n                    offset = node.nodeValue.length;\n                }\n                else\n                    break;\n            }\n        }\n        else if (isBlockNode(node)) {\n            break;\n        }\n        else {\n            let prev = node.previousSibling;\n            while (prev && isIgnorable(prev, -1)) {\n                moveNode = node.parentNode;\n                moveOffset = domIndex(prev);\n                prev = prev.previousSibling;\n            }\n            if (!prev) {\n                node = node.parentNode;\n                if (node == view.dom)\n                    break;\n                offset = 0;\n            }\n            else {\n                node = prev;\n                offset = nodeLen(node);\n            }\n        }\n    }\n    if (force)\n        setSelFocus(view, node, offset);\n    else if (moveNode)\n        setSelFocus(view, moveNode, moveOffset);\n}\n// Make sure the cursor isn't directly before one or more ignored\n// nodes.\nfunction skipIgnoredNodesAfter(view) {\n    let sel = view.domSelectionRange();\n    let node = sel.focusNode, offset = sel.focusOffset;\n    if (!node)\n        return;\n    let len = nodeLen(node);\n    let moveNode, moveOffset;\n    for (;;) {\n        if (offset < len) {\n            if (node.nodeType != 1)\n                break;\n            let after = node.childNodes[offset];\n            if (isIgnorable(after, 1)) {\n                moveNode = node;\n                moveOffset = ++offset;\n            }\n            else\n                break;\n        }\n        else if (isBlockNode(node)) {\n            break;\n        }\n        else {\n            let next = node.nextSibling;\n            while (next && isIgnorable(next, 1)) {\n                moveNode = next.parentNode;\n                moveOffset = domIndex(next) + 1;\n                next = next.nextSibling;\n            }\n            if (!next) {\n                node = node.parentNode;\n                if (node == view.dom)\n                    break;\n                offset = len = 0;\n            }\n            else {\n                node = next;\n                offset = 0;\n                len = nodeLen(node);\n            }\n        }\n    }\n    if (moveNode)\n        setSelFocus(view, moveNode, moveOffset);\n}\nfunction isBlockNode(dom) {\n    let desc = dom.pmViewDesc;\n    return desc && desc.node && desc.node.isBlock;\n}\nfunction textNodeAfter(node, offset) {\n    while (node && offset == node.childNodes.length && !hasBlockDesc(node)) {\n        offset = domIndex(node) + 1;\n        node = node.parentNode;\n    }\n    while (node && offset < node.childNodes.length) {\n        let next = node.childNodes[offset];\n        if (next.nodeType == 3)\n            return next;\n        if (next.nodeType == 1 && next.contentEditable == \"false\")\n            break;\n        node = next;\n        offset = 0;\n    }\n}\nfunction textNodeBefore(node, offset) {\n    while (node && !offset && !hasBlockDesc(node)) {\n        offset = domIndex(node);\n        node = node.parentNode;\n    }\n    while (node && offset) {\n        let next = node.childNodes[offset - 1];\n        if (next.nodeType == 3)\n            return next;\n        if (next.nodeType == 1 && next.contentEditable == \"false\")\n            break;\n        node = next;\n        offset = node.childNodes.length;\n    }\n}\nfunction setSelFocus(view, node, offset) {\n    if (node.nodeType != 3) {\n        let before, after;\n        if (after = textNodeAfter(node, offset)) {\n            node = after;\n            offset = 0;\n        }\n        else if (before = textNodeBefore(node, offset)) {\n            node = before;\n            offset = before.nodeValue.length;\n        }\n    }\n    let sel = view.domSelection();\n    if (selectionCollapsed(sel)) {\n        let range = document.createRange();\n        range.setEnd(node, offset);\n        range.setStart(node, offset);\n        sel.removeAllRanges();\n        sel.addRange(range);\n    }\n    else if (sel.extend) {\n        sel.extend(node, offset);\n    }\n    view.domObserver.setCurSelection();\n    let { state } = view;\n    // If no state update ends up happening, reset the selection.\n    setTimeout(() => {\n        if (view.state == state)\n            selectionToDOM(view);\n    }, 50);\n}\nfunction findDirection(view, pos) {\n    let $pos = view.state.doc.resolve(pos);\n    if (!(chrome || windows) && $pos.parent.inlineContent) {\n        let coords = view.coordsAtPos(pos);\n        if (pos > $pos.start()) {\n            let before = view.coordsAtPos(pos - 1);\n            let mid = (before.top + before.bottom) / 2;\n            if (mid > coords.top && mid < coords.bottom && Math.abs(before.left - coords.left) > 1)\n                return before.left < coords.left ? \"ltr\" : \"rtl\";\n        }\n        if (pos < $pos.end()) {\n            let after = view.coordsAtPos(pos + 1);\n            let mid = (after.top + after.bottom) / 2;\n            if (mid > coords.top && mid < coords.bottom && Math.abs(after.left - coords.left) > 1)\n                return after.left > coords.left ? \"ltr\" : \"rtl\";\n        }\n    }\n    let computed = getComputedStyle(view.dom).direction;\n    return computed == \"rtl\" ? \"rtl\" : \"ltr\";\n}\n// Check whether vertical selection motion would involve node\n// selections. If so, apply it (if not, the result is left to the\n// browser)\nfunction selectVertically(view, dir, mods) {\n    let sel = view.state.selection;\n    if (sel instanceof TextSelection && !sel.empty || mods.indexOf(\"s\") > -1)\n        return false;\n    if (mac && mods.indexOf(\"m\") > -1)\n        return false;\n    let { $from, $to } = sel;\n    if (!$from.parent.inlineContent || view.endOfTextblock(dir < 0 ? \"up\" : \"down\")) {\n        let next = moveSelectionBlock(view.state, dir);\n        if (next && (next instanceof NodeSelection))\n            return apply(view, next);\n    }\n    if (!$from.parent.inlineContent) {\n        let side = dir < 0 ? $from : $to;\n        let beyond = sel instanceof AllSelection ? Selection.near(side, dir) : Selection.findFrom(side, dir);\n        return beyond ? apply(view, beyond) : false;\n    }\n    return false;\n}\nfunction stopNativeHorizontalDelete(view, dir) {\n    if (!(view.state.selection instanceof TextSelection))\n        return true;\n    let { $head, $anchor, empty } = view.state.selection;\n    if (!$head.sameParent($anchor))\n        return true;\n    if (!empty)\n        return false;\n    if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\"))\n        return true;\n    let nextNode = !$head.textOffset && (dir < 0 ? $head.nodeBefore : $head.nodeAfter);\n    if (nextNode && !nextNode.isText) {\n        let tr = view.state.tr;\n        if (dir < 0)\n            tr.delete($head.pos - nextNode.nodeSize, $head.pos);\n        else\n            tr.delete($head.pos, $head.pos + nextNode.nodeSize);\n        view.dispatch(tr);\n        return true;\n    }\n    return false;\n}\nfunction switchEditable(view, node, state) {\n    view.domObserver.stop();\n    node.contentEditable = state;\n    view.domObserver.start();\n}\n// Issue #867 / #1090 / https://bugs.chromium.org/p/chromium/issues/detail?id=903821\n// In which Safari (and at some point in the past, Chrome) does really\n// wrong things when the down arrow is pressed when the cursor is\n// directly at the start of a textblock and has an uneditable node\n// after it\nfunction safariDownArrowBug(view) {\n    if (!safari || view.state.selection.$head.parentOffset > 0)\n        return false;\n    let { focusNode, focusOffset } = view.domSelectionRange();\n    if (focusNode && focusNode.nodeType == 1 && focusOffset == 0 &&\n        focusNode.firstChild && focusNode.firstChild.contentEditable == \"false\") {\n        let child = focusNode.firstChild;\n        switchEditable(view, child, \"true\");\n        setTimeout(() => switchEditable(view, child, \"false\"), 20);\n    }\n    return false;\n}\n// A backdrop key mapping used to make sure we always suppress keys\n// that have a dangerous default effect, even if the commands they are\n// bound to return false, and to make sure that cursor-motion keys\n// find a cursor (as opposed to a node selection) when pressed. For\n// cursor-motion keys, the code in the handlers also takes care of\n// block selections.\nfunction getMods(event) {\n    let result = \"\";\n    if (event.ctrlKey)\n        result += \"c\";\n    if (event.metaKey)\n        result += \"m\";\n    if (event.altKey)\n        result += \"a\";\n    if (event.shiftKey)\n        result += \"s\";\n    return result;\n}\nfunction captureKeyDown(view, event) {\n    let code = event.keyCode, mods = getMods(event);\n    if (code == 8 || (mac && code == 72 && mods == \"c\")) { // Backspace, Ctrl-h on Mac\n        return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodes(view, -1);\n    }\n    else if ((code == 46 && !event.shiftKey) || (mac && code == 68 && mods == \"c\")) { // Delete, Ctrl-d on Mac\n        return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodes(view, 1);\n    }\n    else if (code == 13 || code == 27) { // Enter, Esc\n        return true;\n    }\n    else if (code == 37 || (mac && code == 66 && mods == \"c\")) { // Left arrow, Ctrl-b on Mac\n        let dir = code == 37 ? (findDirection(view, view.state.selection.from) == \"ltr\" ? -1 : 1) : -1;\n        return selectHorizontally(view, dir, mods) || skipIgnoredNodes(view, dir);\n    }\n    else if (code == 39 || (mac && code == 70 && mods == \"c\")) { // Right arrow, Ctrl-f on Mac\n        let dir = code == 39 ? (findDirection(view, view.state.selection.from) == \"ltr\" ? 1 : -1) : 1;\n        return selectHorizontally(view, dir, mods) || skipIgnoredNodes(view, dir);\n    }\n    else if (code == 38 || (mac && code == 80 && mods == \"c\")) { // Up arrow, Ctrl-p on Mac\n        return selectVertically(view, -1, mods) || skipIgnoredNodes(view, -1);\n    }\n    else if (code == 40 || (mac && code == 78 && mods == \"c\")) { // Down arrow, Ctrl-n on Mac\n        return safariDownArrowBug(view) || selectVertically(view, 1, mods) || skipIgnoredNodes(view, 1);\n    }\n    else if (mods == (mac ? \"m\" : \"c\") &&\n        (code == 66 || code == 73 || code == 89 || code == 90)) { // Mod-[biyz]\n        return true;\n    }\n    return false;\n}\n\nfunction serializeForClipboard(view, slice) {\n    view.someProp(\"transformCopied\", f => { slice = f(slice, view); });\n    let context = [], { content, openStart, openEnd } = slice;\n    while (openStart > 1 && openEnd > 1 && content.childCount == 1 && content.firstChild.childCount == 1) {\n        openStart--;\n        openEnd--;\n        let node = content.firstChild;\n        context.push(node.type.name, node.attrs != node.type.defaultAttrs ? node.attrs : null);\n        content = node.content;\n    }\n    let serializer = view.someProp(\"clipboardSerializer\") || DOMSerializer.fromSchema(view.state.schema);\n    let doc = detachedDoc(), wrap = doc.createElement(\"div\");\n    wrap.appendChild(serializer.serializeFragment(content, { document: doc }));\n    let firstChild = wrap.firstChild, needsWrap, wrappers = 0;\n    while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) {\n        for (let i = needsWrap.length - 1; i >= 0; i--) {\n            let wrapper = doc.createElement(needsWrap[i]);\n            while (wrap.firstChild)\n                wrapper.appendChild(wrap.firstChild);\n            wrap.appendChild(wrapper);\n            wrappers++;\n        }\n        firstChild = wrap.firstChild;\n    }\n    if (firstChild && firstChild.nodeType == 1)\n        firstChild.setAttribute(\"data-pm-slice\", `${openStart} ${openEnd}${wrappers ? ` -${wrappers}` : \"\"} ${JSON.stringify(context)}`);\n    let text = view.someProp(\"clipboardTextSerializer\", f => f(slice, view)) ||\n        slice.content.textBetween(0, slice.content.size, \"\\n\\n\");\n    return { dom: wrap, text };\n}\n// Read a slice of content from the clipboard (or drop data).\nfunction parseFromClipboard(view, text, html, plainText, $context) {\n    let inCode = $context.parent.type.spec.code;\n    let dom, slice;\n    if (!html && !text)\n        return null;\n    let asText = text && (plainText || inCode || !html);\n    if (asText) {\n        view.someProp(\"transformPastedText\", f => { text = f(text, inCode || plainText, view); });\n        if (inCode)\n            return text ? new Slice(Fragment.from(view.state.schema.text(text.replace(/\\r\\n?/g, \"\\n\"))), 0, 0) : Slice.empty;\n        let parsed = view.someProp(\"clipboardTextParser\", f => f(text, $context, plainText, view));\n        if (parsed) {\n            slice = parsed;\n        }\n        else {\n            let marks = $context.marks();\n            let { schema } = view.state, serializer = DOMSerializer.fromSchema(schema);\n            dom = document.createElement(\"div\");\n            text.split(/(?:\\r\\n?|\\n)+/).forEach(block => {\n                let p = dom.appendChild(document.createElement(\"p\"));\n                if (block)\n                    p.appendChild(serializer.serializeNode(schema.text(block, marks)));\n            });\n        }\n    }\n    else {\n        view.someProp(\"transformPastedHTML\", f => { html = f(html, view); });\n        dom = readHTML(html);\n        if (webkit)\n            restoreReplacedSpaces(dom);\n    }\n    let contextNode = dom && dom.querySelector(\"[data-pm-slice]\");\n    let sliceData = contextNode && /^(\\d+) (\\d+)(?: -(\\d+))? (.*)/.exec(contextNode.getAttribute(\"data-pm-slice\") || \"\");\n    if (sliceData && sliceData[3])\n        for (let i = +sliceData[3]; i > 0; i--) {\n            let child = dom.firstChild;\n            while (child && child.nodeType != 1)\n                child = child.nextSibling;\n            if (!child)\n                break;\n            dom = child;\n        }\n    if (!slice) {\n        let parser = view.someProp(\"clipboardParser\") || view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n        slice = parser.parseSlice(dom, {\n            preserveWhitespace: !!(asText || sliceData),\n            context: $context,\n            ruleFromNode(dom) {\n                if (dom.nodeName == \"BR\" && !dom.nextSibling &&\n                    dom.parentNode && !inlineParents.test(dom.parentNode.nodeName))\n                    return { ignore: true };\n                return null;\n            }\n        });\n    }\n    if (sliceData) {\n        slice = addContext(closeSlice(slice, +sliceData[1], +sliceData[2]), sliceData[4]);\n    }\n    else { // HTML wasn't created by ProseMirror. Make sure top-level siblings are coherent\n        slice = Slice.maxOpen(normalizeSiblings(slice.content, $context), true);\n        if (slice.openStart || slice.openEnd) {\n            let openStart = 0, openEnd = 0;\n            for (let node = slice.content.firstChild; openStart < slice.openStart && !node.type.spec.isolating; openStart++, node = node.firstChild) { }\n            for (let node = slice.content.lastChild; openEnd < slice.openEnd && !node.type.spec.isolating; openEnd++, node = node.lastChild) { }\n            slice = closeSlice(slice, openStart, openEnd);\n        }\n    }\n    view.someProp(\"transformPasted\", f => { slice = f(slice, view); });\n    return slice;\n}\nconst inlineParents = /^(a|abbr|acronym|b|cite|code|del|em|i|ins|kbd|label|output|q|ruby|s|samp|span|strong|sub|sup|time|u|tt|var)$/i;\n// Takes a slice parsed with parseSlice, which means there hasn't been\n// any content-expression checking done on the top nodes, tries to\n// find a parent node in the current context that might fit the nodes,\n// and if successful, rebuilds the slice so that it fits into that parent.\n//\n// This addresses the problem that Transform.replace expects a\n// coherent slice, and will fail to place a set of siblings that don't\n// fit anywhere in the schema.\nfunction normalizeSiblings(fragment, $context) {\n    if (fragment.childCount < 2)\n        return fragment;\n    for (let d = $context.depth; d >= 0; d--) {\n        let parent = $context.node(d);\n        let match = parent.contentMatchAt($context.index(d));\n        let lastWrap, result = [];\n        fragment.forEach(node => {\n            if (!result)\n                return;\n            let wrap = match.findWrapping(node.type), inLast;\n            if (!wrap)\n                return result = null;\n            if (inLast = result.length && lastWrap.length && addToSibling(wrap, lastWrap, node, result[result.length - 1], 0)) {\n                result[result.length - 1] = inLast;\n            }\n            else {\n                if (result.length)\n                    result[result.length - 1] = closeRight(result[result.length - 1], lastWrap.length);\n                let wrapped = withWrappers(node, wrap);\n                result.push(wrapped);\n                match = match.matchType(wrapped.type);\n                lastWrap = wrap;\n            }\n        });\n        if (result)\n            return Fragment.from(result);\n    }\n    return fragment;\n}\nfunction withWrappers(node, wrap, from = 0) {\n    for (let i = wrap.length - 1; i >= from; i--)\n        node = wrap[i].create(null, Fragment.from(node));\n    return node;\n}\n// Used to group adjacent nodes wrapped in similar parents by\n// normalizeSiblings into the same parent node\nfunction addToSibling(wrap, lastWrap, node, sibling, depth) {\n    if (depth < wrap.length && depth < lastWrap.length && wrap[depth] == lastWrap[depth]) {\n        let inner = addToSibling(wrap, lastWrap, node, sibling.lastChild, depth + 1);\n        if (inner)\n            return sibling.copy(sibling.content.replaceChild(sibling.childCount - 1, inner));\n        let match = sibling.contentMatchAt(sibling.childCount);\n        if (match.matchType(depth == wrap.length - 1 ? node.type : wrap[depth + 1]))\n            return sibling.copy(sibling.content.append(Fragment.from(withWrappers(node, wrap, depth + 1))));\n    }\n}\nfunction closeRight(node, depth) {\n    if (depth == 0)\n        return node;\n    let fragment = node.content.replaceChild(node.childCount - 1, closeRight(node.lastChild, depth - 1));\n    let fill = node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true);\n    return node.copy(fragment.append(fill));\n}\nfunction closeRange(fragment, side, from, to, depth, openEnd) {\n    let node = side < 0 ? fragment.firstChild : fragment.lastChild, inner = node.content;\n    if (fragment.childCount > 1)\n        openEnd = 0;\n    if (depth < to - 1)\n        inner = closeRange(inner, side, from, to, depth + 1, openEnd);\n    if (depth >= from)\n        inner = side < 0 ? node.contentMatchAt(0).fillBefore(inner, openEnd <= depth).append(inner)\n            : inner.append(node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true));\n    return fragment.replaceChild(side < 0 ? 0 : fragment.childCount - 1, node.copy(inner));\n}\nfunction closeSlice(slice, openStart, openEnd) {\n    if (openStart < slice.openStart)\n        slice = new Slice(closeRange(slice.content, -1, openStart, slice.openStart, 0, slice.openEnd), openStart, slice.openEnd);\n    if (openEnd < slice.openEnd)\n        slice = new Slice(closeRange(slice.content, 1, openEnd, slice.openEnd, 0, 0), slice.openStart, openEnd);\n    return slice;\n}\n// Trick from jQuery -- some elements must be wrapped in other\n// elements for innerHTML to work. I.e. if you do `div.innerHTML =\n// \"<td>..</td>\"` the table cells are ignored.\nconst wrapMap = {\n    thead: [\"table\"],\n    tbody: [\"table\"],\n    tfoot: [\"table\"],\n    caption: [\"table\"],\n    colgroup: [\"table\"],\n    col: [\"table\", \"colgroup\"],\n    tr: [\"table\", \"tbody\"],\n    td: [\"table\", \"tbody\", \"tr\"],\n    th: [\"table\", \"tbody\", \"tr\"]\n};\nlet _detachedDoc = null;\nfunction detachedDoc() {\n    return _detachedDoc || (_detachedDoc = document.implementation.createHTMLDocument(\"title\"));\n}\nfunction readHTML(html) {\n    let metas = /^(\\s*<meta [^>]*>)*/.exec(html);\n    if (metas)\n        html = html.slice(metas[0].length);\n    let elt = detachedDoc().createElement(\"div\");\n    let firstTag = /<([a-z][^>\\s]+)/i.exec(html), wrap;\n    if (wrap = firstTag && wrapMap[firstTag[1].toLowerCase()])\n        html = wrap.map(n => \"<\" + n + \">\").join(\"\") + html + wrap.map(n => \"</\" + n + \">\").reverse().join(\"\");\n    elt.innerHTML = html;\n    if (wrap)\n        for (let i = 0; i < wrap.length; i++)\n            elt = elt.querySelector(wrap[i]) || elt;\n    return elt;\n}\n// Webkit browsers do some hard-to-predict replacement of regular\n// spaces with non-breaking spaces when putting content on the\n// clipboard. This tries to convert such non-breaking spaces (which\n// will be wrapped in a plain span on Chrome, a span with class\n// Apple-converted-space on Safari) back to regular spaces.\nfunction restoreReplacedSpaces(dom) {\n    let nodes = dom.querySelectorAll(chrome ? \"span:not([class]):not([style])\" : \"span.Apple-converted-space\");\n    for (let i = 0; i < nodes.length; i++) {\n        let node = nodes[i];\n        if (node.childNodes.length == 1 && node.textContent == \"\\u00a0\" && node.parentNode)\n            node.parentNode.replaceChild(dom.ownerDocument.createTextNode(\" \"), node);\n    }\n}\nfunction addContext(slice, context) {\n    if (!slice.size)\n        return slice;\n    let schema = slice.content.firstChild.type.schema, array;\n    try {\n        array = JSON.parse(context);\n    }\n    catch (e) {\n        return slice;\n    }\n    let { content, openStart, openEnd } = slice;\n    for (let i = array.length - 2; i >= 0; i -= 2) {\n        let type = schema.nodes[array[i]];\n        if (!type || type.hasRequiredAttrs())\n            break;\n        content = Fragment.from(type.create(array[i + 1], content));\n        openStart++;\n        openEnd++;\n    }\n    return new Slice(content, openStart, openEnd);\n}\n\n// A collection of DOM events that occur within the editor, and callback functions\n// to invoke when the event fires.\nconst handlers = {};\nconst editHandlers = {};\nconst passiveHandlers = { touchstart: true, touchmove: true };\nclass InputState {\n    constructor() {\n        this.shiftKey = false;\n        this.mouseDown = null;\n        this.lastKeyCode = null;\n        this.lastKeyCodeTime = 0;\n        this.lastClick = { time: 0, x: 0, y: 0, type: \"\" };\n        this.lastSelectionOrigin = null;\n        this.lastSelectionTime = 0;\n        this.lastIOSEnter = 0;\n        this.lastIOSEnterFallbackTimeout = -1;\n        this.lastFocus = 0;\n        this.lastTouch = 0;\n        this.lastAndroidDelete = 0;\n        this.composing = false;\n        this.compositionNode = null;\n        this.composingTimeout = -1;\n        this.compositionNodes = [];\n        this.compositionEndedAt = -2e8;\n        this.compositionID = 1;\n        // Set to a composition ID when there are pending changes at compositionend\n        this.compositionPendingChanges = 0;\n        this.domChangeCount = 0;\n        this.eventHandlers = Object.create(null);\n        this.hideSelectionGuard = null;\n    }\n}\nfunction initInput(view) {\n    for (let event in handlers) {\n        let handler = handlers[event];\n        view.dom.addEventListener(event, view.input.eventHandlers[event] = (event) => {\n            if (eventBelongsToView(view, event) && !runCustomHandler(view, event) &&\n                (view.editable || !(event.type in editHandlers)))\n                handler(view, event);\n        }, passiveHandlers[event] ? { passive: true } : undefined);\n    }\n    // On Safari, for reasons beyond my understanding, adding an input\n    // event handler makes an issue where the composition vanishes when\n    // you press enter go away.\n    if (safari)\n        view.dom.addEventListener(\"input\", () => null);\n    ensureListeners(view);\n}\nfunction setSelectionOrigin(view, origin) {\n    view.input.lastSelectionOrigin = origin;\n    view.input.lastSelectionTime = Date.now();\n}\nfunction destroyInput(view) {\n    view.domObserver.stop();\n    for (let type in view.input.eventHandlers)\n        view.dom.removeEventListener(type, view.input.eventHandlers[type]);\n    clearTimeout(view.input.composingTimeout);\n    clearTimeout(view.input.lastIOSEnterFallbackTimeout);\n}\nfunction ensureListeners(view) {\n    view.someProp(\"handleDOMEvents\", currentHandlers => {\n        for (let type in currentHandlers)\n            if (!view.input.eventHandlers[type])\n                view.dom.addEventListener(type, view.input.eventHandlers[type] = event => runCustomHandler(view, event));\n    });\n}\nfunction runCustomHandler(view, event) {\n    return view.someProp(\"handleDOMEvents\", handlers => {\n        let handler = handlers[event.type];\n        return handler ? handler(view, event) || event.defaultPrevented : false;\n    });\n}\nfunction eventBelongsToView(view, event) {\n    if (!event.bubbles)\n        return true;\n    if (event.defaultPrevented)\n        return false;\n    for (let node = event.target; node != view.dom; node = node.parentNode)\n        if (!node || node.nodeType == 11 ||\n            (node.pmViewDesc && node.pmViewDesc.stopEvent(event)))\n            return false;\n    return true;\n}\nfunction dispatchEvent(view, event) {\n    if (!runCustomHandler(view, event) && handlers[event.type] &&\n        (view.editable || !(event.type in editHandlers)))\n        handlers[event.type](view, event);\n}\neditHandlers.keydown = (view, _event) => {\n    let event = _event;\n    view.input.shiftKey = event.keyCode == 16 || event.shiftKey;\n    if (inOrNearComposition(view, event))\n        return;\n    view.input.lastKeyCode = event.keyCode;\n    view.input.lastKeyCodeTime = Date.now();\n    // Suppress enter key events on Chrome Android, because those tend\n    // to be part of a confused sequence of composition events fired,\n    // and handling them eagerly tends to corrupt the input.\n    if (android && chrome && event.keyCode == 13)\n        return;\n    if (event.keyCode != 229)\n        view.domObserver.forceFlush();\n    // On iOS, if we preventDefault enter key presses, the virtual\n    // keyboard gets confused. So the hack here is to set a flag that\n    // makes the DOM change code recognize that what just happens should\n    // be replaced by whatever the Enter key handlers do.\n    if (ios && event.keyCode == 13 && !event.ctrlKey && !event.altKey && !event.metaKey) {\n        let now = Date.now();\n        view.input.lastIOSEnter = now;\n        view.input.lastIOSEnterFallbackTimeout = setTimeout(() => {\n            if (view.input.lastIOSEnter == now) {\n                view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")));\n                view.input.lastIOSEnter = 0;\n            }\n        }, 200);\n    }\n    else if (view.someProp(\"handleKeyDown\", f => f(view, event)) || captureKeyDown(view, event)) {\n        event.preventDefault();\n    }\n    else {\n        setSelectionOrigin(view, \"key\");\n    }\n};\neditHandlers.keyup = (view, event) => {\n    if (event.keyCode == 16)\n        view.input.shiftKey = false;\n};\neditHandlers.keypress = (view, _event) => {\n    let event = _event;\n    if (inOrNearComposition(view, event) || !event.charCode ||\n        event.ctrlKey && !event.altKey || mac && event.metaKey)\n        return;\n    if (view.someProp(\"handleKeyPress\", f => f(view, event))) {\n        event.preventDefault();\n        return;\n    }\n    let sel = view.state.selection;\n    if (!(sel instanceof TextSelection) || !sel.$from.sameParent(sel.$to)) {\n        let text = String.fromCharCode(event.charCode);\n        if (!/[\\r\\n]/.test(text) && !view.someProp(\"handleTextInput\", f => f(view, sel.$from.pos, sel.$to.pos, text)))\n            view.dispatch(view.state.tr.insertText(text).scrollIntoView());\n        event.preventDefault();\n    }\n};\nfunction eventCoords(event) { return { left: event.clientX, top: event.clientY }; }\nfunction isNear(event, click) {\n    let dx = click.x - event.clientX, dy = click.y - event.clientY;\n    return dx * dx + dy * dy < 100;\n}\nfunction runHandlerOnContext(view, propName, pos, inside, event) {\n    if (inside == -1)\n        return false;\n    let $pos = view.state.doc.resolve(inside);\n    for (let i = $pos.depth + 1; i > 0; i--) {\n        if (view.someProp(propName, f => i > $pos.depth ? f(view, pos, $pos.nodeAfter, $pos.before(i), event, true)\n            : f(view, pos, $pos.node(i), $pos.before(i), event, false)))\n            return true;\n    }\n    return false;\n}\nfunction updateSelection(view, selection, origin) {\n    if (!view.focused)\n        view.focus();\n    let tr = view.state.tr.setSelection(selection);\n    if (origin == \"pointer\")\n        tr.setMeta(\"pointer\", true);\n    view.dispatch(tr);\n}\nfunction selectClickedLeaf(view, inside) {\n    if (inside == -1)\n        return false;\n    let $pos = view.state.doc.resolve(inside), node = $pos.nodeAfter;\n    if (node && node.isAtom && NodeSelection.isSelectable(node)) {\n        updateSelection(view, new NodeSelection($pos), \"pointer\");\n        return true;\n    }\n    return false;\n}\nfunction selectClickedNode(view, inside) {\n    if (inside == -1)\n        return false;\n    let sel = view.state.selection, selectedNode, selectAt;\n    if (sel instanceof NodeSelection)\n        selectedNode = sel.node;\n    let $pos = view.state.doc.resolve(inside);\n    for (let i = $pos.depth + 1; i > 0; i--) {\n        let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n        if (NodeSelection.isSelectable(node)) {\n            if (selectedNode && sel.$from.depth > 0 &&\n                i >= sel.$from.depth && $pos.before(sel.$from.depth + 1) == sel.$from.pos)\n                selectAt = $pos.before(sel.$from.depth);\n            else\n                selectAt = $pos.before(i);\n            break;\n        }\n    }\n    if (selectAt != null) {\n        updateSelection(view, NodeSelection.create(view.state.doc, selectAt), \"pointer\");\n        return true;\n    }\n    else {\n        return false;\n    }\n}\nfunction handleSingleClick(view, pos, inside, event, selectNode) {\n    return runHandlerOnContext(view, \"handleClickOn\", pos, inside, event) ||\n        view.someProp(\"handleClick\", f => f(view, pos, event)) ||\n        (selectNode ? selectClickedNode(view, inside) : selectClickedLeaf(view, inside));\n}\nfunction handleDoubleClick(view, pos, inside, event) {\n    return runHandlerOnContext(view, \"handleDoubleClickOn\", pos, inside, event) ||\n        view.someProp(\"handleDoubleClick\", f => f(view, pos, event));\n}\nfunction handleTripleClick(view, pos, inside, event) {\n    return runHandlerOnContext(view, \"handleTripleClickOn\", pos, inside, event) ||\n        view.someProp(\"handleTripleClick\", f => f(view, pos, event)) ||\n        defaultTripleClick(view, inside, event);\n}\nfunction defaultTripleClick(view, inside, event) {\n    if (event.button != 0)\n        return false;\n    let doc = view.state.doc;\n    if (inside == -1) {\n        if (doc.inlineContent) {\n            updateSelection(view, TextSelection.create(doc, 0, doc.content.size), \"pointer\");\n            return true;\n        }\n        return false;\n    }\n    let $pos = doc.resolve(inside);\n    for (let i = $pos.depth + 1; i > 0; i--) {\n        let node = i > $pos.depth ? $pos.nodeAfter : $pos.node(i);\n        let nodePos = $pos.before(i);\n        if (node.inlineContent)\n            updateSelection(view, TextSelection.create(doc, nodePos + 1, nodePos + 1 + node.content.size), \"pointer\");\n        else if (NodeSelection.isSelectable(node))\n            updateSelection(view, NodeSelection.create(doc, nodePos), \"pointer\");\n        else\n            continue;\n        return true;\n    }\n}\nfunction forceDOMFlush(view) {\n    return endComposition(view);\n}\nconst selectNodeModifier = mac ? \"metaKey\" : \"ctrlKey\";\nhandlers.mousedown = (view, _event) => {\n    let event = _event;\n    view.input.shiftKey = event.shiftKey;\n    let flushed = forceDOMFlush(view);\n    let now = Date.now(), type = \"singleClick\";\n    if (now - view.input.lastClick.time < 500 && isNear(event, view.input.lastClick) && !event[selectNodeModifier]) {\n        if (view.input.lastClick.type == \"singleClick\")\n            type = \"doubleClick\";\n        else if (view.input.lastClick.type == \"doubleClick\")\n            type = \"tripleClick\";\n    }\n    view.input.lastClick = { time: now, x: event.clientX, y: event.clientY, type };\n    let pos = view.posAtCoords(eventCoords(event));\n    if (!pos)\n        return;\n    if (type == \"singleClick\") {\n        if (view.input.mouseDown)\n            view.input.mouseDown.done();\n        view.input.mouseDown = new MouseDown(view, pos, event, !!flushed);\n    }\n    else if ((type == \"doubleClick\" ? handleDoubleClick : handleTripleClick)(view, pos.pos, pos.inside, event)) {\n        event.preventDefault();\n    }\n    else {\n        setSelectionOrigin(view, \"pointer\");\n    }\n};\nclass MouseDown {\n    constructor(view, pos, event, flushed) {\n        this.view = view;\n        this.pos = pos;\n        this.event = event;\n        this.flushed = flushed;\n        this.delayedSelectionSync = false;\n        this.mightDrag = null;\n        this.startDoc = view.state.doc;\n        this.selectNode = !!event[selectNodeModifier];\n        this.allowDefault = event.shiftKey;\n        let targetNode, targetPos;\n        if (pos.inside > -1) {\n            targetNode = view.state.doc.nodeAt(pos.inside);\n            targetPos = pos.inside;\n        }\n        else {\n            let $pos = view.state.doc.resolve(pos.pos);\n            targetNode = $pos.parent;\n            targetPos = $pos.depth ? $pos.before() : 0;\n        }\n        const target = flushed ? null : event.target;\n        const targetDesc = target ? view.docView.nearestDesc(target, true) : null;\n        this.target = targetDesc ? targetDesc.dom : null;\n        let { selection } = view.state;\n        if (event.button == 0 &&\n            targetNode.type.spec.draggable && targetNode.type.spec.selectable !== false ||\n            selection instanceof NodeSelection && selection.from <= targetPos && selection.to > targetPos)\n            this.mightDrag = {\n                node: targetNode,\n                pos: targetPos,\n                addAttr: !!(this.target && !this.target.draggable),\n                setUneditable: !!(this.target && gecko && !this.target.hasAttribute(\"contentEditable\"))\n            };\n        if (this.target && this.mightDrag && (this.mightDrag.addAttr || this.mightDrag.setUneditable)) {\n            this.view.domObserver.stop();\n            if (this.mightDrag.addAttr)\n                this.target.draggable = true;\n            if (this.mightDrag.setUneditable)\n                setTimeout(() => {\n                    if (this.view.input.mouseDown == this)\n                        this.target.setAttribute(\"contentEditable\", \"false\");\n                }, 20);\n            this.view.domObserver.start();\n        }\n        view.root.addEventListener(\"mouseup\", this.up = this.up.bind(this));\n        view.root.addEventListener(\"mousemove\", this.move = this.move.bind(this));\n        setSelectionOrigin(view, \"pointer\");\n    }\n    done() {\n        this.view.root.removeEventListener(\"mouseup\", this.up);\n        this.view.root.removeEventListener(\"mousemove\", this.move);\n        if (this.mightDrag && this.target) {\n            this.view.domObserver.stop();\n            if (this.mightDrag.addAttr)\n                this.target.removeAttribute(\"draggable\");\n            if (this.mightDrag.setUneditable)\n                this.target.removeAttribute(\"contentEditable\");\n            this.view.domObserver.start();\n        }\n        if (this.delayedSelectionSync)\n            setTimeout(() => selectionToDOM(this.view));\n        this.view.input.mouseDown = null;\n    }\n    up(event) {\n        this.done();\n        if (!this.view.dom.contains(event.target))\n            return;\n        let pos = this.pos;\n        if (this.view.state.doc != this.startDoc)\n            pos = this.view.posAtCoords(eventCoords(event));\n        this.updateAllowDefault(event);\n        if (this.allowDefault || !pos) {\n            setSelectionOrigin(this.view, \"pointer\");\n        }\n        else if (handleSingleClick(this.view, pos.pos, pos.inside, event, this.selectNode)) {\n            event.preventDefault();\n        }\n        else if (event.button == 0 &&\n            (this.flushed ||\n                // Safari ignores clicks on draggable elements\n                (safari && this.mightDrag && !this.mightDrag.node.isAtom) ||\n                // Chrome will sometimes treat a node selection as a\n                // cursor, but still report that the node is selected\n                // when asked through getSelection. You'll then get a\n                // situation where clicking at the point where that\n                // (hidden) cursor is doesn't change the selection, and\n                // thus doesn't get a reaction from ProseMirror. This\n                // works around that.\n                (chrome && !this.view.state.selection.visible &&\n                    Math.min(Math.abs(pos.pos - this.view.state.selection.from), Math.abs(pos.pos - this.view.state.selection.to)) <= 2))) {\n            updateSelection(this.view, Selection.near(this.view.state.doc.resolve(pos.pos)), \"pointer\");\n            event.preventDefault();\n        }\n        else {\n            setSelectionOrigin(this.view, \"pointer\");\n        }\n    }\n    move(event) {\n        this.updateAllowDefault(event);\n        setSelectionOrigin(this.view, \"pointer\");\n        if (event.buttons == 0)\n            this.done();\n    }\n    updateAllowDefault(event) {\n        if (!this.allowDefault && (Math.abs(this.event.x - event.clientX) > 4 ||\n            Math.abs(this.event.y - event.clientY) > 4))\n            this.allowDefault = true;\n    }\n}\nhandlers.touchstart = view => {\n    view.input.lastTouch = Date.now();\n    forceDOMFlush(view);\n    setSelectionOrigin(view, \"pointer\");\n};\nhandlers.touchmove = view => {\n    view.input.lastTouch = Date.now();\n    setSelectionOrigin(view, \"pointer\");\n};\nhandlers.contextmenu = view => forceDOMFlush(view);\nfunction inOrNearComposition(view, event) {\n    if (view.composing)\n        return true;\n    // See https://www.stum.de/2016/06/24/handling-ime-events-in-javascript/.\n    // On Japanese input method editors (IMEs), the Enter key is used to confirm character\n    // selection. On Safari, when Enter is pressed, compositionend and keydown events are\n    // emitted. The keydown event triggers newline insertion, which we don't want.\n    // This method returns true if the keydown event should be ignored.\n    // We only ignore it once, as pressing Enter a second time *should* insert a newline.\n    // Furthermore, the keydown event timestamp must be close to the compositionEndedAt timestamp.\n    // This guards against the case where compositionend is triggered without the keyboard\n    // (e.g. character confirmation may be done with the mouse), and keydown is triggered\n    // afterwards- we wouldn't want to ignore the keydown event in this case.\n    if (safari && Math.abs(event.timeStamp - view.input.compositionEndedAt) < 500) {\n        view.input.compositionEndedAt = -2e8;\n        return true;\n    }\n    return false;\n}\n// Drop active composition after 5 seconds of inactivity on Android\nconst timeoutComposition = android ? 5000 : -1;\neditHandlers.compositionstart = editHandlers.compositionupdate = view => {\n    if (!view.composing) {\n        view.domObserver.flush();\n        let { state } = view, $pos = state.selection.$from;\n        if (state.selection.empty &&\n            (state.storedMarks ||\n                (!$pos.textOffset && $pos.parentOffset && $pos.nodeBefore.marks.some(m => m.type.spec.inclusive === false)))) {\n            // Need to wrap the cursor in mark nodes different from the ones in the DOM context\n            view.markCursor = view.state.storedMarks || $pos.marks();\n            endComposition(view, true);\n            view.markCursor = null;\n        }\n        else {\n            endComposition(view);\n            // In firefox, if the cursor is after but outside a marked node,\n            // the inserted text won't inherit the marks. So this moves it\n            // inside if necessary.\n            if (gecko && state.selection.empty && $pos.parentOffset && !$pos.textOffset && $pos.nodeBefore.marks.length) {\n                let sel = view.domSelectionRange();\n                for (let node = sel.focusNode, offset = sel.focusOffset; node && node.nodeType == 1 && offset != 0;) {\n                    let before = offset < 0 ? node.lastChild : node.childNodes[offset - 1];\n                    if (!before)\n                        break;\n                    if (before.nodeType == 3) {\n                        view.domSelection().collapse(before, before.nodeValue.length);\n                        break;\n                    }\n                    else {\n                        node = before;\n                        offset = -1;\n                    }\n                }\n            }\n        }\n        view.input.composing = true;\n    }\n    scheduleComposeEnd(view, timeoutComposition);\n};\neditHandlers.compositionend = (view, event) => {\n    if (view.composing) {\n        view.input.composing = false;\n        view.input.compositionEndedAt = event.timeStamp;\n        view.input.compositionPendingChanges = view.domObserver.pendingRecords().length ? view.input.compositionID : 0;\n        view.input.compositionNode = null;\n        if (view.input.compositionPendingChanges)\n            Promise.resolve().then(() => view.domObserver.flush());\n        view.input.compositionID++;\n        scheduleComposeEnd(view, 20);\n    }\n};\nfunction scheduleComposeEnd(view, delay) {\n    clearTimeout(view.input.composingTimeout);\n    if (delay > -1)\n        view.input.composingTimeout = setTimeout(() => endComposition(view), delay);\n}\nfunction clearComposition(view) {\n    if (view.composing) {\n        view.input.composing = false;\n        view.input.compositionEndedAt = timestampFromCustomEvent();\n    }\n    while (view.input.compositionNodes.length > 0)\n        view.input.compositionNodes.pop().markParentsDirty();\n}\nfunction findCompositionNode(view) {\n    let sel = view.domSelectionRange();\n    if (!sel.focusNode)\n        return null;\n    let textBefore = textNodeBefore$1(sel.focusNode, sel.focusOffset);\n    let textAfter = textNodeAfter$1(sel.focusNode, sel.focusOffset);\n    if (textBefore && textAfter && textBefore != textAfter) {\n        let descAfter = textAfter.pmViewDesc;\n        if (!descAfter || !descAfter.isText(textAfter.nodeValue)) {\n            return textAfter;\n        }\n        else if (view.input.compositionNode == textAfter) {\n            let descBefore = textBefore.pmViewDesc;\n            if (!(!descBefore || !descBefore.isText(textBefore.nodeValue)))\n                return textAfter;\n        }\n    }\n    return textBefore;\n}\nfunction timestampFromCustomEvent() {\n    let event = document.createEvent(\"Event\");\n    event.initEvent(\"event\", true, true);\n    return event.timeStamp;\n}\n/**\n@internal\n*/\nfunction endComposition(view, forceUpdate = false) {\n    if (android && view.domObserver.flushingSoon >= 0)\n        return;\n    view.domObserver.forceFlush();\n    clearComposition(view);\n    if (forceUpdate || view.docView && view.docView.dirty) {\n        let sel = selectionFromDOM(view);\n        if (sel && !sel.eq(view.state.selection))\n            view.dispatch(view.state.tr.setSelection(sel));\n        else\n            view.updateState(view.state);\n        return true;\n    }\n    return false;\n}\nfunction captureCopy(view, dom) {\n    // The extra wrapper is somehow necessary on IE/Edge to prevent the\n    // content from being mangled when it is put onto the clipboard\n    if (!view.dom.parentNode)\n        return;\n    let wrap = view.dom.parentNode.appendChild(document.createElement(\"div\"));\n    wrap.appendChild(dom);\n    wrap.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n    let sel = getSelection(), range = document.createRange();\n    range.selectNodeContents(dom);\n    // Done because IE will fire a selectionchange moving the selection\n    // to its start when removeAllRanges is called and the editor still\n    // has focus (which will mess up the editor's selection state).\n    view.dom.blur();\n    sel.removeAllRanges();\n    sel.addRange(range);\n    setTimeout(() => {\n        if (wrap.parentNode)\n            wrap.parentNode.removeChild(wrap);\n        view.focus();\n    }, 50);\n}\n// This is very crude, but unfortunately both these browsers _pretend_\n// that they have a clipboard API—all the objects and methods are\n// there, they just don't work, and they are hard to test.\nconst brokenClipboardAPI = (ie && ie_version < 15) ||\n    (ios && webkit_version < 604);\nhandlers.copy = editHandlers.cut = (view, _event) => {\n    let event = _event;\n    let sel = view.state.selection, cut = event.type == \"cut\";\n    if (sel.empty)\n        return;\n    // IE and Edge's clipboard interface is completely broken\n    let data = brokenClipboardAPI ? null : event.clipboardData;\n    let slice = sel.content(), { dom, text } = serializeForClipboard(view, slice);\n    if (data) {\n        event.preventDefault();\n        data.clearData();\n        data.setData(\"text/html\", dom.innerHTML);\n        data.setData(\"text/plain\", text);\n    }\n    else {\n        captureCopy(view, dom);\n    }\n    if (cut)\n        view.dispatch(view.state.tr.deleteSelection().scrollIntoView().setMeta(\"uiEvent\", \"cut\"));\n};\nfunction sliceSingleNode(slice) {\n    return slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1 ? slice.content.firstChild : null;\n}\nfunction capturePaste(view, event) {\n    if (!view.dom.parentNode)\n        return;\n    let plainText = view.input.shiftKey || view.state.selection.$from.parent.type.spec.code;\n    let target = view.dom.parentNode.appendChild(document.createElement(plainText ? \"textarea\" : \"div\"));\n    if (!plainText)\n        target.contentEditable = \"true\";\n    target.style.cssText = \"position: fixed; left: -10000px; top: 10px\";\n    target.focus();\n    let plain = view.input.shiftKey && view.input.lastKeyCode != 45;\n    setTimeout(() => {\n        view.focus();\n        if (target.parentNode)\n            target.parentNode.removeChild(target);\n        if (plainText)\n            doPaste(view, target.value, null, plain, event);\n        else\n            doPaste(view, target.textContent, target.innerHTML, plain, event);\n    }, 50);\n}\nfunction doPaste(view, text, html, preferPlain, event) {\n    let slice = parseFromClipboard(view, text, html, preferPlain, view.state.selection.$from);\n    if (view.someProp(\"handlePaste\", f => f(view, event, slice || Slice.empty)))\n        return true;\n    if (!slice)\n        return false;\n    let singleNode = sliceSingleNode(slice);\n    let tr = singleNode\n        ? view.state.tr.replaceSelectionWith(singleNode, preferPlain)\n        : view.state.tr.replaceSelection(slice);\n    view.dispatch(tr.scrollIntoView().setMeta(\"paste\", true).setMeta(\"uiEvent\", \"paste\"));\n    return true;\n}\nfunction getText(clipboardData) {\n    let text = clipboardData.getData(\"text/plain\") || clipboardData.getData(\"Text\");\n    if (text)\n        return text;\n    let uris = clipboardData.getData(\"text/uri-list\");\n    return uris ? uris.replace(/\\r?\\n/g, \" \") : \"\";\n}\neditHandlers.paste = (view, _event) => {\n    let event = _event;\n    // Handling paste from JavaScript during composition is very poorly\n    // handled by browsers, so as a dodgy but preferable kludge, we just\n    // let the browser do its native thing there, except on Android,\n    // where the editor is almost always composing.\n    if (view.composing && !android)\n        return;\n    let data = brokenClipboardAPI ? null : event.clipboardData;\n    let plain = view.input.shiftKey && view.input.lastKeyCode != 45;\n    if (data && doPaste(view, getText(data), data.getData(\"text/html\"), plain, event))\n        event.preventDefault();\n    else\n        capturePaste(view, event);\n};\nclass Dragging {\n    constructor(slice, move, node) {\n        this.slice = slice;\n        this.move = move;\n        this.node = node;\n    }\n}\nconst dragCopyModifier = mac ? \"altKey\" : \"ctrlKey\";\nhandlers.dragstart = (view, _event) => {\n    let event = _event;\n    let mouseDown = view.input.mouseDown;\n    if (mouseDown)\n        mouseDown.done();\n    if (!event.dataTransfer)\n        return;\n    let sel = view.state.selection;\n    let pos = sel.empty ? null : view.posAtCoords(eventCoords(event));\n    let node;\n    if (pos && pos.pos >= sel.from && pos.pos <= (sel instanceof NodeSelection ? sel.to - 1 : sel.to)) ;\n    else if (mouseDown && mouseDown.mightDrag) {\n        node = NodeSelection.create(view.state.doc, mouseDown.mightDrag.pos);\n    }\n    else if (event.target && event.target.nodeType == 1) {\n        let desc = view.docView.nearestDesc(event.target, true);\n        if (desc && desc.node.type.spec.draggable && desc != view.docView)\n            node = NodeSelection.create(view.state.doc, desc.posBefore);\n    }\n    let slice = (node || view.state.selection).content(), { dom, text } = serializeForClipboard(view, slice);\n    event.dataTransfer.clearData();\n    event.dataTransfer.setData(brokenClipboardAPI ? \"Text\" : \"text/html\", dom.innerHTML);\n    // See https://github.com/ProseMirror/prosemirror/issues/1156\n    event.dataTransfer.effectAllowed = \"copyMove\";\n    if (!brokenClipboardAPI)\n        event.dataTransfer.setData(\"text/plain\", text);\n    view.dragging = new Dragging(slice, !event[dragCopyModifier], node);\n};\nhandlers.dragend = view => {\n    let dragging = view.dragging;\n    window.setTimeout(() => {\n        if (view.dragging == dragging)\n            view.dragging = null;\n    }, 50);\n};\neditHandlers.dragover = editHandlers.dragenter = (_, e) => e.preventDefault();\neditHandlers.drop = (view, _event) => {\n    let event = _event;\n    let dragging = view.dragging;\n    view.dragging = null;\n    if (!event.dataTransfer)\n        return;\n    let eventPos = view.posAtCoords(eventCoords(event));\n    if (!eventPos)\n        return;\n    let $mouse = view.state.doc.resolve(eventPos.pos);\n    let slice = dragging && dragging.slice;\n    if (slice) {\n        view.someProp(\"transformPasted\", f => { slice = f(slice, view); });\n    }\n    else {\n        slice = parseFromClipboard(view, getText(event.dataTransfer), brokenClipboardAPI ? null : event.dataTransfer.getData(\"text/html\"), false, $mouse);\n    }\n    let move = !!(dragging && !event[dragCopyModifier]);\n    if (view.someProp(\"handleDrop\", f => f(view, event, slice || Slice.empty, move))) {\n        event.preventDefault();\n        return;\n    }\n    if (!slice)\n        return;\n    event.preventDefault();\n    let insertPos = slice ? dropPoint(view.state.doc, $mouse.pos, slice) : $mouse.pos;\n    if (insertPos == null)\n        insertPos = $mouse.pos;\n    let tr = view.state.tr;\n    if (move) {\n        let { node } = dragging;\n        if (node)\n            node.replace(tr);\n        else\n            tr.deleteSelection();\n    }\n    let pos = tr.mapping.map(insertPos);\n    let isNode = slice.openStart == 0 && slice.openEnd == 0 && slice.content.childCount == 1;\n    let beforeInsert = tr.doc;\n    if (isNode)\n        tr.replaceRangeWith(pos, pos, slice.content.firstChild);\n    else\n        tr.replaceRange(pos, pos, slice);\n    if (tr.doc.eq(beforeInsert))\n        return;\n    let $pos = tr.doc.resolve(pos);\n    if (isNode && NodeSelection.isSelectable(slice.content.firstChild) &&\n        $pos.nodeAfter && $pos.nodeAfter.sameMarkup(slice.content.firstChild)) {\n        tr.setSelection(new NodeSelection($pos));\n    }\n    else {\n        let end = tr.mapping.map(insertPos);\n        tr.mapping.maps[tr.mapping.maps.length - 1].forEach((_from, _to, _newFrom, newTo) => end = newTo);\n        tr.setSelection(selectionBetween(view, $pos, tr.doc.resolve(end)));\n    }\n    view.focus();\n    view.dispatch(tr.setMeta(\"uiEvent\", \"drop\"));\n};\nhandlers.focus = view => {\n    view.input.lastFocus = Date.now();\n    if (!view.focused) {\n        view.domObserver.stop();\n        view.dom.classList.add(\"ProseMirror-focused\");\n        view.domObserver.start();\n        view.focused = true;\n        setTimeout(() => {\n            if (view.docView && view.hasFocus() && !view.domObserver.currentSelection.eq(view.domSelectionRange()))\n                selectionToDOM(view);\n        }, 20);\n    }\n};\nhandlers.blur = (view, _event) => {\n    let event = _event;\n    if (view.focused) {\n        view.domObserver.stop();\n        view.dom.classList.remove(\"ProseMirror-focused\");\n        view.domObserver.start();\n        if (event.relatedTarget && view.dom.contains(event.relatedTarget))\n            view.domObserver.currentSelection.clear();\n        view.focused = false;\n    }\n};\nhandlers.beforeinput = (view, _event) => {\n    let event = _event;\n    // We should probably do more with beforeinput events, but support\n    // is so spotty that I'm still waiting to see where they are going.\n    // Very specific hack to deal with backspace sometimes failing on\n    // Chrome Android when after an uneditable node.\n    if (chrome && android && event.inputType == \"deleteContentBackward\") {\n        view.domObserver.flushSoon();\n        let { domChangeCount } = view.input;\n        setTimeout(() => {\n            if (view.input.domChangeCount != domChangeCount)\n                return; // Event already had some effect\n            // This bug tends to close the virtual keyboard, so we refocus\n            view.dom.blur();\n            view.focus();\n            if (view.someProp(\"handleKeyDown\", f => f(view, keyEvent(8, \"Backspace\"))))\n                return;\n            let { $cursor } = view.state.selection;\n            // Crude approximation of backspace behavior when no command handled it\n            if ($cursor && $cursor.pos > 0)\n                view.dispatch(view.state.tr.delete($cursor.pos - 1, $cursor.pos).scrollIntoView());\n        }, 50);\n    }\n};\n// Make sure all handlers get registered\nfor (let prop in editHandlers)\n    handlers[prop] = editHandlers[prop];\n\nfunction compareObjs(a, b) {\n    if (a == b)\n        return true;\n    for (let p in a)\n        if (a[p] !== b[p])\n            return false;\n    for (let p in b)\n        if (!(p in a))\n            return false;\n    return true;\n}\nclass WidgetType {\n    constructor(toDOM, spec) {\n        this.toDOM = toDOM;\n        this.spec = spec || noSpec;\n        this.side = this.spec.side || 0;\n    }\n    map(mapping, span, offset, oldOffset) {\n        let { pos, deleted } = mapping.mapResult(span.from + oldOffset, this.side < 0 ? -1 : 1);\n        return deleted ? null : new Decoration(pos - offset, pos - offset, this);\n    }\n    valid() { return true; }\n    eq(other) {\n        return this == other ||\n            (other instanceof WidgetType &&\n                (this.spec.key && this.spec.key == other.spec.key ||\n                    this.toDOM == other.toDOM && compareObjs(this.spec, other.spec)));\n    }\n    destroy(node) {\n        if (this.spec.destroy)\n            this.spec.destroy(node);\n    }\n}\nclass InlineType {\n    constructor(attrs, spec) {\n        this.attrs = attrs;\n        this.spec = spec || noSpec;\n    }\n    map(mapping, span, offset, oldOffset) {\n        let from = mapping.map(span.from + oldOffset, this.spec.inclusiveStart ? -1 : 1) - offset;\n        let to = mapping.map(span.to + oldOffset, this.spec.inclusiveEnd ? 1 : -1) - offset;\n        return from >= to ? null : new Decoration(from, to, this);\n    }\n    valid(_, span) { return span.from < span.to; }\n    eq(other) {\n        return this == other ||\n            (other instanceof InlineType && compareObjs(this.attrs, other.attrs) &&\n                compareObjs(this.spec, other.spec));\n    }\n    static is(span) { return span.type instanceof InlineType; }\n    destroy() { }\n}\nclass NodeType {\n    constructor(attrs, spec) {\n        this.attrs = attrs;\n        this.spec = spec || noSpec;\n    }\n    map(mapping, span, offset, oldOffset) {\n        let from = mapping.mapResult(span.from + oldOffset, 1);\n        if (from.deleted)\n            return null;\n        let to = mapping.mapResult(span.to + oldOffset, -1);\n        if (to.deleted || to.pos <= from.pos)\n            return null;\n        return new Decoration(from.pos - offset, to.pos - offset, this);\n    }\n    valid(node, span) {\n        let { index, offset } = node.content.findIndex(span.from), child;\n        return offset == span.from && !(child = node.child(index)).isText && offset + child.nodeSize == span.to;\n    }\n    eq(other) {\n        return this == other ||\n            (other instanceof NodeType && compareObjs(this.attrs, other.attrs) &&\n                compareObjs(this.spec, other.spec));\n    }\n    destroy() { }\n}\n/**\nDecoration objects can be provided to the view through the\n[`decorations` prop](https://prosemirror.net/docs/ref/#view.EditorProps.decorations). They come in\nseveral variants—see the static members of this class for details.\n*/\nclass Decoration {\n    /**\n    @internal\n    */\n    constructor(\n    /**\n    The start position of the decoration.\n    */\n    from, \n    /**\n    The end position. Will be the same as `from` for [widget\n    decorations](https://prosemirror.net/docs/ref/#view.Decoration^widget).\n    */\n    to, \n    /**\n    @internal\n    */\n    type) {\n        this.from = from;\n        this.to = to;\n        this.type = type;\n    }\n    /**\n    @internal\n    */\n    copy(from, to) {\n        return new Decoration(from, to, this.type);\n    }\n    /**\n    @internal\n    */\n    eq(other, offset = 0) {\n        return this.type.eq(other.type) && this.from + offset == other.from && this.to + offset == other.to;\n    }\n    /**\n    @internal\n    */\n    map(mapping, offset, oldOffset) {\n        return this.type.map(mapping, this, offset, oldOffset);\n    }\n    /**\n    Creates a widget decoration, which is a DOM node that's shown in\n    the document at the given position. It is recommended that you\n    delay rendering the widget by passing a function that will be\n    called when the widget is actually drawn in a view, but you can\n    also directly pass a DOM node. `getPos` can be used to find the\n    widget's current document position.\n    */\n    static widget(pos, toDOM, spec) {\n        return new Decoration(pos, pos, new WidgetType(toDOM, spec));\n    }\n    /**\n    Creates an inline decoration, which adds the given attributes to\n    each inline node between `from` and `to`.\n    */\n    static inline(from, to, attrs, spec) {\n        return new Decoration(from, to, new InlineType(attrs, spec));\n    }\n    /**\n    Creates a node decoration. `from` and `to` should point precisely\n    before and after a node in the document. That node, and only that\n    node, will receive the given attributes.\n    */\n    static node(from, to, attrs, spec) {\n        return new Decoration(from, to, new NodeType(attrs, spec));\n    }\n    /**\n    The spec provided when creating this decoration. Can be useful\n    if you've stored extra information in that object.\n    */\n    get spec() { return this.type.spec; }\n    /**\n    @internal\n    */\n    get inline() { return this.type instanceof InlineType; }\n    /**\n    @internal\n    */\n    get widget() { return this.type instanceof WidgetType; }\n}\nconst none = [], noSpec = {};\n/**\nA collection of [decorations](https://prosemirror.net/docs/ref/#view.Decoration), organized in such\na way that the drawing algorithm can efficiently use and compare\nthem. This is a persistent data structure—it is not modified,\nupdates create a new value.\n*/\nclass DecorationSet {\n    /**\n    @internal\n    */\n    constructor(local, children) {\n        this.local = local.length ? local : none;\n        this.children = children.length ? children : none;\n    }\n    /**\n    Create a set of decorations, using the structure of the given\n    document. This will consume (modify) the `decorations` array, so\n    you must make a copy if you want need to preserve that.\n    */\n    static create(doc, decorations) {\n        return decorations.length ? buildTree(decorations, doc, 0, noSpec) : empty;\n    }\n    /**\n    Find all decorations in this set which touch the given range\n    (including decorations that start or end directly at the\n    boundaries) and match the given predicate on their spec. When\n    `start` and `end` are omitted, all decorations in the set are\n    considered. When `predicate` isn't given, all decorations are\n    assumed to match.\n    */\n    find(start, end, predicate) {\n        let result = [];\n        this.findInner(start == null ? 0 : start, end == null ? 1e9 : end, result, 0, predicate);\n        return result;\n    }\n    findInner(start, end, result, offset, predicate) {\n        for (let i = 0; i < this.local.length; i++) {\n            let span = this.local[i];\n            if (span.from <= end && span.to >= start && (!predicate || predicate(span.spec)))\n                result.push(span.copy(span.from + offset, span.to + offset));\n        }\n        for (let i = 0; i < this.children.length; i += 3) {\n            if (this.children[i] < end && this.children[i + 1] > start) {\n                let childOff = this.children[i] + 1;\n                this.children[i + 2].findInner(start - childOff, end - childOff, result, offset + childOff, predicate);\n            }\n        }\n    }\n    /**\n    Map the set of decorations in response to a change in the\n    document.\n    */\n    map(mapping, doc, options) {\n        if (this == empty || mapping.maps.length == 0)\n            return this;\n        return this.mapInner(mapping, doc, 0, 0, options || noSpec);\n    }\n    /**\n    @internal\n    */\n    mapInner(mapping, node, offset, oldOffset, options) {\n        let newLocal;\n        for (let i = 0; i < this.local.length; i++) {\n            let mapped = this.local[i].map(mapping, offset, oldOffset);\n            if (mapped && mapped.type.valid(node, mapped))\n                (newLocal || (newLocal = [])).push(mapped);\n            else if (options.onRemove)\n                options.onRemove(this.local[i].spec);\n        }\n        if (this.children.length)\n            return mapChildren(this.children, newLocal || [], mapping, node, offset, oldOffset, options);\n        else\n            return newLocal ? new DecorationSet(newLocal.sort(byPos), none) : empty;\n    }\n    /**\n    Add the given array of decorations to the ones in the set,\n    producing a new set. Consumes the `decorations` array. Needs\n    access to the current document to create the appropriate tree\n    structure.\n    */\n    add(doc, decorations) {\n        if (!decorations.length)\n            return this;\n        if (this == empty)\n            return DecorationSet.create(doc, decorations);\n        return this.addInner(doc, decorations, 0);\n    }\n    addInner(doc, decorations, offset) {\n        let children, childIndex = 0;\n        doc.forEach((childNode, childOffset) => {\n            let baseOffset = childOffset + offset, found;\n            if (!(found = takeSpansForNode(decorations, childNode, baseOffset)))\n                return;\n            if (!children)\n                children = this.children.slice();\n            while (childIndex < children.length && children[childIndex] < childOffset)\n                childIndex += 3;\n            if (children[childIndex] == childOffset)\n                children[childIndex + 2] = children[childIndex + 2].addInner(childNode, found, baseOffset + 1);\n            else\n                children.splice(childIndex, 0, childOffset, childOffset + childNode.nodeSize, buildTree(found, childNode, baseOffset + 1, noSpec));\n            childIndex += 3;\n        });\n        let local = moveSpans(childIndex ? withoutNulls(decorations) : decorations, -offset);\n        for (let i = 0; i < local.length; i++)\n            if (!local[i].type.valid(doc, local[i]))\n                local.splice(i--, 1);\n        return new DecorationSet(local.length ? this.local.concat(local).sort(byPos) : this.local, children || this.children);\n    }\n    /**\n    Create a new set that contains the decorations in this set, minus\n    the ones in the given array.\n    */\n    remove(decorations) {\n        if (decorations.length == 0 || this == empty)\n            return this;\n        return this.removeInner(decorations, 0);\n    }\n    removeInner(decorations, offset) {\n        let children = this.children, local = this.local;\n        for (let i = 0; i < children.length; i += 3) {\n            let found;\n            let from = children[i] + offset, to = children[i + 1] + offset;\n            for (let j = 0, span; j < decorations.length; j++)\n                if (span = decorations[j]) {\n                    if (span.from > from && span.to < to) {\n                        decorations[j] = null;\n                        (found || (found = [])).push(span);\n                    }\n                }\n            if (!found)\n                continue;\n            if (children == this.children)\n                children = this.children.slice();\n            let removed = children[i + 2].removeInner(found, from + 1);\n            if (removed != empty) {\n                children[i + 2] = removed;\n            }\n            else {\n                children.splice(i, 3);\n                i -= 3;\n            }\n        }\n        if (local.length)\n            for (let i = 0, span; i < decorations.length; i++)\n                if (span = decorations[i]) {\n                    for (let j = 0; j < local.length; j++)\n                        if (local[j].eq(span, offset)) {\n                            if (local == this.local)\n                                local = this.local.slice();\n                            local.splice(j--, 1);\n                        }\n                }\n        if (children == this.children && local == this.local)\n            return this;\n        return local.length || children.length ? new DecorationSet(local, children) : empty;\n    }\n    forChild(offset, node) {\n        if (this == empty)\n            return this;\n        if (node.isLeaf)\n            return DecorationSet.empty;\n        let child, local;\n        for (let i = 0; i < this.children.length; i += 3)\n            if (this.children[i] >= offset) {\n                if (this.children[i] == offset)\n                    child = this.children[i + 2];\n                break;\n            }\n        let start = offset + 1, end = start + node.content.size;\n        for (let i = 0; i < this.local.length; i++) {\n            let dec = this.local[i];\n            if (dec.from < end && dec.to > start && (dec.type instanceof InlineType)) {\n                let from = Math.max(start, dec.from) - start, to = Math.min(end, dec.to) - start;\n                if (from < to)\n                    (local || (local = [])).push(dec.copy(from, to));\n            }\n        }\n        if (local) {\n            let localSet = new DecorationSet(local.sort(byPos), none);\n            return child ? new DecorationGroup([localSet, child]) : localSet;\n        }\n        return child || empty;\n    }\n    /**\n    @internal\n    */\n    eq(other) {\n        if (this == other)\n            return true;\n        if (!(other instanceof DecorationSet) ||\n            this.local.length != other.local.length ||\n            this.children.length != other.children.length)\n            return false;\n        for (let i = 0; i < this.local.length; i++)\n            if (!this.local[i].eq(other.local[i]))\n                return false;\n        for (let i = 0; i < this.children.length; i += 3)\n            if (this.children[i] != other.children[i] ||\n                this.children[i + 1] != other.children[i + 1] ||\n                !this.children[i + 2].eq(other.children[i + 2]))\n                return false;\n        return true;\n    }\n    /**\n    @internal\n    */\n    locals(node) {\n        return removeOverlap(this.localsInner(node));\n    }\n    /**\n    @internal\n    */\n    localsInner(node) {\n        if (this == empty)\n            return none;\n        if (node.inlineContent || !this.local.some(InlineType.is))\n            return this.local;\n        let result = [];\n        for (let i = 0; i < this.local.length; i++) {\n            if (!(this.local[i].type instanceof InlineType))\n                result.push(this.local[i]);\n        }\n        return result;\n    }\n}\n/**\nThe empty set of decorations.\n*/\nDecorationSet.empty = new DecorationSet([], []);\n/**\n@internal\n*/\nDecorationSet.removeOverlap = removeOverlap;\nconst empty = DecorationSet.empty;\n// An abstraction that allows the code dealing with decorations to\n// treat multiple DecorationSet objects as if it were a single object\n// with (a subset of) the same interface.\nclass DecorationGroup {\n    constructor(members) {\n        this.members = members;\n    }\n    map(mapping, doc) {\n        const mappedDecos = this.members.map(member => member.map(mapping, doc, noSpec));\n        return DecorationGroup.from(mappedDecos);\n    }\n    forChild(offset, child) {\n        if (child.isLeaf)\n            return DecorationSet.empty;\n        let found = [];\n        for (let i = 0; i < this.members.length; i++) {\n            let result = this.members[i].forChild(offset, child);\n            if (result == empty)\n                continue;\n            if (result instanceof DecorationGroup)\n                found = found.concat(result.members);\n            else\n                found.push(result);\n        }\n        return DecorationGroup.from(found);\n    }\n    eq(other) {\n        if (!(other instanceof DecorationGroup) ||\n            other.members.length != this.members.length)\n            return false;\n        for (let i = 0; i < this.members.length; i++)\n            if (!this.members[i].eq(other.members[i]))\n                return false;\n        return true;\n    }\n    locals(node) {\n        let result, sorted = true;\n        for (let i = 0; i < this.members.length; i++) {\n            let locals = this.members[i].localsInner(node);\n            if (!locals.length)\n                continue;\n            if (!result) {\n                result = locals;\n            }\n            else {\n                if (sorted) {\n                    result = result.slice();\n                    sorted = false;\n                }\n                for (let j = 0; j < locals.length; j++)\n                    result.push(locals[j]);\n            }\n        }\n        return result ? removeOverlap(sorted ? result : result.sort(byPos)) : none;\n    }\n    // Create a group for the given array of decoration sets, or return\n    // a single set when possible.\n    static from(members) {\n        switch (members.length) {\n            case 0: return empty;\n            case 1: return members[0];\n            default: return new DecorationGroup(members.every(m => m instanceof DecorationSet) ? members :\n                members.reduce((r, m) => r.concat(m instanceof DecorationSet ? m : m.members), []));\n        }\n    }\n}\nfunction mapChildren(oldChildren, newLocal, mapping, node, offset, oldOffset, options) {\n    let children = oldChildren.slice();\n    // Mark the children that are directly touched by changes, and\n    // move those that are after the changes.\n    for (let i = 0, baseOffset = oldOffset; i < mapping.maps.length; i++) {\n        let moved = 0;\n        mapping.maps[i].forEach((oldStart, oldEnd, newStart, newEnd) => {\n            let dSize = (newEnd - newStart) - (oldEnd - oldStart);\n            for (let i = 0; i < children.length; i += 3) {\n                let end = children[i + 1];\n                if (end < 0 || oldStart > end + baseOffset - moved)\n                    continue;\n                let start = children[i] + baseOffset - moved;\n                if (oldEnd >= start) {\n                    children[i + 1] = oldStart <= start ? -2 : -1;\n                }\n                else if (oldStart >= baseOffset && dSize) {\n                    children[i] += dSize;\n                    children[i + 1] += dSize;\n                }\n            }\n            moved += dSize;\n        });\n        baseOffset = mapping.maps[i].map(baseOffset, -1);\n    }\n    // Find the child nodes that still correspond to a single node,\n    // recursively call mapInner on them and update their positions.\n    let mustRebuild = false;\n    for (let i = 0; i < children.length; i += 3)\n        if (children[i + 1] < 0) { // Touched nodes\n            if (children[i + 1] == -2) {\n                mustRebuild = true;\n                children[i + 1] = -1;\n                continue;\n            }\n            let from = mapping.map(oldChildren[i] + oldOffset), fromLocal = from - offset;\n            if (fromLocal < 0 || fromLocal >= node.content.size) {\n                mustRebuild = true;\n                continue;\n            }\n            // Must read oldChildren because children was tagged with -1\n            let to = mapping.map(oldChildren[i + 1] + oldOffset, -1), toLocal = to - offset;\n            let { index, offset: childOffset } = node.content.findIndex(fromLocal);\n            let childNode = node.maybeChild(index);\n            if (childNode && childOffset == fromLocal && childOffset + childNode.nodeSize == toLocal) {\n                let mapped = children[i + 2]\n                    .mapInner(mapping, childNode, from + 1, oldChildren[i] + oldOffset + 1, options);\n                if (mapped != empty) {\n                    children[i] = fromLocal;\n                    children[i + 1] = toLocal;\n                    children[i + 2] = mapped;\n                }\n                else {\n                    children[i + 1] = -2;\n                    mustRebuild = true;\n                }\n            }\n            else {\n                mustRebuild = true;\n            }\n        }\n    // Remaining children must be collected and rebuilt into the appropriate structure\n    if (mustRebuild) {\n        let decorations = mapAndGatherRemainingDecorations(children, oldChildren, newLocal, mapping, offset, oldOffset, options);\n        let built = buildTree(decorations, node, 0, options);\n        newLocal = built.local;\n        for (let i = 0; i < children.length; i += 3)\n            if (children[i + 1] < 0) {\n                children.splice(i, 3);\n                i -= 3;\n            }\n        for (let i = 0, j = 0; i < built.children.length; i += 3) {\n            let from = built.children[i];\n            while (j < children.length && children[j] < from)\n                j += 3;\n            children.splice(j, 0, built.children[i], built.children[i + 1], built.children[i + 2]);\n        }\n    }\n    return new DecorationSet(newLocal.sort(byPos), children);\n}\nfunction moveSpans(spans, offset) {\n    if (!offset || !spans.length)\n        return spans;\n    let result = [];\n    for (let i = 0; i < spans.length; i++) {\n        let span = spans[i];\n        result.push(new Decoration(span.from + offset, span.to + offset, span.type));\n    }\n    return result;\n}\nfunction mapAndGatherRemainingDecorations(children, oldChildren, decorations, mapping, offset, oldOffset, options) {\n    // Gather all decorations from the remaining marked children\n    function gather(set, oldOffset) {\n        for (let i = 0; i < set.local.length; i++) {\n            let mapped = set.local[i].map(mapping, offset, oldOffset);\n            if (mapped)\n                decorations.push(mapped);\n            else if (options.onRemove)\n                options.onRemove(set.local[i].spec);\n        }\n        for (let i = 0; i < set.children.length; i += 3)\n            gather(set.children[i + 2], set.children[i] + oldOffset + 1);\n    }\n    for (let i = 0; i < children.length; i += 3)\n        if (children[i + 1] == -1)\n            gather(children[i + 2], oldChildren[i] + oldOffset + 1);\n    return decorations;\n}\nfunction takeSpansForNode(spans, node, offset) {\n    if (node.isLeaf)\n        return null;\n    let end = offset + node.nodeSize, found = null;\n    for (let i = 0, span; i < spans.length; i++) {\n        if ((span = spans[i]) && span.from > offset && span.to < end) {\n            (found || (found = [])).push(span);\n            spans[i] = null;\n        }\n    }\n    return found;\n}\nfunction withoutNulls(array) {\n    let result = [];\n    for (let i = 0; i < array.length; i++)\n        if (array[i] != null)\n            result.push(array[i]);\n    return result;\n}\n// Build up a tree that corresponds to a set of decorations. `offset`\n// is a base offset that should be subtracted from the `from` and `to`\n// positions in the spans (so that we don't have to allocate new spans\n// for recursive calls).\nfunction buildTree(spans, node, offset, options) {\n    let children = [], hasNulls = false;\n    node.forEach((childNode, localStart) => {\n        let found = takeSpansForNode(spans, childNode, localStart + offset);\n        if (found) {\n            hasNulls = true;\n            let subtree = buildTree(found, childNode, offset + localStart + 1, options);\n            if (subtree != empty)\n                children.push(localStart, localStart + childNode.nodeSize, subtree);\n        }\n    });\n    let locals = moveSpans(hasNulls ? withoutNulls(spans) : spans, -offset).sort(byPos);\n    for (let i = 0; i < locals.length; i++)\n        if (!locals[i].type.valid(node, locals[i])) {\n            if (options.onRemove)\n                options.onRemove(locals[i].spec);\n            locals.splice(i--, 1);\n        }\n    return locals.length || children.length ? new DecorationSet(locals, children) : empty;\n}\n// Used to sort decorations so that ones with a low start position\n// come first, and within a set with the same start position, those\n// with an smaller end position come first.\nfunction byPos(a, b) {\n    return a.from - b.from || a.to - b.to;\n}\n// Scan a sorted array of decorations for partially overlapping spans,\n// and split those so that only fully overlapping spans are left (to\n// make subsequent rendering easier). Will return the input array if\n// no partially overlapping spans are found (the common case).\nfunction removeOverlap(spans) {\n    let working = spans;\n    for (let i = 0; i < working.length - 1; i++) {\n        let span = working[i];\n        if (span.from != span.to)\n            for (let j = i + 1; j < working.length; j++) {\n                let next = working[j];\n                if (next.from == span.from) {\n                    if (next.to != span.to) {\n                        if (working == spans)\n                            working = spans.slice();\n                        // Followed by a partially overlapping larger span. Split that\n                        // span.\n                        working[j] = next.copy(next.from, span.to);\n                        insertAhead(working, j + 1, next.copy(span.to, next.to));\n                    }\n                    continue;\n                }\n                else {\n                    if (next.from < span.to) {\n                        if (working == spans)\n                            working = spans.slice();\n                        // The end of this one overlaps with a subsequent span. Split\n                        // this one.\n                        working[i] = span.copy(span.from, next.from);\n                        insertAhead(working, j, span.copy(next.from, span.to));\n                    }\n                    break;\n                }\n            }\n    }\n    return working;\n}\nfunction insertAhead(array, i, deco) {\n    while (i < array.length && byPos(deco, array[i]) > 0)\n        i++;\n    array.splice(i, 0, deco);\n}\n// Get the decorations associated with the current props of a view.\nfunction viewDecorations(view) {\n    let found = [];\n    view.someProp(\"decorations\", f => {\n        let result = f(view.state);\n        if (result && result != empty)\n            found.push(result);\n    });\n    if (view.cursorWrapper)\n        found.push(DecorationSet.create(view.state.doc, [view.cursorWrapper.deco]));\n    return DecorationGroup.from(found);\n}\n\nconst observeOptions = {\n    childList: true,\n    characterData: true,\n    characterDataOldValue: true,\n    attributes: true,\n    attributeOldValue: true,\n    subtree: true\n};\n// IE11 has very broken mutation observers, so we also listen to DOMCharacterDataModified\nconst useCharData = ie && ie_version <= 11;\nclass SelectionState {\n    constructor() {\n        this.anchorNode = null;\n        this.anchorOffset = 0;\n        this.focusNode = null;\n        this.focusOffset = 0;\n    }\n    set(sel) {\n        this.anchorNode = sel.anchorNode;\n        this.anchorOffset = sel.anchorOffset;\n        this.focusNode = sel.focusNode;\n        this.focusOffset = sel.focusOffset;\n    }\n    clear() {\n        this.anchorNode = this.focusNode = null;\n    }\n    eq(sel) {\n        return sel.anchorNode == this.anchorNode && sel.anchorOffset == this.anchorOffset &&\n            sel.focusNode == this.focusNode && sel.focusOffset == this.focusOffset;\n    }\n}\nclass DOMObserver {\n    constructor(view, handleDOMChange) {\n        this.view = view;\n        this.handleDOMChange = handleDOMChange;\n        this.queue = [];\n        this.flushingSoon = -1;\n        this.observer = null;\n        this.currentSelection = new SelectionState;\n        this.onCharData = null;\n        this.suppressingSelectionUpdates = false;\n        this.observer = window.MutationObserver &&\n            new window.MutationObserver(mutations => {\n                for (let i = 0; i < mutations.length; i++)\n                    this.queue.push(mutations[i]);\n                // IE11 will sometimes (on backspacing out a single character\n                // text node after a BR node) call the observer callback\n                // before actually updating the DOM, which will cause\n                // ProseMirror to miss the change (see #930)\n                if (ie && ie_version <= 11 && mutations.some(m => m.type == \"childList\" && m.removedNodes.length ||\n                    m.type == \"characterData\" && m.oldValue.length > m.target.nodeValue.length))\n                    this.flushSoon();\n                else\n                    this.flush();\n            });\n        if (useCharData) {\n            this.onCharData = e => {\n                this.queue.push({ target: e.target, type: \"characterData\", oldValue: e.prevValue });\n                this.flushSoon();\n            };\n        }\n        this.onSelectionChange = this.onSelectionChange.bind(this);\n    }\n    flushSoon() {\n        if (this.flushingSoon < 0)\n            this.flushingSoon = window.setTimeout(() => { this.flushingSoon = -1; this.flush(); }, 20);\n    }\n    forceFlush() {\n        if (this.flushingSoon > -1) {\n            window.clearTimeout(this.flushingSoon);\n            this.flushingSoon = -1;\n            this.flush();\n        }\n    }\n    start() {\n        if (this.observer) {\n            this.observer.takeRecords();\n            this.observer.observe(this.view.dom, observeOptions);\n        }\n        if (this.onCharData)\n            this.view.dom.addEventListener(\"DOMCharacterDataModified\", this.onCharData);\n        this.connectSelection();\n    }\n    stop() {\n        if (this.observer) {\n            let take = this.observer.takeRecords();\n            if (take.length) {\n                for (let i = 0; i < take.length; i++)\n                    this.queue.push(take[i]);\n                window.setTimeout(() => this.flush(), 20);\n            }\n            this.observer.disconnect();\n        }\n        if (this.onCharData)\n            this.view.dom.removeEventListener(\"DOMCharacterDataModified\", this.onCharData);\n        this.disconnectSelection();\n    }\n    connectSelection() {\n        this.view.dom.ownerDocument.addEventListener(\"selectionchange\", this.onSelectionChange);\n    }\n    disconnectSelection() {\n        this.view.dom.ownerDocument.removeEventListener(\"selectionchange\", this.onSelectionChange);\n    }\n    suppressSelectionUpdates() {\n        this.suppressingSelectionUpdates = true;\n        setTimeout(() => this.suppressingSelectionUpdates = false, 50);\n    }\n    onSelectionChange() {\n        if (!hasFocusAndSelection(this.view))\n            return;\n        if (this.suppressingSelectionUpdates)\n            return selectionToDOM(this.view);\n        // Deletions on IE11 fire their events in the wrong order, giving\n        // us a selection change event before the DOM changes are\n        // reported.\n        if (ie && ie_version <= 11 && !this.view.state.selection.empty) {\n            let sel = this.view.domSelectionRange();\n            // Selection.isCollapsed isn't reliable on IE\n            if (sel.focusNode && isEquivalentPosition(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset))\n                return this.flushSoon();\n        }\n        this.flush();\n    }\n    setCurSelection() {\n        this.currentSelection.set(this.view.domSelectionRange());\n    }\n    ignoreSelectionChange(sel) {\n        if (!sel.focusNode)\n            return true;\n        let ancestors = new Set, container;\n        for (let scan = sel.focusNode; scan; scan = parentNode(scan))\n            ancestors.add(scan);\n        for (let scan = sel.anchorNode; scan; scan = parentNode(scan))\n            if (ancestors.has(scan)) {\n                container = scan;\n                break;\n            }\n        let desc = container && this.view.docView.nearestDesc(container);\n        if (desc && desc.ignoreMutation({\n            type: \"selection\",\n            target: container.nodeType == 3 ? container.parentNode : container\n        })) {\n            this.setCurSelection();\n            return true;\n        }\n    }\n    pendingRecords() {\n        if (this.observer)\n            for (let mut of this.observer.takeRecords())\n                this.queue.push(mut);\n        return this.queue;\n    }\n    flush() {\n        let { view } = this;\n        if (!view.docView || this.flushingSoon > -1)\n            return;\n        let mutations = this.pendingRecords();\n        if (mutations.length)\n            this.queue = [];\n        let sel = view.domSelectionRange();\n        let newSel = !this.suppressingSelectionUpdates && !this.currentSelection.eq(sel) && hasFocusAndSelection(view) && !this.ignoreSelectionChange(sel);\n        let from = -1, to = -1, typeOver = false, added = [];\n        if (view.editable) {\n            for (let i = 0; i < mutations.length; i++) {\n                let result = this.registerMutation(mutations[i], added);\n                if (result) {\n                    from = from < 0 ? result.from : Math.min(result.from, from);\n                    to = to < 0 ? result.to : Math.max(result.to, to);\n                    if (result.typeOver)\n                        typeOver = true;\n                }\n            }\n        }\n        if (gecko && added.length > 1) {\n            let brs = added.filter(n => n.nodeName == \"BR\");\n            if (brs.length == 2) {\n                let a = brs[0], b = brs[1];\n                if (a.parentNode && a.parentNode.parentNode == b.parentNode)\n                    b.remove();\n                else\n                    a.remove();\n            }\n        }\n        let readSel = null;\n        // If it looks like the browser has reset the selection to the\n        // start of the document after focus, restore the selection from\n        // the state\n        if (from < 0 && newSel && view.input.lastFocus > Date.now() - 200 &&\n            Math.max(view.input.lastTouch, view.input.lastClick.time) < Date.now() - 300 &&\n            selectionCollapsed(sel) && (readSel = selectionFromDOM(view)) &&\n            readSel.eq(Selection.near(view.state.doc.resolve(0), 1))) {\n            view.input.lastFocus = 0;\n            selectionToDOM(view);\n            this.currentSelection.set(sel);\n            view.scrollToSelection();\n        }\n        else if (from > -1 || newSel) {\n            if (from > -1) {\n                view.docView.markDirty(from, to);\n                checkCSS(view);\n            }\n            this.handleDOMChange(from, to, typeOver, added);\n            if (view.docView && view.docView.dirty)\n                view.updateState(view.state);\n            else if (!this.currentSelection.eq(sel))\n                selectionToDOM(view);\n            this.currentSelection.set(sel);\n        }\n    }\n    registerMutation(mut, added) {\n        // Ignore mutations inside nodes that were already noted as inserted\n        if (added.indexOf(mut.target) > -1)\n            return null;\n        let desc = this.view.docView.nearestDesc(mut.target);\n        if (mut.type == \"attributes\" &&\n            (desc == this.view.docView || mut.attributeName == \"contenteditable\" ||\n                // Firefox sometimes fires spurious events for null/empty styles\n                (mut.attributeName == \"style\" && !mut.oldValue && !mut.target.getAttribute(\"style\"))))\n            return null;\n        if (!desc || desc.ignoreMutation(mut))\n            return null;\n        if (mut.type == \"childList\") {\n            for (let i = 0; i < mut.addedNodes.length; i++)\n                added.push(mut.addedNodes[i]);\n            if (desc.contentDOM && desc.contentDOM != desc.dom && !desc.contentDOM.contains(mut.target))\n                return { from: desc.posBefore, to: desc.posAfter };\n            let prev = mut.previousSibling, next = mut.nextSibling;\n            if (ie && ie_version <= 11 && mut.addedNodes.length) {\n                // IE11 gives us incorrect next/prev siblings for some\n                // insertions, so if there are added nodes, recompute those\n                for (let i = 0; i < mut.addedNodes.length; i++) {\n                    let { previousSibling, nextSibling } = mut.addedNodes[i];\n                    if (!previousSibling || Array.prototype.indexOf.call(mut.addedNodes, previousSibling) < 0)\n                        prev = previousSibling;\n                    if (!nextSibling || Array.prototype.indexOf.call(mut.addedNodes, nextSibling) < 0)\n                        next = nextSibling;\n                }\n            }\n            let fromOffset = prev && prev.parentNode == mut.target\n                ? domIndex(prev) + 1 : 0;\n            let from = desc.localPosFromDOM(mut.target, fromOffset, -1);\n            let toOffset = next && next.parentNode == mut.target\n                ? domIndex(next) : mut.target.childNodes.length;\n            let to = desc.localPosFromDOM(mut.target, toOffset, 1);\n            return { from, to };\n        }\n        else if (mut.type == \"attributes\") {\n            return { from: desc.posAtStart - desc.border, to: desc.posAtEnd + desc.border };\n        }\n        else { // \"characterData\"\n            return {\n                from: desc.posAtStart,\n                to: desc.posAtEnd,\n                // An event was generated for a text change that didn't change\n                // any text. Mark the dom change to fall back to assuming the\n                // selection was typed over with an identical value if it can't\n                // find another change.\n                typeOver: mut.target.nodeValue == mut.oldValue\n            };\n        }\n    }\n}\nlet cssChecked = new WeakMap();\nlet cssCheckWarned = false;\nfunction checkCSS(view) {\n    if (cssChecked.has(view))\n        return;\n    cssChecked.set(view, null);\n    if (['normal', 'nowrap', 'pre-line'].indexOf(getComputedStyle(view.dom).whiteSpace) !== -1) {\n        view.requiresGeckoHackNode = gecko;\n        if (cssCheckWarned)\n            return;\n        console[\"warn\"](\"ProseMirror expects the CSS white-space property to be set, preferably to 'pre-wrap'. It is recommended to load style/prosemirror.css from the prosemirror-view package.\");\n        cssCheckWarned = true;\n    }\n}\nfunction rangeToSelectionRange(view, range) {\n    let anchorNode = range.startContainer, anchorOffset = range.startOffset;\n    let focusNode = range.endContainer, focusOffset = range.endOffset;\n    let currentAnchor = view.domAtPos(view.state.selection.anchor);\n    // Since such a range doesn't distinguish between anchor and head,\n    // use a heuristic that flips it around if its end matches the\n    // current anchor.\n    if (isEquivalentPosition(currentAnchor.node, currentAnchor.offset, focusNode, focusOffset))\n        [anchorNode, anchorOffset, focusNode, focusOffset] = [focusNode, focusOffset, anchorNode, anchorOffset];\n    return { anchorNode, anchorOffset, focusNode, focusOffset };\n}\n// Used to work around a Safari Selection/shadow DOM bug\n// Based on https://github.com/codemirror/dev/issues/414 fix\nfunction safariShadowSelectionRange(view, selection) {\n    if (selection.getComposedRanges) {\n        let range = selection.getComposedRanges(view.root)[0];\n        if (range)\n            return rangeToSelectionRange(view, range);\n    }\n    let found;\n    function read(event) {\n        event.preventDefault();\n        event.stopImmediatePropagation();\n        found = event.getTargetRanges()[0];\n    }\n    // Because Safari (at least in 2018-2022) doesn't provide regular\n    // access to the selection inside a shadowRoot, we have to perform a\n    // ridiculous hack to get at it—using `execCommand` to trigger a\n    // `beforeInput` event so that we can read the target range from the\n    // event.\n    view.dom.addEventListener(\"beforeinput\", read, true);\n    document.execCommand(\"indent\");\n    view.dom.removeEventListener(\"beforeinput\", read, true);\n    return found ? rangeToSelectionRange(view, found) : null;\n}\n\n// Note that all referencing and parsing is done with the\n// start-of-operation selection and document, since that's the one\n// that the DOM represents. If any changes came in in the meantime,\n// the modification is mapped over those before it is applied, in\n// readDOMChange.\nfunction parseBetween(view, from_, to_) {\n    let { node: parent, fromOffset, toOffset, from, to } = view.docView.parseRange(from_, to_);\n    let domSel = view.domSelectionRange();\n    let find;\n    let anchor = domSel.anchorNode;\n    if (anchor && view.dom.contains(anchor.nodeType == 1 ? anchor : anchor.parentNode)) {\n        find = [{ node: anchor, offset: domSel.anchorOffset }];\n        if (!selectionCollapsed(domSel))\n            find.push({ node: domSel.focusNode, offset: domSel.focusOffset });\n    }\n    // Work around issue in Chrome where backspacing sometimes replaces\n    // the deleted content with a random BR node (issues #799, #831)\n    if (chrome && view.input.lastKeyCode === 8) {\n        for (let off = toOffset; off > fromOffset; off--) {\n            let node = parent.childNodes[off - 1], desc = node.pmViewDesc;\n            if (node.nodeName == \"BR\" && !desc) {\n                toOffset = off;\n                break;\n            }\n            if (!desc || desc.size)\n                break;\n        }\n    }\n    let startDoc = view.state.doc;\n    let parser = view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n    let $from = startDoc.resolve(from);\n    let sel = null, doc = parser.parse(parent, {\n        topNode: $from.parent,\n        topMatch: $from.parent.contentMatchAt($from.index()),\n        topOpen: true,\n        from: fromOffset,\n        to: toOffset,\n        preserveWhitespace: $from.parent.type.whitespace == \"pre\" ? \"full\" : true,\n        findPositions: find,\n        ruleFromNode,\n        context: $from\n    });\n    if (find && find[0].pos != null) {\n        let anchor = find[0].pos, head = find[1] && find[1].pos;\n        if (head == null)\n            head = anchor;\n        sel = { anchor: anchor + from, head: head + from };\n    }\n    return { doc, sel, from, to };\n}\nfunction ruleFromNode(dom) {\n    let desc = dom.pmViewDesc;\n    if (desc) {\n        return desc.parseRule();\n    }\n    else if (dom.nodeName == \"BR\" && dom.parentNode) {\n        // Safari replaces the list item or table cell with a BR\n        // directly in the list node (?!) if you delete the last\n        // character in a list item or table cell (#708, #862)\n        if (safari && /^(ul|ol)$/i.test(dom.parentNode.nodeName)) {\n            let skip = document.createElement(\"div\");\n            skip.appendChild(document.createElement(\"li\"));\n            return { skip };\n        }\n        else if (dom.parentNode.lastChild == dom || safari && /^(tr|table)$/i.test(dom.parentNode.nodeName)) {\n            return { ignore: true };\n        }\n    }\n    else if (dom.nodeName == \"IMG\" && dom.getAttribute(\"mark-placeholder\")) {\n        return { ignore: true };\n    }\n    return null;\n}\nconst isInline = /^(a|abbr|acronym|b|bd[io]|big|br|button|cite|code|data(list)?|del|dfn|em|i|ins|kbd|label|map|mark|meter|output|q|ruby|s|samp|small|span|strong|su[bp]|time|u|tt|var)$/i;\nfunction readDOMChange(view, from, to, typeOver, addedNodes) {\n    let compositionID = view.input.compositionPendingChanges || (view.composing ? view.input.compositionID : 0);\n    view.input.compositionPendingChanges = 0;\n    if (from < 0) {\n        let origin = view.input.lastSelectionTime > Date.now() - 50 ? view.input.lastSelectionOrigin : null;\n        let newSel = selectionFromDOM(view, origin);\n        if (newSel && !view.state.selection.eq(newSel)) {\n            if (chrome && android &&\n                view.input.lastKeyCode === 13 && Date.now() - 100 < view.input.lastKeyCodeTime &&\n                view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\"))))\n                return;\n            let tr = view.state.tr.setSelection(newSel);\n            if (origin == \"pointer\")\n                tr.setMeta(\"pointer\", true);\n            else if (origin == \"key\")\n                tr.scrollIntoView();\n            if (compositionID)\n                tr.setMeta(\"composition\", compositionID);\n            view.dispatch(tr);\n        }\n        return;\n    }\n    let $before = view.state.doc.resolve(from);\n    let shared = $before.sharedDepth(to);\n    from = $before.before(shared + 1);\n    to = view.state.doc.resolve(to).after(shared + 1);\n    let sel = view.state.selection;\n    let parse = parseBetween(view, from, to);\n    let doc = view.state.doc, compare = doc.slice(parse.from, parse.to);\n    let preferredPos, preferredSide;\n    // Prefer anchoring to end when Backspace is pressed\n    if (view.input.lastKeyCode === 8 && Date.now() - 100 < view.input.lastKeyCodeTime) {\n        preferredPos = view.state.selection.to;\n        preferredSide = \"end\";\n    }\n    else {\n        preferredPos = view.state.selection.from;\n        preferredSide = \"start\";\n    }\n    view.input.lastKeyCode = null;\n    let change = findDiff(compare.content, parse.doc.content, parse.from, preferredPos, preferredSide);\n    if ((ios && view.input.lastIOSEnter > Date.now() - 225 || android) &&\n        addedNodes.some(n => n.nodeType == 1 && !isInline.test(n.nodeName)) &&\n        (!change || change.endA >= change.endB) &&\n        view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")))) {\n        view.input.lastIOSEnter = 0;\n        return;\n    }\n    if (!change) {\n        if (typeOver && sel instanceof TextSelection && !sel.empty && sel.$head.sameParent(sel.$anchor) &&\n            !view.composing && !(parse.sel && parse.sel.anchor != parse.sel.head)) {\n            change = { start: sel.from, endA: sel.to, endB: sel.to };\n        }\n        else {\n            if (parse.sel) {\n                let sel = resolveSelection(view, view.state.doc, parse.sel);\n                if (sel && !sel.eq(view.state.selection)) {\n                    let tr = view.state.tr.setSelection(sel);\n                    if (compositionID)\n                        tr.setMeta(\"composition\", compositionID);\n                    view.dispatch(tr);\n                }\n            }\n            return;\n        }\n    }\n    view.input.domChangeCount++;\n    // Handle the case where overwriting a selection by typing matches\n    // the start or end of the selected content, creating a change\n    // that's smaller than what was actually overwritten.\n    if (view.state.selection.from < view.state.selection.to &&\n        change.start == change.endB &&\n        view.state.selection instanceof TextSelection) {\n        if (change.start > view.state.selection.from && change.start <= view.state.selection.from + 2 &&\n            view.state.selection.from >= parse.from) {\n            change.start = view.state.selection.from;\n        }\n        else if (change.endA < view.state.selection.to && change.endA >= view.state.selection.to - 2 &&\n            view.state.selection.to <= parse.to) {\n            change.endB += (view.state.selection.to - change.endA);\n            change.endA = view.state.selection.to;\n        }\n    }\n    // IE11 will insert a non-breaking space _ahead_ of the space after\n    // the cursor space when adding a space before another space. When\n    // that happened, adjust the change to cover the space instead.\n    if (ie && ie_version <= 11 && change.endB == change.start + 1 &&\n        change.endA == change.start && change.start > parse.from &&\n        parse.doc.textBetween(change.start - parse.from - 1, change.start - parse.from + 1) == \" \\u00a0\") {\n        change.start--;\n        change.endA--;\n        change.endB--;\n    }\n    let $from = parse.doc.resolveNoCache(change.start - parse.from);\n    let $to = parse.doc.resolveNoCache(change.endB - parse.from);\n    let $fromA = doc.resolve(change.start);\n    let inlineChange = $from.sameParent($to) && $from.parent.inlineContent && $fromA.end() >= change.endA;\n    let nextSel;\n    // If this looks like the effect of pressing Enter (or was recorded\n    // as being an iOS enter press), just dispatch an Enter key instead.\n    if (((ios && view.input.lastIOSEnter > Date.now() - 225 &&\n        (!inlineChange || addedNodes.some(n => n.nodeName == \"DIV\" || n.nodeName == \"P\"))) ||\n        (!inlineChange && $from.pos < parse.doc.content.size && !$from.sameParent($to) &&\n            (nextSel = Selection.findFrom(parse.doc.resolve($from.pos + 1), 1, true)) &&\n            nextSel.head == $to.pos)) &&\n        view.someProp(\"handleKeyDown\", f => f(view, keyEvent(13, \"Enter\")))) {\n        view.input.lastIOSEnter = 0;\n        return;\n    }\n    // Same for backspace\n    if (view.state.selection.anchor > change.start &&\n        looksLikeBackspace(doc, change.start, change.endA, $from, $to) &&\n        view.someProp(\"handleKeyDown\", f => f(view, keyEvent(8, \"Backspace\")))) {\n        if (android && chrome)\n            view.domObserver.suppressSelectionUpdates(); // #820\n        return;\n    }\n    // Chrome Android will occasionally, during composition, delete the\n    // entire composition and then immediately insert it again. This is\n    // used to detect that situation.\n    if (chrome && android && change.endB == change.start)\n        view.input.lastAndroidDelete = Date.now();\n    // This tries to detect Android virtual keyboard\n    // enter-and-pick-suggestion action. That sometimes (see issue\n    // #1059) first fires a DOM mutation, before moving the selection to\n    // the newly created block. And then, because ProseMirror cleans up\n    // the DOM selection, it gives up moving the selection entirely,\n    // leaving the cursor in the wrong place. When that happens, we drop\n    // the new paragraph from the initial change, and fire a simulated\n    // enter key afterwards.\n    if (android && !inlineChange && $from.start() != $to.start() && $to.parentOffset == 0 && $from.depth == $to.depth &&\n        parse.sel && parse.sel.anchor == parse.sel.head && parse.sel.head == change.endA) {\n        change.endB -= 2;\n        $to = parse.doc.resolveNoCache(change.endB - parse.from);\n        setTimeout(() => {\n            view.someProp(\"handleKeyDown\", function (f) { return f(view, keyEvent(13, \"Enter\")); });\n        }, 20);\n    }\n    let chFrom = change.start, chTo = change.endA;\n    let tr, storedMarks, markChange;\n    if (inlineChange) {\n        if ($from.pos == $to.pos) { // Deletion\n            // IE11 sometimes weirdly moves the DOM selection around after\n            // backspacing out the first element in a textblock\n            if (ie && ie_version <= 11 && $from.parentOffset == 0) {\n                view.domObserver.suppressSelectionUpdates();\n                setTimeout(() => selectionToDOM(view), 20);\n            }\n            tr = view.state.tr.delete(chFrom, chTo);\n            storedMarks = doc.resolve(change.start).marksAcross(doc.resolve(change.endA));\n        }\n        else if ( // Adding or removing a mark\n        change.endA == change.endB &&\n            (markChange = isMarkChange($from.parent.content.cut($from.parentOffset, $to.parentOffset), $fromA.parent.content.cut($fromA.parentOffset, change.endA - $fromA.start())))) {\n            tr = view.state.tr;\n            if (markChange.type == \"add\")\n                tr.addMark(chFrom, chTo, markChange.mark);\n            else\n                tr.removeMark(chFrom, chTo, markChange.mark);\n        }\n        else if ($from.parent.child($from.index()).isText && $from.index() == $to.index() - ($to.textOffset ? 0 : 1)) {\n            // Both positions in the same text node -- simply insert text\n            let text = $from.parent.textBetween($from.parentOffset, $to.parentOffset);\n            if (view.someProp(\"handleTextInput\", f => f(view, chFrom, chTo, text)))\n                return;\n            tr = view.state.tr.insertText(text, chFrom, chTo);\n        }\n    }\n    if (!tr)\n        tr = view.state.tr.replace(chFrom, chTo, parse.doc.slice(change.start - parse.from, change.endB - parse.from));\n    if (parse.sel) {\n        let sel = resolveSelection(view, tr.doc, parse.sel);\n        // Chrome Android will sometimes, during composition, report the\n        // selection in the wrong place. If it looks like that is\n        // happening, don't update the selection.\n        // Edge just doesn't move the cursor forward when you start typing\n        // in an empty block or between br nodes.\n        if (sel && !(chrome && android && view.composing && sel.empty &&\n            (change.start != change.endB || view.input.lastAndroidDelete < Date.now() - 100) &&\n            (sel.head == chFrom || sel.head == tr.mapping.map(chTo) - 1) ||\n            ie && sel.empty && sel.head == chFrom))\n            tr.setSelection(sel);\n    }\n    if (storedMarks)\n        tr.ensureMarks(storedMarks);\n    if (compositionID)\n        tr.setMeta(\"composition\", compositionID);\n    view.dispatch(tr.scrollIntoView());\n}\nfunction resolveSelection(view, doc, parsedSel) {\n    if (Math.max(parsedSel.anchor, parsedSel.head) > doc.content.size)\n        return null;\n    return selectionBetween(view, doc.resolve(parsedSel.anchor), doc.resolve(parsedSel.head));\n}\n// Given two same-length, non-empty fragments of inline content,\n// determine whether the first could be created from the second by\n// removing or adding a single mark type.\nfunction isMarkChange(cur, prev) {\n    let curMarks = cur.firstChild.marks, prevMarks = prev.firstChild.marks;\n    let added = curMarks, removed = prevMarks, type, mark, update;\n    for (let i = 0; i < prevMarks.length; i++)\n        added = prevMarks[i].removeFromSet(added);\n    for (let i = 0; i < curMarks.length; i++)\n        removed = curMarks[i].removeFromSet(removed);\n    if (added.length == 1 && removed.length == 0) {\n        mark = added[0];\n        type = \"add\";\n        update = (node) => node.mark(mark.addToSet(node.marks));\n    }\n    else if (added.length == 0 && removed.length == 1) {\n        mark = removed[0];\n        type = \"remove\";\n        update = (node) => node.mark(mark.removeFromSet(node.marks));\n    }\n    else {\n        return null;\n    }\n    let updated = [];\n    for (let i = 0; i < prev.childCount; i++)\n        updated.push(update(prev.child(i)));\n    if (Fragment.from(updated).eq(cur))\n        return { mark, type };\n}\nfunction looksLikeBackspace(old, start, end, $newStart, $newEnd) {\n    if ( // The content must have shrunk\n    end - start <= $newEnd.pos - $newStart.pos ||\n        // newEnd must point directly at or after the end of the block that newStart points into\n        skipClosingAndOpening($newStart, true, false) < $newEnd.pos)\n        return false;\n    let $start = old.resolve(start);\n    // Handle the case where, rather than joining blocks, the change just removed an entire block\n    if (!$newStart.parent.isTextblock) {\n        let after = $start.nodeAfter;\n        return after != null && end == start + after.nodeSize;\n    }\n    // Start must be at the end of a block\n    if ($start.parentOffset < $start.parent.content.size || !$start.parent.isTextblock)\n        return false;\n    let $next = old.resolve(skipClosingAndOpening($start, true, true));\n    // The next textblock must start before end and end near it\n    if (!$next.parent.isTextblock || $next.pos > end ||\n        skipClosingAndOpening($next, true, false) < end)\n        return false;\n    // The fragments after the join point must match\n    return $newStart.parent.content.cut($newStart.parentOffset).eq($next.parent.content);\n}\nfunction skipClosingAndOpening($pos, fromEnd, mayOpen) {\n    let depth = $pos.depth, end = fromEnd ? $pos.end() : $pos.pos;\n    while (depth > 0 && (fromEnd || $pos.indexAfter(depth) == $pos.node(depth).childCount)) {\n        depth--;\n        end++;\n        fromEnd = false;\n    }\n    if (mayOpen) {\n        let next = $pos.node(depth).maybeChild($pos.indexAfter(depth));\n        while (next && !next.isLeaf) {\n            next = next.firstChild;\n            end++;\n        }\n    }\n    return end;\n}\nfunction findDiff(a, b, pos, preferredPos, preferredSide) {\n    let start = a.findDiffStart(b, pos);\n    if (start == null)\n        return null;\n    let { a: endA, b: endB } = a.findDiffEnd(b, pos + a.size, pos + b.size);\n    if (preferredSide == \"end\") {\n        let adjust = Math.max(0, start - Math.min(endA, endB));\n        preferredPos -= endA + adjust - start;\n    }\n    if (endA < start && a.size < b.size) {\n        let move = preferredPos <= start && preferredPos >= endA ? start - preferredPos : 0;\n        start -= move;\n        if (start && start < b.size && isSurrogatePair(b.textBetween(start - 1, start + 1)))\n            start += move ? 1 : -1;\n        endB = start + (endB - endA);\n        endA = start;\n    }\n    else if (endB < start) {\n        let move = preferredPos <= start && preferredPos >= endB ? start - preferredPos : 0;\n        start -= move;\n        if (start && start < a.size && isSurrogatePair(a.textBetween(start - 1, start + 1)))\n            start += move ? 1 : -1;\n        endA = start + (endA - endB);\n        endB = start;\n    }\n    return { start, endA, endB };\n}\nfunction isSurrogatePair(str) {\n    if (str.length != 2)\n        return false;\n    let a = str.charCodeAt(0), b = str.charCodeAt(1);\n    return a >= 0xDC00 && a <= 0xDFFF && b >= 0xD800 && b <= 0xDBFF;\n}\n\n/**\n@internal\n*/\nconst __serializeForClipboard = serializeForClipboard;\n/**\n@internal\n*/\nconst __parseFromClipboard = parseFromClipboard;\n/**\n@internal\n*/\nconst __endComposition = endComposition;\n/**\nAn editor view manages the DOM structure that represents an\neditable document. Its state and behavior are determined by its\n[props](https://prosemirror.net/docs/ref/#view.DirectEditorProps).\n*/\nclass EditorView {\n    /**\n    Create a view. `place` may be a DOM node that the editor should\n    be appended to, a function that will place it into the document,\n    or an object whose `mount` property holds the node to use as the\n    document container. If it is `null`, the editor will not be\n    added to the document.\n    */\n    constructor(place, props) {\n        this._root = null;\n        /**\n        @internal\n        */\n        this.focused = false;\n        /**\n        Kludge used to work around a Chrome bug @internal\n        */\n        this.trackWrites = null;\n        this.mounted = false;\n        /**\n        @internal\n        */\n        this.markCursor = null;\n        /**\n        @internal\n        */\n        this.cursorWrapper = null;\n        /**\n        @internal\n        */\n        this.lastSelectedViewDesc = undefined;\n        /**\n        @internal\n        */\n        this.input = new InputState;\n        this.prevDirectPlugins = [];\n        this.pluginViews = [];\n        /**\n        Holds `true` when a hack node is needed in Firefox to prevent the\n        [space is eaten issue](https://github.com/ProseMirror/prosemirror/issues/651)\n        @internal\n        */\n        this.requiresGeckoHackNode = false;\n        /**\n        When editor content is being dragged, this object contains\n        information about the dragged slice and whether it is being\n        copied or moved. At any other time, it is null.\n        */\n        this.dragging = null;\n        this._props = props;\n        this.state = props.state;\n        this.directPlugins = props.plugins || [];\n        this.directPlugins.forEach(checkStateComponent);\n        this.dispatch = this.dispatch.bind(this);\n        this.dom = (place && place.mount) || document.createElement(\"div\");\n        if (place) {\n            if (place.appendChild)\n                place.appendChild(this.dom);\n            else if (typeof place == \"function\")\n                place(this.dom);\n            else if (place.mount)\n                this.mounted = true;\n        }\n        this.editable = getEditable(this);\n        updateCursorWrapper(this);\n        this.nodeViews = buildNodeViews(this);\n        this.docView = docViewDesc(this.state.doc, computeDocDeco(this), viewDecorations(this), this.dom, this);\n        this.domObserver = new DOMObserver(this, (from, to, typeOver, added) => readDOMChange(this, from, to, typeOver, added));\n        this.domObserver.start();\n        initInput(this);\n        this.updatePluginViews();\n    }\n    /**\n    Holds `true` when a\n    [composition](https://w3c.github.io/uievents/#events-compositionevents)\n    is active.\n    */\n    get composing() { return this.input.composing; }\n    /**\n    The view's current [props](https://prosemirror.net/docs/ref/#view.EditorProps).\n    */\n    get props() {\n        if (this._props.state != this.state) {\n            let prev = this._props;\n            this._props = {};\n            for (let name in prev)\n                this._props[name] = prev[name];\n            this._props.state = this.state;\n        }\n        return this._props;\n    }\n    /**\n    Update the view's props. Will immediately cause an update to\n    the DOM.\n    */\n    update(props) {\n        if (props.handleDOMEvents != this._props.handleDOMEvents)\n            ensureListeners(this);\n        let prevProps = this._props;\n        this._props = props;\n        if (props.plugins) {\n            props.plugins.forEach(checkStateComponent);\n            this.directPlugins = props.plugins;\n        }\n        this.updateStateInner(props.state, prevProps);\n    }\n    /**\n    Update the view by updating existing props object with the object\n    given as argument. Equivalent to `view.update(Object.assign({},\n    view.props, props))`.\n    */\n    setProps(props) {\n        let updated = {};\n        for (let name in this._props)\n            updated[name] = this._props[name];\n        updated.state = this.state;\n        for (let name in props)\n            updated[name] = props[name];\n        this.update(updated);\n    }\n    /**\n    Update the editor's `state` prop, without touching any of the\n    other props.\n    */\n    updateState(state) {\n        this.updateStateInner(state, this._props);\n    }\n    updateStateInner(state, prevProps) {\n        var _a;\n        let prev = this.state, redraw = false, updateSel = false;\n        // When stored marks are added, stop composition, so that they can\n        // be displayed.\n        if (state.storedMarks && this.composing) {\n            clearComposition(this);\n            updateSel = true;\n        }\n        this.state = state;\n        let pluginsChanged = prev.plugins != state.plugins || this._props.plugins != prevProps.plugins;\n        if (pluginsChanged || this._props.plugins != prevProps.plugins || this._props.nodeViews != prevProps.nodeViews) {\n            let nodeViews = buildNodeViews(this);\n            if (changedNodeViews(nodeViews, this.nodeViews)) {\n                this.nodeViews = nodeViews;\n                redraw = true;\n            }\n        }\n        if (pluginsChanged || prevProps.handleDOMEvents != this._props.handleDOMEvents) {\n            ensureListeners(this);\n        }\n        this.editable = getEditable(this);\n        updateCursorWrapper(this);\n        let innerDeco = viewDecorations(this), outerDeco = computeDocDeco(this);\n        let scroll = prev.plugins != state.plugins && !prev.doc.eq(state.doc) ? \"reset\"\n            : state.scrollToSelection > prev.scrollToSelection ? \"to selection\" : \"preserve\";\n        let updateDoc = redraw || !this.docView.matchesNode(state.doc, outerDeco, innerDeco);\n        if (updateDoc || !state.selection.eq(prev.selection))\n            updateSel = true;\n        let oldScrollPos = scroll == \"preserve\" && updateSel && this.dom.style.overflowAnchor == null && storeScrollPos(this);\n        if (updateSel) {\n            this.domObserver.stop();\n            // Work around an issue in Chrome, IE, and Edge where changing\n            // the DOM around an active selection puts it into a broken\n            // state where the thing the user sees differs from the\n            // selection reported by the Selection object (#710, #973,\n            // #1011, #1013, #1035).\n            let forceSelUpdate = updateDoc && (ie || chrome) && !this.composing &&\n                !prev.selection.empty && !state.selection.empty && selectionContextChanged(prev.selection, state.selection);\n            if (updateDoc) {\n                // If the node that the selection points into is written to,\n                // Chrome sometimes starts misreporting the selection, so this\n                // tracks that and forces a selection reset when our update\n                // did write to the node.\n                let chromeKludge = chrome ? (this.trackWrites = this.domSelectionRange().focusNode) : null;\n                if (this.composing)\n                    this.input.compositionNode = findCompositionNode(this);\n                if (redraw || !this.docView.update(state.doc, outerDeco, innerDeco, this)) {\n                    this.docView.updateOuterDeco(outerDeco);\n                    this.docView.destroy();\n                    this.docView = docViewDesc(state.doc, outerDeco, innerDeco, this.dom, this);\n                }\n                if (chromeKludge && !this.trackWrites)\n                    forceSelUpdate = true;\n            }\n            // Work around for an issue where an update arriving right between\n            // a DOM selection change and the \"selectionchange\" event for it\n            // can cause a spurious DOM selection update, disrupting mouse\n            // drag selection.\n            if (forceSelUpdate ||\n                !(this.input.mouseDown && this.domObserver.currentSelection.eq(this.domSelectionRange()) &&\n                    anchorInRightPlace(this))) {\n                selectionToDOM(this, forceSelUpdate);\n            }\n            else {\n                syncNodeSelection(this, state.selection);\n                this.domObserver.setCurSelection();\n            }\n            this.domObserver.start();\n        }\n        this.updatePluginViews(prev);\n        if (((_a = this.dragging) === null || _a === void 0 ? void 0 : _a.node) && !prev.doc.eq(state.doc))\n            this.updateDraggedNode(this.dragging, prev);\n        if (scroll == \"reset\") {\n            this.dom.scrollTop = 0;\n        }\n        else if (scroll == \"to selection\") {\n            this.scrollToSelection();\n        }\n        else if (oldScrollPos) {\n            resetScrollPos(oldScrollPos);\n        }\n    }\n    /**\n    @internal\n    */\n    scrollToSelection() {\n        let startDOM = this.domSelectionRange().focusNode;\n        if (this.someProp(\"handleScrollToSelection\", f => f(this))) ;\n        else if (this.state.selection instanceof NodeSelection) {\n            let target = this.docView.domAfterPos(this.state.selection.from);\n            if (target.nodeType == 1)\n                scrollRectIntoView(this, target.getBoundingClientRect(), startDOM);\n        }\n        else {\n            scrollRectIntoView(this, this.coordsAtPos(this.state.selection.head, 1), startDOM);\n        }\n    }\n    destroyPluginViews() {\n        let view;\n        while (view = this.pluginViews.pop())\n            if (view.destroy)\n                view.destroy();\n    }\n    updatePluginViews(prevState) {\n        if (!prevState || prevState.plugins != this.state.plugins || this.directPlugins != this.prevDirectPlugins) {\n            this.prevDirectPlugins = this.directPlugins;\n            this.destroyPluginViews();\n            for (let i = 0; i < this.directPlugins.length; i++) {\n                let plugin = this.directPlugins[i];\n                if (plugin.spec.view)\n                    this.pluginViews.push(plugin.spec.view(this));\n            }\n            for (let i = 0; i < this.state.plugins.length; i++) {\n                let plugin = this.state.plugins[i];\n                if (plugin.spec.view)\n                    this.pluginViews.push(plugin.spec.view(this));\n            }\n        }\n        else {\n            for (let i = 0; i < this.pluginViews.length; i++) {\n                let pluginView = this.pluginViews[i];\n                if (pluginView.update)\n                    pluginView.update(this, prevState);\n            }\n        }\n    }\n    updateDraggedNode(dragging, prev) {\n        let sel = dragging.node, found = -1;\n        if (this.state.doc.nodeAt(sel.from) == sel.node) {\n            found = sel.from;\n        }\n        else {\n            let movedPos = sel.from + (this.state.doc.content.size - prev.doc.content.size);\n            let moved = movedPos > 0 && this.state.doc.nodeAt(movedPos);\n            if (moved == sel.node)\n                found = movedPos;\n        }\n        this.dragging = new Dragging(dragging.slice, dragging.move, found < 0 ? undefined : NodeSelection.create(this.state.doc, found));\n    }\n    someProp(propName, f) {\n        let prop = this._props && this._props[propName], value;\n        if (prop != null && (value = f ? f(prop) : prop))\n            return value;\n        for (let i = 0; i < this.directPlugins.length; i++) {\n            let prop = this.directPlugins[i].props[propName];\n            if (prop != null && (value = f ? f(prop) : prop))\n                return value;\n        }\n        let plugins = this.state.plugins;\n        if (plugins)\n            for (let i = 0; i < plugins.length; i++) {\n                let prop = plugins[i].props[propName];\n                if (prop != null && (value = f ? f(prop) : prop))\n                    return value;\n            }\n    }\n    /**\n    Query whether the view has focus.\n    */\n    hasFocus() {\n        // Work around IE not handling focus correctly if resize handles are shown.\n        // If the cursor is inside an element with resize handles, activeElement\n        // will be that element instead of this.dom.\n        if (ie) {\n            // If activeElement is within this.dom, and there are no other elements\n            // setting `contenteditable` to false in between, treat it as focused.\n            let node = this.root.activeElement;\n            if (node == this.dom)\n                return true;\n            if (!node || !this.dom.contains(node))\n                return false;\n            while (node && this.dom != node && this.dom.contains(node)) {\n                if (node.contentEditable == 'false')\n                    return false;\n                node = node.parentElement;\n            }\n            return true;\n        }\n        return this.root.activeElement == this.dom;\n    }\n    /**\n    Focus the editor.\n    */\n    focus() {\n        this.domObserver.stop();\n        if (this.editable)\n            focusPreventScroll(this.dom);\n        selectionToDOM(this);\n        this.domObserver.start();\n    }\n    /**\n    Get the document root in which the editor exists. This will\n    usually be the top-level `document`, but might be a [shadow\n    DOM](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Shadow_DOM)\n    root if the editor is inside one.\n    */\n    get root() {\n        let cached = this._root;\n        if (cached == null)\n            for (let search = this.dom.parentNode; search; search = search.parentNode) {\n                if (search.nodeType == 9 || (search.nodeType == 11 && search.host)) {\n                    if (!search.getSelection)\n                        Object.getPrototypeOf(search).getSelection = () => search.ownerDocument.getSelection();\n                    return this._root = search;\n                }\n            }\n        return cached || document;\n    }\n    /**\n    When an existing editor view is moved to a new document or\n    shadow tree, call this to make it recompute its root.\n    */\n    updateRoot() {\n        this._root = null;\n    }\n    /**\n    Given a pair of viewport coordinates, return the document\n    position that corresponds to them. May return null if the given\n    coordinates aren't inside of the editor. When an object is\n    returned, its `pos` property is the position nearest to the\n    coordinates, and its `inside` property holds the position of the\n    inner node that the position falls inside of, or -1 if it is at\n    the top level, not in any node.\n    */\n    posAtCoords(coords) {\n        return posAtCoords(this, coords);\n    }\n    /**\n    Returns the viewport rectangle at a given document position.\n    `left` and `right` will be the same number, as this returns a\n    flat cursor-ish rectangle. If the position is between two things\n    that aren't directly adjacent, `side` determines which element\n    is used. When < 0, the element before the position is used,\n    otherwise the element after.\n    */\n    coordsAtPos(pos, side = 1) {\n        return coordsAtPos(this, pos, side);\n    }\n    /**\n    Find the DOM position that corresponds to the given document\n    position. When `side` is negative, find the position as close as\n    possible to the content before the position. When positive,\n    prefer positions close to the content after the position. When\n    zero, prefer as shallow a position as possible.\n    \n    Note that you should **not** mutate the editor's internal DOM,\n    only inspect it (and even that is usually not necessary).\n    */\n    domAtPos(pos, side = 0) {\n        return this.docView.domFromPos(pos, side);\n    }\n    /**\n    Find the DOM node that represents the document node after the\n    given position. May return `null` when the position doesn't point\n    in front of a node or if the node is inside an opaque node view.\n    \n    This is intended to be able to call things like\n    `getBoundingClientRect` on that DOM node. Do **not** mutate the\n    editor DOM directly, or add styling this way, since that will be\n    immediately overriden by the editor as it redraws the node.\n    */\n    nodeDOM(pos) {\n        let desc = this.docView.descAt(pos);\n        return desc ? desc.nodeDOM : null;\n    }\n    /**\n    Find the document position that corresponds to a given DOM\n    position. (Whenever possible, it is preferable to inspect the\n    document structure directly, rather than poking around in the\n    DOM, but sometimes—for example when interpreting an event\n    target—you don't have a choice.)\n    \n    The `bias` parameter can be used to influence which side of a DOM\n    node to use when the position is inside a leaf node.\n    */\n    posAtDOM(node, offset, bias = -1) {\n        let pos = this.docView.posFromDOM(node, offset, bias);\n        if (pos == null)\n            throw new RangeError(\"DOM position not inside the editor\");\n        return pos;\n    }\n    /**\n    Find out whether the selection is at the end of a textblock when\n    moving in a given direction. When, for example, given `\"left\"`,\n    it will return true if moving left from the current cursor\n    position would leave that position's parent textblock. Will apply\n    to the view's current state by default, but it is possible to\n    pass a different state.\n    */\n    endOfTextblock(dir, state) {\n        return endOfTextblock(this, state || this.state, dir);\n    }\n    /**\n    Run the editor's paste logic with the given HTML string. The\n    `event`, if given, will be passed to the\n    [`handlePaste`](https://prosemirror.net/docs/ref/#view.EditorProps.handlePaste) hook.\n    */\n    pasteHTML(html, event) {\n        return doPaste(this, \"\", html, false, event || new ClipboardEvent(\"paste\"));\n    }\n    /**\n    Run the editor's paste logic with the given plain-text input.\n    */\n    pasteText(text, event) {\n        return doPaste(this, text, null, true, event || new ClipboardEvent(\"paste\"));\n    }\n    /**\n    Removes the editor from the DOM and destroys all [node\n    views](https://prosemirror.net/docs/ref/#view.NodeView).\n    */\n    destroy() {\n        if (!this.docView)\n            return;\n        destroyInput(this);\n        this.destroyPluginViews();\n        if (this.mounted) {\n            this.docView.update(this.state.doc, [], viewDecorations(this), this);\n            this.dom.textContent = \"\";\n        }\n        else if (this.dom.parentNode) {\n            this.dom.parentNode.removeChild(this.dom);\n        }\n        this.docView.destroy();\n        this.docView = null;\n        clearReusedRange();\n    }\n    /**\n    This is true when the view has been\n    [destroyed](https://prosemirror.net/docs/ref/#view.EditorView.destroy) (and thus should not be\n    used anymore).\n    */\n    get isDestroyed() {\n        return this.docView == null;\n    }\n    /**\n    Used for testing.\n    */\n    dispatchEvent(event) {\n        return dispatchEvent(this, event);\n    }\n    /**\n    Dispatch a transaction. Will call\n    [`dispatchTransaction`](https://prosemirror.net/docs/ref/#view.DirectEditorProps.dispatchTransaction)\n    when given, and otherwise defaults to applying the transaction to\n    the current state and calling\n    [`updateState`](https://prosemirror.net/docs/ref/#view.EditorView.updateState) with the result.\n    This method is bound to the view instance, so that it can be\n    easily passed around.\n    */\n    dispatch(tr) {\n        let dispatchTransaction = this._props.dispatchTransaction;\n        if (dispatchTransaction)\n            dispatchTransaction.call(this, tr);\n        else\n            this.updateState(this.state.apply(tr));\n    }\n    /**\n    @internal\n    */\n    domSelectionRange() {\n        let sel = this.domSelection();\n        return safari && this.root.nodeType === 11 &&\n            deepActiveElement(this.dom.ownerDocument) == this.dom && safariShadowSelectionRange(this, sel) || sel;\n    }\n    /**\n    @internal\n    */\n    domSelection() {\n        return this.root.getSelection();\n    }\n}\nfunction computeDocDeco(view) {\n    let attrs = Object.create(null);\n    attrs.class = \"ProseMirror\";\n    attrs.contenteditable = String(view.editable);\n    view.someProp(\"attributes\", value => {\n        if (typeof value == \"function\")\n            value = value(view.state);\n        if (value)\n            for (let attr in value) {\n                if (attr == \"class\")\n                    attrs.class += \" \" + value[attr];\n                else if (attr == \"style\")\n                    attrs.style = (attrs.style ? attrs.style + \";\" : \"\") + value[attr];\n                else if (!attrs[attr] && attr != \"contenteditable\" && attr != \"nodeName\")\n                    attrs[attr] = String(value[attr]);\n            }\n    });\n    if (!attrs.translate)\n        attrs.translate = \"no\";\n    return [Decoration.node(0, view.state.doc.content.size, attrs)];\n}\nfunction updateCursorWrapper(view) {\n    if (view.markCursor) {\n        let dom = document.createElement(\"img\");\n        dom.className = \"ProseMirror-separator\";\n        dom.setAttribute(\"mark-placeholder\", \"true\");\n        dom.setAttribute(\"alt\", \"\");\n        view.cursorWrapper = { dom, deco: Decoration.widget(view.state.selection.head, dom, { raw: true, marks: view.markCursor }) };\n    }\n    else {\n        view.cursorWrapper = null;\n    }\n}\nfunction getEditable(view) {\n    return !view.someProp(\"editable\", value => value(view.state) === false);\n}\nfunction selectionContextChanged(sel1, sel2) {\n    let depth = Math.min(sel1.$anchor.sharedDepth(sel1.head), sel2.$anchor.sharedDepth(sel2.head));\n    return sel1.$anchor.start(depth) != sel2.$anchor.start(depth);\n}\nfunction buildNodeViews(view) {\n    let result = Object.create(null);\n    function add(obj) {\n        for (let prop in obj)\n            if (!Object.prototype.hasOwnProperty.call(result, prop))\n                result[prop] = obj[prop];\n    }\n    view.someProp(\"nodeViews\", add);\n    view.someProp(\"markViews\", add);\n    return result;\n}\nfunction changedNodeViews(a, b) {\n    let nA = 0, nB = 0;\n    for (let prop in a) {\n        if (a[prop] != b[prop])\n            return true;\n        nA++;\n    }\n    for (let _ in b)\n        nB++;\n    return nA != nB;\n}\nfunction checkStateComponent(plugin) {\n    if (plugin.spec.state || plugin.spec.filterTransaction || plugin.spec.appendTransaction)\n        throw new RangeError(\"Plugins passed directly to the view must not have a state component\");\n}\n\nexport { Decoration, DecorationSet, EditorView, __endComposition, __parseFromClipboard, __serializeForClipboard };\n","import { keydownHandler } from 'prosemirror-keymap';\nimport { Selection, NodeSelection, TextSelection, Plugin } from 'prosemirror-state';\nimport { Slice, Fragment } from 'prosemirror-model';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\n\n/**\nGap cursor selections are represented using this class. Its\n`$anchor` and `$head` properties both point at the cursor position.\n*/\nclass GapCursor extends Selection {\n    /**\n    Create a gap cursor.\n    */\n    constructor($pos) {\n        super($pos, $pos);\n    }\n    map(doc, mapping) {\n        let $pos = doc.resolve(mapping.map(this.head));\n        return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos);\n    }\n    content() { return Slice.empty; }\n    eq(other) {\n        return other instanceof GapCursor && other.head == this.head;\n    }\n    toJSON() {\n        return { type: \"gapcursor\", pos: this.head };\n    }\n    /**\n    @internal\n    */\n    static fromJSON(doc, json) {\n        if (typeof json.pos != \"number\")\n            throw new RangeError(\"Invalid input for GapCursor.fromJSON\");\n        return new GapCursor(doc.resolve(json.pos));\n    }\n    /**\n    @internal\n    */\n    getBookmark() { return new GapBookmark(this.anchor); }\n    /**\n    @internal\n    */\n    static valid($pos) {\n        let parent = $pos.parent;\n        if (parent.isTextblock || !closedBefore($pos) || !closedAfter($pos))\n            return false;\n        let override = parent.type.spec.allowGapCursor;\n        if (override != null)\n            return override;\n        let deflt = parent.contentMatchAt($pos.index()).defaultType;\n        return deflt && deflt.isTextblock;\n    }\n    /**\n    @internal\n    */\n    static findGapCursorFrom($pos, dir, mustMove = false) {\n        search: for (;;) {\n            if (!mustMove && GapCursor.valid($pos))\n                return $pos;\n            let pos = $pos.pos, next = null;\n            // Scan up from this position\n            for (let d = $pos.depth;; d--) {\n                let parent = $pos.node(d);\n                if (dir > 0 ? $pos.indexAfter(d) < parent.childCount : $pos.index(d) > 0) {\n                    next = parent.child(dir > 0 ? $pos.indexAfter(d) : $pos.index(d) - 1);\n                    break;\n                }\n                else if (d == 0) {\n                    return null;\n                }\n                pos += dir;\n                let $cur = $pos.doc.resolve(pos);\n                if (GapCursor.valid($cur))\n                    return $cur;\n            }\n            // And then down into the next node\n            for (;;) {\n                let inside = dir > 0 ? next.firstChild : next.lastChild;\n                if (!inside) {\n                    if (next.isAtom && !next.isText && !NodeSelection.isSelectable(next)) {\n                        $pos = $pos.doc.resolve(pos + next.nodeSize * dir);\n                        mustMove = false;\n                        continue search;\n                    }\n                    break;\n                }\n                next = inside;\n                pos += dir;\n                let $cur = $pos.doc.resolve(pos);\n                if (GapCursor.valid($cur))\n                    return $cur;\n            }\n            return null;\n        }\n    }\n}\nGapCursor.prototype.visible = false;\nGapCursor.findFrom = GapCursor.findGapCursorFrom;\nSelection.jsonID(\"gapcursor\", GapCursor);\nclass GapBookmark {\n    constructor(pos) {\n        this.pos = pos;\n    }\n    map(mapping) {\n        return new GapBookmark(mapping.map(this.pos));\n    }\n    resolve(doc) {\n        let $pos = doc.resolve(this.pos);\n        return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos);\n    }\n}\nfunction closedBefore($pos) {\n    for (let d = $pos.depth; d >= 0; d--) {\n        let index = $pos.index(d), parent = $pos.node(d);\n        // At the start of this parent, look at next one\n        if (index == 0) {\n            if (parent.type.spec.isolating)\n                return true;\n            continue;\n        }\n        // See if the node before (or its first ancestor) is closed\n        for (let before = parent.child(index - 1);; before = before.lastChild) {\n            if ((before.childCount == 0 && !before.inlineContent) || before.isAtom || before.type.spec.isolating)\n                return true;\n            if (before.inlineContent)\n                return false;\n        }\n    }\n    // Hit start of document\n    return true;\n}\nfunction closedAfter($pos) {\n    for (let d = $pos.depth; d >= 0; d--) {\n        let index = $pos.indexAfter(d), parent = $pos.node(d);\n        if (index == parent.childCount) {\n            if (parent.type.spec.isolating)\n                return true;\n            continue;\n        }\n        for (let after = parent.child(index);; after = after.firstChild) {\n            if ((after.childCount == 0 && !after.inlineContent) || after.isAtom || after.type.spec.isolating)\n                return true;\n            if (after.inlineContent)\n                return false;\n        }\n    }\n    return true;\n}\n\n/**\nCreate a gap cursor plugin. When enabled, this will capture clicks\nnear and arrow-key-motion past places that don't have a normally\nselectable position nearby, and create a gap cursor selection for\nthem. The cursor is drawn as an element with class\n`ProseMirror-gapcursor`. You can either include\n`style/gapcursor.css` from the package's directory or add your own\nstyles to make it visible.\n*/\nfunction gapCursor() {\n    return new Plugin({\n        props: {\n            decorations: drawGapCursor,\n            createSelectionBetween(_view, $anchor, $head) {\n                return $anchor.pos == $head.pos && GapCursor.valid($head) ? new GapCursor($head) : null;\n            },\n            handleClick,\n            handleKeyDown,\n            handleDOMEvents: { beforeinput: beforeinput }\n        }\n    });\n}\nconst handleKeyDown = keydownHandler({\n    \"ArrowLeft\": arrow(\"horiz\", -1),\n    \"ArrowRight\": arrow(\"horiz\", 1),\n    \"ArrowUp\": arrow(\"vert\", -1),\n    \"ArrowDown\": arrow(\"vert\", 1)\n});\nfunction arrow(axis, dir) {\n    const dirStr = axis == \"vert\" ? (dir > 0 ? \"down\" : \"up\") : (dir > 0 ? \"right\" : \"left\");\n    return function (state, dispatch, view) {\n        let sel = state.selection;\n        let $start = dir > 0 ? sel.$to : sel.$from, mustMove = sel.empty;\n        if (sel instanceof TextSelection) {\n            if (!view.endOfTextblock(dirStr) || $start.depth == 0)\n                return false;\n            mustMove = false;\n            $start = state.doc.resolve(dir > 0 ? $start.after() : $start.before());\n        }\n        let $found = GapCursor.findGapCursorFrom($start, dir, mustMove);\n        if (!$found)\n            return false;\n        if (dispatch)\n            dispatch(state.tr.setSelection(new GapCursor($found)));\n        return true;\n    };\n}\nfunction handleClick(view, pos, event) {\n    if (!view || !view.editable)\n        return false;\n    let $pos = view.state.doc.resolve(pos);\n    if (!GapCursor.valid($pos))\n        return false;\n    let clickPos = view.posAtCoords({ left: event.clientX, top: event.clientY });\n    if (clickPos && clickPos.inside > -1 && NodeSelection.isSelectable(view.state.doc.nodeAt(clickPos.inside)))\n        return false;\n    view.dispatch(view.state.tr.setSelection(new GapCursor($pos)));\n    return true;\n}\n// This is a hack that, when a composition starts while a gap cursor\n// is active, quickly creates an inline context for the composition to\n// happen in, to avoid it being aborted by the DOM selection being\n// moved into a valid position.\nfunction beforeinput(view, event) {\n    if (event.inputType != \"insertCompositionText\" || !(view.state.selection instanceof GapCursor))\n        return false;\n    let { $from } = view.state.selection;\n    let insert = $from.parent.contentMatchAt($from.index()).findWrapping(view.state.schema.nodes.text);\n    if (!insert)\n        return false;\n    let frag = Fragment.empty;\n    for (let i = insert.length - 1; i >= 0; i--)\n        frag = Fragment.from(insert[i].createAndFill(null, frag));\n    let tr = view.state.tr.replace($from.pos, $from.pos, new Slice(frag, 0, 0));\n    tr.setSelection(TextSelection.near(tr.doc.resolve($from.pos + 1)));\n    view.dispatch(tr);\n    return false;\n}\nfunction drawGapCursor(state) {\n    if (!(state.selection instanceof GapCursor))\n        return null;\n    let node = document.createElement(\"div\");\n    node.className = \"ProseMirror-gapcursor\";\n    return DecorationSet.create(state.doc, [Decoration.widget(state.selection.head, node, { key: \"gapcursor\" })]);\n}\n\nexport { GapCursor, gapCursor };\n","import { Extension, callOrReturn, getExtensionField } from '@tiptap/core';\nimport { gapCursor } from '@tiptap/pm/gapcursor';\n\n/**\n * This extension allows you to add a gap cursor to your editor.\n * A gap cursor is a cursor that appears when you click on a place\n * where no content is present, for example inbetween nodes.\n * @see https://tiptap.dev/api/extensions/gapcursor\n */\nconst Gapcursor = Extension.create({\n    name: 'gapCursor',\n    addProseMirrorPlugins() {\n        return [\n            gapCursor(),\n        ];\n    },\n    extendNodeSchema(extension) {\n        var _a;\n        const context = {\n            name: extension.name,\n            options: extension.options,\n            storage: extension.storage,\n        };\n        return {\n            allowGapCursor: (_a = callOrReturn(getExtensionField(extension, 'allowGapCursor', context))) !== null && _a !== void 0 ? _a : null,\n        };\n    },\n});\n\nexport { Gapcursor, Gapcursor as default };\n//# sourceMappingURL=index.js.map\n","import { Node, mergeAttributes } from '@tiptap/core';\n\n/**\n * This extension allows you to insert hard breaks.\n * @see https://www.tiptap.dev/api/nodes/hard-break\n */\nconst HardBreak = Node.create({\n    name: 'hardBreak',\n    addOptions() {\n        return {\n            keepMarks: true,\n            HTMLAttributes: {},\n        };\n    },\n    inline: true,\n    group: 'inline',\n    selectable: false,\n    parseHTML() {\n        return [\n            { tag: 'br' },\n        ];\n    },\n    renderHTML({ HTMLAttributes }) {\n        return ['br', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)];\n    },\n    renderText() {\n        return '\\n';\n    },\n    addCommands() {\n        return {\n            setHardBreak: () => ({ commands, chain, state, editor, }) => {\n                return commands.first([\n                    () => commands.exitCode(),\n                    () => commands.command(() => {\n                        const { selection, storedMarks } = state;\n                        if (selection.$from.parent.type.spec.isolating) {\n                            return false;\n                        }\n                        const { keepMarks } = this.options;\n                        const { splittableMarks } = editor.extensionManager;\n                        const marks = storedMarks\n                            || (selection.$to.parentOffset && selection.$from.marks());\n                        return chain()\n                            .insertContent({ type: this.name })\n                            .command(({ tr, dispatch }) => {\n                            if (dispatch && marks && keepMarks) {\n                                const filteredMarks = marks\n                                    .filter(mark => splittableMarks.includes(mark.type.name));\n                                tr.ensureMarks(filteredMarks);\n                            }\n                            return true;\n                        })\n                            .run();\n                    }),\n                ]);\n            },\n        };\n    },\n    addKeyboardShortcuts() {\n        return {\n            'Mod-Enter': () => this.editor.commands.setHardBreak(),\n            'Shift-Enter': () => this.editor.commands.setHardBreak(),\n        };\n    },\n});\n\nexport { HardBreak, HardBreak as default };\n//# sourceMappingURL=index.js.map\n","import { Node, mergeAttributes, textblockTypeInputRule } from '@tiptap/core';\n\n/**\n * This extension allows you to create headings.\n * @see https://www.tiptap.dev/api/nodes/heading\n */\nconst Heading = Node.create({\n    name: 'heading',\n    addOptions() {\n        return {\n            levels: [1, 2, 3, 4, 5, 6],\n            HTMLAttributes: {},\n        };\n    },\n    content: 'inline*',\n    group: 'block',\n    defining: true,\n    addAttributes() {\n        return {\n            level: {\n                default: 1,\n                rendered: false,\n            },\n        };\n    },\n    parseHTML() {\n        return this.options.levels\n            .map((level) => ({\n            tag: `h${level}`,\n            attrs: { level },\n        }));\n    },\n    renderHTML({ node, HTMLAttributes }) {\n        const hasLevel = this.options.levels.includes(node.attrs.level);\n        const level = hasLevel\n            ? node.attrs.level\n            : this.options.levels[0];\n        return [`h${level}`, mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n    },\n    addCommands() {\n        return {\n            setHeading: attributes => ({ commands }) => {\n                if (!this.options.levels.includes(attributes.level)) {\n                    return false;\n                }\n                return commands.setNode(this.name, attributes);\n            },\n            toggleHeading: attributes => ({ commands }) => {\n                if (!this.options.levels.includes(attributes.level)) {\n                    return false;\n                }\n                return commands.toggleNode(this.name, 'paragraph', attributes);\n            },\n        };\n    },\n    addKeyboardShortcuts() {\n        return this.options.levels.reduce((items, level) => ({\n            ...items,\n            ...{\n                [`Mod-Alt-${level}`]: () => this.editor.commands.toggleHeading({ level }),\n            },\n        }), {});\n    },\n    addInputRules() {\n        return this.options.levels.map(level => {\n            return textblockTypeInputRule({\n                find: new RegExp(`^(#{1,${level}})\\\\s$`),\n                type: this.type,\n                getAttributes: {\n                    level,\n                },\n            });\n        });\n    },\n});\n\nexport { Heading, Heading as default };\n//# sourceMappingURL=index.js.map\n","var GOOD_LEAF_SIZE = 200;\n\n// :: class<T> A rope sequence is a persistent sequence data structure\n// that supports appending, prepending, and slicing without doing a\n// full copy. It is represented as a mostly-balanced tree.\nvar RopeSequence = function RopeSequence () {};\n\nRopeSequence.prototype.append = function append (other) {\n  if (!other.length) { return this }\n  other = RopeSequence.from(other);\n\n  return (!this.length && other) ||\n    (other.length < GOOD_LEAF_SIZE && this.leafAppend(other)) ||\n    (this.length < GOOD_LEAF_SIZE && other.leafPrepend(this)) ||\n    this.appendInner(other)\n};\n\n// :: (union<[T], RopeSequence<T>>) → RopeSequence<T>\n// Prepend an array or other rope to this one, returning a new rope.\nRopeSequence.prototype.prepend = function prepend (other) {\n  if (!other.length) { return this }\n  return RopeSequence.from(other).append(this)\n};\n\nRopeSequence.prototype.appendInner = function appendInner (other) {\n  return new Append(this, other)\n};\n\n// :: (?number, ?number) → RopeSequence<T>\n// Create a rope repesenting a sub-sequence of this rope.\nRopeSequence.prototype.slice = function slice (from, to) {\n    if ( from === void 0 ) from = 0;\n    if ( to === void 0 ) to = this.length;\n\n  if (from >= to) { return RopeSequence.empty }\n  return this.sliceInner(Math.max(0, from), Math.min(this.length, to))\n};\n\n// :: (number) → T\n// Retrieve the element at the given position from this rope.\nRopeSequence.prototype.get = function get (i) {\n  if (i < 0 || i >= this.length) { return undefined }\n  return this.getInner(i)\n};\n\n// :: ((element: T, index: number) → ?bool, ?number, ?number)\n// Call the given function for each element between the given\n// indices. This tends to be more efficient than looping over the\n// indices and calling `get`, because it doesn't have to descend the\n// tree for every element.\nRopeSequence.prototype.forEach = function forEach (f, from, to) {\n    if ( from === void 0 ) from = 0;\n    if ( to === void 0 ) to = this.length;\n\n  if (from <= to)\n    { this.forEachInner(f, from, to, 0); }\n  else\n    { this.forEachInvertedInner(f, from, to, 0); }\n};\n\n// :: ((element: T, index: number) → U, ?number, ?number) → [U]\n// Map the given functions over the elements of the rope, producing\n// a flat array.\nRopeSequence.prototype.map = function map (f, from, to) {\n    if ( from === void 0 ) from = 0;\n    if ( to === void 0 ) to = this.length;\n\n  var result = [];\n  this.forEach(function (elt, i) { return result.push(f(elt, i)); }, from, to);\n  return result\n};\n\n// :: (?union<[T], RopeSequence<T>>) → RopeSequence<T>\n// Create a rope representing the given array, or return the rope\n// itself if a rope was given.\nRopeSequence.from = function from (values) {\n  if (values instanceof RopeSequence) { return values }\n  return values && values.length ? new Leaf(values) : RopeSequence.empty\n};\n\nvar Leaf = /*@__PURE__*/(function (RopeSequence) {\n  function Leaf(values) {\n    RopeSequence.call(this);\n    this.values = values;\n  }\n\n  if ( RopeSequence ) Leaf.__proto__ = RopeSequence;\n  Leaf.prototype = Object.create( RopeSequence && RopeSequence.prototype );\n  Leaf.prototype.constructor = Leaf;\n\n  var prototypeAccessors = { length: { configurable: true },depth: { configurable: true } };\n\n  Leaf.prototype.flatten = function flatten () {\n    return this.values\n  };\n\n  Leaf.prototype.sliceInner = function sliceInner (from, to) {\n    if (from == 0 && to == this.length) { return this }\n    return new Leaf(this.values.slice(from, to))\n  };\n\n  Leaf.prototype.getInner = function getInner (i) {\n    return this.values[i]\n  };\n\n  Leaf.prototype.forEachInner = function forEachInner (f, from, to, start) {\n    for (var i = from; i < to; i++)\n      { if (f(this.values[i], start + i) === false) { return false } }\n  };\n\n  Leaf.prototype.forEachInvertedInner = function forEachInvertedInner (f, from, to, start) {\n    for (var i = from - 1; i >= to; i--)\n      { if (f(this.values[i], start + i) === false) { return false } }\n  };\n\n  Leaf.prototype.leafAppend = function leafAppend (other) {\n    if (this.length + other.length <= GOOD_LEAF_SIZE)\n      { return new Leaf(this.values.concat(other.flatten())) }\n  };\n\n  Leaf.prototype.leafPrepend = function leafPrepend (other) {\n    if (this.length + other.length <= GOOD_LEAF_SIZE)\n      { return new Leaf(other.flatten().concat(this.values)) }\n  };\n\n  prototypeAccessors.length.get = function () { return this.values.length };\n\n  prototypeAccessors.depth.get = function () { return 0 };\n\n  Object.defineProperties( Leaf.prototype, prototypeAccessors );\n\n  return Leaf;\n}(RopeSequence));\n\n// :: RopeSequence\n// The empty rope sequence.\nRopeSequence.empty = new Leaf([]);\n\nvar Append = /*@__PURE__*/(function (RopeSequence) {\n  function Append(left, right) {\n    RopeSequence.call(this);\n    this.left = left;\n    this.right = right;\n    this.length = left.length + right.length;\n    this.depth = Math.max(left.depth, right.depth) + 1;\n  }\n\n  if ( RopeSequence ) Append.__proto__ = RopeSequence;\n  Append.prototype = Object.create( RopeSequence && RopeSequence.prototype );\n  Append.prototype.constructor = Append;\n\n  Append.prototype.flatten = function flatten () {\n    return this.left.flatten().concat(this.right.flatten())\n  };\n\n  Append.prototype.getInner = function getInner (i) {\n    return i < this.left.length ? this.left.get(i) : this.right.get(i - this.left.length)\n  };\n\n  Append.prototype.forEachInner = function forEachInner (f, from, to, start) {\n    var leftLen = this.left.length;\n    if (from < leftLen &&\n        this.left.forEachInner(f, from, Math.min(to, leftLen), start) === false)\n      { return false }\n    if (to > leftLen &&\n        this.right.forEachInner(f, Math.max(from - leftLen, 0), Math.min(this.length, to) - leftLen, start + leftLen) === false)\n      { return false }\n  };\n\n  Append.prototype.forEachInvertedInner = function forEachInvertedInner (f, from, to, start) {\n    var leftLen = this.left.length;\n    if (from > leftLen &&\n        this.right.forEachInvertedInner(f, from - leftLen, Math.max(to, leftLen) - leftLen, start + leftLen) === false)\n      { return false }\n    if (to < leftLen &&\n        this.left.forEachInvertedInner(f, Math.min(from, leftLen), to, start) === false)\n      { return false }\n  };\n\n  Append.prototype.sliceInner = function sliceInner (from, to) {\n    if (from == 0 && to == this.length) { return this }\n    var leftLen = this.left.length;\n    if (to <= leftLen) { return this.left.slice(from, to) }\n    if (from >= leftLen) { return this.right.slice(from - leftLen, to - leftLen) }\n    return this.left.slice(from, leftLen).append(this.right.slice(0, to - leftLen))\n  };\n\n  Append.prototype.leafAppend = function leafAppend (other) {\n    var inner = this.right.leafAppend(other);\n    if (inner) { return new Append(this.left, inner) }\n  };\n\n  Append.prototype.leafPrepend = function leafPrepend (other) {\n    var inner = this.left.leafPrepend(other);\n    if (inner) { return new Append(inner, this.right) }\n  };\n\n  Append.prototype.appendInner = function appendInner (other) {\n    if (this.left.depth >= Math.max(this.right.depth, other.depth) + 1)\n      { return new Append(this.left, new Append(this.right, other)) }\n    return new Append(this, other)\n  };\n\n  return Append;\n}(RopeSequence));\n\nexport default RopeSequence;\n","import RopeSequence from 'rope-sequence';\nimport { Mapping } from 'prosemirror-transform';\nimport { PluginKey, Plugin } from 'prosemirror-state';\n\n// ProseMirror's history isn't simply a way to roll back to a previous\n// state, because ProseMirror supports applying changes without adding\n// them to the history (for example during collaboration).\n//\n// To this end, each 'Branch' (one for the undo history and one for\n// the redo history) keeps an array of 'Items', which can optionally\n// hold a step (an actual undoable change), and always hold a position\n// map (which is needed to move changes below them to apply to the\n// current document).\n//\n// An item that has both a step and a selection bookmark is the start\n// of an 'event' — a group of changes that will be undone or redone at\n// once. (It stores only the bookmark, since that way we don't have to\n// provide a document until the selection is actually applied, which\n// is useful when compressing.)\n// Used to schedule history compression\nconst max_empty_items = 500;\nclass Branch {\n    constructor(items, eventCount) {\n        this.items = items;\n        this.eventCount = eventCount;\n    }\n    // Pop the latest event off the branch's history and apply it\n    // to a document transform.\n    popEvent(state, preserveItems) {\n        if (this.eventCount == 0)\n            return null;\n        let end = this.items.length;\n        for (;; end--) {\n            let next = this.items.get(end - 1);\n            if (next.selection) {\n                --end;\n                break;\n            }\n        }\n        let remap, mapFrom;\n        if (preserveItems) {\n            remap = this.remapping(end, this.items.length);\n            mapFrom = remap.maps.length;\n        }\n        let transform = state.tr;\n        let selection, remaining;\n        let addAfter = [], addBefore = [];\n        this.items.forEach((item, i) => {\n            if (!item.step) {\n                if (!remap) {\n                    remap = this.remapping(end, i + 1);\n                    mapFrom = remap.maps.length;\n                }\n                mapFrom--;\n                addBefore.push(item);\n                return;\n            }\n            if (remap) {\n                addBefore.push(new Item(item.map));\n                let step = item.step.map(remap.slice(mapFrom)), map;\n                if (step && transform.maybeStep(step).doc) {\n                    map = transform.mapping.maps[transform.mapping.maps.length - 1];\n                    addAfter.push(new Item(map, undefined, undefined, addAfter.length + addBefore.length));\n                }\n                mapFrom--;\n                if (map)\n                    remap.appendMap(map, mapFrom);\n            }\n            else {\n                transform.maybeStep(item.step);\n            }\n            if (item.selection) {\n                selection = remap ? item.selection.map(remap.slice(mapFrom)) : item.selection;\n                remaining = new Branch(this.items.slice(0, end).append(addBefore.reverse().concat(addAfter)), this.eventCount - 1);\n                return false;\n            }\n        }, this.items.length, 0);\n        return { remaining: remaining, transform, selection: selection };\n    }\n    // Create a new branch with the given transform added.\n    addTransform(transform, selection, histOptions, preserveItems) {\n        let newItems = [], eventCount = this.eventCount;\n        let oldItems = this.items, lastItem = !preserveItems && oldItems.length ? oldItems.get(oldItems.length - 1) : null;\n        for (let i = 0; i < transform.steps.length; i++) {\n            let step = transform.steps[i].invert(transform.docs[i]);\n            let item = new Item(transform.mapping.maps[i], step, selection), merged;\n            if (merged = lastItem && lastItem.merge(item)) {\n                item = merged;\n                if (i)\n                    newItems.pop();\n                else\n                    oldItems = oldItems.slice(0, oldItems.length - 1);\n            }\n            newItems.push(item);\n            if (selection) {\n                eventCount++;\n                selection = undefined;\n            }\n            if (!preserveItems)\n                lastItem = item;\n        }\n        let overflow = eventCount - histOptions.depth;\n        if (overflow > DEPTH_OVERFLOW) {\n            oldItems = cutOffEvents(oldItems, overflow);\n            eventCount -= overflow;\n        }\n        return new Branch(oldItems.append(newItems), eventCount);\n    }\n    remapping(from, to) {\n        let maps = new Mapping;\n        this.items.forEach((item, i) => {\n            let mirrorPos = item.mirrorOffset != null && i - item.mirrorOffset >= from\n                ? maps.maps.length - item.mirrorOffset : undefined;\n            maps.appendMap(item.map, mirrorPos);\n        }, from, to);\n        return maps;\n    }\n    addMaps(array) {\n        if (this.eventCount == 0)\n            return this;\n        return new Branch(this.items.append(array.map(map => new Item(map))), this.eventCount);\n    }\n    // When the collab module receives remote changes, the history has\n    // to know about those, so that it can adjust the steps that were\n    // rebased on top of the remote changes, and include the position\n    // maps for the remote changes in its array of items.\n    rebased(rebasedTransform, rebasedCount) {\n        if (!this.eventCount)\n            return this;\n        let rebasedItems = [], start = Math.max(0, this.items.length - rebasedCount);\n        let mapping = rebasedTransform.mapping;\n        let newUntil = rebasedTransform.steps.length;\n        let eventCount = this.eventCount;\n        this.items.forEach(item => { if (item.selection)\n            eventCount--; }, start);\n        let iRebased = rebasedCount;\n        this.items.forEach(item => {\n            let pos = mapping.getMirror(--iRebased);\n            if (pos == null)\n                return;\n            newUntil = Math.min(newUntil, pos);\n            let map = mapping.maps[pos];\n            if (item.step) {\n                let step = rebasedTransform.steps[pos].invert(rebasedTransform.docs[pos]);\n                let selection = item.selection && item.selection.map(mapping.slice(iRebased + 1, pos));\n                if (selection)\n                    eventCount++;\n                rebasedItems.push(new Item(map, step, selection));\n            }\n            else {\n                rebasedItems.push(new Item(map));\n            }\n        }, start);\n        let newMaps = [];\n        for (let i = rebasedCount; i < newUntil; i++)\n            newMaps.push(new Item(mapping.maps[i]));\n        let items = this.items.slice(0, start).append(newMaps).append(rebasedItems);\n        let branch = new Branch(items, eventCount);\n        if (branch.emptyItemCount() > max_empty_items)\n            branch = branch.compress(this.items.length - rebasedItems.length);\n        return branch;\n    }\n    emptyItemCount() {\n        let count = 0;\n        this.items.forEach(item => { if (!item.step)\n            count++; });\n        return count;\n    }\n    // Compressing a branch means rewriting it to push the air (map-only\n    // items) out. During collaboration, these naturally accumulate\n    // because each remote change adds one. The `upto` argument is used\n    // to ensure that only the items below a given level are compressed,\n    // because `rebased` relies on a clean, untouched set of items in\n    // order to associate old items with rebased steps.\n    compress(upto = this.items.length) {\n        let remap = this.remapping(0, upto), mapFrom = remap.maps.length;\n        let items = [], events = 0;\n        this.items.forEach((item, i) => {\n            if (i >= upto) {\n                items.push(item);\n                if (item.selection)\n                    events++;\n            }\n            else if (item.step) {\n                let step = item.step.map(remap.slice(mapFrom)), map = step && step.getMap();\n                mapFrom--;\n                if (map)\n                    remap.appendMap(map, mapFrom);\n                if (step) {\n                    let selection = item.selection && item.selection.map(remap.slice(mapFrom));\n                    if (selection)\n                        events++;\n                    let newItem = new Item(map.invert(), step, selection), merged, last = items.length - 1;\n                    if (merged = items.length && items[last].merge(newItem))\n                        items[last] = merged;\n                    else\n                        items.push(newItem);\n                }\n            }\n            else if (item.map) {\n                mapFrom--;\n            }\n        }, this.items.length, 0);\n        return new Branch(RopeSequence.from(items.reverse()), events);\n    }\n}\nBranch.empty = new Branch(RopeSequence.empty, 0);\nfunction cutOffEvents(items, n) {\n    let cutPoint;\n    items.forEach((item, i) => {\n        if (item.selection && (n-- == 0)) {\n            cutPoint = i;\n            return false;\n        }\n    });\n    return items.slice(cutPoint);\n}\nclass Item {\n    constructor(\n    // The (forward) step map for this item.\n    map, \n    // The inverted step\n    step, \n    // If this is non-null, this item is the start of a group, and\n    // this selection is the starting selection for the group (the one\n    // that was active before the first step was applied)\n    selection, \n    // If this item is the inverse of a previous mapping on the stack,\n    // this points at the inverse's offset\n    mirrorOffset) {\n        this.map = map;\n        this.step = step;\n        this.selection = selection;\n        this.mirrorOffset = mirrorOffset;\n    }\n    merge(other) {\n        if (this.step && other.step && !other.selection) {\n            let step = other.step.merge(this.step);\n            if (step)\n                return new Item(step.getMap().invert(), step, this.selection);\n        }\n    }\n}\n// The value of the state field that tracks undo/redo history for that\n// state. Will be stored in the plugin state when the history plugin\n// is active.\nclass HistoryState {\n    constructor(done, undone, prevRanges, prevTime, prevComposition) {\n        this.done = done;\n        this.undone = undone;\n        this.prevRanges = prevRanges;\n        this.prevTime = prevTime;\n        this.prevComposition = prevComposition;\n    }\n}\nconst DEPTH_OVERFLOW = 20;\n// Record a transformation in undo history.\nfunction applyTransaction(history, state, tr, options) {\n    let historyTr = tr.getMeta(historyKey), rebased;\n    if (historyTr)\n        return historyTr.historyState;\n    if (tr.getMeta(closeHistoryKey))\n        history = new HistoryState(history.done, history.undone, null, 0, -1);\n    let appended = tr.getMeta(\"appendedTransaction\");\n    if (tr.steps.length == 0) {\n        return history;\n    }\n    else if (appended && appended.getMeta(historyKey)) {\n        if (appended.getMeta(historyKey).redo)\n            return new HistoryState(history.done.addTransform(tr, undefined, options, mustPreserveItems(state)), history.undone, rangesFor(tr.mapping.maps), history.prevTime, history.prevComposition);\n        else\n            return new HistoryState(history.done, history.undone.addTransform(tr, undefined, options, mustPreserveItems(state)), null, history.prevTime, history.prevComposition);\n    }\n    else if (tr.getMeta(\"addToHistory\") !== false && !(appended && appended.getMeta(\"addToHistory\") === false)) {\n        // Group transforms that occur in quick succession into one event.\n        let composition = tr.getMeta(\"composition\");\n        let newGroup = history.prevTime == 0 ||\n            (!appended && history.prevComposition != composition &&\n                (history.prevTime < (tr.time || 0) - options.newGroupDelay || !isAdjacentTo(tr, history.prevRanges)));\n        let prevRanges = appended ? mapRanges(history.prevRanges, tr.mapping) : rangesFor(tr.mapping.maps);\n        return new HistoryState(history.done.addTransform(tr, newGroup ? state.selection.getBookmark() : undefined, options, mustPreserveItems(state)), Branch.empty, prevRanges, tr.time, composition == null ? history.prevComposition : composition);\n    }\n    else if (rebased = tr.getMeta(\"rebased\")) {\n        // Used by the collab module to tell the history that some of its\n        // content has been rebased.\n        return new HistoryState(history.done.rebased(tr, rebased), history.undone.rebased(tr, rebased), mapRanges(history.prevRanges, tr.mapping), history.prevTime, history.prevComposition);\n    }\n    else {\n        return new HistoryState(history.done.addMaps(tr.mapping.maps), history.undone.addMaps(tr.mapping.maps), mapRanges(history.prevRanges, tr.mapping), history.prevTime, history.prevComposition);\n    }\n}\nfunction isAdjacentTo(transform, prevRanges) {\n    if (!prevRanges)\n        return false;\n    if (!transform.docChanged)\n        return true;\n    let adjacent = false;\n    transform.mapping.maps[0].forEach((start, end) => {\n        for (let i = 0; i < prevRanges.length; i += 2)\n            if (start <= prevRanges[i + 1] && end >= prevRanges[i])\n                adjacent = true;\n    });\n    return adjacent;\n}\nfunction rangesFor(maps) {\n    let result = [];\n    for (let i = maps.length - 1; i >= 0 && result.length == 0; i--)\n        maps[i].forEach((_from, _to, from, to) => result.push(from, to));\n    return result;\n}\nfunction mapRanges(ranges, mapping) {\n    if (!ranges)\n        return null;\n    let result = [];\n    for (let i = 0; i < ranges.length; i += 2) {\n        let from = mapping.map(ranges[i], 1), to = mapping.map(ranges[i + 1], -1);\n        if (from <= to)\n            result.push(from, to);\n    }\n    return result;\n}\n// Apply the latest event from one branch to the document and shift the event\n// onto the other branch.\nfunction histTransaction(history, state, redo) {\n    let preserveItems = mustPreserveItems(state);\n    let histOptions = historyKey.get(state).spec.config;\n    let pop = (redo ? history.undone : history.done).popEvent(state, preserveItems);\n    if (!pop)\n        return null;\n    let selection = pop.selection.resolve(pop.transform.doc);\n    let added = (redo ? history.done : history.undone).addTransform(pop.transform, state.selection.getBookmark(), histOptions, preserveItems);\n    let newHist = new HistoryState(redo ? added : pop.remaining, redo ? pop.remaining : added, null, 0, -1);\n    return pop.transform.setSelection(selection).setMeta(historyKey, { redo, historyState: newHist });\n}\nlet cachedPreserveItems = false, cachedPreserveItemsPlugins = null;\n// Check whether any plugin in the given state has a\n// `historyPreserveItems` property in its spec, in which case we must\n// preserve steps exactly as they came in, so that they can be\n// rebased.\nfunction mustPreserveItems(state) {\n    let plugins = state.plugins;\n    if (cachedPreserveItemsPlugins != plugins) {\n        cachedPreserveItems = false;\n        cachedPreserveItemsPlugins = plugins;\n        for (let i = 0; i < plugins.length; i++)\n            if (plugins[i].spec.historyPreserveItems) {\n                cachedPreserveItems = true;\n                break;\n            }\n    }\n    return cachedPreserveItems;\n}\n/**\nSet a flag on the given transaction that will prevent further steps\nfrom being appended to an existing history event (so that they\nrequire a separate undo command to undo).\n*/\nfunction closeHistory(tr) {\n    return tr.setMeta(closeHistoryKey, true);\n}\nconst historyKey = new PluginKey(\"history\");\nconst closeHistoryKey = new PluginKey(\"closeHistory\");\n/**\nReturns a plugin that enables the undo history for an editor. The\nplugin will track undo and redo stacks, which can be used with the\n[`undo`](https://prosemirror.net/docs/ref/#history.undo) and [`redo`](https://prosemirror.net/docs/ref/#history.redo) commands.\n\nYou can set an `\"addToHistory\"` [metadata\nproperty](https://prosemirror.net/docs/ref/#state.Transaction.setMeta) of `false` on a transaction\nto prevent it from being rolled back by undo.\n*/\nfunction history(config = {}) {\n    config = { depth: config.depth || 100,\n        newGroupDelay: config.newGroupDelay || 500 };\n    return new Plugin({\n        key: historyKey,\n        state: {\n            init() {\n                return new HistoryState(Branch.empty, Branch.empty, null, 0, -1);\n            },\n            apply(tr, hist, state) {\n                return applyTransaction(hist, state, tr, config);\n            }\n        },\n        config,\n        props: {\n            handleDOMEvents: {\n                beforeinput(view, e) {\n                    let inputType = e.inputType;\n                    let command = inputType == \"historyUndo\" ? undo : inputType == \"historyRedo\" ? redo : null;\n                    if (!command)\n                        return false;\n                    e.preventDefault();\n                    return command(view.state, view.dispatch);\n                }\n            }\n        }\n    });\n}\nfunction buildCommand(redo, scroll) {\n    return (state, dispatch) => {\n        let hist = historyKey.getState(state);\n        if (!hist || (redo ? hist.undone : hist.done).eventCount == 0)\n            return false;\n        if (dispatch) {\n            let tr = histTransaction(hist, state, redo);\n            if (tr)\n                dispatch(scroll ? tr.scrollIntoView() : tr);\n        }\n        return true;\n    };\n}\n/**\nA command function that undoes the last change, if any.\n*/\nconst undo = buildCommand(false, true);\n/**\nA command function that redoes the last undone change, if any.\n*/\nconst redo = buildCommand(true, true);\n/**\nA command function that undoes the last change. Don't scroll the\nselection into view.\n*/\nconst undoNoScroll = buildCommand(false, false);\n/**\nA command function that redoes the last undone change. Don't\nscroll the selection into view.\n*/\nconst redoNoScroll = buildCommand(true, false);\n/**\nThe amount of undoable events available in a given state.\n*/\nfunction undoDepth(state) {\n    let hist = historyKey.getState(state);\n    return hist ? hist.done.eventCount : 0;\n}\n/**\nThe amount of redoable events available in a given editor state.\n*/\nfunction redoDepth(state) {\n    let hist = historyKey.getState(state);\n    return hist ? hist.undone.eventCount : 0;\n}\n\nexport { closeHistory, history, redo, redoDepth, redoNoScroll, undo, undoDepth, undoNoScroll };\n","import { Extension } from '@tiptap/core';\nimport { undo, redo, history } from '@tiptap/pm/history';\n\n/**\n * This extension allows you to undo and redo recent changes.\n * @see https://www.tiptap.dev/api/extensions/history\n *\n * **Important**: If the `@tiptap/extension-collaboration` package is used, make sure to remove\n * the `history` extension, as it is not compatible with the `collaboration` extension.\n *\n * `@tiptap/extension-collaboration` uses its own history implementation.\n */\nconst History = Extension.create({\n    name: 'history',\n    addOptions() {\n        return {\n            depth: 100,\n            newGroupDelay: 500,\n        };\n    },\n    addCommands() {\n        return {\n            undo: () => ({ state, dispatch }) => {\n                return undo(state, dispatch);\n            },\n            redo: () => ({ state, dispatch }) => {\n                return redo(state, dispatch);\n            },\n        };\n    },\n    addProseMirrorPlugins() {\n        return [\n            history(this.options),\n        ];\n    },\n    addKeyboardShortcuts() {\n        return {\n            'Mod-z': () => this.editor.commands.undo(),\n            'Shift-Mod-z': () => this.editor.commands.redo(),\n            'Mod-y': () => this.editor.commands.redo(),\n            // Russian keyboard layouts\n            'Mod-я': () => this.editor.commands.undo(),\n            'Shift-Mod-я': () => this.editor.commands.redo(),\n        };\n    },\n});\n\nexport { History, History as default };\n//# sourceMappingURL=index.js.map\n","import { Node, mergeAttributes, isNodeSelection, nodeInputRule } from '@tiptap/core';\nimport { TextSelection, NodeSelection } from '@tiptap/pm/state';\n\n/**\n * This extension allows you to insert horizontal rules.\n * @see https://www.tiptap.dev/api/nodes/horizontal-rule\n */\nconst HorizontalRule = Node.create({\n    name: 'horizontalRule',\n    addOptions() {\n        return {\n            HTMLAttributes: {},\n        };\n    },\n    group: 'block',\n    parseHTML() {\n        return [{ tag: 'hr' }];\n    },\n    renderHTML({ HTMLAttributes }) {\n        return ['hr', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)];\n    },\n    addCommands() {\n        return {\n            setHorizontalRule: () => ({ chain, state }) => {\n                const { selection } = state;\n                const { $from: $originFrom, $to: $originTo } = selection;\n                const currentChain = chain();\n                if ($originFrom.parentOffset === 0) {\n                    currentChain.insertContentAt({\n                        from: Math.max($originFrom.pos - 1, 0),\n                        to: $originTo.pos,\n                    }, {\n                        type: this.name,\n                    });\n                }\n                else if (isNodeSelection(selection)) {\n                    currentChain.insertContentAt($originTo.pos, {\n                        type: this.name,\n                    });\n                }\n                else {\n                    currentChain.insertContent({ type: this.name });\n                }\n                return (currentChain\n                    // set cursor after horizontal rule\n                    .command(({ tr, dispatch }) => {\n                    var _a;\n                    if (dispatch) {\n                        const { $to } = tr.selection;\n                        const posAfter = $to.end();\n                        if ($to.nodeAfter) {\n                            if ($to.nodeAfter.isTextblock) {\n                                tr.setSelection(TextSelection.create(tr.doc, $to.pos + 1));\n                            }\n                            else if ($to.nodeAfter.isBlock) {\n                                tr.setSelection(NodeSelection.create(tr.doc, $to.pos));\n                            }\n                            else {\n                                tr.setSelection(TextSelection.create(tr.doc, $to.pos));\n                            }\n                        }\n                        else {\n                            // add node after horizontal rule if it’s the end of the document\n                            const node = (_a = $to.parent.type.contentMatch.defaultType) === null || _a === void 0 ? void 0 : _a.create();\n                            if (node) {\n                                tr.insert(posAfter, node);\n                                tr.setSelection(TextSelection.create(tr.doc, posAfter + 1));\n                            }\n                        }\n                        tr.scrollIntoView();\n                    }\n                    return true;\n                })\n                    .run());\n            },\n        };\n    },\n    addInputRules() {\n        return [\n            nodeInputRule({\n                find: /^(?:---|—-|___\\s|\\*\\*\\*\\s)$/,\n                type: this.type,\n            }),\n        ];\n    },\n});\n\nexport { HorizontalRule, HorizontalRule as default };\n//# sourceMappingURL=index.js.map\n","import { Mark, mergeAttributes, markInputRule, markPasteRule } from '@tiptap/core';\n\n/**\n * Matches an italic to a *italic* on input.\n */\nconst starInputRegex = /(?:^|\\s)(\\*(?!\\s+\\*)((?:[^*]+))\\*(?!\\s+\\*))$/;\n/**\n * Matches an italic to a *italic* on paste.\n */\nconst starPasteRegex = /(?:^|\\s)(\\*(?!\\s+\\*)((?:[^*]+))\\*(?!\\s+\\*))/g;\n/**\n * Matches an italic to a _italic_ on input.\n */\nconst underscoreInputRegex = /(?:^|\\s)(_(?!\\s+_)((?:[^_]+))_(?!\\s+_))$/;\n/**\n * Matches an italic to a _italic_ on paste.\n */\nconst underscorePasteRegex = /(?:^|\\s)(_(?!\\s+_)((?:[^_]+))_(?!\\s+_))/g;\n/**\n * This extension allows you to create italic text.\n * @see https://www.tiptap.dev/api/marks/italic\n */\nconst Italic = Mark.create({\n    name: 'italic',\n    addOptions() {\n        return {\n            HTMLAttributes: {},\n        };\n    },\n    parseHTML() {\n        return [\n            {\n                tag: 'em',\n            },\n            {\n                tag: 'i',\n                getAttrs: node => node.style.fontStyle !== 'normal' && null,\n            },\n            {\n                style: 'font-style=italic',\n            },\n        ];\n    },\n    renderHTML({ HTMLAttributes }) {\n        return ['em', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n    },\n    addCommands() {\n        return {\n            setItalic: () => ({ commands }) => {\n                return commands.setMark(this.name);\n            },\n            toggleItalic: () => ({ commands }) => {\n                return commands.toggleMark(this.name);\n            },\n            unsetItalic: () => ({ commands }) => {\n                return commands.unsetMark(this.name);\n            },\n        };\n    },\n    addKeyboardShortcuts() {\n        return {\n            'Mod-i': () => this.editor.commands.toggleItalic(),\n            'Mod-I': () => this.editor.commands.toggleItalic(),\n        };\n    },\n    addInputRules() {\n        return [\n            markInputRule({\n                find: starInputRegex,\n                type: this.type,\n            }),\n            markInputRule({\n                find: underscoreInputRegex,\n                type: this.type,\n            }),\n        ];\n    },\n    addPasteRules() {\n        return [\n            markPasteRule({\n                find: starPasteRegex,\n                type: this.type,\n            }),\n            markPasteRule({\n                find: underscorePasteRegex,\n                type: this.type,\n            }),\n        ];\n    },\n});\n\nexport { Italic, Italic as default, starInputRegex, starPasteRegex, underscoreInputRegex, underscorePasteRegex };\n//# sourceMappingURL=index.js.map\n","import { Node, mergeAttributes } from '@tiptap/core';\n\n/**\n * This extension allows you to create list items.\n * @see https://www.tiptap.dev/api/nodes/list-item\n */\nconst ListItem = Node.create({\n    name: 'listItem',\n    addOptions() {\n        return {\n            HTMLAttributes: {},\n            bulletListTypeName: 'bulletList',\n            orderedListTypeName: 'orderedList',\n        };\n    },\n    content: 'paragraph block*',\n    defining: true,\n    parseHTML() {\n        return [\n            {\n                tag: 'li',\n            },\n        ];\n    },\n    renderHTML({ HTMLAttributes }) {\n        return ['li', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n    },\n    addKeyboardShortcuts() {\n        return {\n            Enter: () => this.editor.commands.splitListItem(this.name),\n            Tab: () => this.editor.commands.sinkListItem(this.name),\n            'Shift-Tab': () => this.editor.commands.liftListItem(this.name),\n        };\n    },\n});\n\nexport { ListItem, ListItem as default };\n//# sourceMappingURL=index.js.map\n","import { Node, mergeAttributes, Mark, getMarkAttributes, wrappingInputRule } from '@tiptap/core';\n\n/**\n * This extension allows you to create list items.\n * @see https://www.tiptap.dev/api/nodes/list-item\n */\nconst ListItem = Node.create({\n    name: 'listItem',\n    addOptions() {\n        return {\n            HTMLAttributes: {},\n            bulletListTypeName: 'bulletList',\n            orderedListTypeName: 'orderedList',\n        };\n    },\n    content: 'paragraph block*',\n    defining: true,\n    parseHTML() {\n        return [\n            {\n                tag: 'li',\n            },\n        ];\n    },\n    renderHTML({ HTMLAttributes }) {\n        return ['li', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n    },\n    addKeyboardShortcuts() {\n        return {\n            Enter: () => this.editor.commands.splitListItem(this.name),\n            Tab: () => this.editor.commands.sinkListItem(this.name),\n            'Shift-Tab': () => this.editor.commands.liftListItem(this.name),\n        };\n    },\n});\n\n/**\n * This extension allows you to create text styles. It is required by default\n * for the `textColor` and `backgroundColor` extensions.\n * @see https://www.tiptap.dev/api/marks/text-style\n */\nconst TextStyle = Mark.create({\n    name: 'textStyle',\n    addOptions() {\n        return {\n            HTMLAttributes: {},\n        };\n    },\n    parseHTML() {\n        return [\n            {\n                tag: 'span',\n                getAttrs: element => {\n                    const hasStyles = element.hasAttribute('style');\n                    if (!hasStyles) {\n                        return false;\n                    }\n                    return {};\n                },\n            },\n        ];\n    },\n    renderHTML({ HTMLAttributes }) {\n        return ['span', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n    },\n    addCommands() {\n        return {\n            removeEmptyTextStyle: () => ({ state, commands }) => {\n                const attributes = getMarkAttributes(state, this.type);\n                const hasStyles = Object.entries(attributes).some(([, value]) => !!value);\n                if (hasStyles) {\n                    return true;\n                }\n                return commands.unsetMark(this.name);\n            },\n        };\n    },\n});\n\n/**\n * Matches an ordered list to a 1. on input (or any number followed by a dot).\n */\nconst inputRegex = /^(\\d+)\\.\\s$/;\n/**\n * This extension allows you to create ordered lists.\n * This requires the ListItem extension\n * @see https://www.tiptap.dev/api/nodes/ordered-list\n * @see https://www.tiptap.dev/api/nodes/list-item\n */\nconst OrderedList = Node.create({\n    name: 'orderedList',\n    addOptions() {\n        return {\n            itemTypeName: 'listItem',\n            HTMLAttributes: {},\n            keepMarks: false,\n            keepAttributes: false,\n        };\n    },\n    group: 'block list',\n    content() {\n        return `${this.options.itemTypeName}+`;\n    },\n    addAttributes() {\n        return {\n            start: {\n                default: 1,\n                parseHTML: element => {\n                    return element.hasAttribute('start')\n                        ? parseInt(element.getAttribute('start') || '', 10)\n                        : 1;\n                },\n            },\n        };\n    },\n    parseHTML() {\n        return [\n            {\n                tag: 'ol',\n            },\n        ];\n    },\n    renderHTML({ HTMLAttributes }) {\n        const { start, ...attributesWithoutStart } = HTMLAttributes;\n        return start === 1\n            ? ['ol', mergeAttributes(this.options.HTMLAttributes, attributesWithoutStart), 0]\n            : ['ol', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n    },\n    addCommands() {\n        return {\n            toggleOrderedList: () => ({ commands, chain }) => {\n                if (this.options.keepAttributes) {\n                    return chain().toggleList(this.name, this.options.itemTypeName, this.options.keepMarks).updateAttributes(ListItem.name, this.editor.getAttributes(TextStyle.name)).run();\n                }\n                return commands.toggleList(this.name, this.options.itemTypeName, this.options.keepMarks);\n            },\n        };\n    },\n    addKeyboardShortcuts() {\n        return {\n            'Mod-Shift-7': () => this.editor.commands.toggleOrderedList(),\n        };\n    },\n    addInputRules() {\n        let inputRule = wrappingInputRule({\n            find: inputRegex,\n            type: this.type,\n            getAttributes: match => ({ start: +match[1] }),\n            joinPredicate: (match, node) => node.childCount + node.attrs.start === +match[1],\n        });\n        if (this.options.keepMarks || this.options.keepAttributes) {\n            inputRule = wrappingInputRule({\n                find: inputRegex,\n                type: this.type,\n                keepMarks: this.options.keepMarks,\n                keepAttributes: this.options.keepAttributes,\n                getAttributes: match => ({ start: +match[1], ...this.editor.getAttributes(TextStyle.name) }),\n                joinPredicate: (match, node) => node.childCount + node.attrs.start === +match[1],\n                editor: this.editor,\n            });\n        }\n        return [\n            inputRule,\n        ];\n    },\n});\n\nexport { OrderedList, OrderedList as default, inputRegex };\n//# sourceMappingURL=index.js.map\n","import { Node, mergeAttributes } from '@tiptap/core';\n\n/**\n * This extension allows you to create paragraphs.\n * @see https://www.tiptap.dev/api/nodes/paragraph\n */\nconst Paragraph = Node.create({\n    name: 'paragraph',\n    priority: 1000,\n    addOptions() {\n        return {\n            HTMLAttributes: {},\n        };\n    },\n    group: 'block',\n    content: 'inline*',\n    parseHTML() {\n        return [\n            { tag: 'p' },\n        ];\n    },\n    renderHTML({ HTMLAttributes }) {\n        return ['p', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n    },\n    addCommands() {\n        return {\n            setParagraph: () => ({ commands }) => {\n                return commands.setNode(this.name);\n            },\n        };\n    },\n    addKeyboardShortcuts() {\n        return {\n            'Mod-Alt-0': () => this.editor.commands.setParagraph(),\n        };\n    },\n});\n\nexport { Paragraph, Paragraph as default };\n//# sourceMappingURL=index.js.map\n","import { Mark, mergeAttributes, markInputRule, markPasteRule } from '@tiptap/core';\n\n/**\n * Matches a strike to a ~~strike~~ on input.\n */\nconst inputRegex = /(?:^|\\s)(~~(?!\\s+~~)((?:[^~]+))~~(?!\\s+~~))$/;\n/**\n * Matches a strike to a ~~strike~~ on paste.\n */\nconst pasteRegex = /(?:^|\\s)(~~(?!\\s+~~)((?:[^~]+))~~(?!\\s+~~))/g;\n/**\n * This extension allows you to create strike text.\n * @see https://www.tiptap.dev/api/marks/strike\n */\nconst Strike = Mark.create({\n    name: 'strike',\n    addOptions() {\n        return {\n            HTMLAttributes: {},\n        };\n    },\n    parseHTML() {\n        return [\n            {\n                tag: 's',\n            },\n            {\n                tag: 'del',\n            },\n            {\n                tag: 'strike',\n            },\n            {\n                style: 'text-decoration',\n                consuming: false,\n                getAttrs: style => (style.includes('line-through') ? {} : false),\n            },\n        ];\n    },\n    renderHTML({ HTMLAttributes }) {\n        return ['s', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\n    },\n    addCommands() {\n        return {\n            setStrike: () => ({ commands }) => {\n                return commands.setMark(this.name);\n            },\n            toggleStrike: () => ({ commands }) => {\n                return commands.toggleMark(this.name);\n            },\n            unsetStrike: () => ({ commands }) => {\n                return commands.unsetMark(this.name);\n            },\n        };\n    },\n    addKeyboardShortcuts() {\n        return {\n            'Mod-Shift-s': () => this.editor.commands.toggleStrike(),\n        };\n    },\n    addInputRules() {\n        return [\n            markInputRule({\n                find: inputRegex,\n                type: this.type,\n            }),\n        ];\n    },\n    addPasteRules() {\n        return [\n            markPasteRule({\n                find: pasteRegex,\n                type: this.type,\n            }),\n        ];\n    },\n});\n\nexport { Strike, Strike as default, inputRegex, pasteRegex };\n//# sourceMappingURL=index.js.map\n","import { Node } from '@tiptap/core';\n\n/**\n * This extension allows you to create text nodes.\n * @see https://www.tiptap.dev/api/nodes/text\n */\nconst Text = Node.create({\n    name: 'text',\n    group: 'inline',\n});\n\nexport { Text, Text as default };\n//# sourceMappingURL=index.js.map\n","import { Extension } from '@tiptap/core';\nimport { Blockquote } from '@tiptap/extension-blockquote';\nimport { Bold } from '@tiptap/extension-bold';\nimport { BulletList } from '@tiptap/extension-bullet-list';\nimport { Code } from '@tiptap/extension-code';\nimport { CodeBlock } from '@tiptap/extension-code-block';\nimport { Document } from '@tiptap/extension-document';\nimport { Dropcursor } from '@tiptap/extension-dropcursor';\nimport { Gapcursor } from '@tiptap/extension-gapcursor';\nimport { HardBreak } from '@tiptap/extension-hard-break';\nimport { Heading } from '@tiptap/extension-heading';\nimport { History } from '@tiptap/extension-history';\nimport { HorizontalRule } from '@tiptap/extension-horizontal-rule';\nimport { Italic } from '@tiptap/extension-italic';\nimport { ListItem } from '@tiptap/extension-list-item';\nimport { OrderedList } from '@tiptap/extension-ordered-list';\nimport { Paragraph } from '@tiptap/extension-paragraph';\nimport { Strike } from '@tiptap/extension-strike';\nimport { Text } from '@tiptap/extension-text';\n\n/**\n * The starter kit is a collection of essential editor extensions.\n *\n * It’s a good starting point for building your own editor.\n */\nconst StarterKit = Extension.create({\n    name: 'starterKit',\n    addExtensions() {\n        var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;\n        const extensions = [];\n        if (this.options.bold !== false) {\n            extensions.push(Bold.configure((_a = this.options) === null || _a === void 0 ? void 0 : _a.bold));\n        }\n        if (this.options.blockquote !== false) {\n            extensions.push(Blockquote.configure((_b = this.options) === null || _b === void 0 ? void 0 : _b.blockquote));\n        }\n        if (this.options.bulletList !== false) {\n            extensions.push(BulletList.configure((_c = this.options) === null || _c === void 0 ? void 0 : _c.bulletList));\n        }\n        if (this.options.code !== false) {\n            extensions.push(Code.configure((_d = this.options) === null || _d === void 0 ? void 0 : _d.code));\n        }\n        if (this.options.codeBlock !== false) {\n            extensions.push(CodeBlock.configure((_e = this.options) === null || _e === void 0 ? void 0 : _e.codeBlock));\n        }\n        if (this.options.document !== false) {\n            extensions.push(Document.configure((_f = this.options) === null || _f === void 0 ? void 0 : _f.document));\n        }\n        if (this.options.dropcursor !== false) {\n            extensions.push(Dropcursor.configure((_g = this.options) === null || _g === void 0 ? void 0 : _g.dropcursor));\n        }\n        if (this.options.gapcursor !== false) {\n            extensions.push(Gapcursor.configure((_h = this.options) === null || _h === void 0 ? void 0 : _h.gapcursor));\n        }\n        if (this.options.hardBreak !== false) {\n            extensions.push(HardBreak.configure((_j = this.options) === null || _j === void 0 ? void 0 : _j.hardBreak));\n        }\n        if (this.options.heading !== false) {\n            extensions.push(Heading.configure((_k = this.options) === null || _k === void 0 ? void 0 : _k.heading));\n        }\n        if (this.options.history !== false) {\n            extensions.push(History.configure((_l = this.options) === null || _l === void 0 ? void 0 : _l.history));\n        }\n        if (this.options.horizontalRule !== false) {\n            extensions.push(HorizontalRule.configure((_m = this.options) === null || _m === void 0 ? void 0 : _m.horizontalRule));\n        }\n        if (this.options.italic !== false) {\n            extensions.push(Italic.configure((_o = this.options) === null || _o === void 0 ? void 0 : _o.italic));\n        }\n        if (this.options.listItem !== false) {\n            extensions.push(ListItem.configure((_p = this.options) === null || _p === void 0 ? void 0 : _p.listItem));\n        }\n        if (this.options.orderedList !== false) {\n            extensions.push(OrderedList.configure((_q = this.options) === null || _q === void 0 ? void 0 : _q.orderedList));\n        }\n        if (this.options.paragraph !== false) {\n            extensions.push(Paragraph.configure((_r = this.options) === null || _r === void 0 ? void 0 : _r.paragraph));\n        }\n        if (this.options.strike !== false) {\n            extensions.push(Strike.configure((_s = this.options) === null || _s === void 0 ? void 0 : _s.strike));\n        }\n        if (this.options.text !== false) {\n            extensions.push(Text.configure((_t = this.options) === null || _t === void 0 ? void 0 : _t.text));\n        }\n        return extensions;\n    },\n});\n\nexport { StarterKit, StarterKit as default };\n//# sourceMappingURL=index.js.map\n","import { BubbleMenuPlugin } from '@tiptap/extension-bubble-menu';\nimport { defineComponent, ref, onMounted, onBeforeUnmount, h, reactive, markRaw, customRef, getCurrentInstance, watchEffect, nextTick, unref, Teleport, shallowRef, provide } from 'vue';\nimport { Editor as Editor$1, NodeView } from '@tiptap/core';\nexport * from '@tiptap/core';\nimport { FloatingMenuPlugin } from '@tiptap/extension-floating-menu';\n\nconst BubbleMenu = defineComponent({\n    name: 'BubbleMenu',\n    props: {\n        pluginKey: {\n            type: [String, Object],\n            default: 'bubbleMenu',\n        },\n        editor: {\n            type: Object,\n            required: true,\n        },\n        updateDelay: {\n            type: Number,\n            default: undefined,\n        },\n        tippyOptions: {\n            type: Object,\n            default: () => ({}),\n        },\n        shouldShow: {\n            type: Function,\n            default: null,\n        },\n    },\n    setup(props, { slots }) {\n        const root = ref(null);\n        onMounted(() => {\n            const { updateDelay, editor, pluginKey, shouldShow, tippyOptions, } = props;\n            editor.registerPlugin(BubbleMenuPlugin({\n                updateDelay,\n                editor,\n                element: root.value,\n                pluginKey,\n                shouldShow,\n                tippyOptions,\n            }));\n        });\n        onBeforeUnmount(() => {\n            const { pluginKey, editor } = props;\n            editor.unregisterPlugin(pluginKey);\n        });\n        return () => { var _a; return h('div', { ref: root }, (_a = slots.default) === null || _a === void 0 ? void 0 : _a.call(slots)); };\n    },\n});\n\nfunction useDebouncedRef(value) {\n    return customRef((track, trigger) => {\n        return {\n            get() {\n                track();\n                return value;\n            },\n            set(newValue) {\n                // update state\n                value = newValue;\n                // update view as soon as possible\n                requestAnimationFrame(() => {\n                    requestAnimationFrame(() => {\n                        trigger();\n                    });\n                });\n            },\n        };\n    });\n}\nclass Editor extends Editor$1 {\n    constructor(options = {}) {\n        super(options);\n        this.vueRenderers = reactive(new Map());\n        this.contentComponent = null;\n        this.reactiveState = useDebouncedRef(this.view.state);\n        this.reactiveExtensionStorage = useDebouncedRef(this.extensionStorage);\n        this.on('transaction', () => {\n            this.reactiveState.value = this.view.state;\n            this.reactiveExtensionStorage.value = this.extensionStorage;\n        });\n        return markRaw(this); // eslint-disable-line\n    }\n    get state() {\n        return this.reactiveState ? this.reactiveState.value : this.view.state;\n    }\n    get storage() {\n        return this.reactiveExtensionStorage ? this.reactiveExtensionStorage.value : super.storage;\n    }\n    /**\n     * Register a ProseMirror plugin.\n     */\n    registerPlugin(plugin, handlePlugins) {\n        super.registerPlugin(plugin, handlePlugins);\n        this.reactiveState.value = this.view.state;\n    }\n    /**\n     * Unregister a ProseMirror plugin.\n     */\n    unregisterPlugin(nameOrPluginKey) {\n        super.unregisterPlugin(nameOrPluginKey);\n        this.reactiveState.value = this.view.state;\n    }\n}\n\nconst EditorContent = defineComponent({\n    name: 'EditorContent',\n    props: {\n        editor: {\n            default: null,\n            type: Object,\n        },\n    },\n    setup(props) {\n        const rootEl = ref();\n        const instance = getCurrentInstance();\n        watchEffect(() => {\n            const editor = props.editor;\n            if (editor && editor.options.element && rootEl.value) {\n                nextTick(() => {\n                    if (!rootEl.value || !editor.options.element.firstChild) {\n                        return;\n                    }\n                    const element = unref(rootEl.value);\n                    rootEl.value.append(...editor.options.element.childNodes);\n                    // @ts-ignore\n                    editor.contentComponent = instance.ctx._;\n                    editor.setOptions({\n                        element,\n                    });\n                    editor.createNodeViews();\n                });\n            }\n        });\n        onBeforeUnmount(() => {\n            const editor = props.editor;\n            if (!editor) {\n                return;\n            }\n            // destroy nodeviews before vue removes dom element\n            if (!editor.isDestroyed) {\n                editor.view.setProps({\n                    nodeViews: {},\n                });\n            }\n            editor.contentComponent = null;\n            if (!editor.options.element.firstChild) {\n                return;\n            }\n            const newElement = document.createElement('div');\n            newElement.append(...editor.options.element.childNodes);\n            editor.setOptions({\n                element: newElement,\n            });\n        });\n        return { rootEl };\n    },\n    render() {\n        const vueRenderers = [];\n        if (this.editor) {\n            this.editor.vueRenderers.forEach(vueRenderer => {\n                const node = h(Teleport, {\n                    to: vueRenderer.teleportElement,\n                    key: vueRenderer.id,\n                }, h(vueRenderer.component, {\n                    ref: vueRenderer.id,\n                    ...vueRenderer.props,\n                }));\n                vueRenderers.push(node);\n            });\n        }\n        return h('div', {\n            ref: (el) => { this.rootEl = el; },\n        }, ...vueRenderers);\n    },\n});\n\nconst FloatingMenu = defineComponent({\n    name: 'FloatingMenu',\n    props: {\n        pluginKey: {\n            // TODO: TypeScript breaks :(\n            // type: [String, Object as PropType<Exclude<FloatingMenuPluginProps['pluginKey'], string>>],\n            type: null,\n            default: 'floatingMenu',\n        },\n        editor: {\n            type: Object,\n            required: true,\n        },\n        tippyOptions: {\n            type: Object,\n            default: () => ({}),\n        },\n        shouldShow: {\n            type: Function,\n            default: null,\n        },\n    },\n    setup(props, { slots }) {\n        const root = ref(null);\n        onMounted(() => {\n            const { pluginKey, editor, tippyOptions, shouldShow, } = props;\n            editor.registerPlugin(FloatingMenuPlugin({\n                pluginKey,\n                editor,\n                element: root.value,\n                tippyOptions,\n                shouldShow,\n            }));\n        });\n        onBeforeUnmount(() => {\n            const { pluginKey, editor } = props;\n            editor.unregisterPlugin(pluginKey);\n        });\n        return () => { var _a; return h('div', { ref: root }, (_a = slots.default) === null || _a === void 0 ? void 0 : _a.call(slots)); };\n    },\n});\n\nconst NodeViewContent = defineComponent({\n    name: 'NodeViewContent',\n    props: {\n        as: {\n            type: String,\n            default: 'div',\n        },\n    },\n    render() {\n        return h(this.as, {\n            style: {\n                whiteSpace: 'pre-wrap',\n            },\n            'data-node-view-content': '',\n        });\n    },\n});\n\nconst NodeViewWrapper = defineComponent({\n    name: 'NodeViewWrapper',\n    props: {\n        as: {\n            type: String,\n            default: 'div',\n        },\n    },\n    inject: ['onDragStart', 'decorationClasses'],\n    render() {\n        var _a, _b;\n        return h(this.as, {\n            // @ts-ignore\n            class: this.decorationClasses,\n            style: {\n                whiteSpace: 'normal',\n            },\n            'data-node-view-wrapper': '',\n            // @ts-ignore (https://github.com/vuejs/vue-next/issues/3031)\n            onDragstart: this.onDragStart,\n        }, (_b = (_a = this.$slots).default) === null || _b === void 0 ? void 0 : _b.call(_a));\n    },\n});\n\nconst useEditor = (options = {}) => {\n    const editor = shallowRef();\n    onMounted(() => {\n        editor.value = new Editor(options);\n    });\n    onBeforeUnmount(() => {\n        var _a;\n        (_a = editor.value) === null || _a === void 0 ? void 0 : _a.destroy();\n    });\n    return editor;\n};\n\n/**\n * This class is used to render Vue components inside the editor.\n */\nclass VueRenderer {\n    constructor(component, { props = {}, editor }) {\n        this.id = Math.floor(Math.random() * 0xFFFFFFFF).toString();\n        this.editor = editor;\n        this.component = markRaw(component);\n        this.teleportElement = document.createElement('div');\n        this.element = this.teleportElement;\n        this.props = reactive(props);\n        this.editor.vueRenderers.set(this.id, this);\n        if (this.editor.contentComponent) {\n            this.editor.contentComponent.update();\n            if (this.teleportElement.children.length !== 1) {\n                throw Error('VueRenderer doesn’t support multiple child elements.');\n            }\n            this.element = this.teleportElement.firstElementChild;\n        }\n    }\n    get ref() {\n        var _a;\n        return (_a = this.editor.contentComponent) === null || _a === void 0 ? void 0 : _a.refs[this.id];\n    }\n    updateProps(props = {}) {\n        Object\n            .entries(props)\n            .forEach(([key, value]) => {\n            this.props[key] = value;\n        });\n    }\n    destroy() {\n        this.editor.vueRenderers.delete(this.id);\n    }\n}\n\nconst nodeViewProps = {\n    editor: {\n        type: Object,\n        required: true,\n    },\n    node: {\n        type: Object,\n        required: true,\n    },\n    decorations: {\n        type: Object,\n        required: true,\n    },\n    selected: {\n        type: Boolean,\n        required: true,\n    },\n    extension: {\n        type: Object,\n        required: true,\n    },\n    getPos: {\n        type: Function,\n        required: true,\n    },\n    updateAttributes: {\n        type: Function,\n        required: true,\n    },\n    deleteNode: {\n        type: Function,\n        required: true,\n    },\n};\nclass VueNodeView extends NodeView {\n    mount() {\n        const props = {\n            editor: this.editor,\n            node: this.node,\n            decorations: this.decorations,\n            selected: false,\n            extension: this.extension,\n            getPos: () => this.getPos(),\n            updateAttributes: (attributes = {}) => this.updateAttributes(attributes),\n            deleteNode: () => this.deleteNode(),\n        };\n        const onDragStart = this.onDragStart.bind(this);\n        this.decorationClasses = ref(this.getDecorationClasses());\n        const extendedComponent = defineComponent({\n            extends: { ...this.component },\n            props: Object.keys(props),\n            template: this.component.template,\n            setup: reactiveProps => {\n                var _a, _b;\n                provide('onDragStart', onDragStart);\n                provide('decorationClasses', this.decorationClasses);\n                return (_b = (_a = this.component).setup) === null || _b === void 0 ? void 0 : _b.call(_a, reactiveProps, {\n                    expose: () => undefined,\n                });\n            },\n            // add support for scoped styles\n            // @ts-ignore\n            // eslint-disable-next-line\n            __scopeId: this.component.__scopeId,\n            // add support for CSS Modules\n            // @ts-ignore\n            // eslint-disable-next-line\n            __cssModules: this.component.__cssModules,\n            // add support for vue devtools\n            // @ts-ignore\n            // eslint-disable-next-line\n            __name: this.component.__name,\n            // @ts-ignore\n            // eslint-disable-next-line\n            __file: this.component.__file,\n        });\n        this.renderer = new VueRenderer(extendedComponent, {\n            editor: this.editor,\n            props,\n        });\n    }\n    get dom() {\n        if (!this.renderer.element.hasAttribute('data-node-view-wrapper')) {\n            throw Error('Please use the NodeViewWrapper component for your node view.');\n        }\n        return this.renderer.element;\n    }\n    get contentDOM() {\n        if (this.node.isLeaf) {\n            return null;\n        }\n        const contentElement = this.dom.querySelector('[data-node-view-content]');\n        return (contentElement || this.dom);\n    }\n    update(node, decorations) {\n        const updateProps = (props) => {\n            this.decorationClasses.value = this.getDecorationClasses();\n            this.renderer.updateProps(props);\n        };\n        if (typeof this.options.update === 'function') {\n            const oldNode = this.node;\n            const oldDecorations = this.decorations;\n            this.node = node;\n            this.decorations = decorations;\n            return this.options.update({\n                oldNode,\n                oldDecorations,\n                newNode: node,\n                newDecorations: decorations,\n                updateProps: () => updateProps({ node, decorations }),\n            });\n        }\n        if (node.type !== this.node.type) {\n            return false;\n        }\n        if (node === this.node && this.decorations === decorations) {\n            return true;\n        }\n        this.node = node;\n        this.decorations = decorations;\n        updateProps({ node, decorations });\n        return true;\n    }\n    selectNode() {\n        this.renderer.updateProps({\n            selected: true,\n        });\n        this.renderer.element.classList.add('ProseMirror-selectednode');\n    }\n    deselectNode() {\n        this.renderer.updateProps({\n            selected: false,\n        });\n        this.renderer.element.classList.remove('ProseMirror-selectednode');\n    }\n    getDecorationClasses() {\n        return (this.decorations\n            // @ts-ignore\n            .map(item => item.type.attrs.class)\n            .flat()\n            .join(' '));\n    }\n    destroy() {\n        this.renderer.destroy();\n    }\n}\nfunction VueNodeViewRenderer(component, options) {\n    return (props) => {\n        // try to get the parent component\n        // this is important for vue devtools to show the component hierarchy correctly\n        // maybe it’s `undefined` because <editor-content> isn’t rendered yet\n        if (!props.editor.contentComponent) {\n            return {};\n        }\n        return new VueNodeView(component, props, options);\n    };\n}\n\nexport { BubbleMenu, Editor, EditorContent, FloatingMenu, NodeViewContent, NodeViewWrapper, VueNodeViewRenderer, VueRenderer, nodeViewProps, useEditor };\n//# sourceMappingURL=index.js.map\n","<template>\n    <div class=\"loading-button\" :class=\"{loading}\">\n        <div><slot /></div>\n        <div>\n            <Spinner v-if=\"loading || delayLoading\" />\n        </div>\n    </div>\n</template>\n\n\n<script lang=\"ts\">\nimport { Component, Prop, VueComponent, Watch } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport Spinner from \"../Spinner.vue\";\n\n@Component({\n    components: {Spinner}\n})\nexport default class LoadingButton extends VueComponent {\n    @Prop({ default: false, type: Boolean })\n    loading!: boolean;\n\n    // Remove the spinner animation from the dom to save some resources of the browser\n    delayLoading = false\n\n\n    @Watch('loading')\n    onValueChanged(val: boolean, old: boolean) {\n        if (!val && old) {\n            this.delayLoading = true\n            setTimeout(() => {\n                this.delayLoading = false\n            }, 500)\n        } else {\n            if (val) {\n                this.delayLoading = true;\n            }\n        }\n    }\n}\n</script>\n\n<style lang=\"scss\">\n\n.loading-button {\n    position: relative;\n    display: inline-block;\n\n    &.block {\n        display: block;\n    }\n\n    &.bottom {\n        margin-top: auto;\n        padding-top: 15px;\n    }\n\n    > div:first-child {\n        transition: transform 0.3s;\n        display: flex;\n        flex-direction: column;\n        align-items: stretch;\n    }\n\n    > div:last-child {\n        position: absolute;\n        opacity: 0;\n        top: 50%;\n        left: 50%;\n        width: 24px;\n        height: 24px;\n        transition: opacity 0.3s;\n        contain: strict;\n        transform: translate(-50%, -50%);\n\n        pointer-events: none;\n        display: flex;\n        align-items: center;\n        justify-content: flex-end;\n    }\n\n    &.loading {\n        > div:first-child {\n            opacity: 0.2;\n        }\n        > div:last-child {\n            opacity: 1;\n        }\n    }\n}\n</style>\n","<template>\n    <component :is=\"elementName\" class=\"upload-button\">\n        <LoadingButton :loading=\"uploading\">\n            <slot>\n                <div class=\"button text only-icon-smartphone\">\n                    <span class=\"icon camera\" />\n                    <span>{{ text || \"Uploaden\" }}</span>\n                </div>\n            </slot>\n        </LoadingButton>\n        <input type=\"file\" class=\"file-upload\" accept=\"image/png, image/jpeg, image/svg+xml, image/webp\" @change=\"changedFile\">\n    </component>\n</template>\n\n<script lang=\"ts\">\nimport { SimpleError } from \"@simonbackx/simple-errors\";\nimport { Request } from \"@simonbackx/simple-networking\";\nimport { NavigationMixin } from '@simonbackx/vue-app-navigation';\nimport { Image, ResolutionRequest, Version } from \"@stamhoofd/structures\";\nimport { Component, Mixins, Prop } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport { Validator } from \"../errors/Validator\";\nimport LoadingButton from \"../navigation/LoadingButton.vue\";\nimport { Toast } from \"../overlays/Toast\";\nimport STInputBox from \"./STInputBox.vue\";\n\n@Component({\n    components: {\n        STInputBox,\n        LoadingButton\n    }\n})\nexport default class UploadButton extends Mixins(NavigationMixin) {\n    @Prop({ default: 'label' })\n        elementName!: string;\n\n    @Prop({ default: \"\" }) \n        text: string;\n\n    @Prop({ default: null }) \n        validator: Validator | null\n\n    @Prop({ default: null })\n        resolutions: ResolutionRequest[] | null\n    \n    @Prop({ default: null })\n        modelValue: Image | null;\n\n    uploading = false\n\n    beforeUnmount() {\n        Request.cancelAll(this)\n    }\n\n    changedFile(event) {\n        if (!event.target.files || event.target.files.length !== 1) {\n            return;\n        }\n        if (this.uploading) {\n            return;\n        }\n        Request.cancelAll(this)\n\n        const file = event.target.files[0];\n\n        if (file.size > 5 * 1024 * 1024) {\n            const error = new SimpleError({\n                code: 'file_too_large',\n                message: 'De bestandsgrootte is te groot. De afbeelding mag maximaal 5MB groot zijn. Probeer de afbeelding te verkleinen en daarna opnieuw te selecteren.'\n            })\n            Toast.fromError(error).setHide(null).show()\n            return;\n        }\n\n        const resolutions = this.resolutions ?? [ResolutionRequest.create({ height: 720 })]\n\n        const formData = new FormData();\n        formData.append(\"file\", file);\n        formData.append(\"resolutions\", JSON.stringify(resolutions.map(r => r.encode({ version: Version }))))\n\n        this.uploading = true;\n        //this.errorBox = null;\n\n        this.$context.authenticatedServer\n            .request({\n                method: \"POST\",\n                path: \"/upload-image\",\n                body: formData,\n                decoder: Image,\n                timeout: 60*1000,\n                shouldRetry: false,\n                owner: this\n            })\n            .then(response => {\n                this.$emit('update:modelValue', response.data)\n            })\n            .catch(e => {\n                console.error(e);\n                Toast.fromError(e).setHide(null).show()\n                //this.errorBox = new ErrorBox(e)\n                // TODO!\n            })\n            .finally(() => {\n                this.uploading = false;\n\n                // Clear selection\n                event.target.value = null;\n            });\n    }\n}\n</script>\n\n<style lang=\"scss\">\n\n.upload-button {\n    .file-upload {\n        display: none;\n    }\n}\n\n</style>\n","<template>\n    <div class=\"st-button-toolbar\">\n        <div>\n            <slot />\n        </div>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useHideTabBar } from '../containers/TabBarController.vue';\n\nuseHideTabBar();\n</script>\n\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n\n.st-button-toolbar {\n    margin: 0;\n    margin-bottom: calc(-1 * var(--st-vertical-padding, 40px));\n    margin-bottom: calc(-1 * var(--st-vertical-padding, 40px) - var(--st-safe-area-bottom, 0px));\n    padding-top: var(--st-vertical-padding, 20px);\n    \n    > div {\n        flex-shrink: 0;\n        height: 60px;\n\n        .popup & {\n            // Smaller inside a popup\n            height: 45px;\n        }\n        box-sizing: content-box;\n        border-top: $border-width-thin solid $color-border-shade;\n        padding-bottom: var(--st-safe-area-bottom, 0px);\n\n        margin: 0;\n\n        background: $color-background-shade;\n\n        display: flex;\n        flex-direction: row;\n        align-items: stretch;\n\n        position: sticky;\n        bottom: 0;\n        \n        > .button, > .upload-button {\n            flex-grow: 1;\n\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            justify-content: center;\n            height: auto;\n            line-height: 1;\n            position: relative;\n            overflow: visible;\n\n            > span {\n                margin-bottom: 4px;\n            }\n\n            &.is-active {\n                color: $color-primary;\n            }\n\n            > .style-bubble {\n                background: $color-error;\n                position: absolute;\n                left: 50%;\n                bottom: 50%;\n                transform: translate(6px, 0);\n            }\n        }\n    }\n}\n</style>\n","import { Node } from '@tiptap/core'\n\ndeclare module '@tiptap/core' {\n    interface Commands<ReturnType> {\n        descriptiveText: {\n            /**\n       * Set a heading node\n       */\n            setDescriptiveText: () => ReturnType,\n            /**\n       * Toggle a heading node\n       */\n            toggleDescriptiveText: () => ReturnType,\n        }\n    }\n}\n\nexport const DescriptiveText = Node.create({\n    name: 'descriptiveText',\n\n    content: 'inline*',\n\n    group: 'block',\n\n    defining: true,\n\n    addCommands() {\n        return {\n            setDescriptiveText: () => ({ commands }) => {\n                return commands.setNode(this.name, {})\n            },\n            toggleDescriptiveText: () => ({ commands }) => {\n                return commands.toggleNode(this.name, 'paragraph', {})\n            },\n        }\n    },\n\n    parseHTML() {\n        return [{\n            tag: `p`,\n            priority: 51, // 50 is default, so check before the normal paragraphs\n            getAttrs: node => {\n                return (node as any)?.getAttribute('class') === 'description' && null\n            },\n        }]\n    },\n\n    renderHTML() {\n        return ['p', { class: \"description\" }, 0]\n    },\n})","import { EditorSmartButton } from '@stamhoofd/structures'\nimport { mergeAttributes, Node, nodeInputRule } from '@tiptap/core'\n\nexport type SmartButtonNodeOptions = {\n    HTMLAttributes: Record<string, any>,\n    smartButtons: EditorSmartButton[]\n}\n\ndeclare module '@tiptap/core' {\n    interface Commands<ReturnType> {\n        smartButtonNode: {\n            insertSmartButton: (smartButton: EditorSmartButton, options?: { updateSelection?: boolean }) => ReturnType,\n        }\n    }\n}\n\nexport const SmartButtonNode = Node.create<SmartButtonNodeOptions>({\n    priority: 1000,\n    name: 'smartButton',\n\n    addOptions() {\n        return {\n            HTMLAttributes: {},\n            smartButtons: []\n        }\n    }, \n\n    group: 'block',\n\n    inline: false,\n    selectable: true,\n    draggable: true,\n\n    atom: false,\n    content: \"text*\",\n\n    // disallows all marks\n    marks: '',\n     \n    addCommands() {\n        return {\n            insertSmartButton: (smartButton: EditorSmartButton, options?: { updateSelection?: boolean }) => ({ commands }) => {\n                return commands.insertContent({ type: smartButton.type === 'block' ? 'smartButton' : 'smartButtonInline', attrs: { id: smartButton.id }, content: [{ type: \"text\", text: smartButton.text }] }, options)\n            },\n        }\n    },\n\n    addInputRules() {\n        return this.options.smartButtons.filter(b => b.type === 'block').map(s => {\n            return nodeInputRule({\n                find: new RegExp(`\\\\{\\\\{${s.id}\\\\}\\\\}$`),\n                type: this.type,\n                getAttributes: () => { return { id: s.id } }\n            })\n        })\n    },\n\n    addAttributes() {\n        return {\n            id: {\n                default: null,\n                parseHTML: element => element.getAttribute('data-id'),\n                renderHTML: attributes => {\n                    if (!attributes.id) {\n                        return {}\n                    }\n\n                    return {\n                        'data-id': attributes.id,\n                    }\n                },\n            },\n        }\n    },\n\n    parseHTML() {\n        return [\n            {\n                tag: `div[data-type=\"${this.name}\"]`,\n            }\n        ]\n    },\n\n    renderHTML({ node, HTMLAttributes }) {\n        const button = this.options.smartButtons.find(s => s.id === node.attrs.id)\n\n        return [\n            // We need the extra div because display: block is required (and button should be display inline block)\n            'div',\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n            mergeAttributes({ 'data-type': this.name }, this.options.HTMLAttributes, HTMLAttributes),\n            [\n                \"span\",\n                mergeAttributes({ href: \"{{\"+(button?.id ?? \"\")+\"}}\", class: \"button primary\" }, this.options.HTMLAttributes, HTMLAttributes),\n                0\n            ],\n        ]\n    },\n\n    /**\n     * Text when copying to the clipboard\n     */\n    renderText({ node }) {\n        return \"{{\"+node.attrs.id+\"}}\"\n    },\n})\n\nexport const SmartButtonInlineNode = Node.create<SmartButtonNodeOptions>({\n    priority: 1000,\n    name: 'smartButtonInline',\n\n    addOptions() {\n        return {\n            HTMLAttributes: {},\n            smartButtons: []\n        }\n    }, \n\n    group: 'inline',\n\n    selectable: true,\n    draggable: true,\n    inline: true,\n    atom: false,\n    content: \"inline+\",\n    keepOnSplit: false,\n\n    addInputRules() {\n        return this.options.smartButtons.filter(b => b.type === 'inline').map(s => {\n            return nodeInputRule({\n                find: new RegExp(`\\\\{\\\\{${s.id}\\\\}\\\\}$`),\n                type: this.type,\n                getAttributes: () => { return { id: s.id } }\n            })\n        })\n    },\n\n    addAttributes() {\n        return {\n            id: {\n                default: null,\n                parseHTML: element => element.getAttribute('data-id'),\n                renderHTML: attributes => {\n                    if (!attributes.id) {\n                        return {}\n                    }\n\n                    return {\n                        'data-id': attributes.id,\n                    }\n                },\n            },\n        }\n    },\n\n    parseHTML() {\n        return [\n            {\n                tag: `span[data-type=\"${this.name}\"]`,\n            }\n        ]\n    },\n\n    renderHTML({ node, HTMLAttributes }) {\n        const button = this.options.smartButtons.find(s => s.id === node.attrs.id)\n\n        return [\n            \"span\",\n            mergeAttributes({ 'data-type': this.name, href: \"{{\"+(button?.id ?? \"\")+\"}}\" }, this.options.HTMLAttributes, HTMLAttributes),\n            0\n        ];\n    },\n\n    /**\n     * Text when copying to the clipboard\n     */\n    renderText({ node }) {\n        return \"{{\"+node.attrs.id+\"}}\"\n    },\n})\n","import { EditorSmartVariable } from '@stamhoofd/structures';\nimport { mergeAttributes, Node, nodeInputRule } from '@tiptap/core';\nimport { TextSelection } from '@tiptap/pm/state';\n\nexport type SmartVariableNodeOptions = {\n    HTMLAttributes: Record<string, any>;\n    smartVariables: EditorSmartVariable[];\n};\n\ndeclare module '@tiptap/core' {\n    interface Commands<ReturnType> {\n        smartVariableNode: {\n            insertSmartVariable: (smartVariable: EditorSmartVariable, options?: { updateSelection?: boolean }) => ReturnType;\n        };\n    }\n}\n\nexport const SmartVariableNode = Node.create<SmartVariableNodeOptions>({\n    name: 'smartVariable',\n\n    addOptions() {\n        return {\n            HTMLAttributes: {},\n            smartVariables: [],\n        };\n    },\n\n    group: 'inline',\n\n    selectable: true,\n    draggable: true,\n    inline: true,\n    atom: true,\n\n    addCommands() {\n        return {\n            insertSmartVariable: (smartVariable: EditorSmartVariable, options?: { updateSelection?: boolean }) => ({ chain, commands }) => {\n                if (smartVariable.html && (options?.updateSelection === undefined || options?.updateSelection)) {\n                    return chain()\n                        .insertContent(smartVariable.getJSONContent(), options)\n                        // set cursor after horizontal rule\n                        .command(({ tr, dispatch }) => {\n                            if (dispatch) {\n                                const { $to } = tr.selection;\n                                const posAfter = $to.end();\n\n                                if ($to.nodeAfter) {\n                                    tr.setSelection(TextSelection.create(tr.doc, $to.pos));\n                                }\n                                else {\n                                // add node after horizontal rule if it’s the end of the document\n                                    const node = $to.parent.type.contentMatch.defaultType?.create();\n\n                                    if (node) {\n                                        tr.insert(posAfter, node);\n                                        tr.setSelection(TextSelection.create(tr.doc, posAfter));\n                                    }\n                                }\n\n                                tr.scrollIntoView();\n                            }\n\n                            return true;\n                        })\n                        .run();\n                }\n                return commands.insertContent(smartVariable.getJSONContent(), options);\n            },\n        };\n    },\n\n    addInputRules() {\n        return this.options.smartVariables.map((s) => {\n            return nodeInputRule({\n                find: new RegExp(`\\\\{\\\\{${s.id}\\\\}\\\\}$`),\n                type: this.type,\n                getAttributes: () => { return { id: s.id }; },\n            });\n        });\n    },\n\n    addAttributes() {\n        return {\n            id: {\n                default: null,\n                parseHTML: element => element.getAttribute('data-id'),\n                renderHTML: (attributes) => {\n                    if (!attributes.id) {\n                        return {};\n                    }\n\n                    return {\n                        'data-id': attributes.id,\n                    };\n                },\n            },\n        };\n    },\n\n    parseHTML() {\n        return this.options.smartVariables.filter(v => v.html === undefined).map((variable) => {\n            return {\n                tag: `span[data-type=\"${this.name}\"][data-id=\"${variable.id}\"]`,\n            };\n        });\n    },\n\n    renderHTML({ node, HTMLAttributes }) {\n        const smartVariable = this.options.smartVariables.find(s => s.id === node.attrs.id);\n        if (!smartVariable || !smartVariable.html) {\n            return [\n                'span',\n\n                mergeAttributes({ 'data-type': this.name }, this.options.HTMLAttributes, HTMLAttributes),\n                smartVariable?.example || smartVariable?.name || node.attrs.id || this.name, // Empty string won't get rendered but kept for reference in case the smart variable is found again later\n            ];\n        }\n        const dom = document.createElement('div');\n        dom.setAttribute('data-type', this.name);\n        dom.innerHTML = smartVariable.html;\n        return { dom };\n    },\n\n    renderText({ node }) {\n        return '{{' + node.attrs.id + '}}';\n    },\n});\n\nexport const SmartVariableNodeBlock = SmartVariableNode.extend({\n    name: 'smartVariableBlock',\n    inline: false,\n    group: 'block',\n\n    parseHTML() {\n        return this.options.smartVariables.filter(v => v.html !== undefined).map((variable) => {\n            return {\n                tag: `div[data-type=\"${this.name}\"][data-id=\"${variable.id}\"]`,\n            };\n        });\n    },\n\n    renderHTML({ node }) {\n        const smartVariable = this.options.smartVariables.find(s => s.id === node.attrs.id);\n        const dom = document.createElement('div');\n        dom.setAttribute('data-type', this.name);\n        dom.setAttribute('data-id', (node.attrs.id ?? '') + '');\n        dom.innerHTML = smartVariable?.html ?? '';\n        return { dom };\n    },\n});\n","<template>\n    <div \n        class=\"tooltip\" \n        :class=\"usedXPlacement+' '+usedYPlacement+' '+icon\"\n        :style=\"{ transformOrigin, top: top !== null ? top + 'px' : undefined, left: left !== null ? (left + 'px') : undefined, right: right !== null ? (right + 'px') : undefined, bottom: bottom !== null ? (bottom + 'px') : undefined, width: usedPreferredWidth !== null ? (usedPreferredWidth + 'px') : undefined, height: usedPreferredHeight !== null ? (usedPreferredHeight + 'px') : undefined }\"  \n        @click=\"hide\"\n    >\n        <span v-if=\"icon\" :class=\"'icon '+icon\" />\n        <span>{{ text }}</span>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { NavigationMixin } from \"@simonbackx/vue-app-navigation\";\nimport { Mixins } from \"@simonbackx/vue-app-navigation/classes\";\nimport { Component, Prop } from \"@simonbackx/vue-app-navigation/classes\";\n\n@Component\nexport default class Tooltip extends Mixins(NavigationMixin) {\n    @Prop({\n        default: \"No tooltip text set\",\n    })\n        text!: string;\n\n    @Prop({\n        default: null,\n    })\n        icon!: string | null;\n    \n    @Prop({\n        default: 0,\n    })\n        x!: number;\n\n    @Prop({\n        default: 0,\n    })\n        y!: number;\n\n    top: number | null = null\n    left: number | null = null\n    right: number | null = null\n    bottom: number | null = null\n\n    transformOrigin = \"0 0\"\n\n    @Prop({\n        default: \"right\",\n    })\n        xPlacement!: \"right\" | \"left\";\n\n    usedXPlacement: \"right\" | \"left\" = this.xPlacement\n\n    @Prop({\n        default: \"bottom\",\n    })\n        yPlacement!: \"bottom\" | \"top\";\n\n    usedYPlacement: \"bottom\" | \"top\" = this.yPlacement\n\n    /**\n     * In case a placement is not possible, instead of just swapping xPlacement, also affect the x position first with the wrapWidth (needed for e.g. context menu's)\n     */\n    @Prop({\n        default: null,\n    })\n        wrapWidth!: number | null\n\n    /**\n     * In case a placement is not possible, instead of just swapping xPlacement, also affect the x position first with the wrapWidth (needed for e.g. context menu's)\n     */\n    @Prop({\n        default: null,\n    })\n        wrapHeight!: number | null\n\n    usedPreferredHeight: number | null = null;\n    usedPreferredWidth: number | null = null;\n\n    mounted() {\n        // Calculate position\n        let width = (this.$el as HTMLElement).offsetWidth;\n        let height = (this.$el as HTMLElement).offsetHeight;\n\n        const viewPadding = 15;\n\n        const win = window,\n            doc = document,\n            docElem = doc.documentElement,\n            body = doc.getElementsByTagName(\"body\")[0],\n            clientWidth = win.innerWidth || docElem.clientWidth || body.clientWidth,\n            clientHeight = win.innerHeight || docElem.clientHeight || body.clientHeight;\n\n        if (width > clientWidth - viewPadding * 2) {\n            this.usedPreferredWidth = clientWidth - viewPadding * 2;\n            width = clientWidth - viewPadding * 2;\n        }\n\n        if (height > clientHeight - viewPadding * 2) {\n            this.usedPreferredHeight = clientHeight - viewPadding * 2;\n            height = clientHeight - viewPadding * 2;\n        }\n\n        let usedX = this.x\n\n        if (this.xPlacement === \"right\") {\n            this.left = this.x; \n            \n            // If the remaining space is too small, we need to wrap\n            if (width > clientWidth - viewPadding - this.x) {\n                this.left = null\n                this.usedXPlacement = \"left\"\n\n                if (this.wrapWidth !== null) {\n                    // Wrap instead of sticking to right\n                    usedX = usedX - this.wrapWidth\n                    this.right = Math.min(clientWidth - usedX, clientWidth - viewPadding - width);\n\n                    if (this.right < viewPadding) {\n                        this.right = viewPadding\n                    }\n                } else {\n                    this.right = viewPadding\n                }\n            } else {\n                if (this.left < viewPadding) {\n                    this.left = viewPadding\n                }\n            }\n            //- Math.max(0, width - (clientWidth - viewPadding - usedX);\n\n        } else {\n            this.right = Math.min(clientWidth - usedX, clientWidth - viewPadding - width)\n\n            if (this.right < viewPadding) {\n                this.right = viewPadding\n            }\n        }\n\n        let usedY = this.y\n\n        if (this.yPlacement === \"bottom\") {\n            this.top = this.y// - Math.max(0, height - (clientHeight - viewPadding - this.y)); // remove border\n\n            // If the remaining space is too small, we need to wrap\n            if (height > clientHeight - viewPadding - this.y) {\n                this.top = null\n                this.usedYPlacement = \"top\"\n\n                if (this.wrapHeight !== null) {\n                    // Wrap instead of sticking to bottom\n                    usedY = usedY - this.wrapHeight\n                    this.bottom = Math.min(clientHeight - usedY, clientHeight - viewPadding - height);\n\n                    if (this.bottom < viewPadding) {\n                        this.bottom = viewPadding\n                    }\n                } else {\n                    this.bottom = viewPadding\n                }\n            } else {\n                if (this.top < viewPadding) {\n                    this.top = viewPadding\n                }\n            }\n        } else {\n            this.bottom = Math.min(clientHeight - usedY, clientHeight - viewPadding - height); // remove border\n\n            if (this.bottom < viewPadding) {\n                this.bottom = viewPadding\n            }\n        }\n\n        const objLeft = this.left ? this.left : (clientWidth - this.right! - width)\n        const xTransform = ((usedX - objLeft) / width * 100).toFixed(2)\n\n        const objTop = this.top ? this.top : (clientHeight - this.bottom! - height)\n        const yTransform = ((usedY - objTop) / height * 100).toFixed(2)\n\n        this.transformOrigin = xTransform + \"% \"+yTransform+\"%\"\n\n        // Hide on scroll or any touch\n        document.addEventListener(\"touchstart\", this.hide, { passive: true })\n        document.addEventListener(\"pointerdown\", this.hide, { passive: true })\n        document.addEventListener(\"wheel\", this.hide, { passive: true })\n    }\n\n    beforeUnmount() {\n        document.removeEventListener(\"touchstart\", this.hide)\n        document.removeEventListener(\"pointerdown\", this.hide)\n        document.removeEventListener(\"wheel\", this.hide)\n    }\n\n    hide() {\n        this.pop({force: true})\n    }\n}\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use '@stamhoofd/scss/base/text-styles.scss';\n\n.tooltip {\n    position: fixed;\n    z-index: 10000;\n    @extend .style-context-menu-item;\n    line-height: 1.5;\n    @extend .style-overlay-shadow;\n    box-sizing: border-box;\n    max-width: 350px;\n\n    background: $color-background-shade-darker;\n    \n    --color-current-background: #{$color-background-shade-darker};\n    --color-current-background-shade: #{$color-border};\n\n    border: $border-width-thin solid $color-border-shade;\n    padding: 10px 15px;\n    border-radius: $border-radius-modals;\n    color: $color-dark;\n\n    pointer-events: none;\n\n    transform-origin: 0% 0%;\n    transition: transform 0.2s;\n\n    &.top {\n        transform-origin: 0% 100%;\n    }\n\n    &.left {\n        transform-origin: 100% 0%;\n\n        &.top {\n            transform-origin: 100% 100%;\n        }\n    }\n\n    &.show-enter-active,\n    &.show-leave-active {\n        transition: opacity 0.2s, transform 0.2s;\n    }\n    &.show-enter-from, &.show-leave-to /* .fade-leave-active below version 2.1.8 */ {\n        opacity: 0;\n        transform: scale(0.8, 0.8);\n    }\n\n    > .icon {\n        display: inline-block;\n        margin: -10px 5px -10px 0;\n        vertical-align: middle;\n    }\n\n    > span {\n        display: inline-block;\n        vertical-align: middle;\n    }\n\n    &.green {\n        background-color: $color-success-background;\n        color: $color-success-dark;\n\n        .progress {\n            background: $color-success;\n        }\n    }\n}\n</style>\n","import { ComponentWithProperties } from \"@simonbackx/vue-app-navigation\";\n\nimport { ModalStackEventBus } from \"../..\";\nimport Tooltip from \"../overlays/Tooltip.vue\";\nimport type {ObjectDirective} from \"vue\";\n\nconst TooltipDirective: ObjectDirective<HTMLElement & {$tooltipDisplayedComponent: null|ComponentWithProperties}, string> = {\n    beforeMount(el, binding) {\n        let isMouseHover = false;\n        const displayedComponent: ComponentWithProperties | null = el.$tooltipDisplayedComponent ?? null;\n        el.$tooltipDisplayedComponent = displayedComponent;\n\n        if (!binding.value || typeof binding.value !== \"string\") {\n            return;\n        }\n\n        if ('ontouchstart' in window) {\n            // Ignore on touch devices\n            return;\n        }\n\n        // Add a hover listener\n        el.addEventListener(\n            \"mouseover\",\n            (_event) => {                \n                if (!isMouseHover) {\n                    isMouseHover = true;\n\n                    setTimeout(() => {\n                        if (isMouseHover && !el.$tooltipDisplayedComponent) {\n                            const rect = el.getBoundingClientRect();\n\n                            // Present\n                            el.$tooltipDisplayedComponent = new ComponentWithProperties(Tooltip, {\n                                text: binding.value,\n                                x: rect.left,\n                                y: rect.bottom,\n                                xPlacement: \"right\",\n                                yPlacement: \"bottom\",\n                                wrapHeight: rect.height,\n                            });\n\n                            ModalStackEventBus.sendEvent(\"present\", {\n                                components: [\n                                    el.$tooltipDisplayedComponent\n                                ],\n                                modalDisplayStyle: \"overlay\",\n                            }).catch(console.error)\n                        }\n                    }, 200);\n                }\n            },\n            { passive: true }\n        );\n        el.addEventListener(\n            \"mouseleave\",\n            (_event) => {\n                isMouseHover = false;\n\n                if (el.$tooltipDisplayedComponent && el.$tooltipDisplayedComponent.vnode) {\n                    try {\n                        (el.$tooltipDisplayedComponent.vnode.component!.proxy as any).pop({force: true})\n                    } catch (e) {\n                        // Ignore\n                        console.error(e);\n                    }\n                } else {\n                    console.error(\"Tooltip $tooltipDisplayedComponent.vnode not set\", el.$tooltipDisplayedComponent);\n                }\n                el.$tooltipDisplayedComponent = null;\n            },\n            { passive: true }\n        );\n    },\n\n    unmounted(el, binding, vnode) {\n        if (el.$tooltipDisplayedComponent && el.$tooltipDisplayedComponent.vnode) {\n            try {\n                (el.$tooltipDisplayedComponent.vnode.component!.proxy as any).pop({force: true})\n            } catch (e) {\n                // Ignore\n                console.error(e);\n            }\n        }\n        el.$tooltipDisplayedComponent = null;\n    }\n};\n\nexport default TooltipDirective;","<template>\n    <div>\n        <button v-tooltip=\"'Vet gedrukte tekst'\" class=\"button icon bold\" :class=\"{ 'is-active': editor.isActive('bold') }\" type=\"button\" @click=\"editor.chain().focus().toggleBold().run()\" />\n        <button v-tooltip=\"'Schuine tekst'\" class=\"button icon italic\" type=\"button\" :class=\"{ 'is-active': editor.isActive('italic') }\" @click=\"editor.chain().focus().toggleItalic().run()\" />\n        <button v-tooltip=\"'Onderlijn tekst'\" class=\"button icon underline\" type=\"button\" :class=\"{ 'is-active': editor.isActive('underline') }\" @click=\"editor.chain().focus().toggleUnderline().run()\" />\n                    \n        <hr v-if=\"!$isMobile\">\n\n        <button v-tooltip=\"'Titel'\" class=\"button icon h1\" type=\"button\" :class=\"{ 'is-active': editor.isActive('heading', { level: 1 }) }\" @click=\"editor.chain().focus().toggleHeading({ level: 1 }).run()\" />\n        <button v-tooltip=\"'Koptekst'\" class=\"button icon h2\" type=\"button\" :class=\"{ 'is-active': editor.isActive('heading', { level: 2 }) }\" @click=\"editor.chain().focus().toggleHeading({ level: 2 }).run()\" />\n        <button v-tooltip=\"'Subkop'\" class=\"button icon h3\" type=\"button\" :class=\"{ 'is-active': editor.isActive('heading', { level: 3 }) }\" @click=\"editor.chain().focus().toggleHeading({ level: 3 }).run()\" />\n        <button v-tooltip=\"'Informatieve tekst'\" class=\"button icon info-circle\" type=\"button\" :class=\"{ 'is-active': editor.isActive('descriptiveText') }\" @click=\"editor.chain().focus().toggleDescriptiveText().run()\" />\n                    \n        <hr v-if=\"!$isMobile\">\n\n        <button v-tooltip=\"'Opsomming met bolletjes'\" class=\"button icon ul\" type=\"button\" :class=\"{ 'is-active': editor.isActive('bulletList') }\" @click=\"editor.chain().focus().toggleBulletList().run()\" />\n        <button v-tooltip=\"'Opsomming met nummers'\" class=\"button icon ol\" type=\"button\" :class=\"{ 'is-active': editor.isActive('orderedList') }\" @click=\"editor.chain().focus().toggleOrderedList().run()\" />\n    </div>\n</template>\n\n\n<script lang=\"ts\">\nimport { Editor } from '@tiptap/vue-3'\nimport { Component, Prop, VueComponent } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport { default as TooltipDirective } from '../directives/Tooltip';\n\n@Component({\n    directives: {\n        tooltip: TooltipDirective\n    }\n})\nexport default class TextStyleButtonsView extends VueComponent {\n    @Prop({ required: true })\n    editor: Editor;\n\n}\n</script>\n","<template>\n    <form class=\"editor-view st-view\" @submit.prevent=\"$emit('save')\">\n        <STNavigationBar :title=\"title\" :disable-dismiss=\"true\" :disable-pop=\"true\">\n            <template #left>\n                <BackButton v-if=\"canPop\" @click=\"pop\" />\n                <template v-else-if=\"$isMobile || $isIOS || $isAndroid\">\n                    <button v-if=\"$isAndroid\" class=\"button navigation icon close\" type=\"button\" @click=\"pop()\" />\n                    <button v-else class=\"button text selected unbold\" type=\"button\" @click=\"pop()\">\n                        {{ cancelText }}\n                    </button>\n                </template>\n            </template>\n\n            <template v-if=\"$isMobile || $isIOS || $isAndroid\" #right>\n                <LoadingButton :loading=\"loading\">\n                    <button class=\"button navigation highlight\" :disabled=\"disabled\" type=\"submit\">\n                        {{ saveText }}\n                    </button>\n                </LoadingButton>\n            </template>\n            <template v-else-if=\"canDismiss\" #right>\n                <button class=\"button navigation icon close\" type=\"button\" @click=\"dismiss()\" />\n            </template>\n        </STNavigationBar>\n        <main ref=\"main\" class=\"flex\">\n            <slot />\n\n            <STList>\n                <!-- Place for e.g. To, From, Subject ... -->\n                <slot name=\"list\" />\n            </STList>\n\n            <hr class=\"mail-hr\">\n\n            <div class=\"editor-container\">\n                <editor-content v-color=\"primaryColor\" :editor=\"editor\" class=\"editor-content\" />\n                <footer>\n                    <slot name=\"footer\" />\n                </footer>\n            </div>\n            <TextStyleButtonsView v-if=\"!$isMobile && showTextStyles && !showLinkEditor\" class=\"editor-button-bar sticky\" :editor=\"editor\" />\n\n            <div v-if=\"!$isMobile && !showTextStyles && !showLinkEditor && editor.isActive('smartButton') && getSmartButton(editor.getAttributes('smartButton').id)\" class=\"editor-button-bar hint sticky\">\n                {{ getSmartButton(editor.getAttributes('smartButton').id)!.hint }}\n            </div>\n\n            <div v-if=\"!$isMobile && !showTextStyles && !showLinkEditor && editor.isActive('smartVariable') && getSmartVariable(editor.getAttributes('smartVariable').id)?.hint\" class=\"editor-button-bar hint sticky\">\n                {{ getSmartVariable(editor.getAttributes('smartVariable').id)!.hint }}\n            </div>\n\n            <div v-if=\"!$isMobile && !showTextStyles && !showLinkEditor && editor.isActive('smartVariableBlock') && getSmartVariable(editor.getAttributes('smartVariableBlock').id)?.hint\" class=\"editor-button-bar hint sticky\">\n                {{ getSmartVariable(editor.getAttributes('smartVariableBlock').id)!.hint }}\n            </div>\n\n            <form v-if=\"showLinkEditor\" class=\"editor-button-bar sticky link\" autocomplete=\"off\" novalidate data-submit-last-field @submit.prevent=\"saveLink()\">\n                <STList>\n                    <STListItem class=\"no-padding right-stack\">\n                        <div class=\"list-input-box\">\n                            <span>Link:</span>\n\n                            <input ref=\"linkInput\" v-model=\"editLink\" class=\"list-input\" type=\"url\" placeholder=\"https://\" enterkeyhint=\"go\">\n                        </div>\n                        <template #right>\n                            <button class=\"button text\" type=\"submit\" @mousedown.prevent>\n                                {{ editLink.length === 0 ? \"Sluiten\" : \"Opslaan\" }}\n                            </button>\n                            <button v-if=\"editor.isActive('link')\" v-tooltip=\"'Link verwijderen'\" class=\"button icon trash gray\" type=\"button\" @mousedown.prevent @click.stop.prevent=\"clearLink()\" />\n                        </template>\n                    </STListItem>\n                </STList>\n            </form>\n        </main>\n        <STToolbar v-if=\"!$isMobile && !$isIOS && !$isAndroid\">\n            <template #right>\n                <div class=\"editor-button-bar\">\n                    <button v-tooltip=\"'Toon/verberg tekst opties'\" class=\"button icon text-style\" :class=\"{ 'is-active': showTextStyles }\" type=\"button\" @mousedown.prevent @click.prevent=\"showTextStyles = !showTextStyles\" />\n                    <hr>\n                    <button v-if=\"smartVariables.length > 0\" v-tooltip=\"'Magische tekstvervanging'\" class=\"button icon wand\" type=\"button\" @click.prevent=\"showSmartVariableMenu\" @mousedown.prevent />\n                    <button v-tooltip=\"'Horizontale lijn'\" class=\"button icon hr\" type=\"button\" @click=\"editor.chain().focus().setHorizontalRule().run()\" @mousedown.prevent />\n                    <button v-tooltip=\"'Link toevoegen'\" class=\"button icon link\" type=\"button\" :class=\"{ 'is-active': editor.isActive('link') }\" @click.prevent=\"openLinkEditor()\" @mousedown.prevent />\n                    <UploadButton :resolutions=\"imageResolutions\" @update:model-value=\"insertImage\" @mousedown.native.prevent>\n                        <div v-tooltip=\"'Afbeelding toevoegen'\" class=\"button icon image\" type=\"button\" />\n                    </UploadButton>\n                    <slot name=\"buttons\" />\n                </div>\n\n                <LoadingButton :loading=\"loading\">\n                    <button class=\"button primary\" :disabled=\"disabled\" type=\"submit\">\n                        <span v-if=\"saveIcon\" class=\"icon \" :class=\"saveIcon\" />\n                        <span>{{ saveText }}</span>\n                    </button>\n                </LoadingButton>\n            </template>\n        </STToolbar>\n        <STButtonToolbar v-else-if=\"!showLinkEditor\" class=\"sticky\" @mousedown.prevent>\n            <button v-tooltip=\"'Toon/verberg tekst opties'\" class=\"button icon text-style\" type=\"button\" @click.prevent=\"openTextStyles($event)\" @mousedown.prevent />\n            <button v-if=\"smartVariables.length > 0\" v-tooltip=\"'Slimme tekstvervanging'\" class=\"button icon wand\" type=\"button\" @click.prevent=\"showSmartVariableMenu\" @mousedown.prevent />\n            <button v-tooltip=\"'Horizontale lijn'\" class=\"button icon hr\" type=\"button\" @click=\"editor.chain().focus().setHorizontalRule().run()\" @mousedown.prevent />\n            <button v-tooltip=\"'Link toevoegen'\" class=\"button icon link\" type=\"button\" :class=\"{ 'is-active': editor.isActive('link') }\" @click=\"openLinkEditor()\" @mousedown.prevent />\n            <UploadButton :resolutions=\"imageResolutions\" @update:model-value=\"insertImage\" @mousedown.prevent>\n                <div v-tooltip=\"'Afbeelding toevoegen'\" class=\"button icon image\" type=\"button\" />\n            </UploadButton>\n            <slot name=\"buttons\" />\n        </STButtonToolbar>\n    </form>\n</template>\n\n<script lang=\"ts\" setup>\nimport { EditorSmartButton, EditorSmartVariable, Image, Replacement, ResolutionRequest } from '@stamhoofd/structures';\nimport { Content, JSONContent } from '@tiptap/core';\nimport { Image as ImageExtension } from '@tiptap/extension-image';\nimport Link from '@tiptap/extension-link';\nimport Typography from '@tiptap/extension-typography';\nimport Underline from '@tiptap/extension-underline';\nimport StarterKit from '@tiptap/starter-kit';\nimport { Editor, EditorContent } from '@tiptap/vue-3';\n\nimport { useCanDismiss, useCanPop, useDismiss, usePop } from '@simonbackx/vue-app-navigation';\nimport { computed, nextTick, onBeforeUnmount, ref, useTemplateRef, watch } from 'vue';\nimport UploadButton from '../inputs/UploadButton.vue';\nimport STList from '../layout/STList.vue';\nimport STListItem from '../layout/STListItem.vue';\nimport BackButton from '../navigation/BackButton.vue';\nimport LoadingButton from '../navigation/LoadingButton.vue';\nimport STButtonToolbar from '../navigation/STButtonToolbar.vue';\nimport STNavigationBar from '../navigation/STNavigationBar.vue';\nimport STToolbar from '../navigation/STToolbar.vue';\nimport { ContextMenu, ContextMenuItem } from '../overlays/ContextMenu';\nimport { Toast } from '../overlays/Toast';\nimport { DescriptiveText } from './EditorDescriptiveText';\nimport { SmartButtonInlineNode, SmartButtonNode } from './EditorSmartButton';\nimport { SmartVariableNode, SmartVariableNodeBlock } from './EditorSmartVariable';\nimport TextStyleButtonsView from './TextStyleButtonsView.vue';\nimport { DataValidator } from '@stamhoofd/utility';\n\ndeclare module '@tiptap/core' {\n    interface Commands<ReturnType> {\n        customImage: {\n            /**\n             * Add an image\n             */\n            setImage: (options: { src: string; alt?: string; title?: string; width?: number; height?: number }) => ReturnType;\n        };\n    }\n}\n\nconst CustomImage = ImageExtension.extend({\n    name: 'customImage',\n    addAttributes() {\n        return {\n            ...this.parent?.(),\n            width: {\n                default: null,\n            },\n            height: {\n                default: null,\n            },\n        };\n    },\n});\n\nconst props = withDefaults(\n    defineProps<{\n        loading?: boolean;\n        disabled?: boolean;\n        title?: string;\n        saveText?: string;\n        saveIcon?: string | null;\n        cancelText?: string;\n        replacements?: Replacement[];\n    }>(),\n    {\n        loading: false,\n        disabled: false,\n        title: '',\n        saveText: 'Opslaan',\n        saveIcon: null,\n        cancelText: 'Annuleren',\n        replacements: () => [],\n    },\n);\n\nfunction smartVariablesFor(replacements: Replacement[]) {\n    return EditorSmartVariable.forReplacements(replacements);\n}\n\nfunction smartButtonsFor(replacements: Replacement[]) {\n    return EditorSmartButton.forReplacements(replacements);\n}\n\nconst smartVariables = computed(() => {\n    return smartVariablesFor(props.replacements);\n});\nconst smartButtons = computed(() => {\n    return smartButtonsFor(props.replacements);\n});\nconst showTextStyles = ref(false);\nconst editLink = ref('');\nconst showLinkEditor = ref(false);\nconst canPop = useCanPop();\nconst pop = usePop();\nconst dismiss = useDismiss();\nconst editor = ref(buildEditor());\n\nfunction buildEditor(content: Content = '') {\n    return new Editor({\n        content,\n        extensions: [\n            StarterKit,\n            Typography.configure({}),\n            SmartVariableNode.configure({\n                smartVariables: smartVariables.value.filter(s => !s.html),\n            }),\n            SmartVariableNodeBlock.configure({\n                smartVariables: smartVariables.value.filter(s => !!s.html),\n            }),\n            SmartButtonNode.configure({\n                smartButtons: smartButtons.value,\n            }),\n            SmartButtonInlineNode.configure({\n                smartButtons: smartButtons.value,\n            }),\n            Link.configure({\n                openOnClick: false,\n                protocols: ['mailto'],\n            }),\n            Underline,\n            DescriptiveText,\n            CustomImage,\n        ],\n        onSelectionUpdate: ({ editor }) => {\n            if (showLinkEditor.value) {\n                if (editor.isActive('link')) {\n                    editLink.value = editor.getAttributes('link')?.href ?? '';\n                }\n                else {\n                    if (editor.state.selection.empty) {\n                        showLinkEditor.value = false;\n                    }\n                }\n            }\n        },\n    });\n}\n\nconst linkInput = useTemplateRef('linkInput');\n\nonBeforeUnmount(() => {\n    editor.value.destroy();\n});\n\nasync function openLinkEditor() {\n    if (showLinkEditor.value) {\n        editor.value.chain().focus().run();\n        await nextTick(() => {\n            showLinkEditor.value = false;\n        });\n        return;\n    }\n    if (!editor.value.isActive('link') && editor.value.state.selection.empty) {\n        new Toast('Selecteer eerst tekst die je klikbaar wilt maken', 'info').show();\n        return;\n    }\n    editLink.value = editor.value.getAttributes('link')?.href ?? '';\n    showLinkEditor.value = true;\n    await nextTick(() => {\n        linkInput.value?.focus();\n    });\n}\n\nfunction isValidHttpUrl(string: string) {\n    if (string.startsWith('mailto:')) {\n        // Strip mailto and validate email address\n        string = string.substring(7);\n        if (DataValidator.isEmailValid(string)) {\n            return true;\n        }\n        return false;\n    }\n\n    let url;\n\n    try {\n        url = new URL(string);\n    }\n    catch (_) {\n        return false;\n    }\n\n    return url.protocol === 'http:' || url.protocol === 'https:';\n}\n\nasync function saveLink() {\n    let cleanedUrl = editLink.value.trim();\n\n    if (cleanedUrl.length === 0) {\n        await clearLink();\n        return;\n    }\n\n    if (!isValidHttpUrl(cleanedUrl)) {\n        if (!cleanedUrl.startsWith('mailto:') && !cleanedUrl.startsWith('http://') && !cleanedUrl.startsWith('https://') && DataValidator.isEmailValid(cleanedUrl)) {\n            cleanedUrl = 'mailto:' + cleanedUrl;\n        }\n        else if (isValidHttpUrl('http://' + cleanedUrl)) {\n            cleanedUrl = 'http://' + cleanedUrl;\n        }\n    }\n\n    if (!isValidHttpUrl(cleanedUrl)) {\n        Toast.error('Ongeldige URL').show();\n        return;\n    }\n\n    editor.value.chain().focus().extendMarkRange('link').setLink({ href: cleanedUrl }).focus().run();\n    await nextTick(() => {\n        showLinkEditor.value = false;\n    });\n}\n\nasync function clearLink() {\n    editor.value.chain().focus().unsetLink().focus().run();\n    await nextTick(() => {\n        showLinkEditor.value = false;\n    });\n}\n//\nconst imageResolutions = [\n    ResolutionRequest.create({\n        width: 600,\n    }),\n];\n\nconst primaryColor = computed(() => {\n    return props.replacements.find(v => v.token === 'primaryColor')?.value || '#0053ff';\n});\n\n//\nfunction insertImage(image: Image | null) {\n    if (image === null) {\n        return;\n    }\n    const resolution = image.resolutions[0];\n    if (!resolution) {\n        return;\n    }\n    editor.value.chain().focus().setImage({ src: resolution.file.getPublicPath(), alt: image.source.name ?? undefined, width: resolution.width, height: resolution.height }).run();\n    new Toast('Beperk het gebruik van afbeeldingen in e-mails. Afbeeldingen worden bestraft door spamfilters, en e-mails komen daardoor vaker bij spam terecht.', 'info').show();\n}\n//\nasync function openTextStyles(event: MouseEvent) {\n    const menu = new ContextMenu([\n        [\n            new ContextMenuItem({\n                name: 'Vet',\n                icon: 'bold',\n                selected: editor.value.isActive('bold'),\n                action: () => {\n                    editor.value.chain().focus().toggleBold().run();\n                    return true;\n                },\n            }),\n            new ContextMenuItem({\n                name: 'Cursief',\n                icon: 'italic',\n                selected: editor.value.isActive('italic'),\n                action: () => {\n                    editor.value.chain().focus().toggleItalic().run();\n                    return true;\n                },\n            }),\n            new ContextMenuItem({\n                name: 'Onderstrepen',\n                icon: 'underline',\n                selected: editor.value.isActive('underline'),\n                action: () => {\n                    editor.value.chain().focus().toggleUnderline().run();\n                    return true;\n                },\n            }),\n        ],\n        [\n            new ContextMenuItem({\n                name: 'Titel',\n                icon: 'h1',\n                selected: editor.value.isActive('heading', { level: 1 }),\n                action: () => {\n                    editor.value.chain().focus().toggleHeading({ level: 1 }).run();\n                    return true;\n                },\n            }),\n            new ContextMenuItem({\n                name: 'Koptekst',\n                icon: 'h2',\n                selected: editor.value.isActive('heading', { level: 2 }),\n                action: () => {\n                    editor.value.chain().focus().toggleHeading({ level: 2 }).run();\n                    return true;\n                },\n            }),\n            new ContextMenuItem({\n                name: 'Subkop',\n                icon: 'h3',\n                selected: editor.value.isActive('heading', { level: 3 }),\n                action: () => {\n                    editor.value.chain().focus().toggleHeading({ level: 3 }).run();\n                    return true;\n                },\n            }),\n            new ContextMenuItem({\n                name: 'Licht gekleurd',\n                icon: 'info-circle',\n                selected: editor.value.isActive('descriptiveText'),\n                action: () => {\n                    editor.value.chain().focus().toggleDescriptiveText().run();\n                    return true;\n                },\n            }),\n        ],\n        [\n            new ContextMenuItem({\n                name: 'Opsomming met bolletjes',\n                icon: 'ul',\n                selected: editor.value.isActive('bulletList'),\n                action: () => {\n                    editor.value.chain().focus().toggleBulletList().run();\n                    return true;\n                },\n            }),\n            new ContextMenuItem({\n                name: 'Opsomming met nummers',\n                icon: 'ol',\n                selected: editor.value.isActive('orderedList'),\n                action: () => {\n                    editor.value.chain().focus().toggleOrderedList().run();\n                    return true;\n                },\n            }),\n        ],\n    ]);\n    menu.show({ button: event.currentTarget as any, yPlacement: 'top' }).catch(console.error);\n}\n\nwatch(() => props.replacements, (newReplacements, oldReplacements) => {\n    if (JSON.stringify(newReplacements) === JSON.stringify(oldReplacements)) {\n        return;\n    }\n\n    const content = editor.value.getJSON();\n\n    // Loop all nodes with type smartButton or smartText and remove them if needed (when they are not in the smartVariables + list warning)\n    warnInvalidNodes(content, smartVariablesFor(newReplacements), smartVariablesFor(oldReplacements));\n    deleteInvalidNodes(content);\n\n    editor.value.destroy();\n    editor.value = buildEditor(content);\n});\n\nfunction warnInvalidNodes(node: JSONContent, newSmartVariables: EditorSmartVariable[], oldSmartVariables: EditorSmartVariable[]) {\n    if (node.type === 'smartVariable') {\n        if (!newSmartVariables.find(smartVariable => smartVariable.id === node.attrs?.id)) {\n            // If did found in old?\n            const old = oldSmartVariables.find(smartVariable => smartVariable.id === node.attrs?.id);\n            if (old && old.deleteMessage) {\n                new Toast(old.deleteMessage, 'warning yellow').setHide(30 * 1000).show();\n            }\n        }\n    }\n\n    if (node.content) {\n        for (const childNode of node.content) {\n            warnInvalidNodes(childNode, newSmartVariables, oldSmartVariables);\n        }\n    }\n}\n//\n/**\n * Return true if node needs to be kept\n */\nfunction deleteInvalidNodes(node: JSONContent) {\n    if (node.type === 'smartButton' || node.type === 'smartButtonInline') {\n        return !!smartButtons.value.find(smartButton => smartButton.id === node.attrs?.id);\n    }\n    if (node.type === 'smartVariable') {\n        return !!smartVariables.value.find(v => v.id === node.attrs?.id);\n    }\n    if (node.content) {\n        node.content = node.content.filter((childNode) => {\n            return deleteInvalidNodes(childNode);\n        });\n    }\n    return true;\n}\n\nfunction getSmartButton(id: string) {\n    return smartButtons.value.find(button => button.id === id);\n}\n\nfunction getSmartVariable(id: string) {\n    return smartVariables.value.find(button => button.id === id);\n}\n\nasync function showSmartVariableMenu(event: MouseEvent) {\n    // Get initial selection\n    const initialSelection = document.activeElement;\n\n    const menu = new ContextMenu([\n        ...(smartVariables.value.length > 0\n            ? [\n                    smartVariables.value.map((variable) => {\n                        return new ContextMenuItem({\n                            name: variable.name,\n                            description: variable.description ? variable.description : undefined,\n                            action: () => {\n                                if (initialSelection && initialSelection.tagName === 'INPUT') {\n                                    // Allow replacements in input fields\n                                    const input = initialSelection as HTMLInputElement;\n\n                                    if (input.selectionStart !== null && input.selectionEnd !== null) {\n                                        input.setRangeText(`{{${variable.id}}}`, input.selectionStart, input.selectionEnd, 'end');\n                                        input.focus();\n                                    }\n                                }\n                                else {\n                                    editor.value.chain().focus().insertSmartVariable(variable).run();\n                                }\n\n                                return true;\n                            },\n                        });\n                    }),\n                ]\n            : []),\n        ...(smartButtons.value.length > 0\n            ? [\n                    smartButtons.value.map((variable) => {\n                        return new ContextMenuItem({\n                            name: variable.name,\n                            action: () => {\n                                editor.value.chain().focus().insertSmartButton(variable).run();\n\n                                return true;\n                            },\n                        });\n                    }),\n                ]\n            : []),\n    ]);\n    menu.show({ button: event.currentTarget as any, yPlacement: 'top' }).catch(console.error);\n}\n\ndefineExpose({\n    editor,\n});\n\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use '@stamhoofd/scss/base/text-styles.scss';\n\n.editor-view {\n    > main {\n\n        .mail-hr {\n            margin: 0;\n            margin-right: calc(-1 * var(--st-horizontal-padding, 40px));\n        }\n    }\n\n    .editor-container {\n        flex-grow: 1;\n        display: flex;\n        flex-direction: column;\n\n        justify-content: stretch;\n        align-items: stretch;\n        min-height: 200px;\n\n        margin: 0 calc(-1 * var(--st-horizontal-padding, 0px));\n        position: relative;\n\n        font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n        font-weight: normal;\n\n        padding: 0;\n        height: auto;\n        min-height: calc($input-height * 2);\n        line-height: normal;\n        outline: none;\n\n        user-select: auto;\n        user-select: contain;\n        -webkit-user-select: text;\n        -webkit-user-select: auto;\n        -webkit-touch-callout: default;\n\n        > footer {\n            padding: 0 var(--st-horizontal-padding, 15px) 15px var(--st-horizontal-padding, 15px);\n\n            > div.disabled {\n                user-select: none;\n                cursor: not-allowed;\n                color: $color-gray-4;\n\n                .button {\n                    pointer-events: none\n                }\n\n                > hr {\n                    @extend .style-hr;\n                }\n\n                .button-description {\n                    margin: 10px 0;\n                }\n\n                strong {\n                    font-weight: bold;\n                }\n\n                em {\n                    font-style: italic;\n                }\n            }\n\n            > hr {\n                @extend .style-hr;\n                margin-bottom: 10px;\n            }\n        }\n    }\n\n    .editor-content {\n        flex-grow: 1;\n        display: flex;\n        flex-direction: column;\n\n        $element: \".ProseMirror\";\n\n        @import './email.url.scss';\n\n        & > .ProseMirror {\n            flex-grow: 1;\n\n            span[data-type=\"smartVariable\"] {\n                padding: 3px 2px;\n                margin: 0 -2px;\n                //color: $color-gray-5;\n                white-space: nowrap;\n\n                &:empty {\n                    padding: 0;\n                    margin: 0;\n                    background: none;\n                }\n\n                &.ProseMirror-selectednode {\n                    color: $color-primary-contrast;\n                }\n\n                position: relative;\n\n                &:after {\n                    content: \"\";\n                    position: absolute;\n                    top: 0;\n                    left: 0;\n                    right: 0;\n                    bottom: 0;\n                    background: $color-gray-3;\n                    border-radius: $border-radius;\n                    pointer-events: none;\n                    z-index: -1;\n                }\n\n                &.ProseMirror-selectednode {\n                    &:after {\n                        background: $color-primary;\n                    }\n                }\n            }\n\n            span[data-type=\"smartButtonInline\"] {\n                text-decoration: underline;\n            }\n\n            div[data-type=\"smartVariableBlock\"] {\n                padding: 0 15px;\n                margin: 0 -15px;\n\n                &.ProseMirror-selectednode {\n                    box-shadow: 0 0 0 2px $color-primary;\n                    border-radius: $border-radius;\n                }\n            }\n\n            .button {\n                cursor: default !important;\n\n            }\n\n            img {\n                max-width: 100%;\n                height: auto;\n                margin: 0;\n\n                &.ProseMirror-selectednode {\n                    box-shadow: 0 0 0 2px $color-primary;\n                    border-radius: $border-radius;\n                }\n            }\n\n            hr {\n                // Override selection area\n                padding: 20px 0;\n                margin: 0;\n                background: none;\n                display: block;\n\n                &:after {\n                    content: \"\";\n                    display: block;\n                    height: 1px;\n                    background: $color-border;\n                    width: 100%;\n                }\n\n                &.ProseMirror-selectednode {\n                    &:after {\n                        background: $color-primary;\n                        box-shadow: 0 0 0 1px $color-primary;\n                        border-radius: 4px;\n                    }\n                }\n            }\n        }\n\n    }\n\n    .ProseMirror {\n        max-width: none;\n        padding: 15px var(--st-horizontal-padding, 15px);\n        height: auto;\n        min-height: calc($input-height * 2);\n        line-height: normal;\n        outline: none;\n    }\n}\n</style>\n","<template>\n    <SaveView :loading=\"saving\" title=\"E-mailadres\" :disabled=\"!hasChangesFull\" @save=\"save\">\n        <h1 v-if=\"isNew\">\n            E-mailadres toevoegen\n        </h1>\n        <h1 v-else>\n            E-mailadres bewerken\n        </h1>\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n        <STInputBox title=\"Naam / aanspreking (optioneel)\" error-fields=\"name\" :error-box=\"errors.errorBox\">\n            <input\n                ref=\"firstInput\"\n                v-model=\"name\"\n                class=\"input\"\n                type=\"text\"\n                placeholder=\"Optioneel. bv. Webshopverantwoordelijke\"\n                autocomplete=\"off\"\n            >\n        </STInputBox>\n\n        <EmailInput v-model=\"emailAddress\" title=\"E-mailadres\" :validator=\"errors.validator\" placeholder=\"E-mailadres waarmee je wilt versturen\" />\n\n        <Checkbox v-model=\"isDefault\">\n            <h3 class=\"style-title-list\">\n                Standaard e-mailadres\n            </h3>\n            <p class=\"style-description-small\">\n                Voor algemene e-mails of voor antwoorden op automatische e-mails als domeinnaam niet ingesteld is (bv. als antwoord op bestelbevestiging).\n            </p>\n        </Checkbox>\n\n        <template v-if=\"enableMemberModule && groups.length\">\n            <hr>\n            <h2>Inschrijvingsgroepen</h2>\n            <p class=\"st-list-description\">\n                Selecteer de groepen die standaard met dit e-mailadres moeten versturen.\n            </p>\n\n            <STList>\n                <STListItem v-for=\"group in groups\" :key=\"group.group.id\" element-name=\"label\" :selectable=\"true\">\n                    <template #left>\n                        <Checkbox v-model=\"group.selected\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        {{ group.group.settings.name }}\n                    </h3>\n                </STListItem>\n            </STList>\n        </template>\n\n        <template v-if=\"enableWebshopModule && webshops.length\">\n            <hr>\n            <h2>Webshops</h2>\n            <p class=\"st-list-description\">\n                Selecteer de webshops waarvoor we dit e-mailadres moeten gebruiken (bv. bestelbevestiging).\n            </p>\n\n            <STList>\n                <STListItem v-for=\"webshop in webshops\" :key=\"webshop.webshop.id\" element-name=\"label\" :selectable=\"true\">\n                    <template #left>\n                        <Checkbox v-model=\"webshop.selected\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        {{ webshop.webshop.meta.name }}\n                    </h3>\n                </STListItem>\n            </STList>\n        </template>\n\n        <div v-if=\"!isNew\" class=\"container\">\n            <hr>\n            <h2>\n                Verwijderen\n            </h2>\n\n            <button class=\"button secundary danger\" type=\"button\" @click=\"deleteMe\">\n                <span class=\"icon trash\" />\n                <span>Verwijderen</span>\n            </button>\n        </div>\n    </SaveView>\n</template>\n\n<script lang=\"ts\" setup>\nimport { AutoEncoderPatchType, PartialWithoutMethods, PatchableArray, PatchableArrayAutoEncoder } from \"@simonbackx/simple-encoding\";\nimport { usePop } from \"@simonbackx/vue-app-navigation\";\nimport { CenteredMessage, Checkbox, EmailInput, ErrorBox, SaveView, STErrorsDefault, STInputBox, STList, STListItem, useErrors, useOrganization, usePatchArray, usePlatform } from \"@stamhoofd/components\";\nimport { useTranslate } from \"@stamhoofd/frontend-i18n\";\nimport { useOrganizationManager, usePlatformManager, useRequestOwner } from \"@stamhoofd/networking\";\nimport { Group, GroupPrivateSettings, OrganizationEmail, OrganizationPrivateMetaData, OrganizationRegistrationPeriod, Platform, PlatformPrivateConfig, WebshopPreview, WebshopPrivateMetaData } from \"@stamhoofd/structures\";\nimport { computed, onMounted, Ref, ref } from 'vue';\n\nconst props = defineProps<{\n    email: OrganizationEmail;\n    isNew: boolean;\n}>()\n\nconst saving = ref(false)\nconst errors = useErrors() \nconst groups = ref([]) as Ref<SelectableGroup[]>\nconst webshops = ref([]) as Ref<SelectableWebshop[]>\nconst organization = useOrganization()\nconst platform = usePlatform()\nconst originalArray = computed(() => (organization.value ? organization.value.privateMeta?.emails : platform.value.privateConfig?.emails) ?? [])\nconst {patched: patchedArray, patch, hasChanges, addPatch: addAPatch, addPut, addArrayPatch} = usePatchArray(originalArray)\nconst patched = computed(() => patchedArray.value.find(e => e.id === props.email.id) ?? props.email)\nconst addPatch = (patch: PartialWithoutMethods<AutoEncoderPatchType<OrganizationEmail>>) => addAPatch(OrganizationEmail.patch({ id: props.email.id, ...patch }))\nconst organizationManager = useOrganizationManager()\nconst owner = useRequestOwner()\nconst pop = usePop();\nconst platformManager = usePlatformManager();\nconst $t = useTranslate();\nconst name = computed({\n    get: () => patched.value.name,\n    set: (name) => addPatch({ name })\n})\n\nconst emailAddress = computed({\n    get: () => patched.value.email,\n    set: (email) => addPatch({ email })\n})\n\nconst isDefault = computed({\n    get: () => patched.value.default,\n    set: (d) => {\n        addPatch({ default: d })\n\n        // Remove other defaults\n        if (d) {\n            for (const email of patchedArray.value) {\n                if (email.id !== props.email.id && email.default) {\n                    addAPatch(OrganizationEmail.patch({ id: email.id, default: false }))\n                }\n            }\n        } else {\n            // Remove changes to default\n            for (const email of patchedArray.value) {\n                if (email.id !== props.email.id && email.default === false) {\n                    const originalValue = originalArray.value.find(e => e.id === email.id)\n                    if (originalValue && originalValue.default) {\n                        addAPatch(OrganizationEmail.patch({ id: email.id, default: true }))\n                    }\n                }\n            }\n        }\n    }\n})\n\nonMounted(() => {\n    if (props.isNew) {\n        addPut(props.email)\n    }\n\n    if (organization.value) {\n        for (const group of organization.value.period.groups) {\n            groups.value.push(new SelectableGroup(group, group.privateSettings !== null && group.privateSettings.defaultEmailId !== null && group.privateSettings.defaultEmailId === props.email.id))\n        }\n\n        for (const webshop of organization.value.webshops) {\n            webshops.value.push(new SelectableWebshop(webshop, webshop.privateMeta !== null && webshop.privateMeta.defaultEmailId !== null && webshop.privateMeta.defaultEmailId === props.email.id))\n        }\n    }\n})\n\nconst enableMemberModule = computed(() => {\n    return organization.value?.meta.modules.useMembers ?? false\n})\n\nconst enableWebshopModule = computed(() => {\n    return organization.value?.meta.modules.useWebshops ?? false\n})\n\nclass SelectableGroup {\n    group: Group;\n    selected = false;\n    constructor(group: Group, selected = false) {\n        this.selected = selected\n        this.group = group\n    }\n}\n\nclass SelectableWebshop {\n    webshop: WebshopPreview;\n    selected = false;\n    constructor(webshop: WebshopPreview, selected = false) {\n        this.selected = selected\n        this.webshop = webshop\n    }\n}\n\nasync function deleteMe() {\n    const arr: PatchableArrayAutoEncoder<OrganizationEmail> = new PatchableArray()\n    arr.addDelete(props.email.id);\n\n    try {\n        if (organization.value) {\n            const organizationPatch = organizationManager.value.getPatch().patch({\n                privateMeta: OrganizationPrivateMetaData.patch({\n                    emails: arr\n                })\n            })\n\n            await organizationManager.value.patch(organizationPatch, {owner, shouldRetry: false})\n        } else {\n            await platformManager.value.patch(Platform.patch({\n                privateConfig: PlatformPrivateConfig.patch({\n                    emails: arr\n                })\n            }))\n        }\n\n        await pop({ force: true })\n        saving.value = false\n    } catch (e) {\n        console.error(e)\n        errors.errorBox = new ErrorBox(e)\n        saving.value = false\n    }\n}\n\nasync function save() {\n    if (saving.value) {\n        return;\n    }\n    saving.value = true\n\n    if (!await errors.validator.validate()) {\n        saving.value = false\n        return;\n    }\n    try {\n        if (organization.value) {\n            // First save emails\n            const organizationPatch = organizationManager.value.getPatch().patch({\n                privateMeta: OrganizationPrivateMetaData.patch({\n                    emails: patch.value\n                })\n            })\n\n            for (const webshop of webshops.value) {\n                // Check if changed\n                const prev = webshop.webshop.privateMeta !== null && webshop.webshop.privateMeta.defaultEmailId !== null && webshop.webshop.privateMeta.defaultEmailId === props.email.id\n                if (prev !== webshop.selected) {\n                    organizationPatch.webshops.addPatch(WebshopPreview.patch({\n                        id: webshop.webshop.id,\n                        privateMeta: WebshopPrivateMetaData.patch({\n                            defaultEmailId: webshop.selected ? props.email.id : null,\n                        })\n                    }))\n                }\n            }\n\n            // Save\n            await organizationManager.value.patch(organizationPatch, {owner, shouldRetry: false})\n\n            // Clear patch\n            patch.value = new PatchableArray()\n\n            // Save period\n            let shouldSavePeriod = false\n            const organizationPeriodPatch = OrganizationRegistrationPeriod.patch({ id: organization.value?.period.id })\n            for (const group of groups.value) {\n                // Check if changed\n                const prev = group.group.privateSettings !== null && group.group.privateSettings.defaultEmailId !== null && group.group.privateSettings.defaultEmailId === props.email.id\n                if (prev !== group.selected) {\n                    organizationPeriodPatch.groups.addPatch(Group.patch({\n                        id: group.group.id,\n                        privateSettings: GroupPrivateSettings.patch({\n                            defaultEmailId: group.selected ? props.email.id : null,\n                        })\n                    }))\n                    shouldSavePeriod = true\n                }\n            }\n\n            if (shouldSavePeriod) {\n                await organizationManager.value.patchPeriod(organizationPeriodPatch, {owner, shouldRetry: false})\n            }\n        } else {\n            await platformManager.value.patch(Platform.patch({\n                privateConfig: PlatformPrivateConfig.patch({\n                    emails: patch.value\n                })\n            }))\n        }\n   \n        await pop({ force: true })\n        saving.value = false\n    } catch (e) {\n        console.error(e)\n        errors.errorBox = new ErrorBox(e)\n        saving.value = false\n    }\n}\n\nconst hasChangesFull = computed(() => {\n    if (!hasChanges.value) {\n        let otherChanges = false;\n        for (const group of groups.value) {\n            // Check if changed\n            const prev = group.group.privateSettings !== null && group.group.privateSettings.defaultEmailId !== null && group.group.privateSettings.defaultEmailId === props.email.id\n            if (prev !== group.selected) {\n                otherChanges = true\n                break\n            }\n        }\n\n        for (const webshop of webshops.value) {\n            // Check if changed\n            const prev = webshop.webshop.privateMeta !== null && webshop.webshop.privateMeta.defaultEmailId !== null && webshop.webshop.privateMeta.defaultEmailId === props.email.id\n            if (prev !== webshop.selected) {\n                otherChanges = true\n                break\n            }\n        }\n\n        return otherChanges;\n    }\n\n    return true\n})\n\nconst shouldNavigateAway = async () => {\n    if (!hasChangesFull.value) {\n        return true\n    }\n    return await CenteredMessage.confirm($t('996a4109-5524-4679-8d17-6968282a2a75'), $t('106b3169-6336-48b8-8544-4512d42c4fd6'))\n}\n\ndefineExpose({\n    shouldNavigateAway\n})\n\n</script>\n","<template>\n    <div class=\"st-view\">\n        <STNavigationBar title=\"E-mailadressen\" />\n\n        <main>\n            <h1>\n                E-mailadressen\n            </h1>\n\n            <p>Wijzig de e-mailadressen waarmee je e-mails kan versturen. Alle informatie over e-mailadressen en e-mails vind je op <a class=\"inline-link\" :href=\"$domains.getDocs('e-mailadressen-instellen')\" target=\"_blank\">deze pagina</a>.</p>\n\n            <STList>\n                <STListItem v-for=\"email in emails\" :key=\"email.id\" :selectable=\"true\" class=\"right-stack\" @click=\"editEmail(email)\">\n                    <h3 class=\"style-title-list\">\n                        {{ email.name ? email.name : email.email }}\n                    </h3>\n                    <p v-if=\"email.name\" class=\"style-description-small\">\n                        {{ email.email }}\n                    </p>\n\n                    <template #right>\n                        <span v-if=\"email.default\" class=\"style-tag\">Standaard</span>\n                        <span class=\"icon arrow-right-small gray\" />\n                    </template>\n                </STListItem>\n            </STList>\n\n            <p v-if=\"emails.length === 0\" class=\"info-box\">\n                Je hebt nog geen e-mailadressen toegevoegd. \n            </p>\n        </main>\n\n        <STToolbar>\n            <template #right>\n                <button class=\"button primary\" type=\"button\" @click=\"addEmail\">\n                    <span class=\"icon add\" />\n                    <span>E-mailadres toevoegen</span>\n                </button>\n            </template>\n        </STToolbar>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ComponentWithProperties, usePresent } from \"@simonbackx/vue-app-navigation\";\nimport { STList, STListItem, STNavigationBar, STToolbar, useOrganization, usePlatform } from \"@stamhoofd/components\";\nimport { OrganizationEmail } from \"@stamhoofd/structures\";\n\n\nimport { computed } from \"vue\";\nimport EditEmailView from './EditEmailView.vue';\n\nconst organization = useOrganization()\nconst platform = usePlatform()\nconst emails = computed(() => (organization.value ? organization.value.privateMeta?.emails : platform.value.privateConfig?.emails) ?? [])\n\nconst present = usePresent()\n\nasync function editEmail(email: OrganizationEmail) {\n    await present({\n        components: [\n            new ComponentWithProperties(EditEmailView, {\n                email,\n                isNew: false\n            })\n        ],\n        modalDisplayStyle: 'popup'\n    })\n}\n\nasync function addEmail() {\n    const email = OrganizationEmail.create({ email: \"\" })\n    await present({\n        components: [\n            new ComponentWithProperties(EditEmailView, {\n                email,\n                isNew: true\n            })\n        ],\n        modalDisplayStyle: 'popup'\n    })\n}\n</script>\n","<template>\n    <LoadingViewTransition :error-box=\"errors.errorBox\">\n        <EditorView v-if=\"!(creatingEmail || !email || !patchedEmail)\" ref=\"editorView\" class=\"mail-view\" :loading=\"sending\" title=\"Nieuwe e-mail\" save-text=\"Versturen\" :replacements=\"replacements\" @save=\"send\">\n            <h1 class=\"style-navigation-title\">\n                Nieuwe e-mail\n            </h1>\n\n            <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n            <!-- Buttons -->\n            <template #buttons>\n                <label v-tooltip=\"'Bijlage toevoegen'\" class=\"button icon attachment\">\n                    <input type=\"file\" multiple=\"true\" style=\"display: none;\" accept=\".pdf, .docx, .xlsx, .png, .jpeg, .jpg, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/pdf, image/jpeg, image/png, image/gif\" @change=\"changedFile\">\n                    <span v-if=\"$isMobile && files.length > 0\" class=\"style-bubble\">{{ files.length }}</span>\n                </label>\n\n                <hr v-if=\"canOpenTemplates\">\n                <button v-if=\"canOpenTemplates\" v-tooltip=\"'Sjablonen'\" class=\"button icon email-template\" type=\"button\" @click=\"openTemplates\" />\n            </template>\n\n            <!-- List -->\n            <template #list>\n                <STListItem class=\"no-padding right-stack\">\n                    <div class=\"list-input-box\">\n                        <span>Aan:</span>\n\n                        <div v-if=\"onlyOption\" class=\"list-input\">\n                            {{ toDescription }}\n                        </div>\n                        <button v-else class=\"list-input dropdown\" type=\"button\" @click=\"showToMenu\">\n                            <span>{{ toDescription }}</span>\n                            <span class=\"icon arrow-down-small gray\" />\n                        </button>\n                    </div>\n                    <template #right>\n                        <span v-if=\"patchedEmail.recipientCount !== null\" class=\"style-description-small\">{{ formatInteger(patchedEmail.recipientCount) }}</span>\n                        <span v-else class=\"style-placeholder-skeleton\" />\n                    </template>\n                </STListItem>\n                <STListItem class=\"no-padding\" element-name=\"label\">\n                    <div class=\"list-input-box\">\n                        <span>Onderwerp:</span>\n                        <input id=\"mail-subject\" v-model=\"subject\" class=\"list-input\" type=\"text\" placeholder=\"Typ hier het onderwerp van je e-mail\">\n                    </div>\n                </STListItem>\n                <STListItem v-if=\"emails.length > 0\" class=\"no-padding\" element-name=\"label\">\n                    <div class=\"list-input-box\">\n                        <span>Van:</span>\n\n                        <div class=\"input-icon-container right icon arrow-down-small gray\">\n                            <select v-model=\"selectedEmailAddress\" class=\"list-input\">\n                                <option v-for=\"e in emails\" :key=\"e.id\" :value=\"e\">\n                                    {{ e.name ? (e.name+\" <\"+e.email+\">\") : e.email }}\n                                </option>\n                            </select>\n                        </div>\n                    </div>\n\n                    <template v-if=\"auth.hasFullAccess()\" #right>\n                        <button class=\"button text\" type=\"button\" @click=\"manageEmails\">\n                            <span class=\"icon settings\" />\n                        </button>\n                    </template>\n                </STListItem>\n            </template>\n\n            <!-- Editor footer -->\n            <template #footer>\n                <!-- E-mail attachments -->\n                <STList v-if=\"patchedEmail.attachments.length > 0\">\n                    <STListItem v-for=\"attachment in patchedEmail.attachments\" :key=\"attachment.id\" class=\"file-list-item\">\n                        <template #left>\n                            <span :class=\"'icon '+getFileIcon(attachment)\" />\n                        </template>\n                        <h3 class=\"style-title-list\" v-text=\"attachment.filename\" />\n                        <p class=\"style-description-small\">\n                            {{ Formatter.fileSize(attachment.bytes) }}\n                        </p>\n\n                        <template #right>\n                            <button class=\"button icon gray trash\" type=\"button\" @click.stop=\"deleteAttachment(attachment)\" />\n                        </template>\n                    </STListItem>\n                </STList>\n            </template>\n\n            <!-- Warnings and errors -->\n            <template v-if=\"emails.length === 0\">\n                <p v-if=\"auth.hasFullAccess()\" class=\"warning-box selectable with-button\" @click=\"manageEmails\">\n                    Stel eerst jouw e-mailadressen in\n                    <span class=\"button text inherit-color\">\n                        <span class=\"icon settings\" />\n                        <span>Wijzigen</span>\n                    </span>\n                </p>\n                <p v-else class=\"warning-box\">\n                    Een hoofdbeheerder van jouw vereniging moet eerst e-mailadressen instellen voor je een e-mail kan versturen.\n                </p>\n            </template>\n        </EditorView>\n    </LoadingViewTransition>\n</template>\n\n<script setup lang=\"ts\">\nimport { AutoEncoderPatchType, Decoder, PartialWithoutMethods, PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, usePop, usePresent } from '@simonbackx/vue-app-navigation';\nimport { useRequestOwner } from '@stamhoofd/networking';\nimport { Email, EmailAttachment, EmailPreview, EmailRecipientFilter, EmailRecipientSubfilter, EmailStatus, EmailTemplate, OrganizationEmail } from '@stamhoofd/structures';\nimport { Formatter, throttle } from '@stamhoofd/utility';\nimport { Ref, computed, nextTick, onMounted, ref, watch } from 'vue';\nimport { EditEmailTemplatesView } from '.';\nimport EditorView from '../editor/EditorView.vue';\nimport { EmailStyler } from '../editor/EmailStyler';\nimport { ErrorBox } from '../errors/ErrorBox';\nimport { useErrors } from '../errors/useErrors';\nimport { useAuth, useContext, useInterval, useIsMobile, useOrganization, usePlatform } from '../hooks';\nimport { CenteredMessage } from '../overlays/CenteredMessage';\nimport { ContextMenu, ContextMenuItem } from '../overlays/ContextMenu';\nimport { Toast } from '../overlays/Toast';\nimport EmailSettingsView from './EmailSettingsView.vue';\nimport { LoadingViewTransition } from '../containers';\n\nexport type RecipientChooseOneOption = {\n    type: 'ChooseOne';\n    name?: string;\n    options: {\n        id: string;\n        name: string;\n        value: EmailRecipientSubfilter[];\n    }[];\n    defaultSelection?: string;\n};\n\nexport type RecipientMultipleChoiceOption = {\n    type: 'MultipleChoice';\n    name?: string;\n    options: {\n        name: string;\n        id: string;\n    }[];\n    defaultSelection?: string[];\n    build: (selectedIds: string[]) => EmailRecipientSubfilter[];\n};\n\nconst props = withDefaults(defineProps<{\n    defaultSubject?: string;\n    recipientFilterOptions: (RecipientChooseOneOption | RecipientMultipleChoiceOption)[];\n}>(), {\n    defaultSubject: '',\n});\n\nclass TmpFile {\n    name: string;\n    file: File;\n    size: string;\n\n    constructor(name: string, file: File) {\n        this.name = name;\n        this.file = file;\n        this.size = Formatter.fileSize(file.size);\n    }\n}\n\nconst creatingEmail = ref(true);\nconst organization = useOrganization();\nconst platform = usePlatform();\nconst replacements = computed(() => {\n    return email.value ? (email.value.exampleRecipient?.getReplacements(organization.value, platform.value) ?? []) : [];\n});\nconst errors = useErrors();\nconst files = ref([]) as Ref<TmpFile[]>;\nconst auth = useAuth();\nconst $isMobile = useIsMobile();\nconst email = ref(null) as Ref<EmailPreview | null>;\nconst context = useContext();\nconst owner = useRequestOwner();\n\nconst selectedRecipientOptions = ref(props.recipientFilterOptions.map((o) => {\n    if (o.defaultSelection) {\n        if (o.type === 'ChooseOne') {\n            return [o.defaultSelection];\n        }\n        return o.defaultSelection;\n    }\n    return [o.options[0].id];\n}));\n\nconst groupByEmail = ref(false);\nconst editorView = ref(null) as Ref<typeof EditorView | null>;\nconst editor = computed(() => editorView.value?.editor);\nconst pop = usePop();\nconst present = usePresent();\n\nconst emails = computed(() => {\n    if (organization.value) {\n        return organization.value.privateMeta?.emails ?? [];\n    }\n    return platform.value?.privateConfig?.emails ?? [];\n});\n\nconst patch = ref(null) as Ref<AutoEncoderPatchType<Email> | null>;\nconst savingPatch = ref(null) as Ref<AutoEncoderPatchType<Email> | null>;\nconst sending = ref(false);\n\nconst patchedEmail = computed(() => {\n    if (savingPatch.value) {\n        return patch.value ? email.value?.patch(savingPatch.value).patch(patch.value) : email.value?.patch(savingPatch.value);\n    }\n    if (patch.value) {\n        return email.value?.patch(patch.value);\n    }\n    return email.value;\n});\n\nfunction addPatch(newPatch: PartialWithoutMethods<AutoEncoderPatchType<Email>>) {\n    patch.value = patch.value ? patch.value.patch(Email.patch(newPatch)) : Email.patch(newPatch);\n}\n\nconst recipientFilter = computed(() => {\n    const filter = EmailRecipientFilter.create({});\n\n    for (let i = 0; i < props.recipientFilterOptions.length; i++) {\n        const option = props.recipientFilterOptions[i];\n        const selectedIds = selectedRecipientOptions.value[i];\n\n        if (option.type === 'ChooseOne') {\n            const selectedOption = option.options.find(o => o.id === selectedIds[0]);\n            if (selectedOption) {\n                filter.filters.push(\n                    ...selectedOption.value,\n                );\n            }\n            continue;\n        }\n\n        const buildFilter = option.build(selectedIds);\n        filter.filters.push(\n            ...buildFilter,\n        );\n    }\n\n    filter.groupByEmail = groupByEmail.value;\n    return filter;\n});\n\nconst onlyOption = computed(() => {\n    if (props.recipientFilterOptions.length === 1 && props.recipientFilterOptions[0].options.length === 1) {\n        return props.recipientFilterOptions[0].options[0];\n    }\n    return null;\n});\n\nconst toDescription = computed(() => {\n    if (onlyOption.value) {\n        return onlyOption.value.name;\n    }\n\n    return props.recipientFilterOptions.flatMap((option, i) => {\n        const selectedIds = selectedRecipientOptions.value[i];\n\n        if (option.type === 'ChooseOne') {\n            const selectedOption = option.options.find(o => o.id === selectedIds[0]);\n            if (selectedOption) {\n                return [selectedOption.name];\n            }\n            return [];\n        }\n\n        return selectedIds.map((id) => {\n            const selectedOption = option.options.find(o => o.id === id);\n            if (selectedOption) {\n                return selectedOption.name;\n            }\n            return '';\n        });\n    }).join(', ');\n});\n\nwatch([selectedRecipientOptions, groupByEmail], () => {\n    addPatch({ recipientFilter: recipientFilter.value });\n}, { deep: true });\n\nconst subject = computed({\n    get: () => patchedEmail.value?.subject || '',\n    set: (subject) => {\n        addPatch({ subject });\n    },\n});\n\nconst fromAddress = computed({\n    get: () => patchedEmail.value?.fromAddress ?? null,\n    set: (fromAddress) => {\n        addPatch({ fromAddress });\n    },\n});\n\nconst fromName = computed({\n    get: () => patchedEmail.value?.fromName ?? null,\n    set: (fromName) => {\n        addPatch({ fromName });\n    },\n});\n\nconst selectedEmailAddress = computed({\n    get: () => emails.value.find(e => e.email === fromAddress.value && e.name === fromName.value) ?? emails.value.find(e => e.email === fromAddress.value) ?? emails.value.find(e => e.name && e.name === fromName.value) ?? null,\n    set: (email: OrganizationEmail | null) => {\n        addPatch({\n            fromAddress: email?.email ?? null,\n            fromName: email?.name ?? null,\n        });\n    },\n});\n\nwatch(patch, (newValue, oldValue) => {\n    if (newValue === null) {\n        return;\n    }\n    doThrottledPatch();\n}, {});\n\nwatch(editor, (e) => {\n    if (!e) {\n        return;\n    }\n    const handler = () => {\n        // save json\n        addPatch({ json: e.getJSON() });\n    };\n    e.on('update', handler);\n\n    return () => {\n        e.off('update', handler);\n    };\n}, { deep: false });\n\nonMounted(() => {\n    // Create the email\n    createEmail().catch(console.error);\n});\n\nuseInterval(async () => {\n    if (!email.value || email.value.recipientCount !== null) {\n        return;\n    }\n    await updateEmail();\n}, 1000);\n\nasync function createEmail() {\n    try {\n        const response = await context.value.authenticatedServer.request({\n            method: 'POST',\n            path: '/email',\n            body: Email.create({\n                recipientFilter: recipientFilter.value,\n                fromAddress: emails.value.length > 0 ? (emails.value.find(e => e.default) ?? emails.value[0]).email : null,\n                fromName: emails.value.length > 0 ? (emails.value.find(e => e.default) ?? emails.value[0]).name : null,\n                status: EmailStatus.Draft,\n                subject: props.defaultSubject,\n            }),\n            decoder: EmailPreview as Decoder<EmailPreview>,\n            owner,\n            shouldRetry: false,\n        });\n\n        email.value = response.data;\n        creatingEmail.value = false;\n        groupByEmail.value = response.data.recipientFilter.groupByEmail;\n\n        if (response.data.subject) {\n            subject.value = response.data.subject;\n        }\n\n        await nextTick();\n\n        if (response.data.json) {\n            editor.value?.commands.setContent(response.data.json);\n        }\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n        return;\n    }\n}\n\nconst doThrottledPatch = throttle(patchEmail, 1000);\n\nasync function patchEmail() {\n    if (!email.value) {\n        return;\n    }\n\n    if (savingPatch.value || !patch.value) {\n        return;\n    }\n    if (sending.value) {\n        return;\n    }\n\n    const _savingPatch = patch.value;\n    savingPatch.value = _savingPatch;\n    patch.value = null;\n\n    try {\n        const response = await context.value.authenticatedServer.request({\n            method: 'PATCH',\n            path: '/email/' + email.value.id,\n            body: _savingPatch,\n            decoder: EmailPreview as Decoder<EmailPreview>,\n            owner,\n            shouldRetry: false,\n        });\n\n        email.value = response.data;\n\n        savingPatch.value = null;\n\n        // changed meanwhile\n        if (patch.value) {\n            // do again\n            patchEmail().catch(console.error);\n        }\n    }\n    catch (e) {\n        console.error(e);\n        Toast.fromError(e).setHide(20000).show();\n    }\n    savingPatch.value = null;\n}\n\nconst updating = ref(false);\nasync function updateEmail() {\n    if (!email.value) {\n        return;\n    }\n\n    if (sending.value || updating.value) {\n        return;\n    }\n\n    if (savingPatch.value) {\n        return;\n    }\n    updating.value = true;\n\n    try {\n        const response = await context.value.authenticatedServer.request({\n            method: 'GET',\n            path: '/email/' + email.value.id,\n            decoder: EmailPreview as Decoder<EmailPreview>,\n            owner,\n            shouldRetry: true,\n        });\n\n        email.value = response.data;\n    }\n    catch (e) {\n        console.error(e);\n        Toast.fromError(e).setHide(2000).show();\n    }\n\n    updating.value = false;\n}\n\nasync function manageEmails() {\n    await present({\n        components: [\n            new ComponentWithProperties(EmailSettingsView, {}),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function getHTML() {\n    const e = editor.value;\n    if (!e) {\n        // When editor is not yet loaded: slow internet -> need to know html on dismiss confirmation\n        return {\n            text: '',\n            html: '',\n            JSON: {},\n        };\n    }\n\n    const base: string = e.getHTML();\n    return {\n        ...await EmailStyler.format(base, subject.value),\n        json: e.getJSON(),\n    };\n}\n\nasync function send() {\n    if (sending.value) {\n        return;\n    }\n\n    if (savingPatch.value) {\n        Toast.info('Even geduld, de wijzigingen zijn nog aan het opslaan. Probeer straks opnieuw.').show();\n        return;\n    }\n\n    if (!email.value) {\n        return;\n    }\n\n    const recipientCount = email.value.recipientCount;\n    let confirmText = 'Ben je zeker dat je de e-mail wilt versturen?';\n\n    if (recipientCount) {\n        confirmText = recipientCount === 1 ? `Ben je zeker dat je de e-mail naar 1 ontvanger wilt versturen?` : `Ben je zeker dat je de e-mail naar ${email.value.recipientCount} ontvangers wilt versturen?`;\n    }\n\n    const isConfirm = await CenteredMessage.confirm(confirmText, 'Versturen');\n\n    if (!isConfirm) return;\n\n    sending.value = true;\n\n    try {\n        const { text, html } = await getHTML();\n        const resopnse = await context.value.authenticatedServer.request({\n            method: 'PATCH',\n            path: '/email/' + email.value.id,\n            body: Email.patch({\n                ...patch.value,\n                status: EmailStatus.Sending,\n                subject: subject.value,\n                text,\n                html,\n                json: editor.value?.getJSON(),\n            }),\n            decoder: EmailPreview as Decoder<EmailPreview>,\n            owner,\n            shouldRetry: false,\n        });\n\n        Toast.success('De e-mail is verzonden. Het kan even duren voor alle e-mails zijn verstuurd.').show();\n        await pop({ force: true });\n    }\n    catch (e) {\n        console.error(e);\n        Toast.fromError(e).show();\n    }\n    sending.value = false;\n}\n\nfunction getContextMenuForOption(option: RecipientChooseOneOption | RecipientMultipleChoiceOption, index: number): ContextMenuItem[] {\n    const selectedIds = selectedRecipientOptions.value[index];\n\n    if (option.type === 'ChooseOne') {\n        return option.options.map((o) => {\n            return new ContextMenuItem({\n                name: o.name,\n                selected: selectedIds[0] === o.id,\n                action: () => {\n                    selectedRecipientOptions.value[index] = [o.id];\n                },\n            });\n        });\n    }\n\n    return [\n        ...option.options.map((o) => {\n            return new ContextMenuItem({\n                name: o.name,\n                selected: selectedIds.includes(o.id),\n                action: () => {\n                    if (selectedIds.includes(o.id)) {\n                        selectedRecipientOptions.value[index] = selectedIds.filter(id => id !== o.id);\n                    }\n                    else {\n                        selectedRecipientOptions.value[index] = [...selectedIds, o.id];\n                    }\n                },\n            });\n        }),\n    ];\n}\n\nasync function showToMenu(event: MouseEvent) {\n    const menu = new ContextMenu([\n        props.recipientFilterOptions.flatMap((option, j) => {\n            if (option.type === 'MultipleChoice') {\n                if (option.name) {\n                    return [new ContextMenuItem({\n                        name: option.name,\n                        childMenu: new ContextMenu([\n                            getContextMenuForOption(option, j),\n                        ]),\n                    })];\n                }\n                return getContextMenuForOption(option, j);\n            }\n            const selectedIds = selectedRecipientOptions.value[j];\n            const selectedOption = option.options.find(o => o.id === selectedIds[0]);\n\n            return [new ContextMenuItem({\n                name: option.name ?? selectedOption?.name ?? 'Onbekend',\n                childMenu: new ContextMenu([\n                    getContextMenuForOption(option, j),\n                ]),\n            })];\n        }),\n        /* [\n            new ContextMenuItem({\n                name: groupByEmail.value ? \"Eén e-mail per e-mailadres\" : \"Aparte e-mails per lid (aanbevolen)\",\n                childMenu: new ContextMenu([\n                    [\n                        new ContextMenuItem({\n                            name: \"Aparte e-mails per lid (aanbevolen)\",\n                            description: 'Als hetzelfde e-mailadres bij meerdere leden hoort, krijgt dat e-mailadres één e-mail per lid',\n                            selected: !groupByEmail.value,\n                            action: () => {\n                                groupByEmail.value = false\n                            }\n                        }),\n                        new ContextMenuItem({\n                            name: \"Eén e-mail per e-mailadres\",\n                            description: 'Dubbele e-mailadressen ontvangen maar één e-mail, maar daardoor zijn bepaalde slimme tekstvervangingen niet beschikbaar (zoals de naam van het lid).',\n                            selected: groupByEmail.value,\n                            action: () => {\n                                groupByEmail.value = true\n                            }\n                        }),\n                    ]\n                ])\n            })\n        ] */\n    ]);\n\n    menu.show({ button: event.currentTarget }).catch(console.error);\n}\n\nfunction getFileIcon(file: EmailAttachment) {\n    if (file.filename.endsWith('.png') || file.filename.endsWith('.jpg') || file.filename.endsWith('.jpeg') || file.filename.endsWith('.gif')) {\n        return 'file-image';\n    }\n    if (file.filename.endsWith('.pdf')) {\n        return 'file-pdf color-pdf';\n    }\n    if (file.filename.endsWith('.xlsx') || file.filename.endsWith('.xls')) {\n        return 'file-excel color-excel';\n    }\n    if (file.filename.endsWith('.docx') || file.filename.endsWith('.doc')) {\n        return 'file-word color-word';\n    }\n    return 'file';\n}\n\nfunction deleteAttachment(attachment: EmailAttachment) {\n    const arr = new PatchableArray() as PatchableArrayAutoEncoder<EmailAttachment>;\n    arr.addDelete(attachment.id);\n    addPatch({ attachments: arr });\n}\n\nasync function toBase64(file: File) {\n    return new Promise<string>((resolve, reject) => {\n        const reader = new FileReader();\n        reader.onload = () => {\n            // Remove data:*;base64,\n            const str = reader.result as string;\n            const index = str.indexOf('base64,');\n            if (index !== -1) {\n                resolve(str.slice(index + 7));\n            }\n            else {\n                reject('Invalid base64');\n            }\n        };\n        reader.onerror = (e) => {\n            reject(e);\n        };\n\n        reader.readAsDataURL(file);\n    });\n}\n\nasync function changedFile(event: InputEvent & { target: HTMLInputElement & { files: FileList } }) {\n    if (!event.target.files || event.target.files.length === 0) {\n        return;\n    }\n\n    const arr = new PatchableArray() as PatchableArrayAutoEncoder<EmailAttachment>;\n\n    for (const file of event.target.files as FileList) {\n        if (file.size > 10 * 1024 * 1024) {\n            const error = 'Bestanden groter dan 10MB kunnen niet worden verstuurd.';\n            Toast.error(error).setHide(20 * 1000).show();\n            continue;\n        }\n\n        // const f = new TmpFile(file.name, file)\n        // files.value.push(f)\n\n        // Add attachment\n        arr.addPut(EmailAttachment.create({\n            filename: file.name,\n            contentType: file.type,\n            content: await toBase64(file),\n        }));\n\n        if (file.name.endsWith('.docx') || file.name.endsWith('.xlsx') || file.name.endsWith('.doc') || file.name.endsWith('.xls')) {\n            const error = 'We raden af om Word of Excel bestanden door te sturen omdat veel mensen hun e-mails lezen op hun smartphone en die bestanden vaak niet (correct) kunnen openen. Sommige mensen hebben ook geen licentie voor Word/Excel, want dat is niet gratis. Zet de bestanden om in een PDF en stuur die door.';\n            Toast.warning(error).setHide(30 * 1000).show();\n        }\n    }\n\n    // Clear selection\n    (event.target as any).value = null;\n\n    // Add patch\n    addPatch({ attachments: arr });\n}\n\nconst canOpenTemplates = computed(() => {\n    return !!email.value?.getTemplateType();\n});\nasync function openTemplates() {\n    const type = email.value?.getTemplateType();\n    if (!type) {\n        return;\n    }\n\n    const current = await getHTML();\n    const hasExistingContent = (current).text.length > 2 || subject.value.length > 0;\n\n    await present({\n        components: [\n            new ComponentWithProperties(EditEmailTemplatesView, {\n                types: [type],\n                onSelect: async (template: EmailTemplate) => {\n                    if (hasExistingContent) {\n                        if (!await CenteredMessage.confirm('Ben je zeker dat je de huidige inhoud wilt overschrijven?', 'Overschrijven', 'De huidige inhoud van je e-mail gaat verloren')) {\n                            return false;\n                        }\n                    }\n                    // todo\n                    // set json and subject\n                    editor.value?.commands.setContent(template.json);\n                    subject.value = template.subject;\n\n                    return true;\n                },\n                createOption: hasExistingContent\n                    ? EmailTemplate.create({\n                        id: '',\n                        ...current,\n                        subject: subject.value,\n                        type,\n                    })\n                    : null,\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n</script>\n","<template>\n    <EditorView ref=\"editorView\" class=\"mail-view\" title=\"E-mail template\" save-text=\"Opslaan\" :replacements=\"replacements\" @save=\"save\">\n        <p v-if=\"prefix\" class=\"style-title-prefix\" v-text=\"prefix\" />\n        <h1 v-if=\"isNew\" class=\"style-navigation-title\">\n            Nieuw sjabloon\n        </h1>\n        <h1 v-else class=\"style-navigation-title\">\n            Wijzig sjabloon\n        </h1>\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <!-- List -->\n        <template #list>\n            <STListItem class=\"no-padding\">\n                <div class=\"list-input-box\">\n                    <span>Type:</span>\n                    <span class=\"list-input\">{{ EmailTemplate.getTypeTitle(emailTemplate.type) }}</span>\n                </div>\n            </STListItem>\n            <STListItem class=\"no-padding\" element-name=\"label\">\n                <div class=\"list-input-box\">\n                    <span>Onderwerp:</span>\n                    <input id=\"mail-subject\" v-model=\"subject\" class=\"list-input\" type=\"text\" placeholder=\"Typ hier het onderwerp van je e-mail\">\n                </div>\n            </STListItem>\n        </template>\n    </EditorView>\n</template>\n\n<script lang=\"ts\" setup>\nimport { AutoEncoderPatchType } from '@simonbackx/simple-encoding';\nimport { usePop } from '@simonbackx/vue-app-navigation';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { EmailTemplate, Replacement, getExampleRecipient } from '@stamhoofd/structures';\nimport { Ref, computed, nextTick, onMounted, ref } from 'vue';\nimport EditorView from '../editor/EditorView.vue';\nimport { EmailStyler } from '../editor/EmailStyler';\nimport { ErrorBox } from '../errors/ErrorBox';\nimport { useErrors } from '../errors/useErrors';\nimport { useOrganization, usePatch, usePlatform } from '../hooks';\nimport { CenteredMessage } from '../overlays/CenteredMessage';\n\nconst props = withDefaults(\n    defineProps<{\n        emailTemplate: EmailTemplate;\n        isNew: boolean;\n        saveHandler: (patch: AutoEncoderPatchType<EmailTemplate>) => Promise<void>;\n        prefix?: string | null;\n    }>(), {\n        prefix: null,\n    },\n);\n\nconst { patched, addPatch, hasChanges, patch } = usePatch(props.emailTemplate);\nconst errors = useErrors();\nconst editorView = ref(null) as Ref<EditorView | null>;\nconst editor = computed(() => editorView.value?.editor);\nconst pop = usePop();\nconst $t = useTranslate();\nconst organization = useOrganization();\nconst platform = usePlatform();\n\nonMounted(() => {\n    if (props.emailTemplate.json && props.emailTemplate.json.type) {\n        editor.value?.commands.setContent(props.emailTemplate.json);\n    }\n});\n\nconst subject = computed({\n    get: () => patched.value.subject,\n    set: subject => addPatch({ subject }),\n});\n\nconst exampleRecipient = computed(() => EmailTemplate.getRecipientType(patched.value.type) ? getExampleRecipient(EmailTemplate.getRecipientType(patched.value.type)) : null);\nconst replacements = computed(() => {\n    const base: Replacement[] = [...EmailTemplate.getSupportedReplacementsForType(patched.value.type)];\n\n    if (platform.value) {\n        const defaultReplacements = platform.value.config.getEmailReplacements(platform.value, true);\n        base.unshift(...defaultReplacements);\n    }\n\n    // Change some defaults\n    if (organization.value) {\n        const defaultReplacements = organization.value.meta.getEmailReplacements(organization.value);\n        base.unshift(...defaultReplacements);\n    }\n\n    if (exampleRecipient.value) {\n        return [...exampleRecipient.value.replacements, ...exampleRecipient.value.getDefaultReplacements(), ...base];\n    }\n    return base;\n});\n\nasync function getHTML() {\n    const e = editor.value;\n    if (!e) {\n        // When editor is not yet loaded: slow internet -> need to know html on dismiss confirmation\n        return {\n            text: '',\n            html: '',\n            json: {},\n        };\n    }\n\n    const base: string = e.getHTML();\n    return {\n        ...await EmailStyler.format(base, subject.value),\n        json: e.getJSON(),\n    };\n}\n\nasync function save() {\n    try {\n        addPatch({\n            ...(await getHTML()),\n        });\n        await nextTick();\n        await props.saveHandler(patch.value);\n        await pop({ force: true });\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n}\n\nconst shouldNavigateAway = async () => {\n    if (!hasChanges.value && (await getHTML()).text === patched.value.text) {\n        return true;\n    }\n    return await CenteredMessage.confirm($t('996a4109-5524-4679-8d17-6968282a2a75'), $t('106b3169-6336-48b8-8544-4512d42c4fd6'));\n};\n\ndefineExpose({\n    shouldNavigateAway,\n});\n\n</script>\n","<template>\n    <SaveView :loading-view=\"loading\" :title=\"viewTitle\" :loading=\"saving\" :save-text=\"onSelect ? $t('83db2c73-38a3-4d13-9984-2f19f95e1329') : $t('5d9d5777-5ecb-4223-8dc2-973ee3fee4bb')\" @save=\"save\">\n        <h1>{{ viewTitle }}</h1>\n        <SegmentedControl v-if=\"tabItems.length > 1\" v-model=\"tab\" :items=\"tabItems.map(i => i.id)\" :labels=\"tabItems.map(i => i.label)\" />\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <div v-for=\"group of groupedList\" :key=\"group.name\" class=\"container\">\n            <hr v-if=\"tab !== 'userGenerated'\">\n            <h2 v-if=\"tab !== 'userGenerated'\">\n                {{ group.name }}\n            </h2>\n            <STList>\n                <STListItem v-for=\"emailTemplate in group.templates\" :key=\"emailTemplate.type + ':' + emailTemplate.id\" :selectable=\"true\" class=\"right-stack\" @click=\"doSelectItem(emailTemplate)\">\n                    <template #left>\n                        <figure class=\"style-image-with-icon\" :class=\"{gray: !emailTemplate.id && !!emailTemplate.html, error: !emailTemplate.id && !emailTemplate.html}\">\n                            <figure>\n                                <span class=\"icon email\" />\n                            </figure>\n                            <aside>\n                                <span v-if=\"!emailTemplate.id && !emailTemplate.html\" v-tooltip=\"$t('5069c440-c7db-4abc-9f1e-148d47d3650f')\" class=\"icon disabled error small stroke\" />\n                                <span v-else-if=\"!emailTemplate.id\" v-tooltip=\"$t('d79ef7e9-5399-4aae-804b-cb34fac5583d')\" class=\"icon lightning small stroke\" />\n                                <span v-else v-tooltip=\"$t('926212f4-c606-46e7-a43e-2f1ca3bfbf33')\" class=\"icon lightning primary small stroke \" />\n                            </aside>\n                        </figure>\n                    </template>\n\n                    <p v-if=\"getTemplatePrefix(emailTemplate)\" class=\"style-title-prefix-list\">\n                        {{ getTemplatePrefix(emailTemplate) }}\n                    </p>\n\n                    <h2 class=\"style-title-list\">\n                        {{ EmailTemplate.isSavedEmail(emailTemplate.type) ? emailTemplate.subject : EmailTemplate.getTypeTitle(emailTemplate.type) }}\n                    </h2>\n\n                    <p class=\"style-description-small\">\n                        {{ (!organization ? EmailTemplate.getPlatformTypeDescription(emailTemplate.type) : null) ?? EmailTemplate.getTypeDescription(emailTemplate.type) }}\n                    </p>\n\n                    <p v-if=\"!organization && EmailTemplate.allowOrganizationLevel(emailTemplate.type) && !emailTemplate.groupId && !emailTemplate.organizationId\" class=\"style-description-small\">\n                        {{ $t('8ecaf93e-e872-4556-9067-f89b3f81332e') }}\n                    </p>\n\n                    <p v-if=\"emailTemplate.id\" class=\"style-description-small\">\n                        {{ $t('665781fd-c032-4083-900d-fd0356334752', {date: formatDateTime(emailTemplate.updatedAt)}) }}\n                    </p>\n                    <p v-else-if=\"!emailTemplate.id && emailTemplate.html\" class=\"style-description-small\">\n                        {{ $t('6235923a-a1bc-433e-b2a3-639b37627f27') }}\n                    </p>\n\n                    <template #right>\n                        <button v-if=\"emailTemplate.id\" class=\"button icon trash gray\" type=\"button\" @click.stop=\"deleteEmail(emailTemplate)\" />\n                        <span class=\"icon arrow-right-small gray\" />\n                    </template>\n                </STListItem>\n            </STList>\n        </div>\n\n        <p v-if=\"groupedList.length === 0\" class=\"info-box\">\n            {{ $t('68b462bf-9ed9-4509-9b1b-0f1800e0e9ad') }}\n        </p>\n\n        <hr v-if=\"tab === 'userGenerated'\">\n\n        <p v-if=\"tab === 'userGenerated' && createOption\">\n            <button class=\"button text\" type=\"button\" @click=\"addCreateOption\">\n                <span class=\"icon download\" />\n                <span>{{ $t('0f0113ca-2269-49c3-b5f2-423005f71afc') }}</span>\n            </button>\n        </p>\n\n        <p v-if=\"tab === 'userGenerated'\">\n            <button v-if=\"types.includes(EmailTemplateType.SavedMembersEmail)\" class=\"button text\" type=\"button\" @click=\"addTemplate(EmailTemplateType.SavedMembersEmail)\">\n                <span class=\"icon add\" />\n                <span>{{ $t('6ecc6d7f-35dd-4459-b8d0-ce5b780b8012') }}</span>\n            </button>\n\n            <button v-if=\"cachedOutstandingBalancesEnabled && types.includes(EmailTemplateType.SavedReceivableBalancesEmail)\" class=\"button text\" type=\"button\" @click=\"addTemplate(EmailTemplateType.SavedReceivableBalancesEmail)\">\n                <span class=\"icon add\" />\n                <span>{{ $t('c88003a3-8582-4e59-a8d3-b3e77b4f01ed') }}</span>\n            </button>\n        </p>\n    </SaveView>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ArrayDecoder, AutoEncoderPatchType, Decoder, PatchableArray } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, usePop, usePresent } from '@simonbackx/vue-app-navigation';\nimport { CenteredMessage, ErrorBox, SegmentedControl, useAppContext, useContext, useErrors, useFeatureFlag, useOrganization, usePatchArray, usePlatform } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { useRequestOwner } from '@stamhoofd/networking';\nimport { EmailTemplate, EmailTemplateType, Group } from '@stamhoofd/structures';\nimport { Sorter } from '@stamhoofd/utility';\nimport { v4 as uuidv4 } from 'uuid';\nimport { computed, Ref, ref } from 'vue';\nimport EditEmailTemplateView from './EditEmailTemplateView.vue';\n\nconst props = withDefaults(\n    defineProps<{\n        types: EmailTemplateType[];\n        groups: Group[] | null;\n        webshopId?: string | null;\n        onSelect?: ((template: EmailTemplate) => boolean | Promise<boolean>) | null;\n        createOption?: EmailTemplate | null;\n        allowEditGenerated?: boolean;\n    }>(), {\n        groups: null,\n        webshopId: null,\n        types: () => {\n            const app = useAppContext();\n            const platform = usePlatform();\n\n            return [...Object.values(EmailTemplateType)].filter((type) => {\n                if (!platform.value.config.featureFlags.includes('balance-emails')\n                    && [EmailTemplateType.UserBalanceIncreaseNotification, EmailTemplateType.UserBalanceReminder].includes(type)) {\n                    return false;\n                }\n\n                if (app === 'admin') {\n                    return EmailTemplate.allowPlatformLevel(type);\n                }\n                return EmailTemplate.allowOrganizationLevel(type);\n            });\n        },\n        onSelect: null,\n        createOption: null,\n        allowEditGenerated: true,\n    });\n\nconst viewTitle = computed(() => props.onSelect ? $t('27eb0afb-0411-4036-894c-4c214fdf946c') : $t('922729ac-2079-48eb-aadf-fdee5bbfd21c'));\nconst templates = ref([]) as Ref<EmailTemplate[]>;\nconst errors = useErrors();\nconst { patched, addPatch, addPut, addDelete, patch, hasChanges } = usePatchArray(templates);\nconst owner = useRequestOwner();\nconst context = useContext();\nconst loading = ref(true);\nconst organization = useOrganization();\nconst present = usePresent();\nconst pop = usePop();\nconst saving = ref(false);\nconst $t = useTranslate();\nloadTemplates().catch(console.error);\n\nconst cachedOutstandingBalancesEnabled = useFeatureFlag()('cached-outstanding-balances');\n\nconst tabItems = props.onSelect\n    ? [\n            {\n                id: 'userGenerated',\n                label: $t('d8d27ace-5ed7-47cf-bf94-955ed8824bd3'),\n            },\n        ]\n    : (\n            props.allowEditGenerated\n                ? [\n                        {\n                            id: 'auto',\n                            label: $t('1c12b46c-804b-4ec9-a524-5c74d5cd8a1b'),\n                        },\n                        {\n                            id: 'userGenerated',\n                            label: $t('d8d27ace-5ed7-47cf-bf94-955ed8824bd3'),\n                        },\n                    ]\n                : [\n                        {\n                            id: 'auto',\n                            label: $t('1c12b46c-804b-4ec9-a524-5c74d5cd8a1b'),\n                        },\n                    ]\n        );\n\nconst tab = ref(tabItems[0].id);\n\nconst editableList = computed(() => {\n    // All user generated\n    if (tab.value === 'userGenerated') {\n        return patched.value.filter(t => EmailTemplate.isSavedEmail(t.type)).sort((a, b) => Sorter.byDateValue(a.updatedAt, b.updatedAt));\n    }\n\n    // All auto\n    const orgId = organization.value?.id ?? props.groups?.[0]?.organizationId ?? null;\n    const base = patched.value.filter(t =>\n        !EmailTemplate.isSavedEmail(t.type)\n        && props.types.includes(t.type)\n        && ((t.groupId === null && props.groups === null) || (props.groups && props.groups.some(g => g.id === t.groupId)))\n        && ((t.webshopId === null && props.webshopId === null) || (props.webshopId && t.webshopId === props.webshopId))\n        && (!orgId || t.organizationId === orgId),\n    );\n\n    // Create missing ones\n    for (const type of props.types) {\n        if (EmailTemplate.isSavedEmail(type)) {\n            continue;\n        }\n\n        for (const group of (props.groups ?? [null])) {\n            if (!base.find(t => t.type === type && t.groupId === (group?.id ?? null))) {\n                let defaultTemplate: EmailTemplate | null = patched.value.find(template => template.type === type && template.groupId === null && template.webshopId === null && template.organizationId === null) ?? null;\n\n                if (orgId) {\n                    defaultTemplate = patched.value.find(template => template.type === type && template.groupId === null && template.webshopId === null && template.organizationId === orgId) ?? defaultTemplate ?? null;\n                }\n\n                base.push(\n                    EmailTemplate.create({\n                        ...defaultTemplate,\n                        id: '', // clear\n                        organizationId: organization.value?.id ?? null,\n                        groupId: group?.id ?? null,\n                        webshopId: props.webshopId,\n                        type,\n                    }),\n                );\n            }\n        }\n    }\n\n    // Now order by type\n    base.sort((a, b) => {\n        return Sorter.stack(\n            Sorter.byStringValue(a.groupId ?? '', b.groupId ?? ''),\n            EmailTemplate.getTypeTitle(a.type).localeCompare(EmailTemplate.getTypeTitle(b.type)),\n        );\n    });\n\n    return base;\n});\n\nconst groupedList = computed(() => {\n    const result: Map<string, { name: string; templates: EmailTemplate[] }> = new Map();\n\n    for (const template of editableList.value) {\n        const key = EmailTemplate.getTypeCategory(template.type);\n        if (!result.has(key)) {\n            result.set(key, { name: key, templates: [] });\n        }\n        result.get(key)!.templates.push(template);\n    }\n\n    return Array.from(result.values()).sort((a, b) => a.name.localeCompare(b.name));\n});\n\nfunction getTemplatePrefix(emailTemplate: EmailTemplate) {\n    if (emailTemplate.groupId && props.groups) {\n        const group = props.groups.find(g => g.id === emailTemplate.groupId);\n        if (group) {\n            return group.settings.name;\n        }\n    }\n    return '';\n}\n\nasync function editEmail(emailTemplate: EmailTemplate) {\n    await present({\n        components: [\n            new ComponentWithProperties(EditEmailTemplateView, {\n                prefix: getTemplatePrefix(emailTemplate),\n                emailTemplate,\n                isNew: !emailTemplate.id,\n                saveHandler: async (patch: AutoEncoderPatchType<EmailTemplate>) => {\n                    if (emailTemplate.id) {\n                        // Update\n                        patch.id = emailTemplate.id;\n                        patch.updatedAt = new Date();\n                        addPatch(patch);\n                    }\n                    else {\n                        // Create\n                        const toCreate = emailTemplate.patch(patch);\n                        toCreate.id = uuidv4();\n                        addPut(toCreate);\n                    }\n\n                    if (props.onSelect) {\n                        await saveWithoutDismiss();\n                    }\n                },\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function addTemplate(type: EmailTemplateType) {\n    const template = EmailTemplate.create({\n        id: '',\n        type,\n    });\n    await editEmail(template);\n}\n\nasync function addCreateOption() {\n    if (!props.createOption) {\n        return;\n    }\n    await editEmail(props.createOption);\n}\n\nasync function deleteEmail(emailTemplate: EmailTemplate) {\n    if (emailTemplate.id) {\n        if (!await CenteredMessage.confirm($t('9b7756f6-8097-430d-bcee-7248a4bb1c3c'), $t('6e3da050-6679-4475-a858-77b5b02b6fa4'))) {\n            return;\n        }\n        addDelete(emailTemplate.id);\n\n        if (props.onSelect) {\n            await saveWithoutDismiss();\n        }\n    }\n}\n\nasync function loadTemplates() {\n    try {\n        const response = await context.value.authenticatedServer.request({\n            method: 'GET',\n            path: '/email-templates',\n            query: {\n                groupIds: props.groups !== null ? [props.groups.map(g => g.id)].join(',') : null,\n                webshopId: props.webshopId,\n                types: props.types.join(','),\n            },\n            shouldRetry: true,\n            owner,\n            decoder: new ArrayDecoder(EmailTemplate as Decoder<EmailTemplate>),\n        });\n        templates.value = response.data;\n        loading.value = false;\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n}\n\nasync function doSelectItem(item: EmailTemplate) {\n    if (props.onSelect) {\n        if (await saveWithoutDismiss()) {\n            if (await props.onSelect(item)) {\n                await pop({ force: true });\n            }\n        }\n    }\n    else {\n        await editEmail(item);\n    }\n}\nasync function saveWithoutDismiss() {\n    if (saving.value) {\n        return false;\n    }\n\n    if (patch.value.changes.length === 0) {\n        return true;\n    }\n\n    saving.value = true;\n    try {\n        await context.value.authenticatedServer.request({\n            method: 'PATCH',\n            path: '/email-templates',\n            shouldRetry: false,\n            owner,\n            body: patch.value,\n            decoder: new ArrayDecoder(EmailTemplate as Decoder<EmailTemplate>),\n        });\n\n        await loadTemplates();\n        patch.value = new PatchableArray();\n        saving.value = false;\n\n        return true;\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    saving.value = false;\n    return false;\n}\n\nasync function save() {\n    if (await saveWithoutDismiss()) {\n        await pop({ force: true });\n    }\n}\n\nconst shouldNavigateAway = async () => {\n    if (!hasChanges.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm($t('996a4109-5524-4679-8d17-6968282a2a75'), $t('106b3169-6336-48b8-8544-4512d42c4fd6'));\n};\n\ndefineExpose({\n    shouldNavigateAway,\n});\n</script>\n","<template>\n    <STList>\n        <STListItem>\n            <template #left>\n                <span class=\"icon calendar-grid\" />\n            </template>\n\n            <h2 class=\"style-title-list\">\n                {{ capitalizeFirstLetter(event.dateRange) }}\n            </h2>\n        </STListItem>\n\n        <STListItem v-if=\"event.meta.location\" :selectable=\"googleMapsUrl\" :href=\"googleMapsUrl\" :element-name=\"googleMapsUrl ? 'a' : undefined\" target=\"_blank\">\n            <template #left>\n                <span class=\"icon location\" />\n            </template>\n\n            <h2 class=\"style-title-list\">\n                {{ event.meta.location.name }}\n            </h2>\n            <p class=\"style-description-small\">\n                {{ event.meta.location.address }}\n            </p>\n\n            <template v-if=\"googleMapsUrl\" #right>\n                <span class=\"icon arrow-right-small gray\" />\n            </template>\n        </STListItem>\n\n        <STListItem v-if=\"ageGroups.length\">\n            <template #left>\n                <span class=\"icon group\" />\n            </template>\n\n            <h2 class=\"style-title-list\">\n                {{ ageGroups }}\n            </h2>\n        </STListItem>\n\n        <STListItem v-if=\"event.group\" :selectable=\"!differentOrganization && !event.group.closed\" class=\"right-stack\" @click=\"!differentOrganization && !event.group.closed ? openGroup() : undefined\">\n            <template #left>\n                <span class=\"icon edit\" />\n            </template>\n\n            <h2 class=\"style-title-list\">\n                <span v-if=\"event.group.notYetOpen && event.group.settings.registrationEndDate\">Inschrijven mogelijk van {{ Formatter.dateRange(event.group.activePreRegistrationDate ?? event.group.settings.registrationStartDate ?? new Date(), event.group.settings.registrationEndDate, ' tot ') }}</span>\n                <span v-else-if=\"event.group.notYetOpen\">Inschrijven mogelijk vanaf {{ Formatter.startDate(event.group.activePreRegistrationDate ?? event.group.settings.registrationStartDate ?? new Date()) }}</span>\n                <span v-else-if=\"event.group.closed\">De inschrijvingen zijn gesloten</span>\n                <span v-else-if=\"event.group.settings.registrationEndDate\">Inschrijven kan tot {{ Formatter.endDate(event.group.settings.registrationEndDate) }}</span>\n                <span v-else>Inschrijvingen zijn geopend</span>\n            </h2>\n\n            <p v-if=\"app !== 'registration' && !event.group.closed && (organization && event.organizationId !== organization.id && !event.group.settings.allowRegistrationsByOrganization)\" class=\"style-description-small\">\n                {{ $t('34fdb013-005c-46c4-b52e-e58f7697b586') }}\n            </p>\n\n            <template v-if=\"!differentOrganization && !event.group.closed\" #right>\n                <span class=\"icon arrow-right-small gray\" />\n            </template>\n        </STListItem>\n\n        <slot />\n    </STList>\n</template>\n\n<script setup lang=\"ts\">\nimport { useAppContext, useChooseFamilyMembersForGroup, useOrganization, usePlatform } from '@stamhoofd/components';\nimport { Event, PlatformFamily } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed } from 'vue';\n\nconst props = withDefaults(\n    defineProps<{\n        event: Event;\n        family?: PlatformFamily | null;\n    }>(),\n    {\n        family: null,\n    },\n);\n\nconst platform = usePlatform();\nconst app = useAppContext();\nconst organization = useOrganization();\n\nconst googleMapsUrl = computed(() => {\n    if (props.event.meta.location?.address) {\n        return `https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(props.event.meta.location.address)}`;\n    }\n    return null;\n});\nconst differentOrganization = computed(() => props.event.group && (!props.family || (props.family.checkout.cart.isEmpty && props.family.checkout.singleOrganization?.id !== props.event.group.organizationId)));\n\nconst ageGroups = computed(() => {\n    const prefixes: string[] = [];\n\n    if (props.event.meta.defaultAgeGroupIds !== null) {\n        for (const ageGroupId of props.event.meta.defaultAgeGroupIds) {\n            const ageGroup = platform.value?.config.defaultAgeGroups.find(g => g.id === ageGroupId);\n            if (ageGroup) {\n                prefixes.push(ageGroup.name);\n            }\n        }\n    }\n\n    if (props.event.meta.groups !== null) {\n        for (const group of props.event.meta.groups) {\n            prefixes.push(group.name);\n        }\n    }\n\n    return Formatter.joinLast(prefixes, ', ', ' of ');\n});\n\nconst chooseFamilyMembersForGroup = useChooseFamilyMembersForGroup();\n\nasync function openGroup() {\n    if (!props.event.group || !props.family) {\n        return;\n    }\n\n    await chooseFamilyMembersForGroup({\n        group: props.event.group,\n        family: props.family,\n        displayOptions: {\n            action: 'present',\n            modalDisplayStyle: 'popup',\n        },\n    });\n}\n\n</script>\n","export default import.meta.ROLLUP_FILE_URL_DLF5INNZ;","import { ComponentWithProperties, PushOptions, useDismiss, useNavigationController, usePop, usePresent, useShow } from '@simonbackx/vue-app-navigation';\nimport { UnwrapRef } from 'vue';\n\nexport type NavigationActions = {\n    show: ReturnType<typeof useShow>;\n    present: ReturnType<typeof usePresent>;\n    dismiss: ReturnType<typeof useDismiss>;\n    pop: ReturnType<typeof usePop>;\n    navigationController?: UnwrapRef<ReturnType<typeof useNavigationController>>;\n};\n\nexport function useNavigationActions(): NavigationActions {\n    const show = useShow();\n    const present = usePresent();\n    const pop = usePop();\n    const dismiss = useDismiss();\n    const navigationController = useNavigationController();\n\n    return { show, present, pop, dismiss, navigationController: navigationController.value };\n}\n\nexport type DisplayOptions = Omit<PushOptions, 'components'> & {\n    action: 'show' | 'present';\n};\n\nexport const defaultDisplayOptions = { action: 'present', modalDisplayStyle: 'popup' } as DisplayOptions;\n\nexport function runDisplayOptions(pushOptions: PushOptions, displayOptions: DisplayOptions, navigate: NavigationActions) {\n    if (displayOptions.action === 'show') {\n        return navigate.show({ ...pushOptions, ...displayOptions });\n    }\n    return navigate.present({ ...pushOptions, ...displayOptions });\n}\n\n/**\n * Because some steps are optional, it is possible we arrive at some further step, and that step wans to either show or popup - but that\n * depends whether the previous step did show a popup or not. This function will make sure the navigation is consistent.\n */\nexport function glueNavigationActions(didShowView: boolean, currentNavigate: NavigationActions, displayOptions?: DisplayOptions) {\n    if (!displayOptions) {\n        displayOptions = defaultDisplayOptions;\n    }\n\n    if (didShowView || displayOptions.action !== 'present') {\n        // Always show normally\n        return currentNavigate;\n    }\n\n    // show should upgrade to popup or sheet\n    const newNavigate: NavigationActions = {\n        ...currentNavigate,\n        show: async (o) => {\n            let options: PushOptions;\n            if (!(o as any).components) {\n                options = ({ components: [o as ComponentWithProperties] });\n            }\n            else {\n                options = o as PushOptions;\n            }\n\n            await currentNavigate.present({ ...options, ...displayOptions });\n        },\n        dismiss: async () => {\n            // noop: already dismissed\n        },\n        pop: async () => {\n            // noop: already popped\n        },\n    };\n\n    return newNavigate;\n}\n","import { ComponentWithProperties, NavigationController } from '@simonbackx/vue-app-navigation';\nimport { DisplayOptions, glueNavigationActions, NavigationActions, runDisplayOptions } from '../../types/NavigationActions';\n\nexport class ViewStepsManager {\n    steps: ViewStep[] = [];\n    finishHandler: (navigate: NavigationActions) => void | Promise<void>;\n    displayOptions: DisplayOptions;\n\n    constructor(\n        steps: ViewStep[],\n        finishHandler: (navigate: NavigationActions) => void | Promise<void>,\n        displayOptions: DisplayOptions,\n    ) {\n        this.steps = steps;\n        this.finishHandler = finishHandler;\n        this.displayOptions = displayOptions;\n    }\n\n    /**\n     *\n     * @param currentStep\n     * @param navigate\n     * @param skipping Continue until the last step\n     * @returns\n     */\n    async saveHandler(currentStep: ViewStep | null, navigate: NavigationActions, skipping = false) {\n        const nextStep = skipping ? null : this.getNextStep(currentStep);\n        if (nextStep) {\n            if (currentStep === null) {\n                return await runDisplayOptions({\n                    components: [\n                        new ComponentWithProperties(NavigationController, {\n                            root: await nextStep.getComponent(this),\n                        }),\n                    ],\n                }, this.displayOptions, navigate);\n            }\n            return await navigate.show({\n                components: [\n                    await nextStep.getComponent(this),\n                ],\n            });\n        }\n        else {\n            // Assure that if the next step uses navigate.show, while the displayoptions are 'present', and we never presented\n            // any view, we map the navigate show to something like present to match the display options\n            const gluedNavigate = glueNavigationActions(currentStep !== null, navigate, this.displayOptions);\n            await this.finishHandler(gluedNavigate);\n        }\n    }\n\n    start(navigate: NavigationActions) {\n        return this.saveHandler(null, navigate);\n    }\n\n    getNextStep(step: ViewStep | null): ViewStep | null {\n        let found = step === null;\n        for (const s of this.steps) {\n            if (found && s.isEnabled(this)) {\n                return s;\n            }\n            if (s === step) {\n                found = true;\n            }\n        }\n        return null;\n    }\n}\n\nexport interface ViewStep {\n    getComponent(manager: ViewStepsManager): Promise<ComponentWithProperties> | ComponentWithProperties;\n    isEnabled(manager: ViewStepsManager): boolean;\n}\n","import { ArrayDecoder, AutoEncoder, EnumDecoder, getOptionalId, isPatchMap, SymbolDecoder } from '@simonbackx/simple-encoding';\nimport { AuditLogPatchItem, AuditLogPatchItemType, AuditLogReplacement, AuditLogReplacementType, Version } from '@stamhoofd/structures';\nimport { DataValidator, Formatter } from '@stamhoofd/utility';\nfunction diffEnum(oldValue, value, key) {\n    if (oldValue === value) {\n        return [];\n    }\n    if (value === undefined) {\n        // Not altered\n        return [];\n    }\n    return [\n        AuditLogPatchItem.create({\n            key,\n            oldValue: typeof oldValue === 'string' ? AuditLogReplacement.key(oldValue) : undefined,\n            value: typeof value === 'string' ? AuditLogReplacement.key(value) : undefined,\n        }).autoType(),\n    ];\n}\nfunction diffDate(oldValue, value, key) {\n    if (!(oldValue instanceof Date) && oldValue !== null) {\n        return [];\n    }\n    if ((!(value instanceof Date)) && value !== null) {\n        return [];\n    }\n    if ((oldValue === null || oldValue === void 0 ? void 0 : oldValue.getTime()) === (value === null || value === void 0 ? void 0 : value.getTime())) {\n        return [];\n    }\n    let dno = oldValue ? Formatter.dateNumber(oldValue, true) : undefined;\n    let dn = value ? Formatter.dateNumber(value, true) : undefined;\n    if (dno && dn && (dno === dn || (Formatter.time(oldValue) !== Formatter.time(value))) && (key === null || key === void 0 ? void 0 : key.toKey()) !== 'birthDay') {\n        // Add time\n        dno += ' ' + Formatter.time(oldValue);\n        dn += ' ' + Formatter.time(value);\n    }\n    return [\n        AuditLogPatchItem.create({\n            key,\n            oldValue: dno ? AuditLogReplacement.string(dno) : undefined,\n            value: dn ? AuditLogReplacement.string(dn) : undefined,\n        }).autoType(),\n    ];\n}\nfunction getDiffKey(autoEncoder) {\n    if (typeof autoEncoder === 'string') {\n        if (DataValidator.isUuid(autoEncoder)) {\n            return AuditLogReplacement.uuid(autoEncoder);\n        }\n        return AuditLogReplacement.key(autoEncoder);\n    }\n    return undefined;\n}\n/**\n * For arrays or maps, use this name instead of the index/key to identify an object\n */\nfunction getDiffName(autoEncoder) {\n    if (typeof autoEncoder === 'string') {\n        if (DataValidator.isUuid(autoEncoder)) {\n            return AuditLogReplacement.uuid(autoEncoder);\n        }\n        return AuditLogReplacement.string(autoEncoder);\n    }\n    if (typeof autoEncoder === 'object' && autoEncoder !== null && 'getDiffName' in autoEncoder && typeof autoEncoder.getDiffName === 'function') {\n        const name = autoEncoder.getDiffName();\n        if (typeof name === 'string') {\n            return name ? AuditLogReplacement.string(name) : AuditLogReplacement.key('untitled');\n        }\n        if (name instanceof AuditLogReplacement) {\n            return name;\n        }\n    }\n    if (typeof autoEncoder === 'object' && autoEncoder !== null && 'name' in autoEncoder && typeof autoEncoder.name === 'string') {\n        return autoEncoder.name ? AuditLogReplacement.string(autoEncoder.name) : AuditLogReplacement.key('untitled');\n    }\n    return null;\n}\nfunction getDiffPutValue(autoEncoder, key) {\n    if (typeof autoEncoder === 'object' && autoEncoder !== null && 'getDiffPutName' in autoEncoder && typeof autoEncoder.getDiffPutName === 'function') {\n        const name = autoEncoder.getDiffPutName();\n        if (typeof name === 'string') {\n            return AuditLogReplacement.string(name);\n        }\n        if (name instanceof AuditLogReplacement) {\n            return name;\n        }\n    }\n    return getDiffValue(autoEncoder, key);\n}\nfunction getDiffValue(autoEncoder, key) {\n    if (typeof autoEncoder === 'string') {\n        if (DataValidator.isUuid(autoEncoder)) {\n            return AuditLogReplacement.uuid(autoEncoder);\n        }\n        // Is html\n        if (autoEncoder.startsWith('<!DOCTYPE html>')) {\n            return AuditLogReplacement.html(autoEncoder);\n        }\n        if (key && (key === null || key === void 0 ? void 0 : key.lastValue()) === 'status') {\n            // Will be an enum\n            return AuditLogReplacement.key(autoEncoder);\n        }\n        return AuditLogReplacement.string(autoEncoder);\n    }\n    if (typeof autoEncoder === 'symbol') {\n        const name = Symbol.keyFor(autoEncoder);\n        if (name) {\n            return AuditLogReplacement.key(name);\n        }\n        return AuditLogReplacement.key('unknown');\n    }\n    if (typeof autoEncoder === 'number') {\n        const k = key === null || key === void 0 ? void 0 : key.lastValue();\n        if (k && (k.toLowerCase().includes('price') || k.toLowerCase().includes('fee'))) {\n            return AuditLogReplacement.string(Formatter.price(autoEncoder));\n        }\n        return AuditLogReplacement.string(Formatter.integer(autoEncoder));\n    }\n    if (autoEncoder instanceof Date) {\n        return AuditLogReplacement.string(Formatter.dateTime(autoEncoder, true, true));\n    }\n    if (autoEncoder === true) {\n        return AuditLogReplacement.key('on');\n    }\n    if (autoEncoder === false) {\n        return AuditLogReplacement.key('off');\n    }\n    if (typeof autoEncoder === 'object' && autoEncoder !== null && 'getDiffValue' in autoEncoder && typeof autoEncoder.getDiffValue === 'function') {\n        const name = autoEncoder.getDiffValue();\n        if (typeof name === 'string') {\n            return AuditLogReplacement.string(name);\n        }\n        if (name instanceof AuditLogReplacement) {\n            return name;\n        }\n    }\n    return null;\n}\nfunction findOriginalById(id, oldArray) {\n    return id ? oldArray.find(v => getId(v) === id) : null;\n}\nfunction findOriginalIndexById(id, oldArray) {\n    return id ? oldArray.findIndex(v => getId(v) === id) : -1;\n}\nfunction getId(object) {\n    const id = getOptionalId(object);\n    if (typeof id !== 'string' && typeof id !== 'number') {\n        if (object instanceof AutoEncoder) {\n            const encoded = object.encode({ version: Version });\n            return JSON.stringify(encoded);\n        }\n        return JSON.stringify(object);\n    }\n    return id;\n}\nfunction findOriginal(put, oldArray) {\n    return findOriginalById(getId(put), oldArray);\n}\nfunction findIndex(put, oldArray) {\n    return findOriginalIndexById(getId(put), oldArray);\n}\nfunction diffArray(oldValue, value, key) {\n    if (!Array.isArray(oldValue) || !Array.isArray(value)) {\n        // Not supported\n        return [];\n    }\n    const items = [];\n    // Search for puts\n    let orderChanged = false;\n    let added = 0;\n    for (const [index, newItem] of value.entries()) {\n        const originalIndex = findIndex(newItem, oldValue);\n        if (originalIndex === -1) {\n            // Has been added\n            items.push(...diffUnknown(null, newItem, (getDiffName(newItem) || AuditLogReplacement.key('item')).prepend(key)));\n            added++;\n        }\n        else {\n            // Has been overwritten\n            const original = oldValue[originalIndex];\n            items.push(...diffUnknown(original, newItem, (getDiffName(original) || getDiffName(newItem) || AuditLogReplacement.key('item')).prepend(key)));\n            if ((index - added) !== originalIndex) {\n                // Order has changed\n                orderChanged = true;\n            }\n        }\n    }\n    // Search for deletes\n    for (const original of oldValue) {\n        const newItem = findOriginal(original, value);\n        if (!newItem) {\n            // Has been deleted\n            items.push(...diffUnknown(original, null, (getDiffName(original) || AuditLogReplacement.key('item')).prepend(key)));\n            orderChanged = false; // ignore order changed as delete will have set it to true\n        }\n    }\n    if (orderChanged) {\n        // Check if order has changed\n        items.push(AuditLogPatchItem.create({\n            key,\n            type: AuditLogPatchItemType.Reordered,\n        }));\n    }\n    // Not supported\n    return items;\n}\n;\nfunction diffMap(oldValue, value, key) {\n    if (!(value instanceof Map)) {\n        // Not supported\n        return [];\n    }\n    if (!(oldValue instanceof Map) && oldValue !== undefined && oldValue !== null) {\n        // Not supported\n        return [];\n    }\n    const items = [];\n    const isPatch = isPatchMap(value);\n    for (const [k, v] of value.entries()) {\n        if (typeof k !== 'string') {\n            // Not supported\n            continue;\n        }\n        const original = oldValue === null || oldValue === void 0 ? void 0 : oldValue.get(k);\n        if (v === null && isPatch) {\n            // Delete\n            if (original) {\n                items.push(...diffUnknown(original, null, (getDiffName(original) || getDiffKey(k)).prepend(key)));\n            }\n            continue;\n        }\n        // Changed\n        items.push(...diffUnknown(original, v, (getDiffName(original) || getDiffName(v) || getDiffKey(k)).prepend(key)));\n    }\n    if (!isPatch && oldValue) {\n        // Loop old values\n        for (const [k, v] of oldValue.entries()) {\n            if (typeof k !== 'string') {\n                // Not supported\n                continue;\n            }\n            if (value.has(k)) {\n                continue;\n            }\n            items.push(...diffUnknown(v, null, (getDiffName(v) || getDiffKey(k)).prepend(key)));\n        }\n    }\n    return items;\n}\nexport function transformValueForDiff(value) {\n    if (typeof value === 'object' && value !== null && 'transformForDiff' in value && typeof value.transformForDiff === 'function') {\n        return value.transformForDiff();\n    }\n    return value;\n}\nfunction diffUnknown(oldValue, value, key) {\n    oldValue = transformValueForDiff(oldValue);\n    value = transformValueForDiff(value);\n    if (oldValue === value) {\n        return [];\n    }\n    if ((oldValue === null || oldValue === undefined) && (value === null || value === undefined)) {\n        // Both removed\n        return [];\n    }\n    if (Array.isArray(oldValue) && Array.isArray(value)) {\n        return diffArray(oldValue, value, key);\n    }\n    if (value instanceof Map && (oldValue instanceof Map || oldValue === null || oldValue === undefined)) {\n        return diffMap(oldValue, value, key);\n    }\n    if ((value instanceof Date || value === null) && (oldValue instanceof Date || oldValue === null) && (oldValue !== null || value !== null)) {\n        return diffDate(oldValue, value, key);\n    }\n    if ((oldValue === null || oldValue === undefined) && (value !== null && value !== undefined)) {\n        // Simplify addition\n        return [\n            AuditLogPatchItem.create({\n                key,\n                value: getDiffPutValue(value, key) || undefined,\n                type: AuditLogPatchItemType.Added,\n            }),\n        ];\n    }\n    if ((oldValue !== null && oldValue !== undefined) && (value === null || value === undefined)) {\n        return [\n            AuditLogPatchItem.create({\n                key,\n                oldValue: getDiffPutValue(oldValue, key) || undefined,\n                type: AuditLogPatchItemType.Removed,\n            }),\n        ];\n    }\n    const items = diffObject(oldValue, value, key);\n    let v = getDiffValue(value, key);\n    let ov = getDiffValue(oldValue, key);\n    if (oldValue !== undefined && oldValue !== null && value !== undefined && value !== null && getDiffValue(value, key) && items.length === 0 && value instanceof AutoEncoder && value.isPatch()) {\n        return [\n            AuditLogPatchItem.create({\n                key,\n                value: v || undefined,\n                oldValue: ov || undefined,\n                type: AuditLogPatchItemType.Changed,\n            }),\n        ];\n    }\n    if (v && ov) {\n        // Simplify change\n        if (v.toKey() === ov.toKey()) {\n            v = null;\n            ov = null;\n            // if (items.length === 0) {\n            // Probably no change\n            return [];\n            // }\n        }\n        return [\n            AuditLogPatchItem.create({\n                key,\n                value: v || undefined,\n                oldValue: ov || undefined,\n                type: AuditLogPatchItemType.Changed,\n            }),\n        ];\n    }\n    return items;\n}\n;\n/**\n * Uses the autoencoder type information to provide a better change handler\n */\nfunction diffField(field, oldValue, value, key) {\n    if (field.decoder instanceof EnumDecoder) {\n        return diffEnum(oldValue, value, key);\n    }\n    if (field.decoder instanceof SymbolDecoder) {\n        if (field.decoder.decoder instanceof EnumDecoder) {\n            return diffEnum(oldValue, value, key);\n            ;\n        }\n    }\n    if (field.decoder instanceof ArrayDecoder) {\n        if (field.decoder.decoder instanceof EnumDecoder) {\n            // Map values to keys\n            const items = diffArray(oldValue, value, key);\n            for (const item of items) {\n                if (item.oldValue && !item.oldValue.type) {\n                    item.oldValue.type = AuditLogReplacementType.Key;\n                }\n                if (item.value && !item.value.type) {\n                    item.value.type = AuditLogReplacementType.Key;\n                }\n                // If item.key is an array that ends with a 'value', also change it\n                if (item.key.type === AuditLogReplacementType.Array) {\n                    const lastKeyItem = item.key.values[item.key.values.length - 1];\n                    if (!lastKeyItem.type) {\n                        lastKeyItem.type = AuditLogReplacementType.Key;\n                    }\n                }\n                else {\n                    if (!item.key.type) {\n                        item.key.type = AuditLogReplacementType.Key;\n                    }\n                }\n            }\n            return items;\n        }\n        return diffArray(oldValue, value, key);\n    }\n    return diffUnknown(oldValue, value, key);\n}\nfunction diffObject(original, patch, rootKey) {\n    var _a;\n    if (typeof patch !== 'object' || patch === null) {\n        return [];\n    }\n    if (original && typeof original !== 'object') {\n        return [];\n    }\n    const items = [];\n    for (const key in patch) {\n        if (key === 'id') {\n            continue;\n        }\n        const oldValue = (_a = original === null || original === void 0 ? void 0 : original[key]) !== null && _a !== void 0 ? _a : null;\n        const value = patch[key];\n        if (!(patch instanceof AutoEncoder) && !(oldValue instanceof AutoEncoder)) {\n            // try manual without type information\n            items.push(...diffUnknown(oldValue, value, getDiffKey(key).prepend(rootKey)));\n            continue;\n        }\n        const field = original instanceof AutoEncoder\n            ? original.static.latestFields.find(f => f.property === key)\n            : (patch instanceof AutoEncoder\n                ? patch.static.latestFields.find(f => f.property === key)\n                : null);\n        if (!field) {\n            // Ignore: probably an internal field\n            continue;\n        }\n        items.push(...diffField(field, oldValue, value, getDiffKey(key).prepend(rootKey)));\n    }\n    return items;\n}\nexport class ObjectDiffer {\n    static diff(oldValue, value, key) {\n        return diffUnknown(oldValue, value, key);\n    }\n}\n//# sourceMappingURL=ObjectDiffer.js.map","<template>\n    <SaveView :title=\"title\" :loading=\"saving\" :prefer-large-button=\"true\" @save=\"save\">\n        <FillRecordCategoryBox\n            :category=\"category\"\n            :value=\"patched\"\n            :validator=\"errors.validator\"\n            :level=\"1\"\n            :all-optional=\"false\"\n            :force-mark-reviewed=\"true\"\n            @patch=\"addPatch({recordAnswers: $event})\"\n        >\n            <STErrorsDefault :error-box=\"errors.errorBox\" />\n        </FillRecordCategoryBox>\n\n        <template v-if=\"canSaveDraft\" #toolbar>\n            <button class=\"button secundary\" type=\"button\" @click=\"saveDraft\">\n                Opslaan als klad\n            </button>\n        </template>\n    </SaveView>\n</template>\n\n<script setup lang=\"ts\">\nimport { useDismiss, usePop } from '@simonbackx/vue-app-navigation';\nimport { CenteredMessage, ErrorBox, FillRecordCategoryBox, NavigationActions, Toast, ToastButton, useErrors, useNavigationActions } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { RecordCategory } from '@stamhoofd/structures';\nimport { computed, ref } from 'vue';\nimport { EventNotificationViewModel } from './classes/EventNotificationViewModel';\n\nconst props = withDefaults(\n    defineProps<{\n        viewModel: EventNotificationViewModel;\n        category: RecordCategory;\n        saveHandler?: ((navigate: NavigationActions) => Promise<void> | void) | null;\n        skipHandler?: ((navigate: NavigationActions) => Promise<void> | void) | null;\n    }>(), {\n        saveHandler: null,\n        skipHandler: null,\n    },\n);\n\nconst errors = useErrors();\nconst { hasChanges, patched, addPatch, patch } = props.viewModel.usePatch();\nconst title = computed(() => props.category.name);\nconst saving = ref(false);\nconst $t = useTranslate();\nconst pop = usePop();\nconst { save: saveModel } = props.viewModel.useSave();\nconst navigationActions = useNavigationActions();\nconst dismiss = useDismiss();\nconst canSaveDraft = ref(false);\n\nasync function saveDraft() {\n    if (saving.value) {\n        return;\n    }\n\n    errors.errorBox = null;\n    saving.value = true;\n\n    try {\n        await saveModel(patch.value);\n\n        if (props.skipHandler) {\n            await props.skipHandler(navigationActions);\n        }\n        else {\n            await dismiss({ force: true });\n        }\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n\n    saving.value = false;\n}\n\nasync function save() {\n    if (saving.value) {\n        return;\n    }\n\n    errors.errorBox = null;\n\n    saving.value = true;\n\n    if (!await errors.validator.validate()) {\n        // Save as draft\n        canSaveDraft.value = true;\n\n        saving.value = false;\n        return;\n    }\n\n    try {\n        await saveModel(patch.value);\n        if (props.saveHandler) {\n            await props.saveHandler(navigationActions);\n        }\n        else {\n            await pop({ force: true });\n        }\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n\n    saving.value = false;\n}\n\nconst shouldNavigateAway = async () => {\n    if (!hasChanges.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm($t('996a4109-5524-4679-8d17-6968282a2a75'), $t('106b3169-6336-48b8-8544-4512d42c4fd6'));\n};\n\ndefineExpose({\n    shouldNavigateAway,\n});\n\n</script>\n","<template>\n    <div class=\"st-view\">\n        <STNavigationBar :title=\"$t('Originele antwoorden')\" />\n\n        <main>\n            <h1>\n                {{ $t('Originele antwoorden') }}\n            </h1>\n            <p>{{ $t('Hieronder zie je de antwoorden op alle vragen op het moment van de laatste (voorlopige) goedkeuring') }}</p>\n\n            <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n            <ViewRecordCategoryAnswersBox v-for=\"category in recordCategories\" :key=\"'category-'+category.id\" :category=\"category\" :value=\"notification\" />\n        </main>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ViewRecordCategoryAnswersBox } from '@stamhoofd/components';\nimport { RecordCategory } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { useErrors } from '../errors/useErrors';\nimport { EventNotificationViewModel } from './event-notifications/classes/EventNotificationViewModel';\n\nconst props = withDefaults(\n    defineProps<{\n        viewModel: EventNotificationViewModel;\n    }>(), {\n\n    },\n);\n\nconst notification = props.viewModel.useOriginalNotification();\nconst errors = useErrors(); ;\nconst type = props.viewModel.useType();\n\nconst recordCategories = computed(() => {\n    return RecordCategory.filterCategories(type.value.recordCategories, notification.value);\n});\n\n</script>\n","<template>\n    <div class=\"st-view\">\n        <STNavigationBar :title=\"title\">\n            <template #right>\n                <button v-if=\"isReviewer\" v-long-press=\"(e) => showContextMenu(e)\" class=\"button icon navigation more\" type=\"button\" @click.prevent=\"showContextMenu\" @contextmenu.prevent=\"showContextMenu\" />\n            </template>\n        </STNavigationBar>\n\n        <main>\n            <h1>\n                {{ title }}\n            </h1>\n            <p>{{ type.description }}</p>\n\n            <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n            <STList class=\"info\">\n                <STListItem :selectable=\"notification.events.length === 1\" @click=\"isReviewer && notification.events.length === 1 && openEvent(null)\">\n                    <h3 class=\"style-definition-label\">\n                        {{ notification.events.length === 1 ? $t('a7db7ad2-4106-4cf0-a8fc-1e68b0a5bf24') : $t('cbfe8b26-7422-44dd-af53-90e14baa4d9a') }}\n                    </h3>\n                    <p v-for=\"event of notification.events\" :key=\"event.id\" class=\"style-definition-text\" @click=\"isReviewer && notification.events.length !== 1 && openEvent(event)\">\n                        <span>{{ notification.events.map(e => e.name).join(', ') }}</span>\n                    </p>\n                    <p v-if=\"notification.events.length === 0\" class=\"style-definition-text style-em\">\n                        Geen\n                    </p>\n\n                    <template v-if=\"isReviewer && notification.events.length === 1\" #right>\n                        <span class=\"icon arrow-right-small gray\" />\n                    </template>\n                </STListItem>\n\n                <STListItem v-if=\"app === 'admin'\">\n                    <h3 class=\"style-definition-label\">\n                        {{ $t('7f4247c2-2bc1-4f0d-89d5-f4ea51e92bfa') }}\n                    </h3>\n                    <p class=\"style-definition-text\">\n                        <span>{{ notification.organization.name }} ({{ notification.organization.uri }})</span>\n                    </p>\n                </STListItem>\n\n                <STListItem>\n                    <h3 class=\"style-definition-label\">\n                        Wanneer\n                    </h3>\n                    <p class=\"style-definition-text\">\n                        <span>{{ capitalizeFirstLetter(formatDateRange(notification.startDate, notification.endDate, undefined, false)) }}</span>\n                    </p>\n                </STListItem>\n\n                <STListItem>\n                    <h3 class=\"style-definition-label\">\n                        Status\n                    </h3>\n                    <p class=\"style-definition-text\">\n                        <span>{{ capitalizeFirstLetter(EventNotificationStatusHelper.getName(notification.status)) }}</span>\n                        <span v-if=\"notification.status === EventNotificationStatus.Pending\" class=\"icon clock middle\" />\n                        <span v-if=\"notification.status === EventNotificationStatus.Rejected\" class=\"icon error red middle\" />\n                        <span v-if=\"notification.status === EventNotificationStatus.PartiallyAccepted\" class=\"icon secundary partially middle\" />\n                        <span v-if=\"notification.status === EventNotificationStatus.Accepted\" class=\"icon success green middle\" />\n                    </p>\n\n                    <p v-if=\"notification.submittedBy && notification.submittedAt\" class=\"style-description-small\">\n                        {{ $t('46e61090-1188-4085-8995-69aef85af678', {name: notification.submittedBy.name, date: formatDate(notification.submittedAt)}) }}\n                    </p>\n                </STListItem>\n\n                <STListItem v-if=\"notification.feedbackText && notification.status !== EventNotificationStatus.Accepted\" :selectable=\"isReviewer\" @click=\"isReviewer && editFeedbackText()\">\n                    <h3 class=\"style-definition-label\">\n                        {{ $t('e4017a21-58c1-4cea-824c-8cef6a7ab019') }}\n                    </h3>\n                    <p class=\"style-definition-text pre-wrap style-em\" v-text=\"notification.feedbackText\" />\n\n                    <template v-if=\"isReviewer\" #right>\n                        <span class=\"icon edit gray\" />\n                    </template>\n                </STListItem>\n\n                <STListItem v-if=\"isReviewer && notification.status !== EventNotificationStatus.Accepted && notification.acceptedRecordAnswers.size > 0 && diffList\">\n                    <h3 class=\"style-definition-label\">\n                        {{ $t('Aangepast sinds voorlopige goedkeuring') }}\n                    </h3>\n                    <PatchListText :items=\"diffList\" />\n\n                    <template #right>\n                        <button class=\"button icon eye gray\" @click=\"showOriginalAnswers\" type=\"button\" v-tooltip=\"'Bekijk origineel'\"/>\n                    </template>\n                </STListItem>\n            </STList>\n\n            <template v-if=\"notification.status === EventNotificationStatus.Draft\">\n                <hr>\n                <h2>Gegevens</h2>\n                <p>Vul de gegevens hieronder aan voor je de kampmelding indient.</p>\n\n                <!-- For each record category: a new view -->\n                <STList>\n                    <STListItem v-for=\"category of recordCategories\" :key=\"category.id\" :selectable=\"isEnabled(category)\" :disabled=\"!isEnabled(category)\" @click=\"editRecordCategory(category)\">\n                        <template #left>\n                            <IconContainer :icon=\"'file-filled'\" :class=\"getRecordCategoryProgress(category) === 1 ? 'success' : 'gray'\">\n                                <template #aside>\n                                    <ProgressIcon :icon=\"getRecordCategoryProgress(category) === 1 ? 'success' : undefined\" :progress=\"getRecordCategoryProgress(category)\" />\n                                </template>\n                            </IconContainer>\n                        </template>\n                        <h3 class=\"style-title-list\">\n                            {{ category.name }}\n                        </h3>\n                        <p v-if=\"getRecordCategoryProgress(category) === 0\" class=\"style-description\">\n                            Nog niet ingevuld\n                        </p>\n                        <p v-else-if=\"getRecordCategoryProgress(category) === 1\" class=\"style-description\">\n                            Volledig ingevuld\n                        </p>\n                        <p v-else class=\"style-description\">\n                            Onvolledig\n                        </p>\n\n                        <template #right>\n                            <span v-if=\"isEnabled(category)\" class=\"icon arrow-right-small gray\" />\n                        </template>\n                    </STListItem>\n                </STList>\n            </template>\n\n            <template v-else>\n                <ViewRecordCategoryAnswersBox v-for=\"category in recordCategories\" :key=\"'category-'+category.id\" :category=\"category\" :value=\"notification\">\n                    <template v-if=\"isReviewer || notification.status === EventNotificationStatus.Rejected\" #buttons>\n                        <button type=\"button\" class=\"button icon edit\" @click=\"editRecordCategory(category)\" />\n                    </template>\n                </ViewRecordCategoryAnswersBox>\n            </template>\n\n            <div v-if=\"notification.status === EventNotificationStatus.Pending && isComplete && isReviewer\" class=\"container\">\n                <hr>\n                <h2>Beslissing</h2>\n\n                <STList>\n                    <STListItem :selectable=\"true\" element-name=\"button\" @click=\"doAccept\">\n                        <template #left>\n                            <IconContainer icon=\"notification\" class=\"success\">\n                                <template #aside>\n                                    <span class=\"icon success small\" />\n                                </template>\n                            </IconContainer>\n                        </template>\n                        <h3 class=\"style-title-list\">\n                            Goedkeuren\n                        </h3>\n                        <p class=\"style-description-small\">\n                            Keur deze melding goed.\n                        </p>\n\n                        <template #right>\n                            <span class=\"icon arrow-right-small gray\" />\n                        </template>\n                    </STListItem>\n\n                    <STListItem :selectable=\"true\" element-name=\"button\" @click=\"doAcceptPartially\">\n                        <template #left>\n                            <IconContainer icon=\"notification\" class=\"secundary\">\n                                <template #aside>\n                                    <span class=\"icon partially small\" />\n                                </template>\n                            </IconContainer>\n                        </template>\n                        <h3 class=\"style-title-list\">\n                            Voorlopig goedgekeurd\n                        </h3>\n                        <p class=\"style-description-small\">\n                            Als alles wel in orde is, maar er nog iets klein moet worden aangevuld op een later tijdstip.\n                        </p>\n\n                        <template #right>\n                            <span class=\"icon arrow-right-small gray\" />\n                        </template>\n                    </STListItem>\n\n                    <STListItem :selectable=\"true\" element-name=\"button\" @click=\"doReject\">\n                        <template #left>\n                            <IconContainer icon=\"notification\" class=\"error\">\n                                <template #aside>\n                                    <span class=\"icon canceled small\" />\n                                </template>\n                            </IconContainer>\n                        </template>\n\n                        <h3 class=\"style-title-list\">\n                            Afkeuren\n                        </h3>\n                        <p class=\"style-description-small\">\n                            Hierna zijn er terug wijzigingen mogelijk. Laat eventueel een opmerking achter.\n                        </p>\n\n                        <template #right>\n                            <span class=\"icon arrow-right-small gray\" />\n                        </template>\n                    </STListItem>\n                </STList>\n            </div>\n        </main>\n\n        <STToolbar v-if=\"notification.status === EventNotificationStatus.Draft || notification.status === EventNotificationStatus.Rejected || notification.status === EventNotificationStatus.PartiallyAccepted\">\n            <template #right>\n                <LoadingButton :loading=\"isSaving\">\n                    <button class=\"button primary\" :disabled=\"!isComplete\" type=\"button\" @click=\"doSubmit\">\n                        <span v-if=\"notification.status === EventNotificationStatus.Rejected\" class=\"icon retry\" />\n                        <span v-else class=\"icon success\" />\n\n                        <span v-if=\"notification.status === EventNotificationStatus.Rejected\">Opnieuw indienen</span>\n                        <span v-else>Indienen</span>\n                    </button>\n                </LoadingButton>\n            </template>\n        </STToolbar>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { ComponentWithProperties, usePop, usePresent } from '@simonbackx/vue-app-navigation';\nimport { CenteredMessage, ContextMenu, ContextMenuItem, ErrorBox, EventOverview, IconContainer, InputSheet, PatchListText, ProgressIcon, useAppContext, useAuth, ViewRecordCategoryAnswersBox } from '@stamhoofd/components';\nimport { ObjectDiffer } from '@stamhoofd/object-differ';\nimport { AccessRight, Event, EventNotification, EventNotificationStatus, EventNotificationStatusHelper, RecordCategory } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed } from 'vue';\nimport { useErrors } from '../errors/useErrors';\nimport { EventNotificationViewModel } from './event-notifications/classes/EventNotificationViewModel';\nimport EditEventNotificationRecordCategoryView from './event-notifications/EditEventNotificationRecordCategoryView.vue';\nimport OriginalEventNotificationAnswersView from './OriginalEventNotificationAnswersView.vue';\n\nconst props = withDefaults(\n    defineProps<{\n        viewModel: EventNotificationViewModel;\n    }>(), {\n\n    },\n);\n\nconst notification = props.viewModel.useNotification();\nconst errors = useErrors(); ;\nconst type = props.viewModel.useType();\nconst present = usePresent();\nconst auth = useAuth();\nconst app = useAppContext();\nconst pop = usePop();\nconst isReviewer = computed(() => {\n    const p = auth.getPermissionsForOrganization(props.viewModel.eventNotification.organization);\n    return p?.hasAccessRight(AccessRight.OrganizationEventNotificationReviewer) ?? false;\n});\nconst isComplete = computed(() => {\n    return recordCategories.value.every(c => c.isComplete(notification.value));\n});\nconst { save, deleteModel, isSaving } = props.viewModel.useSave();\n\nconst diffList = computed(() => {\n    return ObjectDiffer.diff(notification.value.acceptedRecordAnswers, notification.value.recordAnswers);\n});\n\nconst title = computed(() => {\n    return type.value.title;\n});\n\nconst recordCategories = computed(() => {\n    return RecordCategory.filterCategories(type.value.recordCategories, notification.value);\n});\n\nconst flattenedRecordCategories = computed(() => {\n    return RecordCategory.flattenCategories(type.value.recordCategories, notification.value);\n});\n\nfunction getRootCategory(recordCategory: RecordCategory) {\n    // Find root category\n    // thsi is required because the flattened versions are not usable for editing\n    let rootCategory = recordCategory;\n    outerLoop: for (const root of recordCategories.value) {\n        if (root.id === recordCategory.id) {\n            rootCategory = root;\n            break;\n        }\n\n        // Check children\n        for (const child of root.childCategories) {\n            if (child.id === recordCategory.id) {\n                rootCategory = root;\n                break outerLoop;\n            }\n        }\n    }\n    return rootCategory;\n}\n\nasync function editRecordCategory(recordCategory: RecordCategory) {\n    // Find root category\n    // thsi is required because the flattened versions are not usable for editing\n    const rootCategory = getRootCategory(recordCategory);\n\n    await present({\n        components: [\n            new ComponentWithProperties(EditEventNotificationRecordCategoryView, {\n                viewModel: props.viewModel,\n                category: rootCategory,\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nfunction isEnabled(category: RecordCategory) {\n    const rootCategory = getRootCategory(category);\n\n    // Check all previous categories complete\n    for (const c of recordCategories.value) {\n        if (c === rootCategory) {\n            return true;\n        }\n        if (c.getTotalCompleteRecords(notification.value) !== c.getTotalRecords(notification.value)) {\n            return false;\n        }\n    }\n    return true;\n}\n\nfunction getRecordCategoryProgress(category: RecordCategory) {\n    const total = category.getTotalRecords(notification.value);\n    const completed = category.getTotalCompleteRecords(notification.value);\n    if (total === 0) {\n        return 0;\n    }\n    return (completed / total);\n}\n\nasync function openEvent(event: Event | null) {\n    event = event ?? notification.value.events[0];\n\n    if (!event) {\n        return;\n    }\n\n    await present({\n        components: [\n            new ComponentWithProperties(EventOverview, {\n                event: event,\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function doSubmit() {\n    if (!await CenteredMessage.confirm($t('ec0978f8-95bc-44c9-a906-ceaf6fd55baf'), $t('6b0ddff7-226f-4616-a0da-a280d0ccc2ff'), $t('754f6578-9fee-44f3-931c-dc00a34d7871'), undefined, false)) {\n        return;\n    }\n    try {\n        await save(EventNotification.patch({\n            status: EventNotificationStatus.Pending,\n        }));\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n}\nasync function doAcceptPartially() {\n    await present({\n        components: [\n            new ComponentWithProperties(InputSheet, {\n                title: $t('Voorlopig goedkeuren'),\n                description: $t('Je kan hieronder nog opmerkingen achterlaten over wat er nog moet worden aangevuld en tegen wanneer.'),\n                saveText: $t('Voorlopig goedkeuren'),\n                placeholder: $t('Opmerkingen'),\n                defaultValue: notification.value.feedbackText ?? '',\n                multiline: true,\n                saveHandler: async (value: string) => {\n                    if (!value) {\n                        throw new SimpleError({\n                            code: 'invalid_field',\n                            message: $t('63e45277-76d4-4971-909b-1c86326b609f'),\n                        });\n                    }\n                    await save(EventNotification.patch({\n                        status: EventNotificationStatus.PartiallyAccepted,\n                        feedbackText: value ? value : null,\n                    }));\n                },\n            }),\n        ],\n        modalDisplayStyle: 'sheet',\n    });\n}\n\nasync function doAccept() {\n    if (!await CenteredMessage.confirm($t('f48e7518-0f1d-4610-a967-82d146a47f5b'), $t('eacd1cfa-a04b-485b-bd8d-41c1518e5306'), $t('754f6578-9fee-44f3-931c-dc00a34d7871'), undefined, false)) {\n        return;\n    }\n    try {\n        await save(EventNotification.patch({\n            status: EventNotificationStatus.Accepted,\n        }));\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n}\n\nasync function doReject() {\n    await present({\n        components: [\n            new ComponentWithProperties(InputSheet, {\n                title: $t('f1bebbb8-20dc-4e6c-886d-68f080f71a1e'),\n                description: $t('2d9128d3-a428-4ba6-9b12-6c2f00ca7c31'),\n                saveText: $t('fe9c9ec1-dd24-4fc6-9622-7b5aef4e9208'),\n                placeholder: $t('f1bebbb8-20dc-4e6c-886d-68f080f71a1e'),\n                defaultValue: notification.value.feedbackText ?? '',\n                multiline: true,\n                saveHandler: async (value: string) => {\n                    if (!value) {\n                        throw new SimpleError({\n                            code: 'invalid_field',\n                            message: $t('63e45277-76d4-4971-909b-1c86326b609f'),\n                        });\n                    }\n                    await save(EventNotification.patch({\n                        status: EventNotificationStatus.Rejected,\n                        feedbackText: value ? value : null,\n                    }));\n                },\n            }),\n        ],\n        modalDisplayStyle: 'sheet',\n    });\n}\n\nasync function editFeedbackText() {\n    await present({\n        components: [\n            new ComponentWithProperties(InputSheet, {\n                title: $t('938b1f40-9563-4a26-8d87-05774839b5a7'),\n                description: $t('2d9128d3-a428-4ba6-9b12-6c2f00ca7c31'),\n                saveText: $t('cb13500b-5d71-46df-846c-03f27b898dd7'),\n                placeholder: $t('e4017a21-58c1-4cea-824c-8cef6a7ab019'),\n                defaultValue: notification.value.feedbackText ?? '',\n                multiline: true,\n                saveHandler: async (value: string) => {\n                    await save(EventNotification.patch({\n                        feedbackText: value ? value : null,\n                    }));\n                },\n            }),\n        ],\n        modalDisplayStyle: 'sheet',\n    });\n}\n\nasync function showOriginalAnswers() {\n    await present({\n        components: [\n            new ComponentWithProperties(OriginalEventNotificationAnswersView, {\n                viewModel: props.viewModel,\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function doDelete() {\n    if (!await CenteredMessage.confirm('Ben je zeker dat je deze melding wilt verwijderen?', 'Ja, verwijderen', 'Je kan dit niet ongedaan maken')) {\n        return;\n    }\n    try {\n        await deleteModel();\n        await pop({ force: true });\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n}\n\nasync function doDraft() {\n    if (!await CenteredMessage.confirm('Ben je zeker dat je deze melding terug naar klad wilt verplaatsen?', 'Ja, naar klad')) {\n        return;\n    }\n    try {\n        await save(EventNotification.patch({\n            status: EventNotificationStatus.Draft,\n        }));\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n}\n\nasync function showContextMenu(event: MouseEvent) {\n    const menu = new ContextMenu([\n        [\n            new ContextMenuItem({\n                name: 'Wijzig status',\n                childMenu: new ContextMenu([\n                    [\n                        new ContextMenuItem({\n                            name: Formatter.capitalizeFirstLetter(EventNotificationStatusHelper.getName(EventNotificationStatus.Draft)),\n                            action: async () => {\n                                await doDraft();\n                            },\n                        }),\n                        new ContextMenuItem({\n                            name: Formatter.capitalizeFirstLetter(EventNotificationStatusHelper.getName(EventNotificationStatus.Pending)),\n                            icon: 'clock',\n                            action: async () => {\n                                await doSubmit();\n                            },\n                        }),\n                        new ContextMenuItem({\n                            name: Formatter.capitalizeFirstLetter(EventNotificationStatusHelper.getName(EventNotificationStatus.Rejected)),\n                            icon: 'canceled',\n                            action: async () => {\n                                await doReject();\n                            },\n                        }),\n                        new ContextMenuItem({\n                            name: Formatter.capitalizeFirstLetter(EventNotificationStatusHelper.getName(EventNotificationStatus.PartiallyAccepted)),\n                            icon: 'partially',\n                            action: async () => {\n                                await doAcceptPartially();\n                            },\n                        }),\n                        new ContextMenuItem({\n                            name: Formatter.capitalizeFirstLetter(EventNotificationStatusHelper.getName(EventNotificationStatus.Accepted)),\n                            icon: 'success',\n                            action: async () => {\n                                await doAccept();\n                            },\n                        }),\n                    ],\n                ]),\n            }),\n            new ContextMenuItem({\n                name: 'Verwijderen',\n                icon: 'trash',\n                action: async () => {\n                    await doDelete();\n                },\n            }),\n        ],\n    ]);\n\n    await menu.show({ button: event.target as HTMLElement });\n}\n\n</script>\n","import { useRequestOwner } from '@stamhoofd/networking';\nimport { Event, EventNotification, LimitedFilteredRequest } from '@stamhoofd/structures';\nimport { ref, Ref } from 'vue';\nimport { ErrorBox } from '../../errors/ErrorBox';\nimport { useErrors } from '../../errors/useErrors';\nimport { useEventNotificationsObjectFetcher } from '../../fetchers';\n\nexport function useEventNotification(data: { event: Event; typeId: string }) {\n    // Find event notifiation for this event and type\n    const eventNotificationFetcher = useEventNotificationsObjectFetcher();\n    useRequestOwner(eventNotificationFetcher);\n\n    if (!data.event.organizationId) {\n        return {\n            notification: ref(null) as Ref<EventNotification | null>,\n            promise: Promise.resolve(null),\n            loading: ref(false),\n            errors: useErrors(),\n        };\n    }\n\n    // Load\n    const request = new LimitedFilteredRequest({\n        filter: {\n            events: {\n                $elemMatch: {\n                    id: data.event.id,\n                },\n            },\n            typeId: data.typeId,\n        },\n        limit: 1,\n    });\n    const promise = eventNotificationFetcher.fetch(request, { shouldRetry: true });\n    const notification = ref(null) as Ref<EventNotification | null>;\n    const loading = ref(true);\n    const errors = useErrors();\n\n    promise.then((notifications) => {\n        if (notifications.results.length >= 1) {\n            notification.value = notifications.results[0];\n        }\n        loading.value = false;\n    }).catch((e: Error) => {\n        errors.errorBox = new ErrorBox(e);\n        loading.value = false;\n    });\n\n    return {\n        notification,\n        promise: promise.then(() => notification.value),\n        loading,\n        errors,\n    };\n}\n","import { ArrayDecoder, AutoEncoderPatchType, Decoder, PatchableArray } from '@simonbackx/simple-encoding';\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { useRequestOwner } from '@stamhoofd/networking';\nimport { BaseOrganization, Event, EventNotification, EventNotificationType, Platform } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { useContext, usePatch } from '../../../hooks';\n\nexport class EventNotificationViewModel {\n    isNew: boolean;\n    eventNotification: EventNotification;\n\n    /**\n     * Dependency is required to easily calculate the current type information of the event notification.\n     */\n    platform: Platform;\n\n    /**\n     * Callback handler when the event notification is saved.\n     */\n    saveHandler?: (viewModel: EventNotificationViewModel) => Promise<void>;\n\n    /**\n     * Internal state (not using # because this doesn't work in Vue as these are not exposed in proxies)\n     */\n    isSaving = false;\n\n    constructor({ isNew, eventNotification, saveHandler, platform }: { isNew: boolean; eventNotification: EventNotification; saveHandler?: typeof EventNotificationViewModel.prototype.saveHandler; platform: Platform }) {\n        this.isNew = isNew;\n        this.eventNotification = eventNotification;\n        this.saveHandler = saveHandler;\n        this.platform = platform;\n    }\n\n    static createNew({ events, typeId, saveHandler, platform, organization }: { organization: BaseOrganization; events: Event[]; typeId: string; saveHandler?: typeof EventNotificationViewModel.prototype.saveHandler; platform: Platform }) {\n        return new EventNotificationViewModel({\n            isNew: true,\n            eventNotification: EventNotification.create({\n                events,\n                typeId,\n                organization: BaseOrganization.create(organization),\n            }),\n            saveHandler,\n            platform,\n        });\n    }\n\n    static edit({ eventNotification, saveHandler, platform }: { eventNotification: EventNotification; saveHandler?: typeof EventNotificationViewModel.prototype.saveHandler; platform: Platform }) {\n        return new EventNotificationViewModel({\n            isNew: false,\n            eventNotification,\n            saveHandler,\n            platform,\n        });\n    }\n\n    useNotification() {\n        return computed(() => this.eventNotification);\n    }\n\n    useOriginalNotification() {\n        return computed(() => this.eventNotification.patch({\n            recordAnswers: this.eventNotification.acceptedRecordAnswers,\n        }));\n    }\n\n    get type() {\n        return this.platform.config.eventNotificationTypes.find(t => t.id === this.eventNotification.typeId) ?? EventNotificationType.create({ title: 'Onbekend' });\n    }\n\n    useType() {\n        return computed(() => this.type);\n    }\n\n    usePatch() {\n        const notification = this.useNotification();\n        return usePatch(notification);\n    }\n\n    /**\n     * This is a hook so we can access request owner, context etc to make the save request.\n     */\n    useSave() {\n        const context = useContext();\n        const owner = useRequestOwner();\n\n        return {\n            save: async (patch: AutoEncoderPatchType<EventNotification>) => {\n                if (this.isSaving) {\n                    throw new SimpleError({\n                        code: 'saving',\n                        message: 'Al bezig met opslaan... Even geduld.',\n                    });\n                }\n                this.isSaving = true;\n\n                try {\n                    const arr = new PatchableArray();\n                    if (this.isNew) {\n                        arr.addPut(this.eventNotification.patch(patch));\n                    }\n                    else {\n                        patch.id = this.eventNotification.id;\n                        arr.addPatch(patch);\n                    }\n\n                    const server = context.value.getAuthenticatedServerForOrganization(this.eventNotification.organization.id);\n\n                    const response = await server.request({\n                        method: 'PATCH',\n                        path: '/event-notifications',\n                        body: arr,\n                        decoder: new ArrayDecoder(EventNotification as Decoder<EventNotification>),\n                        owner,\n                        shouldRetry: false,\n                    });\n\n                    if (response.data.length === 0) {\n                        throw new SimpleError({\n                            code: 'not_found',\n                            message: 'Event notification not found',\n                        });\n                    }\n\n                    const put = response.data[0];\n\n                    this.eventNotification.deepSet(put);\n                    this.isNew = false;\n\n                    if (this.saveHandler) {\n                        await this.saveHandler(this);\n                    }\n                    return Promise.resolve();\n                }\n                finally {\n                    this.isSaving = false;\n                }\n            },\n            deleteModel: async () => {\n                if (this.isSaving) {\n                    throw new SimpleError({\n                        code: 'saving',\n                        message: 'Al bezig met opslaan... Even geduld.',\n                    });\n                }\n                this.isSaving = true;\n\n                try {\n                    const arr = new PatchableArray();\n                    if (this.isNew) {\n                        return;\n                    }\n                    arr.addDelete(this.eventNotification.id);\n\n                    const server = context.value.getAuthenticatedServerForOrganization(this.eventNotification.organization.id);\n\n                    await server.request({\n                        method: 'PATCH',\n                        path: '/event-notifications',\n                        body: arr,\n                        decoder: new ArrayDecoder(EventNotification as Decoder<EventNotification>),\n                        owner,\n                        shouldRetry: false,\n                    });\n\n                    this.isNew = true;\n                    return Promise.resolve();\n                }\n                finally {\n                    this.isSaving = false;\n                }\n            },\n            isSaving: computed(() => this.isSaving),\n        };\n    }\n}\n","<template>\n    <SaveView :title=\"viewModel.type.title\" :prefer-large-button=\"true\" :loading=\"saving\" :save-text=\"viewModel.isNew ? 'Beginnen' : 'Opslaan'\" save-icon-right=\"arrow-right\" @save=\"save\">\n        <h1>\n            {{ viewModel.type.title }}\n        </h1>\n        <p class=\"pre-wrap style-description-block\" v-text=\"viewModel.type.description\" />\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <!-- todo: hier komt eigenlijk een soort van bevestigingsscherm voor niewue kampmeldingen.\n        Hier kan je ook algemen instellingen wijzigen als die er nog komen\n        In de toekomst kan je hier meerdere activiteiten koppelen aan dezelfde kampmelding -->\n    </SaveView>\n</template>\n\n<script setup lang=\"ts\">\nimport { usePop } from '@simonbackx/vue-app-navigation';\nimport { CenteredMessage, ErrorBox, NavigationActions, useErrors, useNavigationActions } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { computed, ref } from 'vue';\nimport { EventNotificationViewModel } from './classes/EventNotificationViewModel';\n\nconst props = withDefaults(\n    defineProps<{\n        viewModel: EventNotificationViewModel;\n        saveHandler?: ((navigate: NavigationActions) => Promise<void> | void) | null;\n    }>(), {\n        saveHandler: null,\n    },\n);\n\nconst errors = useErrors();\nconst { hasChanges, patched, addPatch, patch } = props.viewModel.usePatch();\nconst saving = ref(false);\nconst $t = useTranslate();\nconst pop = usePop();\nconst { save: saveModel } = props.viewModel.useSave();\nconst navigationActions = useNavigationActions();\n\nasync function save() {\n    if (saving.value) {\n        return;\n    }\n\n    errors.errorBox = null;\n\n    saving.value = true;\n\n    if (!await errors.validator.validate()) {\n        saving.value = false;\n        return;\n    }\n\n    try {\n        await saveModel(patch.value);\n        if (props.saveHandler) {\n            await props.saveHandler(navigationActions);\n        }\n        else {\n            await pop({ force: true });\n        }\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n\n    saving.value = false;\n}\n\nconst shouldNavigateAway = async () => {\n    if (!hasChanges.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm($t('996a4109-5524-4679-8d17-6968282a2a75'), $t('106b3169-6336-48b8-8544-4512d42c4fd6'));\n};\n\ndefineExpose({\n    shouldNavigateAway,\n});\n\n</script>\n","import { ComponentWithProperties } from '@simonbackx/vue-app-navigation';\nimport { ViewStep, ViewStepsManager } from '../../../members/classes/ViewStepsManager';\nimport { EventNotificationViewModel } from '../classes/EventNotificationViewModel';\nimport EditEventNotificationGeneralView from '../EditEventNotificationGeneralView.vue';\nimport { NavigationActions } from '../../../types/NavigationActions';\n\nexport class GeneralStep implements ViewStep {\n    viewModel: EventNotificationViewModel;\n\n    constructor(viewModel: EventNotificationViewModel) {\n        this.viewModel = viewModel;\n    }\n\n    getComponent(manager: ViewStepsManager): Promise<ComponentWithProperties> | ComponentWithProperties {\n        return new ComponentWithProperties(EditEventNotificationGeneralView, {\n            viewModel: this.viewModel,\n            saveHandler: async (navigate: NavigationActions) => {\n                await manager.saveHandler(this, navigate);\n            },\n        });\n    }\n\n    isEnabled(manager: ViewStepsManager): boolean {\n        // For now only enabled for new ones\n        return this.viewModel.isNew;\n    }\n}\n","import { ComponentWithProperties } from '@simonbackx/vue-app-navigation';\nimport { RecordCategory } from '@stamhoofd/structures';\nimport { ViewStep, ViewStepsManager } from '../../../members/classes/ViewStepsManager';\nimport { EventNotificationViewModel } from '../classes/EventNotificationViewModel';\nimport EditEventNotificationRecordCategoryView from '../EditEventNotificationRecordCategoryView.vue';\nimport { NavigationActions } from '../../../types/NavigationActions';\n\nexport class RecordCategoryStep implements ViewStep {\n    viewModel: EventNotificationViewModel;\n    recordCategory: RecordCategory;\n\n    constructor(viewModel: EventNotificationViewModel, recordCategory: RecordCategory) {\n        this.viewModel = viewModel;\n        this.recordCategory = recordCategory;\n    }\n\n    getComponent(manager: ViewStepsManager): Promise<ComponentWithProperties> | ComponentWithProperties {\n        return new ComponentWithProperties(EditEventNotificationRecordCategoryView, {\n            viewModel: this.viewModel,\n            category: this.recordCategory,\n            saveHandler: async (navigate: NavigationActions) => {\n                await manager.saveHandler(this, navigate);\n            },\n            skipHandler: async (navigate: NavigationActions) => {\n                await manager.saveHandler(this, navigate, true);\n            },\n        });\n    }\n\n    isEnabled(manager: ViewStepsManager): boolean {\n        // check if everything has been answered already + check out of date\n        return this.recordCategory.isEnabled(this.viewModel.eventNotification);\n    }\n}\n","import { ViewStep } from '../../members/classes/ViewStepsManager';\nimport { EventNotificationViewModel } from './classes/EventNotificationViewModel';\nimport { GeneralStep } from './steps/GeneralStep';\nimport { RecordCategoryStep } from './steps/RecordCategoryStep';\n\nexport function getEventNotificationSteps(viewModel: EventNotificationViewModel): ViewStep[] {\n    return [\n        new GeneralStep(viewModel),\n        ...viewModel.type.recordCategories.map(category => new RecordCategoryStep(viewModel, category)),\n    ];\n}\n","<template>\n    <STListItem :selectable=\"true\" class=\"left-center right-stack\" @click=\"navigate(Routes.View)\">\n        <template #left>\n            <img src=\"@stamhoofd/assets/images/illustrations/tent.svg\">\n        </template>\n        <h2 class=\"style-title-list\">\n            {{ type.title }}\n        </h2>\n        <p class=\"style-description style-limit-lines pre-wrap\">\n            {{ type.description }}\n        </p>\n        <template #right>\n            <span v-if=\"notification\" class=\"hide-smartphone\">{{ capitalizeFirstLetter(EventNotificationStatusHelper.getName(notification.status)) }}</span>\n            <span v-else-if=\"loading\" class=\"style-placeholder-skeleton\" />\n            <span v-else-if=\"errors.errorBox\" class=\"icon error\" />\n\n            <span v-if=\"notification && notification.status === EventNotificationStatus.Pending\" class=\"icon clock gray\" />\n            <span v-if=\"notification && notification.status === EventNotificationStatus.Rejected\" class=\"icon error\" />\n            <span v-if=\"notification && notification.status === EventNotificationStatus.Accepted\" class=\"icon success green\" />\n            <span v-if=\"notification && notification.status === EventNotificationStatus.PartiallyAccepted\" class=\"icon partially green\" />\n            <span class=\"icon arrow-right-small gray\" />\n        </template>\n    </STListItem>\n</template>\n\n<script setup lang=\"ts\">\nimport { ComponentWithProperties, defineRoutes, useNavigate, usePresent } from '@simonbackx/vue-app-navigation';\nimport { Event, EventNotificationStatus, EventNotificationStatusHelper, EventNotificationType, Organization } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { usePlatform } from '../../hooks';\nimport { ViewStepsManager } from '../../members/classes/ViewStepsManager';\nimport { Toast } from '../../overlays/Toast';\nimport { useNavigationActions } from '../../types/NavigationActions';\nimport EventNotificationView from '../EventNotificationView.vue';\nimport { useEventNotification } from '../composables/useEventNotification';\nimport { EventNotificationViewModel } from '../event-notifications/classes/EventNotificationViewModel';\nimport { getEventNotificationSteps } from '../event-notifications/getEventNotificationSteps';\n\nconst props = defineProps<{\n    event: Event;\n    type: EventNotificationType;\n    organization: Organization;\n}>();\n\nconst { promise: loadNotificationPromise, notification, loading, errors } = useEventNotification({\n    event: props.event,\n    typeId: props.type.id,\n});\nconst navigate = useNavigate();\nconst present = usePresent();\nconst platform = usePlatform();\nconst navigationActions = useNavigationActions();\n\nenum Routes {\n    View = 'View',\n}\n\ndefineRoutes([\n    {\n        name: Routes.View,\n        url: Formatter.slug(props.type.title),\n        present: 'popup',\n        handler: async (options) => {\n            if (!options.componentProperties.viewModel || !(options.componentProperties.viewModel instanceof EventNotificationViewModel)) {\n                return;\n            }\n\n            const viewModel = options.componentProperties.viewModel;\n            if (viewModel.isNew) {\n                // Start flow\n                const steps = getEventNotificationSteps(viewModel);\n                const manager = new ViewStepsManager(steps, async ({ show }) => {\n                    await show({\n                        components: [\n                            new ComponentWithProperties(EventNotificationView, options.componentProperties),\n                        ],\n                        replace: 1000,\n                        force: true,\n                    });\n                }, {\n                    action: 'present',\n                    modalDisplayStyle: 'popup',\n                    checkRoutes: options.checkRoutes,\n                    url: options.url,\n                    adjustHistory: options.adjustHistory,\n                    animated: options.animated,\n                });\n                await manager.start(navigationActions);\n            }\n            else {\n                // Go to the general view\n                await present({\n                    components: [\n                        new ComponentWithProperties(EventNotificationView, options.componentProperties),\n                    ],\n                    checkRoutes: options.checkRoutes,\n                    url: options.url,\n                    adjustHistory: options.adjustHistory,\n                    animated: options.animated,\n                    modalDisplayStyle: 'popup',\n                });\n            }\n        },\n        paramsToProps: async () => {\n            try {\n                await loadNotificationPromise;\n            }\n            catch (e) {\n                Toast.fromError(e).show();\n                throw e;\n            }\n\n            if (!notification.value) {\n                // Create a new one\n                return {\n                    viewModel: EventNotificationViewModel.createNew({\n                        typeId: props.type.id,\n                        events: [props.event],\n                        saveHandler: async (viewModel: EventNotificationViewModel) => {\n                            // Make sure we edit this newly created one the next time\n                            notification.value = viewModel.eventNotification;\n                        },\n                        platform: platform.value,\n                        organization: props.organization,\n                    }),\n                };\n            }\n\n            // Create a new one\n            return {\n                viewModel: EventNotificationViewModel.edit({\n                    eventNotification: notification.value,\n                    saveHandler: async (viewModel: EventNotificationViewModel) => {\n                        // Make sure we edit this newly created one the next time\n                        notification.value = viewModel.eventNotification;\n                    },\n                    platform: platform.value,\n                }),\n            };\n        },\n    },\n\n]);\n\n</script>\n","<template>\n    <ExternalOrganizationContainer :organization-id=\"event.organizationId\" @update=\"setOrganization\">\n        <ExternalOrganizationContainer :organization-id=\"event.group?.organizationId ?? null\" :organization-hint=\"eventOrganization\" @update=\"setGroupOrganization\">\n            <div class=\"st-view event-overview\">\n                <STNavigationBar :title=\"title\" />\n\n                <main class=\"center\">\n                    <ImageComponent v-if=\"event.meta.coverPhoto\" :image=\"event.meta.coverPhoto\" :auto-height=\"true\" class=\"style-cover-photo\" />\n\n                    <p class=\"style-title-prefix\">\n                        {{ levelPrefix }}\n                    </p>\n                    <h1 class=\"style-navigation-title\">\n                        {{ title }}\n                    </h1>\n\n                    <template v-if=\"event.meta.description.html\">\n                        <div class=\"description style-wysiwyg gray large\" v-html=\"event.meta.description.html\" />\n                    </template>\n\n                    <EventInfoTable :event=\"event\">\n                        <template v-if=\"event.group && (!organization || event.group.organizationId === organization.id || event.group.settings.allowRegistrationsByOrganization)\">\n                            <STListItem :selectable=\"true\" class=\"left-center right-stack\" @click=\"$navigate(Routes.Registrations)\">\n                                <template #left>\n                                    <span class=\"icon group\" />\n                                </template>\n\n                                <h2 class=\"style-title-list\">\n                                    Ingeschreven leden\n                                </h2>\n                                <p class=\"style-description\">\n                                    Bekijk, beheer, exporteer of e-mail ingeschreven leden.\n                                </p>\n                                <template #right>\n                                    <span v-if=\"event.group.getMemberCount() !== null\" class=\"style-description-small\">{{ formatInteger(event.group.getMemberCount()!) }}</span>\n                                    <span class=\"icon arrow-right-small gray\" />\n                                </template>\n                            </STListItem>\n\n                            <STListItem v-if=\"event.group.waitingList && (!organization || event.group.organizationId === organization.id || event.group.waitingList.settings.allowRegistrationsByOrganization)\" :selectable=\"true\" class=\"left-center right-stack\" @click=\"$navigate(Routes.WaitingList)\">\n                                <template #left>\n                                    <span class=\"icon clock\" />\n                                </template>\n\n                                <h2 class=\"style-title-list\">\n                                    {{ event.group.waitingList.settings.name }}\n                                </h2>\n                                <p class=\"style-description\">\n                                    Bekijk leden op de wachtlijst\n                                </p>\n                                <template #right>\n                                    <span v-if=\"event.group.waitingList.getMemberCount() !== null\" class=\"style-description-small\">{{ formatInteger(event.group.waitingList.getMemberCount()!) }}</span>\n                                    <span class=\"icon arrow-right-small gray\" />\n                                </template>\n                            </STListItem>\n                        </template>\n                    </EventInfoTable>\n\n                    <div v-if=\"canWriteEvent\" class=\"container\">\n                        <hr>\n                        <h2>\n                            Instellingen\n                        </h2>\n\n                        <STList class=\"illustration-list\">\n                            <STListItem :selectable=\"true\" class=\"left-center\" @click=\"$navigate(Routes.Edit)\">\n                                <template #left>\n                                    <img src=\"@stamhoofd/assets/images/illustrations/flag.svg\">\n                                </template>\n                                <h2 class=\"style-title-list\">\n                                    Algemeen\n                                </h2>\n                                <p class=\"style-description\">\n                                    Wijzig de naam, beschrijving, datum en beschikbaarheid.\n                                </p>\n                                <template #right>\n                                    <span class=\"icon arrow-right-small gray\" />\n                                </template>\n                            </STListItem>\n\n                            <STListItem v-if=\"event.group\" :selectable=\"true\" class=\"left-center\" @click=\"$navigate(Routes.EditGroup)\">\n                                <template #left>\n                                    <img src=\"@stamhoofd/assets/images/illustrations/list.svg\">\n                                </template>\n                                <h2 class=\"style-title-list\">\n                                    Inschrijvingsinstellingen\n                                </h2>\n                                <p class=\"style-description\">\n                                    Wijzig hoe leden kunnen inschrijven, de tarieven en de verzamelde gegevens.\n                                </p>\n                                <template #right>\n                                    <span class=\"icon arrow-right-small gray\" />\n                                </template>\n                            </STListItem>\n\n                            <STListItem v-if=\"event.group\" :selectable=\"true\" class=\"left-center\" @click=\"$navigate(Routes.EditEmails)\">\n                                <template #left>\n                                    <img src=\"@stamhoofd/assets/images/illustrations/email-template.svg\">\n                                </template>\n                                <h2 class=\"style-title-list\">\n                                    E-mailsjablonen\n                                </h2>\n                                <p class=\"style-description\">\n                                    Wijzig de inhoud van automatische e-mails naar leden die zijn of worden ingeschreven voor deze activiteit.\n                                </p>\n                                <template #right>\n                                    <span class=\"icon arrow-right-small gray\" />\n                                </template>\n                            </STListItem>\n\n                            <template v-if=\"eventOrganization\">\n                                <EventNotificationRow v-for=\"type of event.eventNotificationTypes\" :key=\"type.id\" class=\"container\" :type=\"type\" :event=\"event\" :organization=\"eventOrganization\" />\n                            </template>\n                        </STList>\n                    </div>\n                    <hr>\n                    <h2>Link kopiëren</h2>\n                    <p>{{ $t(\"40b31f32-5a02-488d-beb3-d987ea5c9315\") }}</p>\n\n                    <div class=\"input-with-buttons\">\n                        <div>\n                            <input class=\"input\" :value=\"link\" readonly>\n                        </div>\n                        <div>\n                            <button v-copyable=\"link\" type=\"button\" class=\"button text\">\n                                <span class=\"icon copy\" />\n                                <span class=\"hide-small\">Kopiëren</span>\n                            </button>\n                        </div>\n                    </div>\n\n                    <template v-if=\"event.group && auth.canRegisterMembersInGroup(event.group)\">\n                        <hr>\n                        <h2>Handmatig leden inschrijven</h2>\n\n                        <p v-if=\"organization && event.organizationId === organization.id\">\n                            {{ $t('3f4666f9-59b5-4a24-b1a7-9f820275c042') }}\n                        </p>\n                        <p v-else-if=\"!event.group.settings.isFree\">\n                            {{ $t('3ab07939-121b-47f9-956f-a573c57ec008') }}\n                        </p>\n                        <p v-else>\n                            {{ $t('7cac9136-10b5-4f1c-b9a4-0fb3f8410a9b') }}\n                        </p>\n\n                        <p class=\"style-button-bar\">\n                            <button class=\"button primary\" type=\"button\" @click=\"addMembers\">\n                                <span class=\"icon add\" />\n                                <span>Leden inschrijven</span>\n                            </button>\n                        </p>\n                    </template>\n                </main>\n            </div>\n        </ExternalOrganizationContainer>\n    </ExternalOrganizationContainer>\n</template>\n\n<script setup lang=\"ts\">\nimport { ArrayDecoder, AutoEncoderPatchType, Decoder, deepSetArray, PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { defineRoutes, useNavigate, usePop } from '@simonbackx/vue-app-navigation';\nimport { EmailTemplateType, Event, Group, Organization } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { ComponentOptions, computed, Ref, ref } from 'vue';\nimport ExternalOrganizationContainer from '../containers/ExternalOrganizationContainer.vue';\nimport { appToUri } from '../context';\nimport { EditEmailTemplatesView } from '../email';\nimport EditGroupView from '../groups/EditGroupView.vue';\nimport { useAuth, useContext, useGlobalEventListener, useOrganization, usePlatform } from '../hooks';\nimport { MembersTableView, useChooseOrganizationMembersForGroup } from '../members';\nimport { Toast } from '../overlays/Toast';\nimport ImageComponent from '../views/ImageComponent.vue';\nimport EditEventView from './EditEventView.vue';\nimport EventInfoTable from './components/EventInfoTable.vue';\nimport EventNotificationRow from './components/EventNotificationRow.vue';\n\nconst props = defineProps<{\n    event: Event;\n}>();\n\nconst title = computed(() => props.event.name);\nconst $navigate = useNavigate();\nconst organization = useOrganization();\nconst context = useContext();\nconst platform = usePlatform();\nconst pop = usePop();\nconst auth = useAuth();\n\nconst eventOrganization: Ref<Organization | null> = ref(null);\n\nfunction setOrganization(o: Organization) {\n    eventOrganization.value = o;\n}\n\nconst groupOrganization: Ref<Organization | null> = ref(null);\n\nfunction setGroupOrganization(o: Organization) {\n    groupOrganization.value = o;\n}\n\nconst canWriteEvent = computed(() => auth.canWriteEventForOrganization(props.event, eventOrganization.value));\n\nconst levelPrefix = computed(() => {\n    const prefixes: string[] = [];\n\n    if (props.event.organizationId === null) {\n        if (props.event.meta.organizationTagIds !== null) {\n            const tagNames = platform.value?.config.tags.filter(t => props.event.meta.organizationTagIds?.includes(t.id)).map(t => t.name);\n            prefixes.push(...tagNames);\n        }\n        else {\n            prefixes.push('Nationaal');\n        }\n    }\n    else {\n        if (eventOrganization.value?.id === organization.value?.id) {\n            // skip\n        }\n        else {\n            // Name of the organization\n            prefixes.push(eventOrganization.value?.name ?? props.event.organizationId);\n        }\n    }\n\n    const base = Formatter.joinLast(prefixes, ', ', ' en ');\n\n    if (groupOrganization.value && props.event.organizationId === null) {\n        return `${base} (via ${groupOrganization.value.name})`;\n    }\n\n    return base;\n});\n\nconst link = computed(() => {\n    return `https://${STAMHOOFD.domains.dashboard}/${appToUri('registration')}/activiteiten/${props.event.startDate.getFullYear()}/${Formatter.slug(props.event.name)}/${props.event.id}`;\n});\n\nenum Routes {\n    Registrations = 'inschrijvingen',\n    WaitingList = 'wachtlijst',\n    Edit = 'instellingen',\n    EditGroup = 'inschrijvingsinstellingen',\n    EditEmails = 'emails',\n}\n\ndefineRoutes([\n    {\n        url: Routes.Registrations,\n        component: MembersTableView as ComponentOptions,\n        paramsToProps: () => {\n            if (!props.event.group) {\n                throw new Error('No group found');\n            }\n            return {\n                group: props.event.group,\n            };\n        },\n    },\n    {\n        url: Routes.WaitingList,\n        component: MembersTableView as ComponentOptions,\n        paramsToProps: () => {\n            if (!props.event.group || !props.event.group.waitingList) {\n                throw new Error('No waiting list found');\n            }\n            return {\n                group: props.event.group.waitingList,\n            };\n        },\n    },\n    {\n        url: Routes.Edit,\n        component: EditEventView as ComponentOptions,\n        present: 'popup',\n        paramsToProps: () => {\n            return {\n                event: props.event,\n                isNew: false,\n            };\n        },\n    },\n    {\n        url: Routes.EditGroup,\n        component: EditGroupView as ComponentOptions,\n        present: 'popup',\n        paramsToProps: () => {\n            if (!props.event.group) {\n                throw new Error('Missing group');\n            }\n\n            return {\n                group: props.event.group,\n                isMultiOrganization: !props.event.organizationId,\n                organizationHint: eventOrganization.value ?? groupOrganization.value,\n                isNew: false,\n                showToasts: true,\n                saveHandler: async (patch: AutoEncoderPatchType<Group>) => {\n                    const arr = new PatchableArray() as PatchableArrayAutoEncoder<Event>;\n\n                    arr.addPatch(Event.patch({\n                        id: props.event.id,\n                        group: patch,\n                    }));\n\n                    const response = await context.value.authenticatedServer.request({\n                        method: 'PATCH',\n                        path: '/events',\n                        body: arr,\n                        decoder: new ArrayDecoder(Event as Decoder<Event>),\n                    });\n\n                    // Make sure original event is patched\n                    deepSetArray([props.event], response.data);\n                },\n                deleteHandler: async () => {\n                    const arr = new PatchableArray() as PatchableArrayAutoEncoder<Event>;\n\n                    arr.addPatch(Event.patch({\n                        id: props.event.id,\n                        group: null,\n                    }));\n\n                    const response = await context.value.authenticatedServer.request({\n                        method: 'PATCH',\n                        path: '/events',\n                        body: arr,\n                        decoder: new ArrayDecoder(Event as Decoder<Event>),\n                    });\n\n                    // Make sure original event is patched\n                    deepSetArray([props.event], response.data);\n                },\n            };\n        },\n    },\n    {\n        url: Routes.EditEmails,\n        component: EditEmailTemplatesView as ComponentOptions,\n        present: 'popup',\n        paramsToProps: () => {\n            if (!props.event.group) {\n                throw new Error('Missing group');\n            }\n\n            return {\n                groups: props.event.group.waitingList ? [props.event.group, props.event.group.waitingList] : [props.event.group],\n                allowEditGenerated: false,\n                types: [\n                    EmailTemplateType.RegistrationConfirmation,\n                ],\n            };\n        },\n    },\n]);\nconst chooseOrganizationMembersForGroup = useChooseOrganizationMembersForGroup();\n\nasync function addMembers() {\n    if (!props.event.group) {\n        return;\n    }\n\n    if (!organization.value) {\n        Toast.warning('Ga naar het beheerdersportaal van een groep om leden uit die groep toe te voegen. Dit kan niet via het administratieportaal.').show();\n        return;\n    }\n\n    await chooseOrganizationMembersForGroup({\n        members: [],\n        group: props.event.group,\n    });\n}\n\nuseGlobalEventListener('event-deleted', async (event: Event) => {\n    if (event.id === props.event.id) {\n        await pop({ force: true });\n    }\n});\n</script>\n\n<style lang=\"scss\">\n.event-overview {\n    .description {\n        margin-bottom: 20px;\n    }\n}\n</style>\n","<template>\n    <div id=\"settings-view\" class=\"st-view background\">\n        <STNavigationBar title=\"Activiteiten\">\n            <template #right>\n                <button v-if=\"canWriteSomeEvent\" type=\"button\" class=\"button text navigation\" @click=\"addEvent()\">\n                    <span class=\"icon add\" />\n                    <span>Nieuw</span>\n                </button>\n            </template>\n        </STNavigationBar>\n\n        <main class=\"center\">\n            <h1>\n                Activiteiten\n            </h1>\n\n            <div class=\"input-with-buttons\">\n                <div>\n                    <form class=\"input-icon-container icon search gray\" @submit.prevent=\"blurFocus\">\n                        <input v-model=\"searchQuery\" class=\"input\" name=\"search\" placeholder=\"Zoeken\" type=\"search\" inputmode=\"search\" enterkeyhint=\"search\" autocorrect=\"off\" autocomplete=\"off\" :spellcheck=\"false\" autocapitalize=\"off\">\n                    </form>\n                </div>\n                <div>\n                    <button type=\"button\" class=\"button text\" @click=\"editFilter\">\n                        <span class=\"icon filter\" />\n                        <span class=\"hide-small\">Filter</span>\n                        <span v-if=\"!isEmptyFilter(fetcher.baseFilter)\" class=\"icon dot primary\" />\n                    </button>\n                </div>\n            </div>\n\n            <ScrollableSegmentedControl v-model=\"selectedYear\" :items=\"years\" :labels=\"yearLabels\" />\n\n            <template v-if=\"selectedYear === null && suggestionsGroup\">\n                <Checkbox v-model=\"addSuggestions\">\n                    Toon wekelijkse suggesties voor {{ suggestionsGroup.settings.name }}\n                </Checkbox>\n\n                <hr>\n            </template>\n\n            <div v-for=\"(group, index) of groupedEvents\" :key=\"group.title\" class=\"container\">\n                <hr v-if=\"index > 0\">\n                <h2>{{ Formatter.capitalizeFirstLetter(group.title) }}</h2>\n\n                <STList>\n                    <EventRow v-for=\"event of group.events\" :key=\"event.id\" :event=\"event\" @click=\"onClickEvent(event)\" />\n                </STList>\n            </div>\n\n            <InfiniteObjectFetcherEnd empty-message=\"Geen activiteiten gevonden\" :fetcher=\"fetcher\" />\n        </main>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ComponentWithProperties, defineRoutes, NavigationController, useNavigate, usePresent } from '@simonbackx/vue-app-navigation';\nimport { Event, isEmptyFilter, LimitedFilteredRequest, StamhoofdFilter } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { ComponentOptions, computed, ref, Ref, watch, watchEffect } from 'vue';\nimport { useAppContext } from '../context';\nimport { useEventsObjectFetcher } from '../fetchers';\nimport { useEventUIFilterBuilders } from '../filters/filterBuilders';\nimport { UIFilter } from '../filters/UIFilter';\nimport UIFilterEditor from '../filters/UIFilterEditor.vue';\nimport { useAuth, useGlobalEventListener, useOrganization, usePlatform, useUser } from '../hooks';\nimport ScrollableSegmentedControl from '../inputs/ScrollableSegmentedControl.vue';\nimport { Toast } from '../overlays/Toast';\nimport { InfiniteObjectFetcherEnd, useInfiniteObjectFetcher, usePositionableSheet } from '../tables';\nimport EventRow from './components/EventRow.vue';\nimport { useEventPermissions } from './composables/useEventPermissions';\nimport EditEventView from './EditEventView.vue';\nimport EventOverview from './EventOverview.vue';\n\ntype ObjectType = Event;\n\nconst searchQuery = ref('');\nconst present = usePresent();\n\nconst selectedYear = ref(null) as Ref<number | null>;\nconst years = computed(() => {\n    const currentYear = Formatter.year(new Date());\n    return [null, currentYear, currentYear - 1, currentYear - 2];\n});\nconst user = useUser();\nconst organization = useOrganization();\nconst platform = usePlatform();\nconst $navigate = useNavigate();\nconst { presentPositionableSheet } = usePositionableSheet();\nconst auth = useAuth();\nconst eventPermissions = useEventPermissions();\n\nconst filterBuilders = useEventUIFilterBuilders({ platform: platform.value, organizations: organization.value ? [organization.value] : [], app: useAppContext() });\nconst selectedUIFilter = ref(createDefaultUIFilter()) as Ref<null | UIFilter>;\n\nconst yearLabels = computed(() => {\n    return years.value.map((y) => {\n        if (y === null) {\n            return 'Toekomstige';\n        }\n        return y.toString();\n    });\n});\n\nconst canWriteSomeEvent = computed(() => eventPermissions.canWriteSome());\n\nenum Routes {\n    Event = 'activiteit',\n}\n\ndefineRoutes([\n    {\n        name: Routes.Event,\n        url: '@id',\n        component: EventOverview as ComponentOptions,\n        params: {\n            id: String,\n        },\n        paramsToProps: async (params: { id: string }) => {\n            // Fetch event\n            const events = await fetcher.objectFetcher.fetch(\n                new LimitedFilteredRequest({\n                    filter: {\n                        id: params.id,\n                    },\n                    limit: 1,\n                    sort: [],\n                }),\n            );\n\n            if (events.results.length === 1) {\n                return {\n                    event: events.results[0],\n                };\n            }\n            Toast.error('Activiteit niet gevonden').show();\n            throw new Error('Event not found');\n        },\n\n        propsToParams(props) {\n            if (!('event' in props) || typeof props.event !== 'object' || props.event === null || !('id' in props.event)) {\n                throw new Error('Missing event');\n            }\n            return {\n                params: {\n                    id: props.event.id,\n                },\n            };\n        },\n    },\n]);\n\nconst objectFetcher = useEventsObjectFetcher({\n    get requiredFilter() {\n        return getRequiredFilter();\n    },\n});\n\nconst fetcher = useInfiniteObjectFetcher<ObjectType>(objectFetcher);\n\nconst addSuggestions = ref(false);\nconst suggestedGroups = computed(() => {\n    const u = user.value;\n    if (!u || !u.memberId) {\n        return [];\n    }\n    const member = u.members.members.find(m => m.id === u.memberId);\n    if (!member) {\n        return [];\n    }\n\n    const responsibilities = member.responsibilities.filter(r => r.isActive && !!r.groupId);\n    const groups = [organization.value, ...u.members.organizations].flatMap(o => o?.period.groups ?? []);\n    return groups.filter(g => g.settings.defaultEventTime && responsibilities.some(r => r.groupId === g.id));\n});\nconst suggestionsGroup = ref(suggestedGroups.value[0]) ?? null;\n\nconst fillEventsUntil = computed(() => {\n    const fetcherLastDate = fetcher.objects[fetcher.objects.length - 1]?.startDate;\n\n    if (fetcher.hasMoreObjects) {\n        return fetcherLastDate ?? new Date();\n    }\n\n    const fillUntil = Formatter.luxon(new Date()).plus({ months: 2 }).endOf('month').toJSDate();\n\n    return new Date(Math.max(fillUntil.getTime(), fetcherLastDate?.getTime() ?? 0));\n});\n\nconst dayOfWeekSuggestion = 7; // Sunday\n\nconst eventSuggestions = computed(() => {\n    if (!addSuggestions.value || selectedYear.value !== null) {\n        return [];\n    }\n\n    let pointer = Formatter.luxon(new Date());\n    const end = Formatter.luxon(fillEventsUntil.value);\n    const suggestions: Event[] = [];\n\n    // Find next sunday (dayOfWeekSuggestion)\n\n    while (pointer < end) {\n        pointer = pointer.plus({ days: 1 });\n\n        if (pointer.weekday === dayOfWeekSuggestion) {\n            // Found next sunday\n            suggestions.push(\n                Event.create({\n                    id: '',\n                    name: 'Suggestie',\n                    startDate: pointer.toJSDate(),\n                    endDate: pointer.toJSDate(),\n                }),\n            );\n        }\n    }\n\n    return suggestions;\n});\n\nconst filledEvents = computed(() => {\n    const added = eventSuggestions.value.filter((e) => {\n        for (const event of fetcher.objects) {\n            if (Formatter.dateIso(event.startDate) === Formatter.dateIso(e.startDate)) {\n                return false;\n            }\n        }\n        return true;\n    });\n\n    return [...fetcher.objects, ...added].sort((a, b) => a.startDate.getTime() - b.startDate.getTime());\n});\n\nconst groupedEvents = computed(() => {\n    return Event.group(filledEvents.value);\n});\n\nwatchEffect(() => {\n    fetcher.setSearchQuery(searchQuery.value);\n    const filter = selectedUIFilter.value ? selectedUIFilter.value.build() : null;\n    fetcher.setFilter(filter);\n});\n\nfunction blurFocus() {\n    (document.activeElement as HTMLElement)?.blur();\n}\n\nasync function addEvent(template?: Event) {\n    if (platform.value.config.eventTypes.length === 0) {\n        if (auth.hasFullPlatformAccess()) {\n            Toast.error('Configureer eerst minstens één soort activiteit. Ga naar \\'Instellingen\\' → \\'Soorten activiteiten\\' in het Administratieportaal.').show();\n        }\n        else {\n            Toast.error('Activiteiten werden nog niet correct geconfigureerd. Vraag een hoofdbeheerder om dit in orde te brengen.').show();\n        }\n        return;\n    }\n\n    const event = (template?.clone() ?? Event.create({}));\n    event.id = Event.create({}).id;\n    event.organizationId = organization.value?.id ?? null;\n\n    const defaultStartDate = Formatter.luxon().plus({ days: 1 }).set({ hour: 12, minute: 0, second: 0, millisecond: 0 });\n    const defaultEndDate = Formatter.luxon().plus({ days: 1 }).set({ hour: 14, minute: 0, second: 0, millisecond: 0 });\n\n    event.startDate = defaultStartDate.toJSDate();\n    event.endDate = defaultEndDate.toJSDate();\n\n    await present({\n        modalDisplayStyle: 'popup',\n        components: [\n            new ComponentWithProperties(EditEventView, {\n                event,\n                isNew: true,\n                callback: () => {\n                    fetcher.reset();\n                },\n            }),\n        ],\n    });\n}\n\nasync function onClickEvent(event: Event) {\n    if (!event.id) {\n        // Create a new one\n        return await addEvent(event);\n    }\n\n    await $navigate(Routes.Event, { properties: { event } });\n}\n\nasync function editFilter(event: MouseEvent) {\n    if (!filterBuilders) {\n        return;\n    }\n    const filter = selectedUIFilter.value ?? filterBuilders.value[0].create();\n    if (!selectedUIFilter.value) {\n        selectedUIFilter.value = filter;\n    }\n\n    await presentPositionableSheet(event, {\n        components: [\n            new ComponentWithProperties(NavigationController, {\n                root: new ComponentWithProperties(UIFilterEditor, {\n                    filter,\n                }),\n            }),\n        ],\n    });\n}\n\nfunction getRequiredFilter(): StamhoofdFilter | null {\n    const org = organization.value;\n\n    const filters: StamhoofdFilter = {};\n\n    // filter on start date\n    if (selectedYear.value === null) {\n        const d = new Date();\n        d.setHours(0, 0, 0, 0);\n\n        filters['startDate'] = {\n            $gt: d,\n        };\n    }\n    else {\n        filters['$and'] = [\n            {\n                startDate: {\n                    $gte: new Date(selectedYear.value, 0, 1),\n                },\n            },\n            {\n                startDate: {\n                    $lt: new Date(selectedYear.value + 1, 0, 1),\n                },\n            },\n        ];\n    }\n\n    // filter on organization tag ids, if organization lvl\n    if (org) {\n        filters['organizationTagIds'] = {\n            $in: [null, ...org.meta.tags],\n        };\n    }\n\n    return filters;\n}\n\nfunction getDefaultStamhoofdFilter(): StamhoofdFilter {\n    let groupIds: (string | null)[] | undefined = undefined;\n    let organizationTagIds: (string | null)[] | undefined = undefined;\n    const isOrganizationScope = organization.value !== null;\n\n    // // only show events for groups where user can edit event for if organization scope\n    if (isOrganizationScope) {\n        const groupsToFilterEventsOn = eventPermissions.groupsToFilterEventsOn();\n        if (groupsToFilterEventsOn) {\n            groupIds = [null, ...groupsToFilterEventsOn];\n        }\n    }\n    // only show events for organizations with tag where user can edit event for if platform scope\n    else {\n        const tagsToFilterEventsOn = eventPermissions.tagsToFilterEventsOn();\n        if (tagsToFilterEventsOn) {\n            organizationTagIds = tagsToFilterEventsOn;\n        }\n    }\n\n    if (groupIds === undefined && organizationTagIds === undefined) {\n        return null;\n    }\n\n    const filter: StamhoofdFilter = {};\n\n    if (groupIds) {\n        filter.groupIds = {\n            $in: groupIds,\n        };\n    }\n\n    if (organizationTagIds) {\n        filter.organizationTagIds = {\n            $in: organizationTagIds,\n        };\n    }\n\n    return filter;\n}\n\nfunction createDefaultUIFilter(): UIFilter | null {\n    const filter = getDefaultStamhoofdFilter();\n    return filterBuilders.value[0].fromFilter(filter);\n}\n\nuseGlobalEventListener('event-deleted', async () => {\n    fetcher.reset();\n});\n\nwatch(selectedYear, () => {\n    fetcher.reset();\n});\n\n</script>\n","import { ComponentWithProperties } from '@simonbackx/vue-app-navigation';\n\nimport { ModalStackEventBus } from '../overlays/ModalStackEventBus';\nimport Tooltip from '../overlays/Tooltip.vue';\nimport { ObjectDirective } from 'vue';\n\nconst helper = {\n    copyElementFallback(event, vnode) {\n        event.target.contentEditable = true;\n\n        document.execCommand('selectAll', false);\n        document.execCommand('copy');\n\n        event.target.contentEditable = false;\n\n        const w = window as any;\n        if (w.getSelection) {\n            if (w.getSelection().empty) { // Chrome\n                w.getSelection().empty();\n            }\n            else if (w.getSelection().removeAllRanges) { // Firefox\n                w.getSelection().removeAllRanges();\n            }\n        }\n        this.copiedPopup(event, vnode);\n\n        (document.activeElement as HTMLElement)?.blur();\n    },\n\n    copiedPopup(event) {\n        const el = event.currentTarget || event.target;\n        const rect = el.getBoundingClientRect();\n\n        const displayedComponent = new ComponentWithProperties(Tooltip, {\n            text: 'Gekopieerd naar klembord',\n            icon: '',\n            x: rect.left,\n            y: rect.top + el.offsetHeight + 5,\n        });\n\n        ModalStackEventBus.sendEvent('present', {\n            components: [\n                displayedComponent,\n            ],\n            modalDisplayStyle: 'overlay',\n        }).catch(console.error);\n\n        setTimeout(() => {\n            (displayedComponent.componentInstance() as any)?.hide?.();\n        }, 1000);\n\n        if (el.$tooltipDisplayedComponent) {\n            try {\n                (el.$tooltipDisplayedComponent.componentInstance() as any)?.hide?.();\n                el.$tooltipDisplayedComponent = null;\n            }\n            catch (e) {\n                // ignore\n            }\n        }\n        el.$tooltipDisplayedComponent = displayedComponent;\n\n        // Add style\n        el.classList.add('copied');\n        setTimeout(() => {\n            el.classList.remove('copied');\n        }, 500);\n    },\n\n    copyElement(event, bindingValue: any, vnode: any) {\n        if (window.getSelection() !== null && window.getSelection()!.toString().length > 0) {\n            return;\n        }\n        if (navigator.clipboard) {\n            // Select all\n            const myText = bindingValue ?? event.currentTarget.textContent.trim();\n            navigator.clipboard.writeText(myText).then(() => {\n                this.copiedPopup(event, vnode);\n            }).catch((e) => {\n                console.error(e);\n                this.copyElementFallback(event, vnode);\n            });\n        }\n        else {\n            console.warn('No navigator.clipboard support');\n            this.copyElementFallback(event, vnode);\n        }\n    },\n};\n\nconst CopyableDirective: ObjectDirective<HTMLElement & { $tooltipDisplayedComponent: null | ComponentWithProperties }, string> = {\n    beforeMount(el, binding, vnode) {\n        // Add a hover listener\n        el.addEventListener(\n            'click',\n            (event) => {\n                helper.copyElement(event, (el as any)._copyableValue ?? binding.value, vnode);\n            },\n            { passive: true },\n        );\n    },\n\n    updated(el, binding, vnode) {\n        (el as any)._copyableValue = binding.value;\n    },\n};\n\nexport default CopyableDirective;\n","<template>\n    <div class=\"st-view payment-view\">\n        <STNavigationBar :title=\"title\">\n            <template #right>\n                <button v-if=\"hasPrevious || hasNext\" v-tooltip=\"'Ga naar de vorige'\" type=\"button\" class=\"button navigation icon arrow-up\" :disabled=\"!hasPrevious\" @click=\"goBack\" />\n                <button v-if=\"hasNext || hasPrevious\" v-tooltip=\"'Ga naar de volgende'\" type=\"button\" class=\"button navigation icon arrow-down\" :disabled=\"!hasNext\" @click=\"goForward\" />\n            </template>\n        </STNavigationBar>\n\n        <main>\n            <p v-if=\"payment.type !== PaymentType.Payment && payment.method !== PaymentMethod.Unknown\" :class=\"'style-title-prefix ' + payment.theme\">\n                <span>{{ PaymentTypeHelper.getName(payment.type) }}</span>\n                <span :class=\"'icon small ' + PaymentTypeHelper.getIcon(payment.type)\" />\n            </p>\n\n            <h1 class=\"style-navigation-title with-icons\">\n                <span class=\"icon-spacer\">{{ title }}</span>\n\n                <span v-if=\"payment.isPending\" v-tooltip=\"'In verwerking'\" class=\"icon small hourglass primary\" />\n                <span v-if=\"payment.isFailed\" v-tooltip=\"'Mislukt'\" class=\"icon small disabled error\" />\n            </h1>\n\n            <template v-if=\"canWrite\">\n                <p v-if=\"payment.type === PaymentType.Reallocation\">\n                    Een saldoverrekening kan manueel of automatisch voorkomen. Stel dat iemand betaalde voor een evenement, maar dat op tijd annuleerde, dan kan dat tegoed gebruikt worden om bijvoorbeeld iets anders volledig of gedeeltelijk te betalen voor hetzelfde bedrag. {{ platform.config.name }} maakt automatische saldoverrekeningen aan voor gelijkaardige items, bv. als je een inschrijving hebt gewijzigd.\n                </p>\n                <p v-if=\"payment.method === PaymentMethod.Transfer && payment.isFailed\" class=\"error-box\">\n                    Deze overschrijving werd geannuleerd en is niet langer zichtbaar. Ontvang je toch nog de betaling? Heractiveer de overschrijving dan terug.\n                </p>\n\n                <p v-if=\"payment.isPending && payment.method === PaymentMethod.Transfer && payment.isOverDue && payment.type == PaymentType.Payment\" class=\"warning-box\">\n                    Annuleer een betaling als je deze nog niet hebt ontvangen. Op die manier weet het systeem dat, en zullen de automatische herinneringssystemen correct werken. Het openstaande bedrag zal dan ook terug worden verhoogd waardoor een nieuwe betaalpoging mogelijk is.\n                </p>\n\n                <p v-if=\"payment.isPending && payment.type == PaymentType.Refund\" class=\"warning-box\">\n                    Je laat een terugbetaling best niet op 'in verwerking' staan. Annuleer de terugbetaling als je deze nog niet hebt uitgevoerd.\n                </p>\n            </template>\n\n            <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n            <STList class=\"info\">\n                <STListItem v-if=\"payment.price\">\n                    <h3 class=\"style-definition-label\">\n                        Totaalbedrag\n                    </h3>\n                    <p class=\"style-definition-text\">\n                        {{ formatPrice(payment.price) }}\n                    </p>\n                </STListItem>\n\n                <STListItem v-if=\"payment.method === 'Transfer'\">\n                    <h3 class=\"style-definition-label\">\n                        Mededeling\n                    </h3>\n                    <p class=\"style-definition-text\">\n                        {{ payment.transferDescription }}\n                    </p>\n                </STListItem>\n\n                <STListItem v-if=\"payment.method === 'Transfer' && payment.transferSettings\">\n                    <h3 v-if=\"payment.price >= 0\" class=\"style-definition-label\">\n                        Betalen aan\n                    </h3>\n                    <h3 v-else class=\"style-definition-label\">\n                        Terugbetaald vanaf\n                    </h3>\n                    <p class=\"style-definition-text\">\n                        {{ payment.transferSettings }}\n                    </p>\n                </STListItem>\n\n                <STListItem v-if=\"isManualMethod\">\n                    <h3 class=\"style-definition-label\">\n                        Aangemaakt op\n                    </h3>\n                    <p class=\"style-definition-text\">\n                        {{ formatDate(payment.createdAt) }}\n                    </p>\n                    <p class=\"style-description-small\">\n                        Om {{ formatTime(payment.createdAt) }}\n                    </p>\n                </STListItem>\n\n                <STListItem v-if=\"payment.paidAt\">\n                    <h3 v-if=\"payment.price == 0\" class=\"style-definition-label\">\n                        Geboekt op\n                    </h3>\n                    <h3 v-else-if=\"payment.price >= 0\" class=\"style-definition-label\">\n                        Betaald op\n                    </h3>\n                    <h3 v-else class=\"style-definition-label\">\n                        Terugbetaald op\n                    </h3>\n                    <p class=\"style-definition-text\">\n                        {{ formatDate(payment.paidAt) }}\n                    </p>\n                    <p class=\"style-description-small\">\n                        Om {{ formatTime(payment.paidAt) }}\n                    </p>\n                </STListItem>\n\n                <STListItem v-if=\"payment.iban\">\n                    <h3 class=\"style-definition-label\">\n                        Betaald via IBAN\n                    </h3>\n\n                    <p class=\"style-definition-text\">\n                        {{ payment.iban }}\n                    </p>\n                    <p v-if=\"payment.ibanName\" class=\"style-description-small\">\n                        Op naam van {{ payment.ibanName }}\n                    </p>\n                </STListItem>\n\n                <STListItem v-if=\"payment.settlement\" class=\"right-description right-stack\">\n                    <h3 class=\"style-definition-label\">\n                        Uitbetaald op\n                    </h3>\n\n                    <p class=\"style-definition-text\">\n                        {{ formatDate(payment.settlement.settledAt) }}<br>\n                        Mededeling \"{{ payment.settlement.reference }}\"\n                    </p>\n                </STListItem>\n\n                <STListItem v-if=\"payment.transferFee\">\n                    <h3 class=\"style-definition-label\">\n                        Transactiekost\n                    </h3>\n\n                    <p class=\"style-definition-text\">\n                        {{ formatPrice(payment.transferFee) }}\n                    </p>\n                    <p class=\"style-description-small\">\n                        <template v-if=\"VATPercentage > 0\">\n                            Incl. {{ VATPercentage }}% BTW —\n                        </template> <a :href=\"$domains.getDocs('transactiekosten-inhouding')\" class=\"inline-link\" target=\"_blank\">Meer info</a>\n                    </p>\n                </STListItem>\n            </STList>\n\n            <hr>\n            <h2>Facturatiegegevens</h2>\n\n            <p v-if=\"!payment.customer\" class=\"info-box\">\n                Deze betaling heeft geen facturatiegegevens.\n            </p>\n            <STList v-else-if=\"payment.customer.company\" class=\"info\">\n                <STListItem>\n                    <h3 class=\"style-definition-label\">\n                        Bedrijfsnaam\n                    </h3>\n                    <p v-copyable class=\"style-definition-text style-copyable\">\n                        {{ payment.customer.company.name }}\n                    </p>\n                    <p v-if=\"!payment.customer.company.VATNumber && !payment.customer.company.companyNumber\" class=\"style-description\">\n                        Feitelijke vereniging\n                    </p>\n                </STListItem>\n\n                <STListItem v-if=\"payment.customer.company.VATNumber\">\n                    <h3 class=\"style-definition-label\">\n                        BTW-nummer\n                    </h3>\n                    <p v-copyable class=\"style-definition-text style-copyable\">\n                        {{ payment.customer.company.VATNumber || 'Niet BTW-plichtig' }}\n                    </p>\n                </STListItem>\n\n                <STListItem v-if=\"payment.customer.company.companyNumber && (!payment.customer.company.VATNumber || (payment.customer.company.companyNumber !== payment.customer.company.VATNumber && payment.customer.company.companyNumber !== payment.customer.company.VATNumber.slice(2)))\">\n                    <h3 class=\"style-definition-label\">\n                        Ondernemingsnummer\n                    </h3>\n                    <p v-copyable class=\"style-definition-text style-copyable\">\n                        {{ payment.customer.company.companyNumber || 'Niet BTW-plichtig' }}\n                    </p>\n                </STListItem>\n\n                <STListItem v-if=\"payment.customer.company.address\">\n                    <h3 class=\"style-definition-label\">\n                        Adres\n                    </h3>\n                    <p v-copyable class=\"style-definition-text style-copyable\">\n                        {{ payment.customer.company.address.toString() }}\n                    </p>\n                </STListItem>\n\n                <STListItem v-if=\"payment.customer.company.administrationEmail\">\n                    <h3 class=\"style-definition-label\">\n                        E-mailadres\n                    </h3>\n                    <p v-copyable class=\"style-definition-text style-copyable\">\n                        {{ payment.customer.company.administrationEmail }}\n                    </p>\n                </STListItem>\n\n                <STListItem v-if=\"payment.customer.name\">\n                    <h3 class=\"style-definition-label\">\n                        Contactpersoon\n                    </h3>\n                    <p v-copyable class=\"style-definition-text style-copyable\">\n                        {{ payment.customer.name }}\n                    </p>\n                    <p v-if=\"payment.customer.email\" v-copyable class=\"style-description style-copyable\">\n                        {{ payment.customer.email }}\n                    </p>\n                </STListItem>\n            </STList>\n\n            <STList v-else class=\"info\">\n                <STListItem>\n                    <h3 class=\"style-definition-label\">\n                        Contactpersoon\n                    </h3>\n                    <p v-copyable class=\"style-definition-text style-copyable\">\n                        {{ payment.customer.name || 'Naamloos' }}\n                    </p>\n                    <p v-if=\"payment.customer.email\" v-copyable class=\"style-description style-copyable\">\n                        {{ payment.customer.email }}\n                    </p>\n                </STListItem>\n            </STList>\n\n            <template v-if=\"isManualMethod && canWrite\">\n                <hr>\n                <h2>Acties</h2>\n\n                <STList>\n                    <STListItem v-if=\"payment.isFailed && payment.type === PaymentType.Payment\" :selectable=\"true\" @click=\"markPending\">\n                        <h2 class=\"style-title-list\">\n                            Heractiveer\n                        </h2>\n                        <p class=\"style-description\">\n                            Wijzig de status terug naar 'wacht op betaling'.\n                        </p>\n                        <template #right>\n                            <button type=\"button\" class=\"button secundary hide-smartphone\">\n                                <span class=\"icon clock\" />\n                                <span>Heractiveer</span>\n                            </button>\n                            <button type=\"button\" class=\"button icon success only-smartphone\" />\n                        </template>\n                    </STListItem>\n\n                    <STListItem v-if=\"(payment.isPending && payment.type === PaymentType.Payment) || (payment.isFailed && payment.type !== PaymentType.Payment)\" :selectable=\"true\" @click=\"markPaid\">\n                        <h2 class=\"style-title-list\">\n                            Markeer als betaald\n                        </h2>\n                        <p v-if=\"payment.webshopIds.length\" class=\"style-description\">\n                            Stuurt mogelijks een automatische e-mail ter bevestiging.\n                        </p>\n                        <template #right>\n                            <button type=\"button\" class=\"button secundary hide-smartphone\">\n                                <span class=\"icon success\" />\n                                <span>Betaald</span>\n                            </button>\n                            <button type=\"button\" class=\"button icon success only-smartphone\" />\n                        </template>\n                    </STListItem>\n\n                    <STListItem v-if=\"payment.isSucceeded && payment.type === PaymentType.Payment\" :selectable=\"true\" @click=\"markPending\">\n                        <h2 class=\"style-title-list\">\n                            Toch niet betaald\n                        </h2>\n                        <p v-if=\"payment.method === 'Transfer'\" class=\"style-description\">\n                            Overschrijving per ongeluk gemarkeerd als betaald? Maak dat hiermee ongedaan.\n                        </p>\n                        <p v-else class=\"style-description\">\n                            Betaling per ongeluk gemarkeerd als betaald? Maak dat hiermee ongedaan.\n                        </p>\n                        <template #right>\n                            <button type=\"button\" class=\"button secundary hide-smartphone\">\n                                <span class=\"icon undo\" />\n                                <span>Niet betaald</span>\n                            </button><button type=\"button\" class=\"button icon undo only-smartphone\" />\n                        </template>\n                    </STListItem>\n\n                    <STListItem v-if=\"payment.isPending || (payment.isSucceeded && payment.type !== PaymentType.Payment)\" :selectable=\"true\" @click=\"markFailed\">\n                        <h2 class=\"style-title-list\">\n                            Annuleren\n                        </h2>\n                        <p v-if=\"payment.type !== PaymentType.Payment\" class=\"style-description\">\n                            Maak deze transactie ongedaan\n                        </p>\n                        <p v-else-if=\"payment.method === 'Transfer'\" class=\"style-description\">\n                            Annuleer de overschrijving als deze niet op tijd betaald werd.\n                        </p>\n                        <p v-else class=\"style-description\">\n                            Annuleer de betaling als je denkt dat deze niet meer betaald zal worden.\n                        </p>\n                        <template #right>\n                            <button type=\"button\" class=\"button secundary danger hide-smartphone\">\n                                <span class=\"icon canceled\" />\n                                <span>Annuleren</span>\n                            </button><button type=\"button\" class=\"button icon canceled only-smartphone\" />\n                        </template>\n                    </STListItem>\n                </STList>\n            </template>\n\n            <template v-if=\"payment.balanceItemPayments.length\">\n                <hr>\n                <h2>Overzicht</h2>\n                <STList>\n                    <STListItem v-for=\"item in sortedItems\" :key=\"item.id\">\n                        <template #left>\n                            <BalanceItemIcon :item=\"item.balanceItem\" :is-payable=\"false\" />\n                        </template>\n\n                        <BalanceItemTitleBox :item=\"item.balanceItem\" :is-payable=\"false\" :price=\"item.price\" :payment-status=\"payment.status\" />\n\n                        <template #right>\n                            <span class=\"style-price-base\" :class=\"{negative: item.price < 0}\">{{ item.price === 0 ? 'Gratis' : formatPrice(item.price) }}</span>\n                        </template>\n                    </STListItem>\n                </STList>\n\n                <PriceBreakdownBox :price-breakdown=\"[{name: 'Totaal', price: payment.price}]\" />\n            </template>\n        </main>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ArrayDecoder, Decoder, PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { GlobalEventBus, STErrorsDefault, STList, STListItem, STNavigationBar, Toast, useAppContext, useAuth, useBackForward, useContext, useErrors, usePlatform } from '@stamhoofd/components';\nimport { Payment, PaymentGeneral, PaymentMethod, PaymentStatus, PaymentType, PaymentTypeHelper, PermissionLevel } from '@stamhoofd/structures';\n\nimport { useRequestOwner } from '@stamhoofd/networking';\nimport { Sorter } from '@stamhoofd/utility';\nimport { computed, ref } from 'vue';\nimport PriceBreakdownBox from '../views/PriceBreakdownBox.vue';\nimport BalanceItemIcon from './BalanceItemIcon.vue';\nimport BalanceItemTitleBox from './BalanceItemTitleBox.vue';\n\nconst props = withDefaults(\n    defineProps<{\n        payment: PaymentGeneral;\n        getNext?: ((payment: PaymentGeneral) => PaymentGeneral | null) | null;\n        getPrevious?: ((payment: PaymentGeneral) => PaymentGeneral | null) | null;\n    }>(), {\n        getNext: null,\n        getPrevious: null,\n    },\n);\n\nconst { hasNext, hasPrevious, goBack, goForward } = useBackForward('payment', props);\nconst errors = useErrors();\nconst title = props.payment.title;\nconst isManualMethod = props.payment.method === PaymentMethod.Transfer || props.payment.method === PaymentMethod.PointOfSale || props.payment.method === PaymentMethod.Unknown;\nconst auth = useAuth();\nconst app = useAppContext();\nconst canWrite = computed(() => app === 'dashboard' && auth.canAccessPayment(props.payment, PermissionLevel.Write));\nconst VATPercentage = 21; // todo\nconst context = useContext();\nconst owner = useRequestOwner();\nconst markingPaid = ref(false);\nconst platform = usePlatform();\n\nconst sortedItems = computed(() => {\n    return props.payment.balanceItemPayments.slice().sort((a, b) => {\n        return Sorter.stack(\n            Sorter.byNumberValue(a.price, b.price),\n            Sorter.byStringValue(a.itemDescription ?? a.balanceItem.description, b.itemDescription ?? b.balanceItem.description),\n        );\n    });\n});\n\nasync function reload() {\n    try {\n        const response = await context.value.authenticatedServer.request({\n            method: 'GET',\n            path: `/payments/${props.payment.id}`,\n            decoder: PaymentGeneral as Decoder<PaymentGeneral>,\n            owner,\n            shouldRetry: true,\n        });\n        props.payment.deepSet(response.data);\n    }\n    catch (e) {\n        Toast.fromError(e).show();\n    }\n}\n\nasync function markPaid() {\n    await mark(PaymentStatus.Succeeded);\n}\n\nasync function markPending() {\n    await mark(PaymentStatus.Pending);\n}\n\nasync function markFailed() {\n    await mark(PaymentStatus.Failed);\n}\n\nasync function mark(status: PaymentStatus) {\n    if (markingPaid.value) {\n        return;\n    }\n\n    markingPaid.value = true;\n\n    try {\n        const data: PatchableArrayAutoEncoder<Payment> = new PatchableArray();\n        data.addPatch(Payment.patch({\n            id: props.payment.id,\n            status,\n        }));\n\n        // Create a patch for this payment\n        const response = await context.value.authenticatedServer.request({\n            method: 'PATCH',\n            path: '/organization/payments',\n            body: data,\n            decoder: new ArrayDecoder(PaymentGeneral as Decoder<PaymentGeneral>),\n            shouldRetry: false,\n        });\n        props.payment.deepSet(response.data[0]);\n        GlobalEventBus.sendEvent('paymentPatch', props.payment).catch(console.error);\n        new Toast('Betaalstatus gewijzigd', 'success').setHide(1000).show();\n    }\n    catch (e) {\n        Toast.fromError(e).show();\n    }\n    markingPaid.value = false;\n}\n</script>\n","<template>\n    <LoadingViewTransition :error-box=\"errors.errorBox\">\n        <PaymentView v-if=\"loadedPayment\" :payment=\"loadedPayment\" />\n    </LoadingViewTransition>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Decoder } from '@simonbackx/simple-encoding';\nimport { useRequestOwner } from '@stamhoofd/networking';\nimport { Payment, PaymentGeneral } from '@stamhoofd/structures';\nimport { Ref, ref } from 'vue';\nimport { LoadingViewTransition } from '../containers';\nimport { ErrorBox } from '../errors/ErrorBox';\nimport { useErrors } from '../errors/useErrors';\nimport { useContext } from '../hooks';\nimport PaymentView from './PaymentView.vue';\n\nconst props = defineProps<{\n    payment: Payment;\n}>();\n\nconst context = useContext();\nconst errors = useErrors();\nconst owner = useRequestOwner();\nconst loadedPayment = ref(null) as Ref<PaymentGeneral | null>;\nload().catch(console.error);\n\nasync function load() {\n    try {\n        if (props.payment instanceof PaymentGeneral) {\n            loadedPayment.value = props.payment;\n            return;\n        }\n\n        const response = await context.value.authenticatedServer.request({\n            method: 'GET',\n            path: `/payments/${props.payment.id}`,\n            decoder: PaymentGeneral as Decoder<PaymentGeneral>,\n            owner,\n            shouldRetry: true,\n        });\n        props.payment.deepSet(response.data);\n        loadedPayment.value = response.data;\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n}\n\n</script>\n","<template>\n    <STListItem :selectable=\"canClick\" @click=\"clickHandler\">\n        <template #left>\n            <BalanceItemIcon :item=\"item\" :is-payable=\"isPayable\" />\n        </template>\n\n        <BalanceItemTitleBox :item=\"item\" :is-payable=\"isPayable\" />\n\n        <template #right>\n            <p v-if=\"!item.isDue\" v-tooltip=\"item.dueAt ? ('Te betalen tegen ' + formatDate(item.dueAt)) : undefined\" class=\"style-price-base disabled style-tooltip\">\n                ({{ formatPrice(item.priceOpen) }})\n            </p>\n            <p v-else class=\"style-price-base\" :class=\"{negative: item.priceOpen < 0}\">\n                {{ formatPrice(item.priceOpen) }}\n            </p>\n        </template>\n    </STListItem>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ArrayDecoder, AutoEncoderPatchType, PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, usePresent } from '@simonbackx/vue-app-navigation';\nimport { EditBalanceItemView, GlobalEventBus, useContext } from '@stamhoofd/components';\nimport { BalanceItem, BalanceItemWithPayments, GroupedBalanceItems } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport BalanceItemIcon from './BalanceItemIcon.vue';\nimport BalanceItemTitleBox from './BalanceItemTitleBox.vue';\n\nconst props = withDefaults(\n    defineProps<{\n        item: BalanceItem | GroupedBalanceItems;\n        isPayable: boolean;\n        hasWrite?: boolean;\n    }>(),\n    {\n        hasWrite: true,\n    },\n);\n\nconst context = useContext();\nconst present = usePresent();\n\nconst canClick = computed(() => {\n    return props.hasWrite && !props.isPayable && props.item instanceof BalanceItem;\n});\n\nasync function clickHandler() {\n    if (!canClick.value) {\n        return;\n    }\n\n    if (props.item instanceof BalanceItem) {\n        await editBalanceItem(props.item);\n    }\n\n    // todo: implement for GroupedBalanceItems\n}\n\nasync function editBalanceItem(balanceItem: BalanceItem) {\n    const component = new ComponentWithProperties(EditBalanceItemView, {\n        balanceItem,\n        isNew: false,\n        saveHandler: async (patch: AutoEncoderPatchType<BalanceItemWithPayments>) => {\n            const arr: PatchableArrayAutoEncoder<BalanceItemWithPayments> = new PatchableArray();\n            patch.id = balanceItem.id;\n            arr.addPatch(patch);\n            await context.value.authenticatedServer.request({\n                method: 'PATCH',\n                path: '/organization/balance',\n                body: arr,\n                decoder: new ArrayDecoder(BalanceItemWithPayments),\n                shouldRetry: false,\n            });\n            GlobalEventBus.sendEvent('balanceItemPatch', balanceItem.patch(patch)).catch(console.error);\n        },\n    });\n    await present({\n        components: [component],\n        modalDisplayStyle: 'popup',\n    });\n}\n</script>\n","<template>\n    <PriceBreakdownBox :price-breakdown=\"priceBreakdown\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { PriceBreakdownBox } from '@stamhoofd/components';\nimport { BalanceItem, DetailedPayableBalance, DetailedReceivableBalance } from '@stamhoofd/structures';\nimport { computed } from 'vue';\n\nconst props = defineProps<{\n    item: DetailedPayableBalance | DetailedReceivableBalance;\n}>();\n\nconst items = computed(() => props.item.filteredBalanceItems);\nconst filteredItems = items;\nconst isPayable = props.item instanceof DetailedPayableBalance;\n\nconst priceBreakdown = computed(() => {\n    const now = BalanceItem.getDueOffset();\n    const laterBalance = BalanceItem.getOutstandingBalance(filteredItems.value.filter(i => i.dueAt !== null && i.dueAt > now));\n    const balance = BalanceItem.getOutstandingBalance(filteredItems.value.filter(i => i.dueAt === null || i.dueAt <= now));\n\n    if (balance.priceOpen < 0) {\n        if (laterBalance.priceOpen > 0) {\n            // Let it fill in the gap\n            const max = -balance.priceOpen;\n            balance.priceOpen = Math.min(0, balance.priceOpen + laterBalance.priceOpen);\n            laterBalance.priceOpen -= Math.min(max, laterBalance.priceOpen);\n        }\n    }\n\n    const all = [\n        {\n            name: 'Reeds betaald',\n            price: balance.pricePaid + laterBalance.pricePaid,\n        },\n        {\n            name: 'In verwerking',\n            price: balance.pricePending + laterBalance.pricePending,\n        },\n    ].filter(a => a.price !== 0);\n\n    if (all.length > 0) {\n        all.unshift({\n            name: 'Totaalprijs',\n            price: balance.price + laterBalance.price,\n        });\n    }\n\n    if (laterBalance.priceOpen > 0) {\n        all.push({\n            name: 'Later te betalen',\n            price: laterBalance.priceOpen,\n        });\n    }\n\n    return [\n        ...all,\n        {\n            name: balance.priceOpen < 0 ? (isPayable ? 'Terug te krijgen' : 'Terug te betalen') : (laterBalance.priceOpen !== 0 ? 'Nu te betalen' : 'Te betalen'),\n            price: Math.abs(balance.priceOpen),\n        },\n    ];\n});\n\n</script>\n","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M5.36989%2016.8401C8.68494%2016.8401%2010.3425%2014.6301%2012%2012.42H1V16.8401H5.36989Z'%20fill='url(%23paint0_linear_14409_1384)'/%3e%3cpath%20d='M18.6301%208C15.3151%208%2013.6575%2010.21%2012%2012.4201H23V8H18.6301Z'%20fill='url(%23paint1_linear_14409_1384)'/%3e%3cdefs%3e%3clinearGradient%20id='paint0_linear_14409_1384'%20x1='3.22495'%20y1='14.8341'%20x2='11.2719'%20y2='11.8453'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23005AB9'/%3e%3cstop%20offset='1'%20stop-color='%231E3764'/%3e%3c/linearGradient%3e%3clinearGradient%20id='paint1_linear_14409_1384'%20x1='12.666'%20y1='12.8035'%20x2='21.2102'%20y2='9.88837'%20gradientUnits='userSpaceOnUse'%3e%3cstop%20stop-color='%23FBA900'/%3e%3cstop%20offset='1'%20stop-color='%23FFD800'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20clip-path='url(%23clip0_14409_1388)'%3e%3cpath%20d='M15.879%205.28717L13.1224%205.05594L3.86145%204.91663V19.1667H13.747L17.0412%2018.2709L19.2836%2016.327L20.3804%2013.2695V9.73693L18.7401%206.89873L15.879%205.28717Z'%20fill='white'/%3e%3cpath%20d='M4.15403%205.15569V18.7282H12.4001C17.3795%2018.7282%2020.0883%2016.4087%2020.0883%2011.9246C20.0883%207.31649%2017.1521%205.15569%2012.4001%205.15569H4.15403V5.15569ZM12.4001%204.45129C19.7024%204.45129%2020.7928%209.13393%2020.7928%2011.9246C20.7928%2016.7665%2017.8124%2019.4329%2012.4001%2019.4329C12.4001%2019.4329%203.62615%2019.4329%203.44946%2019.4329C3.44946%2019.2555%203.44946%204.62824%203.44946%204.45129C3.62615%204.45129%2012.4001%204.45129%2012.4001%204.45129Z'%20fill='%230A0B09'/%3e%3cpath%20d='M9.24146%209.82032C9.24146%2010.2447%209.24146%2010.9276%209.24146%2011.3518C9.474%2011.3518%209.71153%2011.3518%209.71153%2011.3518C10.0372%2011.3518%2010.338%2011.2577%2010.338%2010.574C10.338%209.90596%2010.0033%209.82032%209.71153%209.82032C9.71153%209.82032%209.474%209.82032%209.24146%209.82032V9.82032ZM17.083%209.05859H17.8434C17.8434%209.05859%2017.8434%2010.7922%2017.8434%2011.3518C18.012%2011.3518%2018.4751%2011.3518%2018.9702%2011.3518C18.6611%207.19076%2015.3877%206.29175%2012.4134%206.29175H9.24211V9.06016H9.71153C10.5673%209.06016%2011.0991%209.6405%2011.0991%2010.574C11.0991%2011.5372%2010.5801%2012.1121%209.71153%2012.1121H9.24211V17.6515H12.4134C17.2494%2017.6515%2018.9323%2015.4058%2018.9918%2012.1121H17.083V9.05859V9.05859ZM14.9644%2010.7624H15.5145L15.263%209.89919H15.2173L14.9644%2010.7624ZM13.7778%2012.113L14.6986%209.05848H15.7804L16.701%2012.113H15.9094L15.7368%2011.5221H14.7422L14.5691%2012.113H13.7778ZM13.4126%2011.3518V12.1121H11.5315V9.05973H13.3519V9.81978C13.3519%209.81978%2012.704%209.81978%2012.2919%209.81978C12.2919%209.92458%2012.2919%2010.0448%2012.2919%2010.1736H13.2944V10.9335H12.2919C12.2919%2011.0861%2012.2919%2011.2299%2012.2919%2011.3518C12.7159%2011.3518%2013.4126%2011.3518%2013.4126%2011.3518V11.3518Z'%20fill='%23D50172'/%3e%3cpath%20d='M8.24633%2010.5847C8.24633%2011.4909%207.51205%2012.2256%206.60585%2012.2256C5.70008%2012.2256%204.96509%2011.4909%204.96509%2010.5847C4.96509%209.6792%205.70008%208.94421%206.60585%208.94421C7.51205%208.94421%208.24633%209.6792%208.24633%2010.5847ZM5.28987%2017.6491H7.92961V12.9499H5.28987V17.6491Z'%20fill='black'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0_14409_1388'%3e%3crect%20width='18.2422'%20height='15.8844'%20fill='white'%20transform='translate(3%204)'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","<template>\n    <STListItem :selectable=\"true\" :class=\"'right-stack ' +payment.theme\" @click=\"openPayment(payment)\">\n        <template #left>\n            <PaymentMethodIcon :method=\"payment.method\" :type=\"payment.type\">\n                <span v-if=\"payment.type !== PaymentType.Payment && payment.method !== PaymentMethod.Unknown\" :class=\"'icon small stroke primary ' + PaymentTypeHelper.getIcon(payment.type)\" />\n                <span v-if=\"payment.status === PaymentStatus.Failed\" class=\"icon disabled small error stroke\" />\n                <span v-if=\"payment.status === PaymentStatus.Pending || payment.status === PaymentStatus.Created\" class=\"icon hourglass small primary stroke\" />\n            </PaymentMethodIcon>\n        </template>\n\n        <p v-if=\"payment.type !== PaymentType.Payment && payment.method !== PaymentMethod.Unknown\" class=\"style-title-prefix-list\">\n            <span>{{ PaymentTypeHelper.getName(payment.type) }}</span>\n        </p>\n\n        <h3 class=\"style-title-list\">\n            {{ payment.title }}\n        </h3>\n\n        <p v-if=\"payment instanceof PaymentGeneral && payment.getShortDescription()\" class=\"style-description-small\">\n            {{ payment.getShortDescription() }}\n        </p>\n\n        <p v-if=\"!payment.paidAt || formatDate(payment.createdAt) !== formatDate(payment.paidAt)\" class=\"style-description-small\">\n            Aangemaakt op {{ formatDate(payment.createdAt) }}\n        </p>\n        <p v-if=\"payment.paidAt\" class=\"style-description-small\">\n            Betaald op {{ formatDate(payment.paidAt) }}\n        </p>\n        <p v-if=\"payment.price && price !== null && price !== payment.price\" class=\"style-description-small\">\n            Betaling van {{ formatPrice(payment.price) }}\n        </p>\n\n        <template #right>\n            <span class=\"style-price-base\" :class=\"{negative: (price ?? payment.price) < 0}\">{{ formatPrice(price ?? payment.price) }}</span>\n            <span class=\"icon arrow-right-small gray\" />\n        </template>\n    </STListItem>\n</template>\n\n<script setup lang=\"ts\">\nimport { ComponentWithProperties, NavigationController, usePresent } from '@simonbackx/vue-app-navigation';\nimport { Payment, PaymentGeneral, PaymentMethod, PaymentMethodHelper, PaymentStatus, PaymentType, PaymentTypeHelper } from '@stamhoofd/structures';\nimport AsyncPaymentView from '../AsyncPaymentView.vue';\nimport PaymentMethodIcon from './PaymentMethodIcon.vue';\n\nconst props = withDefaults(\n    defineProps<{\n        payment: PaymentGeneral | Payment;\n        price?: number | null;\n        payments?: (PaymentGeneral | Payment)[];\n    }>(), {\n        payments: () => [],\n        price: null,\n    },\n);\n\nconst present = usePresent();\n\nasync function openPayment(payment: PaymentGeneral | Payment) {\n    await present({\n        components: [\n            new ComponentWithProperties(NavigationController, {\n                root: new ComponentWithProperties(AsyncPaymentView, {\n                    payment,\n                    getNext: (payment: PaymentGeneral | Payment) => {\n                        const index = props.payments.findIndex(p => p.id === payment.id);\n                        if (index === -1 || index === props.payments.length - 1) {\n                            return null;\n                        }\n                        return props.payments[index + 1];\n                    },\n                    getPrevious: (payment: PaymentGeneral | Payment) => {\n                        const index = props.payments.findIndex(p => p.id === payment.id);\n                        if (index === -1 || index === 0) {\n                            return null;\n                        }\n                        return props.payments[index - 1];\n                    },\n                }),\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\n</script>\n","<template>\n    <SaveView :title=\"title\" :disabled=\"!hasChanges && !isNew\" class=\"edit-balance-item-view\" :loading=\"loading\" @save=\"save\">\n        <h1>\n            {{ title }}\n        </h1>\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <p v-if=\"!hasPayments(patchedBalanceItem)\" class=\"warning-box\">\n            Een afrekening (= de schuld) wijzigen die al gebruikt werd in een aangemaakte betaling (= hoe de schuld betaald werd) zal enkel het openstaande bedrag wijzigen. Een betaling is niet meer aanpasbaar na het aanmaken ervan. Indien je het bedrag van een betaling wilt wijzigen moet je ofwel een extra betaling aanmaken voor het verschil of de betaling annuleren en opnieuw aanmaken.\n        </p>\n\n        <div class=\"split-inputs\">\n            <div>\n                <STInputBox title=\"Beschrijving\" error-fields=\"description\" :error-box=\"errors.errorBox\">\n                    <input\n                        ref=\"firstInput\"\n                        v-model=\"description\"\n                        class=\"input\"\n                        type=\"text\"\n                        placeholder=\"Bv. Aankoop T-shirt\"\n                        autocomplete=\"off\"\n                        :disabled=\"!!balanceItem.relations.size\"\n                    >\n                </STInputBox>\n                <p v-if=\"balanceItem.relations.size\" class=\"style-description-small\">\n                    Dit is een verschuldigd bedrag dat automatisch werd aangemaakt door {{ platform.config.name }}\n                </p>\n            </div>\n            <div>\n                <STInputBox title=\"Verschuldigd sinds\" error-fields=\"createdAt\" :error-box=\"errors.errorBox\">\n                    <DateSelection v-model=\"createdAt\" />\n                </STInputBox>\n            </div>\n        </div>\n\n        <div class=\"split-inputs\">\n            <STInputBox title=\"Eenheidsprijs\" error-fields=\"unitPrice\" :error-box=\"errors.errorBox\">\n                <PriceInput v-model=\"unitPrice\" placeholder=\"Gratis\" :min=\"null\" />\n            </STInputBox>\n\n            <STInputBox title=\"Aantal\" error-fields=\"amount\" :error-box=\"errors.errorBox\">\n                <NumberInput v-model=\"amount\" placeholder=\"1\" :min=\"Math.min(1, balanceItem.amount)\" :stepper=\"true\" />\n            </STInputBox>\n        </div>\n        <template v-if=\"$feature('member-trials') && (patchedBalanceItem.price >= 0 || dueAt !== null)\">\n            <STInputBox title=\"Te betalen tegen*\" error-fields=\"dueAt\" :error-box=\"errors.errorBox\">\n                <DateSelection v-model=\"dueAt\" :required=\"false\" placeholder=\"Onmiddelijk\" :time=\"{hours: 0, minutes: 0, seconds: 0}\" />\n            </STInputBox>\n            <p class=\"style-description-small\">\n                {{ $t('15b6f0c8-6287-4b4d-bf34-4da2f4a0e575') }}\n            </p>\n        </template>\n        <PriceBreakdownBox :price-breakdown=\"patchedBalanceItem.priceBreakown\" />\n\n        <template v-if=\"family && family.members.length >= (originalMemberId ? 2 : 1)\">\n            <hr>\n            <h2>Lid</h2>\n            <p>Selecteer welk lid het bedrag verschuldigd is.</p>\n\n            <p v-if=\"!memberId\" class=\"warning-box\">\n                Je koppelt een verschuldigd bedrag best aan een lid en niet aan een account. Dan kan iedereen binnen het gezin het openstaande bedrag betalen.\n            </p>\n\n            <STList>\n                <STListItem v-for=\"m in family.members\" :key=\"m.id\" :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio v-model=\"memberId\" :value=\"m.id\" />\n                    </template>\n\n                    <h3 class=\"style-title-list\">\n                        {{ m.patchedMember.name }}\n                    </h3>\n                    <p class=\"style-description-small\" v-if=\"!memberId\">\n                        Lid\n                    </p>\n                </STListItem>\n\n                <STListItem v-if=\"user\" :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio v-model=\"memberId\" :value=\"null\" />\n                    </template>\n\n                    <h3 class=\"style-title-list\">\n                        {{ user.name }} ({{ user.email }})\n                    </h3>\n                    <p class=\"style-description-small\">\n                        Account\n                    </p>\n                </STListItem>\n            </STList>\n        </template>\n\n        <template v-if=\"!isNew && hasPayments(patchedBalanceItem)\">\n            <hr>\n            <h2>Betalingen</h2>\n            <p>Een openstaand bedrag kan door een lid betaald worden via het ledenportaal. Daar kan men via één van de ingestelde betaalmethodes afrekenen. Meerdere openstaande bedragen (ook over meerdere leden heen als een account meerdere leden beheert) kunnen in één keer betaald worden, vandaar dat het bedrag van een betaling vaak hoger is dan het bedrag van een individuele afrekening.</p>\n\n            <p v-if=\"patchedBalanceItem.payments.length === 0\" class=\"info-box\">\n                Er werd nog geen betaling aangemaakt voor deze afrekening\n            </p>\n\n            <STList v-else>\n                <PaymentRow v-for=\"payment of sortedPayments\" :key=\"payment.id\" :payment=\"payment.payment\" :payments=\"patchedBalanceItem.payments.map(b => b.payment)\" :price=\"payment.payment.isFailed ? 0 : payment.price\" />\n            </STList>\n\n            <template v-if=\"outstanding.pending === 0 && outstanding.paid === 0\">\n                <hr>\n                <h2>Acties</h2>\n\n                <STList>\n                    <STListItem :selectable=\"true\" @click=\"doDelete\">\n                        <h2 class=\"style-title-list\">\n                            Verwijder deze aanrekening\n                        </h2>\n                        <template #right>\n                            <button type=\"button\" class=\"button secundary danger hide-smartphone\">\n                                <span class=\"icon trash\" />\n                                <span>Verwijderen</span>\n                            </button>\n                            <button type=\"button\" class=\"button icon trash only-smartphone\" />\n                        </template>\n                    </STListItem>\n                </STList>\n            </template>\n        </template>\n    </SaveView>\n</template>\n\n<script lang=\"ts\" setup>\nimport { AutoEncoderPatchType, Decoder } from '@simonbackx/simple-encoding';\nimport { usePop } from '@simonbackx/vue-app-navigation';\nimport { CenteredMessage, DateSelection, ErrorBox, NumberInput, PriceBreakdownBox, PriceInput, useContext, useErrors, useOrganization, usePatch, usePlatform, usePlatformFamilyManager } from '@stamhoofd/components';\nimport { useRequestOwner } from '@stamhoofd/networking';\nimport { BalanceItem, BalanceItemStatus, BalanceItemWithPayments, PlatformFamily, UserWithMembers } from '@stamhoofd/structures';\nimport { Sorter } from '@stamhoofd/utility';\nimport { Ref, computed, ref } from 'vue';\nimport PaymentRow from './components/PaymentRow.vue';\n\nconst props = defineProps<{\n    balanceItem: BalanceItemWithPayments | BalanceItem;\n    isNew: boolean;\n    saveHandler: ((patch: AutoEncoderPatchType<BalanceItem>) => Promise<void>);\n}>();\n\nconst { hasChanges, addPatch, patch, patched: patchedBalanceItem } = usePatch(props.balanceItem);\nconst family = ref(null) as Ref<PlatformFamily | null>;\nconst platformFamilyManager = usePlatformFamilyManager();\nconst organization = useOrganization();\nconst platform = usePlatform();\nconst loading = ref(false);\nconst errors = useErrors();\nconst pop = usePop();\nconst context = useContext();\nconst owner = useRequestOwner();\n\n// Load mmeber on load\nloadMember().catch(console.error);\nloadFamilyFromUser().catch(console.error);\n\nconst title = computed(() => {\n    if (patchedBalanceItem.value.price < 0) {\n        return props.isNew ? 'Terug te betalen bedrag toevoegen' : 'Terug te betalen bedrag bewerken';\n    }\n    return props.isNew ? 'Verschuldigd bedrag toevoegen' : 'Verschuldigd bedrag bewerken';\n});\n\nconst sortedPayments = computed(() => {\n    if (!hasPayments(patchedBalanceItem.value)) {\n        return [];\n    }\n    return patchedBalanceItem.value.payments.slice().sort((a, b) => Sorter.byDateValue(a.payment.paidAt ?? a.payment.createdAt, b.payment.paidAt ?? b.payment.createdAt));\n});\n\nconst description = computed({\n    get: () => patchedBalanceItem.value.description,\n    set: value => addPatch({ description: value }),\n});\n\nconst unitPrice = computed({\n    get: () => patchedBalanceItem.value.unitPrice,\n    set: value => addPatch({ unitPrice: value }),\n});\n\nconst amount = computed({\n    get: () => patchedBalanceItem.value.amount,\n    set: value => addPatch({ amount: value }),\n});\n\nconst createdAt = computed({\n    get: () => patchedBalanceItem.value.createdAt,\n    set: value => addPatch({ createdAt: value }),\n});\n\nconst dueAt = computed({\n    get: () => patchedBalanceItem.value.dueAt,\n    set: value => addPatch({ dueAt: value }),\n});\n\nconst memberId = computed({\n    get: () => patchedBalanceItem.value.memberId,\n    set: value => addPatch({ memberId: value }),\n});\n\nconst originalMemberId = computed(\n    () => props.balanceItem.memberId,\n);\n\nconst user = ref(null) as Ref<UserWithMembers | null>;\n\nconst outstanding = computed(() => {\n    const paid = patchedBalanceItem.value.pricePaid;\n    const pending = patchedBalanceItem.value.pricePending;\n    const remaining = patchedBalanceItem.value.price - paid - pending;\n\n    return {\n        paid,\n        pending,\n        remaining,\n    };\n});\n\nfunction hasPayments(balanceItem: BalanceItemWithPayments | BalanceItem): balanceItem is BalanceItemWithPayments {\n    return (balanceItem instanceof BalanceItemWithPayments);\n}\n\nasync function save() {\n    if (loading.value) {\n        return;\n    }\n    errors.errorBox = null;\n    loading.value = true;\n\n    try {\n        const valid = await errors.validator.validate();\n        if (!valid) {\n            loading.value = false;\n            return;\n        }\n        await props.saveHandler(patch.value);\n        await pop({ force: true });\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    loading.value = false;\n}\n\nasync function doDelete() {\n    if (loading.value) {\n        return;\n    }\n    if (!(await CenteredMessage.confirm('Deze aanrekening verwijderen?', 'Verwijderen', 'Je kan dit niet ongedaan maken.'))) {\n        return;\n    }\n    if (loading.value) {\n        return;\n    }\n\n    errors.errorBox = null;\n\n    try {\n        loading.value = true;\n        await props.saveHandler(BalanceItemWithPayments.patch({\n            status: BalanceItemStatus.Hidden,\n            price: 0,\n        }));\n        await pop({ force: true });\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    loading.value = false;\n}\n\nasync function loadMember() {\n    if (!props.balanceItem.memberId) {\n        return;\n    }\n    try {\n        const familyBlob = await platformFamilyManager.loadFamilyBlob(props.balanceItem.memberId);\n        family.value = PlatformFamily.create(familyBlob, {\n            contextOrganization: organization.value,\n            platform: platform.value,\n        });\n    }\n    catch (e) {\n        console.error(e);\n        return;\n    }\n}\n\nasync function loadFamilyFromUser() {\n    if (!props.balanceItem.userId) {\n        return;\n    }\n    try {\n        const response = await context.value.authenticatedServer.request({\n            method: 'GET',\n            path: '/user/' + props.balanceItem.userId,\n            decoder: UserWithMembers as Decoder<UserWithMembers>,\n            owner,\n        });\n\n        const blob = response.data.members;\n        blob.markReceivedFromBackend();\n\n        user.value = response.data;\n        family.value = PlatformFamily.create(blob, {\n            contextOrganization: organization.value,\n            platform: platform.value,\n        });\n    }\n    catch (e) {\n        console.error(e);\n        return;\n    }\n}\n</script>\n","<template>\n    <STInputBox :title=\"title\" error-fields=\"iban\" :error-box=\"errorBox\">\n        <input v-model=\"ibanRaw\" class=\"input\" type=\"text\" :class=\"{ error: !valid }\" :placeholder=\"placeholder !== null ? placeholder : $t('0c63751f-8cd1-48af-a8a6-2b6a02447d63')\" :autocomplete=\"autocomplete\" @change=\"validate\">\n    </STInputBox>\n</template>\n\n<script lang=\"ts\">\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { Component, Prop, VueComponent, Watch } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport {ErrorBox} from \"../errors/ErrorBox\";\nimport {Validator} from \"../errors/Validator\";\nimport STInputBox from \"./STInputBox.vue\";\n\n@Component({\n    components: {\n        STInputBox\n    }\n})\nexport default class IBANInput extends VueComponent {\n    @Prop({ default: \"\" }) \n        title: string;\n\n    @Prop({ default: null }) \n        validator: Validator | null\n    \n    ibanRaw = \"\";\n    valid = true;\n\n    @Prop({ default: null })\n        modelValue!: string | null\n\n    @Prop({ default: true })\n        required!: boolean\n\n    @Prop({ default: null })\n        placeholder!: string | null\n\n    @Prop({ default: \"email\" })\n        autocomplete!: string\n\n    errorBox: ErrorBox | null = null\n\n    @Watch('modelValue')\n    onValueChanged(val: string | null) {\n        if (val === null) {\n            return\n        }\n        this.ibanRaw = val\n    }\n\n    mounted() {\n        if (this.validator) {\n            this.validator.addValidation(this, () => {\n                return this.validate()\n            })\n        }\n\n        this.ibanRaw = this.modelValue ?? \"\"\n    }\n\n    unmounted() {\n        if (this.validator) {\n            this.validator.removeValidation(this)\n        }\n    }\n\n    async validate() {\n        this.ibanRaw = this.ibanRaw.trim().toUpperCase().replace(/\\s/g, \" \") // replacement is needed because some apps use non breaking spaces when copying\n\n        if (!this.required && this.ibanRaw.length === 0) {\n            this.errorBox = null\n            this.$emit('update:modelValue', null)\n            return true\n        }\n\n        const ibantools = await import(/* webpackChunkName: \"ibantools\" */ 'ibantools');\n        const iban = ibantools.electronicFormatIBAN(this.ibanRaw); // 'NL91ABNA0517164300'\n        \n        if (iban === null || !ibantools.isValidIBAN(iban)) {\n            if (this.ibanRaw.length === 0) {\n                if (STAMHOOFD.environment === 'development') {\n                    this.ibanRaw = \"BE42631299159354\"\n                    this.errorBox = new ErrorBox(new SimpleError({\n                        \"code\": \"invalid_field\",\n                        \"message\": \"Vul een rekeningnummer in - automatisch willekeurig rekeningnummer ingevuld\",\n                        \"field\": \"iban\"\n                    }))\n                    return false\n\n                }\n                this.errorBox = new ErrorBox(new SimpleError({\n                    \"code\": \"invalid_field\",\n                    \"message\": \"Vul een rekeningnummer in\",\n                    \"field\": \"iban\"\n                }))\n            } else {\n                this.errorBox = new ErrorBox(new SimpleError({\n                    \"code\": \"invalid_field\",\n                    \"message\": \"Ongeldig rekeningnummer: \"+this.ibanRaw,\n                    \"field\": \"iban\"\n                }))\n            }\n            \n            return false\n\n        } else {\n            this.ibanRaw = ibantools.friendlyFormatIBAN(iban) ?? iban\n            this.$emit('update:modelValue', this.ibanRaw)\n            this.errorBox = null\n            return true\n        }\n    }\n}\n</script>\n","<template>\n    <LoadingViewTransition :loading=\"loadingView\" :error-box=\"errorBox\">\n        <form class=\"st-view\" @submit.prevent=\"$emit('save')\">\n            <STNavigationBar :title=\"title\" :disable-pop=\"true\" :disable-dismiss=\"true\">\n                <template v-if=\"canPop || (!preferLargeButton && ($isMobile || $isIOS || $isAndroid))\" #left>\n                    <BackButton v-if=\"canPop\" @click=\"pop\" />\n                    <button v-else-if=\"$isAndroid\" class=\"button navigation icon close\" type=\"button\" @click=\"pop\" />\n                    <button v-else class=\"button text selected unbold\" type=\"button\" @click=\"pop\">\n                        {{ cancelText }}\n                    </button>\n                </template>\n\n                <template #right>\n                    <template v-if=\"!$isMobile && !$isIOS\">\n                        <slot name=\"buttons\" />\n                    </template>\n                    <LoadingButton v-if=\"canDelete\" :loading=\"deleting\">\n                        <button class=\"button icon trash navigation\" type=\"button\" :disabled=\"deleting\" @click=\"$emit('delete')\" />\n                    </LoadingButton>\n                    <LoadingButton v-if=\"!preferLargeButton && ($isMobile || $isIOS || $isAndroid)\" :loading=\"loading\">\n                        <button class=\"button navigation highlight\" :disabled=\"disabled\" type=\"submit\">\n                            {{ saveText }}\n                        </button>\n                    </LoadingButton>\n                    <template v-else-if=\"canDismiss && !(!preferLargeButton && ($isMobile || $isIOS || $isAndroid))\">\n                        <button v-if=\"!$isIOS\" class=\"button navigation icon close\" type=\"button\" @click=\"dismiss\" />\n                        <button v-else class=\"button text selected unbold\" type=\"button\" @click=\"dismiss\">\n                            {{ cancelText }}\n                        </button>\n                    </template>\n                </template>\n            </STNavigationBar>\n            <main class=\"center\" :class=\"mainClass\">\n                <slot />\n            </main>\n            <STToolbar v-if=\"preferLargeButton || (!$isMobile && !$isIOS && !$isAndroid)\">\n                <template #left>\n                    <slot name=\"left\" />\n                </template>\n                <template #right>\n                    <div v-if=\"$slots.toolbar\" class=\"editor-button-bar\">\n                        <slot name=\"toolbar\" />\n                    </div>\n                    <button v-else-if=\"!$slots.toolbar && addExtraCancel && (canPop || canDismiss) && cancelText !== null\" class=\"button secundary\" type=\"button\" @click=\"pop\">\n                        {{ cancelText }}\n                    </button>\n                    <LoadingButton :loading=\"loading\">\n                        <button class=\"button\" :class=\"saveButtonClass\" :disabled=\"disabled\" type=\"submit\">\n                            <span v-if=\"saveIcon\" class=\"icon \" :class=\"saveIcon\" />\n                            <span>{{ saveText }}</span>\n                            <span v-if=\"saveIconRight\" class=\"icon \" :class=\"saveIconRight\" />\n                            <span v-if=\"saveBadge\" class=\"bubble\" v-text=\"saveBadge\" />\n                        </button>\n                    </LoadingButton>\n                </template>\n            </STToolbar>\n            <STButtonToolbar v-else-if=\"!!$slots.buttons || !!$slots.toolbar\" class=\"sticky\">\n                <slot name=\"buttons\" />\n                <slot name=\"toolbar\" />\n            </STButtonToolbar>\n        </form>\n    </LoadingViewTransition>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useCanDismiss, useCanPop, useDismiss, usePop } from '@simonbackx/vue-app-navigation';\nimport { computed, getCurrentInstance } from 'vue';\nimport LoadingViewTransition from '../containers/LoadingViewTransition.vue';\nimport { ErrorBox } from '../errors/ErrorBox';\nimport BackButton from './BackButton.vue';\nimport LoadingButton from './LoadingButton.vue';\nimport STButtonToolbar from './STButtonToolbar.vue';\nimport STNavigationBar from './STNavigationBar.vue';\nimport STToolbar from './STToolbar.vue';\nimport { useKeyDown } from '../hooks';\n\nwithDefaults(\n    defineProps<{\n        loading?: boolean;\n        loadingView?: boolean;\n        errorBox?: ErrorBox | null;\n        deleting?: boolean;\n        disabled?: boolean;\n        title?: string;\n        saveText?: string;\n        saveIcon?: string | null;\n        saveButtonClass?: string | null;\n        saveIconRight?: string | null;\n        saveBadge?: string | null;\n        cancelText?: string | null;\n        preferLargeButton?: boolean;\n        addExtraCancel?: boolean;\n        mainClass?: string;\n    }>(), {\n        loading: false,\n        loadingView: false,\n        errorBox: null,\n        deleting: false,\n        disabled: false,\n        title: '',\n        saveText: 'Opslaan',\n        saveIcon: null,\n        saveButtonClass: 'primary',\n        saveIconRight: null,\n        saveBadge: null,\n        cancelText: 'Annuleren',\n        preferLargeButton: false,\n        addExtraCancel: false,\n        mainClass: '',\n    },\n);\n\nconst canDelete = computed(() => {\n    // Check has delete listener\n    return !!getCurrentInstance()?.vnode.props?.onDelete;\n});\n\nconst canDismiss = useCanDismiss();\nconst canPop = useCanPop();\nconst dismiss = useDismiss();\nconst pop = usePop();\nconst emit = defineEmits(['save', 'delete']);\n\n// CMD + S = Save\nuseKeyDown((key, modifiers) => {\n    if (key === 's' && (modifiers.ctrl || modifiers.meta)) {\n        void emit('save');\n        return true;\n    }\n    return false;\n});\n</script>\n","<template>\n    <STList>\n        <STListItem v-for=\"item in filteredBalanceItems\" :key=\"item.id\" element-name=\"label\" :selectable=\"true\" class=\"right-stack no-margin\">\n            <template #left>\n                <Checkbox :model-value=\"isItemSelected(item)\" :disabled=\"isPayable && item.priceOpen < 0\" @update:model-value=\"setItemSelected(item, $event)\" />\n            </template>\n\n            <BalanceItemTitleBox :item=\"item\" :is-payable=\"isPayable\" />\n\n            <template #right>\n                <div v-if=\"isItemSelected(item)\">\n                    <p v-if=\"isPayable && getItemPrice(item) < 0\" class=\"style-price-base\">\n                        {{ formatPrice(getItemPrice(item)) }}\n                    </p>\n                    <PriceInput v-else :model-value=\"getItemPrice(item)\" placeholder=\"0 euro\" :min=\"item.priceOpen < 0 ? item.priceOpen : 0\" :max=\"item.priceOpen >= 0 ? item.priceOpen : 0\" @update:model-value=\"setItemPrice(item, $event)\" />\n                </div>\n                <template v-else>\n                    <p class=\"style-discount-old-price disabled\">\n                        ({{ formatPrice(item.priceOpen) }})\n                    </p>\n                </template>\n            </template>\n        </STListItem>\n    </STList>\n\n    <PriceBreakdownBox :price-breakdown=\"priceBreakdown\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { PriceBreakdownBox, PriceInput } from '@stamhoofd/components';\nimport { BalanceItem, BalanceItemPaymentDetailed } from '@stamhoofd/structures';\nimport { computed, nextTick, onMounted } from 'vue';\nimport BalanceItemTitleBox from './BalanceItemTitleBox.vue';\n\nconst props = defineProps<{\n    items: BalanceItem[];\n    list: BalanceItemPaymentDetailed[];\n    isPayable: boolean;\n}>();\n\nonMounted(async () => {\n    if (props.list.length === 0) {\n        // Default select\n        for (const item of props.items) {\n            if (item.isDue) {\n                setItemSelected(item, true);\n            }\n        }\n\n        await nextTick();\n\n        if (total.value <= 0) {\n            // Try to select due items\n            for (const item of props.items) {\n                if (!item.isDue) {\n                    setItemSelected(item, true);\n                    await nextTick();\n\n                    if (total.value > 0) {\n                        break;\n                    }\n                }\n            }\n        }\n    }\n});\n\nconst emit = defineEmits<{ (e: 'patch', patch: PatchableArrayAutoEncoder<BalanceItemPaymentDetailed>): void }>();\n\nconst filteredBalanceItems = computed(() => {\n    return BalanceItem.filterBalanceItems(props.items);\n});\n\nconst total = computed(() => {\n    return props.list.reduce((total, item) => total + item.price, 0);\n});\n\nconst priceBreakdown = computed(() => {\n    return [\n        {\n            name: 'Totaal',\n            price: total.value,\n        },\n    ];\n});\n\nfunction addPatch(p: PatchableArrayAutoEncoder<BalanceItemPaymentDetailed>) {\n    emit('patch', p);\n}\n\nfunction isItemSelected(item: BalanceItem) {\n    return props.list.some(i => i.balanceItem.id === item.id);\n}\n\nfunction setItemSelected(item: BalanceItem, selected: boolean) {\n    if (isItemSelected(item) === selected) {\n        return;\n    }\n\n    if (selected) {\n        const add = BalanceItemPaymentDetailed.create({\n            balanceItem: item,\n            price: item.priceOpen,\n        });\n        const arr: PatchableArrayAutoEncoder<BalanceItemPaymentDetailed> = new PatchableArray();\n        arr.addPut(add);\n        addPatch(arr);\n    }\n    else {\n        const q = props.list.find(p => p.balanceItem.id === item.id);\n        const id = q?.id;\n\n        if (id) {\n            const arr: PatchableArrayAutoEncoder<BalanceItemPaymentDetailed> = new PatchableArray();\n            arr.addDelete(id);\n            addPatch(arr);\n        }\n        else {\n            console.error('Could not find item to remove', item, q);\n        }\n    }\n}\n\nfunction getItemPrice(item: BalanceItem) {\n    return props.list.find(p => p.balanceItem.id === item.id)?.price ?? 0;\n}\n\nfunction setItemPrice(item: BalanceItem, price: number) {\n    setItemSelected(item, true);\n    const id = props.list.find(p => p.balanceItem.id === item.id)?.id;\n\n    if (id) {\n        const arr: PatchableArrayAutoEncoder<BalanceItemPaymentDetailed> = new PatchableArray();\n        arr.addPatch(BalanceItemPaymentDetailed.patch({\n            id,\n            price,\n        }));\n        addPatch(arr);\n    }\n}\n\n</script>\n","<template>\n    <SaveView :title=\"title\" :disabled=\"!hasChanges && !isNew\" class=\"edit-payment-view\" :loading=\"saving\" @save=\"save\">\n        <h1>\n            {{ title }}\n        </h1>\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <div class=\"split-inputs\">\n            <div>\n                <STInputBox title=\"Type\" error-fields=\"type\" :error-box=\"errors.errorBox\">\n                    <Dropdown v-model=\"type\">\n                        <option v-for=\"m in availableTypes\" :key=\"m\" :value=\"m\">\n                            {{ capitalizeFirstLetter(PaymentTypeHelper.getName(m)) }}\n                        </option>\n                    </Dropdown>\n                </STInputBox>\n\n                <STInputBox :title=\"type === PaymentType.Payment ? 'Betaalmethode' : 'Terugbetaalmethode'\" error-fields=\"method\" :error-box=\"errors.errorBox\">\n                    <Dropdown v-model=\"method\">\n                        <option v-for=\"m in availableMethods\" :key=\"m\" :value=\"m\">\n                            {{ PaymentMethodHelper.getNameCapitalized(m) }}\n                        </option>\n                    </Dropdown>\n                </STInputBox>\n\n                <STInputBox v-if=\"!isNew\" title=\"Status\" error-fields=\"status\" :error-box=\"errors.errorBox\">\n                    <Dropdown v-model=\"status\">\n                        <option v-for=\"m in availableStatuses\" :key=\"m\" :value=\"m\">\n                            {{ PaymentStatusHelper.getNameCapitalized(m) }}\n                        </option>\n                    </Dropdown>\n                </STInputBox>\n            </div>\n            <div>\n                <STInputBox v-if=\"status === 'Succeeded'\" :title=\"type === PaymentType.Payment ? 'Ontvangen op' : 'Terugbetaald op'\" error-fields=\"paidAt\" :error-box=\"errors.errorBox\">\n                    <DateSelection v-model=\"paidAt\" />\n                </STInputBox>\n            </div>\n        </div>\n\n        <template v-if=\"method === PaymentMethod.Transfer\">\n            <hr>\n            <h2 v-if=\"type === PaymentType.Payment\">\n                Overschrijvingsdetails\n            </h2>\n            <h2 v-else>\n                Overgeschreven via\n            </h2>\n\n            <STInputBox :title=\"type === PaymentType.Payment ? 'Begunstigde' : 'Naam rekening'\" error-fields=\"transferSettings.creditor\" :error-box=\"errors.errorBox\">\n                <input\n                    v-model=\"creditor\"\n                    class=\"input\"\n                    type=\"text\"\n                    placeholder=\"Naam bankrekeningnummer\"\n                    autocomplete=\"off\"\n                >\n            </STInputBox>\n\n            <IBANInput v-model=\"iban\" title=\"Bankrekeningnummer\" placeholder=\"Op deze rekening schrijft men over\" :validator=\"errors.validator\" :required=\"false\" />\n\n            <STInputBox title=\"Mededeling\" error-fields=\"transferDescription\" :error-box=\"errors.errorBox\">\n                <input\n                    ref=\"firstInput\"\n                    v-model=\"transferDescription\"\n                    class=\"input\"\n                    type=\"text\"\n                    placeholder=\"Bv. Aankoop x\"\n                    autocomplete=\"off\"\n                >\n            </STInputBox>\n        </template>\n\n        <hr>\n        <h2>Wat en hoeveel?</h2>\n        <p v-if=\"patchedPayment.type === PaymentType.Payment\">\n            Kies hieronder wat er precies betaald werd - en pas eventueel aan hoeveel. Dit is nodig om de boekhouding correct te houden en elke betaling te koppelen aan specifieke items.\n        </p>\n        <p v-else-if=\"patchedPayment.type === PaymentType.Reallocation\">\n            Bouw hieronder een balans op zodat het totaalbedrag 0 euro bedraagt.\n        </p>\n        <p v-else>\n            {{ $t('f24d4ba4-4b42-4fa1-b99f-4b90dd1a3208') }}\n        </p>\n\n        <SelectBalanceItemsList :items=\"balanceItems\" :list=\"patchedPayment.balanceItemPayments\" :is-payable=\"false\" @patch=\"addPatch({balanceItemPayments: $event})\" />\n\n        <STList v-if=\"createBalanceItem\">\n            <STListItem :selectable=\"true\" element-name=\"button\" @click=\"createBalanceItem\">\n                <template #left>\n                    <IconContainer icon=\"box\">\n                        <template #aside>\n                            <span class=\"icon add small primary\" />\n                        </template>\n                    </IconContainer>\n                </template>\n                <h3 class=\"style-title-list\">\n                    Item toevoegen\n                </h3>\n\n                <p class=\"style-description-small\">\n                    Voeg een item toe aan het openstaand bedrag of geef een tegoed\n                </p>\n\n                <template #right>\n                    <span class=\"icon arrow-right-small gray\" />\n                </template>\n            </STListItem>\n        </STList>\n    </SaveView>\n</template>\n\n<script lang=\"ts\" setup>\nimport { AutoEncoderPatchType } from '@simonbackx/simple-encoding';\nimport { usePop } from '@simonbackx/vue-app-navigation';\nimport { I18nController, useTranslate } from '@stamhoofd/frontend-i18n';\nimport { BalanceItem, BalanceItemRelationType, PaymentGeneral, PaymentMethod, PaymentMethodHelper, PaymentStatus, PaymentStatusHelper, PaymentType, PaymentTypeHelper, TransferSettings } from '@stamhoofd/structures';\n\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed, onMounted, ref } from 'vue';\nimport { ErrorBox } from '../errors/ErrorBox';\nimport STErrorsDefault from '../errors/STErrorsDefault.vue';\nimport { useErrors } from '../errors/useErrors';\nimport { useOrganization, usePatch } from '../hooks';\nimport IconContainer from '../icons/IconContainer.vue';\nimport DateSelection from '../inputs/DateSelection.vue';\nimport Dropdown from '../inputs/Dropdown.vue';\nimport IBANInput from '../inputs/IBANInput.vue';\nimport STInputBox from '../inputs/STInputBox.vue';\nimport STList from '../layout/STList.vue';\nimport STListItem from '../layout/STListItem.vue';\nimport SaveView from '../navigation/SaveView.vue';\nimport { CenteredMessage } from '../overlays/CenteredMessage';\nimport SelectBalanceItemsList from './SelectBalanceItemsList.vue';\n\nconst props = withDefaults(\n    defineProps<{\n        payment: PaymentGeneral;\n        balanceItems: BalanceItem[];\n        isNew?: boolean;\n        saveHandler: ((patch: AutoEncoderPatchType<PaymentGeneral>) => Promise<void>);\n        createBalanceItem?: null | (() => Promise<void>);\n    }>(), {\n        isNew: false,\n        createBalanceItem: null,\n    });\n\nconst { patched: patchedPayment, addPatch, hasChanges, patch } = usePatch(props.payment);\nconst organization = useOrganization();\nconst errors = useErrors();\nconst saving = ref(false);\nconst pop = usePop();\nconst $t = useTranslate();\n\nconst availableMethods = [\n    PaymentMethod.Transfer,\n    PaymentMethod.PointOfSale,\n];\n\nconst availableTypes = [\n    PaymentType.Payment,\n    PaymentType.Refund,\n];\n\nconst availableStatuses = [\n    PaymentStatus.Pending,\n    PaymentStatus.Succeeded,\n    PaymentStatus.Failed,\n];\n\nconst title = computed(() => {\n    if (props.isNew) {\n        return `${Formatter.capitalizeFirstLetter(PaymentTypeHelper.getName(patchedPayment.value.type))} registreren`;\n    }\n    return `${Formatter.capitalizeFirstLetter(PaymentTypeHelper.getName(patchedPayment.value.type))} aanpassen`;\n});\n\nconst method = computed({\n    get: () => patchedPayment.value.method ?? PaymentMethod.Unknown,\n    set: (method: PaymentMethod) => {\n        if (method === patchedPayment.value.method) {\n            return;\n        }\n        addPatch({\n            method,\n        });\n        updateMethod(method);\n    },\n});\n\nonMounted(() => {\n    if (props.isNew) {\n        // Set transfer settings default\n        updateMethod(props.payment.method);\n    }\n});\n\nfunction updateMethod(method: PaymentMethod) {\n    if (method === PaymentMethod.Transfer) {\n        if (props.payment.transferDescription) {\n            addPatch({\n                transferDescription: props.payment.transferDescription,\n                transferSettings: props.payment.transferSettings?.clone(),\n            });\n        }\n        else {\n            let transferSettings = organization.value?.meta.registrationPaymentConfiguration.transferSettings.fillMissing(TransferSettings.create({ creditor: organization.value.name })) ?? TransferSettings.create({ creditor: organization.value?.name });\n            const webshopId = props.balanceItems.find(b => b.relations.get(BalanceItemRelationType.Webshop))?.id;\n            if (webshopId) {\n                const webshop = organization.value?.webshops.find(w => w.id === webshopId);\n                if (webshop) {\n                    transferSettings = webshop.meta.paymentConfiguration.transferSettings.fillMissing(transferSettings);\n                }\n            }\n\n            addPatch({\n                transferDescription: transferSettings.generateDescription('', I18nController.shared.countryCode),\n                transferSettings: transferSettings,\n            });\n        }\n    }\n    else {\n        addPatch({\n            transferDescription: null,\n            transferSettings: null,\n        });\n    }\n}\n\nconst status = computed({\n    get: () => patchedPayment.value.status,\n    set: (status: PaymentStatus) => {\n        addPatch({\n            status,\n            paidAt: status === PaymentStatus.Succeeded ? (props.payment.paidAt ?? new Date()) : null,\n        });\n    },\n});\n\nconst type = computed({\n    get: () => patchedPayment.value.type,\n    set: (type) => {\n        addPatch({\n            type,\n        });\n    },\n});\n\nconst paidAt = computed({\n    get: () => patchedPayment.value.paidAt ?? new Date(),\n    set: (paidAt: Date) => {\n        addPatch({\n            paidAt,\n        });\n    },\n});\n\nconst transferDescription = computed({\n    get: () => patchedPayment.value.transferDescription ?? '',\n    set: (transferDescription: string) => {\n        addPatch({\n            transferDescription,\n        });\n    },\n});\n\nconst creditor = computed({\n    get: () => patchedPayment.value.transferSettings?.creditor ?? '',\n    set: (creditor: string) => {\n        addPatch({\n            transferSettings: TransferSettings.patch({\n                creditor,\n            }),\n        });\n    },\n});\n\nconst iban = computed({\n    get: () => patchedPayment.value.transferSettings?.iban ?? '',\n    set: (iban: string) => {\n        addPatch({\n            transferSettings: TransferSettings.patch({\n                iban,\n            }),\n        });\n    },\n});\n\nasync function save() {\n    if (saving.value) {\n        return;\n    }\n\n    saving.value = true;\n    try {\n        errors.errorBox = null;\n        if (!await errors.validator.validate()) {\n            saving.value = false;\n            return;\n        }\n        await props.saveHandler(patch.value);\n        await pop({ force: true });\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    finally {\n        saving.value = false;\n    }\n}\n\nconst shouldNavigateAway = async () => {\n    if (!hasChanges.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm($t('996a4109-5524-4679-8d17-6968282a2a75'), $t('106b3169-6336-48b8-8544-4512d42c4fd6'));\n};\ndefineExpose({\n    shouldNavigateAway,\n});\n</script>\n","<template>\n    <STList>\n        <BalanceItemRow v-for=\"group in groupedItems\" :key=\"group.id\" :has-write=\"hasWrite\" :item=\"group\" :is-payable=\"isPayable\" />\n    </STList>\n</template>\n\n<script setup lang=\"ts\">\nimport { DetailedPayableBalance, DetailedReceivableBalance, GroupedBalanceItems } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport BalanceItemRow from './BalanceItemRow.vue';\n\nconst props = defineProps<{\n    item: DetailedPayableBalance | DetailedReceivableBalance;\n}>();\nconst isPayable = props.item instanceof DetailedPayableBalance;\n\nconst items = computed(() => props.item.filteredBalanceItems);\nconst filteredItems = items;\nconst hasWrite = !isPayable;\n\nconst groupedItems = computed(() => {\n    return GroupedBalanceItems.group(filteredItems.value);\n});\n\n</script>\n","<template>\n    <STList>\n        <BalanceItemRow v-for=\"i in filteredItems\" :key=\"i.id\" :has-write=\"hasWrite\" :item=\"i\" :is-payable=\"false\" />\n    </STList>\n</template>\n\n<script lang=\"ts\" setup>\nimport { DetailedReceivableBalance } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport BalanceItemRow from './BalanceItemRow.vue';\nconst props = withDefaults(\n    defineProps<{\n        item: DetailedReceivableBalance;\n        hasWrite?: boolean;\n    }>(),\n    {\n        hasWrite: true,\n    },\n);\nconst items = computed(() => props.item.filteredBalanceItems);\nconst filteredItems = items;\n\n</script>\n","<template>\n    <LoadingBoxTransition :error-box=\"errors.errorBox\">\n        <div v-if=\"detailedItem\" class=\"container\">\n            <template v-if=\"detailedItem.filteredBalanceItems.length\">\n                <SegmentedControl v-if=\"!hideSegmentedControl\" v-model=\"selectedTab\" :items=\"['Gegroepeerd', 'Individueel']\" />\n                <ReceivableBalanceList v-if=\"selectedTab === 'Individueel'\" :item=\"detailedItem\" />\n                <GroupedBalanceList v-else :item=\"detailedItem\" />\n                <BalancePriceBreakdown :item=\"detailedItem\" />\n            </template>\n            <p v-else class=\"info-box\">\n                Geen openstaand bedrag\n            </p>\n\n            <STList v-if=\"hasWrite\">\n                <STListItem :selectable=\"true\" element-name=\"button\" @click=\"createBalanceItem\">\n                    <template #left>\n                        <IconContainer icon=\"box\">\n                            <template #aside>\n                                <span class=\"icon add small primary\" />\n                            </template>\n                        </IconContainer>\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        Item toevoegen\n                    </h3>\n                    <p class=\"style-description-small\">\n                        Voeg een item toe aan het openstaand bedrag of geef een tegoed\n                    </p>\n\n                    <template #right>\n                        <span class=\"icon arrow-right-small gray\" />\n                    </template>\n                </STListItem>\n\n                <STListItem v-if=\"detailedItem.amountOpen >= 0\" :selectable=\"true\" element-name=\"button\" @click=\"createPayment\">\n                    <template #left>\n                        <IconContainer icon=\"receive\">\n                            <template #aside>\n                                <span class=\"icon add small primary\" />\n                            </template>\n                        </IconContainer>\n                    </template>\n\n                    <h3 class=\"style-title-list\">\n                        Betaling registreren\n                    </h3>\n                    <p class=\"style-description-small\">\n                        Via een betaling kan je één of meerdere items markeren als betaald\n                    </p>\n\n                    <template #right>\n                        <span class=\"icon arrow-right-small gray\" />\n                    </template>\n                </STListItem>\n\n                <STListItem v-else :selectable=\"true\" element-name=\"button\" class=\"theme-error\" @click=\"createPayment\">\n                    <template #left>\n                        <IconContainer icon=\"undo\">\n                            <template #aside>\n                                <span class=\"icon add small primary\" />\n                            </template>\n                        </IconContainer>\n                    </template>\n\n                    <h3 class=\"style-title-list\">\n                        Terugbetaling registreren\n                    </h3>\n                    <p class=\"style-description-small\">\n                        Via een betaling kan je één of meerdere items markeren als betaald\n                    </p>\n\n                    <template #right>\n                        <span class=\"icon arrow-right-small gray\" />\n                    </template>\n                </STListItem>\n            </STList>\n\n            <template v-if=\"item.objectType === ReceivableBalanceType.member || item.objectType === ReceivableBalanceType.user\">\n                <hr>\n                <h2>Hoe kan men dit betalen?</h2>\n                <p>Leden kunnen hun openstaand bedrag betalen door naar het ledenportaal te gaan. Bovenaan zullen ze bij 'snelle acties' een knop zien waarmee ze hun openstaand bedrag kunnen betalen (je kan een e-mail sturen met een inlogknop om naar het ledenportaal te gaan).</p>\n                <p v-if=\"detailedItem.amountPending !== 0\" class=\"style-description-block\">\n                    Opgelet, het deel dat in verwerking is kan niet betaald worden via het ledenportaal. Je kan wel de betalingen die in verwerking zijn annuleren zodat ze via een andere betaalmethode betaald kunnen worden via het ledenportaal. Bijvoorbeeld een overschrijving die al lang niet betaald werd kan je annuleren om vervolgens een nieuw betaalverzoek te versturen van het openstaande bedrag.\n                </p>\n                <p v-if=\"detailedItem.amountOpen !== 0\" class=\"style-description-block\">\n                    Je kan zelf ook manueel een betaling toevoegen (bv. als er ter plaatse werd betaald, of via een overschrijving die niet in het systeem is opgenomen) via de knop 'Betaling/terugbetaling registreren' hierboven.\n                </p>\n            </template>\n\n            <template v-if=\"pendingPayments.length > 0\">\n                <hr>\n                <h2>In verwerking</h2>\n                <p>Bij betalingen via overschrijving of domiciliëring kan het even duren voor een betaling wordt bevestigd.</p>\n\n                <STList>\n                    <PaymentRow v-for=\"payment of pendingPayments\" :key=\"payment.id\" :payments=\"pendingPayments\" :payment=\"payment\" />\n                </STList>\n            </template>\n\n            <hr>\n            <h2>Betalingen</h2>\n\n            <p v-if=\"succeededPayments.length === 0\" class=\"info-box\">\n                Je hebt nog geen betalingen ontvangen\n            </p>\n\n            <STList v-else>\n                <PaymentRow v-for=\"payment of succeededPayments\" :key=\"payment.id\" :payment=\"payment\" :payments=\"succeededPayments\" />\n            </STList>\n\n            <hr>\n            <h2>Contactpersonen</h2>\n\n            <p>Deze personen ontvangen een e-mail bij elke communicatie rond dit openstaand bedrag.</p>\n\n            <STList v-if=\"detailedItem.object.contacts.length\" class=\"info\">\n                <STListItem v-for=\"(contact, index) of detailedItem.object.contacts\" :key=\"index\">\n                    <h3 class=\"style-definition-label\">\n                        {{ contact.firstName || 'Onbekende naam' }} {{ contact.lastName }}\n                    </h3>\n                    <p v-for=\"(email, j) of contact.emails\" :key=\"j\" v-copyable class=\"style-definition-text style-copyable\">\n                        {{ email }}\n                    </p>\n                </STListItem>\n            </STList>\n            <p v-else class=\"info-box\">\n                Geen contactpersonen gevonden\n            </p>\n        </div>\n    </LoadingBoxTransition>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ArrayDecoder, AutoEncoderPatchType, Decoder, PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, usePresent } from '@simonbackx/vue-app-navigation';\nimport { BalancePriceBreakdown, EditBalanceItemView, EditPaymentView, ErrorBox, GlobalEventBus, GroupedBalanceList, IconContainer, LoadingBoxTransition, PaymentRow, SegmentedControl, useContext, useErrors, usePlatformFamilyManager } from '@stamhoofd/components';\nimport { useRequestOwner } from '@stamhoofd/networking';\nimport { BalanceItemWithPayments, DetailedReceivableBalance, PaymentCustomer, PaymentGeneral, PaymentMethod, PaymentStatus, PaymentType, PlatformMember, ReceivableBalance, ReceivableBalanceType } from '@stamhoofd/structures';\nimport { Sorter } from '@stamhoofd/utility';\nimport { computed, onMounted, ref, Ref } from 'vue';\nimport ReceivableBalanceList from './ReceivableBalanceList.vue';\n\nconst props = withDefaults(\n    defineProps<{\n        item: ReceivableBalance;\n        member?: PlatformMember | null;\n        hideSegmentedControl?: boolean;\n    }>(),\n    {\n        member: null,\n        hideSegmentedControl: true,\n    });\n\nconst errors = useErrors();\nconst detailedItem = ref(null) as Ref<null | DetailedReceivableBalance>;\nconst context = useContext();\nconst selectedTab = ref(props.hideSegmentedControl ? 'Individueel' : 'Gegroepeerd') as Ref<'Gegroepeerd' | 'Individueel'>;\nconst owner = useRequestOwner();\nconst hasWrite = true;\nconst present = usePresent();\n\nconst pendingPayments = computed(() => {\n    return detailedItem.value?.payments.filter(p => p.isPending).sort((a, b) => Sorter.byDateValue(a.createdAt, b.createdAt)) ?? [];\n});\n\nconst succeededPayments = computed(() => {\n    return detailedItem.value?.payments.filter(p => !p.isPending).sort((a, b) => Sorter.byDateValue(a.paidAt ?? a.createdAt, b.paidAt ?? b.createdAt)) ?? [];\n});\n\n// Load detailed item\nonMounted(async () => {\n    await reload();\n});\n\nasync function reload() {\n    try {\n        const response = await context.value.authenticatedServer.request({\n            method: 'GET',\n            path: `/receivable-balances/${props.item.objectType}/${props.item.object.id}`,\n            decoder: DetailedReceivableBalance as Decoder<DetailedReceivableBalance>,\n            owner,\n        });\n\n        if (!detailedItem.value) {\n            detailedItem.value = response.data;\n\n            if (detailedItem.value.filteredBalanceItems.length <= 4) {\n                selectedTab.value = 'Individueel';\n            }\n        }\n        else {\n            detailedItem.value.deepSet(response.data);\n        }\n\n        props.item.deepSet(response.data);\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n}\n\n// Listen for patches in payments\nGlobalEventBus.addListener(owner, 'paymentPatch', async () => {\n    // Reload members and family\n    reloadFamily().catch(console.error);\n\n    await reload();\n});\n\nGlobalEventBus.addListener(owner, 'balanceItemPatch', async () => {\n    await reload();\n});\n\nconst platformFamilyManager = usePlatformFamilyManager();\n\nasync function reloadFamily() {\n    if (!props.member) {\n        return;\n    }\n    await platformFamilyManager.loadFamilyMembers(props.member, { shouldRetry: false });\n}\n\nasync function createPayment() {\n    if (!detailedItem.value) {\n        return;\n    }\n\n    const payment = PaymentGeneral.create({\n        method: PaymentMethod.Transfer,\n        status: PaymentStatus.Succeeded,\n        type: detailedItem.value.amountOpen >= 0 ? PaymentType.Payment : PaymentType.Refund,\n        paidAt: new Date(),\n        customer: detailedItem.value.object.contacts.length > 0\n            ? PaymentCustomer.create({\n                firstName: detailedItem.value.object.contacts[0].firstName,\n                lastName: detailedItem.value.object.contacts[0].lastName,\n                email: detailedItem.value.object.contacts[0].emails[0] ?? null,\n            })\n            : null,\n    });\n\n    if (props.item.objectType === ReceivableBalanceType.organization) {\n        payment.payingOrganizationId = props.item.object.id;\n    }\n\n    const component = new ComponentWithProperties(EditPaymentView, {\n        createBalanceItem,\n        payment,\n        balanceItems: computed(() => detailedItem.value?.filteredBalanceItems ?? []),\n        family: props.member?.family ?? null,\n        isNew: true,\n        saveHandler: async (patch: AutoEncoderPatchType<PaymentGeneral>) => {\n            const arr: PatchableArrayAutoEncoder<PaymentGeneral> = new PatchableArray();\n            arr.addPut(payment.patch(patch));\n            await context.value.authenticatedServer.request({\n                method: 'PATCH',\n                path: '/organization/payments',\n                body: arr,\n                decoder: new ArrayDecoder(PaymentGeneral),\n                shouldRetry: false,\n            });\n            await reload();\n            // Also reload member outstanding amount of the whole family\n            await reloadFamily();\n        },\n    });\n    await present({\n        components: [component],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function createBalanceItem() {\n    const balanceItem = BalanceItemWithPayments.create({});\n\n    if (props.item.objectType === ReceivableBalanceType.member) {\n        balanceItem.memberId = props.item.object.id;\n    }\n\n    if (props.item.objectType === ReceivableBalanceType.organization) {\n        balanceItem.payingOrganizationId = props.item.object.id;\n    }\n\n    if (props.item.objectType === ReceivableBalanceType.user) {\n        balanceItem.userId = props.item.object.id;\n    }\n\n    const component = new ComponentWithProperties(EditBalanceItemView, {\n        balanceItem,\n        isNew: true,\n        saveHandler: async (patch: AutoEncoderPatchType<BalanceItemWithPayments>) => {\n            const arr: PatchableArrayAutoEncoder<BalanceItemWithPayments> = new PatchableArray();\n            arr.addPut(balanceItem.patch(patch));\n            await context.value.authenticatedServer.request({\n                method: 'PATCH',\n                path: '/organization/balance',\n                body: arr,\n                decoder: new ArrayDecoder(BalanceItemWithPayments),\n                shouldRetry: false,\n            });\n            await reload();\n            // Also reload member outstanding amount of the whole family\n            await reloadFamily();\n        },\n    });\n    await present({\n        components: [component],\n        modalDisplayStyle: 'popup',\n    });\n}\n</script>\n","<template>\n    <div class=\"st-view\">\n        <STNavigationBar :title=\"title\" />\n        <main ref=\"main\">\n            <h1>Inhoud</h1>\n            <iframe ref=\"iframeRef\" sandbox=\"\" />\n        </main>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { onMounted, useTemplateRef, watch } from 'vue';\nimport { useResizeObserver } from '../inputs/hooks/useResizeObserver';\n\nconst props = defineProps<{\n    html: string;\n    title: string;\n}>();\nconst iframe = useTemplateRef('iframeRef');\nconst mainElement = useTemplateRef('main');\n\n// Make sure the iframe width and height matches the width and height of main\nfunction updateSize() {\n    if (!iframe.value || !mainElement.value) {\n        return;\n    }\n    const elementComputedStyle = window.getComputedStyle(mainElement.value, null);\n    const paddingLeft = parseFloat(elementComputedStyle.getPropertyValue('padding-left'));\n    const paddingRight = parseFloat(elementComputedStyle.getPropertyValue('padding-right'));\n    const paddingTop = parseFloat(elementComputedStyle.getPropertyValue('padding-top'));\n    const paddingBottom = parseFloat(elementComputedStyle.getPropertyValue('padding-bottom'));\n    iframe.value.width = `${mainElement.value.clientWidth - paddingLeft - paddingRight}px`;\n    iframe.value.height = `${mainElement.value.clientHeight - paddingTop - paddingBottom}px`;\n}\n\nfunction cleanHtml(html: string) {\n    if (html.startsWith('<!DOCTYPE html>')) {\n        return html;\n    }\n\n    // Add body and html tag, with 0 padding\n    // This is needed because the iframe will not render the html correctly otherwise\n    return `\n        <!DOCTYPE html>\n        <html style=\"padding: 0; margin: 0;\">\n            <head>\n                <style>\n                    body {\n                        padding: 0;\n                        margin: 0;\n                    }\n                </style>\n            </head>\n            <body>${html}</body>\n        </html>\n    `;\n}\n\nwatch(() => props.html, (newHTML) => {\n    if (!iframe.value) {\n        return;\n    }\n    replaceIframeContent(iframe.value, newHTML);\n});\n\nwatch(() => iframe.value, () => {\n    if (!iframe.value) {\n        return;\n    }\n    updateSize();\n    replaceIframeContent(iframe.value, props.html);\n});\n\nonMounted(() => {\n    updateSize();\n});\n\nuseResizeObserver(mainElement, () => {\n    updateSize();\n});\n\nfunction replaceIframeContent(iframeElement: HTMLIFrameElement, newHTML: string) {\n    iframeElement.src = 'data:text/html;base64,' + base64Encode(cleanHtml(newHTML));\n}\n\nfunction base64Encode(str: string) {\n    // This fixes UTF-8 encoding issues\n    const bytes = new TextEncoder().encode(str);\n    const binString = String.fromCodePoint(...bytes);\n    return btoa(binString);\n}\n\n</script>\n","import { ComponentWithProperties, NavigationController, usePresent } from '@simonbackx/vue-app-navigation';\nimport { AuditLogReplacement, AuditLogReplacementType, LimitedFilteredRequest } from '@stamhoofd/structures';\nimport { h, withDirectives } from 'vue';\nimport { PromiseView } from '../../containers';\nimport { useAppContext } from '../../context';\nimport { EventOverview } from '../../events';\nimport { useEventsObjectFetcher, useMembersObjectFetcher, useOrganizationsObjectFetcher, usePaymentsObjectFetcher } from '../../fetchers';\nimport { MemberSegmentedView } from '../../members';\nimport { Toast } from '../../overlays/Toast';\nimport CopyableDirective from '../../directives/Copyable';\nimport TooltipDirective from '../../directives/Tooltip';\nimport { PaymentView } from '../../payments';\nimport SafeHtmlView from '../SafeHtmlView.vue';\nimport { Formatter } from '@stamhoofd/utility';\n\nexport interface Renderable {\n    render(context: Context): string | ReturnType<typeof h> | (ReturnType<typeof h> | string)[];\n}\n\nfunction isRenderable(obj: unknown): obj is Renderable {\n    return typeof obj === 'object' && obj !== null && (obj as Renderable).render !== undefined;\n}\n\nfunction copyable(vnode: ReturnType<typeof h>, text?: string): ReturnType<typeof h> {\n    return withDirectives(vnode, [[CopyableDirective, text]]);\n}\n\nfunction tooltip(vnode: ReturnType<typeof h>, text: string): ReturnType<typeof h> {\n    return withDirectives(vnode, [[TooltipDirective, text]]);\n}\n\nexport function renderAny(obj: unknown, context: Context): string | ReturnType<typeof h> | (ReturnType<typeof h> | string)[] {\n    if (typeof obj === 'string') {\n        return obj;\n    }\n\n    if (isRenderable(obj)) {\n        return obj.render(context);\n    }\n\n    if (obj instanceof AuditLogReplacement) {\n        if (obj.type === AuditLogReplacementType.Member && obj.id) {\n            // Open member button\n            return h('button', {\n                class: 'style-inline-resource button simple',\n                onClick: () => showMember(obj.id!, context),\n                type: 'button',\n            }, obj.value);\n        }\n\n        if (obj.type === AuditLogReplacementType.Payment && obj.id) {\n            // Open payment button\n            return h('button', {\n                class: 'style-inline-resource button simple',\n                onClick: () => showPayment(obj.id!, context),\n                type: 'button',\n            }, obj.value);\n        }\n\n        if (obj.type === AuditLogReplacementType.StripeAccount) {\n            // Render as code\n            return copyable(h('span', { class: 'style-inline-code style-copyable' }, obj.value));\n        }\n\n        if (obj.type === AuditLogReplacementType.Event && obj.id) {\n            // Open member button\n            return h('button', {\n                class: 'style-inline-resource button simple',\n                onClick: () => showEvent(obj.id!, context),\n                type: 'button',\n            }, obj.value);\n        }\n\n        if (obj.type === AuditLogReplacementType.Image && obj.id) {\n            // Open member button\n            return h('a', {\n                class: 'style-inline-resource simple',\n                href: obj.id,\n                target: '_blank',\n            }, [\n                h('img', {\n                    src: obj.id,\n                    style: {\n                        'width': '21px',\n                        'height': '21px',\n                        'object-fit': 'scale-down',\n                        'border-radius': '3px',\n                        'display': 'inline-block',\n                        'margin-right': '4px',\n                        'vertical-align': 'text-bottom',\n                        'overflow': 'hidden',\n                    },\n                }),\n                obj.value || 'Afbeelding',\n            ]);\n        }\n\n        if (obj.type === AuditLogReplacementType.File && obj.id) {\n            // Open member button\n            return h('a', {\n                class: 'style-inline-resource simple',\n                href: obj.id,\n                target: '_blank',\n            }, [\n                obj.value || 'Bestand',\n            ]);\n        }\n\n        if (obj.type === AuditLogReplacementType.Organization && obj.id) {\n            if (context.app === 'admin') {\n            // Open member button\n                return h('button', {\n                    class: 'style-inline-resource button simple',\n                    onClick: () => showOrganization(obj.id!, context),\n                    type: 'button',\n                }, obj.value);\n            }\n        }\n\n        if (obj.type === AuditLogReplacementType.Html && obj.value) {\n            return h('button', {\n                class: 'style-inline-resource button simple',\n                onClick: () => showHtml(obj.value!, context),\n                type: 'button',\n            }, obj.toString() as string);\n        }\n\n        if (obj.type === AuditLogReplacementType.LongText && obj.value) {\n            if (obj.value.length < 200 && !obj.value.includes('\\n')) {\n                return obj.value;\n            }\n            const style = `padding: 0; margin: 0; font-size: 15px; line-height: 1.5; font-family: \"Metropolis\", system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";`;\n            return h('button', {\n                class: 'style-inline-resource button simple',\n                onClick: () => showHtml('<p style=\"' + Formatter.escapeHtml(style) + '\">' + Formatter.escapeHtml(obj.value!).replace(/\\n/g, '<br>') + '</p>', context),\n                type: 'button',\n            }, obj.toString() as string);\n        }\n\n        if (obj.type === AuditLogReplacementType.Array) {\n            const a = obj.values.flatMap((part) => {\n                const q = renderAny(part, context);\n                if (Array.isArray(q)) {\n                    if (q.length === 0) {\n                        return [];\n                    }\n                    return [...q, ' → '];\n                }\n                return [q, ' → '];\n            });\n            a.pop();\n            return a;\n        }\n\n        if (obj.description) {\n            return tooltip(h('span', { class: 'style-inline-resource style-tooltip' }, obj.toString()), obj.description);\n        }\n\n        if (obj.id) {\n            return copyable(tooltip(h('span', { class: 'style-inline-resource style-tooltip' }, obj.toString() || 'onbekend'), 'ID: ' + obj.id), obj.id);\n        }\n        const str = obj.toString();\n\n        if (str.startsWith('#') && str.length === 7) {\n            // Render color string\n            return [\n                h('span', {\n                    class: 'style-color-box',\n                    style: {\n                        backgroundColor: str,\n                    },\n                }),\n                ' ' + str,\n            ];\n        }\n\n        if (!str) {\n            return [];\n        }\n\n        return str;\n    }\n    return '';\n}\n\nexport const RenderTextComponent = {\n    props: {\n        text: {\n            type: Array,\n            required: true,\n        },\n    },\n    setup(props: { text: unknown[] }) {\n        const present = usePresent();\n        const memberFetcher = useMembersObjectFetcher();\n        const eventFetcher = useEventsObjectFetcher();\n        const organizationFetcher = useOrganizationsObjectFetcher();\n        const paymentFetcher = usePaymentsObjectFetcher();\n        const app = useAppContext();\n\n        const context: Context = {\n            app,\n            present,\n            memberFetcher,\n            eventFetcher,\n            organizationFetcher,\n            paymentFetcher,\n        };\n        return () => props.text.map(part => renderAny(part, context));\n    },\n};\n\nexport type Context = {\n    app: ReturnType<typeof useAppContext>;\n    present: ReturnType<typeof usePresent>;\n    memberFetcher: ReturnType<typeof useMembersObjectFetcher>;\n    eventFetcher: ReturnType<typeof useEventsObjectFetcher>;\n    organizationFetcher: ReturnType<typeof useOrganizationsObjectFetcher>;\n    paymentFetcher: ReturnType<typeof usePaymentsObjectFetcher>;\n};\n\nasync function showHtml(html: string, context: Context) {\n    const component = new ComponentWithProperties(NavigationController, {\n        root: new ComponentWithProperties(SafeHtmlView, {\n            html,\n            title: 'Tekst met opmaak',\n        }),\n    });\n\n    await context.present({\n        components: [component],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function showPayment(paymentId: string, context: Context) {\n    const component = new ComponentWithProperties(NavigationController, {\n        root: new ComponentWithProperties(PromiseView, {\n            promise: async () => {\n                const payments = await context.paymentFetcher.fetch(new LimitedFilteredRequest({\n                    filter: {\n                        id: paymentId,\n                    },\n                    limit: 1,\n                }));\n                if (payments.results.length === 0) {\n                    Toast.error('Betaling niet (meer) gevonden').show();\n                    throw new Error('Payment not found');\n                }\n                return new ComponentWithProperties(PaymentView, {\n                    payment: payments.results[0],\n                });\n            },\n        }),\n    });\n\n    await context.present({\n        components: [component],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function showMember(memberId: string, context: Context) {\n    const component = new ComponentWithProperties(NavigationController, {\n        root: new ComponentWithProperties(PromiseView, {\n            promise: async () => {\n                const members = await context.memberFetcher.fetch(new LimitedFilteredRequest({\n                    filter: {\n                        id: memberId,\n                    },\n                    limit: 1,\n                }));\n                if (members.results.length === 0) {\n                    Toast.error('Lid niet (meer) gevonden').show();\n                    throw new Error('Member not found');\n                }\n                return new ComponentWithProperties(MemberSegmentedView, {\n                    member: members.results[0],\n                });\n            },\n        }),\n    });\n\n    await context.present({\n        components: [component],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function showEvent(eventId: string, context: Context) {\n    const component = new ComponentWithProperties(NavigationController, {\n        root: new ComponentWithProperties(PromiseView, {\n            promise: async () => {\n                const events = await context.eventFetcher.fetch(new LimitedFilteredRequest({\n                    filter: {\n                        id: eventId,\n                    },\n                    limit: 1,\n                }));\n                if (events.results.length === 0) {\n                    Toast.error('Activiteit niet meer gevonden').show();\n                    throw new Error('Event not found');\n                }\n                return new ComponentWithProperties(EventOverview, {\n                    event: events.results[0],\n                });\n            },\n        }),\n    });\n\n    await context.present({\n        components: [component],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function showOrganization(organizationId: string, context: Context) {\n    const component = new ComponentWithProperties(NavigationController, {\n        root: new ComponentWithProperties(PromiseView, {\n            promise: async () => {\n                const organizations = await context.organizationFetcher.fetch(new LimitedFilteredRequest({\n                    filter: {\n                        id: organizationId,\n                    },\n                    limit: 1,\n                }));\n                if (organizations.results.length === 0) {\n                    Toast.error('Organisatie niet meer gevonden').show();\n                    throw new Error('Event not found');\n                }\n                const OrganizationView = (await import('@stamhoofd/admin-frontend/src/views/organizations/OrganizationView.vue')).default;\n                return new ComponentWithProperties(OrganizationView, {\n                    organization: organizations.results[0],\n                    getNext: () => null,\n                    getPrevious: () => null,\n                });\n            },\n        }),\n    });\n\n    await context.present({\n        components: [component],\n        modalDisplayStyle: 'popup',\n    });\n}\n","<!-- eslint-disable vue/multiline-html-element-content-newline -->\n<template>\n    <p v-for=\"(item, index) of items\" :key=\"index\" class=\"style-description-small style-capitalize-first-letter\">\n        <RenderTextComponent :text=\"getRenderText(item)\" />\n    </p>\n</template>\n\n<script setup lang=\"ts\">\nimport { AuditLogPatchItem, AuditLogPatchItemType, AuditLogReplacementType, isUuid } from '@stamhoofd/structures';\nimport { Context, Renderable, renderAny, RenderTextComponent } from './RenderTextComponent';\nimport { h } from 'vue';\n\ndefineProps<{\n    items: AuditLogPatchItem[];\n}>();\n\nclass TextWithClass implements Renderable {\n    children: unknown;\n    className: string;\n\n    constructor(children: unknown, className: string) {\n        this.children = children;\n        this.className = className;\n    }\n\n    render(context: Context) {\n        return h('span', {\n            class: this.className,\n        }, renderAny(this.children, context));\n    }\n}\n\nfunction getRenderText(item: AuditLogPatchItem): any[] {\n    const text: any[] = [\n        item.key,\n    ];\n\n    if (item.type === AuditLogPatchItemType.Added) {\n        text.push(' toegevoegd');\n    }\n\n    if (item.type === AuditLogPatchItemType.Removed) {\n        text.push(' verwijderd');\n    }\n\n    if (item.type === AuditLogPatchItemType.Changed) {\n        text.push(' aangepast');\n    }\n\n    if (item.type === AuditLogPatchItemType.Reordered) {\n        text.push(' volgorde gewijzigd');\n    }\n\n    if ((item.oldValue && (item.oldValue.toString() || item.oldValue.type !== AuditLogReplacementType.Uuid)) || (item.value && (item.value.toString() || item.value.type !== AuditLogReplacementType.Uuid))) {\n        text.push(': ');\n\n        const hasOld = item.oldValue && (item.oldValue.type || item.oldValue.value);\n        const hasValue = item.value && (item.value.type || item.value.value);\n\n        if (hasOld) {\n            text.push(new TextWithClass(item.oldValue, 'style-value-old'));\n        }\n\n        if (hasOld && hasValue) {\n            text.push(' → ');\n        }\n\n        if (hasValue) {\n            text.push(new TextWithClass(item.value, 'style-value-new'));\n        }\n    }\n    else {\n        if (!item.type) {\n            text.push(' aangepast');\n        }\n    }\n\n    return text;\n}\n\n</script>\n","<template>\n    <STListItem class=\"right-stack\" @contextmenu.prevent=\"canFilter ? showContext($event) : undefined\">\n        <template #left>\n            <IconContainer :icon=\"log.icon\" class=\"gray\">\n                <template v-if=\"log.subIcon\" #aside>\n                    <ProgressIcon :icon=\"log.subIcon\" />\n                </template>\n            </IconContainer>\n        </template>\n        <p class=\"style-title-prefix-list\">\n            {{ Formatter.relativeTime(log.createdAt, {hours: false}) }}\n        </p>\n\n        <h3 v-if=\"showDescriptionInTitle\" v-text=\"log.description\" />\n        <h3 v-else class=\"style-title-list\">\n            <RenderTextComponent :text=\"log.renderableTitle\" />\n        </h3>\n\n        <p v-if=\"userDescription.length\" class=\"style-description pre-wrap\">\n            <RenderTextComponent :text=\"userDescription\" />\n        </p>\n        <p v-if=\"log.renderableDescription.length\" class=\"style-description pre-wrap\">\n            <RenderTextComponent :text=\"log.renderableDescription\" />\n        </p>\n\n        <p v-if=\"log.description && !showDescriptionInTitle\" class=\"style-description-small pre-wrap\" v-text=\"log.description\" />\n\n        <PatchListText v-if=\"log.patchList\" :items=\"log.patchList\" />\n    </STListItem>\n</template>\n\n<script setup lang=\"ts\">\nimport { ComponentWithProperties, usePresent } from '@simonbackx/vue-app-navigation';\nimport { AuditLog, AuditLogReplacement, AuditLogReplacementType, AuditLogSource, AuditLogType } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed } from 'vue';\nimport IconContainer from '../../icons/IconContainer.vue';\nimport ProgressIcon from '../../icons/ProgressIcon.vue';\nimport { ContextMenu, ContextMenuItem } from '../../overlays/ContextMenu';\nimport AuditLogsView from '../AuditLogsView.vue';\nimport PatchListText from './PatchListText.vue';\nimport { RenderTextComponent } from './RenderTextComponent';\n\nconst props = withDefaults(\n    defineProps<{\n        log: AuditLog;\n        canFilter: boolean;\n    }>(), {\n        canFilter: true,\n    });\n\nconst userDescription: unknown[] = [];\n\nconst showDescriptionInTitle = computed(() => props.log.type === AuditLogType.Unknown && props.log.description);\n\nif (props.log.user) {\n    if (props.log.source === AuditLogSource.User) {\n        userDescription.push('Door ');\n    }\n    else if (props.log.source === AuditLogSource.Payment) {\n        userDescription.push('Indirect veroorzaakt door betaalstatuswijziging door ');\n    }\n    else {\n        userDescription.push('Automatische actie veroorzaakt door ');\n    }\n\n    userDescription.push(AuditLogReplacement.create({\n        id: props.log.user.id,\n        value: props.log.user.name,\n        type: AuditLogReplacementType.User,\n    }));\n}\nelse if (props.log.source === AuditLogSource.User) {\n    userDescription.push('Door verwijderde gebruiker');\n}\nelse if (props.log.source === AuditLogSource.Anonymous) {\n    userDescription.push('Door anonieme gebruiker');\n}\nelse if (props.log.source === AuditLogSource.System) {\n    userDescription.push('Automatische systeemactie');\n}\nelse if (props.log.source === AuditLogSource.Payment) {\n    userDescription.push('Indirect veroorzaakt door betaalstatuswijziging');\n}\n\nconst present = usePresent();\n\nasync function showContext(event: MouseEvent) {\n    if (!props.log.objectId) {\n        return;\n    }\n    const menu = new ContextMenu([\n        [\n            new ContextMenuItem({\n                name: 'Toon alle gebeurtenissen van dit object',\n                action: async () => {\n                    await present({\n                        components: [\n                            new ComponentWithProperties(AuditLogsView, {\n                                objectIds: [props.log.objectId],\n                            }),\n                        ],\n                        modalDisplayStyle: 'popup',\n                    });\n                },\n            }),\n        ],\n    ]);\n\n    await menu.show({ clickEvent: event });\n}\n\n</script>\n","<template>\n    <div id=\"settings-view\" class=\"st-view background\">\n        <STNavigationBar title=\"Logboek\" />\n\n        <main class=\"center\">\n            <h1>\n                Logboek\n            </h1>\n            <p>In het logboek worden alle gebeurtenissen geregistreerd. Enkel hoofdbeheerders hebben toegang tot het logboek.</p>\n\n            <div class=\"input-with-buttons\">\n                <div>\n                    <div class=\"split-inputs\">\n                        <STInputBox title=\"Vanaf\" error-fields=\"startDate\" :error-box=\"errors.errorBox\">\n                            <DateSelection v-model=\"startDate\" :time=\"{hours: 0, minutes: 0, seconds: 0}\" placeholder=\"Begin\" :required=\"false\" />\n                        </STInputBox>\n\n                        <STInputBox title=\"Tot en met\" error-fields=\"endDate\" :error-box=\"errors.errorBox\">\n                            <DateSelection v-model=\"endDate\" :time=\"{hours: 23, minutes: 59, seconds: 59}\" placeholder=\"Nu\" :required=\"false\" />\n                        </STInputBox>\n                    </div>\n\n                    <p class=\"style-description-small\">\n                        Snel selecteren: <span v-for=\"(suggestion, index) in dateRangeSuggestions\" :key=\"suggestion.name\">\n                            <button type=\"button\" class=\"inline-link\" :class=\"isSuggestionSelected(suggestion) ? {secundary: false} : {secundary: true}\" @click=\"selectSuggestion(suggestion)\">\n                                {{ suggestion.name }}\n                            </button><template v-if=\"index < dateRangeSuggestions.length - 1\">, </template>\n                        </span>\n                    </p>\n                </div>\n                <div>\n                    <button type=\"button\" class=\"button text\" @click=\"editFilter\">\n                        <span class=\"icon filter\" />\n                        <span class=\"hide-small\">Filter</span>\n                        <span v-if=\"!isEmptyFilter(fetcher.baseFilter)\" class=\"icon dot primary\" />\n                    </button>\n                </div>\n            </div>\n\n            <hr>\n\n            <div v-for=\"(group, index) of groupedLogs\" :key=\"group.title\" class=\"container\">\n                <hr v-if=\"index > 0\">\n                <h2>{{ Formatter.capitalizeFirstLetter(group.title) }}</h2>\n\n                <STList>\n                    <AuditLogRow v-for=\"log of group.logs\" :key=\"log.id\" :log=\"log\" />\n                </STList>\n            </div>\n\n            <InfiniteObjectFetcherEnd empty-message=\"Geen logs gevonden\" :fetcher=\"fetcher\" />\n        </main>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ComponentWithProperties, NavigationController } from '@simonbackx/vue-app-navigation';\nimport { DateSelection, useOrganization, useVisibilityChange } from '@stamhoofd/components';\nimport { AuditLog, isEmptyFilter, mergeFilters } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed, onActivated, ref, Ref, watch } from 'vue';\nimport { useErrors } from '../errors/useErrors';\nimport { useAuditLogsObjectFetcher } from '../fetchers';\nimport { useAuditLogUIFilterBuilders } from '../filters/filterBuilders';\nimport { UIFilter } from '../filters/UIFilter';\nimport UIFilterEditor from '../filters/UIFilterEditor.vue';\nimport { InfiniteObjectFetcherEnd, useInfiniteObjectFetcher, usePositionableSheet } from '../tables';\nimport AuditLogRow from './components/AuditLogRow.vue';\n\ntype ObjectType = AuditLog;\n\nconst props = withDefaults(\n    defineProps<{\n        objectIds?: string[] | null;\n    }>(), {\n        objectIds: null,\n    });\n\nconst { presentPositionableSheet } = usePositionableSheet();\n\nconst filterBuilders = useAuditLogUIFilterBuilders();\nconst selectedUIFilter = ref(null) as Ref<null | UIFilter>;\nconst startDate = ref(null) as Ref<Date | null>;\nconst endDate = ref(null) as Ref<Date | null>;\nconst errors = useErrors();\nconst organization = useOrganization();\n\nconst objectFetcher = useAuditLogsObjectFetcher({\n    requiredFilter: props.objectIds ? { objectId: { $in: props.objectIds } } : {organizationId: organization.value?.id ?? null},\n});\n\nconst fetcher = useInfiniteObjectFetcher<ObjectType>(objectFetcher);\n\nconst groupedLogs = computed(() => {\n    return groupLogs(fetcher.objects);\n});\n\nuseVisibilityChange(() => {\n    fetcher.reset();\n});\n\nonActivated(() => {\n    fetcher.reset();\n});\n\nwatch(() => {\n    let filter = selectedUIFilter.value ? selectedUIFilter.value.build() : null;\n    if (startDate.value) {\n        filter = mergeFilters([\n            filter,\n            { createdAt: { $gte: startDate.value } },\n        ]);\n    }\n    if (endDate.value) {\n        filter = mergeFilters([\n            filter,\n            { createdAt: { $lte: endDate.value } },\n        ]);\n    }\n    return filter;\n}, (filter) => {\n    console.log('Set filter in UI', JSON.stringify(filter, undefined, 2));\n    fetcher.setFilter(filter);\n}, { immediate: true });\n\nasync function editFilter(log: MouseEvent) {\n    if (!filterBuilders) {\n        return;\n    }\n    const filter = selectedUIFilter.value ?? filterBuilders[0].create();\n    if (!selectedUIFilter.value) {\n        selectedUIFilter.value = filter;\n    }\n\n    await presentPositionableSheet(log, {\n        components: [\n            new ComponentWithProperties(NavigationController, {\n                root: new ComponentWithProperties(UIFilterEditor, {\n                    filter,\n                }),\n            }),\n        ],\n    });\n}\n\nfunction groupLogs(logs: AuditLog[]) {\n    const queue: {\n        title: string;\n        logs: AuditLog[];\n    }[] = [];\n\n    for (const log of logs) {\n        const title = dateRangeSuggestions.find(s => log.createdAt >= s.startDate && log.createdAt <= s.endDate)?.name ?? (Formatter.month(log.createdAt) + ' ' + Formatter.year(log.createdAt));\n\n        const group = queue[queue.length - 1];\n        if (group && group.title === title) {\n            group.logs.push(log);\n        }\n        else {\n            queue.push({ title, logs: [log] });\n        }\n    }\n    return queue;\n}\n\nclass DateRangeSuggestion {\n    name: string;\n    startDate: Date;\n    endDate: Date;\n\n    constructor({ name, startDate, endDate }: { name: string; startDate: Date; endDate: Date }) {\n        this.name = name;\n        this.startDate = startDate;\n        this.endDate = endDate;\n    }\n}\n\nconst dateRangeSuggestions = buildSuggestions();\n\nfunction buildSuggestions() {\n    const r = [\n        new DateRangeSuggestion({\n            name: 'vandaag',\n            startDate: Formatter.luxon().startOf('day').toJSDate(),\n            endDate: Formatter.luxon().endOf('day').toJSDate(),\n        }),\n\n        new DateRangeSuggestion({\n            name: 'gisteren',\n            startDate: Formatter.luxon().minus({ day: 1 }).startOf('day').toJSDate(),\n            endDate: Formatter.luxon().minus({ day: 1 }).endOf('day').toJSDate(),\n        }),\n\n        new DateRangeSuggestion({\n            name: 'deze week',\n            startDate: Formatter.luxon().startOf('week').toJSDate(),\n            endDate: Formatter.luxon().endOf('week').toJSDate(),\n        }),\n\n        new DateRangeSuggestion({\n            name: 'vorige week',\n            startDate: Formatter.luxon().minus({ day: 7 }).startOf('week').toJSDate(),\n            endDate: Formatter.luxon().minus({ day: 7 }).endOf('week').toJSDate(),\n        }),\n\n        new DateRangeSuggestion({\n            name: Formatter.month(Formatter.luxon().startOf('month').toJSDate()),\n            startDate: Formatter.luxon().startOf('month').toJSDate(),\n            endDate: Formatter.luxon().endOf('month').toJSDate(),\n        }),\n    ];\n\n    // Start / end times\n    // this fixes the auto correct of the date selection inputs\n    for (const rr of r) {\n        rr.startDate.setHours(0, 0, 0, 0);\n        rr.endDate.setHours(23, 59, 59, 0);\n    }\n\n    return r;\n}\n\nfunction selectSuggestion(suggestion: DateRangeSuggestion) {\n    startDate.value = suggestion.startDate;\n    endDate.value = suggestion.endDate;\n}\n\nfunction isSuggestionSelected(suggestion: DateRangeSuggestion) {\n    if (!startDate.value || !endDate.value) {\n        return false;\n    }\n    return Formatter.dateIso(startDate.value) === Formatter.dateIso(suggestion.startDate) && Formatter.dateIso(endDate.value) === Formatter.dateIso(suggestion.endDate);\n}\n\n</script>\n","import { Decoder, PatchableArray, PatchableArrayAutoEncoder, patchContainsChanges } from '@simonbackx/simple-encoding';\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { Request, RequestResult } from '@simonbackx/simple-networking';\nimport { AppType, useAppContext, useContext } from '@stamhoofd/components';\nimport { SessionContext } from '@stamhoofd/networking';\nimport { MemberWithRegistrationsBlob, MembersBlob, PlatformFamily, PlatformMember, Registration, Version } from '@stamhoofd/structures';\nimport { onBeforeUnmount, unref } from 'vue';\n\nexport function usePlatformFamilyManager() {\n    const context = useContext();\n    const app = useAppContext();\n\n    if (app === 'auto') {\n        throw new Error('usePlatformFamilyManager() cannot be used in the auto app context');\n    }\n    const manager = new PlatformFamilyManager(unref(context), app);\n\n    onBeforeUnmount(() => {\n        manager.destroy();\n    });\n\n    return manager;\n}\n\nexport class PlatformFamilyManager {\n    context: SessionContext;\n    app: AppType;\n\n    constructor(context: SessionContext, app: AppType) {\n        this.context = context;\n        this.app = app;\n    }\n\n    destroy() {\n        Request.cancelAll(this);\n    }\n\n    async loadFamilyBlob(memberId: string, options?: { shouldRetry?: boolean }) {\n        const response = await this.context.authenticatedServer.request({\n            method: 'GET',\n            path: `/organization/members/${memberId}/family`,\n            decoder: MembersBlob as Decoder<MembersBlob>,\n            owner: this,\n            shouldRetry: options?.shouldRetry ?? false,\n        });\n\n        response.data.markReceivedFromBackend();\n\n        updateContextFromMembersBlob(this.context, response.data);\n        return response.data;\n    }\n\n    async loadFamilyMembers(member: PlatformMember, options?: { shouldRetry?: boolean }) {\n        const response = await this.loadFamilyBlob(member.id, options);\n        member.family.insertFromBlob(response);\n    }\n\n    async unregisterMembers(members: { member: PlatformMember; removeRegistrations: Registration[] }[], options?: { shouldRetry?: boolean }) {\n        const patches = new PatchableArray() as PatchableArrayAutoEncoder<MemberWithRegistrationsBlob>;\n\n        for (const { member, removeRegistrations } of members) {\n            const registrations = new PatchableArray() as PatchableArrayAutoEncoder<Registration>;\n            for (const r of removeRegistrations) {\n                registrations.addDelete(r.id);\n            }\n\n            const patch = MemberWithRegistrationsBlob.patch({\n                id: member.id,\n                registrations,\n            });\n\n            patches.addPatch(patch);\n        }\n\n        await this.isolatedPatch(members.map(m => m.member), patches, options?.shouldRetry ?? false);\n    }\n\n    async isolatedPatch(members: PlatformMember[], patches: PatchableArrayAutoEncoder<MemberWithRegistrationsBlob>, shouldRetry: boolean = false) {\n        if (patches.changes.length) {\n            MembersBlob.markAllStale();\n            const response = await this.context.authenticatedServer.request({\n                method: 'PATCH',\n                path: this.app == 'registration' ? '/members' : '/organization/members',\n                decoder: MembersBlob as Decoder<MembersBlob>,\n                body: patches,\n                shouldRetry,\n                owner: this,\n            });\n            response.data.markReceivedFromBackend();\n\n            // Remove deleted members from family\n            for (const memberId of patches.getDeletes()) {\n                const member = members.find(m => m.id === memberId);\n                if (member) {\n                    member.family.deleteMember(memberId);\n                }\n            }\n\n            PlatformFamily.updateFromBlob(members, response.data);\n            updateContextFromMembersBlob(this.context, response.data);\n        }\n    }\n\n    async save(members: PlatformMember[], shouldRetry: boolean = false) {\n        // Load all members that have patches\n        const patches: PatchableArrayAutoEncoder<MemberWithRegistrationsBlob> = new PatchableArray();\n\n        const clearAfter: Set<PlatformMember> = new Set();\n\n        for (const member of members) {\n            if (member.isNew) {\n                if (member.isSaving) {\n                    throw new SimpleError({\n                        code: 'save_pending',\n                        message: 'Even geduld. Nog bezig met opslaan...',\n                    });\n                }\n                patches.addPut(member.patchedMember);\n                clearAfter.add(member);\n            }\n            else {\n                if (patchContainsChanges(member.patch, member.member, { version: Version })) {\n                    member.patch.id = member.member.id;\n                    patches.addPatch(member.patch);\n                    clearAfter.add(member);\n                }\n            }\n        }\n\n        if (patches.changes.length) {\n            for (const c of clearAfter.values()) {\n                c.prepareSave();\n            }\n\n            let response: RequestResult<MembersBlob>;\n            try {\n                MembersBlob.markAllStale();\n\n                response = await this.context.authenticatedServer.request({\n                    method: 'PATCH',\n                    path: this.app === 'registration' ? '/members' : '/organization/members',\n                    decoder: MembersBlob as Decoder<MembersBlob>,\n                    body: patches,\n                    shouldRetry,\n                    owner: this,\n                });\n\n                // Make sure we use local time, so this is never stale\n                response.data.markReceivedFromBackend();\n            }\n            catch (e) {\n                for (const c of clearAfter.values()) {\n                    c.markFailedSave();\n                }\n\n                throw e;\n            }\n\n            const createdMembers = response.data.members.filter(m => ![...clearAfter.values()].find(mm => mm.id === m.id));\n\n            for (const c of clearAfter.values()) {\n                const savedMember = c.patchedMember; // Before clearing the patches\n                c.markSaved();\n\n                // Check in response\n                const updatedMember = response.data.members.find(m => m.id === c.id);\n                if (updatedMember) {\n                    c.member.deepSet(updatedMember);\n                }\n                else {\n                    // Probably duplicate member, so we have a different id\n                    const updatedMember = createdMembers.find(m => m.details.isEqual(savedMember.details));\n                    if (updatedMember) {\n                        // We have an id change here\n                        const oldId = c.id;\n                        c.member.deepSet(updatedMember);\n                        c.patch.id = updatedMember.id;\n\n                        c._oldId = oldId;\n                    }\n                    else {\n                        console.error('Patched members but missing in response. This should not happen.', savedMember, c);\n                    }\n                }\n            }\n\n            // Also insert the organizations into the families and deep set all the data we received\n            PlatformFamily.updateFromBlob(members, response.data);\n            updateContextFromMembersBlob(this.context, response.data);\n        }\n    }\n}\n\nexport function updateContextFromMembersBlob(context: SessionContext, blob: MembersBlob) {\n    const user = context.auth.user;\n    if (user) {\n        // Update the user if we received a blob that contains a member with a user id equal to ours - while we don't have the memberId locally set\n        const userId = user.id;\n        const userMemberId = user.memberId;\n\n        const newUserMemberId = blob.members\n            .flatMap(cm => cm.users)\n            .find(u => u.id === userId)?.memberId ?? null;\n\n        // Update user blob\n        user.members = blob;\n\n        if (userMemberId !== newUserMemberId) {\n            context.updateData(true, false, false).catch(console.error);\n        }\n    }\n\n    // Update organizations we received\n    // this updates the group cached counts\n    if (context.organization) {\n        const id = context.organization.id;\n\n        // Skip this if we received a fresh organization in the response\n        const fresh = blob.organizations.find(o => o.id === id);\n        if (fresh) {\n            // Only deep set if we don't lose any private meta\n            context.updateOrganization(fresh);\n            return;\n        }\n\n        const members = blob.members;\n\n        // Update group data we received\n        const processedGroups = new Set<string>();\n        for (const member of members) {\n            for (const registration of member.registrations) {\n                if (registration.organizationId === context.organization.id && !processedGroups.has(registration.groupId)) {\n                    const originalGroup = context.organization.period.groups.find(g => g.id === registration.groupId);\n                    originalGroup?.deepSet(registration.group);\n                    processedGroups.add(registration.groupId);\n                }\n            }\n        }\n    }\n}\n","<template>\n    <span v-if=\"getResponsibilityMergedRole(responsibility, group?.id).isEmpty\" v-tooltip=\"'Heeft geen automatische rechten'\" class=\"icon layered\">\n        <span class=\"icon user-blocked-layer-1\" />\n        <span class=\"icon user-blocked-layer-2 red\" />\n    </span>\n    <span v-else-if=\"getResponsibilityMergedRole(responsibility, group?.id).hasAccess(PermissionLevel.Full)\" class=\"icon layered\">\n        <span class=\"icon user-admin-layer-1\" />\n        <span class=\"icon user-admin-layer-2 yellow\" />\n    </span>\n    <span v-else class=\"icon user\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport { Group, LoadedPermissions, MemberResponsibility, Organization, PermissionLevel } from '@stamhoofd/structures';\n\nconst props = withDefaults(\n    defineProps<{\n        responsibility: MemberResponsibility;\n        group?: Group | null;\n        organization?: Organization | null;\n    }>(), {\n        group: null,\n        organization: null,\n    },\n);\n\nfunction getResponsibilityMergedRole(responsibility: MemberResponsibility, groupId: string | null | undefined) {\n    return LoadedPermissions.fromResponsibility(responsibility, groupId ?? null, props.organization?.privateMeta?.inheritedResponsibilityRoles ?? []);\n}\n\n</script>\n","<template>\n    <div class=\"container\">\n        <Title v-bind=\"$attrs\" :title=\"title\" />\n\n        <ScrollableSegmentedControl v-if=\"!organization && items.length\" v-model=\"selectedOrganization\" :items=\"items\" :labels=\"labels\" />\n\n        <STErrorsDefault :error-box=\"parentErrorBox\" />\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <p v-if=\"groupedResponsibilites.length === 0\" class=\"info-box\">\n            Geen functies gevonden\n        </p>\n\n        <div v-for=\"({title: groupTitle, responsibilities}, index) of groupedResponsibilites\" :key=\"''+index\" class=\"container\">\n            <hr v-if=\"index > 0 || !(!organization && items.length)\">\n            <h2 v-if=\"groupTitle && groupedResponsibilites.length > 1\">\n                {{ groupTitle }}\n            </h2>\n\n            <STList>\n                <STListItem v-for=\"{responsibility, group} of responsibilities\" :key=\"responsibility.id\" element-name=\"label\" :selectable=\"true\">\n                    <template #left>\n                        <Checkbox :model-value=\"isResponsibilityEnabled(responsibility, group?.id)\" @update:model-value=\"setResponsibilityEnabled(responsibility, group?.id, $event)\" />\n                    </template>\n\n                    <h2 class=\"style-title-list\">\n                        {{ responsibility.name }}<template v-if=\"group\">\n                            van {{ group.settings.name }}\n                        </template>\n                    </h2>\n                    <p v-if=\"group && selectedOrganization && group.periodId === selectedOrganization?.period.period.id\" class=\"style-description-small\">\n                        {{ selectedOrganization.period.period.nameShort }}\n                    </p>\n                    <p v-else-if=\"group\" class=\"style-description-small\">\n                        {{ $t('9685e11f-a4d0-4709-9f5e-875957ad269b') }}\n                    </p>\n\n                    <p class=\"style-description-small\">\n                        Rechten: {{ getResponsibilityMergedRoleDescription(responsibility, group?.id) }}\n                    </p>\n\n                    <p v-if=\"getResponsibilityEnabledDescription(responsibility, group?.id)\" class=\"style-description-small\">\n                        {{ getResponsibilityEnabledDescription(responsibility, group?.id) }}\n                    </p>\n                    <p class=\"style-description-small\">\n                        {{ responsibility.description }}\n                    </p>\n\n                    <template #right>\n                        <ResponsibilityIcon :responsibility=\"responsibility\" :group=\"group\" :organization=\"selectedOrganization\" />\n                    </template>\n                </STListItem>\n            </STList>\n        </div>\n\n        <div v-if=\"deletedMemberResponsibilityRecords.length > 0\" class=\"container\">\n            <hr>\n            <h2>{{ $t('e81e0bdb-c15f-4b9a-abca-172a8d379993') }}</h2>\n            <STList>\n                <STListItem v-for=\"record of deletedMemberResponsibilityRecords\" :key=\"record.id\" element-name=\"label\" :selectable=\"true\">\n                    <template #left>\n                        <Checkbox :model-value=\"isMemberResponsibilityRecordEnabled(record)\" @update:model-value=\"setMemberResponsibilityRecordEnabled(record, $event)\" />\n                    </template>\n\n                    <h2>{{ record.getName(member) }}</h2>\n\n                    <p v-if=\"record.group && selectedOrganization && record.group.periodId === selectedOrganization?.period.period.id\" class=\"style-description-small\">\n                        {{ selectedOrganization.period.period.nameShort }}\n                    </p>\n                    <p v-else-if=\"record.group\" class=\"style-description-small\">\n                        {{ $t('9685e11f-a4d0-4709-9f5e-875957ad269b') }}\n                    </p>\n\n                    <p class=\"style-description-small\">\n                        Rechten: {{ getResponsibilityRecordMergedRoleDescription(record) }}\n                    </p>\n\n                    <p v-if=\"getResponsibilityRecordEnabledDescription(record)\" class=\"style-description-small\">\n                        {{ getResponsibilityRecordEnabledDescription(record) }}\n                    </p>\n                </STListItem>\n            </STList>\n        </div>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { Group, LoadedPermissions, MemberResponsibility, MemberResponsibilityRecord, Organization, PlatformMember } from '@stamhoofd/structures';\n\nimport { PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { SimpleErrors } from '@simonbackx/simple-errors';\nimport { ScrollableSegmentedControl, useOrganization, usePlatform } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { Formatter } from '@stamhoofd/utility';\nimport { Ref, computed, ref } from 'vue';\nimport { ErrorBox } from '../../../errors/ErrorBox';\nimport { Validator } from '../../../errors/Validator';\nimport { useErrors } from '../../../errors/useErrors';\nimport { useValidation } from '../../../errors/useValidation';\nimport ResponsibilityIcon from '../ResponsibilityIcon.vue';\nimport Title from './Title.vue';\n\ndefineOptions({\n    inheritAttrs: false,\n});\n\nconst props = defineProps<{\n    member: PlatformMember;\n    validator: Validator;\n    parentErrorBox?: ErrorBox | null;\n}>();\n\nconst errors = useErrors({ validator: props.validator });\nconst platform = usePlatform();\nconst organization = useOrganization();\nconst $t = useTranslate();\n\nconst items = computed(() => {\n    if (organization.value) {\n        return [organization.value];\n    }\n    // Only show organization that have an active registration in the organization active period\n    return [...props.member.filterOrganizations({ currentPeriod: true, withResponsibilities: true }), null];\n});\n\nconst platformResponsibilities = computed(() => {\n    if (selectedOrganization.value === null) {\n        return platform.value.config.responsibilities.filter(r => !r.organizationBased);\n    }\n    const org = selectedOrganization.value;\n    return platform.value.config.responsibilities.filter(r => r.organizationBased && (r.organizationTagIds === null || org.meta.matchTags(r.organizationTagIds)));\n});\n\nconst selectedOrganization = ref((items.value[0] ?? null) as any) as Ref<Organization | null>;\n\nconst organizationResponsibilities = computed(() => {\n    return selectedOrganization.value?.privateMeta?.responsibilities ?? [];\n});\n\nconst groupedResponsibilites = computed(() => {\n    const groupedPlatformResponsibilities: { responsibility: MemberResponsibility; group: Group | null }[] = [];\n    const groupedOrganizationResponsibilities: { responsibility: MemberResponsibility; group: Group | null }[] = [];\n    const organizationGroups = selectedOrganization.value?.period.adminCategoryTree.getAllGroups() ?? [];\n\n    for (const responsibility of platformResponsibilities.value) {\n        if (responsibility.defaultAgeGroupIds === null) {\n            groupedPlatformResponsibilities.push({\n                responsibility: responsibility,\n                group: null,\n            });\n        }\n\n        for (const group of organizationGroups) {\n            if (group.defaultAgeGroupId && responsibility.defaultAgeGroupIds !== null && responsibility.defaultAgeGroupIds.includes(group.defaultAgeGroupId)) {\n                groupedPlatformResponsibilities.push({\n                    responsibility: responsibility,\n                    group: group,\n                });\n            }\n        }\n    }\n\n    for (const responsibility of organizationResponsibilities.value) {\n        if (responsibility.defaultAgeGroupIds === null) {\n            groupedOrganizationResponsibilities.push({\n                responsibility: responsibility,\n                group: null,\n            });\n            continue;\n        }\n    }\n\n    // Merge non-empty groups\n    const groups: { title: string; responsibilities: { responsibility: MemberResponsibility; group: Group | null }[] }[] = [];\n\n    if (groupedPlatformResponsibilities.length > 0) {\n        groups.push({\n            title: selectedOrganization.value === null ? '' : 'Standaardfuncties',\n            responsibilities: groupedPlatformResponsibilities,\n        });\n    }\n\n    if (groupedOrganizationResponsibilities.length > 0) {\n        groups.push({\n            title: 'Groepseigenfuncties',\n            responsibilities: groupedOrganizationResponsibilities,\n        });\n    }\n\n    return groups;\n});\n\nconst disabledMemberResponsibilityRecords = ref([]) as Ref<MemberResponsibilityRecord[]>;\n\nconst deletedMemberResponsibilityRecords = computed(() => {\n    const result: MemberResponsibilityRecord[] = [];\n\n    for (const responsibilityRecord of props.member.patchedMember.responsibilities.filter(r => (r.endDate === null || disabledMemberResponsibilityRecords.value.find(x => x.id === r.id)) && r.organizationId === (selectedOrganization.value?.id ?? null))) {\n        const isDeleted = groupedResponsibilites.value.find(x => x.responsibilities.find(r => r.responsibility.id === responsibilityRecord.responsibilityId && (r.group?.id ?? null) === responsibilityRecord.groupId)) === undefined;\n\n        if (isDeleted) {\n            result.push(responsibilityRecord);\n        }\n    }\n\n    return result;\n});\n\nconst labels = computed(() => {\n    return items.value.map(o => o === null ? 'Nationaal niveau' : o.name);\n});\n\nconst title = computed(() => {\n    return 'Functies van ' + props.member.patchedMember.firstName;\n});\n\nuseValidation(errors.validator, () => {\n    const se = new SimpleErrors();\n\n    if (se.errors.length > 0) {\n        errors.errorBox = new ErrorBox(se);\n        return false;\n    }\n    errors.errorBox = null;\n\n    return true;\n});\n\nfunction isResponsibilityEnabled(responsibility: MemberResponsibility, groupId?: string | null) {\n    return !!props.member.patchedMember.responsibilities.find(r => !r.endDate && r.responsibilityId === responsibility.id && r.organizationId === (selectedOrganization?.value?.id ?? null) && r.groupId === (groupId ?? null));\n}\n\nfunction getResponsibilityEnabledDescription(responsibility: MemberResponsibility, groupId?: string | null) {\n    const rr = props.member.member.responsibilities.find(r => !r.endDate && r.responsibilityId === responsibility.id && r.organizationId === (selectedOrganization?.value?.id ?? null) && r.groupId === (groupId ?? null));\n\n    if (rr) {\n        if (!rr.endDate) {\n            return 'Van ' + Formatter.date(rr.startDate, true) + ' tot nu';\n        }\n        return 'Van ' + Formatter.date(rr.startDate, true) + ' tot ' + Formatter.date(rr.endDate, true);\n    }\n\n    return null;\n}\n\nfunction getResponsibilityRecordEnabledDescription(record: MemberResponsibilityRecord | undefined) {\n    if (record) {\n        if (!record.endDate) {\n            return 'Van ' + Formatter.date(record.startDate, true) + ' tot nu';\n        }\n        return 'Van ' + Formatter.date(record.startDate, true) + ' tot ' + Formatter.date(record.endDate, true);\n    }\n\n    return null;\n}\n\nfunction setResponsibilityEnabled(responsibility: MemberResponsibility, groupId: string | null | undefined, enabled: boolean) {\n    if (enabled === isResponsibilityEnabled(responsibility, groupId)) {\n        return;\n    }\n\n    if (enabled) {\n        const originalEnabled = props.member.member.responsibilities.find(r => !r.endDate && r.responsibilityId === responsibility.id && r.organizationId === (selectedOrganization?.value?.id ?? null) && r.groupId === (groupId ?? null));\n\n        if (originalEnabled) {\n            // Restore original state\n            const patch: PatchableArrayAutoEncoder<MemberResponsibilityRecord> = new PatchableArray();\n            patch.addPatch(MemberResponsibilityRecord.patch({\n                id: originalEnabled.id,\n                endDate: null,\n            }));\n\n            props.member.addPatch({\n                responsibilities: patch,\n            });\n            return;\n        }\n\n        // Create a new one\n        const record = MemberResponsibilityRecord.create({\n            memberId: props.member.id,\n            responsibilityId: responsibility.id,\n            startDate: new Date(),\n            endDate: null,\n            organizationId: selectedOrganization?.value?.id ?? null,\n            groupId: groupId ?? null,\n        });\n\n        const patch: PatchableArrayAutoEncoder<MemberResponsibilityRecord> = new PatchableArray();\n        patch.addPut(record);\n\n        props.member.addPatch({\n            responsibilities: patch,\n        });\n        return;\n    }\n\n    const current = props.member.patchedMember.responsibilities.find(r => !r.endDate && r.responsibilityId === responsibility.id && r.organizationId === (selectedOrganization?.value?.id ?? null) && r.groupId === (groupId ?? null));\n    if (!current) {\n        return;\n    }\n    const patch: PatchableArrayAutoEncoder<MemberResponsibilityRecord> = new PatchableArray();\n\n    // Did we already have this?\n    const originalEnabled = props.member.member.responsibilities.find(r => !r.endDate && r.responsibilityId === responsibility.id && r.organizationId === (selectedOrganization?.value?.id ?? null) && r.groupId === (groupId ?? null));\n    if (originalEnabled && originalEnabled.id === current.id) {\n        patch.addPatch(MemberResponsibilityRecord.patch({\n            id: current.id,\n            endDate: new Date(),\n        }));\n    }\n    else {\n        patch.addDelete(current.id);\n    }\n\n    props.member.addPatch({\n        responsibilities: patch,\n    });\n}\n\nfunction isMemberResponsibilityRecordEnabled(record: MemberResponsibilityRecord) {\n    return (disabledMemberResponsibilityRecords.value).find(r => r.id === record.id) === undefined;\n}\n\nfunction setMemberResponsibilityRecordEnabled(record: MemberResponsibilityRecord, enabled: boolean) {\n    if (enabled === isMemberResponsibilityRecordEnabled(record)) {\n        return;\n    }\n\n    if (enabled) {\n        const index = disabledMemberResponsibilityRecords.value.findIndex(r => r.id === record.id);\n        disabledMemberResponsibilityRecords.value.splice(index, 1);\n\n        // Restore original state\n        const patch: PatchableArrayAutoEncoder<MemberResponsibilityRecord> = new PatchableArray();\n        patch.addPatch(MemberResponsibilityRecord.patch({\n            id: record.id,\n            endDate: null,\n        }));\n\n        props.member.addPatch({\n            responsibilities: patch,\n        });\n        return;\n    }\n\n    disabledMemberResponsibilityRecords.value.push(record);\n\n    const patch: PatchableArrayAutoEncoder<MemberResponsibilityRecord> = new PatchableArray();\n\n    patch.addPatch(MemberResponsibilityRecord.patch({\n        id: record.id,\n        endDate: new Date(),\n    }));\n\n    props.member.addPatch({\n        responsibilities: patch,\n    });\n}\n\nfunction getResponsibilityMergedRole(responsibility: MemberResponsibility, groupId: string | null | undefined) {\n    return LoadedPermissions.fromResponsibility(responsibility, groupId ?? null, selectedOrganization.value?.privateMeta?.inheritedResponsibilityRoles ?? []);\n}\n\nfunction getResponsibilityMergedRoleDescription(responsibility: MemberResponsibility, groupId: string | null | undefined) {\n    return getResponsibilityMergedRole(responsibility, groupId).getDescription();\n}\n\nfunction getResponsibilityFromRecord(record: MemberResponsibilityRecord): {\n    responsibility: MemberResponsibility;groupId: string | null; } | null {\n    for (const groupData of groupedResponsibilites.value) {\n        const responsibility = groupData.responsibilities.find(r => r.responsibility.id === record.responsibilityId);\n\n        if (responsibility) {\n            return {\n                responsibility: responsibility.responsibility,\n                groupId: responsibility.group?.id ?? null,\n            };\n        }\n    }\n\n    return null;\n}\n\nfunction getResponsibilityRecordMergedRoleDescription(record: MemberResponsibilityRecord) {\n    const result = getResponsibilityFromRecord(record);\n\n    if (result) {\n        return getResponsibilityMergedRole(result.responsibility, result.groupId).getDescription();\n    }\n\n    return $t('02ef437e-2166-49be-b5ae-73e5452546a0');\n}\n</script>\n","import { usePresent } from '@simonbackx/vue-app-navigation';\nimport { SessionContext, useRequestOwner } from '@stamhoofd/networking';\nimport { Group, GroupCategoryTree, Organization, OrganizationRegistrationPeriod, PermissionLevel, PlatformMember, RegisterCheckout, RegisterItem, Registration, RegistrationWithMember } from '@stamhoofd/structures';\nimport { checkoutRegisterItem, chooseOrganizationMembersForGroup } from '..';\nimport { useContext, useOrganization } from '../../hooks';\nimport { InMemoryTableAction, MenuTableAction, TableAction } from '../../tables/classes';\nimport { PlatformFamilyManager, usePlatformFamilyManager } from '../PlatformFamilyManager';\n\nexport function useRegistrationActionBuilder() {\n    const present = usePresent();\n    const context = useContext();\n    const platformFamilyManager = usePlatformFamilyManager();\n    const owner = useRequestOwner();\n    const organization = useOrganization();\n\n    return (options: { registration: Registration; member: PlatformMember }) => {\n        const org = options.member.organizations.find(o => o.id === options.registration.organizationId) ?? organization.value;\n\n        if (!org) {\n            throw new Error('Organization not found for registration');\n        }\n\n        return new RegistrationActionBuilder({\n            present,\n            context: context.value,\n            members: [options.member],\n            organization: org,\n            registrations: [options.registration],\n            platformFamilyManager,\n            owner,\n        });\n    };\n}\n\nexport class RegistrationActionBuilder {\n    /**\n     * Determines which registrations will get moved or removed\n     */\n    registrations: Registration[];\n    members: PlatformMember[];\n    organization: Organization;\n    present: ReturnType<typeof usePresent>;\n    context: SessionContext;\n    platformFamilyManager: PlatformFamilyManager;\n    owner: any;\n\n    constructor(settings: {\n        present: ReturnType<typeof usePresent>;\n        context: SessionContext;\n        registrations: Registration[];\n        members: PlatformMember[];\n        organization: Organization;\n        platformFamilyManager: PlatformFamilyManager;\n        owner: any;\n    }) {\n        this.present = settings.present;\n        this.context = settings.context;\n        this.registrations = settings.registrations;\n        this.members = settings.members;\n        this.organization = settings.organization;\n        this.platformFamilyManager = settings.platformFamilyManager;\n        this.owner = settings.owner;\n    }\n\n    get hasWrite() {\n        for (const registration of this.registrations) {\n            if (!this.context.auth.canAccessRegistration(registration, this.organization, PermissionLevel.Write)) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    getMoveAction(selectedOrganizationRegistrationPeriod?: OrganizationRegistrationPeriod): TableAction<PlatformMember>[] {\n        const period = selectedOrganizationRegistrationPeriod ?? this.organization.period;\n\n        return [\n            new MenuTableAction({\n                name: 'Verplaatsen naar',\n                priority: 1,\n                groupIndex: 5,\n                needsSelection: true,\n                allowAutoSelectAll: false,\n                enabled: this.hasWrite,\n                childActions: () => [\n                    new MenuTableAction({\n                        name: 'Wachtlijsten',\n                        groupIndex: 0,\n                        enabled: this.organization.period.waitingLists.length > 0,\n                        childActions: () => [\n                            ...this.organization.period.waitingLists.map((g) => {\n                                return new InMemoryTableAction({\n                                    name: g.settings.name,\n                                    needsSelection: true,\n                                    allowAutoSelectAll: false,\n                                    handler: async () => {\n                                        await this.moveRegistrations(g);\n                                    },\n                                });\n                            }),\n                        ],\n                    }),\n                    ...this.getActionsForCategory(period.adminCategoryTree, group => this.moveRegistrations(group)).map((r) => {\n                        r.description = period.period.name;\n                        return r;\n                    }),\n                ],\n            }),\n        ];\n    }\n\n    getEditAction(): TableAction<PlatformMember>[] {\n        return [\n            new InMemoryTableAction({\n                name: 'Inschrijving bewerken',\n                priority: 1,\n                groupIndex: 1,\n                needsSelection: true,\n                allowAutoSelectAll: false,\n                enabled: this.hasWrite,\n                handler: async () => {\n                    await this.editRegistrations();\n                },\n                icon: 'edit',\n            }),\n        ];\n    }\n\n    getUnsubscribeAction(): TableAction<PlatformMember>[] {\n        return [new InMemoryTableAction({\n            name: 'Uitschrijven',\n            destructive: true,\n            priority: 0,\n            groupIndex: 7,\n            needsSelection: true,\n            allowAutoSelectAll: false,\n            enabled: this.hasWrite,\n            handler: async () => {\n                await this.deleteRegistration();\n            },\n        })];\n    }\n\n    getActionsForCategory(category: GroupCategoryTree, action: (group: Group) => void | Promise<void>): TableAction<PlatformMember>[] {\n        return [\n            ...category.categories.map((c) => {\n                return new MenuTableAction({\n                    name: c.settings.name,\n                    groupIndex: 2,\n                    needsSelection: true,\n                    allowAutoSelectAll: false,\n                    enabled: c.groups.length > 0 || c.categories.length > 0,\n                    childActions: () => this.getActionsForCategory(c, action),\n                });\n            }),\n            ...category.groups.map((g) => {\n                return new InMemoryTableAction({\n                    name: g.settings.name,\n                    needsSelection: true,\n                    allowAutoSelectAll: false,\n                    handler: async () => {\n                        await action(g);\n                    },\n                });\n            }),\n        ];\n    }\n\n    getAdminActions(): TableAction<PlatformMember>[] {\n        if (this.registrations.length !== 1) {\n            return [];\n        }\n        const organizationId = this.registrations[0].organizationId;\n        if (this.context.organization?.id === organizationId) {\n            return [];\n        }\n\n        if (this.context.auth.platformPermissions === null) {\n            return [];\n        }\n\n        const memberId = this.registrations[0].memberId;\n        const registration = this.registrations[0];\n        const member = this.members.find(m => m.id === memberId);\n        if (!member) {\n            return [];\n        }\n        const organization = member.organizations.find(o => o.id === registration.organizationId);\n        if (!organization) {\n            return [];\n        }\n\n        // Add quick switch action\n        return [\n            new InMemoryTableAction({\n                name: 'Open beheerderportaal',\n                description: organization.name,\n                priority: 0,\n                groupIndex: 5,\n                needsSelection: true,\n                allowAutoSelectAll: false,\n                icon: 'external',\n                enabled: this.hasWrite,\n                handler: async () => {\n                    const href = '/beheerders/' + organization.uri;\n                    window.open(href, '_blank');\n                },\n            }),\n        ];\n    }\n\n    getActions(options: { selectedOrganizationRegistrationPeriod?: OrganizationRegistrationPeriod } = {}): TableAction<PlatformMember>[] {\n        return [\n            ...this.getMoveAction(options.selectedOrganizationRegistrationPeriod),\n            ...this.getAdminActions(),\n            ...this.getEditAction(),\n            ...this.getUnsubscribeAction(),\n        ];\n    }\n\n    async deleteRegistration() {\n        const deleteRegistrations: RegistrationWithMember[] = [];\n\n        for (const registration of this.registrations) {\n            const member = this.members.find(m => m.id === registration.memberId);\n            if (!member) {\n                console.warn('Member not found for registration in RegistrationActionBuilder.moveRegistrations', registration);\n                continue;\n            }\n\n            deleteRegistrations.push(RegistrationWithMember.from(registration, member.patchedMember.tiny));\n        }\n\n        return await chooseOrganizationMembersForGroup({\n            organization: this.organization,\n            context: this.context,\n            owner: this.owner,\n            deleteRegistrations,\n            members: this.members,\n            items: [],\n            navigate: {\n                present: this.present,\n                show: this.present,\n                pop: () => Promise.resolve(),\n                dismiss: () => Promise.resolve(),\n            },\n        });\n    }\n\n    async moveRegistrations(group: Group) {\n        const items: RegisterItem[] = [];\n        const checkout = new RegisterCheckout();\n        checkout.setDefaultOrganization(this.organization);\n\n        for (const registration of this.registrations) {\n            const member = this.members.find(m => m.id === registration.memberId);\n            if (!member) {\n                console.warn('Member not found for registration in RegistrationActionBuilder.moveRegistrations', registration);\n                continue;\n            }\n\n            member.family.checkout = checkout;\n            member.family.pendingRegisterItems = [];\n\n            const item = registration.group.id === group.id ? RegisterItem.fromRegistration(registration, member, this.organization) : RegisterItem.defaultFor(member, group, this.organization);\n            item.replaceRegistrations = [registration];\n            items.push(item);\n        }\n\n        if (items.length === 1) {\n            return await checkoutRegisterItem({\n                item: items[0],\n                admin: true,\n                context: this.context,\n                navigate: {\n                    present: this.present,\n                    show: this.present,\n                    pop: () => Promise.resolve(),\n                    dismiss: () => Promise.resolve(),\n                },\n                displayOptions: {\n                    action: 'present',\n                    modalDisplayStyle: 'popup',\n                },\n\n                // Immediately checkout instead of only adding it to the cart\n                startCheckoutFlow: true,\n            });\n        }\n\n        return await chooseOrganizationMembersForGroup({\n            group,\n            context: this.context,\n            owner: this.owner,\n            items,\n            navigate: {\n                present: this.present,\n                show: this.present,\n                pop: () => Promise.resolve(),\n                dismiss: () => Promise.resolve(),\n            },\n        });\n    }\n\n    async editRegistrations() {\n        const items: RegisterItem[] = [];\n        const groupOrganization = this.organization;\n        const checkout = new RegisterCheckout();\n        checkout.setDefaultOrganization(groupOrganization);\n\n        for (const registration of this.registrations) {\n            const member = this.members.find(m => m.id === registration.memberId);\n            if (!member) {\n                console.warn('Member not found for registration in RegistrationActionBuilder.editRegistrations', registration);\n                continue;\n            }\n            member.family.checkout = checkout;\n            member.family.pendingRegisterItems = [];\n\n            const item = RegisterItem.fromRegistration(registration, member, groupOrganization);\n            item.replaceRegistrations = [registration];\n            items.push(item);\n        }\n\n        if (items.length === 1) {\n            return await checkoutRegisterItem({\n                item: items[0],\n                admin: true,\n                context: this.context,\n                navigate: {\n                    present: this.present,\n                    show: this.present,\n                    pop: () => Promise.resolve(),\n                    dismiss: () => Promise.resolve(),\n                },\n                displayOptions: {\n                    action: 'present',\n                    modalDisplayStyle: 'popup',\n                },\n\n                // Immediately checkout instead of only adding it to the cart\n                startCheckoutFlow: true,\n            });\n        }\n\n        return await chooseOrganizationMembersForGroup({\n            organization: groupOrganization,\n            context: this.context,\n            owner: this.owner,\n            items,\n            navigate: {\n                present: this.present,\n                show: this.present,\n                pop: () => Promise.resolve(),\n                dismiss: () => Promise.resolve(),\n            },\n        });\n    }\n}\n","import { SelectableColumn, SelectableSheet, SelectableWorkbook } from '@stamhoofd/frontend-excel-export';\nimport { ContextPermissions } from '@stamhoofd/networking';\nimport { AccessRight, FinancialSupportSettings, Group, Organization, Platform, RecordCategory } from '@stamhoofd/structures';\n\n// , permissions?: UserPermissions|null\nexport function getSelectableWorkbook(platform: Platform, organization: Organization | null, groups: Group[] = [], auth: ContextPermissions) {\n    const recordCategories = [\n        ...(organization?.meta.recordsConfiguration.recordCategories ?? []),\n        ...platform.config.recordsConfiguration.recordCategories,\n    ];\n\n    const financialSupportSettings = platform.config.financialSupport ?? FinancialSupportSettings.create({});\n    const financialSupportTitle = financialSupportSettings.title;\n\n    const flattenedCategories = RecordCategory.flattenCategoriesWith(recordCategories, r => r.excelColumns.length > 0);\n\n    const groupColumns: SelectableColumn[] = [];\n\n    for (const group of groups) {\n        if (group.settings.prices.length > 1) {\n            groupColumns.push(\n                new SelectableColumn({\n                    id: `groups.${group.id}.price`,\n                    name: 'Tarief',\n                    category: group.settings.name,\n                }),\n            );\n        }\n\n        for (const menu of group.settings.optionMenus) {\n            groupColumns.push(\n                new SelectableColumn({\n                    id: `groups.${group.id}.optionMenu.${menu.id}`,\n                    name: menu.name,\n                    category: group.settings.name,\n                }),\n            );\n\n            for (const option of menu.options) {\n                if (option.allowAmount) {\n                    groupColumns.push(\n                        new SelectableColumn({\n                            id: `groups.${group.id}.optionMenu.${menu.id}.${option.id}.amount`,\n                            name: menu.name + ' → Aantal \"' + option.name + '\"',\n                            category: group.settings.name,\n                        }),\n                    );\n                }\n            }\n        }\n\n        for (const recordCategory of group.settings.recordCategories) {\n            const records = recordCategory.getAllRecords();\n\n            for (const record of records) {\n                groupColumns.push(\n                    new SelectableColumn({\n                        id: `groups.${group.id}.recordAnswers.${record.id}`,\n                        name: recordCategory.name + ' → ' + record.name,\n                        category: group.settings.name,\n                    }),\n                );\n            }\n        }\n    }\n\n    const returnNullIfNoAccessRight = (column: SelectableColumn, requiresAccessRights: AccessRight[]) => {\n        if (requiresAccessRights.some(accessRight => !auth.hasAccessRight(accessRight))) {\n            return null;\n        }\n\n        return column;\n    };\n\n    const columns: (SelectableColumn | null) [] = [\n        new SelectableColumn({\n            id: 'id',\n            name: 'ID',\n            description: 'Unieke identificatie van het lid',\n            enabled: false,\n        }),\n\n        // todo: only if platform?\n        new SelectableColumn({\n            id: 'memberNumber',\n            name: 'Nummer',\n            description: 'Nummer van het lid',\n        }),\n\n        new SelectableColumn({\n            id: 'firstName',\n            name: 'Voornaam',\n        }),\n\n        new SelectableColumn({\n            id: 'lastName',\n            name: 'Achternaam',\n        }),\n\n        new SelectableColumn({\n            id: 'birthDay',\n            name: 'Geboortedatum',\n        }),\n\n        new SelectableColumn({\n            id: 'age',\n            name: 'Leeftijd',\n            enabled: false,\n        }),\n\n        new SelectableColumn({\n            id: 'gender',\n            name: 'Geslacht',\n        }),\n\n        new SelectableColumn({\n            id: 'phone',\n            name: 'Telefoonnummer',\n        }),\n\n        new SelectableColumn({\n            id: 'email',\n            name: 'E-mailadres',\n        }),\n\n        new SelectableColumn({\n            id: 'address',\n            name: 'Adres',\n            description: 'Adres van het lid, of het adres van de eerste ouder met een adres.',\n        }),\n\n        new SelectableColumn({\n            id: 'securityCode',\n            name: 'Beveiligingscode',\n            enabled: false,\n            description: 'Code om een onbekende gebruiker toegang te geven tot een lid.',\n        }),\n\n        returnNullIfNoAccessRight(new SelectableColumn({\n            id: 'requiresFinancialSupport',\n            name: financialSupportTitle,\n            enabled: false,\n        }), [AccessRight.MemberReadFinancialData]),\n\n        returnNullIfNoAccessRight(new SelectableColumn({\n            id: 'uitpasNumber',\n            name: 'UiTPAS-nummer',\n        }), [AccessRight.MemberReadFinancialData]),\n\n        new SelectableColumn({\n            id: 'notes',\n            name: 'Notities',\n            enabled: false,\n        }),\n\n        returnNullIfNoAccessRight(new SelectableColumn({\n            id: 'nationalRegisterNumber',\n            name: 'Rijksregisternummer',\n        }), [AccessRight.MemberManageNRN]),\n\n        ...groupColumns,\n\n        ...(!organization\n            ? [\n                    new SelectableColumn({\n                        id: 'organization',\n                        name: 'Groep',\n                        enabled: false,\n                    }),\n                    new SelectableColumn({\n                        id: 'uri',\n                        name: 'Groepsnummer',\n                        enabled: false,\n                    }),\n                    new SelectableColumn({\n                        id: 'defaultAgeGroup',\n                        name: 'Standaard leeftijdsgroep',\n                        enabled: false,\n                    }),\n                ]\n            : []),\n\n        ...(organization\n            ? [\n                    new SelectableColumn({\n                        id: 'group',\n                        name: 'Leeftijdsgroep',\n                        enabled: false,\n                    }),\n                ]\n            : []),\n\n        ...[1, 2].flatMap((parentNumber, parentIndex) => {\n            const getId = (value: string) => `parent.${parentIndex}.${value}`;\n            const category = `Ouder ${parentNumber}`;\n            const enabled = false;\n\n            return [\n                new SelectableColumn({\n                    id: getId('type'),\n                    name: 'Type ' + category,\n                    category,\n                    enabled,\n                }),\n                new SelectableColumn({\n                    id: getId('firstName'),\n                    name: 'Voornaam ' + category,\n                    category,\n                    enabled,\n                }),\n                new SelectableColumn({\n                    id: getId('lastName'),\n                    name: 'Achternaam ' + category,\n                    category,\n                    enabled,\n                }),\n                new SelectableColumn({\n                    id: getId('phone'),\n                    name: 'Telefoonnummer ' + category,\n                    category,\n                    enabled,\n                }),\n\n                new SelectableColumn({\n                    id: getId('email'),\n                    name: 'E-mailadres ' + category,\n                    category,\n                    enabled,\n                }),\n                new SelectableColumn({\n                    id: getId('address'),\n                    name: 'Adres ' + category,\n                    category,\n                    enabled,\n                }),\n                returnNullIfNoAccessRight(new SelectableColumn({\n                    id: getId('nationalRegisterNumber'),\n                    name: 'Rijksregisternummer ' + category,\n                    category,\n                    enabled,\n                }), [AccessRight.MemberManageNRN]),\n            ];\n        }),\n\n        new SelectableColumn({\n            id: 'unverifiedPhones',\n            name: 'Telefoonnummers',\n            category: 'Niet-geverifieerde gegevens',\n            enabled: false,\n        }),\n\n        new SelectableColumn({\n            id: 'unverifiedEmails',\n            name: 'E-mailadressen',\n            category: 'Niet-geverifieerde gegevens',\n            enabled: false,\n        }),\n\n        ...[1, 2].map((number, index) => {\n            return new SelectableColumn({\n                id: `unverifiedAddresses.${index}`,\n                name: `Adres ${number}`,\n                category: 'Niet-geverifieerde gegevens',\n                enabled: false,\n            });\n        }),\n\n        ...flattenedCategories.flatMap((category) => {\n            return category.getAllRecords().flatMap((record) => {\n                return new SelectableColumn({\n                    id: `recordAnswers.${record.id}`,\n                    name: record.name,\n                    category: category.name,\n                    description: record.description,\n                });\n            });\n        }),\n    ];\n\n    return new SelectableWorkbook({\n        sheets: [\n            new SelectableSheet({\n                id: 'members',\n                name: 'Leden',\n                columns: columns.filter(column => column !== null),\n            }),\n        ],\n    });\n}\n","import { PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { ComponentWithProperties, NavigationController, usePresent } from '@simonbackx/vue-app-navigation';\nimport { ExcelExportView } from '@stamhoofd/frontend-excel-export';\nimport { SessionContext, useRequestOwner } from '@stamhoofd/networking';\nimport { EmailRecipientFilterType, EmailRecipientSubfilter, ExcelExportType, Group, GroupCategoryTree, GroupType, MemberWithRegistrationsBlob, Organization, OrganizationRegistrationPeriod, PermissionLevel, Platform, PlatformMember, RegistrationWithMember, mergeFilters } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { markRaw } from 'vue';\nimport { EditMemberAllBox, MemberSegmentedView, MemberStepView, checkoutDefaultItem, chooseOrganizationMembersForGroup } from '..';\nimport { GlobalEventBus } from '../../EventBus';\nimport { AuditLogsView } from '../../audit-logs';\nimport EmailView, { RecipientChooseOneOption } from '../../email/EmailView.vue';\nimport { manualFeatureFlag, useContext, useOrganization, usePlatform } from '../../hooks';\nimport { Toast } from '../../overlays/Toast';\nimport { AsyncTableAction, InMemoryTableAction, MenuTableAction, TableAction, TableActionSelection } from '../../tables/classes';\nimport { NavigationActions } from '../../types/NavigationActions';\nimport DeleteView from '../../views/DeleteView.vue';\nimport { PlatformFamilyManager, usePlatformFamilyManager } from '../PlatformFamilyManager';\nimport EditMemberResponsibilitiesBox from '../components/edit/EditMemberResponsibilitiesBox.vue';\nimport { RegistrationActionBuilder } from './RegistrationActionBuilder';\nimport { getSelectableWorkbook } from './getSelectableWorkbook';\n\nexport function useDirectMemberActions(options?: { groups?: Group[]; organizations?: Organization[] }) {\n    return useMemberActions()(options);\n}\n\nexport function useMemberActions() {\n    const present = usePresent();\n    const context = useContext();\n    const platformFamilyManager = usePlatformFamilyManager();\n    const owner = useRequestOwner();\n    const organization = useOrganization();\n    const platform = usePlatform();\n\n    return (options?: { groups?: Group[]; organizations?: Organization[]; forceWriteAccess?: boolean | null }) => {\n        return new MemberActionBuilder({\n            present,\n            platform: platform.value,\n            context: context.value,\n            groups: options?.groups ?? [],\n            organizations: organization.value ? [organization.value] : (options?.organizations ?? []),\n            platformFamilyManager,\n            owner,\n            forceWriteAccess: options?.forceWriteAccess,\n        });\n    };\n}\n\nexport class MemberActionBuilder {\n    /**\n     * Determines which registrations will get moved or removed\n     */\n    groups: Group[];\n    platform: Platform;\n\n    /**\n     * Determines what to move or register the members to\n     */\n    organizations: Organization[];\n\n    present: ReturnType<typeof usePresent>;\n    context: SessionContext;\n    platformFamilyManager: PlatformFamilyManager;\n    owner: any;\n\n    forceWriteAccess: boolean | null = null;\n\n    constructor(settings: {\n        present: ReturnType<typeof usePresent>;\n        context: SessionContext;\n        groups: Group[];\n        platform: Platform;\n        organizations: Organization[];\n        platformFamilyManager: PlatformFamilyManager;\n        owner: any;\n        forceWriteAccess?: boolean | null;\n    }) {\n        this.present = settings.present;\n        this.context = settings.context;\n        this.platform = settings.platform;\n        this.groups = settings.groups;\n        this.organizations = settings.organizations;\n        this.platformFamilyManager = settings.platformFamilyManager;\n        this.owner = settings.owner;\n        this.forceWriteAccess = settings.forceWriteAccess ?? null;\n    }\n\n    get hasWrite() {\n        if (this.forceWriteAccess !== null) {\n            return this.forceWriteAccess;\n        }\n\n        for (const group of this.groups) {\n            if (!this.context.auth.canAccessGroup(group, PermissionLevel.Write)) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    getRegistrationActionBuilder(members: PlatformMember[]) {\n        if (this.organizations.length !== 1) {\n            return;\n        }\n\n        const groupOrganization = this.organizations[0];\n        const registrations = members.flatMap(m => m.filterRegistrations({ groups: this.groups, organizationId: groupOrganization.id }));\n\n        return new RegistrationActionBuilder({\n            context: this.context,\n            owner: this.owner,\n            present: this.present,\n            organization: groupOrganization,\n            registrations,\n            members,\n            platformFamilyManager: this.platformFamilyManager,\n        });\n    }\n\n    getRegisterActions(organization?: Organization): TableAction<PlatformMember>[] {\n        if (!organization) {\n            if (this.organizations.length === 1) {\n                return this.getRegisterActions(this.organizations[0]);\n            }\n            return this.organizations.map((org) => {\n                return new MenuTableAction({\n                    name: 'Inschrijven bij ' + org.name,\n                    groupIndex: 0,\n                    childActions: () => this.getRegisterActions(org),\n                });\n            });\n        }\n\n        return [\n            new MenuTableAction({\n                name: 'Wachtlijsten',\n                groupIndex: 0,\n                enabled: organization.period.waitingLists.length > 0,\n                childActions: () => [\n                    ...organization.period.waitingLists.map((g) => {\n                        return new InMemoryTableAction({\n                            name: g.settings.name,\n                            needsSelection: true,\n                            allowAutoSelectAll: false,\n                            handler: async (members: PlatformMember[]) => {\n                                await this.register(members, g);\n                            },\n                        });\n                    }),\n                ],\n            }),\n            ...this.getActionsForCategory(organization.period.adminCategoryTree, async (members, group) => await this.register(members, group)).map((r) => {\n                r.description = organization.period.period.name;\n                return r;\n            }),\n        ];\n    }\n\n    getMoveAction(selectedOrganizationRegistrationPeriod?: OrganizationRegistrationPeriod): TableAction<PlatformMember>[] {\n        if (this.organizations.length !== 1) {\n            return [];\n        }\n\n        if (this.groups.filter(g => g.type !== GroupType.EventRegistration).length === 0) {\n            return [];\n        }\n\n        const organization = this.organizations[0];\n        const period = selectedOrganizationRegistrationPeriod ?? organization.period;\n\n        return [\n            new MenuTableAction({\n                name: 'Verplaatsen naar',\n                priority: 1,\n                groupIndex: 5,\n                needsSelection: true,\n                allowAutoSelectAll: false,\n                enabled: this.hasWrite,\n                childActions: () => [\n                    new MenuTableAction({\n                        name: 'Wachtlijsten',\n                        groupIndex: 0,\n                        enabled: organization.period.waitingLists.length > 0,\n                        childActions: () => [\n                            ...organization.period.waitingLists.map((g) => {\n                                return new InMemoryTableAction({\n                                    name: g.settings.name,\n                                    needsSelection: true,\n                                    allowAutoSelectAll: false,\n                                    handler: async (members: PlatformMember[]) => {\n                                        await this.moveRegistrations(members, g);\n                                    },\n                                });\n                            }),\n                        ],\n                    }),\n                    ...this.getActionsForCategory(period.adminCategoryTree, (members, group) => this.moveRegistrations(members, group)).map((r) => {\n                        r.description = period.period.name;\n                        return r;\n                    }),\n                ],\n            }),\n        ];\n    }\n\n    getAuditLogAction(): TableAction<PlatformMember>[] {\n        if ((this.organizations.length !== 1 || this.organizations[0].id !== this.context.organization?.id) && !this.context.auth.hasPlatformFullAccess()) {\n            return [];\n        }\n\n        if (this.organizations.length === 1 && this.organizations[0].id === this.context.organization?.id && !this.context.auth.hasFullAccess()) {\n            return [];\n        }\n\n        if (!manualFeatureFlag('audit-logs', this.context)) {\n            return [];\n        }\n\n        return [\n            new InMemoryTableAction({\n                name: 'Toon geschiedenis',\n                priority: 1,\n                groupIndex: 6,\n                needsSelection: true,\n                allowAutoSelectAll: false,\n                handler: async (members: PlatformMember[]) => {\n                    if (members.length > 100) {\n                        Toast.error('Te veel leden geselecteerd').show();\n                        return;\n                    }\n                    await this.present({\n                        components: [\n                            new ComponentWithProperties(AuditLogsView, {\n                                objectIds: members.map(m => m.id),\n                            }),\n                        ],\n                        modalDisplayStyle: 'popup',\n                    });\n                },\n                icon: 'history',\n            }),\n        ];\n    }\n\n    getEditAction(): TableAction<PlatformMember>[] {\n        if (this.organizations.length !== 1 || this.groups.length === 0) {\n            return [];\n        }\n\n        return [\n            new InMemoryTableAction({\n                name: 'Inschrijving bewerken',\n                priority: 1,\n                groupIndex: 1,\n                needsSelection: true,\n                allowAutoSelectAll: false,\n                enabled: this.hasWrite,\n                handler: async (members: PlatformMember[]) => {\n                    await this.editRegistrations(members);\n                },\n                icon: 'edit',\n            }),\n        ];\n    }\n\n    getUnsubscribeAction(): TableAction<PlatformMember>[] {\n        if (this.groups.length === 0) {\n            return [];\n        }\n\n        return [new InMemoryTableAction({\n            name: 'Uitschrijven',\n            destructive: true,\n            priority: 0,\n            groupIndex: 7,\n            needsSelection: true,\n            allowAutoSelectAll: false,\n            enabled: this.hasWrite,\n            handler: async (members) => {\n                await this.deleteRegistration(members);\n            },\n        })];\n    }\n\n    getActionsForCategory(category: GroupCategoryTree, action: (members: PlatformMember[], group: Group) => void | Promise<void>): TableAction<PlatformMember>[] {\n        const r = [\n            ...category.categories.map((c) => {\n                return new MenuTableAction({\n                    name: c.settings.name,\n                    groupIndex: 2,\n                    needsSelection: true,\n                    allowAutoSelectAll: false,\n                    enabled: c.groups.length > 0 || c.categories.length > 0,\n                    childActions: this.getActionsForCategory(c, action),\n                });\n            }),\n            ...category.groups.map((g) => {\n                return new InMemoryTableAction({\n                    name: g.settings.name,\n                    needsSelection: true,\n                    allowAutoSelectAll: false,\n                    handler: async (members: PlatformMember[]) => {\n                        await action(members, g);\n                    },\n                });\n            }),\n        ];\n\n        if (r.filter(rr => rr.enabled).length === 1) {\n            const rr = r.filter(rr => rr.enabled)[0];\n            if (rr instanceof MenuTableAction && Array.isArray(rr.childActions)) {\n                return rr.childActions;\n            }\n        }\n\n        return r;\n    }\n\n    getActions(options: { includeDelete?: boolean; includeMove?: boolean; includeEdit?: boolean, selectedOrganizationRegistrationPeriod?: OrganizationRegistrationPeriod } = {}): TableAction<PlatformMember>[] {\n        const actions = [\n            new InMemoryTableAction({\n                name: 'Gegevens bewerken',\n                icon: 'edit',\n                priority: 2,\n                groupIndex: 1,\n                needsSelection: true,\n                singleSelection: true,\n                enabled: this.hasWrite,\n                handler: (members: PlatformMember[]) => {\n                    this.editMember(members[0]);\n                },\n            }),\n\n            new InMemoryTableAction({\n                name: 'Functies bewerken',\n                icon: 'star',\n                priority: 0,\n                groupIndex: 1,\n                needsSelection: true,\n                singleSelection: true,\n                enabled: this.context.auth.hasFullAccess(),\n                handler: (members: PlatformMember[]) => {\n                    this.editResponsibilities(members[0]);\n                },\n            }),\n\n            new AsyncTableAction({\n                name: 'E-mailen',\n                icon: 'email',\n                priority: 12,\n                groupIndex: 3,\n                handler: async (selection: TableActionSelection<PlatformMember>) => {\n                    await this.openMail(selection);\n                },\n            }),\n\n            new AsyncTableAction({\n                name: 'Exporteren naar Excel',\n                icon: 'download',\n                priority: 11,\n                groupIndex: 3,\n                handler: async (selection) => {\n                    console.log('selection', selection);\n                    // TODO: vervangen door een context menu\n                    await this.exportToExcel(selection);\n                },\n            }),\n            new MenuTableAction({\n                name: 'Inschrijven voor',\n                priority: 1,\n                groupIndex: 5,\n                needsSelection: true,\n                allowAutoSelectAll: false,\n                enabled: this.hasWrite && !!this.context.organization,\n                childActions: () => this.getRegisterActions(),\n            }),\n            ...(options.includeMove === true ? this.getMoveAction(options.selectedOrganizationRegistrationPeriod) : []),\n            ...(options.includeEdit === true ? this.getEditAction() : []),\n            ...this.getUnsubscribeAction(),\n            ...this.getAuditLogAction()\n        ];\n\n        if (options.includeDelete) {\n            actions.push(\n                new InMemoryTableAction({\n                    name: 'Definitief verwijderen',\n                    destructive: true,\n                    priority: 1,\n                    groupIndex: 100,\n                    needsSelection: true,\n                    allowAutoSelectAll: false,\n                    icon: 'trash',\n                    enabled: !this.context.organization && this.context.auth.hasFullPlatformAccess(),\n                    handler: async (members: PlatformMember[]) => {\n                        await this.deleteMembers(members);\n                    },\n                }));\n        }\n\n        return actions;\n    }\n\n    // Action implementations\n    async openMail(selection: TableActionSelection<PlatformMember>) {\n        const filter = selection.filter.filter;\n        const search = selection.filter.search;\n\n        const options: RecipientChooseOneOption[] = [];\n\n        options.push({\n            type: 'ChooseOne',\n            options: [\n                {\n                    id: 'all',\n                    name: 'Alle leden',\n                    value: [\n                        EmailRecipientSubfilter.create({\n                            type: EmailRecipientFilterType.Members,\n                            filter,\n                            search,\n                        }),\n                    ],\n                },\n                {\n                    id: 'none',\n                    name: 'Geen leden',\n                    value: [],\n                },\n                {\n                    id: 'adults',\n                    name: 'Alle volwassen leden',\n                    value: [\n                        EmailRecipientSubfilter.create({\n                            type: EmailRecipientFilterType.Members,\n                            filter: mergeFilters([\n                                filter,\n                                {\n                                    age: {\n                                        $gt: 17,\n                                    },\n                                },\n                            ]),\n                            search,\n                        }),\n                    ],\n                },\n            ],\n        });\n\n        options.push({\n            type: 'ChooseOne',\n            options: [\n                {\n                    id: 'minors',\n                    name: 'Ouders van minderjarige leden',\n                    value: [\n                        EmailRecipientSubfilter.create({\n                            type: EmailRecipientFilterType.MemberParents,\n                            filter: mergeFilters([\n                                filter,\n                                {\n                                    age: {\n                                        $lt: 18,\n                                    },\n                                },\n                            ]),\n                            search,\n                        }),\n                    ],\n                },\n                {\n                    id: 'all',\n                    name: 'Alle ouders',\n                    value: [\n                        EmailRecipientSubfilter.create({\n                            type: EmailRecipientFilterType.MemberParents,\n                            filter,\n                            search,\n                        }),\n                    ],\n                },\n                {\n                    id: 'none',\n                    name: 'Geen ouders',\n                    value: [],\n                },\n            ],\n        });\n\n        options.push({\n            type: 'ChooseOne',\n            options: [\n                {\n                    id: 'none',\n                    name: 'Geen niet-geverifieerde adressen',\n                    value: [],\n                },\n                {\n                    id: 'minors',\n                    name: 'Niet-geverifieerde adressen van minderjarige leden',\n                    value: [\n                        EmailRecipientSubfilter.create({\n                            type: EmailRecipientFilterType.MemberUnverified,\n                            filter: mergeFilters([\n                                filter,\n                                {\n                                    age: {\n                                        $lt: 18,\n                                    },\n                                },\n                            ]),\n                            search,\n                        }),\n                    ],\n                },\n                {\n                    id: 'all',\n                    name: 'Alle niet-geverifieerde adressen',\n                    value: [\n                        EmailRecipientSubfilter.create({\n                            type: EmailRecipientFilterType.MemberUnverified,\n                            filter,\n                            search,\n                        }),\n                    ],\n                },\n            ],\n        });\n\n        const displayedComponent = new ComponentWithProperties(NavigationController, {\n            root: new ComponentWithProperties(EmailView, {\n                recipientFilterOptions: options,\n            }),\n        });\n        await this.present({\n            components: [\n                displayedComponent,\n            ],\n            modalDisplayStyle: 'popup',\n        });\n    }\n\n    async showMember(member: PlatformMember) {\n        const component = new ComponentWithProperties(NavigationController, {\n            root: new ComponentWithProperties(MemberSegmentedView, {\n                member,\n            }),\n        });\n\n        await this.present({\n            components: [component],\n            modalDisplayStyle: 'popup',\n        });\n    }\n\n    editMember(member: PlatformMember) {\n        this.present({\n            components: [\n                new ComponentWithProperties(MemberStepView, {\n                    member,\n                    title: member.member.firstName + ' bewerken',\n                    component: markRaw(EditMemberAllBox),\n                    saveHandler: async ({ dismiss }: NavigationActions) => {\n                        await dismiss({ force: true });\n                    },\n                }),\n            ],\n            modalDisplayStyle: 'popup',\n        }).catch(console.error);\n    }\n\n    editResponsibilities(member: PlatformMember) {\n        this.present({\n            components: [\n                new ComponentWithProperties(MemberStepView, {\n                    member,\n                    title: 'Functies van ' + member.member.firstName,\n                    component: markRaw(EditMemberResponsibilitiesBox),\n                    saveHandler: async ({ dismiss }: NavigationActions) => {\n                        await dismiss({ force: true });\n                    },\n                }),\n            ],\n            modalDisplayStyle: 'popup',\n        }).catch(console.error);\n    }\n\n    async deleteMembers(members: PlatformMember[]) {\n        if (members.length > 1) {\n            throw new SimpleError({\n                code: 'not-supported',\n                message: 'Meerdere leden verwijderen is niet ondersteund',\n            });\n        }\n\n        const member = members[0].patchedMember;\n        const name = member.name;\n\n        await this.present({\n            components: [\n                new ComponentWithProperties(DeleteView, {\n                    title: `${name} definitief verwijderen?`,\n                    description: `Ben je 100% zeker dat je ${name} wilt verwijderen? Vul dan de volledige naam van het lid in ter bevestiging. De volledige geschiedenis gaat verloren. Probeer dit absoluut te vermijden en enkel voor uitzonderingen te gebruiken.`,\n                    confirmationTitle: 'Bevestig de naam van het lid',\n                    confirmationPlaceholder: 'Volledige naam',\n                    confirmationCode: name,\n                    checkboxText: 'Ja, ik ben 100% zeker',\n                    onDelete: async () => {\n                        const patch = new PatchableArray() as PatchableArrayAutoEncoder<MemberWithRegistrationsBlob>;\n                        for (const member of members) {\n                            patch.addDelete(member.id);\n                        }\n\n                        await this.platformFamilyManager.isolatedPatch(members, patch);\n                        GlobalEventBus.sendEvent('members-deleted', members).catch(console.error);\n\n                        Toast.success(Formatter.capitalizeFirstLetter(Formatter.pluralText(members.length, 'lid', 'leden')) + ' verwijderd').show();\n                        return true;\n                    },\n                }),\n            ],\n            modalDisplayStyle: 'sheet',\n        });\n    }\n\n    async exportToExcel(selection: TableActionSelection<PlatformMember>) {\n        await this.present({\n            components: [\n                new ComponentWithProperties(NavigationController, {\n                    root: new ComponentWithProperties(ExcelExportView, {\n                        type: ExcelExportType.Members,\n                        filter: selection.filter,\n                        workbook: getSelectableWorkbook(this.platform, this.organizations.length === 1 ? this.organizations[0] : null, this.groups, this.context.auth),\n                        configurationId: 'members',\n                    }),\n                }),\n            ],\n            modalDisplayStyle: 'popup',\n        });\n    }\n\n    async deleteRegistration(members: PlatformMember[]) {\n        const deleteRegistrations = members.flatMap(m => m.filterRegistrations({ groups: this.groups }).map(r => RegistrationWithMember.from(r, m.patchedMember.tiny)));\n        return await chooseOrganizationMembersForGroup({\n            members,\n            group: this.groups[0],\n            context: this.context,\n            owner: this.owner,\n            deleteRegistrations,\n            items: [],\n            navigate: {\n                present: this.present,\n                show: this.present,\n                pop: () => Promise.resolve(),\n                dismiss: () => Promise.resolve(),\n            },\n        });\n    }\n\n    get groupIds() {\n        return this.groups?.map(g => g.id) ?? [];\n    }\n\n    async moveRegistrations(members: PlatformMember[], group: Group) {\n        return this.getRegistrationActionBuilder(members)?.moveRegistrations(group);\n    }\n\n    async editRegistrations(members: PlatformMember[]) {\n        return this.getRegistrationActionBuilder(members)?.editRegistrations();\n    }\n\n    async register(members: PlatformMember[], group: Group) {\n        if (members.length === 1) {\n            return await checkoutDefaultItem({\n                member: members[0],\n                group,\n                admin: true,\n                groupOrganization: this.organizations.find(o => o.id === group.organizationId)!,\n                context: this.context,\n                navigate: {\n                    present: this.present,\n                    show: this.present,\n                    pop: () => Promise.resolve(),\n                    dismiss: () => Promise.resolve(),\n                },\n                displayOptions: {\n                    action: 'present',\n                    modalDisplayStyle: 'popup',\n                },\n\n                // Immediately checkout instead of only adding it to the cart\n                startCheckoutFlow: true,\n            });\n        }\n\n        return await chooseOrganizationMembersForGroup({\n            members,\n            group,\n            context: this.context,\n            owner: this.owner,\n            navigate: {\n                present: this.present,\n                show: this.present,\n                pop: () => Promise.resolve(),\n                dismiss: () => Promise.resolve(),\n            },\n        });\n    }\n}\n","import { ComponentWithProperties, usePresent } from \"@simonbackx/vue-app-navigation\";\nimport { PlatformMember } from \"@stamhoofd/structures\";\nimport { markRaw } from \"vue\";\nimport { EditMemberAllBox, MemberStepView } from \"..\";\nimport { NavigationActions } from \"../../types/NavigationActions\";\n\nexport function useEditMember() {\n    const present = usePresent();\n\n    return (member: PlatformMember) => present({\n        components: [\n            new ComponentWithProperties(MemberStepView, {\n                member: member,\n                title: member.member.firstName + ' bewerken',\n                component: markRaw(EditMemberAllBox),\n                saveHandler: async ({dismiss}: NavigationActions) => {\n                    await dismiss({force: true});\n                }\n            })\n        ],\n        modalDisplayStyle: \"popup\"\n    })\n}\n","<template>\n    <div v-if=\"member.patchedMember.users.length > 0\" class=\"hover-box container\">\n        <hr>\n        <h2 class=\"style-with-button\">\n            <span class=\"icon-spacer\">Accounts</span>\n            <a\n                v-if=\"!$isTouch && app !== 'registration'\"\n                class=\"button icon gray help\"\n                target=\"_blank\"\n                :href=\"$domains.getDocs('leden-beheren-met-meerdere-ouders')\"\n            />\n        </h2>\n        <p>Dit zijn alle e-mailadressen die toegang hebben tot de gegevens van {{ member.patchedMember.firstName }}. Hierop kan je inloggen of een account aanmaken.</p>\n        <STList>\n            <STListItem v-for=\"user in sortedUsers\" :key=\"user.id\" class=\"hover-box\">\n                <template v-if=\"user.hasAccount && user.verified\" #left>\n                    <span class=\"icon user small\" />\n                </template>\n                <template v-else-if=\"user.hasAccount && !user.verified\" #left>\n                    <span v-tooltip=\"'Deze gebruiker moet het e-mailadres nog verifiëren.'\" class=\"icon email small\" />\n                </template>\n                <template v-else #left>\n                    <span v-tooltip=\"'Deze gebruiker moet eerst registreren op dit emailadres en daarbij een wachtwoord instellen.'\" class=\"icon email small\" />\n                </template>\n                <template v-if=\"(user.firstName || user.lastName) && (user.name !== member.patchedMember.name)\">\n                    <h3 v-if=\"user.firstName || user.lastName\" class=\"style-title-list\">\n                        {{ user.firstName }} {{ user.lastName }}\n                    </h3>\n                    <p class=\"style-description-small\">\n                        {{ user.email }}\n                    </p>\n                </template>\n                <h3 v-else class=\"style-title-list\">\n                    {{ user.email }}\n                </h3>\n                <p v-if=\"!user.hasAccount\" class=\"style-description-small\">\n                    Kan registreren\n                </p>\n                <p v-else-if=\"!user.verified\" class=\"style-description-small\">\n                    E-mailadres nog niet geverifieerd\n                </p>\n                <p v-if=\"user.memberId === member.id\" class=\"style-description-small\">\n                    Dit is een account van {{ member.patchedMember.firstName }} zelf\n                </p>\n                <p v-if=\"user.permissions && app !== 'registration'\" class=\"style-description-small\">\n                    Heeft toegang tot beheerdersportaal\n                </p>\n                <template v-if=\"app !== 'registration' && hasWrite && user.hasAccount\" #right>\n                    <LoadingButton :loading=\"isDeletingUser(user)\" class=\"hover-show\">\n                        <button type=\"button\" class=\"button icon trash\" @click.stop=\"deleteUser(user)\" />\n                    </LoadingButton>\n                </template>\n            </STListItem>\n        </STList>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { MemberWithRegistrationsBlob, PermissionLevel, PlatformMember, User } from '@stamhoofd/structures';\nimport { Sorter } from '@stamhoofd/utility';\nimport { computed, ref } from 'vue';\nimport { useAppContext } from '../../../context/appContext';\nimport { useAuth } from '../../../hooks';\nimport { Toast } from '../../../overlays/Toast';\nimport { usePlatformFamilyManager } from '../../PlatformFamilyManager';\n\ndefineOptions({\n    inheritAttrs: false\n})\nconst props = defineProps<{\n    member: PlatformMember\n}>()\nconst auth = useAuth()\nconst app = useAppContext()\nconst hasWrite = computed(() => auth.canAccessPlatformMember(props.member, PermissionLevel.Write))\nconst deletingUsers = ref(new Set<string>())\nconst platformFamilyManager = usePlatformFamilyManager()\n\nconst sortedUsers = computed(() => {\n    return props.member.patchedMember.users.slice().sort((a, b) => {\n        return Sorter.stack(\n            Sorter.byBooleanValue(a.id === props.member.id, b.id === props.member.id),\n            Sorter.byBooleanValue(a.hasAccount, b.hasAccount),\n        )\n    })\n})\n\nasync function deleteUser(user: User) {\n    if (deletingUsers.value.has(user.id)) {\n        return\n    }\n\n    deletingUsers.value.add(user.id)\n\n    try {\n        const patch = MemberWithRegistrationsBlob.patch({id: props.member.id})\n        patch.users.addDelete(user.id)\n\n        const arr = new PatchableArray() as PatchableArrayAutoEncoder<MemberWithRegistrationsBlob>\n        arr.addPatch(patch)\n        await platformFamilyManager.isolatedPatch([props.member], arr)\n    } catch (e) {\n        Toast.fromError(e).show()\n    }\n\n    deletingUsers.value.delete(user.id)\n}\n\nfunction isDeletingUser(user: User) {\n    return deletingUsers.value.has(user.id)\n}\n</script>\n","<template>\n    <div id=\"free-contribution-view\" class=\"st-view\">\n        <STNavigationBar title=\"Vrije bijdrage\" />\n        <main>\n            <h1>Vrije bijdrage <span class=\"style-tag\">Optioneel</span></h1>\n            <p v-if=\"description\" class=\"style-description pre-wrap\" v-text=\"description\" />\n\n            <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n            <Radio v-model=\"amountOption\" :value=\"0\">\n                Geen vrije bijdrage\n            </Radio>\n\n            <Radio v-for=\"(a, index) in amounts\" :key=\"index\" v-model=\"amountOption\" :value=\"a\">\n                {{ formatPrice(a) }}\n            </Radio>\n            \n            <Radio v-model=\"amountOption\" :value=\"null\">\n                {{ amounts.length === 0 ? 'Bedrag kiezen' : 'Ander bedrag kiezen' }}\n            </Radio>\n\n            <div v-if=\"amountOption === null\" class=\"textarea-container\">\n                <PriceInput v-model=\"amount\" placeholder=\"Jouw bijdrage\" />\n            </div>\n\n            <p v-if=\"amount >= 5000\" class=\"info-box\">\n                Heel erg bedankt voor de gulle bijdrage! 😍❤️\n            </p>\n\n            <p v-else-if=\"amount >= 3000\" class=\"info-box\">\n                Heel erg bedankt voor de gulle bijdrage! 😍\n            </p>\n\n            <p v-else-if=\"amount >= 1500\" class=\"info-box\">\n                Bedankt voor de warme bijdrage! 🙌\n            </p>     \n\n            <p v-else-if=\"amount > 0\" class=\"info-box\">\n                Bedankt voor de bijdrage 😊\n            </p>              \n        </main>\n\n        <STToolbar>\n            <template #left>\n                <span>Totaal: {{ formatPrice(checkout.totalPrice) }}</span>\n            </template>\n            <template #right>\n                <LoadingButton :loading=\"loading\">\n                    <button class=\"button primary\" type=\"button\" @click=\"goNext\">\n                        <span>Doorgaan</span>\n                        <span class=\"icon arrow-right\" />\n                    </button>\n                </LoadingButton>\n            </template>\n        </STToolbar>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ErrorBox, LoadingButton, NavigationActions, PriceInput, Radio, STErrorsDefault, STNavigationBar, STToolbar, useErrors, useNavigationActions } from \"@stamhoofd/components\";\n\nimport { RegisterCheckout } from \"@stamhoofd/structures\";\nimport { computed, ref, watchEffect } from \"vue\";\n\nconst props = defineProps<{\n    checkout: RegisterCheckout,\n    saveHandler: (navigate: NavigationActions) => Promise<void>\n}>()\n\n\nconst errors = useErrors();\n\nconst organization = computed(() => props.checkout.singleOrganization)\nconst description = computed(() => organization.value?.meta.recordsConfiguration.freeContribution?.description ?? \"\")\nconst amounts = computed(() => (organization.value?.meta.recordsConfiguration.freeContribution?.amounts ?? []).filter(a => a > 0))\nconst loading = ref(false)\nconst navigate = useNavigationActions()\n\nconst amount = computed({\n    get: () => props.checkout.freeContribution,\n    set: (value) => props.checkout.freeContribution = value \n});\nconst amountOption = ref(amounts.value.includes(amount.value) || amount.value === 0 ? amount.value : null)\n\nwatchEffect(() => {\n    if (amountOption.value !== null) {\n        amount.value = amountOption.value\n    }\n})\n\nasync function goNext() {\n    try {\n        await props.saveHandler(navigate)\n    } catch (e) {\n        errors.errorBox = new ErrorBox(e)\n    }\n}\n\n</script>\n\n<style lang=\"scss\">\n#free-contribution-view {\n    .style-description {\n        padding-bottom: 20px;\n    }\n\n    .textarea-container {\n        padding-bottom: 20px;\n        padding-left: 35px;\n        max-width: 200px;\n\n        @media (max-width: 450px) {\n            padding-left: 0;\n        }\n    }\n}\n</style>\n","<template>\n    <div class=\"st-view\">\n        <STNavigationBar :title=\"needsPay ? 'Betaalmethode' : 'Bevestigen'\" />\n        <main v-if=\"needsPay\" class=\"center\">\n            <h1>Kies een betaalmethode</h1>\n\n            <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n            <PaymentSelectionList v-model=\"selectedPaymentMethod\" :payment-configuration=\"paymentConfiguration\" :amount=\"checkout.totalPrice\" :customer=\"checkout.customer\" :organization=\"organization\" />\n\n            <PriceBreakdownBox :price-breakdown=\"checkout.priceBreakown\" />\n        </main>\n        <main v-else class=\"center\">\n            <h1>Bevestig je inschrijvingen</h1>\n            <p>Heb je alle inschrijvingen toegevoegd aan je mandje? Je kan meerdere inschrijvingen in één keer afrekenen.</p>\n\n            <STErrorsDefault :error-box=\"errors.errorBox\" />\n        </main>\n\n        <STToolbar>\n            <template #left>\n                <span>Totaal: {{ formatPrice(checkout.totalPrice) }}</span>\n            </template>\n            <template #right>\n                <LoadingButton :loading=\"loading\">\n                    <button class=\"button primary\" type=\"button\" @click=\"goNext\">\n                        <span v-if=\"needsPay && (selectedPaymentMethod === 'Transfer' || selectedPaymentMethod === 'PointOfSale')\">Bevestigen</span>\n                        <span v-else-if=\"needsPay\">Betalen</span>\n                        <span v-else>Bevestigen</span>\n                        <span class=\"icon arrow-right\" />\n                    </button>\n                </LoadingButton>\n            </template>\n        </STToolbar>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ErrorBox, LoadingButton, NavigationActions, PaymentSelectionList, PriceBreakdownBox, STErrorsDefault, STNavigationBar, STToolbar, useErrors, useNavigationActions } from '@stamhoofd/components';\nimport { RegisterCheckout } from '@stamhoofd/structures';\nimport { computed, onMounted, ref } from 'vue';\n\nconst props = defineProps<{\n    checkout: RegisterCheckout;\n    saveHandler: (navigate: NavigationActions) => Promise<void>;\n}>();\n\nconst errors = useErrors();\n\nconst organization = computed(() => props.checkout.singleOrganization);\nconst loading = ref(false);\nconst needsPay = computed(() => props.checkout.totalPrice > 0);\nconst navigate = useNavigationActions();\n\nconst selectedPaymentMethod = computed({\n    get: () => props.checkout.paymentMethod,\n    set: value => props.checkout.paymentMethod = value,\n});\n\nonMounted(() => {\n    if (!needsPay.value) {\n        selectedPaymentMethod.value = null;\n        return;\n    }\n    if (!selectedPaymentMethod.value && paymentMethods.value.length) {\n        selectedPaymentMethod.value = paymentMethods.value[0];\n    }\n});\n\nconst paymentMethods = computed(() => organization.value?.meta.registrationPaymentConfiguration.getAvailablePaymentMethods({\n    amount: props.checkout.totalPrice,\n    customer: props.checkout.customer,\n}) ?? []);\n\nconst paymentConfiguration = computed(() => organization.value!.meta.registrationPaymentConfiguration);\n\nasync function goNext() {\n    if (loading.value) {\n        return;\n    }\n\n    loading.value = true;\n    errors.errorBox = null;\n\n    try {\n        await props.saveHandler(navigate);\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    finally {\n        loading.value = false;\n    }\n}\n</script>\n","<template>\n    <div class=\"st-view\">\n        <STNavigationBar :title=\"title\" />\n        <main>\n            <h1>{{ title }}</h1>\n\n            <template v-if=\"!checkout || !checkout.isAdminFromSameOrganization\">\n                <p v-if=\"names.length > 0\">\n                    Je ontvangt een extra bevestiging via e-mail. Als er in de toekomst gegevens wijzigen kan je die vanaf nu beheren via het ledenportaal.\n                </p>\n\n                <p v-else-if=\"waitingListNames.length > 0\">\n                    We houden je op de hoogte van jouw status op de wachtlijst.\n                </p>\n\n                <p v-else>\n                    Jouw betaling is gelukt.\n                </p>\n            </template>\n            <p v-else>\n                Er werden mogelijks automatische e-mails uitgestuurd als die ingesteld stonden.\n            </p>\n        </main>\n\n        <STToolbar>\n            <template #right>\n                <button class=\"button primary\" type=\"button\" @click=\"dismiss({ force: true })\">\n                    <span>Sluiten</span>\n                    <span class=\"icon arrow-right\" />\n                </button>\n            </template>\n        </STToolbar>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useDismiss } from '@simonbackx/vue-app-navigation';\nimport { STToolbar, useContext } from '@stamhoofd/components';\nimport { useMemberManager } from '@stamhoofd/networking';\nimport { BalanceItemRelationType, GroupType, PaymentGeneral, RegisterCheckout, RegistrationWithMember } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed, onMounted } from 'vue';\n\nconst props = withDefaults(\n    defineProps<{\n        checkout?: RegisterCheckout | null;\n        registrations: RegistrationWithMember[];\n        payment?: PaymentGeneral | null;\n    }>(),\n    {\n        checkout: null,\n        payment: null,\n    },\n);\nconst dismiss = useDismiss();\nconst context = useContext();\nconst memberManager = useMemberManager();\n\nonMounted(() => {\n    props.checkout?.clear();\n    if (!props.checkout) {\n        memberManager.family.checkout.clear();\n    }\n\n    // Force reload\n    context.value.updateData(true, false, false).catch(console.error);\n});\n\nlet names = Formatter.uniqueArray(props.registrations.filter(r => r.group.type !== GroupType.WaitingList).map(r => r.member.firstName ?? '?'));\nconst waitingListNames = Formatter.uniqueArray(props.registrations.filter(r => r.group.type === GroupType.WaitingList).map(r => r.member.firstName ?? '?'));\n\nif (props.payment && names.length === 0 && waitingListNames.length === 0) {\n    names = Formatter.uniqueArray(\n        props.payment.balanceItemPayments.flatMap((p) => {\n            if (!p.balanceItem.relations.get(BalanceItemRelationType.Group)) {\n                return [];\n            }\n            const id = p.balanceItem.relations.get(BalanceItemRelationType.Member)?.name;\n            return id ? [id] : [];\n        }),\n    );\n}\n\nconst title = computed(() => {\n    let t = 'Hoera! ';\n\n    if (names.length > 0) {\n        if (names.length > 3) {\n            t += Formatter.joinLast([...names.slice(0, 2), (names.length - 2) + ' andere leden'], ', ', ' en ') + ' zijn ingeschreven';\n        }\n        else if (names.length > 1) {\n            t += Formatter.joinLast(names, ', ', ' en ') + ' zijn ingeschreven';\n        }\n        else {\n            t += names.join('') + ' is ingeschreven';\n        }\n    }\n\n    if (waitingListNames.length > 0) {\n        if (names.length > 0) {\n            t += ' en ';\n        }\n\n        if (waitingListNames.length > 3) {\n            t += Formatter.joinLast([...waitingListNames.slice(0, 2), (waitingListNames.length - 2) + ' andere leden'], ', ', ' en ') + ' zijn ingeschreven op de wachtlijst';\n        }\n        else if (waitingListNames.length > 1) {\n            t += Formatter.joinLast(waitingListNames, ', ', ' en ') + ' zijn ingeschreven op de wachtlijst';\n        }\n        else {\n            t += waitingListNames.join('') + ' is ingeschreven op de wachtlijst';\n        }\n    }\n\n    if (names.length === 0 && waitingListNames.length === 0) {\n        t += 'Gelukt!';\n    }\n\n    return t;\n});\n\n</script>\n","<template>\n    <STListItem :selectable=\"!disabled\" :disabled=\"disabled\" class=\"right-stack\" @click=\"editRegisterItem\">\n        <template #left>\n            <Checkbox v-model=\"checked\" :disabled=\"disabled\" @click.stop />\n        </template>\n\n        <h3 class=\"style-title-list \">\n            {{ member.patchedMember.name }}\n        </h3>\n\n        <p v-if=\"validationError\" class=\"style-description-small\">\n            {{ validationError }}\n        </p>\n\n        <p v-if=\"validationWarning\" class=\"style-description-small\">\n            {{ validationWarning }}\n        </p>\n\n        <p v-if=\"checked && registerItem && registerItem.description\" class=\"style-description-small pre-wrap\" v-text=\"registerItem.description\" />\n        <template #right>\n            <span v-if=\"(registerItem?.group.type === GroupType.WaitingList) || (!disabled && validationError)\" class=\"icon clock gray\" />\n            <span v-if=\"checked && registerItem?.showItemView\" class=\"button icon edit gray\" />\n        </template>\n    </STListItem>\n</template>\n\n<script setup lang=\"ts\">\nimport { Group, GroupType, Organization, PlatformMember, RegisterItem } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { useCheckoutRegisterItem } from '../../checkout';\n\nconst props = defineProps<{\n    group: Group;\n    member: PlatformMember,\n    groupOrganization: Organization\n}>()\n\n// We do some caching here to prevent too many calculations on cart changes\nconst inCartRegisterItem = computed(() => props.member.family.checkout.cart.getMemberAndGroup(props.member.id, props.group.id))\nconst inCartRegisterWaitingListItem = computed(() => props.group.waitingList ? props.member.family.checkout.cart.getMemberAndGroup(props.member.id, props.group.waitingList.id) : null)\n\n// If the system decides that you should register for the waiting list, we should still show the correct error messages from the original register item\nconst validateRegisterItem = computed(() => inCartRegisterItem.value ?? RegisterItem.defaultFor(props.member, props.group, props.groupOrganization))\n\nconst registerItem = computed(() => {\n    if (inCartRegisterItem.value) {\n        return inCartRegisterItem.value\n    }\n    if (inCartRegisterWaitingListItem.value) {\n        return inCartRegisterWaitingListItem.value\n    }\n\n    if (!!validateRegisterItem.value.validationError && !validateRegisterItem.value.validationErrorForWaitingList && !!props.group.waitingList) {\n        return RegisterItem.defaultFor(props.member, props.group.waitingList, props.groupOrganization)\n    }\n    return RegisterItem.defaultFor(props.member, props.group, props.groupOrganization)\n})\n\nconst validationError = computed(() => inCartRegisterItem.value ? null : (registerItem.value.validationError ?? validateRegisterItem.value.validationError))\nconst canRegister = computed(() => inCartRegisterItem.value || inCartRegisterWaitingListItem.value ? true : (!registerItem.value.validationError))\nconst validationWarning = computed(() => validationError.value ? null : registerItem.value.validationWarning)\n\nconst disabled = computed(() => {\n    return !canRegister.value\n})\nconst checkoutRegisterItem = useCheckoutRegisterItem();\n\nconst checked = computed({\n    get: () => !!inCartRegisterItem.value || !!inCartRegisterWaitingListItem.value,\n    set: (value: boolean) => {\n        if (!value) {\n            props.member.family.checkout.removeMemberAndGroup(props.member.id, props.group.id)\n            if (props.group.waitingList) {\n                props.member.family.checkout.removeMemberAndGroup(props.member.id, props.group.waitingList.id)\n            }\n        } else {\n            editRegisterItem().catch(console.error)\n        }\n    }\n})\n\n\nasync function editRegisterItem() {\n    if (checked.value && !registerItem.value?.showItemView) {\n        // Deselect\n        checked.value = false\n        return;\n    }\n\n    if (disabled.value) {\n        return;\n    }\n\n    await checkoutRegisterItem({\n        item: registerItem.value,\n        startCheckoutFlow: false,\n        displayOptions: {action: 'present', modalDisplayStyle: 'popup'}\n    })\n}\n\n</script>\n","<template>\n    <ExternalOrganizationContainer v-slot=\"{externalOrganization: groupOrganization}\" :organization-id=\"group.organizationId\" @update=\"setOrganization\">\n        <SaveView save-text=\"Doorgaan\" :title=\"group.settings.name\" @save=\"goNext\">\n            <p v-if=\"!checkout.isAdminFromSameOrganization\" class=\"style-title-prefix\">\n                {{ groupOrganization!.name }}\n            </p>\n            <h1>Inschrijven voor {{ group.settings.name }}</h1>\n\n            <p v-if=\"hasNoMembers\" class=\"info-box\">\n                {{ $t('d5e39906-8c0b-4006-bab5-96827f8daa53') }}\n            </p>\n\n            <STList>\n                <RegisterItemCheckboxRow\n                    v-for=\"member in family.members\"\n                    :key=\"member.id\"\n                    :member=\"member\"\n                    :group=\"group\"\n                    :group-organization=\"groupOrganization\"\n                />\n            </STList>\n        </SaveView>\n    </ExternalOrganizationContainer>\n</template>\n\n<script setup lang=\"ts\">\nimport { useDismiss } from '@simonbackx/vue-app-navigation';\nimport { ExternalOrganizationContainer, GlobalEventBus } from '@stamhoofd/components';\nimport { Group, Organization, PlatformFamily } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport RegisterItemCheckboxRow from './components/group/RegisterItemCheckboxRow.vue';\n\nconst props = defineProps<{\n    family: PlatformFamily;\n    group: Group;\n}>();\n\nconst hasNoMembers = computed(() => props.family.members.length === 0);\n\nconst checkout = computed(() => props.family.checkout);\nconst dismiss = useDismiss();\n\nfunction setOrganization(groupOrganization: Organization) {\n    checkout.value.setDefaultOrganization(groupOrganization);\n}\n\nasync function goNext() {\n    await dismiss();\n\n    if (!checkout.value.cart.isEmpty) {\n        await GlobalEventBus.sendEvent('selectTabByName', 'mandje');\n    }\n}\n\n</script>\n","<template>\n    <STListItem class=\"right-stack\">\n        <template #left>\n            <BalanceItemIcon :item=\"item.item\" :is-payable=\"true\" />\n        </template>\n\n        <BalanceItemTitleBox :item=\"item.item\" :is-payable=\"true\" :price=\"item.price\" />\n\n        <template #right>\n            <p class=\"style-price-base\">\n                {{ formatPrice(item.price) }}\n            </p>\n            <button class=\"button icon trash gray\" type=\"button\" @click.stop=\"deleteMe()\" />\n        </template>\n    </STListItem>\n</template>\n\n<script setup lang=\"ts\">\nimport { BalanceItemCartItem, RegisterCheckout } from '@stamhoofd/structures';\nimport { BalanceItemIcon, BalanceItemTitleBox } from '../../../payments';\n\nconst props = withDefaults(\n    defineProps<{\n        item: BalanceItemCartItem;\n        checkout: RegisterCheckout;\n    }>(),\n    {},\n);\n\nasync function deleteMe() {\n    props.checkout.removeBalanceItem(props.item);\n}\n\n</script>\n","<template>\n    <ImageComponent v-if=\"image\" :image=\"image\" />\n    <OrganizationAvatar v-else-if=\"organization && organization.meta.squareLogo\" :organization=\"organization\" />\n    <figure v-else>\n        <span>{{ group.settings.getShortCode(2) }}</span>\n    </figure>\n</template>\n\n<script setup lang=\"ts\">\nimport { ImageComponent, OrganizationAvatar } from '@stamhoofd/components';\nimport { Group, Organization } from '@stamhoofd/structures';\nimport { computed } from 'vue';\n\nconst props = withDefaults(\n    defineProps<{\n        group: Group;\n        organization?: Organization|null; // Optionally use organization logo if no other is available\n    }>(), {\n        organization: null\n    }\n);\n\nconst image = computed(() => props.group.settings.squarePhoto ?? props.group.settings.coverPhoto);\n</script>\n","<template>\n    <IconContainer>\n        <GroupIcon :group=\"group\" :organization=\"organization\" />\n        <template #aside>\n            <span v-if=\"icon\" class=\"icon stroke small\" :class=\"icon\" />\n            <span v-else-if=\"waitingList\" class=\"icon clock small stroke\" />\n        </template>\n    </IconContainer>\n</template>\n\n<script setup lang=\"ts\">\nimport { Group, GroupType, Organization } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport IconContainer from '../../../icons/IconContainer.vue';\nimport GroupIcon from './GroupIcon.vue';\n\nconst props\n    = defineProps<{\n        group: Group;\n        organization?: Organization | null; // Optionally use organization logo if no other is available\n        icon?: string;\n    }>();\n\nconst waitingList = computed(() => props.group.type === GroupType.WaitingList);\n</script>\n","<template>\n    <STListItem class=\"right-stack\">\n        <template #left>\n            <GroupIconWithWaitingList :group=\"registration.group\" icon=\"canceled\" />\n        </template>\n\n        <h3 class=\"style-title-list\">\n            <span>{{ registration.member.name }}</span>\n        </h3>\n\n        <p class=\"style-description-small\">\n            Uitschrijven voor {{ registration.group.settings.name }}\n        </p>\n\n        <template #right>\n            <p v-if=\"balance\" class=\"style-price\">\n                {{ formatPrice(balance.amountOpen + balance.amountPaid + balance.amountPending) }}\n            </p>\n\n            <button class=\"button icon trash gray\" type=\"button\" @click.stop=\"deleteMe()\" />\n        </template>\n    </STListItem>\n</template>\n\n<script setup lang=\"ts\">\nimport { RegisterCheckout, RegistrationWithMember } from '@stamhoofd/structures';\nimport GroupIconWithWaitingList from './GroupIconWithWaitingList.vue';\nimport { computed } from 'vue';\n\nconst props = withDefaults(\n    defineProps<{\n        registration: RegistrationWithMember;\n        checkout: RegisterCheckout;\n    }>(),\n    {\n    },\n);\n\nasync function deleteMe() {\n    props.checkout.unremoveRegistration(props.registration);\n}\n\nconst balance = computed(() => {\n    return props.registration.balances.find(b => b.organizationId === props.registration.organizationId);\n});\n\n</script>\n","<template>\n    <figure v-if=\"image\" class=\"style-image-with-icon\">\n        <ImageComponent :image=\"image\" />\n        <aside>\n            <span v-if=\"icon\" class=\"icon gray small\" :class=\"icon\" />\n        </aside>\n    </figure>\n    <figure v-else v-color=\"member.id\" class=\"style-image-with-icon\">\n        <figure>\n            <span>{{ member.patchedMember.details.getShortCode(2) }}</span>\n        </figure>\n        <aside>\n            <span v-if=\"icon\" class=\"icon gray small\" :class=\"icon\" />\n        </aside>\n    </figure>\n</template>\n\n<script setup lang=\"ts\">\nimport { ImageComponent } from '@stamhoofd/components';\nimport { GroupType, PlatformMember } from '@stamhoofd/structures';\nimport { computed } from 'vue';\n\nconst props = withDefaults(\n    defineProps<{\n        member: PlatformMember;\n        icon?: string;\n    }>(), {\n        icon: '',\n    },\n);\n\nconst groups = computed(() => props.member.filterGroups({ currentPeriod: true, types: [GroupType.Membership], includePending: false }));\nconst image = computed(() => groups.value.length === 1 ? (groups.value[0].settings.squarePhoto ?? groups.value[0].settings.coverPhoto) : null);\n\n</script>\n","<template>\n    <STListItem class=\"right-stack\" :selectable=\"canEdit\" @click=\"canEdit ? editMe() : undefined\">\n        <template v-if=\"showGroup\" #left>\n            <GroupIconWithWaitingList :group=\"item.group\" :icon=\"item.replaceRegistrations.length ? 'sync' : ''\" />\n        </template>\n        <template v-else #left>\n            <MemberIcon :member=\"item.member\" :icon=\"item.group.type === GroupType.WaitingList ? 'clock' : (item.replaceRegistrations.length ? 'sync' : '')\" />\n        </template>\n\n        <template v-if=\"showGroup\">\n            <p class=\"style-title-prefix-list\">\n                {{ item.organization.name }}\n            </p>\n\n            <h3 class=\"style-title-list\">\n                {{ item.group.settings.name }}\n                <span v-if=\"item.group.settings.period && item.group.type === GroupType.Membership\" class=\"title-suffix\">{{ item.group.settings.period.nameShort }}</span>\n            </h3>\n\n            <p class=\"style-description-small\">\n                {{ item.member.patchedMember.name }}\n            </p>\n        </template>\n        <template v-else>\n            <h3 class=\"style-title-list\">\n                {{ item.member.patchedMember.name }}\n            </h3>\n        </template>\n\n        <p v-if=\"item.description\" class=\"style-description-small pre-wrap\" v-text=\"item.description\" />\n\n        <template v-if=\"item.totalPrice !== 0\">\n            <footer v-if=\"item.checkout.isAdminFromSameOrganization\">\n                <p v-if=\"item.totalPrice >= 0\" class=\"style-price\">\n                    Openstaand bedrag stijgt met {{ formatPrice(item.totalPrice) }}\n                </p>\n                <p v-else class=\"style-price\">\n                    Openstaand bedrag daalt met {{ formatPrice(-item.totalPrice) }}\n                </p>\n            </footer>\n            <footer v-else>\n                <p class=\"style-price\">\n                    {{ formatPrice(item.totalPrice) }}\n                </p>\n            </footer>\n        </template>\n\n        <template v-if=\"item.calculatedPriceDueLater > 0\">\n            <footer>\n                <p class=\"style-price\">\n                    {{ formatPrice(item.calculatedPriceDueLater) }} later te betalen\n                </p>\n            </footer>\n        </template>\n\n        <p v-if=\"item.cartError\" class=\"error-box small\">\n            {{ item.cartError.getHuman() }}\n\n            <span v-if=\"canEdit\" class=\"button text\">\n                <span>Corrigeren</span>\n                <span class=\"icon arrow-right-small\" />\n            </span>\n        </p>\n\n        <template #right>\n            <button class=\"button icon trash gray\" type=\"button\" @click.stop=\"deleteMe()\" />\n            <button v-if=\"canEdit\" class=\"button icon edit gray\" type=\"button\" />\n        </template>\n    </STListItem>\n</template>\n\n<script setup lang=\"ts\">\nimport { GroupType, RegisterItem } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { useCheckoutRegisterItem } from '../../checkout';\nimport MemberIcon from '../MemberIcon.vue';\nimport GroupIconWithWaitingList from './GroupIconWithWaitingList.vue';\n\nconst props = withDefaults(\n    defineProps<{\n        item: RegisterItem;\n        showGroup?: boolean;\n    }>(),\n    {\n        showGroup: true,\n    },\n);\n\n// We do some caching here to prevent too many calculations on cart changes\nconst canEdit = computed(() => props.item.showItemView);\n\nconst checkoutRegisterItem = useCheckoutRegisterItem();\n\nasync function deleteMe() {\n    props.item.checkout.remove(props.item);\n}\n\nasync function editMe() {\n    await checkoutRegisterItem({\n        item: props.item,\n        startCheckoutFlow: false,\n        displayOptions: { action: 'present', modalDisplayStyle: 'popup' },\n    });\n}\n\n</script>\n","<template>\n    <ExternalOrganizationContainer v-slot=\"{externalOrganization: groupOrganization}\" :organization-id=\"group.organizationId\" @update=\"setOrganization\">\n        <SaveView save-text=\"Doorgaan\" title=\"Zoeken\" :loading=\"saving\" @save=\"goNext\">\n            <p v-if=\"!checkout.isAdminFromSameOrganization\" class=\"style-title-prefix\">\n                {{ groupOrganization!.name }}\n            </p>\n            <h1>Zoek bestaande leden voor {{ group.settings.name }}</h1>\n\n            <div class=\"input-with-buttons\">\n                <div>\n                    <form class=\"input-icon-container icon search gray\" @submit.prevent=\"blurFocus\">\n                        <input v-model=\"searchQuery\" class=\"input\" name=\"search\" placeholder=\"Zoeken\" type=\"search\" inputmode=\"search\" enterkeyhint=\"search\" autocorrect=\"off\" autocomplete=\"off\" :spellcheck=\"false\" autocapitalize=\"off\">\n                    </form>\n                </div>\n                <div>\n                    <button type=\"button\" class=\"button text\" @click=\"editFilter\">\n                        <span class=\"icon filter\" />\n                        <span class=\"hide-small\">Filter</span>\n                        <span v-if=\"!isEmptyFilter(fetcher.baseFilter)\" class=\"icon dot primary\" />\n                    </button>\n                </div>\n            </div>\n\n            <p v-if=\"fetcher.objects.length > 1 && canSelectAll || canUnselectAll\" class=\"style-description-small for-input\">\n                Snel selecteren:  <button v-if=\"canSelectAll\" class=\"inline-link\" type=\"button\" @click=\"selectAllResults\">\n                    Selecteer alles\n                </button>\n\n                <button v-else-if=\"canUnselectAll\" class=\"inline-link\" type=\"button\" @click=\"deselectAllResults\">\n                    Deselecteer alles\n                </button>\n            </p>\n\n            <STList v-if=\"fetcher.objects.length\">\n                <RegisterItemCheckboxRow\n                    v-for=\"member in fetcher.objects\"\n                    :key=\"member.id\"\n                    :member=\"member\"\n                    :group=\"group\"\n                    :group-organization=\"groupOrganization\"\n                />\n            </STList>\n            <InfiniteObjectFetcherEnd empty-message=\"Geen leden gevonden\" :fetcher=\"fetcher\" />\n        </SaveView>\n    </ExternalOrganizationContainer>\n</template>\n\n<script setup lang=\"ts\">\nimport { Decoder } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, NavigationController } from '@simonbackx/vue-app-navigation';\nimport { ErrorBox, ExternalOrganizationContainer, InfiniteObjectFetcherEnd, Toast, UIFilter, UIFilterEditor, useAdvancedMemberWithRegistrationsBlobUIFilterBuilders, useErrors, useInfiniteObjectFetcher, usePositionableSheet } from '@stamhoofd/components';\nimport { assertSort, Group, isEmptyFilter, LimitedFilteredRequest, MembersBlob, Organization, PaginatedResponseDecoder, PlatformFamily, PlatformMember, RegisterCheckout, RegisterItem, SortItemDirection, SortList } from '@stamhoofd/structures';\nimport { computed, Ref, ref, watchEffect } from 'vue';\nimport { useAuth, useContext, useOrganization, usePlatform } from '../hooks';\nimport { NavigationActions, useNavigationActions } from '../types/NavigationActions';\nimport RegisterItemCheckboxRow from './components/group/RegisterItemCheckboxRow.vue';\n\ntype ObjectType = PlatformMember;\n\nconst props = defineProps<{\n    members: PlatformMember[];\n    group: Group;\n    checkout: RegisterCheckout; // we should auto assign this checkout to all search results and newly created members\n    saveHandler: (navigate: NavigationActions) => void | Promise<void>;\n}>();\n\nfunction setOrganization(groupOrganization: Organization) {\n    props.checkout.setDefaultOrganization(groupOrganization);\n}\n\nconst searchQuery = ref('');\n\nconst context = useContext();\nconst contextOrganization = useOrganization();\nconst platform = usePlatform();\nconst { presentPositionableSheet } = usePositionableSheet();\nconst navigate = useNavigationActions();\nconst errors = useErrors();\nconst saving = ref(false);\nconst auth = useAuth();\n\nconst { filterBuilders, loading } = useAdvancedMemberWithRegistrationsBlobUIFilterBuilders();\nconst selectedUIFilter = ref(filterBuilders.value[0].fromFilter(props.group.getRecommendedFilter(auth.hasSomePlatformAccess() ? (contextOrganization.value?.id ?? null) : null))) as Ref<null | UIFilter>;\n\nasync function editFilter(event: MouseEvent) {\n    if (!filterBuilders) {\n        return;\n    }\n    const filter = selectedUIFilter.value ?? filterBuilders.value[0].create();\n    if (!selectedUIFilter.value) {\n        selectedUIFilter.value = filter;\n    }\n\n    await presentPositionableSheet(event, {\n        components: [\n            new ComponentWithProperties(NavigationController, {\n                root: new ComponentWithProperties(UIFilterEditor, {\n                    filter,\n                }),\n            }),\n        ],\n    });\n}\n\nfunction extendSort(list: SortList): SortList {\n    return assertSort(list, [\n        { key: 'birthDay', order: SortItemDirection.ASC },\n        { key: 'id' },\n    ]);\n}\n\nconst fetcher = useInfiniteObjectFetcher<ObjectType>({\n    get requiredFilter() {\n        if (!contextOrganization.value) {\n            throw new Error('Organization is required');\n        }\n\n        // we already add this by default in the backend\n        return null;\n        // return {\n        //    registrations: {\n        //        $elemMatch: {\n        //            organization: {\n        //                id: contextOrganization.value.id\n        //            },\n        //        }\n        //    }\n        // };\n    },\n    async fetch(data: LimitedFilteredRequest): Promise<{ results: ObjectType[]; next?: LimitedFilteredRequest }> {\n        console.log('Members.fetch', data);\n        data.sort = extendSort(data.sort);\n\n        const response = await context.value.authenticatedServer.request({\n            method: 'GET',\n            path: '/members',\n            decoder: new PaginatedResponseDecoder(MembersBlob as Decoder<MembersBlob>, LimitedFilteredRequest as Decoder<LimitedFilteredRequest>),\n            query: data,\n            shouldRetry: false,\n            owner: this,\n        });\n\n        console.log('[Done] Members.fetch', data, response.data);\n\n        const blob = response.data.results;\n\n        const results = PlatformFamily.createSingles(blob, {\n            contextOrganization: context.value.organization,\n            platform: platform.value,\n        });\n\n        for (const result of results) {\n            result.family.checkout = props.checkout;\n        }\n\n        return {\n            results,\n            next: response.data.next,\n        };\n    },\n\n    async fetchCount(): Promise<number> {\n        throw new Error('Method not implemented.');\n    },\n});\n\nwatchEffect(() => {\n    fetcher.setSearchQuery(searchQuery.value);\n    const filter = selectedUIFilter.value ? selectedUIFilter.value.build() : null;\n    fetcher.setFilter(filter);\n});\n\nfunction blurFocus() {\n    (document.activeElement as HTMLElement)?.blur();\n}\n\nconst canSelectAll = computed(() => {\n    if (fetcher.hasMoreObjects || !props.checkout.singleOrganization || fetcher.objects.length === 0) {\n        return false;\n    }\n\n    if (props.group.settings.recordCategories.length > 0) {\n        return false;\n    }\n\n    for (const member of fetcher.objects) {\n        if (!props.checkout.cart.containsMemberAndGroup(member.id, props.group.id)) {\n            if (member.canRegister(props.group, props.checkout.singleOrganization)) {\n                return true;\n            }\n        }\n    }\n\n    return false;\n});\n\nconst canUnselectAll = computed(() => {\n    if (fetcher.hasMoreObjects || !props.checkout.singleOrganization || fetcher.objects.length === 0) {\n        return false;\n    }\n\n    for (const member of fetcher.objects) {\n        if (!props.checkout.cart.containsMemberAndGroup(member.id, props.group.id)) {\n            if (member.canRegister(props.group, props.checkout.singleOrganization)) {\n                return false;\n            }\n        }\n    }\n    return true;\n});\n\nfunction deselectAllResults() {\n    for (const member of fetcher.objects) {\n        props.checkout.cart.removeMemberAndGroup(member.id, props.group.id);\n    }\n}\n\nfunction selectAllResults() {\n    if (fetcher.hasMoreObjects || !props.checkout.singleOrganization) {\n        Toast.error('Niet alle resultaten zijn geladen. Gebruik dit niet voor te veel leden tegelijk.').show();\n        return;\n    }\n\n    for (const member of fetcher.objects) {\n        try {\n            const item = RegisterItem.defaultFor(member, props.group, props.checkout.singleOrganization);\n            if (item.validationError) {\n                if (!item.validationErrorForWaitingList && props.group.waitingList) {\n                    const item2 = RegisterItem.defaultFor(member, props.group.waitingList, props.checkout.singleOrganization);\n                    if (!item2.validationError) {\n                        props.checkout.add(item2);\n                    }\n                }\n\n                continue;\n            }\n            props.checkout.add(item);\n        }\n        catch (e) {\n            // prob invalid\n            return;\n        }\n    }\n}\n\nasync function goNext() {\n    if (saving.value) {\n        return;\n    }\n\n    saving.value = true;\n    try {\n        await props.saveHandler(navigate);\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    finally {\n        saving.value = false;\n    }\n}\n\n</script>\n","<template>\n    <SaveView save-text=\"Bevestigen\" main-class=\"flex\" :save-badge=\"cartLength\" :disabled=\"cartLength === 0\" title=\"Inschrijvingen wijzigen\" :loading=\"saving\" @save=\"goToCheckout\">\n        <p v-if=\"!checkout.isAdminFromSameOrganization && checkout.singleOrganization\" class=\"style-title-prefix\">\n            {{ checkout.singleOrganization.name }}\n        </p>\n        <h1 v-if=\"group && isOnlyDeleting\">\n            Uitschrijven voor {{ group.settings.name }}\n        </h1>\n        <h1 v-else-if=\"group\">\n            Inschrijvingen voor {{ group.settings.name }}\n        </h1>\n        <h1 v-else>\n            Winkelmandje\n        </h1>\n\n        <p v-if=\"checkout.totalPrice && checkout.isAdminFromSameOrganization\" class=\"info-box\">\n            De kosten zullen aan het openstaande bedrag van elk lid worden toegevoegd. Leden kunnen dit betalen via het ledenportaal.\n        </p>\n\n        <p v-if=\"checkout.totalPrice && contextOrganization && checkout.asOrganizationId && !checkout.isAdminFromSameOrganization\" class=\"warning-box\">\n            Je betaalt deze inschrijvingen in naam van {{ contextOrganization.name }}. Je moet zelf de kosten aan je leden doorrekenen indien gewenst.\n        </p>\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <STList>\n            <DeleteRegistrationRow v-for=\"registration in checkout.cart.deleteRegistrations\" :key=\"registration.id\" class=\"right-stack\" :registration=\"registration\" :checkout=\"checkout\" />\n            <RegisterItemRow v-for=\"item in checkout.cart.items\" :key=\"item.id\" class=\"right-stack\" :item=\"item\" :show-group=\"false\" />\n            <BalanceItemCartItemRow v-for=\"item in checkout.cart.balanceItems\" :key=\"item.id\" class=\"right-stack\" :item=\"item\" :checkout=\"checkout\" />\n        </STList>\n\n        <p v-if=\"checkout.cart.isEmpty\" class=\"info-box\">\n            Voeg de leden toe die je wilt inschrijven\n        </p>\n\n        <p v-if=\"group && !isOnlyDeleting\" class=\"style-button-bar\">\n            <button type=\"button\" class=\"button text\" @click=\"searchMembers\">\n                <span class=\"icon search\" />\n                <span>Zoek bestaande leden</span>\n            </button>\n\n            <button type=\"button\" class=\"button text\" @click=\"addMember\">\n                <span class=\"icon add\" />\n                <span>Splinternieuw lid</span>\n            </button>\n        </p>\n\n        <div v-if=\"isOnlyDeleting && hasPaidRegistrationDelete\" class=\"container\">\n            <hr>\n            <h2>{{ $t('d37f0355-379d-4128-aafa-fefb201188bc') }}</h2>\n            <p>{{ $t('11ffdf3a-dd66-49ec-b092-c7f3063e19f3') }}</p>\n\n            <p v-if=\"hadPaidByOrganization\" class=\"info-box\">\n                {{ $t('b263fa75-5a47-43a6-94a5-95eeac94567f') }}\n            </p>\n\n            <STInputBox title=\"Percentage\">\n                <PermyriadInput v-model=\"checkout.cancellationFeePercentage\" :min=\"0\" :max=\"10000\" placeholder=\"0\" />\n            </STInputBox>\n            <p v-if=\"checkout.cancellationFeePercentage !== 0 && checkout.cancellationFeePercentage !== 10000\" class=\"style-description-small\">\n                De annuleringskost wordt individueel en rekenkundig afgerond op 1 cent.\n            </p>\n        </div>\n\n        <PriceBreakdownBox v-if=\"!checkout.isAdminFromSameOrganization\" :price-breakdown=\"checkout.priceBreakown\" />\n    </SaveView>\n</template>\n\n<script setup lang=\"ts\">\nimport { ComponentWithProperties, NavigationController, usePresent } from '@simonbackx/vue-app-navigation';\nimport { CenteredMessage, ErrorBox, PermyriadInput, PriceBreakdownBox, STErrorsDefault, useErrors } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { Group, Organization, PlatformFamily, PlatformMember, RegisterCheckout } from '@stamhoofd/structures';\nimport { computed, onMounted, ref } from 'vue';\nimport { startCheckout, useAddMember, useCheckoutDefaultItem, useChooseGroupForMember } from '.';\nimport { useContext, useOrganization, usePlatform } from '../hooks';\nimport { NavigationActions, useNavigationActions } from '../types/NavigationActions';\nimport BalanceItemCartItemRow from './components/group/BalanceItemCartItemRow.vue';\nimport DeleteRegistrationRow from './components/group/DeleteRegistrationRow.vue';\nimport RegisterItemRow from './components/group/RegisterItemRow.vue';\nimport SearchOrganizationMembersForGroupView from './SearchOrganizationMembersForGroupView.vue';\n\nconst props = defineProps<{\n    checkout: RegisterCheckout; // we should auto assign this checkout to all search results and newly created members\n    group?: Group; // If you want to add new members to the cart\n    groupOrganization: Organization;\n    members?: PlatformMember[]; // Optional: used to update the members after the checkout\n}>();\n\nonMounted(() => {\n    // Initially show errors as soon as it is possible\n    try {\n        props.checkout.validate({});\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n});\n\nconst context = useContext();\nconst contextOrganization = useOrganization();\nconst platform = usePlatform();\nconst present = usePresent();\nconst navigate = useNavigationActions();\nconst errors = useErrors();\nconst saving = ref(false);\nconst cartLength = computed(() => props.checkout.cart.count);\nconst $addMember = useAddMember();\nconst checkoutDefaultItem = useCheckoutDefaultItem();\nconst chooseGroupForMember = useChooseGroupForMember();\nconst $t = useTranslate();\nconst isOnlyDeleting = computed(() => props.checkout.cart.items.length === 0 && props.checkout.cart.balanceItems.length === 0 && props.checkout.cart.deleteRegistrations.length > 0);\nconst hasPaidRegistrationDelete = computed(() => props.checkout.cart.deleteRegistrations.some(r => r.balances.some(b => b.amountOpen > 0 || b.amountPaid > 0 || b.amountPending > 0)));\nconst hadPaidByOrganization = computed(() => props.checkout.cart.deleteRegistrations.some(r => r.payingOrganizationId && r.balances.some(b => b.amountOpen > 0 || b.amountPaid > 0 || b.amountPending > 0)));\n\nasync function addMember() {\n    const family = new PlatformFamily({\n        contextOrganization: contextOrganization.value,\n        platform: platform.value,\n    });\n    family.checkout = props.checkout;\n\n    await $addMember(family, {\n        displayOptions: { action: 'present', modalDisplayStyle: 'popup' },\n        async finishHandler(member, navigate) {\n            if (!props.group) {\n                await chooseGroupForMember({\n                    member,\n                    displayOptions: { action: 'show', replace: 100, force: true },\n                    customNavigate: navigate,\n                    startCheckoutFlow: false,\n                });\n                return;\n            }\n\n            await checkoutDefaultItem({\n                member,\n                group: props.group,\n                groupOrganization: props.groupOrganization,\n                startCheckoutFlow: false,\n                displayOptions: { action: 'show', replace: 100, force: true },\n                customNavigate: navigate,\n            });\n        },\n    });\n}\n\nasync function searchMembers() {\n    await present({\n        components: [\n            new ComponentWithProperties(NavigationController, {\n                root: new ComponentWithProperties(SearchOrganizationMembersForGroupView, {\n                    ...props,\n                    saveHandler: async (navigate: NavigationActions) => {\n                        await navigate.dismiss({ force: true });\n                    },\n                }),\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function goToCheckout() {\n    if (saving.value) {\n        return;\n    }\n\n    saving.value = true;\n    try {\n        await startCheckout({\n            admin: true,\n            checkout: props.checkout,\n            context: context.value,\n            members: props.members,\n            displayOptions: { action: 'show' },\n        }, navigate);\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    finally {\n        saving.value = false;\n    }\n}\n\nconst shouldNavigateAway = async () => {\n    if (props.checkout.cart.isEmpty) {\n        return true;\n    }\n    return await CenteredMessage.confirm($t('996a4109-5524-4679-8d17-6968282a2a75'), $t('106b3169-6336-48b8-8544-4512d42c4fd6'));\n};\n\ndefineExpose({\n    shouldNavigateAway,\n});\n\n</script>\n","import { ComponentWithProperties, NavigationController } from '@simonbackx/vue-app-navigation';\nimport { PlatformMember } from '@stamhoofd/structures';\nimport { defaultDisplayOptions, DisplayOptions, glueNavigationActions, NavigationActions, runDisplayOptions } from '../../types/NavigationActions';\nimport { SessionContext } from '@stamhoofd/networking';\n\nexport class MemberStepManager {\n    member: PlatformMember;\n    steps: EditMemberStep[] = [];\n    finishHandler: (navigate: NavigationActions) => void | Promise<void>;\n    displayOptions: DisplayOptions;\n    context: SessionContext;\n\n    constructor(\n        context: SessionContext,\n        member: PlatformMember,\n        steps: EditMemberStep[],\n        finishHandler: (navigate: NavigationActions) => void | Promise<void>,\n        displayOptions?: DisplayOptions,\n    ) {\n        this.member = member;\n        this.steps = steps;\n        this.finishHandler = finishHandler;\n        this.displayOptions = displayOptions || defaultDisplayOptions;\n        this.context = context;\n    }\n\n    async saveHandler(currentStep: EditMemberStep | null, navigate: NavigationActions) {\n        const nextStep = this.getNextStep(currentStep);\n        if (nextStep) {\n            if (currentStep === null) {\n                return await runDisplayOptions({\n                    components: [\n                        new ComponentWithProperties(NavigationController, {\n                            root: await nextStep.getComponent(this),\n                        }),\n                    ],\n                }, this.displayOptions, navigate);\n            }\n            return await navigate.show({\n                components: [\n                    await nextStep.getComponent(this),\n                ],\n            });\n        }\n        else {\n            // Assure that if the next step uses navigate.show, while the displayoptions are 'present', and we never presented\n            // any view, we map the navigate show to something like present to match the display options\n            const gluedNavigate = glueNavigationActions(currentStep !== null, navigate, this.displayOptions);\n            await this.finishHandler(gluedNavigate);\n        }\n    }\n\n    getNextStep(step: EditMemberStep | null): EditMemberStep | null {\n        let found = step === null;\n        for (const s of this.steps) {\n            if (found && s.isEnabled(this)) {\n                return s;\n            }\n            if (s === step) {\n                found = true;\n            }\n        }\n        return null;\n    }\n}\n\nexport interface EditMemberStep {\n    getName(manager: MemberStepManager): string;\n    getComponent(manager: MemberStepManager): Promise<ComponentWithProperties> | ComponentWithProperties;\n    isEnabled(manager: MemberStepManager): boolean;\n}\n","<template>\n    <div v-if=\"isAdmin\" class=\"container\">\n        <Title v-bind=\"$attrs\" :title=\"title\" />\n\n        <STErrorsDefault :error-box=\"parentErrorBox\" />\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <Checkbox v-model=\"dataPermissions\" :indeterminate=\"!dataPermissionsChangeDate\">\n            Er werd toestemming gegeven\n        </Checkbox>\n\n        <p v-if=\"!willMarkReviewed && dataPermissionsChangeDate\" class=\"style-description-small\">\n            Laatst nagekeken op {{ formatDate(dataPermissionsChangeDate) }}. <button v-tooltip=\"'Het lid zal deze stap terug moeten doorlopen via het ledenportaal'\" type=\"button\" class=\"inline-link\" @click=\"clear\">\n                Wissen\n            </button>.\n        </p>\n        <p v-if=\"!dataPermissionsChangeDate\" class=\"style-description-small\">\n            {{ $t('308d1e59-057c-4a51-846f-8557ba5a385e') }}\n        </p>\n\n        <p v-if=\"checkboxWarning\" v-show=\"!dataPermissions\" class=\"warning-box\">\n            {{ checkboxWarning }}\n        </p>\n    </div>\n    <div v-else class=\"container\">\n        <Title v-bind=\"$attrs\" :title=\"title\" />\n        <p class=\"style-description pre-wrap\" v-text=\"description\" />\n        <STErrorsDefault :error-box=\"parentErrorBox\" />\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <Checkbox v-model=\"dataPermissions\">\n            {{ checkboxLabel }}\n        </Checkbox>\n\n        <p v-if=\"checkboxWarning\" v-show=\"!dataPermissions\" class=\"warning-box\">\n            {{ checkboxWarning }}\n        </p>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { BooleanStatus, PlatformMember } from '@stamhoofd/structures';\n\nimport { computed, nextTick } from 'vue';\nimport { useAppContext } from '../../../context/appContext';\nimport { ErrorBox } from '../../../errors/ErrorBox';\nimport { Validator } from '../../../errors/Validator';\nimport { useErrors } from '../../../errors/useErrors';\nimport { useValidation } from '../../../errors/useValidation';\nimport { useDataPermissionSettings } from '../../../groups';\nimport { usePlatform } from '../../../hooks';\nimport Title from './Title.vue';\n\ndefineOptions({\n    inheritAttrs: false,\n});\n\nconst props = defineProps<{\n    member: PlatformMember;\n    validator: Validator;\n    parentErrorBox?: ErrorBox | null;\n    willMarkReviewed?: boolean;\n}>();\n\nconst platform = usePlatform();\nconst errors = useErrors({ validator: props.validator });\nconst app = useAppContext();\nconst isAdmin = app === 'dashboard' || app === 'admin';\n\nconst checkboxWarning = computed(() => platform.value.config.dataPermission?.checkboxWarning ?? null);\n\nuseValidation(props.validator, async () => {\n    if (props.willMarkReviewed) {\n        // Force saving: increase saved date + make sure it is not null\n        dataPermissions.value = dataPermissions.value as any;\n        await nextTick();\n    }\n    return true;\n});\n\nconst dataPermissions = computed({\n    get: () => props.member.patchedMember.details.dataPermissions?.value ?? false,\n    set: (dataPermissions) => {\n        if (dataPermissions === (props.member.member.details.dataPermissions?.value ?? false) && !props.willMarkReviewed) {\n            return props.member.addDetailsPatch({\n                dataPermissions: props.member.member.details.dataPermissions ?? BooleanStatus.create({\n                    value: dataPermissions,\n                }),\n            });\n        }\n        return props.member.addDetailsPatch({\n            dataPermissions: BooleanStatus.create({\n                value: dataPermissions,\n            }),\n        });\n    },\n});\nconst dataPermissionsChangeDate = computed(() => props.member.patchedMember.details.dataPermissions?.date ?? null);\n\nconst { dataPermissionSettings } = useDataPermissionSettings();\n\nconst title = computed(() => dataPermissionSettings.value.title);\nconst description = computed(() => dataPermissionSettings.value.description);\nconst checkboxLabel = computed(() => dataPermissionSettings.value.checkboxLabel);\n\nfunction clear() {\n    props.member.addDetailsPatch({\n        dataPermissions: null,\n    });\n}\n\n</script>\n","import { ComponentWithProperties } from \"@simonbackx/vue-app-navigation\";\nimport { DataPermissionsSettings, PermissionLevel } from \"@stamhoofd/structures\";\nimport { markRaw } from \"vue\";\nimport { MemberStepView } from \"../..\";\nimport { NavigationActions } from \"../../../types/NavigationActions\";\nimport EditMemberDataPermissionsBox from \"../../components/edit/EditMemberDataPermissionsBox.vue\";\nimport { EditMemberStep, MemberStepManager } from \"../MemberStepManager\";\nimport { MemberSharedStepOptions } from \"./MemberSharedStepOptions\";\n\nconst maxOutdatedTime = 60*1000*60*24 // 1 day\n\nexport class MemberDataPermissionStep implements EditMemberStep {\n    options: MemberSharedStepOptions\n\n    constructor(options: MemberSharedStepOptions) {\n        this.options = options\n    }\n\n    getName(manager: MemberStepManager) {\n        const settings = manager.member.platform.config.dataPermission ?? DataPermissionsSettings.create({})\n        return settings.title\n    }\n\n    isEnabled(manager: MemberStepManager) {    \n        const member = manager.member\n        const details = member.patchedMember.details;\n\n        if (!member.isPropertyEnabled('dataPermission', {\n            checkPermissions: manager.context.user ? {\n                level: PermissionLevel.Write,\n                user: manager.context.user\n            } : undefined\n        })) {\n            return false;\n        }\n\n        if (details.dataPermissions === null) {\n            return true;\n        }\n\n        if (this.options.outdatedTime) {\n            if (details.dataPermissions.value === false && details.dataPermissions.isOutdated(Math.min(this.options.outdatedTime, maxOutdatedTime))) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    getComponent(manager: MemberStepManager): ComponentWithProperties {\n        const config = manager.member.platform.config.recordsConfiguration.dataPermission ?? manager.member.organizations.find(o => o.meta.recordsConfiguration.dataPermission)?.meta.recordsConfiguration.dataPermission ?? null\n        return new ComponentWithProperties(MemberStepView, {\n            title: config?.title ?? DataPermissionsSettings.defaultTitle,\n            member: manager.member,\n            component: markRaw(EditMemberDataPermissionsBox),\n            saveText: \"Doorgaan\",\n            saveHandler: async (navigate: NavigationActions) => {\n                await manager.saveHandler(this, navigate)\n            }\n        })\n    }\n}\n","import { MemberProperty, PermissionLevel } from '@stamhoofd/structures';\nimport { Ref, computed } from 'vue';\nimport { PlatformMember } from '../../../../../../shared/structures/esm/dist/src/members/PlatformMember';\nimport { useAppContext } from '../../context/appContext';\nimport { useAuth, useContext } from '../../hooks';\n\nexport function useIsPropertyRequired(member: Ref<PlatformMember | PlatformMember[]>) {\n    const isAllOptional = useIsAllOptional(member);\n\n    return (property: MemberProperty) => {\n        const members = Array.isArray(member.value) ? member.value : [member.value];\n        return members.some((m) => {\n            if (isAllOptional.value) {\n                return m.isPropertyRequiredForPlatform(property) && (['birthDay'].includes(property));\n            }\n            return m.isPropertyRequired(property);\n        });\n    };\n}\n\nexport function useIsPropertyEnabled(member: Ref<PlatformMember | PlatformMember[]>, write: boolean) {\n    const context = useContext();\n\n    return (property: MemberProperty) => {\n        const members = Array.isArray(member.value) ? member.value : [member.value];\n        return members.some((m) => {\n            return m.isPropertyEnabled(property, context.value.user\n                ? {\n                        checkPermissions: {\n                            user: context.value.user,\n                            level: write ? PermissionLevel.Write : PermissionLevel.Read,\n                        },\n                    }\n                : {});\n        });\n    };\n}\n\nexport function useIsAllOptional(member: Ref<PlatformMember | PlatformMember[]>) {\n    const auth = useAuth();\n    const app = useAppContext();\n\n    return computed(() => {\n        const members = Array.isArray(member.value) ? member.value : [member.value];\n        return members.some((m) => {\n            if (auth.canAccessPlatformMember(m, PermissionLevel.Write) && app !== 'registration') {\n                return true;\n            }\n            return false;\n        });\n    });\n}\n","<template>\n    <STInputBox :title=\"title\" error-fields=\"phone\" :error-box=\"errorBox\">\n        <input v-model=\"phoneRaw\" class=\"input\" :class=\"{ error: !valid }\" :placeholder=\"placeholder\" autocomplete=\"mobile tel\" type=\"tel\" @change=\"validate(false)\" @input=\"(event) => {phoneRaw = event.target.value; onTyping();}\">\n    </STInputBox>\n</template>\n\n<script lang=\"ts\">\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { Component, Prop, VueComponent, Watch } from '@simonbackx/vue-app-navigation/classes';\nimport { I18nController } from '@stamhoofd/frontend-i18n';\nimport { Country } from '@stamhoofd/structures';\n\nimport { ErrorBox } from '../errors/ErrorBox';\nimport { Validator } from '../errors/Validator';\nimport STInputBox from './STInputBox.vue';\n\n@Component({\n    components: {\n        STInputBox,\n    },\n    emits: ['update:modelValue'],\n})\nexport default class PhoneInput extends VueComponent {\n    @Prop({ default: '' })\n    title: string;\n\n    @Prop({ default: null })\n    validator: Validator | null;\n\n    phoneRaw = '';\n    valid = true;\n\n    @Prop({ default: null })\n    modelValue!: string | null;\n\n    @Prop({ default: true })\n    required!: boolean;\n\n    /**\n     * Whether the modelValue can be set to null if it is empty (even when it is required, will still be invalid)\n     * Only used if required = false\n     */\n    @Prop({ default: false })\n    nullable!: boolean;\n\n    @Prop({ default: '' })\n    placeholder!: string;\n\n    errorBox: ErrorBox | null = null;\n\n    @Watch('modelValue')\n    onmodelValueChanged(val: string | null) {\n        if (val === null) {\n            this.phoneRaw = '';\n            return;\n        }\n        this.phoneRaw = val;\n    }\n\n    @Watch('required', { deep: true })\n    onChangeRequired() {\n        // Revalidate, because the fields might be empty, and required goes false -> send null so any saved address gets cleared\n        this.validate(false, true).catch(console.error);\n    }\n\n    onTyping() {\n        // Silently send modelValue to parents, but don't show visible errors yet\n        this.validate(false, true).catch(console.error);\n    }\n\n    mounted() {\n        if (this.validator) {\n            this.validator.addValidation(this, () => {\n                return this.validate(true);\n            });\n        }\n\n        this.phoneRaw = this.modelValue ?? '';\n    }\n\n    unmounted() {\n        if (this.validator) {\n            this.validator.removeValidation(this);\n        }\n    }\n\n    async validate(final: boolean, silent = false) {\n        if (this.phoneRaw.length === 0) {\n            if (!this.required) {\n                if (!silent) {\n                    this.errorBox = null;\n                }\n\n                if (this.modelValue !== null) {\n                    this.$emit('update:modelValue', null);\n                }\n                return true;\n            }\n\n            if (!final) {\n                if (!silent) {\n                    this.errorBox = null;\n                }\n\n                if (this.nullable && this.modelValue !== null) {\n                    this.$emit('update:modelValue', null);\n                }\n                return false;\n            }\n        }\n        try {\n            const libphonenumber = await import(/* webpackChunkName: \"libphonenumber\" */ 'libphonenumber-js/max');\n            const phoneNumber = libphonenumber.parsePhoneNumber(this.phoneRaw, I18nController.shared?.countryCode ?? Country.Belgium);\n\n            if (!phoneNumber || !phoneNumber.isValid()) {\n                for (const country of Object.values(Country)) {\n                    if (country === Country.Other) {\n                        continue;\n                    }\n                    const phoneNumber = libphonenumber.parsePhoneNumber(this.phoneRaw, country);\n\n                    if (phoneNumber && phoneNumber.isValid()) {\n                        if (!silent) {\n                            this.errorBox = new ErrorBox(new SimpleError({\n                                code: 'invalid_field',\n                                message: $t('f7cbe04a-3175-4794-8f74-8261a11fbade').toString(),\n                                field: 'phone',\n                            }));\n                        }\n                        return false;\n                    }\n                }\n                if (!silent) {\n                    this.errorBox = new ErrorBox(new SimpleError({\n                        code: 'invalid_field',\n                        message: this.$t('ce4a8d4e-a0a2-456e-8fb6-c541c58ef0a1').toString(),\n                        field: 'phone',\n                    }));\n                }\n                return false;\n            }\n            else {\n                const v = silent ? this.phoneRaw : phoneNumber.formatInternational();\n                this.phoneRaw = v;\n\n                if (this.modelValue !== v) {\n                    this.$emit('update:modelValue', v);\n                }\n                if (!silent) {\n                    this.errorBox = null;\n                }\n                return true;\n            }\n        }\n        catch (e) {\n            console.error(e);\n            if (!silent) {\n                this.errorBox = new ErrorBox(new SimpleError({\n                    code: 'invalid_field',\n                    message: this.$t('ce4a8d4e-a0a2-456e-8fb6-c541c58ef0a1').toString(),\n                    field: 'phone',\n                }));\n            }\n            return false;\n        }\n    }\n}\n</script>\n","<template>\n    <SaveView :title=\"title\" :loading=\"loading\" :save-text=\"saveText\" @save=\"save\">\n        <h1>\n            {{ title }}\n        </h1>\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n        <div class=\"split-inputs\">\n            <div>\n                <STInputBox title=\"Naam\" error-fields=\"name\" :error-box=\"errors.errorBox\">\n                    <input v-model=\"name\" class=\"input\" nmae=\"name\" type=\"text\" placeholder=\"Naam\" autocomplete=\"name\">\n                </STInputBox>\n\n                <STInputBox title=\"Relatie*\" error-fields=\"title\" :error-box=\"errors.errorBox\">\n                    <input v-model=\"contactTitle\" list=\"emergency-contact-types\" class=\"input\" name=\"type\" type=\"text\" placeholder=\"Bv. buurman\">\n                    <datalist id=\"emergency-contact-types\">\n                        <option v-if=\"details && details.parents.length === 0\" value=\"Vader\" />\n                        <option v-if=\"details && details.parents.length === 0\" value=\"Moeder\" />\n                        <option v-if=\"details && details.parents.length === 0\" value=\"Ouder\" />\n                        <option v-if=\"details && details.defaultAge < 30\" value=\"Oma\" />\n                        <option v-if=\"details && details.defaultAge < 30\" value=\"Opa\" />\n                        <option v-if=\"details && details.defaultAge < 30\" value=\"Tante\" />\n                        <option v-if=\"details && details.defaultAge < 30\" value=\"Oom\" />\n                        <option value=\"Buurvrouw\" />\n                        <option value=\"Buurman\" />\n                        <option value=\"Vriend\" />\n                        <option v-if=\"details && details.defaultAge < 30\" value=\"Nonkel\" />\n                        <option v-if=\"details && details.defaultAge < 30\" value=\"Pepe\" />\n                        <option v-if=\"details && details.defaultAge < 30\" value=\"Meme\" />\n                        <option v-if=\"details && details.defaultAge < 30\" value=\"Grootvader\" />\n                        <option v-if=\"details && details.defaultAge < 30\" value=\"Grootmoeder\" />\n                    </datalist>\n                </STInputBox>\n                <p class=\"style-description-small\">\n                    *Vul gelijk welke benaming in met het toetsenbord of kies één uit de lijst.\n                </p>\n            </div>\n\n            <div>\n                <PhoneInput v-model=\"phone\" :title=\"$t('90d84282-3274-4d85-81cd-b2ae95429c34')\" :validator=\"errors.validator\" :placeholder=\"$t('90d84282-3274-4d85-81cd-b2ae95429c34')\" :required=\"true\" />\n            </div>\n        </div>\n    </SaveView>\n</template>\n\n<script setup lang=\"ts\">\nimport { SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\nimport { usePop } from '@simonbackx/vue-app-navigation';\nimport { EmergencyContact, PlatformMember } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed, nextTick, ref } from 'vue';\nimport { ErrorBox } from '../../../errors/ErrorBox';\nimport { useErrors } from '../../../errors/useErrors';\nimport { usePatch } from '../../../hooks';\nimport PhoneInput from '../../../inputs/PhoneInput.vue';\nimport { CenteredMessage } from '../../../overlays/CenteredMessage';\n\nconst props = defineProps<{\n    member: PlatformMember;\n    emergencyContact: EmergencyContact;\n    isNew: boolean;\n}>();\n\nconst { patch, patched, addPatch, hasChanges } = usePatch(props.emergencyContact);\nconst details = computed(() => props.member.patchedMember.details);\nconst errors = useErrors();\nconst pop = usePop();\nconst loading = ref(false);\nconst saveText = ref('Opslaan');\nconst title = computed(() => !props.isNew ? `${patched.value.name || 'Noodcontactpersoon'} bewerken` : 'Noodcontactpersoon toevoegen');\n\nconst name = computed({\n    get: () => patched.value.name,\n    set: name => addPatch({ name }),\n});\n\nconst contactTitle = computed({\n    get: () => patched.value.title,\n    set: title => addPatch({ title }),\n});\n\nconst phone = computed({\n    get: () => patched.value.phone,\n    set: phone => addPatch({ phone }),\n});\n\nasync function save() {\n    if (loading.value) {\n        return;\n    }\n    loading.value = true;\n    try {\n        const se = new SimpleErrors();\n        if (name.value.length < 2) {\n            se.addError(new SimpleError({\n                code: 'invalid_field',\n                message: 'Vul de naam in',\n                field: 'name',\n            }));\n        }\n\n        if (contactTitle.value.length < 2) {\n            se.addError(new SimpleError({\n                code: 'invalid_field',\n                message: 'Vul een relatie in',\n                field: 'title',\n            }));\n        }\n\n        if (!await errors.validator.validate()) {\n            se.throwIfNotEmpty();\n            loading.value = false;\n            return;\n        }\n        se.throwIfNotEmpty();\n\n        // Mark this parent as updated (not the same as reviewed, this helps merge duplicate parents correctly)\n        addPatch({\n            updatedAt: new Date(),\n        });\n\n        // Await patched.value to be updated\n        await nextTick();\n\n        if (props.isNew) {\n            const minorMembers = props.member.family.members.filter(m => m.id !== props.member.id);\n\n            if (minorMembers.length > 0 && !await CenteredMessage.confirm('Wil je deze noodcontactpersoon bij alle gezinsleden toevoegen?', 'Overal toevoegen', 'Je kan deze noodcontactpersoon ook automatisch toevoegen bij ' + Formatter.joinLast(minorMembers.map(m => m.member.firstName), ', ', ' en ') + '.', 'Enkel hier', false)) {\n                props.member.addEmergencyContact(patched.value);\n            }\n            else {\n                props.member.addEmergencyContact(patched.value);\n                for (const member of minorMembers) {\n                    member.addEmergencyContact(patched.value);\n                }\n            }\n        }\n        else {\n            props.member.patchEmergencyContact(patch.value);\n        }\n\n        await pop({ force: true });\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    loading.value = false;\n}\n\nasync function shouldNavigateAway() {\n    if (!hasChanges.value && !loading.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm('Ben je zeker dat je wilt sluiten zonder op te slaan?', 'Niet opslaan');\n}\n\ndefineExpose({\n    shouldNavigateAway,\n});\n\n</script>\n","<template>\n    <div class=\"container\">\n        <Title v-bind=\"$attrs\" title=\"Noodcontactpersonen\" />\n\n        <p v-if=\"member.isPropertyEnabled('parents')\" class=\"style-description-block\">\n            Voeg geen ouders toe als noodcontactpersoon. Ouders worden altijd als eerste gecontacteerd in geval van nood.\n        </p>\n\n        <STErrorsDefault :error-box=\"parentErrorBox\" />\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <p v-if=\"visibleContacts.length === 0\" class=\"info-box\">\n            Er zijn nog geen noodcontactpersonen toegevoegd. Voeg een noodcontact van {{ member.patchedMember.details.firstName }} toe via de knop hieronder.\n        </p>\n\n        <STList v-if=\"visibleContacts.length > 0\" :with-animation=\"true\">\n            <STListItem v-for=\"contact in visibleContacts\" :key=\"contact.id\" :selectable=\"true\" element-name=\"label\" class=\"right-stack\">\n                <template #left>\n                    <Checkbox :model-value=\"isContactSelected(contact)\" @update:model-value=\"setContactSelected(contact, $event)\" />\n                </template>\n\n                <h2 class=\"style-title-list\">\n                    {{ contact.name }} ({{ contact.title }})\n                </h2>\n                <p v-if=\"contact.phone\" class=\"style-description-small\">\n                    {{ contact.phone }}\n                </p>\n\n                <template #right>\n                    <span v-if=\"!isContactSelected(contact)\" class=\"button text limit-space\">\n                        <span class=\"icon add\" />\n                        <span>Toevoegen</span>\n                    </span>\n\n                    <button v-else class=\"button text limit-space\" type=\"button\" @click.stop=\"editContact(contact)\">\n                        <span class=\"icon edit\" />\n                        <span>Bewerken</span>\n                    </button>\n                </template>\n            </STListItem>\n        </STList>\n\n        <div class=\"style-button-bar\">\n            <button type=\"button\" class=\"button text\" :class=\"{selected: visibleContacts.length <= 0}\" @click=\"addContact()\">\n                <span class=\"icon add\" />\n                <span>Contact toevoegen</span>\n            </button>\n        </div>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { EmergencyContact, PlatformMember } from '@stamhoofd/structures';\n\nimport { PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\nimport { ComponentWithProperties, usePresent } from '@simonbackx/vue-app-navigation';\nimport { computed } from 'vue';\nimport { ErrorBox } from '../../../errors/ErrorBox';\nimport { Validator } from '../../../errors/Validator';\nimport { useErrors } from '../../../errors/useErrors';\nimport { useValidation } from '../../../errors/useValidation';\nimport STList from '../../../layout/STList.vue';\nimport { useIsPropertyRequired } from '../../hooks/useIsPropertyRequired';\nimport EditEmergencyContactView from './EditEmergencyContactView.vue';\nimport Title from './Title.vue';\n\ndefineOptions({\n    inheritAttrs: false,\n});\n\nconst props = defineProps<{\n    member: PlatformMember;\n    validator: Validator;\n    parentErrorBox?: ErrorBox | null;\n}>();\nconst isPropertyRequired = useIsPropertyRequired(computed(() => props.member));\nconst present = usePresent();\nconst errors = useErrors({ validator: props.validator });\n\nuseValidation(errors.validator, () => {\n    const se = new SimpleErrors();\n    if (isPropertyRequired('emergencyContacts') && emergencyContacts.value.length === 0) {\n        se.addError(new SimpleError({\n            code: 'invalid_field',\n            message: 'Voeg minstens één noodcontactpersoon toe',\n            field: 'emergencyContacts',\n        }));\n    }\n\n    if (se.errors.length > 0) {\n        errors.errorBox = new ErrorBox(se);\n        return false;\n    }\n    errors.errorBox = null;\n\n    return true;\n});\n\nconst initialContacts = computed(() => props.member.member.details.emergencyContacts);\nconst emergencyContacts = computed(() => props.member.patchedMember.details.emergencyContacts);\nconst visibleContacts = computed(() => {\n    // combine both unique\n    const result: EmergencyContact[] = [];\n    for (const contact of emergencyContacts.value) {\n        if (!result.find(p => p.id === contact.id)) {\n            result.push(contact);\n        }\n    }\n\n    for (const contact of initialContacts.value) {\n        if (!result.find(p => p.id === contact.id)) {\n            result.push(contact);\n        }\n    }\n\n    // Loop family members\n    for (const member of props.member.family.members) {\n        for (const contact of member.member.details.emergencyContacts) {\n            if (!result.find(p => p.id === contact.id)) {\n                result.push(contact);\n            }\n        }\n    }\n    return result;\n});\n\nfunction isContactSelected(contact: EmergencyContact) {\n    return !!emergencyContacts.value.find(p => p.id === contact.id);\n}\nfunction setContactSelected(contact: EmergencyContact, selected: boolean) {\n    if (selected === isContactSelected(contact)) {\n        return;\n    }\n    // Check if contact is present?\n    if (selected) {\n        const patch = new PatchableArray() as PatchableArrayAutoEncoder<EmergencyContact>;\n        patch.addDelete(contact.id); // avoids creating duplicates\n        patch.addPut(contact);\n        props.member.addDetailsPatch({ emergencyContacts: patch });\n    }\n    else {\n        const patch = new PatchableArray() as PatchableArrayAutoEncoder<EmergencyContact>;\n        patch.addDelete(contact.id);\n        props.member.addDetailsPatch({ emergencyContacts: patch });\n    }\n}\n\nasync function editContact(emergencyContact: EmergencyContact) {\n    await present({\n        components: [\n            new ComponentWithProperties(EditEmergencyContactView, {\n                member: props.member,\n                emergencyContact,\n                isNew: false,\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function addContact() {\n    const emergencyContact = EmergencyContact.create({});\n    await present({\n        components: [\n            new ComponentWithProperties(EditEmergencyContactView, {\n                member: props.member,\n                emergencyContact,\n                isNew: true,\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n</script>\n","import { ComponentWithProperties } from \"@simonbackx/vue-app-navigation\";\nimport { MemberStepView } from \"../..\";\nimport { NavigationActions } from \"../../../types/NavigationActions\";\nimport EditEmergencyContactsBox from \"../../components/edit/EditEmergencyContactsBox.vue\";\nimport { EditMemberStep, MemberStepManager } from \"../MemberStepManager\";\nimport { markRaw } from \"vue\";\nimport { PermissionLevel } from \"@stamhoofd/structures\";\nimport { MemberSharedStepOptions } from \"./MemberSharedStepOptions\";\n\nexport class MemberEmergencyContactsStep implements EditMemberStep {\n    options: MemberSharedStepOptions\n\n    constructor(options: MemberSharedStepOptions) {\n        this.options = options\n    }\n\n    getName(manager: MemberStepManager) {\n        return 'Noodcontactpersonen'\n    }\n\n    isEnabled(manager: MemberStepManager) {    \n        const member = manager.member\n        const details = member.patchedMember.details;\n\n        if (!member.isPropertyEnabled('emergencyContacts', {\n            checkPermissions: manager.context.user ? {\n                level: PermissionLevel.Write,\n                user: manager.context.user\n            } : undefined\n        })) {\n            return false;\n        }\n\n        if (details.emergencyContacts.length === 0 && member.isPropertyRequired('emergencyContacts')) {\n            return true;\n        }\n\n        if (this.options.outdatedTime) {\n            if (details.reviewTimes.isOutdated(\"emergencyContacts\", this.options.outdatedTime)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    getComponent(manager: MemberStepManager): ComponentWithProperties {\n        return new ComponentWithProperties(MemberStepView, {\n            title: 'Noodcontactpersonen',\n            member: manager.member,\n            component: markRaw(EditEmergencyContactsBox),\n            saveText: \"Doorgaan\",\n            markReviewed: ['emergencyContacts'],\n            saveHandler: async (navigate: NavigationActions) => {\n                await manager.saveHandler(this, navigate)\n            }\n        })\n    }\n}\n","<template>\n    <div v-if=\"isAdmin\" class=\"container\">\n        <Title v-bind=\"$attrs\" :title=\"title\" />\n\n        <STErrorsDefault :error-box=\"parentErrorBox\" />\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <template v-if=\"hasKansenTarief\">\n            <Checkbox :model-value=\"true\" :disabled=\"true\">\n                {{ checkboxLabel }}\n            </Checkbox>\n            <p class=\"style-description-small\">\n                Dit lid heeft recht op het kansentarief van de UiTPAS.\n            </p>\n        </template>\n        <Checkbox v-else v-model=\"requiresFinancialSupport\" :indeterminate=\"!dataPermissionsChangeDate\">\n            {{ checkboxLabel }}\n        </Checkbox>\n\n        <p v-if=\"!willMarkReviewed && dataPermissionsChangeDate\" class=\"style-description-small\">\n            Laatst nagekeken op {{ formatDate(dataPermissionsChangeDate) }}. <button v-tooltip=\"'Het lid zal deze stap terug moeten doorlopen via het ledenportaal'\" type=\"button\" class=\"inline-link\" @click=\"clear\">\n                Wissen\n            </button>.\n        </p>\n\n        <p v-if=\"!dataPermissionsChangeDate\" class=\"style-description-small\">\n            {{ $t('cd5ee584-5b0c-4acb-af75-7b21ad37cead') }}\n        </p>\n    </div>\n    <div v-else class=\"container\">\n        <Title v-bind=\"$attrs\" :title=\"title\" />\n        <p class=\"style-description pre-wrap\" v-text=\"description\" />\n\n        <STErrorsDefault :error-box=\"parentErrorBox\" />\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <template v-if=\"hasKansenTarief\">\n            <Checkbox :model-value=\"true\" :disabled=\"true\">\n                {{ checkboxLabel }}\n            </Checkbox>\n            <p class=\"style-description-small\">\n                Je hebt recht op het kansentarief van de UiTPAS.\n            </p>\n        </template>\n        <Checkbox v-else v-model=\"requiresFinancialSupport\" :disabled=\"hasKansenTarief\">\n            {{ checkboxLabel }}\n        </Checkbox>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { BooleanStatus, FinancialSupportSettings, PlatformMember } from '@stamhoofd/structures';\nimport { DataValidator } from '@stamhoofd/utility';\nimport { computed, nextTick } from 'vue';\nimport { useAppContext } from '../../../context/appContext';\nimport { ErrorBox } from '../../../errors/ErrorBox';\nimport { Validator } from '../../../errors/Validator';\nimport { useErrors } from '../../../errors/useErrors';\nimport { useValidation } from '../../../errors/useValidation';\nimport { useFinancialSupportSettings } from '../../../groups';\nimport Title from './Title.vue';\n\ndefineOptions({\n    inheritAttrs: false,\n});\n\nconst props = defineProps<{\n    member: PlatformMember;\n    validator: Validator;\n    parentErrorBox?: ErrorBox | null;\n    willMarkReviewed?: boolean;\n}>();\n\nconst errors = useErrors({ validator: props.validator });\nconst app = useAppContext();\nconst isAdmin = app === 'dashboard' || app === 'admin';\n\nuseValidation(props.validator, async () => {\n    // Save\n    if (!isAdmin) {\n        // Check toggled on yourself\n        if (props.member.patchedMember.details.requiresFinancialSupport?.value === true && props.member.member.details.requiresFinancialSupport?.value !== true && financialSupportSettings.value.preventSelfAssignment) {\n            throw new SimpleError({\n                code: 'financial_support_prevent_assignment',\n                message: 'Self assignment of financial support is not allowed',\n                human: financialSupportSettings.value.preventSelfAssignmentText ?? FinancialSupportSettings.defaultPreventSelfAssignmentText,\n            });\n        }\n    }\n\n    if (props.willMarkReviewed && !props.member.patchedMember.details.requiresFinancialSupport) {\n        // Make sure we save an answer\n        requiresFinancialSupport.value = requiresFinancialSupport.value as any;\n        await nextTick();\n    }\n\n    // Sync checkbox across family if changed or marked reviewed only\n    if ((\n        props.member.patchedMember.details.requiresFinancialSupport\n        && props.member.patchedMember.details.requiresFinancialSupport.value !== props.member.member.details.requiresFinancialSupport?.value\n    )\n    || props.willMarkReviewed) {\n        for (const member of props.member.family.members) {\n            if (member.id !== props.member.patchedMember.id) {\n                const expectedValue = member.isPropertyEnabled('financialSupport') ? (props.member.patchedMember.details.requiresFinancialSupport ?? null) : null;\n\n                if (expectedValue !== null && expectedValue.value !== (member.patchedMember.details.requiresFinancialSupport?.value ?? null)) {\n                    member.addDetailsPatch({\n                        requiresFinancialSupport: expectedValue,\n                    });\n                }\n            }\n        }\n    }\n\n    return true;\n});\n\nconst requiresFinancialSupport = computed({\n    get: () => props.member.patchedMember.details.requiresFinancialSupport?.value ?? false,\n    set: (requiresFinancialSupport) => {\n        if (requiresFinancialSupport === (props.member.member.details.requiresFinancialSupport?.value ?? false) && !props.willMarkReviewed) {\n            return props.member.addDetailsPatch({\n                requiresFinancialSupport: props.member.member.details.requiresFinancialSupport ?? BooleanStatus.create({\n                    value: requiresFinancialSupport,\n                }),\n            });\n        }\n        return props.member.addDetailsPatch({\n            requiresFinancialSupport: BooleanStatus.create({\n                value: requiresFinancialSupport,\n            }),\n        });\n    },\n});\n\nconst hasKansenTarief = computed(() => {\n    const uitpasNumber = props.member.patchedMember.details.uitpasNumber;\n    if (uitpasNumber === null) return false;\n    return DataValidator.isUitpasNumberKansenTarief(uitpasNumber);\n});\n\nconst dataPermissionsChangeDate = computed(() => props.member.patchedMember.details.requiresFinancialSupport?.date ?? null);\n\nconst { financialSupportSettings } = useFinancialSupportSettings();\n\nconst title = computed(() => financialSupportSettings.value.title);\nconst description = computed(() => financialSupportSettings.value.description);\nconst checkboxLabel = computed(() => financialSupportSettings.value.checkboxLabel);\n\nfunction clear() {\n    props.member.addDetailsPatch({\n        requiresFinancialSupport: null,\n    });\n}\n\n</script>\n","import { ComponentWithProperties } from \"@simonbackx/vue-app-navigation\";\nimport { FinancialSupportSettings, PermissionLevel } from \"@stamhoofd/structures\";\nimport { DataValidator } from \"@stamhoofd/utility\";\nimport { markRaw } from \"vue\";\nimport { MemberStepView } from \"../..\";\nimport { NavigationActions } from \"../../../types/NavigationActions\";\nimport EditMemberFinancialSupportBox from \"../../components/edit/EditMemberFinancialSupportBox.vue\";\nimport { EditMemberStep, MemberStepManager } from \"../MemberStepManager\";\nimport { MemberSharedStepOptions } from \"./MemberSharedStepOptions\";\n\nexport class MemberFinancialSupportStep implements EditMemberStep {\n    options: MemberSharedStepOptions\n\n    constructor(options: MemberSharedStepOptions) {\n        this.options = options\n    }\n\n    getName(manager: MemberStepManager) {\n        const settings = manager.member.platform.config.financialSupport ?? FinancialSupportSettings.create({})\n        return settings.title\n    }\n\n    isEnabled(manager: MemberStepManager) {    \n        const member = manager.member\n        const details = member.patchedMember.details;\n\n        if (!member.isPropertyEnabled('financialSupport', {\n            checkPermissions: manager.context.user ? {\n                level: PermissionLevel.Write,\n                user: manager.context.user\n            } : undefined\n        })) {\n            return false;\n        }\n        \n        if(details.uitpasNumber !== null) {\n            // if uitpas number is 'kansentarief' this step can be skipped\n            if(DataValidator.isUitpasNumberKansenTarief(details.uitpasNumber)) {\n                return false;\n            }\n        }\n\n        if (details.requiresFinancialSupport === null) {\n            return true;\n        }\n\n        if (this.options.outdatedTime) {\n            if (details.requiresFinancialSupport.value === false && details.requiresFinancialSupport.isOutdated(this.options.outdatedTime)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    getComponent(manager: MemberStepManager): ComponentWithProperties {\n        const config = manager.member.platform.config.recordsConfiguration.financialSupport ?? manager.member.organizations.find(o => o.meta.recordsConfiguration.financialSupport)?.meta.recordsConfiguration.financialSupport ?? null\n        return new ComponentWithProperties(MemberStepView, {\n            title: config?.title ?? FinancialSupportSettings.defaultTitle,\n            member: manager.member,\n            component: markRaw(EditMemberFinancialSupportBox),\n            saveText: \"Doorgaan\",\n            saveHandler: async (navigate: NavigationActions) => {\n                await manager.saveHandler(this, navigate)\n            }\n        })\n    }\n}\n","import { ComponentWithProperties } from '@simonbackx/vue-app-navigation';\nimport { EditMemberGeneralBox, MemberStepView } from '../..';\nimport { NavigationActions } from '../../../types/NavigationActions';\nimport { MemberStepManager } from '../MemberStepManager';\nimport { EditMemberStep } from '../MemberStepManager';\nimport { markRaw } from 'vue';\nimport { MemberSharedStepOptions } from './MemberSharedStepOptions';\nimport { PermissionLevel } from '@stamhoofd/structures';\n\nexport class MemberGeneralStep implements EditMemberStep {\n    options: MemberSharedStepOptions;\n\n    constructor(options: MemberSharedStepOptions) {\n        this.options = options;\n    }\n\n    getName(manager: MemberStepManager) {\n        return 'Algemene gegevens';\n    }\n\n    isEnabled(manager: MemberStepManager) {\n        const member = manager.member;\n        const details = member.patchedMember.details;\n\n        // Check missing information\n        if (!details.phone && member.isPropertyRequired('phone')) {\n            return true;\n        }\n\n        if (!details.email && member.isPropertyRequired('emailAddress')) {\n            return true;\n        }\n\n        if (!details.address && member.isPropertyRequired('address')) {\n            return true;\n        }\n\n        if (!details.birthDay && member.isPropertyRequired('birthDay')) {\n            return true;\n        }\n\n        if (!details.nationalRegisterNumber && member.isPropertyRequired('nationalRegisterNumber', {\n            checkPermissions: manager.context.user\n                ? {\n                        level: PermissionLevel.Write,\n                        user: manager.context.user,\n                    }\n                : undefined,\n        })) {\n            return true;\n        }\n\n        // Check if it has been a while since this information was reviewed\n        if (this.options.outdatedTime) {\n            if (details.reviewTimes.isOutdated('details', this.options.outdatedTime)) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    getComponent(manager: MemberStepManager): ComponentWithProperties {\n        return new ComponentWithProperties(MemberStepView, {\n            title: 'Algemene gegevens',\n            member: manager.member,\n            component: markRaw(EditMemberGeneralBox),\n            saveText: 'Doorgaan',\n            markReviewed: ['details'],\n            saveHandler: async (navigate: NavigationActions) => {\n                await manager.saveHandler(this, navigate);\n            },\n        });\n    }\n}\n","<template>\n    <STInputBox :title=\"title\" error-fields=\"email\" :error-box=\"errorBox\" :class=\"class\">\n        <input ref=\"input\" v-model=\"emailRaw\" class=\"email-input-field input\" type=\"email\" :class=\"{ error: !valid }\" :disabled=\"disabled\" v-bind=\"$attrs\" @change=\"validate(false)\" @input=\"(event) => {emailRaw = event.currentTarget.value; onTyping();}\">\n        <template #right>\n            <slot name=\"right\" />\n        </template>\n    </STInputBox>\n</template>\n\n<script lang=\"ts\">\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { Component, Prop, VueComponent, Watch } from \"@simonbackx/vue-app-navigation/classes\";\nimport { DataValidator } from \"@stamhoofd/utility\";\n\nimport {ErrorBox} from \"../errors/ErrorBox\";\nimport {Validator} from \"../errors/Validator\";\nimport STInputBox from \"./STInputBox.vue\";\n\n@Component({\n    components: {\n        STInputBox\n    },\n    emits: ['update:modelValue'],\n\n    // All attributes that we don't recognize should be passed to the input, and not to the root (except style and class)\n    inheritAttrs: false\n})\nexport default class EmailInput extends VueComponent {\n    @Prop({ default: \"\" }) \n        title: string;\n\n    @Prop({ default: null }) \n        validator: Validator | null\n\n    emailRaw = \"\";\n    valid = true;\n\n    @Prop({ required: true })\n        modelValue!: string | null\n\n    @Prop({ default: null })\n        class!: string | null\n\n    @Prop({ default: true })\n        required!: boolean\n\n    /**\n     * Whether the modelValue can be set to null if it is empty (even when it is required, will still be invalid)\n     * Only used if required = false\n     */\n    @Prop({ default: false })\n        nullable!: boolean\n\n    @Prop({ default: false })\n        disabled!: boolean\n\n    errorBox: ErrorBox | null = null\n\n    @Watch('modelValue')\n    onValueChanged(val: string | null) {\n        if (val === null) {\n            return\n        }\n        this.emailRaw = val\n    }\n\n    onTyping() {\n        // Silently send modelValue to parents, but don't show visible errors yet\n        this.validate(false, true)\n    }\n\n    mounted() {\n        if (this.validator) {\n            this.validator.addValidation(this, () => {\n                return this.validate(true)\n            })\n        }\n\n        this.emailRaw = this.modelValue ?? \"\"\n    }\n\n    unmounted() {\n        if (this.validator) {\n            this.validator.removeValidation(this)\n        }\n    }\n\n    validate(final = true, silent = false) {\n        this.emailRaw = this.emailRaw.trim().toLowerCase()\n\n        if (!this.required && this.emailRaw.length === 0) {\n            if (!silent) {\n                this.errorBox = null\n            }\n\n            if (this.modelValue !== null) {\n                this.$emit('update:modelValue', null)\n            }\n            return true\n        }\n\n        if (this.required && this.emailRaw.length === 0 && !final) {\n            // Ignore empty email if not final\n            if (!silent) {\n                this.errorBox = null\n            }\n\n            if (this.nullable && this.modelValue !== null) {\n                this.$emit('update:modelValue', null)\n            } else if (this.modelValue !== \"\") {\n                this.$emit('update:modelValue', \"\")\n            }\n            return false\n        }\n        \n        if (!DataValidator.isEmailValid(this.emailRaw)) {\n            if (!silent) {\n                this.errorBox = new ErrorBox(new SimpleError({\n                    \"code\": \"invalid_field\",\n                    \"message\": this.emailRaw.length === 0 ? 'Vul een e-mailadres in' :  \"Ongeldig e-mailadres \" + this.emailRaw,\n                    \"field\": \"email\"\n                }))\n            }\n            return false\n\n        } else {\n            if (this.emailRaw !== this.modelValue) {\n                this.$emit('update:modelValue', this.emailRaw)\n            }\n            if (!silent) {\n                this.errorBox = null\n            }\n            return true\n        }\n    }\n\n    focus() {\n        (this.$refs.input as any)?.focus()\n    }\n}\n</script>\n\n<style lang=\"scss\">\n    .email-input-field {\n        // Fix safari bug that shows the autofill on the wrong position\n        transform: translate3d(0, 0, 0);\n    }\n</style>\n","<template>\n    <STInputBox :title=\"title\" error-fields=\"nationalRegisterNumber\" :error-box=\"errors.errorBox\" :class=\"class\">\n        <input v-if=\"value === NationalRegisterNumberOptOut\" :disabled=\"true\" :value=\"'Geen Belgische nationaliteit'\" class=\"input\">\n        <input v-else v-model=\"nrrRaw\" v-format-input=\"DataValidator.getBelgianNationalNumberInputFormatter()\" :placeholder=\"placeholder || (!required ? 'Optioneel' : 'JJ.MM.DD-XXX.XX')\" class=\"input\" type=\"text\" :class=\"{placeholder: isSuggestion}\" :disabled=\"disabled\" v-bind=\"$attrs\" @change=\"validate(false)\" @input=\"(event: any) => {nrrRaw = event.currentTarget.value; onTyping();}\">\n        <template #right>\n            <slot name=\"right\" />\n        </template>\n    </STInputBox>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, ref, watch } from 'vue';\nimport { useErrors } from '../errors/useErrors';\nimport { Validator } from '../errors/Validator';\nimport { DataValidator } from '@stamhoofd/utility';\nimport { ErrorBox } from '../errors/ErrorBox';\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { useValidation } from '../errors/useValidation';\nimport { NationalRegisterNumberOptOut } from '@stamhoofd/structures';\n\nconst props = withDefaults(\n    defineProps<{\n        title: string;\n        validator: Validator | null;\n        class?: string | null;\n        required?: boolean;\n        nullable?: boolean;\n        disabled?: boolean;\n        birthDay?: Date | null;\n        placeholder?: string;\n    }>(), {\n        title: '',\n        validator: null,\n        class: null,\n        required: true,\n        nullable: false,\n        disabled: false,\n        birthDay: null,\n        placeholder: '',\n    },\n);\n\nconst errors = useErrors({ validator: props.validator });\nconst value = defineModel<string | typeof NationalRegisterNumberOptOut | null>();\n\nuseValidation(errors.validator, validate);\n\nconst nrrRaw = ref(value.value === NationalRegisterNumberOptOut ? '' : (value.value ?? ''));\n\nwatch(() => value.value, (val) => {\n    if (val === null || val === undefined || val === NationalRegisterNumberOptOut) {\n        if (!val) {\n            if (props.birthDay && !nrrRaw.value) {\n                // Autofill\n                nrrRaw.value = suggestion.value ?? '';\n            }\n        }\n        return;\n    }\n    nrrRaw.value = val;\n});\n\nconst suggestion = computed(() => {\n    if (props.birthDay) {\n        return DataValidator.generateBelgianNationalNumber(props.birthDay);\n    }\n    return null;\n});\n\nconst isSuggestion = computed(() => {\n    return nrrRaw.value === suggestion.value;\n});\n\nwatch(() => props.birthDay, (val) => {\n    if (val && !value.value && !nrrRaw.value) {\n        // Autofill\n        nrrRaw.value = suggestion.value ?? '';\n    }\n}, { immediate: true });\n\nfunction onTyping() {\n    // Silently send modelValue to parents, but don't show visible errors yet\n    validate(false, true);\n}\n\nfunction validate(final = true, silent = false) {\n    if (value.value === NationalRegisterNumberOptOut) {\n        if (!silent) {\n            errors.errorBox = null;\n        }\n        return true;\n    }\n\n    nrrRaw.value = nrrRaw.value.trim();\n\n    if (!props.required && (nrrRaw.value.length === 0 || nrrRaw.value === suggestion.value)) {\n        if (!silent) {\n            errors.errorBox = null;\n        }\n\n        if (value.value !== null) {\n            value.value = null;\n        }\n        return true;\n    }\n\n    if (props.required && nrrRaw.value.length === 0 && !final) {\n        // Ignore empty email if not final\n        if (!silent) {\n            errors.errorBox = null;\n        }\n\n        if (props.nullable && value.value !== null) {\n            value.value = null;\n        }\n        else if (value.value !== '') {\n            value.value = '';\n        }\n        return false;\n    }\n\n    if (!DataValidator.verifyBelgianNationalNumber(nrrRaw.value)) {\n        if (!silent) {\n            errors.errorBox = new ErrorBox(new SimpleError({\n                code: 'invalid_field',\n                message: nrrRaw.value.length === 0 ? 'Vul een rijksregisternummer in' : 'Dit is geen geldig rijksregisternummer. Je kan dit nummer vinden op de achterkant van de identiteitskaart, in de vorm van JJ.MM.DD-XXX.XX. Kijk na op typefouten.',\n                field: 'nationalRegisterNumber',\n            }));\n        }\n        return false;\n    }\n    else if (!DataValidator.doesMatchBelgianNationalNumber(nrrRaw.value, props.birthDay)) {\n        if (!silent) {\n            errors.errorBox = new ErrorBox(new SimpleError({\n                code: 'invalid_field',\n                message: 'Dit rijksregisternummer komt niet overeen met de ingevulde geboortedatum.',\n                field: 'nationalRegisterNumber',\n            }));\n        }\n        return false;\n    }\n    else {\n        const formatted = DataValidator.formatBelgianNationalNumber(nrrRaw.value);\n        if (formatted !== value.value) {\n            value.value = formatted;\n        }\n        if (!silent) {\n            errors.errorBox = null;\n        }\n        return true;\n    }\n}\n</script>\n","<template>\n    <STInputBox :title=\"title\" error-fields=\"address\" :error-box=\"errorBox\">\n        <input v-model=\"addressLine1\" class=\"input\" type=\"text\" placeholder=\"Straat en nummer\" name=\"street-address\" autocomplete=\"street-address\" @change=\"updateAddress\" @input=\"updateAddressRealTime\" @focus=\"onFocus\" @blur=\"onBlur\">\n        <div class=\"input-group\">\n            <div>\n                <input v-model=\"postalCode\" class=\"input\" type=\"text\" placeholder=\"Postcode\" name=\"postal-code\" autocomplete=\"postal-code\" @change=\"updateAddress\" @input=\"updateAddressRealTime\" @focus=\"onFocus\" @blur=\"onBlur\">\n            </div>\n            <div>\n                <input v-model=\"city\" class=\"input\" type=\"text\" :placeholder=\"$t('3f4f6c6a-e2c5-4bee-83a3-77d8e55a1e60')\" name=\"city\" autocomplete=\"address-level2\" @change=\"updateAddress\" @input=\"updateAddressRealTime\" @focus=\"onFocus\" @blur=\"onBlur\"> <!-- name needs to be city for safari autocomplete -->\n            </div>\n        </div>\n\n        <Dropdown v-model=\"country\" autocomplete=\"country\" name=\"country\" @update:model-value=\"updateAddress\" @focus=\"onFocus\" @blur=\"onBlur\">\n            <option v-for=\"country in countries\" :key=\"country.value\" :value=\"country.value\">\n                {{ country.text }}\n            </option>\n        </Dropdown>\n    </STInputBox>\n</template>\n\n<script lang=\"ts\">\nimport { Decoder } from '@simonbackx/simple-encoding';\nimport { isSimpleError, isSimpleErrors } from '@simonbackx/simple-errors';\nimport { Server } from '@simonbackx/simple-networking';\nimport { Component, Prop, VueComponent, Watch } from '@simonbackx/vue-app-navigation/classes';\nimport { I18nController } from '@stamhoofd/frontend-i18n';\nimport { Address, Country, CountryHelper, ValidatedAddress } from '@stamhoofd/structures';\n\nimport { ErrorBox } from '../errors/ErrorBox';\nimport { Validator } from '../errors/Validator';\nimport Dropdown from './Dropdown.vue';\nimport STInputBox from './STInputBox.vue';\n\n@Component({\n    components: {\n        STInputBox,\n        Dropdown,\n    },\n    emits: ['update:modelValue'],\n})\nexport default class AddressInput extends VueComponent {\n    @Prop({ default: '' })\n    title: string;\n\n    /**\n     * Assign a validator if you want to offload the validation to components\n     */\n    @Prop({ default: null })\n    validator: Validator | null;\n\n    errorBox: ErrorBox | null = null;\n    pendingErrorBox: ErrorBox | null = null;\n\n    @Prop({ default: null })\n    modelValue: Address | ValidatedAddress | null;\n\n    /**\n     * Validate on the server or not? -> will return a ValidatedAddress if this is true\n     */\n    @Prop({ default: null })\n    validateServer: Server | null;\n\n    @Prop({ default: true })\n    required: boolean;\n\n    /**\n     * Whether the value can be set to null if it is empty (even when it is required, will still be invalid)\n     * Only used if required = false\n     */\n    @Prop({ default: false })\n    nullable!: boolean;\n\n    addressLine1 = '';\n    city = '';\n    postalCode = '';\n    country = this.getDefaultCountry();\n\n    @Prop({ default: false })\n    linkCountryToLocale: boolean;\n\n    getDefaultCountry() {\n        return I18nController.shared?.countryCode ?? Country.Belgium;\n    }\n\n    hasFocus = false;\n\n    get countries() {\n        return CountryHelper.getList();\n    }\n\n    @Watch('modelValue', { deep: true })\n    onValueChanged(val: Address | null) {\n        if (this.hasFocus) {\n            // don't change while typing\n            return;\n        }\n\n        if (!val) {\n            if (!this.required && !this.pendingErrorBox && !this.errorBox) {\n                this.addressLine1 = '';\n                this.city = '';\n                this.postalCode = '';\n            }\n            return;\n        }\n        this.addressLine1 = val.street.length > 0 ? (val.street + ' ' + val.number) : (val.number + '');\n        this.city = val.city;\n        this.postalCode = val.postalCode;\n        this.country = val.country;\n    }\n\n    @Watch('required', { deep: true })\n    onChangeRequired() {\n        // Revalidate, because the fields might be empty, and required goes false -> send null so any saved address gets cleared\n        this.isValid(false, true).catch(console.error);\n    }\n\n    updateValues(val: Address | null) {\n        if (!val) {\n            if (!this.required && !this.pendingErrorBox && !this.errorBox) {\n                this.addressLine1 = '';\n                this.city = '';\n                this.postalCode = '';\n            }\n            return;\n        }\n        this.addressLine1 = val.street.length > 0 ? (val.street + ' ' + val.number) : (val.number + '');\n        this.city = val.city;\n        this.postalCode = val.postalCode;\n        this.country = val.country;\n    }\n\n    onBlur() {\n        this.hasFocus = false;\n\n        // Sometimes the blur happens without a onChange event, so we always need to update the address after a blur\n        // it will only make the errors visible if hasFocus is still false after 200ms\n        this.updateAddress();\n    }\n\n    onFocus() {\n        this.hasFocus = true;\n    }\n\n    mounted() {\n        if (this.validator) {\n            this.validator.addValidation(this, () => {\n                return this.isValid(true, false);\n            });\n        }\n\n        if (this.modelValue) {\n            this.addressLine1 = this.modelValue.street.length > 0 ? (this.modelValue.street + ' ' + this.modelValue.number) : (this.modelValue.number + '');\n            this.city = this.modelValue.city;\n            this.postalCode = this.modelValue.postalCode;\n            this.country = this.modelValue.country;\n        }\n    }\n\n    unmounted() {\n        if (this.validator) {\n            this.validator.removeValidation(this);\n        }\n    }\n\n    async isValid(isFinal: boolean, silent = false): Promise<boolean> {\n        if (!this.required && this.addressLine1.length === 0 && this.postalCode.length === 0 && this.city.length === 0) {\n            if (!silent) {\n                this.errorBox = null;\n            }\n\n            if (this.modelValue !== null) {\n                this.$emit('update:modelValue', null);\n            }\n            return true;\n        }\n\n        if (this.required && this.addressLine1.length === 0 && this.postalCode.length === 0 && this.city.length === 0) {\n            if (!isFinal) {\n                if (!silent) {\n                    this.errorBox = null;\n                }\n\n                if (this.nullable && this.modelValue !== null) {\n                    this.$emit('update:modelValue', null);\n                }\n                return false;\n            }\n        }\n\n        let address: Address;\n\n        try {\n            address = Address.createFromFields(this.addressLine1, this.postalCode, this.city, this.country);\n\n            if (!this.modelValue || (this.validateServer && !(this.modelValue instanceof ValidatedAddress) && !silent && isFinal) || address.toString() !== this.modelValue.toString()) {\n                // Do we need to validate on the server?\n                if (this.validateServer && !silent && isFinal) {\n                    const response = await this.validateServer.request({\n                        method: 'POST',\n                        path: '/address/validate',\n                        body: address,\n                        decoder: ValidatedAddress as Decoder<ValidatedAddress>,\n                        shouldRetry: false,\n                    });\n                    if (!this.hasFocus) {\n                        this.updateValues(response.data);\n                    }\n                    this.$emit('update:modelValue', response.data);\n                }\n                else {\n                    if (!this.hasFocus) {\n                        this.updateValues(address);\n                    }\n                    this.$emit('update:modelValue', address);\n                }\n            }\n            else {\n                if (!this.hasFocus) {\n                    this.updateValues(address);\n                }\n            }\n\n            if (!silent) {\n                this.errorBox = null;\n                this.pendingErrorBox = null;\n            }\n            return true;\n        }\n        catch (e) {\n            if (isSimpleError(e) || isSimpleErrors(e)) {\n                e.addNamespace('address');\n\n                if (!silent) {\n                    if (isFinal) {\n                        this.errorBox = new ErrorBox(e);\n                    }\n                    else {\n                        this.pendingErrorBox = new ErrorBox(e);\n\n                        setTimeout(() => {\n                            if (!this.hasFocus) {\n                                this.errorBox = this.pendingErrorBox;\n                            }\n                        }, 200);\n                    }\n                }\n            }\n\n            if (!this.required && !silent) {\n                this.$emit('update:modelValue', null);\n            }\n            return false;\n        }\n    }\n\n    updateAddress() {\n        if (this.country && this.linkCountryToLocale && I18nController.shared && I18nController.isValidCountry(this.country)) {\n            I18nController.shared.switchToLocale({ country: this.country }).catch(console.error);\n        }\n        this.isValid(false).catch(console.error);\n    }\n\n    /**\n     * Send real time input updates, but don't update error messages\n     */\n    updateAddressRealTime() {\n        if (this.country && this.linkCountryToLocale && I18nController.shared && I18nController.isValidCountry(this.country)) {\n            I18nController.shared.switchToLocale({ country: this.country }).catch(console.error);\n        }\n        this.isValid(false, true).catch(console.error);\n    }\n}\n</script>\n","<template>\n    <div>\n        <STInputBox v-if=\"addresses.length > 0\" :title=\"title || 'Kies een adres'\" :error-box=\"errorBox\" error-fields=\"selectedAddress\">\n            <STList>\n                <STListItem v-for=\"_address in addresses\" :key=\"_address.toString()\" element-name=\"label\" :selectable=\"true\" class=\"left-center address-selection\">\n                    <template #left>\n                        <Radio v-model=\"selectedAddress\" :value=\"_address\" @update:model-value=\"changeSelected\" />\n                    </template>\n                    {{ _address.street }} {{ _address.number }}<br>\n                    {{ _address.postalCode }} {{ _address.city }}\n                    <template #right>\n                        <button class=\"button icon gray edit\" type=\"button\" @click.stop=\"doEditAddress(_address)\" />\n                    </template>\n                </STListItem>\n                <STListItem element-name=\"label\" :selectable=\"true\" class=\"left-center\">\n                    <template #left>\n                        <Radio v-model=\"selectedAddress\" :value=\"null\" @update:model-value=\"changeSelected\" />\n                    </template>\n                    Een ander adres ingeven\n                </STListItem>\n            </STList>\n        </STInputBox>\n        <AddressInput v-if=\"editingAddress || selectedAddress === null\" v-model=\"editAddress\" :title=\"selectedAddress === null ? (addresses.length > 0 ? 'Nieuw adres' : 'Adres') : 'Adres bewerken'\" :validator=\"internalValidator\" :required=\"false\" />\n        <STErrorsDefault :error-box=\"errorBox\" />\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { Component, Prop, VueComponent, Watch } from '@simonbackx/vue-app-navigation/classes';\nimport { Address, ValidatedAddress } from '@stamhoofd/structures';\n\nimport { ErrorBox } from '../errors/ErrorBox';\nimport STErrorsDefault from '../errors/STErrorsDefault.vue';\nimport { Validator } from '../errors/Validator';\nimport STList from '../layout/STList.vue';\nimport STListItem from '../layout/STListItem.vue';\nimport AddressInput from './AddressInput.vue';\nimport Radio from './Radio.vue';\nimport STInputBox from './STInputBox.vue';\n\n@Component({\n    components: {\n        STInputBox,\n        STListItem,\n        STErrorsDefault,\n        Radio,\n        AddressInput,\n        STList,\n    },\n    emits: ['update:modelValue', 'modify'],\n})\nexport default class SelectionAddressInput extends VueComponent {\n    @Prop({ default: null })\n    title: string | null;\n\n    @Prop({ required: true })\n    addresses: Address[];\n\n    @Prop({ default: true })\n    required: boolean;\n\n    /**\n     * Assign a validator if you want to offload the validation to components\n     */\n    @Prop({ default: null })\n    validator: Validator | null;\n\n    errorBox: ErrorBox | null = null;\n\n    internalValidator = new Validator();\n\n    @Prop({ default: null })\n    modelValue: Address | ValidatedAddress | null;\n\n    selectedAddress: Address | null = null;\n    customAddress: Address | null = null;\n    editingAddress = false;\n\n    @Watch('modelValue')\n    onValueChanged(val: Address | null) {\n        if (val === (this.selectedAddress ?? this.customAddress ?? null)) {\n            // Not changed\n            return;\n        }\n\n        if (!val) {\n            if (!this.required) {\n                this.selectedAddress = null;\n                this.editingAddress = false;\n                this.customAddress = null;\n            }\n            return;\n        }\n\n        const a = this.addresses.find(aa => aa.toString() === val.toString());\n        if (a) {\n            this.selectedAddress = a;\n            this.editingAddress = false;\n            this.customAddress = null;\n        }\n        else {\n            this.selectedAddress = null;\n            this.editingAddress = false;\n            this.customAddress = val;\n        }\n    }\n\n    get hasModifyListener() {\n        return !!this.$.vnode.props?.onModify;\n    }\n\n    mounted() {\n        const a = this.addresses.find(aa => aa.toString() === this.modelValue?.toString());\n        if (a) {\n            this.selectedAddress = a;\n            this.editingAddress = false;\n            this.customAddress = null;\n        }\n        else {\n            this.selectedAddress = null;\n            this.editingAddress = false;\n            this.customAddress = this.modelValue;\n\n            if (this.required && !this.modelValue && this.addresses.length > 0) {\n                this.$emit('update:modelValue', this.addresses[0]);\n            }\n        }\n\n        if (this.validator) {\n            this.validator.addValidation(this, () => {\n                return this.isValid();\n            });\n        }\n    }\n\n    unmounted() {\n        if (this.validator) {\n            this.validator.removeValidation(this);\n        }\n    }\n\n    changeSelected() {\n        if (this.editingAddress) {\n            this.customAddress = null;\n        }\n        this.editingAddress = false;\n\n        const a = this.selectedAddress ?? this.customAddress;\n        if (a) {\n            this.$emit('update:modelValue', a);\n        }\n        else {\n            if (!this.required) {\n                this.$emit('update:modelValue', null);\n            }\n        }\n    }\n\n    doEditAddress(address: Address) {\n        if (this.hasModifyListener) {\n            this.$emit('update:modelValue', address);\n            this.editingAddress = true;\n            this.selectedAddress = address;\n            this.customAddress = address;\n        }\n        else {\n            this.editingAddress = false;\n            this.selectedAddress = null;\n            this.customAddress = address;\n        }\n    }\n\n    get editAddress() {\n        return this.customAddress;\n    }\n\n    set editAddress(address: Address | null) {\n        if (this.editingAddress && this.selectedAddress && address) {\n            this.$emit('modify', { from: this.selectedAddress, to: address });\n            this.selectedAddress = address;\n            this.$emit('update:modelValue', address);\n            this.editingAddress = true;\n        }\n        else {\n            this.$emit('update:modelValue', address);\n        }\n        this.customAddress = address;\n    }\n\n    async isValid(): Promise<boolean> {\n        const isValid = await this.internalValidator.validate();\n        if (!isValid) {\n            this.errorBox = null;\n            return false;\n        }\n\n        if (this.selectedAddress) {\n            if (this.selectedAddress.toString() !== this.modelValue?.toString()) {\n                this.$emit('update:modelValue', this.selectedAddress);\n            }\n            this.errorBox = null;\n            return true;\n        }\n\n        if (this.required && !this.customAddress) {\n            this.errorBox = new ErrorBox(new SimpleError({\n                code: 'invalid_field',\n                message: 'Vul een adres in',\n                field: 'address',\n            }));\n            return false;\n        }\n\n        this.errorBox = null;\n\n        if (this.customAddress?.toString() !== this.modelValue?.toString()) {\n            this.$emit('update:modelValue', this.customAddress);\n        }\n        return true;\n    }\n}\n</script>\n","import { ComponentWithProperties, usePresent } from '@simonbackx/vue-app-navigation';\nimport { PlatformMember } from '@stamhoofd/structures';\nimport { markRaw } from 'vue';\nimport { EditMemberAllBox, MemberStepView } from '..';\n\nexport function useEditMember() {\n    const present = usePresent();\n\n    return async (member: PlatformMember, options: { title: string }) => {\n        await present({\n            components: [\n                new ComponentWithProperties(MemberStepView, {\n                    member,\n                    title: options.title,\n                    component: markRaw(EditMemberAllBox),\n                }),\n            ],\n            modalDisplayStyle: 'popup',\n        });\n    };\n}\n","import { ComponentWithProperties, NavigationController } from '@simonbackx/vue-app-navigation';\nimport { PlatformFamily, PlatformMember } from '@stamhoofd/structures';\nimport { markRaw, reactive } from 'vue';\nimport { EditMemberGeneralBox, MemberStepView } from '..';\nimport { useAppContext } from '../../context';\nimport { DisplayOptions, NavigationActions, runDisplayOptions, useNavigationActions } from '../../types/NavigationActions';\n\nexport function useAddMember() {\n    const navigate = useNavigationActions();\n    const app = useAppContext();\n\n    return async (family: PlatformFamily, options: { displayOptions: DisplayOptions; finishHandler: (member: PlatformMember, navigate: NavigationActions) => Promise<void> | void }) => {\n        // We clone the family, so we can cancel the new member that was added to the family\n        const clonedFamily = family.clone();\n        const member = reactive(clonedFamily.newMember() as any) as PlatformMember;\n\n        const component = new ComponentWithProperties(NavigationController, {\n            root: new ComponentWithProperties(MemberStepView, {\n                title: 'Nieuw lid inschrijven',\n                member,\n                component: markRaw(EditMemberGeneralBox),\n                saveHandler: async (navigate: NavigationActions) => {\n                    // Copy the changes to the original family\n                    family.copyFromClone(clonedFamily);\n\n                    // Find the member\n                    // The reference to the member could have changed - we need to make sure we have a reference to a member in the original family\n                    const realMember = family.members.find(m => m.id === clonedFamily.members[clonedFamily.members.length - 1].id);\n                    if (!realMember) {\n                        await navigate.dismiss({ force: true });\n                        return;\n                    }\n\n                    if (app === 'registration' && realMember.filterRegistrations({ currentPeriod: true }).length > 0) {\n                        // This (new) member already has registrations. We don't need to show the choose group view.\n                        await navigate.dismiss({ force: true });\n                        return;\n                    }\n\n                    await options.finishHandler(realMember!, navigate);\n                },\n            }),\n        });\n\n        await runDisplayOptions({\n            components: [\n                component,\n            ],\n        }, options.displayOptions, navigate);\n    };\n}\n","<template>\n    <SaveView :title=\"title\" :loading=\"loading\" :save-text=\"saveText\" @save=\"save\">\n        <h1>\n            {{ title }}\n        </h1>\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n        <div class=\"split-inputs\">\n            <div>\n                <STInputBox title=\"Titel\" error-fields=\"type\" :error-box=\"errors.errorBox\">\n                    <Dropdown v-model=\"type\">\n                        <option v-for=\"t in parentTypes\" :key=\"t\" :value=\"t\">\n                            {{ formatParentType(t) }}\n                        </option>\n                    </Dropdown>\n                </STInputBox>\n\n                <STInputBox title=\"Naam\" error-fields=\"firstName,lastName\" :error-box=\"errors.errorBox\">\n                    <div class=\"input-group\">\n                        <div>\n                            <input v-model=\"firstName\" class=\"input\" type=\"text\" placeholder=\"Voornaam\" autocomplete=\"given-name\">\n                        </div>\n                        <div>\n                            <input v-model=\"lastName\" class=\"input\" type=\"text\" placeholder=\"Achternaam\" autocomplete=\"family-name\">\n                        </div>\n                    </div>\n                </STInputBox>\n\n                <PhoneInput v-model=\"phone\" :title=\"$t('90d84282-3274-4d85-81cd-b2ae95429c34')\" :validator=\"errors.validator\" :placeholder=\"$t('7f30db7e-4851-4aa6-b731-2c898054f707')\" :required=\"app === 'registration'\" />\n\n                <EmailInput v-model=\"email\" :required=\"app === 'registration'\" :title=\"'E-mailadres' \" placeholder=\"E-mailadres van ouder\" :validator=\"errors.validator\">\n                    <template #right>\n                        <button v-tooltip=\"'Alternatief e-mailadres toevoegen'\" class=\"button icon add gray\" type=\"button\" @click=\"addEmail\" />\n                    </template>\n                </EmailInput>\n                <EmailInput\n                    v-for=\"n in alternativeEmails.length\"\n                    :key=\"n\"\n                    :model-value=\"getEmail(n - 1)\"\n                    :required=\"true\"\n                    :title=\"'Alternatief e-mailadres ' + (alternativeEmails.length > 1 ? n : '') \"\n                    placeholder=\"E-mailadres van ouder\"\n                    :validator=\"errors.validator\"\n                    @update:model-value=\"setEmail(n - 1, $event)\"\n                >\n                    <template #right>\n                        <button class=\"button icon trash gray\" type=\"button\" @click=\"deleteEmail(n - 1)\" />\n                    </template>\n                </EmailInput>\n\n                <p v-if=\"email && member && app !== 'registration'\" class=\"style-description-small\">\n                    Deze ouder kan inloggen of registreren op <template v-if=\"alternativeEmails.length\">\n                        één van de ingevoerde e-mailadressen\n                    </template><template v-else>\n                        het ingevoerde e-mailadres\n                    </template> en krijgt dan automatisch toegang tot de gegevens van {{ member.patchedMember.firstName }} en het ledenportaal.\n                </p>\n                <p v-else-if=\"firstName && email && member\" class=\"style-description-small\">\n                    {{ firstName }} kan inloggen of registreren op <template v-if=\"alternativeEmails.length\">\n                        één van de ingevoerde e-mailadressen\n                    </template><template v-else>\n                        het ingevoerde e-mailadres\n                    </template> en krijgt dan automatisch toegang tot de gegevens van {{ member.patchedMember.firstName }} en het ledenportaal.\n                </p>\n\n                <p v-if=\"alternativeEmails.length && member\" class=\"style-description-small\">\n                    <template v-if=\"app !== 'registration'\">\n                        De ouder ontvangt enkel communicatie op het eerste e-mailadres.\n                    </template>\n                    <template v-else>\n                        {{ firstName }} ontvangt enkel communicatie op het eerste e-mailadres.\n                    </template>\n                </p>\n\n                <template v-if=\"(isPropertyEnabled('parents.nationalRegisterNumber') || nationalRegisterNumber)\">\n                    <NRNInput v-model=\"nationalRegisterNumber\" :title=\"'Rijksregisternummer'\" :required=\"isNRNRequiredForThisParent\" :nullable=\"true\" :validator=\"errors.validator\" />\n                    <p v-if=\"nationalRegisterNumber !== NationalRegisterNumberOptOut\" class=\"style-description-small\">\n                        Het rijksregisternummer wordt gebruikt om fiscale attesten op te maken. <template v-if=\"isPropertyRequired('parents.nationalRegisterNumber')\">\n                            Vul het bij minstens één ouder in, deze ouder zal vermeld worden op de attesten.\n                        </template> Heeft {{ firstName || 'deze ouder' }} geen Belgische nationaliteit, <button class=\"inline-link\" type=\"button\" @click=\"nationalRegisterNumber = NationalRegisterNumberOptOut\">\n                            klik dan hier\n                        </button>.\n                    </p>\n                    <p v-else class=\"style-description-small\">\n                        Je ontvangt geen fiscale attesten. Toch een Belgische nationaliteit, <button class=\"inline-link\" type=\"button\" @click=\"nationalRegisterNumber = null\">\n                            klik dan hier\n                        </button>.\n                    </p>\n                </template>\n            </div>\n\n            <SelectionAddressInput v-model=\"address\" :addresses=\"availableAddresses\" :validator=\"errors.validator\" :required=\"app === 'registration'\" />\n        </div>\n    </SaveView>\n</template>\n\n<script setup lang=\"ts\">\nimport { SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\nimport { usePop } from '@simonbackx/vue-app-navigation';\nimport { Address, NationalRegisterNumberOptOut, Parent, ParentType, ParentTypeHelper, PlatformFamily, PlatformMember } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed, nextTick, ref } from 'vue';\nimport { useAppContext } from '../../../context/appContext';\nimport { ErrorBox } from '../../../errors/ErrorBox';\nimport { useErrors } from '../../../errors/useErrors';\nimport { usePatch } from '../../../hooks';\nimport Dropdown from '../../../inputs/Dropdown.vue';\nimport EmailInput from '../../../inputs/EmailInput.vue';\nimport NRNInput from '../../../inputs/NRNInput.vue';\nimport PhoneInput from '../../../inputs/PhoneInput.vue';\nimport SelectionAddressInput from '../../../inputs/SelectionAddressInput.vue';\nimport { CenteredMessage } from '../../../overlays/CenteredMessage';\nimport { NavigationActions, useNavigationActions } from '../../../types/NavigationActions';\nimport { useIsAllOptional, useIsPropertyEnabled, useIsPropertyRequired } from '../../hooks';\n\nconst props = withDefaults(defineProps<{\n    member?: PlatformMember | null;\n    family?: PlatformFamily | null;\n    parent: Parent;\n    isNew: boolean;\n    saveHandler?: ((navigate: NavigationActions) => Promise<void> | void) | null;\n}>(), {\n    member: null,\n    family: null,\n    saveHandler: null,\n});\n\nconst family = props.family || props.member!.family;\nconst { patched, addPatch, hasChanges, patch } = usePatch(props.parent);\nconst errors = useErrors();\nconst pop = usePop();\nconst loading = ref(false);\nconst saveText = ref('Opslaan');\nconst app = useAppContext();\nconst parentTypes = ParentTypeHelper.getPublicTypes();\nconst title = computed(() => !props.isNew ? `${patched.value.firstName || 'Ouder'} bewerken` : 'Ouder toevoegen');\nconst navigate = useNavigationActions();\n\nconst relatedMembers = computed(() => {\n    const base = family.getMembersForParent(props.parent);\n\n    if (props.member && !base.find(m => m.id === props.member?.id)) {\n        base.push(props.member);\n    }\n    return base;\n});\n\nconst isPropertyRequired = useIsPropertyRequired(relatedMembers);\nconst isPropertyEnabled = useIsPropertyEnabled(relatedMembers, true);\nconst isAllOptional = useIsAllOptional(relatedMembers);\n\n/**\n * If NRN is required, it is only required for one parent of each member\n */\nconst isNRNRequiredForThisParent = computed(() => {\n    if (isAllOptional.value) {\n        return false;\n    }\n\n    for (const member of relatedMembers.value) {\n        const required = member.isPropertyRequired('parents.nationalRegisterNumber');\n        if (required && !member.patchedMember.details.parents.find(p => p.id !== props.parent.id && !!p.nationalRegisterNumber)) {\n            return true;\n        }\n    }\n    return false;\n});\n\nconst firstName = computed({\n    get: () => patched.value.firstName,\n    set: firstName => addPatch({ firstName }),\n});\n\nconst lastName = computed({\n    get: () => patched.value.lastName,\n    set: lastName => addPatch({ lastName }),\n});\n\nconst type = computed({\n    get: () => patched.value.type,\n    set: type => addPatch({ type }),\n});\n\nconst phone = computed({\n    get: () => patched.value.phone,\n    set: phone => addPatch({ phone }),\n});\n\nconst email = computed({\n    get: () => patched.value.email,\n    set: email => addPatch({ email }),\n});\n\nconst address = computed({\n    get: () => patched.value.address,\n    set: address => addPatch({ address }),\n});\n\nconst alternativeEmails = computed({\n    get: () => patched.value.alternativeEmails,\n    set: alternativeEmails => addPatch({\n        alternativeEmails: alternativeEmails as any,\n    }),\n});\n\nconst nationalRegisterNumber = computed({\n    get: () => patched.value.nationalRegisterNumber,\n    set: nationalRegisterNumber => addPatch({ nationalRegisterNumber }),\n});\n\nconst availableAddresses = computed(() => {\n    const list = family.addresses;\n\n    return list;\n});\n\nfunction deleteEmail(n: number) {\n    const newEmails = [...alternativeEmails.value];\n    newEmails.splice(n, 1);\n    alternativeEmails.value = newEmails;\n}\n\nfunction addEmail() {\n    alternativeEmails.value = [...alternativeEmails.value, ''];\n}\n\nfunction getEmail(index: number) {\n    return alternativeEmails.value[index] ?? '';\n}\n\nfunction setEmail(index: number, value: string) {\n    const newEmails = [...alternativeEmails.value];\n    newEmails[index] = value;\n    alternativeEmails.value = newEmails;\n}\n\nfunction formatParentType(type: ParentType) {\n    return ParentTypeHelper.getName(type);\n}\n\nasync function save() {\n    if (loading.value) {\n        return;\n    }\n    loading.value = true;\n    try {\n        const se = new SimpleErrors();\n        if (firstName.value.length < 2) {\n            se.addError(new SimpleError({\n                code: 'invalid_field',\n                message: 'Vul de voornaam in',\n                field: 'firstName',\n            }));\n        }\n        if (lastName.value.length < 2) {\n            se.addError(new SimpleError({\n                code: 'invalid_field',\n                message: 'Vul de achternaam in',\n                field: 'lastName',\n            }));\n        }\n\n        if (nationalRegisterNumber.value && nationalRegisterNumber.value !== NationalRegisterNumberOptOut) {\n            const otherParents = family.parents.filter(p => p.id !== props.parent.id && !p.isEqual(patched.value));\n\n            if (relatedMembers.value) {\n                for (const member of relatedMembers.value) {\n                    if (member.patchedMember.details.nationalRegisterNumber === nationalRegisterNumber.value) {\n                        se.addError(new SimpleError({\n                            code: 'invalid_field',\n                            message: 'Dit rijksregisternummer is al in gebruik door ' + member.patchedMember.firstName + '. Vul a.u.b. het juiste rijksregisternummer in, dit kan invloed hebben op uw belastingaangifte.',\n                            field: 'nationalRegisterNumber',\n                        }));\n                    }\n                }\n            }\n\n            const parent = otherParents.find(p => p.nationalRegisterNumber === nationalRegisterNumber.value);\n            if (parent) {\n                se.addError(new SimpleError({\n                    code: 'invalid_field',\n                    message: `Dit rijksregisternummer is al in gebruik door een andere ouder (${parent.name}). Vul a.u.b. het juiste rijksregisternummer in, dit kan invloed hebben op uw belastingaangifte.`,\n                    field: 'nationalRegisterNumber',\n                }));\n            }\n        }\n\n        if (!await errors.validator.validate()) {\n            se.throwIfNotEmpty();\n            loading.value = false;\n            return;\n        }\n        se.throwIfNotEmpty();\n\n        const old = props.parent.address;\n        const updated = patched.value.address;\n\n        if (old !== null && updated !== null && old.toString() !== updated.toString()) {\n            await modifyAddress(old, updated);\n        }\n\n        // Mark this parent as updated (not the same as reviewed, this helps merge duplicate parents correctly)\n        addPatch({\n            updatedAt: new Date(),\n        });\n\n        // Await patched.value to be updated\n        await nextTick();\n\n        if (props.member && props.isNew) {\n            const minorMembers = family.members.filter(m => m.id !== props.member!.id && m.isPropertyEnabled('parents'));\n\n            if (minorMembers.length > 0 && !await CenteredMessage.confirm('Wil je deze ouder bij alle gezinsleden toevoegen?', 'Overal toevoegen', 'Je kan deze ouder ook automatisch toevoegen bij ' + Formatter.joinLast(minorMembers.map(m => m.member.firstName), ', ', ' en ') + '.', 'Enkel hier', false)) {\n                props.member.addParent(patched.value);\n            }\n            else {\n                props.member.addParent(patched.value);\n                for (const member of minorMembers) {\n                    member.addParent(patched.value);\n                }\n            }\n        }\n        else {\n            if (props.member) {\n                props.member.patchParent(patch.value);\n            }\n            else if (props.family) {\n                props.family.patchParent(patch.value);\n            }\n        }\n\n        if (props.saveHandler) {\n            await props.saveHandler(navigate);\n        }\n        else {\n            await pop({ force: true });\n        }\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    loading.value = false;\n}\n\nasync function modifyAddress(from: Address, to: Address) {\n    // todo: Check if we find this address in other places...\n    const occurrences = family.getAddressOccurrences(from, { parentId: patched.value.id });\n\n    if (occurrences.length === 0) {\n        return;\n    }\n\n    if (!await CenteredMessage.confirm('Wil je dit adres overal wijzigen?', 'Overal wijzigen', from.shortString() + ' is ook het adres van ' + Formatter.joinLast(occurrences, ', ', ' en ') + '. Als je wilt kan je het adres ook voor hen wijzigen naar ' + to.shortString() + '.', 'Enkel hier', false)) {\n        return;\n    }\n\n    family.updateAddress(from, to);\n}\n\nasync function shouldNavigateAway() {\n    if (!hasChanges.value && !loading.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm('Ben je zeker dat je wilt sluiten zonder op te slaan?', 'Niet opslaan');\n}\n\ndefineExpose({\n    shouldNavigateAway,\n});\n\n</script>\n","<template>\n    <div class=\"container\">\n        <Title v-bind=\"$attrs\" title=\"Ouders\" />\n\n        <STErrorsDefault :error-box=\"parentErrorBox\" />\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <p v-if=\"visibleParents.length === 0\" class=\"info-box\">\n            Nog geen ouders toegevoegd. Voeg een ouder van {{ member.patchedMember.details.firstName }} toe via de knop hieronder.\n        </p>\n\n        <STList v-else :with-animation=\"true\">\n            <STListItem v-for=\"parent in visibleParents\" :key=\"parent.id\" :selectable=\"true\" element-name=\"label\" class=\"right-stack left-center\">\n                <template #left>\n                    <Checkbox :model-value=\"isParentSelected(parent)\" @update:model-value=\"setParentSelected(parent, $event)\" />\n                </template>\n\n                <h3 class=\"style-title-list\">\n                    {{ parent.firstName }} {{ parent.lastName }}\n                </h3>\n                <p v-if=\"parent.phone\" class=\"style-description-small\">\n                    {{ parent.phone }}\n                </p>\n                <p v-if=\"parent.email\" class=\"style-description-small\">\n                    {{ parent.email }}\n                </p>\n                <p v-if=\"parent.address\" class=\"style-description-small\">\n                    {{ parent.address }}\n                </p>\n                <p v-if=\"parent.nationalRegisterNumber && parent.nationalRegisterNumber !== NationalRegisterNumberOptOut\" class=\"style-description-small\">\n                    RRN: {{ parent.nationalRegisterNumber }}\n                </p>\n\n                <template #right>\n                    <span v-if=\"!isParentSelected(parent)\" class=\"button text limit-space\">\n                        <span class=\"icon add\" />\n                        <span>Toevoegen</span>\n                    </span>\n\n                    <button v-else class=\"button text limit-space\" type=\"button\" @click.stop=\"editParent(parent)\">\n                        <span class=\"icon edit\" />\n                        <span>Bewerken</span>\n                    </button>\n                </template>\n            </STListItem>\n        </STList>\n\n        <div class=\"style-button-bar\">\n            <button type=\"button\" class=\"button text\" :class=\"{selected: visibleParents.length <= 1}\" @click=\"addParent()\">\n                <span class=\"icon add\" />\n                <span>Ouder toevoegen</span>\n            </button>\n        </div>\n\n        <p v-if=\"!willMarkReviewed && reviewDate && isAdmin\" class=\"style-description-small\">\n            Laatst nagekeken op {{ formatDate(reviewDate) }}. <button v-tooltip=\"'Het lid zal deze stap terug moeten doorlopen via het ledenportaal'\" type=\"button\" class=\"inline-link\" @click=\"clear\">\n                Wissen\n            </button>.\n        </p>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { Parent, PlatformMember } from '@stamhoofd/structures';\n\nimport { PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\nimport { ComponentWithProperties, usePresent } from '@simonbackx/vue-app-navigation';\nimport { NationalRegisterNumberOptOut } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { useAppContext } from '../../../context';\nimport { ErrorBox } from '../../../errors/ErrorBox';\nimport { Validator } from '../../../errors/Validator';\nimport { useErrors } from '../../../errors/useErrors';\nimport { useValidation } from '../../../errors/useValidation';\nimport STList from '../../../layout/STList.vue';\nimport { useIsPropertyRequired } from '../../hooks/useIsPropertyRequired';\nimport EditParentView from './EditParentView.vue';\nimport Title from './Title.vue';\n\ndefineOptions({\n    inheritAttrs: false,\n});\nconst props = defineProps<{\n    member: PlatformMember;\n    validator: Validator;\n    parentErrorBox?: ErrorBox;\n    willMarkReviewed?: boolean;\n}>();\n\nconst isPropertyRequired = useIsPropertyRequired(computed(() => props.member));\nconst present = usePresent();\nconst errors = useErrors({ validator: props.validator });\n\nuseValidation(errors.validator, () => {\n    const se = new SimpleErrors();\n    if (parents.value.length === 0 && isPropertyRequired('parents')) {\n        se.addError(new SimpleError({\n            code: 'invalid_field',\n            message: 'Voeg minstens één ouder toe',\n            field: 'parents',\n        }));\n    }\n    else if (parents.value.length > 0 && !parents.value.some(p => !!p.nationalRegisterNumber) && isPropertyRequired('parents.nationalRegisterNumber')) {\n        se.addError(new SimpleError({\n            code: 'invalid_field',\n            message: 'Voeg bij minstens één ouder een rijksregisternummer toe.',\n            field: 'parents',\n        }));\n    }\n\n    if (props.member.patchedMember.details.phone) {\n        // Check if duplicate\n        const clone = props.member.patchedMember.details.clone();\n        clone.cleanData();\n        if (clone.phone === null) {\n            se.addError(new SimpleError({\n                code: 'invalid_field',\n                message: `Je kan het GSM-nummer van een ouder niet opgeven als het GSM-nummer van ${props.member.patchedMember.details.firstName} of omgekeerd. Vul het GSM-nummer van ${props.member.patchedMember.details.firstName} zelf in.`,\n                field: 'phone',\n            }));\n        }\n    }\n\n    if (props.member.patchedMember.details.email) {\n        // Check if duplicate\n        const clone = props.member.patchedMember.details.clone();\n        clone.cleanData();\n        if (clone.email === null) {\n            se.addError(new SimpleError({\n                code: 'invalid_field',\n                message: `Je kan het e-mailadres van een ouder niet opgeven als het e-mailadres van ${props.member.patchedMember.details.firstName} of omgekeerd. Vul het e-mailadres van ${props.member.patchedMember.details.firstName} zelf in.`,\n                field: 'email',\n            }));\n        }\n    }\n\n    if (se.errors.length > 0) {\n        errors.errorBox = new ErrorBox(se);\n        return false;\n    }\n    errors.errorBox = null;\n\n    return true;\n});\nconst app = useAppContext();\nconst isAdmin = app === 'dashboard' || app === 'admin';\n\nconst initialParents = computed(() => props.member.member.details.parents);\nconst parents = computed(() => props.member.patchedMember.details.parents);\n\nconst visibleParents = computed(() => {\n    // combine both unique\n    const result: Parent[] = [];\n    for (const parent of parents.value) {\n        if (!result.find(p => p.id === parent.id)) {\n            result.push(parent);\n        }\n    }\n\n    for (const parent of initialParents.value) {\n        if (!result.find(p => p.id === parent.id)) {\n            result.push(parent);\n        }\n    }\n\n    // Loop family members\n    for (const member of props.member.family.members) {\n        for (const parent of member.patchedMember.details.parents) {\n            if (!result.find(p => p.id === parent.id)) {\n                result.push(parent);\n            }\n        }\n    }\n\n    return result;\n});\n\nfunction isParentSelected(parent: Parent) {\n    return !!parents.value.find(p => p.id === parent.id);\n}\nfunction setParentSelected(parent: Parent, selected: boolean) {\n    if (selected === isParentSelected(parent)) {\n        return;\n    }\n    // Check if parent is present?\n    if (selected) {\n        const patch = new PatchableArray() as PatchableArrayAutoEncoder<Parent>;\n        patch.addDelete(parent.id); // avoids creating duplicates\n        patch.addPut(parent);\n        props.member.addDetailsPatch({ parents: patch });\n    }\n    else {\n        const patch = new PatchableArray() as PatchableArrayAutoEncoder<Parent>;\n        patch.addDelete(parent.id);\n        props.member.addDetailsPatch({ parents: patch });\n    }\n}\n\nasync function editParent(parent: Parent) {\n    await present({\n        components: [\n            new ComponentWithProperties(EditParentView, {\n                member: props.member,\n                parent,\n                isNew: false,\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function addParent() {\n    const parent = Parent.create({});\n    await present({\n        components: [\n            new ComponentWithProperties(EditParentView, {\n                member: props.member,\n                parent,\n                isNew: true,\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nconst reviewDate = computed(() => {\n    return props.member.patchedMember.details.reviewTimes.getLastReview('parents');\n});\n\nfunction clear() {\n    const times = props.member.patchedMember.details.reviewTimes.clone();\n    times.removeReview('parents');\n    props.member.addDetailsPatch({\n        reviewTimes: times,\n    });\n}\n</script>\n","import { ComponentWithProperties } from '@simonbackx/vue-app-navigation';\nimport { PermissionLevel } from '@stamhoofd/structures';\nimport { markRaw } from 'vue';\nimport { MemberStepView } from '../..';\nimport { NavigationActions } from '../../../types/NavigationActions';\nimport EditMemberParentsBox from '../../components/edit/EditMemberParentsBox.vue';\nimport { EditMemberStep, MemberStepManager } from '../MemberStepManager';\nimport { MemberSharedStepOptions } from './MemberSharedStepOptions';\n\nexport class MemberParentsStep implements EditMemberStep {\n    options: MemberSharedStepOptions;\n\n    constructor(options: MemberSharedStepOptions) {\n        this.options = options;\n    }\n\n    getName(manager: MemberStepManager) {\n        return 'Ouders';\n    }\n\n    isEnabled(manager: MemberStepManager) {\n        const member = manager.member;\n        const details = member.patchedMember.details;\n\n        if (!member.isPropertyEnabled('parents', {\n            checkPermissions: manager.context.user\n                ? {\n                        level: PermissionLevel.Write,\n                        user: manager.context.user,\n                    }\n                : undefined,\n        })) {\n            return false;\n        }\n\n        if (details.parents.length === 0 && member.isPropertyRequired('parents')) {\n            return true;\n        }\n\n        if (member.isPropertyRequired('nationalRegisterNumber') && !details.parents.some(p => !!p.nationalRegisterNumber)) {\n            return true;\n        }\n\n        // Check if it has been a while since this information was reviewed\n        if (this.options.outdatedTime) {\n            if (details.reviewTimes.isOutdated('parents', this.options.outdatedTime)) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    getComponent(manager: MemberStepManager): ComponentWithProperties {\n        return new ComponentWithProperties(MemberStepView, {\n            title: 'Ouders',\n            member: manager.member,\n            component: markRaw(EditMemberParentsBox),\n            saveText: 'Doorgaan',\n            markReviewed: ['parents'],\n            saveHandler: async (navigate: NavigationActions) => {\n                await manager.saveHandler(this, navigate);\n            },\n        });\n    }\n}\n","<template>\n    <STInputBox :title=\"title\" error-fields=\"*\" :error-box=\"errorBox\">\n        <label class=\"file-input-box\" :class=\"{ center: !modelValue }\">\n\n            <Spinner v-if=\"uploading\" />\n            <span v-else-if=\"modelValue === null\" class=\"icon center upload\" />\n\n            <span v-if=\"modelValue\" :class=\"'icon '+getFileIcon(modelValue)\" />\n            <span v-if=\"modelValue\" class=\"text\">{{ modelValue.name }}</span>\n\n            <input type=\"file\" class=\"file-upload\" :accept=\"accept\" @change=\"changedFile\">\n            <button v-if=\"!required && modelValue\" class=\"button icon trash\" type=\"button\" @click=\"deleteMe\" @click.prevent=\"openFile\" />\n            <span v-if=\"required && modelValue\" class=\"button icon sync\" />\n\n            <button v-if=\"modelValue\" class=\"button icon external\" type=\"button\" @click.prevent=\"openFile\" />\n        </label>\n    </STInputBox>\n</template>\n\n<script lang=\"ts\">\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { Request } from '@simonbackx/simple-networking';\nimport { NavigationMixin } from '@simonbackx/vue-app-navigation';\nimport { Component, Mixins, Prop } from '@simonbackx/vue-app-navigation/classes';\nimport { File } from '@stamhoofd/structures';\n\nimport { ErrorBox } from '../errors/ErrorBox';\nimport { Validator } from '../errors/Validator';\nimport Spinner from '../Spinner.vue';\nimport STInputBox from './STInputBox.vue';\n\n@Component({\n    components: {\n        Spinner,\n        STInputBox,\n    },\n})\nexport default class FileInput extends Mixins(NavigationMixin) {\n    @Prop({ default: '' })\n    title: string;\n\n    @Prop({ default: null })\n    validator: Validator | null;\n\n    @Prop({ default: null })\n    modelValue: File | null;\n\n    @Prop({ default: true })\n    required!: boolean;\n\n    @Prop({ default: false })\n    isPrivate: boolean;\n\n    @Prop({ default: 'application/pdf' })\n    accept: string;\n\n    errorBox: ErrorBox | null = null;\n\n    uploading = false;\n\n    deleteMe() {\n        this.$emit('update:modelValue', null);\n    }\n\n    openFile(event: MouseEvent) {\n        if (this.modelValue) {\n            window.open(this.modelValue.getPublicPath(), '_blank');\n            event.preventDefault();\n        }\n    }\n\n    getFileIcon(file: File) {\n        if (file.path.endsWith('.png') || file.path.endsWith('.jpg') || file.path.endsWith('.jpeg') || file.path.endsWith('.gif')) {\n            return 'file-image';\n        }\n        if (file.path.endsWith('.pdf')) {\n            return 'file-pdf color-pdf';\n        }\n        if (file.path.endsWith('.xlsx') || file.path.endsWith('.xls')) {\n            return 'file-excel color-excel';\n        }\n        if (file.path.endsWith('.docx') || file.path.endsWith('.doc')) {\n            return 'file-word color-word';\n        }\n        return 'file';\n    }\n\n    beforeUnmount() {\n        Request.cancelAll(this);\n    }\n\n    changedFile(event) {\n        if (!event.target.files || event.target.files.length !== 1) {\n            return;\n        }\n        if (this.uploading) {\n            return;\n        }\n\n        const file = event.target.files[0];\n\n        if (file.size > 20 * 1024 * 1024) {\n            this.errorBox = new ErrorBox(new SimpleError({\n                code: 'file_too_large',\n                message: 'De bestandsgrootte is te groot. Het bestand mag maximaal 20MB groot zijn.',\n            }));\n            return;\n        }\n\n        const formData = new FormData();\n        formData.append('file', file);\n\n        this.uploading = true;\n        this.errorBox = null;\n\n        this.$context.authenticatedServer\n            .request({\n                method: 'POST',\n                path: '/upload-file',\n                body: formData,\n                decoder: File,\n                timeout: 5 * 60 * 1000,\n                shouldRetry: false,\n                owner: this,\n                query: {\n                    private: this.isPrivate ? true : undefined,\n                },\n            })\n            .then((response) => {\n                this.$emit('update:modelValue', response.data);\n            })\n            .catch((e) => {\n                console.error(e);\n                this.errorBox = new ErrorBox(e);\n            })\n            .finally(() => {\n                this.uploading = false;\n                // Clear selection\n                event.target.value = null;\n            });\n    }\n}\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use \"@stamhoofd/scss/base/text-styles.scss\" as *;\n\n.file-input-box {\n    @extend .style-input;\n    @extend .style-input-shadow;\n    border: $border-width solid $color-border;\n    color: $color-gray-5;\n    background: $color-background;\n    border-radius: $border-radius;\n    padding: 5px 15px;\n    height: 50px;\n    margin: 0;\n    box-sizing: border-box;\n    display: flex;\n    align-items: center;\n    justify-content: flex-start;\n    transition: border-color 0.2s, color 0.2s;\n    outline: none;\n    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n    cursor: pointer;\n    touch-action: manipulation;\n    position: relative;\n\n    > .text {\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        overflow: hidden;\n        padding-right: 5px;\n    }\n\n    &.center {\n        justify-content: center;\n    }\n\n    &:hover {\n        border-color: $color-primary-gray-light;\n        color: $color-primary;\n    }\n\n    &:active {\n        border-color: $color-primary;\n        color: $color-primary;\n    }\n\n    &.square {\n        width: 60px;\n    }\n\n    .file-upload {\n        display: none;\n    }\n\n    .icon:first-child {\n        margin-right: 10px;\n\n        &+ span {\n            color: $color-dark;\n        }\n    }\n\n    .icon {\n        flex-shrink: 0;\n        color: $color-gray-4;\n    }\n\n    .button.icon {\n        margin-left: auto;\n\n        ~ .button.icon {\n            margin-left: 10px;\n        }\n    }\n\n    .icon.trash {\n        color: $color-error;\n        opacity: 0;\n        transition: opacity 0.2s;\n\n        &:hover {\n            opacity: 1;\n        }\n    }\n\n    &:hover {\n        .icon.trash {\n            opacity: 1;\n        }\n    }\n}\n\n</style>\n","<template>\n    <STInputBox :title=\"title\" error-fields=\"*\" :error-box=\"errorBox\">\n        <label class=\"image-input-box\" :class=\"{square: isSquare, dark}\" @click=\"onClick\">\n            <span v-if=\"!required && modelValue\" class=\"icon trash\" />\n            <span v-if=\"!required && !modelValue && placeholder\" class=\"icon sync\" />\n\n            <Spinner v-if=\"uploading\" />\n            <img v-else-if=\"modelValue === null && placeholder\" :src=\"placeholderSrc\" :width=\"placeholderShownResolution.width\" :height=\"placeholderShownResolution.height\">\n            <span v-else-if=\"modelValue === null\" class=\"icon upload\" />\n            <img v-else :src=\"src\" :width=\"shownResolution.width\" :height=\"shownResolution.height\">\n            <input type=\"file\" class=\"file-upload\" accept=\"image/png, image/jpeg, image/svg+xml\" @change=\"changedFile\">\n        </label>\n    </STInputBox>\n</template>\n\n<script lang=\"ts\">\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { Request } from '@simonbackx/simple-networking';\nimport { NavigationMixin } from '@simonbackx/vue-app-navigation';\nimport { Component, Mixins, Prop } from '@simonbackx/vue-app-navigation/classes';\nimport { Image, ResolutionRequest, Version } from '@stamhoofd/structures';\n\nimport { ErrorBox } from '../errors/ErrorBox';\nimport { Validator } from '../errors/Validator';\nimport Spinner from '../Spinner.vue';\nimport STInputBox from './STInputBox.vue';\n\n@Component({\n    components: {\n        Spinner,\n        STInputBox,\n    },\n    emits: ['update:modelValue'],\n})\nexport default class ImageInput extends Mixins(NavigationMixin) {\n    @Prop({ default: '' })\n    title: string;\n\n    @Prop({ default: null })\n    validator: Validator | null;\n\n    @Prop({ default: null })\n    resolutions: ResolutionRequest[] | null;\n\n    @Prop({ default: null })\n    modelValue: Image | null;\n\n    @Prop({ default: null })\n    placeholder: Image | null;\n\n    @Prop({ default: true })\n    required!: boolean;\n\n    @Prop({ default: false })\n    dark!: boolean;\n\n    @Prop({ default: false })\n    isPrivate: boolean;\n\n    errorBox: ErrorBox | null = null;\n\n    uploading = false;\n\n    get isSquare() {\n        if (this.resolutions === null) {\n            return false;\n        }\n        return !!this.resolutions.find(r => r.width === r.height && r.width);\n    }\n\n    get src() {\n        return this.shownResolution.file.getPublicPath();\n    }\n\n    get shownResolution() {\n        return this.modelValue!.getResolutionForSize(undefined, 220);\n    }\n\n    get placeholderSrc() {\n        return this.placeholder!.getResolutionForSize(undefined, 220).file.getPublicPath();\n    }\n\n    get placeholderShownResolution() {\n        return this.placeholder!.getResolutionForSize(undefined, 220);\n    }\n\n    onClick(event) {\n        if (!this.required && this.modelValue) {\n            event.preventDefault();\n            this.$emit('update:modelValue', null);\n        }\n    }\n\n    beforeUnmount() {\n        Request.cancelAll(this);\n    }\n\n    changedFile(event) {\n        if (!event.target.files || event.target.files.length !== 1) {\n            return;\n        }\n        if (this.uploading) {\n            return;\n        }\n\n        const file = event.target.files[0];\n\n        if (file.size > 5 * 1024 * 1024) {\n            this.errorBox = new ErrorBox(new SimpleError({\n                code: 'file_too_large',\n                message: 'De bestandsgrootte is te groot. De afbeelding mag maximaal 5MB groot zijn. Probeer de afbeelding te verkleinen en daarna opnieuw te selecteren.',\n            }));\n            return;\n        }\n\n        const resolutions = this.resolutions ?? [ResolutionRequest.create({ height: 720 })];\n\n        const formData = new FormData();\n        formData.append('file', file);\n        formData.append('resolutions', JSON.stringify(resolutions.map(r => r.encode({ version: Version }))));\n\n        this.uploading = true;\n        this.errorBox = null;\n\n        Request.cancelAll(this);\n        this.$context.authenticatedServer\n            .request({\n                method: 'POST',\n                path: '/upload-image',\n                body: formData,\n                decoder: Image,\n                timeout: 60 * 1000,\n                shouldRetry: false,\n                owner: this,\n                query: {\n                    private: this.isPrivate ? true : undefined,\n                },\n            })\n            .then((response) => {\n                this.$emit('update:modelValue', response.data);\n            })\n            .catch((e) => {\n                console.error(e);\n                this.errorBox = new ErrorBox(e);\n            })\n            .finally(() => {\n                this.uploading = false;\n\n                // Clear selection\n                event.target.value = null;\n            });\n    }\n}\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use \"@stamhoofd/scss/base/text-styles.scss\" as *;\n\n.image-input-box {\n    @extend .style-input;\n    @extend .style-input-shadow;\n    border: $border-width solid $color-gray-2;\n    color: $color-gray-5;\n    background: $color-background-shade;\n    border-radius: $border-radius;\n    padding: 5px 15px;\n    height: 120px;\n    margin: 0;\n    box-sizing: border-box;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    transition: border-color 0.2s, color 0.2s;\n    outline: none;\n    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n    cursor: pointer;\n    touch-action: manipulation;\n    position: relative;\n\n    &.dark {\n        @include dark-modus;\n    }\n\n    &:hover {\n        border-color: $color-primary-gray-light;\n        color: $color-primary;\n    }\n\n    &:active {\n        border-color: $color-primary;\n        color: $color-primary;\n    }\n\n    &.square {\n        width: 120px;\n    }\n\n    .file-upload {\n        display: none;\n    }\n\n    img {\n        position: absolute; // fix max width\n        max-height: 110px;\n        max-width: calc(100% - 10px);\n        height: auto;\n        width: auto;\n    }\n\n    .icon.trash, .icon.sync {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        position: absolute;\n        left: 0;\n        right: 0;\n        top: 0;\n        bottom: 0;\n        background: $color-background;\n        text-align: center;\n        opacity: 0;\n        width: 100%;\n        height: 100%;\n        z-index: 1;\n        transition: opacity 0.2s;\n        border-radius: $border-radius;\n    }\n\n    .icon.trash {\n        color: $color-error;\n    }\n\n    &:hover {\n        .icon.trash, .icon.sync {\n            opacity: 1;\n        }\n    }\n}\n\n</style>\n","<template>\n    <div>\n        <Checkbox v-if=\"answer.settings.type === RecordType.Checkbox\" v-model=\"selected\">\n            <h3 class=\"style-title-list\">\n                {{ label }}\n            </h3>\n            <p v-if=\"answer.settings.description\" class=\"style-description-small\">\n                {{ answer.settings.description }}\n            </p>\n        </Checkbox>\n        <STInputBox v-else-if=\"answer.settings.type === RecordType.MultipleChoice\" class=\"max\" :title=\"label\" error-fields=\"input\" :error-box=\"errors.errorBox\">\n            <STList>\n                <STListItem v-for=\"choice in record.choices\" :key=\"choice.id\" :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Checkbox :model-value=\"getChoiceSelected(choice)\" @update:model-value=\"setChoiceSelected(choice, $event)\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        {{ choice.name }}\n                    </h3>\n                    <p v-if=\"choice.description\" class=\"style-description-small\">\n                        {{ choice.description }}\n                    </p>\n                </STListItem>\n            </STList>\n        </STInputBox>\n        <STInputBox v-else-if=\"answer.settings.type === RecordType.ChooseOne\" class=\"max\" :title=\"label\" error-fields=\"input\" :error-box=\"errors.errorBox\">\n            <STList>\n                <STListItem v-for=\"choice in record.choices\" :key=\"choice.id\" :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio v-model=\"selectedChoice\" :name=\"'record-answer-'+answer.id\" :value=\"choice.id\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        {{ choice.name }}\n                    </h3>\n                    <p v-if=\"choice.description\" class=\"style-description-small\">\n                        {{ choice.description }}\n                    </p>\n                </STListItem>\n            </STList>\n        </STInputBox>\n        <STInputBox v-else-if=\"answer.settings.type === RecordType.Text\" :title=\"label\" error-fields=\"input\" :error-box=\"errors.errorBox\">\n            <input v-model=\"textValue\" :placeholder=\"inputPlaceholder\" class=\"input\">\n        </STInputBox>\n        <STInputBox v-else-if=\"answer.settings.type === RecordType.Textarea\" :title=\"label\" class=\"max\" error-fields=\"input\" :error-box=\"errors.errorBox\">\n            <textarea v-model=\"textValue\" :placeholder=\"inputPlaceholder\" class=\"input\" />\n        </STInputBox>\n        <AddressInput v-else-if=\"answer.settings.type === RecordType.Address\" v-model=\"addressValue\" :title=\"label\" :required=\"required\" :validator=\"errors.validator\" :nullable=\"true\" />\n        <PhoneInput v-else-if=\"answer.settings.type === RecordType.Phone\" v-model=\"textValue\" :placeholder=\"inputPlaceholder\" :title=\"label\" :required=\"required\" :validator=\"errors.validator\" :nullable=\"true\" />\n        <EmailInput v-else-if=\"answer.settings.type === RecordType.Email\" v-model=\"textValue\" :placeholder=\"inputPlaceholder\" :title=\"label\" :required=\"required\" :validator=\"errors.validator\" :nullable=\"true\" />\n        <STInputBox v-else-if=\"answer.settings.type === RecordType.Date\" :title=\"label\" error-fields=\"input\" :error-box=\"errors.errorBox\">\n            <DateSelection v-model=\"dateValue\" :required=\"required\" :validator=\"validator\" :placeholder=\"inputPlaceholder\" />\n        </STInputBox>\n        <STInputBox v-else-if=\"answer.settings.type === RecordType.Price\" :title=\"label\" error-fields=\"input\" :error-box=\"errors.errorBox\">\n            <PriceInput v-model=\"integerValue\" :required=\"required\" :validator=\"validator\" :placeholder=\"inputPlaceholder\" />\n        </STInputBox>\n        <ImageInput v-else-if=\"answer.settings.type === RecordType.Image\" v-model=\"imageValue\" :title=\"label\" :required=\"required\" :validator=\"errors.validator\" :resolutions=\"record.resolutions\" :is-private=\"true\" />\n        <FileInput v-else-if=\"answer.settings.type === RecordType.File\" v-model=\"fileValue\" :accept=\"accept\" :title=\"label\" :required=\"required\" :validator=\"errors.validator\" :is-private=\"true\" />\n        <STInputBox v-else-if=\"answer.settings.type === RecordType.Integer\" :title=\"label\" error-fields=\"input\" :error-box=\"errors.errorBox\">\n            <NumberInput v-model=\"integerValue\" :required=\"required\" :validator=\"validator\" :placeholder=\"inputPlaceholder\" />\n        </STInputBox>\n\n        <p v-else class=\"error-box\">\n            Niet ondersteund. Herlaad de app indien nodig en probeer opnieuw.\n        </p>\n\n        <!-- Comments if checkbox is selected -->\n        <div v-if=\"answer.settings.type === RecordType.Checkbox && selected && answer.settings.askComments\" class=\"textarea-container\">\n            <textarea v-model=\"comments\" class=\"input small\" :placeholder=\"inputPlaceholder\" />\n            <p v-if=\"answer.settings.commentsDescription\" class=\"info-box\">\n                {{ answer.settings.commentsDescription }}\n            </p>\n        </div>\n\n        <!-- Unhandled errors -->\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <!-- Footer description -->\n        <p v-if=\"answer.settings.type !== RecordType.Checkbox && answer.settings.description\" class=\"style-description-small\">\n            {{ answer.settings.description }}\n        </p>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Address, FileType, Image, PatchAnswers, RecordAddressAnswer, RecordAnswer, RecordAnswerDecoder, RecordCheckboxAnswer, RecordChoice, RecordChooseOneAnswer, RecordDateAnswer, RecordFileAnswer, RecordImageAnswer, RecordIntegerAnswer, RecordMultipleChoiceAnswer, RecordPriceAnswer, RecordSettings, RecordTextAnswer, RecordType } from '@stamhoofd/structures';\n\nimport { AutoEncoderPatchType, PatchMap } from '@simonbackx/simple-encoding';\nimport { computed, onMounted } from 'vue';\nimport { ErrorBox } from '../errors/ErrorBox';\nimport STErrorsDefault from '../errors/STErrorsDefault.vue';\nimport { Validator } from '../errors/Validator';\nimport { useErrors } from '../errors/useErrors';\nimport { useValidation } from '../errors/useValidation';\nimport STList from '../layout/STList.vue';\nimport STListItem from '../layout/STListItem.vue';\nimport AddressInput from './AddressInput.vue';\nimport Checkbox from './Checkbox.vue';\nimport DateSelection from './DateSelection.vue';\nimport EmailInput from './EmailInput.vue';\nimport FileInput from './FileInput.vue';\nimport ImageInput from './ImageInput.vue';\nimport NumberInput from './NumberInput.vue';\nimport PhoneInput from './PhoneInput.vue';\nimport PriceInput from './PriceInput.vue';\nimport Radio from './Radio.vue';\nimport STInputBox from './STInputBox.vue';\n\nconst props = withDefaults(defineProps<{\n    record: RecordSettings;\n    // Used to find the currently saved answer\n    answers: Map<string, RecordAnswer>;\n    validator: Validator;\n    allOptional?: boolean;\n    markReviewed?: boolean;\n}>(), {\n    markReviewed: false,\n    allOptional: false,\n});\n\nconst emit = defineEmits<{\n    patch: [patch: PatchAnswers];\n}>();\nconst errors = useErrors({ validator: props.validator });\n\nconst answer = computed({\n    get: () => {\n        const existing = props.answers.get(props.record.id);\n        const type = RecordAnswerDecoder.getClassForType(props.record.type);\n        if (existing !== undefined && existing instanceof type) {\n            if (existing.settings !== props.record) {\n                existing.settings = props.record;\n            }\n            return existing;\n        }\n\n        // Create a new one\n        return RecordAnswer.createDefaultAnswer(props.record);\n    },\n\n    set: (value: RecordAnswer) => {\n        const patch = new PatchMap() as PatchAnswers;\n\n        if (props.markReviewed) {\n            value.markReviewed();\n        }\n        patch.set(props.record.id, value);\n        emit('patch', patch);\n    },\n});\n\nfunction patchAnswer(patch: AutoEncoderPatchType<RecordAnswer>) {\n    const patchMap = new PatchMap() as PatchAnswers;\n\n    // PatchAnswer doesn't support pathces becase it is a generic type (needs type for decoding, which we don't support yet - See RecordAnswerDecoder)\n    patchMap.set(props.record.id, answer.value.patch(patch));\n    emit('patch', patchMap);\n}\n\nconst casted = {\n    RecordTextAnswer: computed(() => answer.value instanceof RecordTextAnswer ? answer.value : null),\n    RecordMultipleChoiceAnswer: computed(() => answer.value instanceof RecordMultipleChoiceAnswer ? answer.value : null),\n    RecordCheckboxAnswer: computed(() => answer.value instanceof RecordCheckboxAnswer ? answer.value : null),\n    RecordChooseOneAnswer: computed(() => answer.value instanceof RecordChooseOneAnswer ? answer.value : null),\n    RecordAddressAnswer: computed(() => answer.value instanceof RecordAddressAnswer ? answer.value : null),\n    RecordDateAnswer: computed(() => answer.value instanceof RecordDateAnswer ? answer.value : null),\n    RecordPriceAnswer: computed(() => answer.value instanceof RecordPriceAnswer ? answer.value : null),\n    RecordImageAnswer: computed(() => answer.value instanceof RecordImageAnswer ? answer.value : null),\n    RecordFileAnswer: computed(() => answer.value instanceof RecordFileAnswer ? answer.value : null),\n    RecordIntegerAnswer: computed(() => answer.value instanceof RecordIntegerAnswer ? answer.value : null),\n};\n\nconst label = computed(() => props.record.label || props.record.name);\nconst required = computed(() => !props.allOptional && props.record.required);\nconst inputPlaceholder = computed(() => {\n    if (!required.value) {\n        if (answer.value.settings.inputPlaceholder.length > 0) {\n            if (props.record.type === RecordType.Integer) {\n                return answer.value.settings.inputPlaceholder;\n            }\n            return 'Optioneel. ' + answer.value.settings.inputPlaceholder;\n        }\n        return 'Optioneel';\n    }\n    return answer.value.settings.inputPlaceholder || answer.value.settings.name;\n});\n\nconst selected = computed({\n    get: () => {\n        return casted.RecordCheckboxAnswer.value?.selected ?? false;\n    },\n    set: (selected: boolean) => {\n        patchAnswer(RecordCheckboxAnswer.patch({\n            selected,\n        }));\n    },\n});\n\nconst comments = computed({\n    get: () => {\n        return casted.RecordCheckboxAnswer.value?.comments ?? '';\n    },\n    set: (comments: string) => {\n        patchAnswer(RecordCheckboxAnswer.patch({\n            comments,\n        }));\n    },\n});\n\nconst selectedChoice = computed({\n    get: () => {\n        return casted.RecordChooseOneAnswer.value?.selectedChoice?.id ?? null;\n    },\n    set: (selectedChoiceId: string | null) => {\n        const selectedChoice = props.record.choices.find(c => c.id === selectedChoiceId);\n        patchAnswer(RecordChooseOneAnswer.patch({\n            selectedChoice,\n        }));\n    },\n});\n\nconst integerValue = computed({\n    get: () => {\n        return casted.RecordIntegerAnswer.value?.value ?? null;\n    },\n    set: (value: number | null) => {\n        patchAnswer(RecordIntegerAnswer.patch({\n            value,\n        }));\n    },\n});\n\nconst textValue = computed({\n    get: () => {\n        return casted.RecordTextAnswer.value?.value ?? '';\n    },\n    set: (value: string) => {\n        patchAnswer(RecordTextAnswer.patch({\n            value,\n        }));\n    },\n});\n\nconst addressValue = computed({\n    get: () => {\n        return casted.RecordAddressAnswer.value?.address ?? null;\n    },\n    set: (address: Address | null) => {\n        patchAnswer(RecordAddressAnswer.patch({\n            address,\n        }));\n    },\n});\n\nconst dateValue = computed({\n    get: () => {\n        return casted.RecordDateAnswer.value?.dateValue ?? null;\n    },\n    set: (dateValue: Date | null) => {\n        patchAnswer(RecordDateAnswer.patch({\n            dateValue,\n        }));\n    },\n});\n\nconst imageValue = computed({\n    get: () => {\n        return casted.RecordImageAnswer.value?.image ?? null;\n    },\n    set: (image: Image | null) => {\n        patchAnswer(RecordImageAnswer.patch({\n            image,\n        }));\n    },\n});\n\nconst fileValue = computed({\n    get: () => {\n        return casted.RecordFileAnswer.value?.file ?? null;\n    },\n    set: (file) => {\n        patchAnswer(RecordFileAnswer.patch({\n            file,\n        }));\n    },\n});\n\nconst accept = computed(() => {\n    if (props.record.type === RecordType.File) {\n        switch (props.record.fileType) {\n            case FileType.PDF:\n                return 'application/pdf';\n            case FileType.Excel:\n                return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel';\n            case FileType.Word:\n                return 'application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/msword';\n            default:\n                return '';\n        }\n    }\n    return '';\n});\n\nfunction getChoiceSelected(choice: RecordChoice): boolean {\n    return !!(casted.RecordMultipleChoiceAnswer.value)?.selectedChoices.find(c => c.id === choice.id);\n}\n\nfunction setChoiceSelected(choice: RecordChoice, selected: boolean) {\n    if (selected === getChoiceSelected(choice)) {\n        return;\n    }\n    const v = casted.RecordMultipleChoiceAnswer.value;\n    if (!v) {\n        return;\n    }\n\n    const choices = v.selectedChoices.filter(c => c.id !== choice.id);\n\n    if (selected) {\n        patchAnswer(RecordMultipleChoiceAnswer.patch({\n            selectedChoices: [...choices, choice] as any,\n        }));\n    }\n    else {\n        patchAnswer(RecordMultipleChoiceAnswer.patch({\n            selectedChoices: choices as any,\n        }));\n    }\n}\n\nuseValidation(props.validator, () => {\n    const valid = isValid();\n\n    if (valid) {\n        if (props.markReviewed) {\n            answer.value = answer.value as any;\n        }\n    }\n\n    return valid;\n});\n\nonMounted(() => {\n    // Make sure the answer (updated one) is inside the recordAnswers\n    const existing = props.answers.get(props.record.id);\n    const readValue = answer.value;\n    if ((existing === undefined && !props.allOptional) || existing !== readValue) {\n        answer.value = readValue;\n    }\n});\n\nfunction isValid() {\n    if (props.allOptional && answer.value.isEmpty) {\n        return true;\n    }\n\n    try {\n        answer.value.validate();\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n        return false;\n    }\n    errors.errorBox = null;\n    return true;\n}\n</script>\n","<template>\n    <div v-if=\"!category.isEnabled(value)\" class=\"container\">\n        <p v-if=\"STAMHOOFD.environment === 'development'\" class=\"error-box\">\n            This category should be invisible. Check if the record categories are filtered using .filter(c => c.isEnabled(value))\n        </p>\n    </div>\n    <div v-else class=\"container\">\n        <h1 v-if=\"level === 1\">\n            {{ category.name }}\n            <span v-if=\"titleSuffix\" class=\"title-suffix\">\n                {{ titleSuffix }}\n            </span>\n        </h1>\n        <h2 v-else class=\"style-with-button\">\n            <div>\n                {{ category.name }}\n                <span v-if=\"titleSuffix\" class=\"title-suffix\">\n                    {{ titleSuffix }}\n                </span>\n            </div>\n            <div>\n                <button v-if=\"!markReviewed && hasAnswers\" v-tooltip=\"'Wis alle antwoorden'\" type=\"button\" class=\"button icon trash\" @click=\"clearAnswers\" />\n            </div>\n        </h2>\n\n        <p v-if=\"category.description\" class=\"style-description-block pre-wrap\" v-text=\"category.description\" />\n\n        <STErrorsDefault :error-box=\"parentErrorBox\" />\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n        <slot />\n\n        <RecordAnswerInput v-for=\"record of filteredWriteableRecords\" :key=\"record.id\" :record=\"record\" :answers=\"answers\" :validator=\"validator\" :all-optional=\"isOptional\" :mark-reviewed=\"markReviewed\" @patch=\"addPatch\" />\n        <div v-for=\"childCategory of childCategories\" :key=\"childCategory.id\" class=\"container\">\n            <hr>\n            <h2>{{ level === 1 ? childCategory.name : (category.name + ': ' + childCategory.name) }}</h2>\n            <p v-if=\"childCategory.description\" class=\"style-description pre-wrap\" v-text=\"childCategory.description\" />\n\n            <RecordAnswerInput v-for=\"record of childCategory.filterRecords(props.value, filterOptions)\" :key=\"record.id\" :record=\"record\" :answers=\"answers\" :validator=\"validator\" :all-optional=\"isOptional\" :mark-reviewed=\"markReviewed\" @patch=\"addPatch\" />\n        </div>\n\n        <p v-if=\"!markReviewed && lastReviewed\" class=\"style-description-small\">\n            Laatst nagekeken op {{ formatDate(lastReviewed) }}<template v-if=\"isLastReviewIncomplete\">\n                (onvolledig)\n            </template>. <button v-if=\"canMarkReviewed\" class=\"inline-link\" type=\"button\" @click=\"doMarkReviewed\">\n                Markeer als nagekeken\n            </button>\n        </p>\n        <p v-if=\"!markReviewed && !lastReviewed\" class=\"style-description-small\">\n            Nog nooit nagekeken. <button v-if=\"canMarkReviewed\" class=\"inline-link\" type=\"button\" @click=\"doMarkReviewed\">\n                Markeer als nagekeken\n            </button>\n        </p>\n    </div>\n</template>\n\n<script lang=\"ts\" setup generic=\"T extends ObjectWithRecords\">\nimport { PatchMap } from '@simonbackx/simple-encoding';\nimport { ObjectWithRecords, PatchAnswers, PermissionLevel, RecordCategory } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { useAppContext } from '../../context/appContext';\nimport { ErrorBox } from '../../errors/ErrorBox';\nimport { Validator } from '../../errors/Validator';\nimport { useErrors } from '../../errors/useErrors';\nimport { useValidation } from '../../errors/useValidation';\nimport RecordAnswerInput from '../../inputs/RecordAnswerInput.vue';\nimport { CenteredMessage } from '../../overlays/CenteredMessage';\n\nconst props = withDefaults(\n    defineProps<{\n        category: RecordCategory;\n        /**\n         * Patched Value\n         */\n        value: T;\n        validator: Validator;\n        parentErrorBox?: ErrorBox | null;\n        level?: number;\n        allOptional?: boolean;\n        titleSuffix?: string;\n        forceMarkReviewed?: boolean | null;\n    }>(), {\n        level: 1,\n        allOptional: false,\n        titleSuffix: '',\n        forceMarkReviewed: null,\n        parentErrorBox: null,\n    },\n);\nconst errors = useErrors({ validator: props.validator });\nconst app = useAppContext();\nconst isAdmin = app === 'dashboard' || app === 'admin';\nconst markReviewed = props.forceMarkReviewed ?? (app !== 'dashboard' && app !== 'admin');\nconst filterOptions = isAdmin\n    ? undefined\n    : {\n            level: PermissionLevel.Write,\n        };\n\nuseValidation(props.validator, () => {\n    if (markReviewed) {\n        doMarkReviewed();\n    }\n    return true;\n});\n\nconst emit = defineEmits<{\n    patch: [patch: PatchAnswers];\n}>();\n\nconst addPatch = (patch: PatchAnswers) => {\n    emit('patch', patch);\n};\n\nconst answers = computed(() => {\n    return props.value.getRecordAnswers();\n});\nconst lastReviewed = computed(() => calculateLastReviewed());\nconst isLastReviewIncomplete = computed(() => calculateLastReviewIncomplete(lastReviewed.value));\nconst now = new Date();\n\nconst canMarkReviewed = computed(() => !lastReviewed.value || lastReviewed.value < now || isLastReviewIncomplete.value);\n\nconst filteredWriteableRecords = computed(() => {\n    return props.category.filterRecords(props.value, filterOptions);\n});\n\nconst deepFilteredWriteableRecords = computed(() => {\n    return props.category.getAllFilteredRecords(props.value, filterOptions);\n});\n\nconst isOptional = computed(() => {\n    return props.allOptional || (!!props.category.filter && (props.category.filter.requiredWhen === null || !props.value.doesMatchFilter(props.category.filter.requiredWhen)));\n});\n\nconst childCategories = computed(() => {\n    return props.category.filterChildCategories(props.value);\n});\n\nfunction calculateLastReviewed() {\n    let last: Date | null = null;\n\n    for (const record of deepFilteredWriteableRecords.value) {\n        const answer = answers.value.get(record.id);\n        if (answer && answer.reviewedAt) {\n            // Mark reviewed\n            if (!last || answer.reviewedAt < last) {\n                last = answer.reviewedAt;\n            }\n        }\n    }\n    return last;\n}\n\nfunction calculateLastReviewIncomplete(date: Date | null) {\n    if (date === null) {\n        return false;\n    }\n\n    for (const record of deepFilteredWriteableRecords.value) {\n        const answer = answers.value.get(record.id);\n        if (!answer || !answer.reviewedAt || answer.reviewedAt < date) {\n            return true;\n        }\n    }\n    return false;\n}\n\nfunction doMarkReviewed() {\n    const patch = new PatchMap() as PatchAnswers;\n\n    for (const record of deepFilteredWriteableRecords.value) {\n        const answer = answers.value.get(record.id);\n        if (!answer) {\n            continue;\n        }\n        patch.set(record.id, answer.patch({\n            reviewedAt: new Date(),\n        }));\n    }\n\n    addPatch(patch);\n}\n\nconst hasAnswers = computed(() => {\n    for (const record of deepFilteredWriteableRecords.value) {\n        const a = answers.value.get(record.id);\n        if (a && !a.isEmpty) {\n            return true;\n        }\n    }\n    return false;\n});\n\nasync function clearAnswers() {\n    if (!await CenteredMessage.confirm($t('e977e290-dff3-401c-a520-0a5e8abac1e1'), $t('587c7b87-b79e-4f3c-a55e-9fc8331d86c6'))) {\n        return;\n    }\n    const patch = new PatchMap() as PatchAnswers;\n\n    for (const record of deepFilteredWriteableRecords.value) {\n        patch.set(record.id, null);\n    }\n\n    addPatch(patch);\n}\n</script>\n","<template>\n    <FillRecordCategoryBox :parent-error-box=\"parentErrorBox\" :category=\"category\" :value=\"member\" :validator=\"validator\" :level=\"level\" :all-optional=\"allOptional\" :title-suffix=\"titleSuffix\" @patch=\"addPatch\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { PatchAnswers, PlatformMember, RecordCategory } from '@stamhoofd/structures';\n\nimport { Validator } from '../../../errors/Validator';\n\nimport { computed } from 'vue';\nimport FillRecordCategoryBox from '../../../records/components/FillRecordCategoryBox.vue';\nimport { useIsAllOptional } from '../../hooks/useIsPropertyRequired';\nimport { useAppContext } from '../../../context/appContext';\nimport { ErrorBox } from '../../../errors/ErrorBox';\nimport { useOrganization } from '../../../hooks';\n\nconst props = defineProps<{\n    member: PlatformMember;\n    validator: Validator;\n    category: RecordCategory;\n    parentErrorBox?: ErrorBox | null;\n    level?: number;\n}>();\n\ndefineOptions({\n    inheritAttrs: false,\n});\n\nconst allOptional = useIsAllOptional(computed(() => props.member));\nconst app = useAppContext();\nconst organization = useOrganization();\n\nconst owningOrganization = computed(() => {\n    return props.member.organizations.find(o => o.meta.recordsConfiguration.recordCategories.find(c => c.id === props.category.id));\n});\nconst titleSuffix = computed(() => {\n    if (app === 'registration') {\n        return '';\n    }\n\n    // Platform admins can see who owns the record category\n    if (owningOrganization.value && (!organization.value || owningOrganization.value.id !== organization.value.id)) {\n        return owningOrganization.value.name;\n    }\n\n    return '';\n});\n\nfunction addPatch(patch: PatchAnswers) {\n    props.member.addDetailsPatch({\n        recordAnswers: patch,\n    });\n}\n</script>\n","import { ComponentWithProperties } from '@simonbackx/vue-app-navigation';\nimport { RecordCategory, RegisterItem } from '@stamhoofd/structures';\nimport { markRaw } from 'vue';\nimport { MemberStepView } from '../..';\nimport { NavigationActions } from '../../../types/NavigationActions';\nimport EditMemberRecordCategoryBox from '../../components/edit/EditMemberRecordCategoryBox.vue';\nimport { EditMemberStep, MemberStepManager } from '../MemberStepManager';\nimport { MemberSharedStepOptions } from './MemberSharedStepOptions';\n\nexport class MemberRecordCategoryStep implements EditMemberStep {\n    recordCategory: RecordCategory;\n    item: RegisterItem | null;\n    options: MemberSharedStepOptions;\n\n    constructor(recordCategory: RecordCategory, item: RegisterItem | null, options: MemberSharedStepOptions) {\n        this.recordCategory = recordCategory;\n        this.item = item;\n        this.options = options;\n    }\n\n    getName(manager: MemberStepManager) {\n        return this.recordCategory.name;\n    }\n\n    isEnabled(manager: MemberStepManager) {\n        const member = manager.member;\n        const enabledCategories = member.getEnabledRecordCategories({\n            scopeOrganization: this.item?.organization,\n            scopeGroup: this.item?.group,\n        });\n\n        const enabled = !!enabledCategories.find(c => c.id === this.recordCategory.id);\n\n        if (!enabled) {\n            return false;\n        }\n\n        // check if everything has been answered already + check out of date\n        return !this.recordCategory.isComplete(member, this.options.outdatedTime);\n    }\n\n    getComponent(manager: MemberStepManager): ComponentWithProperties {\n        // The record category filters can get adjusted due to inheritance. That is why we need to proplery load them\n        const member = manager.member;\n        const enabledCategories = member.getEnabledRecordCategories({\n            scopeOrganization: this.item?.organization,\n            scopeGroup: this.item?.group,\n        });\n\n        const recordCategory = enabledCategories.find(c => c.id === this.recordCategory.id) ?? this.recordCategory;\n\n        return new ComponentWithProperties(MemberStepView, {\n            title: recordCategory.name,\n            member: manager.member,\n            component: markRaw(EditMemberRecordCategoryBox),\n            saveText: 'Doorgaan',\n            category: recordCategory,\n            saveHandler: async (navigate: NavigationActions) => {\n                await manager.saveHandler(this, navigate);\n            },\n        });\n    }\n}\n","<template>\n    <STInputBox :title=\"title\" error-fields=\"uitpasNumber\" :error-box=\"errorBox\" :class=\"props.class\">\n        <input ref=\"input\" v-model=\"uitpasNumberRaw\" class=\"input\" type=\"tel\"  :disabled=\"disabled\" v-bind=\"$attrs\" :placeholder=\"placeholder\" autocomplete=\"off\" inputmode=\"numeric\" maxlength=\"13\" @keydown=\"preventInvalidUitpasNumberChars\" @change=\"validate(false)\">\n    </STInputBox>\n</template>\n\n<script lang=\"ts\" setup>\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { DataValidator } from \"@stamhoofd/utility\";\nimport { Ref, computed, ref, watch } from 'vue';\nimport { ErrorBox } from \"../errors/ErrorBox\";\nimport { Validator } from \"../errors/Validator\";\nimport { useValidation } from '../errors/useValidation';\nimport STInputBox from \"./STInputBox.vue\";\n\nconst props = withDefaults(defineProps<{\n    validator?: Validator,\n    nullable?: boolean,\n    title?: string,\n    disabled?: boolean,\n    class?: string,\n    required?: boolean\n}>(), {\n    validator: undefined,\n    nullable: false,\n    title: undefined,\n    disabled: false,\n    class: undefined,\n    required: true\n});\n\nconst model = defineModel<string | null>({required: true});\n\nconst uitpasNumberRaw = ref(model.value ?? \"\");\n\nwatch(model, (value) => uitpasNumberRaw.value = value ?? '');\n\nconst placeholder = computed(() => {\n    const base = \"Bv. 4329032984732\";\n    if(props.required) return base;\n    return `Optioneel. ${base}`\n});\n\nconst input = ref<HTMLInputElement | null>(null);\nconst errorBox: Ref<ErrorBox | null> = ref(null);\n\nif(props.validator) {\n    useValidation(props.validator, () => {\n        return validate(true)\n    });\n}\n\nfunction clearErrorBox(silent: boolean) {\n    if (!silent) {\n        errorBox.value = null\n    }\n}\n\nfunction validate(final = true, silent = false): boolean {\n    if (!props.required && uitpasNumberRaw.value.length === 0) {\n        clearErrorBox(silent);\n        model.value = null;\n        return true\n    }\n\n    if (props.required && uitpasNumberRaw.value.length === 0 && !final) {\n        // Ignore empty email if not final\n        clearErrorBox(silent);\n\n        if (props.nullable) {\n            model.value = null;\n        } else {\n            model.value = \"\";\n        }\n\n        return false\n    }\n        \n    if (!DataValidator.isUitpasNumberValid(uitpasNumberRaw.value)) {\n        if (!silent) {\n            errorBox.value = new ErrorBox(new SimpleError({\n                code: \"invalid_field\",\n                message: \"Vul een geldig UiTPAS-nummer in\",\n                field: 'uitpasNumber'\n            }));\n        }\n        \n        return false\n    }\n\n    model.value = uitpasNumberRaw.value;\n    clearErrorBox(silent);\n\n    return true;\n}\n\nfunction preventInvalidUitpasNumberChars(e: KeyboardEvent) {\n    // allow paste\n    if(e.ctrlKey || e.metaKey) return false;\n\n    // do not allow non-digits\n    if(e.key && /^\\D$/.test(e.key)) {\n        e.preventDefault();\n    }\n}\n</script>\n","<template>\n    <div class=\"container\">\n        <Title v-bind=\"$attrs\" :title=\"isAdmin ? 'UiTPAS-nummer' : 'UiTPAS'\" />\n        <p v-if=\"!isAdmin\" class=\"style-description pre-wrap\" v-text=\"'Heb je een UiTPAS? Vul dan hier het nummer in.'\" />\n            \n        <STErrorsDefault :error-box=\"parentErrorBox\" />\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <UitpasNumberInput\n            v-model=\"uitpasNumber\"\n            :required=\"isPropertyRequired('uitpasNumber')\"\n            :validator=\"validator\"\n            :title=\"isAdmin ? undefined : 'UiTPAS-nummer'\"\n        />\n\n        <p v-if=\"!willMarkReviewed && isAdmin && reviewDate\" class=\"style-description-small\">\n            Laatst gewijzigd op {{ formatDate(reviewDate) }}. <button v-tooltip=\"'Het lid zal deze stap terug moeten doorlopen via het ledenportaal'\" type=\"button\" class=\"inline-link\" @click=\"clear\">\n                Wissen\n            </button>.\n        </p>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { PlatformMember } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { useAppContext } from '../../../context/appContext';\nimport { ErrorBox } from '../../../errors/ErrorBox';\nimport { Validator } from '../../../errors/Validator';\nimport { useErrors } from '../../../errors/useErrors';\nimport UitpasNumberInput from '../../../inputs/UitpasNumberInput.vue';\nimport { useIsPropertyRequired } from '../../hooks/useIsPropertyRequired';\nimport Title from './Title.vue';\n\ndefineOptions({\n    inheritAttrs: false\n})\n\nconst props = defineProps<{\n    member: PlatformMember,\n    validator: Validator,\n    parentErrorBox?: ErrorBox | null,\n    willMarkReviewed?: boolean\n}>();\n\nconst app = useAppContext();\nconst isAdmin = app === 'dashboard' || app === 'admin';\nconst errors = useErrors({validator: props.validator});\nconst isPropertyRequired = useIsPropertyRequired(computed(() => props.member));\n\nconst uitpasNumber = computed({\n    get: () => props.member.patchedMember.details.uitpasNumber,\n    set: (uitpasNumber) => {\n        props.member.addDetailsPatch({uitpasNumber});\n    }\n});\n\nconst reviewDate = computed(() => {\n    return props.member.patchedMember.details.reviewTimes.getLastReview('uitpasNumber');\n});\n\nfunction clear() {\n    const times = props.member.patchedMember.details.reviewTimes.clone();\n    times.removeReview('uitpasNumber');\n    props.member.addDetailsPatch({\n        reviewTimes: times\n    })\n}\n\n</script>\n","import { ComponentWithProperties } from \"@simonbackx/vue-app-navigation\";\nimport { PermissionLevel } from \"@stamhoofd/structures\";\nimport { markRaw } from \"vue\";\nimport { MemberStepView } from \"../..\";\nimport { NavigationActions } from \"../../../types/NavigationActions\";\nimport EditMemberUitpasBox from \"../../components/edit/EditMemberUitpasBox.vue\";\nimport { EditMemberStep, MemberStepManager } from \"../MemberStepManager\";\nimport { MemberSharedStepOptions } from \"./MemberSharedStepOptions\";\n\nexport class MemberUitpasStep implements EditMemberStep {\n    options: MemberSharedStepOptions\n\n    constructor(options: MemberSharedStepOptions) {\n        this.options = options\n    }\n\n    getName(_manager: MemberStepManager) {\n        return 'UiTPAS';\n    }\n\n    isEnabled(manager: MemberStepManager) {\n        const member = manager.member\n        const details = member.patchedMember.details;\n\n        if (!member.isPropertyEnabled('uitpasNumber', {\n            checkPermissions: manager.context.user ? {\n                level: PermissionLevel.Write,\n                user: manager.context.user\n            } : undefined\n        })) {\n            return false;\n        }\n\n        if (this.options.outdatedTime) {\n            if (details.reviewTimes.isOutdated(\"uitpasNumber\", this.options.outdatedTime)) {\n                return true;\n            }\n        } else {\n            // Also ask if never answered the question\n            if (details.uitpasNumber === null && !details.reviewTimes.isReviewed(\"uitpasNumber\")) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    getComponent(manager: MemberStepManager): ComponentWithProperties {\n        return new ComponentWithProperties(MemberStepView, {\n            title: 'UiTPAS',\n            member: manager.member,\n            component: markRaw(EditMemberUitpasBox),\n            saveText: \"Doorgaan\",\n            markReviewed: ['uitpasNumber'],\n            saveHandler: async (navigate: NavigationActions) => {\n                await manager.saveHandler(this, navigate)\n            }\n        })\n    }\n}\n","import { PermissionLevel, PlatformMember, RegisterItem } from '@stamhoofd/structures';\nimport { EditMemberStep } from '../MemberStepManager';\nimport { MemberDataPermissionStep } from './MemberDataPermissionStep';\nimport { MemberEmergencyContactsStep } from './MemberEmergencyContactsStep';\nimport { MemberFinancialSupportStep } from './MemberFinancialSupportStep';\nimport { MemberGeneralStep } from './MemberGeneralStep';\nimport { MemberParentsStep } from './MemberParentsStep';\nimport { MemberRecordCategoryStep } from './MemberRecordCategoryStep';\nimport { MemberSharedStepOptions } from './MemberSharedStepOptions';\nimport { MemberUitpasStep } from './MemberUitpasStep';\n\nconst defaultOutdatedTime = 60 * 1000 * 60 * 24 * 31 * 3; // 3 months\n\nexport function getAllMemberSteps(member: PlatformMember, item: RegisterItem | null, options: MemberSharedStepOptions = { outdatedTime: defaultOutdatedTime }): EditMemberStep[] {\n    const steps = [\n        new MemberGeneralStep(options),\n        new MemberDataPermissionStep(options),\n        new MemberUitpasStep(options),\n        new MemberFinancialSupportStep(options),\n        new MemberParentsStep(options),\n        new MemberEmergencyContactsStep(options),\n    ];\n\n    // We'll skip these steps for now for administrators - unless it is a requirement for the platform/owning organization is different\n    for (const recordCategory of member.getAllRecordCategories()) {\n        if (recordCategory.checkPermissionForUserManager(PermissionLevel.Write)) {\n            steps.push(new MemberRecordCategoryStep(recordCategory, item, options));\n        }\n    }\n\n    return steps;\n}\n","<template>\n    <SaveView class=\"st-view register-item-view\" main-class=\"flex\" :loading=\"saving\" :save-text=\"isInCart ? 'Aanpassen' : 'Toevoegen'\" :save-icon=\"isInCart ? 'edit' : 'basket'\" :title=\"item.group.settings.name\" v-on=\"isInCart ? {delete: deleteMe} : {}\" @save=\"addToCart\">\n        <p class=\"style-title-prefix\">\n            {{ item.organization.name }}\n        </p>\n\n        <h1>\n            {{ item.group.settings.name }}\n\n            <span v-if=\"item.group.settings.period && item.group.type === GroupType.Membership\" class=\"title-suffix\">\n                {{ item.group.settings.period.nameShort }}\n            </span>\n        </h1>\n        <p v-for=\"registration in item.replaceRegistrations\" :key=\"registration.id\" class=\"style-description\">\n            <template v-if=\"registration.group.id !== item.group.id\">\n                Verplaatsen vanaf {{ registration.group.settings.name }}\n            </template>\n            <template v-else>\n                Bestaande inschrijving aanpassen\n            </template>\n        </p>\n\n        <template v-if=\"item.replaceRegistrations.length === 0\">\n            <ImageComponent v-if=\"item.group.settings.coverPhoto\" :image=\"item.group.settings.coverPhoto\" :auto-height=\"true\" class=\"style-cover-photo\" />\n        </template>\n\n        <p v-if=\"item.cartError\" class=\"error-box small\">\n            {{ item.cartError.getHuman() }}\n        </p>\n\n        <p v-if=\"validationWarning\" class=\"warning-box small\">\n            {{ validationWarning }}\n        </p>\n\n        <p v-if=\"item.totalPrice && contextOrganization && checkout.asOrganizationId && !checkout.isAdminFromSameOrganization\" class=\"warning-box\">\n            Je betaalt deze inschrijving in naam van {{ contextOrganization.name }}. Je moet zelf de kosten aan je leden doorrekenen indien gewenst.\n        </p>\n\n        <template v-if=\"item.replaceRegistrations.length === 0\">\n            <p v-if=\"item.group.settings.description\" class=\"style-description-block\" v-text=\"item.group.settings.description\" />\n            <p v-else class=\"style-description-block\" v-text=\"'Schrijf ' +item.member.patchedMember.firstName+ ' hier in. Voeg de inschrijving toe aan je winkelmandje en reken daarna alle inschrijvingen in één keer af.' \" />\n        </template>\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n        <div v-if=\"admin\" class=\"container\">\n            <STInputBox :title=\"$t('a1ae6e8f-dbcd-4a53-a67c-0244d28ccb74')\" error-fields=\"customStartDate\" :error-box=\"errors.errorBox\">\n                <DateSelection v-model=\"customStartDate\" :required=\"false\" :placeholder=\"formatDate(item.defaultStartDate, true)\" :min=\"item.group.settings.startDate\" :max=\"item.group.settings.endDate\" />\n            </STInputBox>\n            <p v-if=\"item.group.settings.trialDays > 0\" class=\"style-description-small\">\n                Als beheerder kan je zelf een andere startdatum kiezen voor deze inschrijving. Bijvoorbeeld om een proefperiode later te laten beginnen, of een late inschrijving vroeger te laten starten.\n            </p>\n            <p v-else class=\"style-description-small\">\n                Als beheerder kan je zelf een andere startdatum kiezen voor deze inschrijving. Bijvoorbeeld om een late inschrijving vroeger te laten starten.\n            </p>\n        </div>\n\n        <div v-if=\"item.canHaveTrial || trial\" class=\"container\">\n            <hr>\n            <h2>\n                <span>Proefperiode</span>\n                <span class=\"style-tag\">{{ Formatter.days(item.group.settings.trialDays) }}</span>\n            </h2>\n            <p>{{ item.member.patchedMember.details.firstName }} komt in aanmerking voor een proefperiode van {{ Formatter.days(item.group.settings.trialDays) }}. Je moet dan pas betalen tegen het einde van de proefperiode (via het ledenportaal). Als je de inschrijving stopzet voor afloop van de proefperiode, hoef je niets te betalen. Als je geen proefperiode wilt, kan je ook onmiddelijk inschrijven als volwaardig lid.</p>\n\n            <STList>\n                <CheckboxListItem v-model=\"trial\" label=\"Ik wil gebruik maken van de proefperiode\" description=\"Als je dit aanvinkt zal je nog niet meteen moeten betalen voor de inschrijving, maar pas bij afloop van de proefperiode.\" />\n            </STList>\n        </div>\n\n        <div v-if=\"item.getFilteredPrices().length > 1\" class=\"container\">\n            <STList>\n                <STListItem v-for=\"price in item.getFilteredPrices()\" :key=\"price.id\" :selectable=\"!price.isSoldOut(item) || admin\" :disabled=\"price.isSoldOut(item) && !admin\" element-name=\"label\" class=\"left-center\">\n                    <template #left>\n                        <Radio v-model=\"item.groupPrice\" :value=\"price\" :name=\"'groupPrice'\" :disabled=\"price.isSoldOut(item) && !admin\" />\n                    </template>\n                    <h4 class=\"style-title-list\">\n                        {{ price.name || 'Naamloos' }}\n                    </h4>\n\n                    <p v-if=\"price.getRemainingStock(item) === 0\" class=\"style-description-small\">\n                        Uitverkocht\n                    </p>\n\n                    <template #right>\n                        <span class=\"style-price-base\">{{ formatPrice(price.price.forMember(item.member)) }}</span>\n                    </template>\n                </STListItem>\n            </STList>\n        </div>\n\n        <div v-for=\"menu in item.getFilteredOptionMenus()\" :key=\"menu.id\" class=\"container\">\n            <hr>\n            <h2>{{ menu.name }}</h2>\n            <p v-if=\"menu.description\" class=\"pre-wrap style-description-block\">\n                {{ menu.description }}\n            </p>\n\n            <STList>\n                <STListItem v-for=\"option in item.getFilteredOptions(menu)\" :key=\"option.id\" :selectable=\"!option.isSoldOut(item) || admin\" :disabled=\"option.isSoldOut(item)&& !admin\" element-name=\"label\" class=\"left-center\">\n                    <template #left>\n                        <Radio v-if=\"!menu.multipleChoice\" :model-value=\"getOptionSelected(menu, option)\" :value=\"true\" :disabled=\"option.isSoldOut(item) && !admin\" @update:model-value=\"setOptionSelected(menu, option, $event)\" />\n                        <Checkbox v-else :value=\"option\" :disabled=\"option.isSoldOut(item) && !admin\" :model-value=\"getOptionSelected(menu, option)\" @update:model-value=\"setOptionSelected(menu, option, $event)\" />\n                    </template>\n                    <h4 class=\"style-title-list\">\n                        {{ option.name || 'Naamloos' }}\n                    </h4>\n                    <p v-if=\"option.allowAmount && option.price.forMember(item.member)\" class=\"style-description-small\">\n                        {{ formatPrice(option.price.forMember(item.member)) }} per stuk\n                    </p>\n\n                    <p v-if=\"option.getRemainingStock(item) && (option.maximum === null || option.getRemainingStock(item)! < option.maximum) && option.allowAmount\" class=\"style-description-small\">\n                        Nog {{ Formatter.pluralText(option.getRemainingStock(item)!, 'stuk', 'stuks') }} beschikbaar\n                    </p>\n\n                    <p v-else-if=\"option.getRemainingStock(item) === 0\" class=\"style-description-small\">\n                        Uitverkocht\n                    </p>\n\n                    <template #right>\n                        <template v-if=\"option.allowAmount\">\n                            <template v-if=\"getOptionSelected(menu, option)\">\n                                <NumberInput :model-value=\"getOptionAmount(menu, option)\" suffix=\"stuks\" suffix-singular=\"stuk\" :max=\"option.getMaximumSelection(item)\" :min=\"1\" :stepper=\"true\" @update:model-value=\"setOptionAmount(menu, option, $event)\" />\n                            </template>\n                        </template>\n                        <span v-else-if=\"option.price.forMember(item.member)\" class=\"style-price-base\">\n                            {{ formatPrice(option.price.forMember(item.member)) }}\n                        </span>\n                    </template>\n                </STListItem>\n            </STList>\n        </div>\n\n        <div v-for=\"category in categories.filter(c => c.isEnabled(item))\" :key=\"category.id\" class=\"container\">\n            <hr>\n            <FillRecordCategoryBox :category=\"category\" :value=\"item\" :validator=\"errors.validator\" :level=\"2\" :all-optional=\"false\" :force-mark-reviewed=\"true\" @patch=\"addRecordAnswersPatch\" />\n        </div>\n\n        <div class=\"pricing-box max\">\n            <PriceBreakdownBox :price-breakdown=\"item.priceBreakown\" />\n        </div>\n    </SaveView>\n</template>\n\n<script setup lang=\"ts\">\nimport { patchObject } from '@simonbackx/simple-encoding';\nimport { usePop } from '@simonbackx/vue-app-navigation';\nimport { CheckboxListItem, DateSelection, ErrorBox, ImageComponent, NavigationActions, NumberInput, PriceBreakdownBox, STList, useErrors, useNavigationActions, useOrganization } from '@stamhoofd/components';\nimport { GroupOption, GroupOptionMenu, GroupType, PatchAnswers, RegisterItem, RegisterItemOption } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed, onMounted, Ref, ref, watch } from 'vue';\nimport FillRecordCategoryBox from '../records/components/FillRecordCategoryBox.vue';\n\nconst props = defineProps<{\n    item: RegisterItem;\n    saveHandler: (newItem: RegisterItem, navigation: NavigationActions) => Promise<void> | void;\n    showGroupInformation: boolean;\n}>();\n\nconst checkout = computed(() => props.item.member.family.checkout);\nconst errors = useErrors();\nconst saving = ref(false);\nconst navigationActions = useNavigationActions();\nconst isInCart = computed(() => checkout.value.cart.contains(props.item));\nconst pop = usePop();\nconst admin = computed(() => checkout.value.isAdminFromSameOrganization);\nconst validationWarning = ref(null) as Ref<string | null>;\nconst contextOrganization = useOrganization();\n\nfunction addRecordAnswersPatch(patch: PatchAnswers) {\n    props.item.recordAnswers = patchObject(props.item.recordAnswers, patch);\n}\n\nconst categories = computed(() => {\n    return props.item.group.settings.recordCategories;\n});\n\nfunction validate() {\n    props.item.validate();\n    validationWarning.value = props.item.cartError ? null : props.item.validationWarning;\n}\n\nonMounted(() => {\n    errors.errorBox = null;\n    try {\n        validate();\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n});\n\nconst trial = computed({\n    get: () => props.item.trial,\n    set: (value: boolean) => props.item.trial = value,\n});\n\nconst customStartDate = computed({\n    get: () => props.item.customStartDate,\n    set: (value: Date | null) => props.item.customStartDate = value,\n});\n\nasync function addToCart() {\n    if (saving.value) {\n        return;\n    }\n    saving.value = true;\n    errors.errorBox = null;\n    try {\n        if (!await errors.validator.validate()) {\n            saving.value = false;\n            return;\n        }\n        validate();\n        await props.saveHandler(props.item, navigationActions);\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    saving.value = false;\n}\n\nfunction getOptionSelected(menu: GroupOptionMenu, option: GroupOption) {\n    return !!props.item.options.find(o => o.option.id === option.id);\n}\n\nfunction setOptionSelected(menu: GroupOptionMenu, option: GroupOption, selected: boolean) {\n    setOptionAmount(menu, option, selected ? Math.max(1, getOptionAmount(menu, option)) : 0);\n}\n\nfunction getOptionAmount(menu: GroupOptionMenu, option: GroupOption) {\n    return props.item.options.find(o => o.optionMenu.id === menu.id && o.option.id === option.id)?.amount ?? 0;\n}\n\nfunction setOptionAmount(menu: GroupOptionMenu, option: GroupOption, amount: number) {\n    if (!option.allowAmount && (amount !== 0 && amount !== 1)) {\n        amount = amount !== 0 ? 1 : 0;\n    }\n\n    if (amount === getOptionAmount(menu, option)) {\n        return;\n    }\n\n    let filteredOptions: RegisterItemOption[];\n\n    if (!menu.multipleChoice && amount > 0) {\n        // Clear all options from this menu\n        filteredOptions = props.item.options.filter(o => o.optionMenu.id !== menu.id);\n    }\n    else {\n        // Remove self\n        filteredOptions = props.item.options.filter(o => o.optionMenu.id !== menu.id || o.option.id !== option.id);\n    }\n\n    if (amount > 0) {\n        filteredOptions.push(\n            RegisterItemOption.create({\n                optionMenu: menu,\n                option,\n                amount,\n            }),\n        );\n    }\n\n    props.item.options = filteredOptions;\n}\n\nasync function deleteMe() {\n    props.item.checkout.cart.remove(props.item);\n    await pop({ force: true });\n}\n\nwatch(() => [props.item.groupPrice, props.item.options, props.item.trial], () => {\n    // We need to do cart level calculation, because discounts might be applied\n    const clonedCart = checkout.value.cart.clone();\n    clonedCart.remove(props.item);\n\n    const clone = props.item.clone();\n    clonedCart.add(clone);\n\n    clonedCart.calculatePrices();\n\n    props.item.calculatedPrice = clone.calculatedPrice;\n    props.item.calculatedRefund = clone.calculatedRefund;\n    props.item.calculatedPriceDueLater = clone.calculatedPriceDueLater;\n}, { deep: true });\n\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use \"@stamhoofd/scss/base/text-styles.scss\" as *;\n\n.register-item-view {\n    --st-sheet-width: 500px;\n}\n\n</style>\n","import { ComponentWithProperties } from '@simonbackx/vue-app-navigation';\nimport { RegisterItem } from '@stamhoofd/structures';\nimport { NavigationActions } from '../../../types/NavigationActions';\nimport RegisterItemView from '../../RegisterItemView.vue';\nimport { EditMemberStep, MemberStepManager } from '../MemberStepManager';\n\nexport class RegisterItemStep implements EditMemberStep {\n    item: RegisterItem;\n    showGroupInformation: boolean;\n\n    constructor(item: RegisterItem, options?: { showGroupInformation?: boolean }) {\n        this.item = item;\n        this.showGroupInformation = options?.showGroupInformation ?? false;\n    }\n\n    getName(manager: MemberStepManager) {\n        return this.item.group.settings.name;\n    }\n\n    isEnabled(_manager: MemberStepManager) {\n        return true;\n    }\n\n    getComponent(manager: MemberStepManager): ComponentWithProperties {\n        return new ComponentWithProperties(RegisterItemView, {\n            showGroupInformation: this.showGroupInformation,\n            member: manager.member,\n            item: this.item.clone(),\n            saveHandler: async (item: RegisterItem, navigate: NavigationActions) => {\n                this.item.copyFrom(item);\n                await manager.saveHandler(this, navigate);\n            },\n        });\n    }\n}\n","<template>\n    <div class=\"st-floating-footer\">\n        <div>\n            <slot />\n        </div>\n    </div>\n</template>\n\n<style lang=\"scss\">\n\n.st-floating-footer {\n    margin: 0;\n    margin-bottom: calc(-1 * var(--st-vertical-padding, 40px));\n    margin-top: auto;\n    padding-top: 15px;\n    position: sticky;\n    bottom: 0;\n\n    &.no-sticky {\n        position: static;\n    }\n    \n    >div {\n        padding: 0 var(--st-horizontal-padding, 40px);\n\n        padding-top: 15px;\n        padding-bottom: var(--st-vertical-padding, 40px);\n        --default-footer-padding: var(--st-vertical-padding, 40px);\n\n        display: flex;\n        flex-direction: column;\n        align-items: stretch;\n        overflow: hidden;\n    }\n\n    > div > * {\n        margin-top: 10px;\n\n        &:first-child {\n            margin-top: 0;\n        }\n    }\n}\n</style>\n","<template>\n    <div class=\"payconiq-banner-view\">\n        <button class=\"payconiq-close button icon close white\" type=\"button\" @click=\"close\" />\n        <h1>Scan en betaal met Payconiq by Bancontact</h1>\n\n        <div class=\"payconiq-logo\" />\n\n        <div class=\"qr-code\" :class=\"{ scanned: payment.status === 'Pending'}\">\n            <img v-if=\"payment.status === 'Pending' || payment.status === 'Created'\" :src=\"qrCodeSrc\">\n        </div>\n\n        <LoadingButton :loading=\"payment && payment.status === 'Pending'\" class=\"price-loading\">\n            <p class=\"price\">\n                {{ formatPrice(price) }}\n            </p>\n        </LoadingButton>\n\n        <p>Of scan met een ondersteunende bank app</p>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { Decoder } from '@simonbackx/simple-encoding';\nimport { Server } from '@simonbackx/simple-networking';\nimport { NavigationMixin } from '@simonbackx/vue-app-navigation';\nimport { Payment, PaymentStatus } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { Component, Mixins, Prop } from '@simonbackx/vue-app-navigation/classes';\nimport STNavigationBar from '../navigation/STNavigationBar.vue';\nimport EmailInput from '../inputs/EmailInput.vue';\nimport LoadingButton from '../navigation/LoadingButton.vue';\nimport STErrorsDefault from '../errors/STErrorsDefault.vue';\nimport STFloatingFooter from '../navigation/STFloatingFooter.vue';\nimport { CenteredMessage } from '../overlays/CenteredMessage';\n\n@Component({\n    components: {\n        STNavigationBar,\n        STFloatingFooter,\n        EmailInput,\n        LoadingButton,\n        STErrorsDefault,\n    },\n    filters: {\n        price: Formatter.price.bind(Formatter),\n    },\n})\nexport default class PayconiqBannerView extends Mixins(NavigationMixin) {\n    @Prop({})\n    paymentUrl: string;\n\n    @Prop({ required: true })\n    initialPayment!: Payment;\n\n    payment: Payment = this.initialPayment;\n\n    @Prop({ required: true })\n    server: Server;\n\n    @Prop({ required: true })\n    finishedHandler: (payment: Payment | null) => void;\n\n    pollCount = 0;\n    timer: any = null;\n\n    loading = false;\n    canceling = false;\n\n    mounted() {\n        this.timer = setTimeout(this.poll.bind(this), 3000);\n    }\n\n    close() {\n        // Try to cancel the payment in the background\n        this.dismiss();\n    }\n\n    cancel() {\n        if (this.canceling) {\n            return;\n        }\n        this.canceling = true;\n        const paymentId = this.payment.id;\n        this.server\n            .request({\n                method: 'POST',\n                path: '/payments/' + paymentId,\n                query: {\n                    cancel: true,\n                },\n                decoder: Payment as Decoder<Payment>,\n            }).catch(console.error);\n    }\n\n    async shouldNavigateAway() {\n        if (await CenteredMessage.confirm('Sluit dit alleen als je zeker bent dat je niet hebt betaald! Anders moet je gewoon even wachten.', 'Ik heb nog niet betaald')) {\n            this.cancel();\n            return true;\n        }\n        return false;\n    }\n\n    get price() {\n        return this.payment?.price ?? 0;\n    }\n\n    poll() {\n        this.timer = null;\n        const paymentId = this.payment.id;\n        this.server\n            .request({\n                method: 'POST',\n                path: '/payments/' + paymentId,\n                decoder: Payment as Decoder<Payment>,\n            }).then((response) => {\n                const payment = response.data;\n                this.payment = payment;\n\n                if (payment.status === PaymentStatus.Succeeded) {\n                    this.finishedHandler(payment);\n                    this.dismiss({ force: true });\n                }\n\n                if (payment.status === PaymentStatus.Failed) {\n                    // TODO: temporary message\n                    this.finishedHandler(payment);\n                    this.dismiss({ force: true });\n                }\n            }).catch((e) => {\n                // too: handle this\n                console.error(e);\n            }).finally(() => {\n                this.pollCount++;\n                if (this.payment.status === PaymentStatus.Succeeded || this.payment.status === PaymentStatus.Failed) {\n                    return;\n                }\n                this.timer = setTimeout(this.poll.bind(this), 3000);\n            });\n    }\n\n    beforeUnmount() {\n        if (this.timer) {\n            clearTimeout(this.timer);\n            this.timer = null;\n        }\n\n        if (this.payment.status !== PaymentStatus.Succeeded && this.payment.status !== PaymentStatus.Failed) {\n            this.finishedHandler(this.payment);\n        }\n    }\n\n    get qrCodeSrc() {\n        return 'https://portal.payconiq.com/qrcode?s=L&c=' + encodeURIComponent(this.paymentUrl);\n    }\n}\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n\n    .payconiq-banner-view {\n        padding: 40px 30px;\n        background: $color-payconiq;\n        text-align: center;\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        position: relative;\n        --st-sheet-width: 380px;\n\n        .payconiq-close {\n            color: $color-payconiq-dark-original !important;\n            position: absolute !important;\n            top: 15px;\n            right: 15px;\n        }\n\n        > h1 {\n            font-size: 25px;\n            font-weight: bold;\n            color: white;\n            line-height: 1.5;\n        }\n\n        .payconiq-logo {\n            width: 150px;\n            height: 150px;\n            background: url(@stamhoofd/assets/images/partners/payconiq/app-shadow.svg) no-repeat center center;\n            background-size: contain;\n        }\n\n        .qr-code {\n            overflow: hidden;\n            width: 250px;\n            height: 250px;\n            background: white;\n            border-radius: 5px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n\n            img {\n                width: 240px;\n                height: 240px;\n                transition: opacity 0.2s;\n            }\n            margin-bottom: 20px;\n\n            &.scanned {\n                img {\n                    opacity: 0.5;\n                }\n            }\n        }\n\n        p {\n            color: $color-payconiq-dark-original;\n            font-size: 16px;\n            font-weight: 500;\n        }\n\n        .install {\n            margin-bottom: 15px;;\n        }\n\n        .price-loading {\n            --color-primary: white;\n        }\n\n        .price {\n            color: white;\n            font-size: 25px;\n            font-weight: bold;\n            margin: 20px 0;\n        }\n    }\n</style>\n","<template>\n    <div class=\"st-view payconiq-button-view\">\n        <STNavigationBar title=\"Payconiq by Bancontact\" />\n\n        <main>\n            <h1>Betaal met Payconiq by Bancontact</h1>\n            <p class=\"style-description\">\n                Je hebt één van volgende apps nodig om te kunnen betalen: Payconiq by Bancontact, KBC Mobile, ING Banking, Belfius, BNP Paribas Fortis, Fintro, Hello Bank!, Argenta of Crelan.\n            </p>\n            <p class=\"style-description\">\n                Klik op de volgende pagina op 'Kies een andere app' als je met een andere app dan Payconiq by Bancontact wilt betalen.\n            </p>\n        </main>\n\n        <STToolbar>\n            <template #right>\n                <button class=\"button secundary\" type=\"button\" @click=\"helpMe\">\n                    <span class=\"icon help\" />\n                    <span>Het lukt niet</span>\n                </button>\n                <LoadingButton :loading=\"payment && payment.status === 'Pending'\">\n                    <a :href=\"paymentUrl\" class=\"button primary open-app\">\n                        <span class=\"icon external\" /><span>Open de app</span>\n                    </a>\n                </LoadingButton>\n            </template>\n        </STToolbar>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { CenteredMessage, EmailInput, LoadingButton, STErrorsDefault, STNavigationBar, STToolbar } from '@stamhoofd/components';\nimport { Component, Prop, Mixins } from '@simonbackx/vue-app-navigation/classes';\n\nimport PayconiqBannerView from './PayconiqBannerView.vue';\n\n@Component({\n    components: {\n        STNavigationBar,\n        STToolbar,\n        EmailInput,\n        LoadingButton,\n        STErrorsDefault,\n    },\n})\nexport default class PayconiqButtonView extends Mixins(PayconiqBannerView) {\n    @Prop({})\n    paymentUrl: string;\n\n    getOS(): string {\n        var userAgent = navigator.userAgent || navigator.vendor;\n\n        if (/android/i.test(userAgent)) {\n            return 'android';\n        }\n\n        if (/Mac OS X 10_14|Mac OS X 10_13|Mac OS X 10_12|Mac OS X 10_11|Mac OS X 10_10|Mac OS X 10_9/.test(userAgent)) {\n            // Different sms protocol\n            return 'macOS-old';\n        }\n\n        // iOS detection from: http://stackoverflow.com/a/9039885/177710\n        if (/iPad|iPhone|iPod/.test(userAgent) && !(window as any).MSStream) {\n            return 'iOS';\n        }\n\n        // iPad on iOS 13 detection\n        if (navigator.userAgent.includes('Mac') && 'ontouchend' in document) {\n            return 'iOS';\n        }\n\n        if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) {\n            return 'macOS';\n        }\n\n        if (navigator.platform.toUpperCase().indexOf('WIN') >= 0) {\n            return 'windows';\n        }\n\n        if (navigator.platform.toUpperCase().indexOf('IPHONE') >= 0) {\n            return 'iOS';\n        }\n\n        if (navigator.platform.toUpperCase().indexOf('ANDROID') >= 0) {\n            return 'android';\n        }\n\n        return 'unknown';\n    }\n\n    get isIOS() {\n        return this.getOS() === 'iOS';\n    }\n\n    helpMe() {\n        if (this.getOS() === 'iOS') {\n            new CenteredMessage('Het lukt niet', \"Kijk na of je één van de apps bovenaan deze pagina hebt geïnstalleerd. Als je op een pagina terecht komt die zegt dat je de app niet hebt: sleep die pagina naar beneden tot er een grijze balk tevoorschijn komt, klik daar op 'Open'. Probeer eventueel opnieuw op een computer of selecteer een andere betaalmethode.\")\n                .addCloseButton()\n                .show();\n        }\n        else {\n            new CenteredMessage('Het lukt niet', 'Kijk na of je één van de apps bovenaan deze pagina hebt geïnstalleerd. Probeer eventueel opnieuw op een computer (daar kan je de QR-code scannen) of selecteer een andere betaalmethode.').addCloseButton().show();\n        }\n    }\n}\n</script>\n\n<style lang=\"scss\">\n.payconiq-button-view {\n    --color-primary: #FF4785;\n\n    .payment-app-logo {\n        height: 28px;\n    }\n\n    .open-app {\n        // Prevent opening in a new tab -> breaks opening\n        -webkit-touch-callout: none;\n    }\n}\n\n</style>\n","export default \"__VITE_ASSET__Nzy7ZKRO__\"","export default \"__VITE_ASSET__vrcOTtLT__\"","export default \"data:image/svg+xml,%3csvg%20width='240'%20height='240'%20viewBox='0%200%20240%20240'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='240'%20height='240'%20rx='50'%20fill='%2300AEEF'/%3e%3cg%20clip-path='url(%23clip0)'%3e%3cpath%20d='M120.446%20103.736C134.105%20103.736%20145.176%2092.6649%20145.176%2079.0071C145.176%2065.3501%20134.105%2054.2776%20120.446%2054.2776C106.787%2054.2776%2095.7144%2065.3501%2095.7144%2079.0071C95.7144%2092.6649%20106.787%20103.736%20120.446%20103.736'%20fill='white'/%3e%3cpath%20d='M138.687%2099.0154C133.975%20104.123%20125.666%20109.232%20115.005%20109.232C106.734%20109.232%2099.611%20106.017%2095.0811%20102.444C68.0807%20105.277%2048%20109.292%2048%20109.292V120.226L191.241%20120.211V97.6692C191.241%2097.6692%20166.697%2097.5176%20138.687%2099.0154Z'%20fill='white'/%3e%3cpath%20d='M65.0163%20152.194V165.514H48V130.075H65.0163V146.022H65.1151L75.129%20130.075H95.5316L80.5919%20148.389L94.6877%20165.514H75.2183L65.133%20152.194H65.0163Z'%20fill='white'/%3e%3cpath%20d='M191.241%20164.05C187.224%20165.276%20181.947%20166%20177.224%20166C160.39%20166%20148.031%20161.215%20148.031%20147.299C148.031%20134.723%20160.011%20129.259%20176.386%20129.259C180.937%20129.259%20186.719%20129.762%20191.241%20131.205L191.234%20143.386C187.884%20141.357%20184.532%20140.092%20179.732%20140.092C173.486%20140.092%20167.244%20143.167%20167.244%20147.632C167.244%20152.107%20173.459%20155.173%20179.732%20155.173C184.455%20155.173%20187.884%20153.865%20191.234%20151.929L191.241%20164.05'%20fill='white'/%3e%3cpath%20d='M115.334%20145.093H123.809C127.085%20145.093%20128.367%20143.767%20128.367%20141.732C128.367%20139.4%20127.073%20138.235%20124.045%20138.235H115.333L115.334%20145.093ZM115.334%20158.309H124.206C127.531%20158.309%20128.664%20156.932%20128.664%20154.897C128.664%20152.863%20127.519%20151.401%20124.243%20151.401H115.333L115.334%20158.309ZM98.3184%20130.075H132.715C141.65%20130.075%20144.578%20133.549%20144.578%20138.958C144.578%20145.013%20139.167%20147.644%20133.609%20147.942V148.041C139.316%20148.489%20144.876%20149.133%20144.876%20156.281C144.876%20160.947%20141.947%20165.514%20132.119%20165.514H98.3184V130.075Z'%20fill='white'/%3e%3c/g%3e%3cdefs%3e%3cclipPath%20id='clip0'%3e%3crect%20width='143.889'%20height='112'%20fill='white'%20transform='translate(48%2054)'/%3e%3c/clipPath%3e%3c/defs%3e%3c/svg%3e\"","export default \"__VITE_ASSET__Cj8bu8V7__\"","export default \"data:image/svg+xml,%3csvg%20width='240'%20height='240'%20viewBox='0%200%20240%20240'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M119.913%200.0176704C95.0104%200.0176704%2070.0643%200.157952%2045.1621%200.421144C17.7583%200.701882%200.24689%2019.213%200.141559%2046.6991C-0.0427719%2095.7318%20-0.0515495%20144.896%200.141559%20193.99C0.255668%20222.257%2017.9777%20239.672%2046.3559%20239.794C76.5598%20239.935%20106.72%20239.865%20136.862%20239.865C168.049%20239.865%20199.306%20239.602%20230.511%20239.996C237.753%20240.093%20240.035%20238.303%20240%20230.784C239.692%20169.382%20239.947%20108.014%20239.736%2046.6377C239.736%2019.1166%20222.207%200.68448%20194.847%200.403741C169.84%200.149322%20145.043%200%20120.027%200L119.913%200.0176704ZM120.044%2069.6497C135.115%2069.6497%20150.143%2069.6934%20165.196%2069.7811C178.732%2069.8601%20184.604%2075.1414%20184.7%2086.406C184.806%2097.6531%20177.924%20103.707%20164.529%20103.83C149.485%20103.961%20134.413%20103.83%20119.386%20103.83H119.324C104.613%20103.83%2089.8667%20103.935%2075.1641%20103.759C62.4102%20103.593%2055.7831%2097.5918%2055.7216%2086.7308C55.6602%2075.4135%2061.5763%2069.86%2074.8306%2069.7723C89.8843%2069.6845%20104.973%2069.6497%20120.044%2069.6497ZM119.913%20136.009C135.177%20136.009%20150.415%20136%20165.679%20136.079C177.889%20136.141%20184.595%20142.826%20184.384%20153.906C184.191%20164.416%20177.845%20170.286%20165.679%20170.461C150.275%20170.68%20134.808%20170.531%20119.377%20170.531H119.316C104.245%20170.531%2089.1558%20170.689%2074.0846%20170.461C61.8924%20170.277%2055.5636%20164.407%2055.3793%20153.836C55.1774%20142.747%2061.8923%20136.132%2074.1459%20136.079C89.4102%20136.009%20104.648%20136.009%20119.913%20136.009Z'%20fill='%23AA0024'/%3e%3c/svg%3e\"","export default \"__VITE_ASSET__BcOf9g$m__\"","export default \"__VITE_ASSET__DC0n4F6t__\"","export default \"__VITE_ASSET__BIO5D2i8__\"","<template>\n    <div class=\"st-view\">\n        <STNavigationBar title=\"Overschrijven\" :disable-pop=\"true\" :disable-dismiss=\"!isPopup\" />\n\n        <main>\n            <h1 v-if=\"created && type === 'order'\">\n                Bestelling geplaatst! Schrijf nu over.\n            </h1>\n            <h1 v-else-if=\"created\">\n                Gelukt! Schrijf nu het bedrag over\n            </h1>\n            <h1 v-else-if=\"payment.price < 0\">\n                Terugbetaling via overschrijving\n            </h1>\n            <h1 v-else>\n                Bedrag overschrijven\n            </h1>\n\n            <p v-if=\"payment.price > 0 && payment.status !== 'Succeeded'\">\n                <template v-if=\"payment.transferSettings?.infoDescription\">\n                    {{ payment.transferSettings.infoDescription }}\n                </template>\n                <template v-else-if=\"created\">\n                    Voer de overschrijving meteen uit. Vermeld zeker “{{ formattedTransferDescription }}” in je overschrijving.\n                </template>\n                <template v-else>\n                    We kijken de betaalstatus van jouw overschrijving manueel na. Het kan dus even duren voor je hier ziet staan dat we de betaling hebben ontvangen. Vermeld zeker “{{ transferDescription }}” in je overschrijving.\n                </template>\n            </p>\n            <p v-else-if=\"payment.price < 0 && payment.status !== 'Succeeded' && !created\">\n                Je ontvangt dit bedrag binnenkort terug op jouw rekening.\n            </p>\n            <p v-else-if=\"payment.price < 0 && payment.status === 'Succeeded'\" class=\"success-box\">\n                We hebben dit bedrag terug op jouw rekening gestort.\n            </p>\n\n            <div class=\"payment-split\">\n                <div class=\"rectangle\">\n                    <div v-if=\"payment.price > 0\" class=\"rectangle-top hide-smartphone\">\n                        Typ het over\n                    </div>\n                    <table class=\"payment-transfer-table rectangle\">\n                        <tbody>\n                            <tr>\n                                <td>Bedrag</td>\n                                <td v-tooltip=\"'Klik om te kopiëren'\" v-copyable=\"payment.price/100\" class=\"style-copyable\">\n                                    {{ formatPrice(payment.price) }}\n                                </td>\n                            </tr>\n                            <tr v-if=\"payment.price > 0\">\n                                <td>Begunstigde</td>\n                                <td v-tooltip=\"'Klik om te kopiëren'\" v-copyable=\"creditor\" class=\"style-copyable\">\n                                    {{ creditor }}\n                                </td>\n                            </tr>\n                            <tr v-if=\"payment.price > 0\">\n                                <td>Rekeningnummer</td>\n                                <td v-tooltip=\"'Klik om te kopiëren'\" v-copyable=\"iban\" class=\"style-copyable\">\n                                    {{ iban }}\n                                </td>\n                            </tr>\n                            <tr v-if=\"payment.price > 0\">\n                                <td v-if=\"isStructured && isBelgium\">\n                                    Mededeling\n                                </td>\n                                <td v-else-if=\"isStructured\">\n                                    Betalingskenmerk\n                                </td>\n                                <td v-else>\n                                    Mededeling\n                                </td>\n                                <td v-tooltip=\"'Klik om te kopiëren'\" v-copyable=\"transferDescription\" class=\"style-copyable\">\n                                    {{ formattedTransferDescription }}\n                                </td>\n                            </tr>\n                        </tbody>\n                    </table>\n                </div>\n                <div v-if=\"payment.price > 0\" class=\"hide-smartphone rectangle\">\n                    <div class=\"rectangle-top\">\n                        Kopieer in app\n                    </div>\n                    <div class=\"rectangle-bottom\">\n                        <img v-if=\"isBelgium\" src=\"@stamhoofd/assets/images/partners/scan-apps-belgium.svg\">\n                        <img v-else src=\"@stamhoofd/assets/images/partners/scan-apps-nl.svg\">\n                    </div>\n                    <img v-if=\"QRCodeUrl\" :src=\"QRCodeUrl\" width=\"228\" height=\"228\">\n                </div>\n            </div>\n\n            <div v-if=\"false && isBelgium && getOS() === 'iOS' && payment.price > 0 && payment.status !== 'Succeeded'\" class=\"only-smartphone container\">\n                <hr>\n                <h2>Snel app openen</h2>\n                <p>Je moet niet noodzakelijk overschrijven via een app of één van deze apps. Dit is puur voor het gemak, het gaat hier om een gewone overschrijving.</p>\n\n                <STList>\n                    <STListItem element-name=\"a\" :href=\"'com.kbc.mobilesignqrcode://'+qrMessage\">\n                        <template #left>\n                            <img class=\"payment-app-logo\" src=\"@stamhoofd/assets/images/partners/kbc/app.svg\">\n                        </template>\n                        <h3 class=\"style-title-list\">\n                            KBC Mobile\n                        </h3>\n                        <p class=\"style-description\">\n                            Gegevens worden automatisch ingevuld\n                        </p>\n                    </STListItem>\n\n                    <STListItem element-name=\"a\" :href=\"'bepingib://'\">\n                        <template #left>\n                            <img class=\"payment-app-logo\" src=\"@stamhoofd/assets/images/partners/ing/app.svg\">\n                        </template>\n                        <h3 class=\"style-title-list\">\n                            ING Banking\n                        </h3>\n                        <p class=\"style-description\">\n                            Kopieer zelf manueel de gegevens bovenaan\n                        </p>\n                    </STListItem>\n\n                    <STListItem element-name=\"a\" :href=\"'BEPbelfius://'\">\n                        <template #left>\n                            <img class=\"payment-app-logo\" src=\"@stamhoofd/assets/images/partners/belfius/app.svg\">\n                        </template>\n                        <h3 class=\"style-title-list\">\n                            Belfius Mobile\n                        </h3>\n                        <p class=\"style-description\">\n                            Kopieer zelf manueel de gegevens bovenaan\n                        </p>\n                    </STListItem>\n\n                    <STListItem element-name=\"a\" :href=\"'easybanking://'\">\n                        <template #left>\n                            <img class=\"payment-app-logo\" src=\"@stamhoofd/assets/images/partners/bnp/app.png\">\n                        </template>\n                        <h3 class=\"style-title-list\">\n                            Easy Banking App (BNP Paribas Fortis)\n                        </h3>\n                        <p class=\"style-description\">\n                            Kopieer zelf manueel de gegevens bovenaan\n                        </p>\n                    </STListItem>\n\n                    <STListItem element-name=\"a\" :href=\"'BEPargenta://'\">\n                        <template #left>\n                            <img class=\"payment-app-logo\" src=\"@stamhoofd/assets/images/partners/argenta/app.png\">\n                        </template>\n                        <h3 class=\"style-title-list\">\n                            Argenta-app\n                        </h3>\n                        <p class=\"style-description\">\n                            Kopieer zelf manueel de gegevens bovenaan\n                        </p>\n                    </STListItem>\n\n                    <STListItem element-name=\"a\" :href=\"'HBApp://'\">\n                        <template #left>\n                            <img class=\"payment-app-logo\" src=\"@stamhoofd/assets/images/partners/hello-bank/app.png\">\n                        </template>\n                        <h3 class=\"style-title-list\">\n                            Hello Bank! app\n                        </h3>\n                        <p class=\"style-description\">\n                            Kopieer zelf manueel de gegevens bovenaan\n                        </p>\n                    </STListItem>\n                </STList>\n\n                <p class=\"style-description\">\n                    Of open zelf een andere app. Je kan de gegevens makkelijk kopiëren hierboven door erop te klikken.\n                </p>\n            </div>\n\n            <p v-if=\"payment.price > 0 && payment.status === 'Succeeded'\" class=\"success-box\">\n                We hebben de betaling ontvangen.\n            </p>\n            <template v-else-if=\"payment.price > 0 && created\">\n                <p v-if=\"isBelgium\" class=\"hide-smartphone info-box\">\n                    <span>*De QR-code kan je enkel scannen met een beperkt aantal bankapps, niet met je ingebouwde QR-scanner en ook niet met Payconiq/Bancontact. De QR-code scannen is optioneel, voer de overschrijving gewoon uit zonder QR-code als het niet lukt (dat is net hetzelfde). Dit is een overschrijving, niet te verwarren met een online betaling. <a class=\"inline-link\" :href=\"$domains.getDocs('betalen-qr-code')\" target=\"_blank\">Meer info</a></span>\n                </p>\n                <p v-else class=\"hide-smartphone info-box\">\n                    De QR-code scannen is optioneel, voer de overschrijving gewoon uit zonder QR-code als het niet lukt (dat is net hetzelfde). De QR-code kan je enkel scannen met een beperkt aantal bankapps, niet met je ingebouwde QR-scanner.\n                </p>\n            </template>\n        </main>\n\n        <STToolbar v-if=\"!isPopup\">\n            <template #right>\n                <button v-if=\"payment.price > 0 && payment.status !== 'Succeeded'\" class=\"button secundary hide-smartphone\" type=\"button\" @click=\"helpMe\">\n                    <span class=\"icon help\" />\n                    <span>Het lukt niet</span>\n                </button>\n                <button class=\"button primary\" type=\"button\" @click=\"goNext\">\n                    <span>Doorgaan</span>\n                    <span class=\"icon arrow-right\" />\n                </button>\n            </template>\n        </STToolbar>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useCanDismiss, useDismiss, usePop } from '@simonbackx/vue-app-navigation';\nimport { NavigationActions } from '@stamhoofd/components';\nimport { Country, Organization, Payment, TransferDescriptionType, TransferSettings } from '@stamhoofd/structures';\n\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue';\nimport STList from '../layout/STList.vue';\nimport STListItem from '../layout/STListItem.vue';\nimport STNavigationBar from '../navigation/STNavigationBar.vue';\nimport STToolbar from '../navigation/STToolbar.vue';\nimport { CenteredMessage } from '../overlays/CenteredMessage';\nimport { useNavigationActions } from '../types/NavigationActions';\n\nconst props = withDefaults(defineProps<{\n    payment: Payment;\n    created?: boolean;\n    type: 'registration' | 'order';\n    organization: Organization;\n    settings?: TransferSettings | null;\n    isPopup?: boolean;\n    finishedHandler?: ((payment: Payment | null, navigate: NavigationActions) => void) | null;\n}>(), {\n    created: false,\n    settings: null,\n    isPopup: false,\n    finishedHandler: null,\n});\n\nconst QRCodeUrl = ref<string | null>(null);\nconst canDismiss = useCanDismiss();\nconst dismiss = useDismiss();\nconst pop = usePop();\nconst $t = useTranslate();\nconst navigate = useNavigationActions();\n\nonMounted(() => {\n    generateQRCode().catch(e => console.error(e));\n    setLeave();\n});\n\nfunction getOS(): string {\n    var userAgent = navigator.userAgent || navigator.vendor;\n\n    if (/android/i.test(userAgent)) {\n        return 'android';\n    }\n\n    if (/Mac OS X 10_14|Mac OS X 10_13|Mac OS X 10_12|Mac OS X 10_11|Mac OS X 10_10|Mac OS X 10_9/.test(userAgent)) {\n        // Different sms protocol\n        return 'macOS-old';\n    }\n\n    // iOS detection from: http://stackoverflow.com/a/9039885/177710\n    if (/iPad|iPhone|iPod/.test(userAgent) && !(window as any).MSStream) {\n        return 'iOS';\n    }\n\n    // iPad on iOS 13 detection\n    if (navigator.userAgent.includes('Mac') && 'ontouchend' in document) {\n        return 'iOS';\n    }\n\n    if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) {\n        return 'macOS';\n    }\n\n    if (navigator.platform.toUpperCase().indexOf('WIN') >= 0) {\n        return 'windows';\n    }\n\n    if (navigator.platform.toUpperCase().indexOf('IPHONE') >= 0) {\n        return 'iOS';\n    }\n\n    if (navigator.platform.toUpperCase().indexOf('ANDROID') >= 0) {\n        return 'android';\n    }\n\n    return 'unknown';\n}\n\nconst preventLeave = (event: BeforeUnloadEvent) => {\n    // Cancel the event\n    event.preventDefault(); // If you prevent default behavior in Mozilla Firefox prompt will always be shown\n\n    if (props.type === 'registration') {\n        // Chrome requires returnValue to be set\n        event.returnValue = 'Jouw inschrijving is al bevestigd! Je kan niet meer van betaalmethode veranderen.';\n\n        // This message is not visible on most browsers\n        return 'Jouw inschrijving is al bevestigd! Je kan niet meer van betaalmethode veranderen.';\n    }\n    // Chrome requires returnValue to be set\n    event.returnValue = 'Jouw bestelling is al geplaatst! Als je je bestelling gaat aanpassen zal je een tweede bestelling plaatsen!';\n\n    // This message is not visible on most browsers\n    return 'Jouw bestelling is al geplaatst! Als je je bestelling gaat aanpassen zal je een tweede bestelling plaatsen!';\n};\n\nonBeforeUnmount(() => {\n    window.removeEventListener('beforeunload', preventLeave);\n});\n\nfunction setLeave() {\n    if (!props.created) {\n        return;\n    }\n    window.addEventListener('beforeunload', preventLeave);\n}\n\nfunction shouldNavigateAway() {\n    if (!props.created) {\n        return true;\n    }\n    return false;\n}\n\nconst isBelgium = computed(() => props.organization.address.country === Country.Belgium);\nconst isStructured = computed(() => props.settings?.type === TransferDescriptionType.Structured);\nconst iban = computed(() => props.settings?.iban ?? props.organization.meta.transferSettings.iban ?? '');\nconst creditor = computed(() => props.settings?.creditor ?? props.organization.name);\nconst transferDescription = computed(() => props.payment.transferDescription);\nconst formattedTransferDescription = computed(() => {\n    if (isStructured.value && !isBelgium.value && transferDescription.value) {\n        return transferDescription.value.match(/.{1,4}/g)?.join(' ') ?? transferDescription.value;\n    }\n    return transferDescription.value;\n});\n\nconst qrMessage = computed(() => {\n    const ibanValue = iban.value;\n    const creditorValue = creditor.value;\n\n    // BUG in Fortis app -> need to fill in at least one character for the BIC/SWIFT field, otherwise it won't work\n    const bic = '_';\n\n    // Note: structured reference still as normal description (the structured reference ISO is not supported)\n    return 'BCD\\n001\\n1\\nSCT\\n' + bic + '\\n' + creditorValue + '\\n' + ibanValue + '\\nEUR' + (props.payment.price / 100).toFixed(2) + '\\n\\n\\n' + transferDescription.value?.substring(0, 140) + '\\nhttps://' + $t('ccfc0566-2fc4-4c0a-b1da-c3059cad6586') + '/docs/betalen-qr-code';\n});\n\nasync function generateQRCode() {\n    try {\n        const QRCode = (await import(/* webpackChunkName: \"QRCode\" */ 'qrcode')).default;\n        QRCodeUrl.value = await QRCode.toDataURL(qrMessage.value);\n    }\n    catch (e) {\n        console.error(e);\n        return;\n    }\n}\n\nfunction helpMe() {\n    if (props.type === 'order') {\n        new CenteredMessage('Het lukt niet', 'Jouw bestelling is al geplaatst, probeer dus zeker niet opnieuw! Als het scannen niet lukt, kan je gewoon de overschrijving manueel uitvoeren via de vermelde gegevens. Het scannen van de QR-code is niet noodzakelijk, en werkt niet in elke bankapp. Dit is niet te verwarren met een online betaling, de QR-code neemt enkel de gegevens over in je app zodat je sneller zonder typefouten kan overschrijven.').addCloseButton().show();\n    }\n    else {\n        new CenteredMessage('Het lukt niet', 'Jouw inschrijving is al in orde, probeer dus zeker niet opnieuw! Als het scannen niet lukt, kan je gewoon de overschrijving manueel uitvoeren via de vermelde gegevens. Het scannen van de QR-code is niet noodzakelijk, en werkt niet in elke bankapp. Dit is niet te verwarren met een online betaling, de QR-code neemt enkel de gegevens over in je app zodat je sneller zonder typefouten kan overschrijven.').addCloseButton().show();\n    }\n}\n\nfunction goNext() {\n    if (props.finishedHandler) {\n        props.finishedHandler(props.payment, navigate);\n        return;\n    }\n\n    if (canDismiss.value) {\n        dismiss({ force: true })?.catch(console.error);\n        return;\n    }\n    pop({ force: true })?.catch(console.error);\n}\n\ndefineExpose({\n    shouldNavigateAway,\n});\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use \"@stamhoofd/scss/base/text-styles.scss\" as *;\n\n.payment-split {\n    display: flex;\n    flex-direction: row;\n    padding: 15px 0;\n\n    @media (max-width: 800px) {\n        padding: 0;\n        flex-direction: column;\n    }\n\n    > .rectangle {\n        border: 2px solid $color-border;\n        border-radius: 8px;\n        padding: 20px;\n        position: relative;\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n        justify-content: center;\n\n        > table {\n            align-self: flex-start;\n            margin-left: 10px;\n\n            @media (max-width: 800px) {\n                margin-left: 0px;\n            }\n        }\n\n        @media (max-width: 800px) {\n            padding: 0;\n            border: 0;\n        }\n\n        >.rectangle-top {\n            position: absolute;\n            top: 0;\n            transform: translate(-50%, -50%);\n            background: $color-background;\n            text-align: center;\n            left: 50%;\n            max-width: 90%;\n            padding: 0 15px;\n            box-sizing: border-box;\n            line-height: 1.4;\n\n            @extend .style-interactive-small;\n            overflow: hidden;\n            white-space: nowrap;\n            text-overflow: ellipsis;\n        }\n\n        >.rectangle-bottom {\n            position: absolute;\n            bottom: 0;\n            transform: translate(-50%, 50%);\n            background: $color-background;\n            text-align: center;\n            left: 50%;\n            max-width: 90%;\n            padding: 0 15px;\n            box-sizing: border-box;\n\n            @extend .style-interactive-small;\n            overflow: hidden;\n            white-space: nowrap;\n            text-overflow: ellipsis;\n        }\n\n        &:first-child {\n            flex-grow: 1;\n            margin-right: 15px;;\n            padding: 15px 15px;\n\n            @media (max-width: 800px) {\n                margin-right: 0px;\n                margin-bottom: 30px;\n                padding: 0;\n            }\n        }\n    }\n\n    @media (max-width: 800px) {\n        .hide-smartphone {\n            display: none;\n        }\n    }\n}\n.payment-transfer-table {\n    td {\n        vertical-align: baseline;\n        touch-action: manipulation;\n        cursor: pointer;\n\n        &:focus {\n            color: $color-primary;\n            outline: none;\n        }\n    }\n    td:first-child {\n        @extend .style-title-small;\n        padding: 7px 15px 7px 0;\n        white-space: nowrap;\n\n        @media (max-width: 400px) {\n            font-size: 12px;\n        }\n    }\n\n    td:last-child {\n        @extend .style-description;\n\n        @media (max-width: 400px) {\n            font-size: 12px;\n        }\n    }\n}\n.payment-app-logo {\n    height: 35px;\n}\n</style>\n","import { Server } from '@simonbackx/simple-networking';\nimport { ComponentWithProperties } from '@simonbackx/vue-app-navigation';\nimport { Organization, Payment, PaymentMethod, PaymentProvider, PaymentStatus, TransferSettings } from '@stamhoofd/structures';\n\nimport { NavigationActions } from '../types/NavigationActions';\nimport PayconiqBannerView from './PayconiqBannerView.vue';\nimport PayconiqButtonView from './PayconiqButtonView.vue';\nimport TransferPaymentView from './TransferPaymentView.vue';\nimport { GlobalEventBus } from '../EventBus';\n\nexport class PaymentHandler {\n    static getOS(): string {\n        const userAgent = navigator.userAgent || navigator.vendor;\n\n        if (/android/i.test(userAgent)) {\n            return 'android';\n        }\n\n        if (/Mac OS X 10_14|Mac OS X 10_13|Mac OS X 10_12|Mac OS X 10_11|Mac OS X 10_10|Mac OS X 10_9/.test(userAgent)) {\n            // Different sms protocol\n            return 'macOS-old';\n        }\n\n        // iOS detection from: http://stackoverflow.com/a/9039885/177710\n        if (/iPad|iPhone|iPod/.test(userAgent) && !(window as any).MSStream) {\n            return 'iOS';\n        }\n\n        // iPad on iOS 13 detection\n        if (navigator.userAgent.includes('Mac') && 'ontouchend' in document) {\n            return 'iOS';\n        }\n\n        if (navigator.platform.toUpperCase().includes('MAC')) {\n            return 'macOS';\n        }\n\n        if (navigator.platform.toUpperCase().includes('WIN')) {\n            return 'windows';\n        }\n\n        if (navigator.platform.toUpperCase().includes('IPHONE')) {\n            return 'iOS';\n        }\n\n        if (navigator.platform.toUpperCase().includes('ANDROID')) {\n            return 'android';\n        }\n\n        return 'unknown';\n    }\n\n    static async handlePayment(\n        settings: {\n            server: Server;\n            organization: Organization;\n            payment: Payment;\n            paymentUrl: string | null;\n            transferSettings: TransferSettings | null;\n            navigate: NavigationActions;\n            type: 'order' | 'registration';\n        },\n        successHandler: (payment: Payment, navigate: NavigationActions) => void | Promise<void>,\n        failedHandler: (payment: Payment | null) => void | Promise<void>,\n        transferHandler?: (payment: Payment | null) => void | Promise<void>,\n    ) {\n        const { payment, organization, server, navigate, paymentUrl, transferSettings } = settings;\n        GlobalEventBus.sendEvent('paymentPatch', payment).catch(console.error);\n\n        if (payment.method == PaymentMethod.PointOfSale) {\n            successHandler(payment, navigate)?.catch(console.error);\n        }\n        else if (payment.method == PaymentMethod.Transfer) {\n            if (transferHandler) {\n                transferHandler(payment)?.catch(console.error);\n            }\n\n            await navigate.show(new ComponentWithProperties(TransferPaymentView, {\n                created: true,\n                type: settings.type,\n                organization,\n                payment,\n                settings: transferSettings,\n                finishedHandler: (payment: Payment, navigate: NavigationActions) => {\n                    // Always go to success\n                    successHandler(payment, navigate)?.catch(console.error);\n                },\n            }));\n        }\n        else if (payment.provider == PaymentProvider.Payconiq && paymentUrl) {\n            if (this.getOS() == 'android' || this.getOS() == 'iOS') {\n                // we need this view for polling\n                const buttonComponent = new ComponentWithProperties(PayconiqButtonView, {\n                    paymentUrl,\n                    server,\n                    initialPayment: payment,\n                    finishedHandler: (payment: Payment | null) => {\n                        GlobalEventBus.sendEvent('paymentPatch', payment).catch(console.error);\n                        if (payment && payment.status == PaymentStatus.Succeeded) {\n                            successHandler(payment, navigate)?.catch(console.error); // use component because payconiq closed itself + was a sheet\n                        }\n                        else {\n                            failedHandler(payment)?.catch(console.error);\n                        }\n                    },\n                }).setDisplayStyle('sheet');\n                await navigate.present(buttonComponent);\n                return;\n            }\n            else {\n                // We need to remove the checkout search params to make the QR-code work.\n                const u = new URL(paymentUrl);\n                u.searchParams.delete('token');\n                u.searchParams.delete('returnUrl');\n                const url = u.toString();\n\n                // only on desktop\n                const bannerComponent = new ComponentWithProperties(PayconiqBannerView, {\n                    paymentUrl: url,\n                    server,\n                    initialPayment: payment,\n                    finishedHandler: (payment: Payment | null) => {\n                        GlobalEventBus.sendEvent('paymentPatch', payment).catch(console.error);\n                        if (payment && payment.status == PaymentStatus.Succeeded) {\n                            successHandler(payment, navigate)?.catch(console.error); // use component because payconiq closed itself + was a sheet\n                        }\n                        else {\n                            failedHandler(payment)?.catch(console.error);\n                        }\n                    },\n                }).setDisplayStyle('sheet');\n                await navigate.present(bannerComponent);\n                return;\n            }\n        }\n        else {\n            if (paymentUrl) {\n                window.location.href = paymentUrl;\n            }\n        }\n    }\n}\n","import { ComponentWithProperties } from '@simonbackx/vue-app-navigation';\nimport { RegisterCheckout } from '@stamhoofd/structures';\nimport { NavigationActions } from '../../../types/NavigationActions';\nimport FreeContributionView from '../FreeContributionView.vue';\nimport { ViewStep, ViewStepsManager } from '../../classes/ViewStepsManager';\n\nexport class FreeContributionStep implements ViewStep {\n    checkout: RegisterCheckout;\n\n    constructor(checkout: RegisterCheckout) {\n        this.checkout = checkout;\n    }\n\n    isEnabled(_manager: ViewStepsManager) {\n        if (!this.checkout.singleOrganization?.meta.recordsConfiguration.freeContribution) {\n            return false;\n        }\n\n        if (this.checkout.asOrganizationId) {\n            return false;\n        }\n\n        return true;\n    }\n\n    getComponent(manager: ViewStepsManager): ComponentWithProperties {\n        return new ComponentWithProperties(FreeContributionView, {\n            checkout: this.checkout,\n            saveHandler: async (navigate: NavigationActions) => {\n                await manager.saveHandler(this, navigate);\n            },\n        });\n    }\n}\n","<template>\n    <SaveView title=\"Jouw gegevens\" :loading=\"loading\" save-icon-right=\"arrow-right\" save-text=\"Doorgaan\" data-submit-last-field :disabled=\"companies.length === 0\" @save=\"goNext\">\n        <h1>Facturatiegegevens</h1>\n        <p>Deze gegevens komen op jouw betaalbewijs. Zorg dat ze in orde zijn, je kan ze later niet meer wijzigen.</p>\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <p v-if=\"companies.length === 0\" class=\"info-box\">\n            Je hebt nog geen facturatiegegevens toegevoegd aan jouw vereniging. Stel deze eerst in voor je verder gaat.\n        </p>\n\n        <STList v-else>\n            <STListItem v-for=\"company of companies\" :key=\"company.id\" :selectable=\"companies.length > 1\" class=\"right-stack\" element-name=\"label\">\n                <template #left>\n                    <Radio v-if=\"companies.length > 1\" v-model=\"selectedCompanyId\" :value=\"company.id\" />\n                </template>\n                <h3 class=\"style-title-list\">\n                    {{ company.name || 'Naamloos' }}\n                </h3>\n\n                <p v-if=\"company.VATNumber\" class=\"style-description-small\">\n                    {{ company.VATNumber }} (BTW-plichtig)\n                </p>\n                <p v-else-if=\"company.companyNumber\" class=\"style-description-small\">\n                    {{ company.companyNumber }} (niet BTW-plichtig)\n                </p>\n                <p v-else class=\"style-description-small\">\n                    Feitelijke vereniging\n                </p>\n\n                <p v-if=\"company.address\" class=\"style-description-small\">\n                    {{ company.address.shortString() }}\n                </p>\n\n                <p v-if=\"company.administrationEmail\" class=\"style-description-small\">\n                    {{ company.administrationEmail }}\n                </p>\n            </STListItem>\n        </STList>\n\n        <p v-if=\"auth.hasFullAccess()\" class=\"style-button-bar\">\n            <button v-if=\"companies.length === 0\" type=\"button\" class=\"button primary\" @click=\"editInvoiceSettings\">\n                <span>Instellen</span>\n            </button>\n            <button v-else type=\"button\" class=\"button text\" @click=\"editInvoiceSettings\">\n                <span class=\"icon edit\" />\n                <span>Bewerk</span>\n            </button>\n        </p>\n        <p v-else class=\"warning-box\">\n            {{ $t('8bc53634-08a5-4404-9455-421955e83ce4') }}\n        </p>\n    </SaveView>\n</template>\n\n<script lang=\"ts\" setup>\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { ComponentWithProperties, usePresent } from '@simonbackx/vue-app-navigation';\nimport { ErrorBox, GeneralSettingsView, NavigationActions, STErrorsDefault, useAuth, useErrors, useNavigationActions, useOrganization, useUser } from '@stamhoofd/components';\nimport { PaymentCustomer, RegisterCheckout } from '@stamhoofd/structures';\nimport { computed, onMounted, ref } from 'vue';\n\nconst props = defineProps<{\n    checkout: RegisterCheckout;\n    saveHandler: (navigate: NavigationActions) => Promise<void>;\n}>();\n\nconst errors = useErrors();\n\nconst organization = useOrganization();\nconst loading = ref(false);\nconst navigate = useNavigationActions();\nconst user = useUser();\nconst present = usePresent();\nconst companies = computed(() => organization.value?.meta.companies ?? []);\nconst selectedCompanyId = ref<string | null>(companies.value.length > 0 ? companies.value[0].id : null);\nconst auth = useAuth();\n\nonMounted(() => {\n    // Build default value\n});\n\nfunction buildCustomer() {\n    return PaymentCustomer.create({\n        firstName: user.value?.firstName,\n        lastName: user.value?.lastName,\n        email: user.value?.email,\n        company: companies.value.find(c => c.id === selectedCompanyId.value) ?? (companies.value.length === 1 ? companies.value[0] : null) ?? null,\n    });\n}\n\nasync function editInvoiceSettings() {\n    await present({\n        components: [\n            new ComponentWithProperties(\n                GeneralSettingsView,\n            ),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function goNext() {\n    if (loading.value) {\n        return;\n    }\n\n    loading.value = true;\n    errors.errorBox = null;\n\n    try {\n        const customer = buildCustomer();\n        if (!customer.company) {\n            if (companies.value.length === 0) {\n                throw new SimpleError({\n                    code: 'missing_field',\n                    message: 'Stel je facturatiegegevens in voor je verder gaat',\n                    field: 'company',\n                });\n            }\n\n            throw new SimpleError({\n                code: 'missing_field',\n                message: 'Kies de juiste facturatiegegevens voor je verder gaat',\n                field: 'company',\n            });\n        }\n\n        if (customer.company.name.length < 2 || !customer.company.address) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Deze facturatiegegevens zijn niet volledig. Bewerk ze en kijk ze na voor je verder gaat.',\n                field: 'company',\n            });\n        }\n\n        props.checkout.customer = customer;\n        await props.saveHandler(navigate);\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    finally {\n        loading.value = false;\n    }\n}\n\n</script>\n","import { ComponentWithProperties } from \"@simonbackx/vue-app-navigation\";\nimport { RegisterCheckout } from \"@stamhoofd/structures\";\nimport { NavigationActions } from \"../../../types/NavigationActions\";\nimport { ViewStep, ViewStepsManager } from \"../../classes/ViewStepsManager\";\nimport PaymentCustomerView from \"../PaymentCustomerView.vue\";\n\nexport class PaymentCustomerStep implements ViewStep {\n    checkout: RegisterCheckout\n\n    constructor(checkout: RegisterCheckout) {\n        this.checkout = checkout\n    }\n\n    isEnabled(_manager: ViewStepsManager) {\n        if (this.checkout.isAdminFromSameOrganization) {\n            return false;\n        }\n\n        if (!this.checkout.asOrganizationId) {\n            return false;\n        }\n\n        return true;\n    }\n\n    getComponent(manager: ViewStepsManager): ComponentWithProperties {\n        return new ComponentWithProperties(PaymentCustomerView, {\n            checkout: this.checkout,\n            saveHandler: async (navigate: NavigationActions) => {\n                await manager.saveHandler(this, navigate)\n            }\n        })\n    }\n}\n","import { ComponentWithProperties } from \"@simonbackx/vue-app-navigation\";\nimport { RegisterCheckout } from \"@stamhoofd/structures\";\nimport { NavigationActions } from \"../../../types/NavigationActions\";\nimport FreeContributionView from \"../FreeContributionView.vue\";\nimport { ViewStep, ViewStepsManager } from \"../../classes/ViewStepsManager\";\nimport PaymentSelectionView from \"../PaymentSelectionView.vue\";\n\n\nexport class PaymentSelectionStep implements ViewStep {\n    checkout: RegisterCheckout\n\n    constructor(checkout: RegisterCheckout) {\n        this.checkout = checkout\n    }\n\n    isEnabled(_manager: ViewStepsManager) {\n        if (this.checkout.isAdminFromSameOrganization) {\n            return false;\n        }\n\n        return true;\n    }\n\n    getComponent(manager: ViewStepsManager): ComponentWithProperties {\n        return new ComponentWithProperties(PaymentSelectionView, {\n            checkout: this.checkout,\n            saveHandler: async (navigate: NavigationActions) => {\n                await manager.saveHandler(this, navigate)\n            }\n        })\n    }\n}\n","import { Decoder } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties } from '@simonbackx/vue-app-navigation';\nimport { SessionContext } from '@stamhoofd/networking';\nimport { PaymentStatus, PlatformFamily, PlatformMember, RegisterCheckout, RegisterResponse } from '@stamhoofd/structures';\nimport { GlobalEventBus } from '../../EventBus';\nimport { DisplayOptions, NavigationActions } from '../../types/NavigationActions';\nimport { PaymentHandler } from '../../views/PaymentHandler';\nimport { RegistrationSuccessView } from '../checkout';\nimport { ViewStep, ViewStepsManager } from '../classes/ViewStepsManager';\nimport { updateContextFromMembersBlob } from '../PlatformFamilyManager';\nimport { FreeContributionStep } from './steps/FreeContributionStep';\nimport { PaymentCustomerStep } from './steps/PaymentCustomerStep';\nimport { PaymentSelectionStep } from './steps/PaymentSelectionStep';\n\nexport async function startCheckout({ checkout, context, displayOptions, admin, members }: { checkout: RegisterCheckout; context: SessionContext; displayOptions: DisplayOptions; admin?: boolean; members?: PlatformMember[] }, navigate: NavigationActions) {\n    checkout.validate({});\n\n    const steps: ViewStep[] = [\n        new FreeContributionStep(checkout),\n        new PaymentCustomerStep(checkout),\n        new PaymentSelectionStep(checkout),\n    ];\n\n    const stepManager = new ViewStepsManager(steps, async (navigate: NavigationActions) => {\n        await register({ checkout, context, admin, members }, navigate);\n    }, displayOptions);\n\n    await stepManager.saveHandler(null, navigate);\n}\n\nasync function register({ checkout, context, admin, members }: { checkout: RegisterCheckout; context: SessionContext; admin?: boolean; members?: PlatformMember[] }, navigate: NavigationActions) {\n    const organization = checkout.singleOrganization!;\n    const server = context.getAuthenticatedServerForOrganization(organization.id);\n\n    const idCheckout = checkout.convert();\n\n    if (!admin) {\n        idCheckout.redirectUrl = new URL(organization.registerUrl);\n        idCheckout.cancelUrl = new URL(organization.registerUrl);\n    }\n    else {\n        idCheckout.redirectUrl = new URL(window.location.href);\n        idCheckout.cancelUrl = new URL(window.location.href);\n    }\n\n    // Force https protocol (the app can use capacitor:// instead of https, so we need to swap)\n    idCheckout.redirectUrl.protocol = 'https:';\n    idCheckout.cancelUrl.protocol = 'https:';\n\n    const response = await server.request({\n        method: 'POST',\n        path: '/members/register',\n        body: idCheckout,\n        decoder: RegisterResponse as Decoder<RegisterResponse>,\n        shouldRetry: false,\n    });\n\n    const payment = response.data.payment;\n    const registrations = response.data.registrations;\n\n    // Copy data to members\n    PlatformFamily.updateFromBlob([...(members ?? []), ...checkout.cart.items.map(i => i.member)], response.data.members);\n    updateContextFromMembersBlob(context, response.data.members);\n\n    const clearAndEmit = () => {\n        if (checkout.cart.items.length > 0) {\n            GlobalEventBus.sendEvent('members-added', []).catch(console.error);\n        }\n        else if (checkout.cart.deleteRegistrations.length > 0) {\n            GlobalEventBus.sendEvent('members-deleted', []).catch(console.error);\n        }\n\n        checkout.clear();\n    };\n\n    if (payment && payment.status !== PaymentStatus.Succeeded) {\n        await PaymentHandler.handlePayment({\n            server,\n            organization: checkout.singleOrganization!,\n            payment,\n            paymentUrl: response.data.paymentUrl,\n            navigate,\n            transferSettings: checkout.singleOrganization!.meta.registrationPaymentConfiguration.transferSettings,\n            type: 'registration',\n        }, async (_payment, navigate: NavigationActions) => {\n            clearAndEmit();\n\n            await navigate.show({\n                components: [\n                    new ComponentWithProperties(RegistrationSuccessView, {\n                        registrations,\n                        checkout: checkout,\n                    }),\n                ],\n                replace: 100, // autocorrects to all\n                force: true,\n            });\n        }, () => {\n            // Silently ignore for now\n            console.log(payment);\n        }, () => {\n            clearAndEmit();\n        });\n        return;\n    }\n    GlobalEventBus.sendEvent('paymentPatch', payment).catch(console.error);\n    clearAndEmit();\n    await navigate.show({\n        components: [\n            new ComponentWithProperties(RegistrationSuccessView, {\n                registrations,\n                checkout: checkout,\n            }),\n        ],\n        replace: 100,\n        force: true,\n    });\n}\n","import { Decoder } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, NavigationController } from '@simonbackx/vue-app-navigation';\nimport { SessionContext, useRequestOwner } from '@stamhoofd/networking';\nimport { Group, GroupType, Organization, PlatformFamily, PlatformMember, RegisterCheckout, RegisterItem, RegistrationWithMember } from '@stamhoofd/structures';\nimport { ChooseGroupForMemberView } from '..';\nimport { useAppContext } from '../../context/appContext';\nimport { GlobalEventBus } from '../../EventBus';\nimport { useContext } from '../../hooks';\nimport { Toast } from '../../overlays/Toast';\nimport { DisplayOptions, NavigationActions, runDisplayOptions, useNavigationActions } from '../../types/NavigationActions';\nimport ChooseFamilyMembersForGroupView from '../ChooseFamilyMembersForGroupView.vue';\nimport ChooseOrganizationMembersForGroupView from '../ChooseOrganizationMembersForGroupView.vue';\nimport { EditMemberStep, MemberStepManager } from '../classes/MemberStepManager';\nimport { getAllMemberSteps } from '../classes/steps';\nimport { RegisterItemStep } from '../classes/steps/RegisterItemStep';\nimport { startCheckout } from './startCheckout';\n\nexport async function loadGroupOrganization(context: SessionContext, organizationId: string, owner: any) {\n    if (organizationId === context.organization?.id) {\n        return context.organization;\n    }\n\n    const response = await SessionContext.serverForOrganization(organizationId).request({\n        method: 'GET',\n        path: '/organization',\n        decoder: Organization as Decoder<Organization>,\n        shouldRetry: true,\n        owner,\n    });\n\n    return response.data;\n}\n\n// Flow 1: group and member are already determined\n// -> no extra view in front of normal checkout flow\n\n// Flow 2: group is determined, multiple members can be chosen from the family\n// -> ChooseFamilyMembersForGroupView -> flow 1 (multiple times for each member)\n\n// Flow 3: group is determined, multiple members need to be chosen from the whole organization or from a selection\n// -> ChooseOrganizationMembersForGroupView -> flow 1 (multiple times)\n// -> checkout is cleared and synced before starting this flow\n// Used for bulk registrations in the dashboard\n\n// Flow 4: member is determined, group needs to be chosen from multiple organizations\n// -> ChooseGroupForMemberView -> flow 1\n//\n// Used for:\n// - via flow 5: registering a new member or existing member from the member portal start page\n// - registering an indiviual member from the dashboard\n\n// Flow 5: members nor group is determined\n// -> registration.RegisterMembersView (choose a member from your family) followed by flow 4\n//\n// Used for:\n// - registering a new member or existing member from the member portal start page\n\n// Flow 6: Add a new member\n// -> MemberStepView(EditMemberGeneralBox) -> followed by flow 4\n\n// ----------------------------\n// --------- Flow 1 -----------\n\nexport async function checkoutRegisterItem({ item: originalItem, admin, context, displayOptions, navigate, showGroupInformation, startCheckoutFlow }: {\n    item: RegisterItem;\n    navigate: NavigationActions;\n    context: SessionContext;\n    admin?: boolean;\n    showGroupInformation?: boolean;\n    displayOptions?: DisplayOptions;\n    startCheckoutFlow?: boolean;\n}) {\n    let item = originalItem;\n\n    if (item.group.waitingList && item.validationError && !item.validationErrorForWaitingList) {\n        // Should register for the waiting list\n        item = RegisterItem.defaultFor(item.member, item.group.waitingList, item.organization);\n        item.cartError = originalItem.cartError;\n    }\n\n    const member = item.member;\n\n    // Add it to the platform member\n    member.family.pendingRegisterItems = [item];\n    member.family.checkout.defaultOrganization = item.organization;\n\n    if (admin) {\n        if (!context.organization) {\n            // Administration panel: register as organizing organization\n            member.family.checkout.asOrganizationId = item.organization.id;\n        }\n        else {\n            member.family.checkout.asOrganizationId = context.organization.id;\n        }\n    }\n\n    // Check which steps need a review or are not complete\n    const steps: EditMemberStep[] = [\n        new RegisterItemStep(item, { showGroupInformation }),\n    ];\n\n    if (!admin) {\n        steps.push(...getAllMemberSteps(member, item));\n    }\n\n    const manager = new MemberStepManager(context, member, steps, async (navigate) => {\n        // Clear errors\n        item.cartError = null;\n\n        // Move the item to the cart (replace if it already exists)\n        if (item !== originalItem) {\n            member.family.checkout.remove(originalItem);\n        }\n        member.family.checkout.add(item); // With price calculation\n        member.family.pendingRegisterItems = [];\n\n        if (!member.family.checkout.cart.contains(item)) {\n            Toast.error('We konden de inschrijving niet toevoegen aan je winkelmandje omdat er al andere zaken in staan die niet samen afgerekend kunnen worden. Reken eerst je huidige winkelmandje af, en ga daarna verder met de andere inschrijvingen.').show();\n            return;\n        }\n\n        if (startCheckoutFlow) {\n            // Automatically checkout the cart here\n            // If needed, we'll need to start the normal checkout flow where we'll invoice between organizations (in case of registering members for other organizations)\n            try {\n                return await startCheckout({\n                    checkout: member.family.checkout,\n                    context,\n                    displayOptions: { action: 'show' },\n                }, navigate);\n            }\n            catch (e) {\n                Toast.fromError(e).show();\n                return;\n            }\n        }\n        else {\n            if (!admin) {\n                if (item.group.type === GroupType.WaitingList) {\n                    Toast.warning('De inschrijving op de wachtlijst is toegevoegd aan het winkelmandje. Bevestig de inschrijving door het winkelmandje te bevestigen.').setIcon('clock').show();\n                }\n                else {\n                    Toast.success('Inschrijving toegevoegd aan winkelmandje. Ga naar het winkelmandje als je alle inschrijvingen hebt toegevoegd om af te rekenen.').setIcon('basket').show();\n                }\n            }\n\n            if (showGroupInformation) {\n                await GlobalEventBus.sendEvent('selectTabByName', 'mandje');\n            }\n        }\n\n        await navigate.dismiss({ force: true });\n    }, displayOptions);\n\n    await manager.saveHandler(null, navigate);\n}\n\nexport async function checkoutDefaultItem({ group, member, admin, groupOrganization, context, displayOptions, navigate, showGroupInformation, startCheckoutFlow, owner }: {\n    group: Group;\n    member: PlatformMember;\n    groupOrganization?: Organization;\n    context: SessionContext;\n    navigate: NavigationActions;\n    admin?: boolean;\n    showGroupInformation?: boolean;\n    displayOptions?: DisplayOptions;\n    startCheckoutFlow?: boolean;\n    owner?: any;\n}) {\n    if (!groupOrganization) {\n        try {\n            groupOrganization = await loadGroupOrganization(context, group.organizationId, owner);\n        }\n        catch (e) {\n            Toast.fromError(e).show();\n            return;\n        }\n    }\n    return await checkoutRegisterItem({\n        context,\n        item: RegisterItem.defaultFor(member, group, groupOrganization),\n        displayOptions,\n        admin,\n        navigate,\n        showGroupInformation,\n        startCheckoutFlow,\n    });\n}\n\nexport function useCheckoutRegisterItem() {\n    const navigate = useNavigationActions();\n    const context = useContext();\n    const app = useAppContext();\n\n    return async ({ item, startCheckoutFlow, displayOptions }: { item: RegisterItem; startCheckoutFlow?: boolean; displayOptions?: DisplayOptions }) => {\n        await checkoutRegisterItem({\n            item,\n            admin: app === 'dashboard' || app === 'admin',\n            displayOptions,\n            navigate,\n            startCheckoutFlow,\n            context: context.value,\n        });\n    };\n}\n\nexport function useCheckoutDefaultItem() {\n    const navigate = useNavigationActions();\n    const context = useContext();\n    const app = useAppContext();\n    const owner = useRequestOwner();\n\n    return async ({ group, member, groupOrganization, displayOptions, startCheckoutFlow, customNavigate }: { group: Group; member: PlatformMember; groupOrganization?: Organization; startCheckoutFlow?: boolean; displayOptions?: DisplayOptions; customNavigate?: NavigationActions }) => {\n        await checkoutDefaultItem({\n            group,\n            member,\n            groupOrganization,\n            admin: app === 'dashboard' || app === 'admin',\n            displayOptions,\n            navigate: customNavigate ?? navigate,\n            context: context.value,\n            startCheckoutFlow,\n            owner,\n        });\n    };\n}\n\n// ----------------------------\n// --------- Flow 2 -----------\n\nexport async function chooseFamilyMembersForGroup({ navigate, group, family, displayOptions }: {\n    group: Group;\n    family: PlatformFamily;\n    navigate: NavigationActions;\n    displayOptions: DisplayOptions;\n}) {\n    await runDisplayOptions({\n        components: [\n            new ComponentWithProperties(NavigationController, {\n                root: new ComponentWithProperties(ChooseFamilyMembersForGroupView, {\n                    family,\n                    group,\n                }),\n            }),\n        ],\n    }, displayOptions, navigate);\n}\n\nexport function useChooseFamilyMembersForGroup() {\n    const navigate = useNavigationActions();\n\n    return async ({ group, family, displayOptions }: { group: Group; family: PlatformFamily; displayOptions: DisplayOptions }) => {\n        return await chooseFamilyMembersForGroup({ group, family, navigate, displayOptions });\n    };\n}\n\n// ----------------------------\n// --------- Flow 3 -----------\nexport async function openOrganizationCart({ organization, checkout, context, navigate, group, members }: {\n    organization: Organization;\n    checkout?: RegisterCheckout;\n    context: SessionContext;\n    navigate: NavigationActions;\n    group?: Group; // Optional: add a button to search for members to register in this group\n    members?: PlatformMember[]; // Automatically add default items for these members to the checkout if group is also provided\n}) {\n    const groupOrganization = organization;\n\n    // Create a new shared checkout for these members\n    if (!checkout) {\n        checkout = new RegisterCheckout();\n    }\n    checkout.defaultOrganization = groupOrganization;\n\n    if (!context.organization) {\n        // Administration panel: register as organizing organization\n        checkout.asOrganizationId = groupOrganization.id;\n    }\n    else {\n        checkout.asOrganizationId = context.organization.id;\n    }\n\n    checkout.updatePrices();\n\n    await navigate.present({\n        components: [\n            new ComponentWithProperties(NavigationController, {\n                root: new ComponentWithProperties(ChooseOrganizationMembersForGroupView, {\n                    groupOrganization,\n                    checkout,\n                    group,\n                    members,\n                }),\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nexport function useOrganizationCart() {\n    const navigate = useNavigationActions();\n    const context = useContext();\n\n    return async ({ members, group, organization, checkout }: { members?: PlatformMember[]; group?: Group; organization: Organization; checkout: RegisterCheckout }) => {\n        return await openOrganizationCart({ members, group, organization, checkout, navigate, context: context.value });\n    };\n}\n\nexport async function chooseOrganizationMembersForGroup({ members, group, organization, items, context, navigate, owner, deleteRegistrations }: {\n    members?: PlatformMember[]; // Automatically add default items for these members to the checkout if group is also provided\n    group?: Group;\n    organization?: Organization;\n    context: SessionContext;\n    items?: RegisterItem[];\n    deleteRegistrations?: RegistrationWithMember[];\n    navigate: NavigationActions;\n    owner: any;\n}) {\n    if (!organization && !group) {\n        throw new Error('Either organization or group should be provided');\n    }\n\n    const groupOrganization = organization ?? await loadGroupOrganization(context, group!.organizationId, owner);\n\n    // Create a new shared checkout for these members\n    const checkout = new RegisterCheckout();\n\n    if (members) {\n        for (const member of members) {\n            member.family.checkout = checkout;\n            member.family.pendingRegisterItems = [];\n\n            if (items === undefined && group) {\n                const item = RegisterItem.defaultFor(member, group, groupOrganization);\n                checkout.add(item, { calculate: false });\n            }\n        }\n    }\n\n    if (items !== undefined) {\n        for (const item of items) {\n            item.member.family.checkout = checkout;\n            item.member.family.pendingRegisterItems = [];\n            checkout.add(item, { calculate: false });\n        }\n    }\n\n    if (deleteRegistrations) {\n        for (const registration of deleteRegistrations) {\n            checkout.removeRegistration(registration, { calculate: false });\n        }\n    }\n\n    await openOrganizationCart({\n        organization: groupOrganization,\n        members,\n        group,\n        checkout,\n        navigate,\n        context,\n    });\n}\n\nexport function useChooseOrganizationMembersForGroup() {\n    const navigate = useNavigationActions();\n    const context = useContext();\n    const owner = useRequestOwner();\n\n    return async ({ members, group, items }: { members: PlatformMember[]; group: Group; items?: RegisterItem[] }) => {\n        return await chooseOrganizationMembersForGroup({ members, group, items, navigate, context: context.value, owner });\n    };\n}\n\n// ----------------------------\n// --------- Flow 4 -----------\n\nexport async function chooseGroupForMember({ member, navigate, context, displayOptions, startCheckoutFlow, admin }: { admin?: boolean; member: PlatformMember; navigate: NavigationActions; context: SessionContext; displayOptions?: DisplayOptions; startCheckoutFlow?: boolean }) {\n    await runDisplayOptions({\n        components: [\n            new ComponentWithProperties(NavigationController, {\n                root: new ComponentWithProperties(ChooseGroupForMemberView, {\n                    member,\n                    selectionHandler: async ({ group, groupOrganization }: { group: Group; groupOrganization: Organization }, navigate: NavigationActions) => {\n                        await checkoutDefaultItem({\n                            member,\n                            group,\n                            groupOrganization,\n                            admin: admin ?? false,\n                            navigate,\n                            context,\n                            displayOptions: { action: 'show' },\n                            showGroupInformation: true,\n                            startCheckoutFlow,\n                        });\n                    },\n                }),\n            }),\n        ],\n    }, displayOptions ?? { action: 'show' }, navigate);\n}\n\nexport function useChooseGroupForMember() {\n    const navigate = useNavigationActions();\n    const context = useContext();\n    const app = useAppContext();\n\n    return async ({ member, displayOptions, customNavigate, startCheckoutFlow }: { member: PlatformMember; displayOptions?: DisplayOptions; customNavigate?: NavigationActions; startCheckoutFlow?: boolean }) => {\n        if (app !== 'registration') {\n            member.family.checkout.clear();\n        }\n\n        await chooseGroupForMember({\n            admin: app === 'dashboard' || app === 'admin',\n            member,\n            navigate: customNavigate ?? navigate,\n            context: context.value,\n            displayOptions,\n            startCheckoutFlow: startCheckoutFlow ?? (app !== 'registration'),\n        });\n    };\n}\n","<template>\n    <div v-if=\"familyMembers.length > 0\" class=\"hover-box container\">\n        <hr>\n        <h2>\n            <template v-if=\"member.patchedMember.details.defaultAge <= 30 && Math.abs(maxFamilyAge - member.patchedMember.details.defaultAge) <= 14\">\n                Broers &amp; zussen\n            </template>\n            <template v-else>\n                Familie\n            </template>\n        </h2>\n\n        <STList>\n            <STListItem v-for=\"familyMember in familyMembers\" :key=\"familyMember.id\" :selectable=\"true\" @click=\"gotoMember(familyMember)\">\n                <template #left>\n                    <span class=\"icon user small\" />\n                </template>\n                <h3 class=\"style-title-list\">\n                    {{ familyMember.patchedMember.firstName }} {{ familyMember.patchedMember.details ? familyMember.patchedMember.details.lastName : \"\" }}\n                </h3>\n                <p v-if=\"familyMember.groups.length > 0\" class=\"style-description-small\">\n                    {{ familyMember.groups.map(g => g.settings.name).join(\", \") }}\n                </p>\n                <template #right>\n                    <span class=\"icon arrow-right-small gray\" />\n                </template>\n            </STListItem>\n        </STList>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ComponentWithProperties, NavigationController, usePresent } from '@simonbackx/vue-app-navigation';\nimport { PlatformMember } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { MemberSegmentedView } from '../..';\n\ndefineOptions({\n    inheritAttrs: false\n})\n\nconst props = defineProps<{\n    member: PlatformMember\n}>()\nconst present = usePresent();\n\nconst familyMembers = computed(() => props.member.family.members.filter(m => m.id !== props.member.id))\nconst maxFamilyAge = computed(() => {\n    const ages = familyMembers.value.map(m => m.patchedMember.details.age ?? 99)\n    if (ages.length === 0) {\n        return 99\n    }\n    return Math.max(...ages)\n})\n\nasync function gotoMember(member: PlatformMember) {\n    await present({\n        components: [\n            new ComponentWithProperties(NavigationController, {\n                root: new ComponentWithProperties(MemberSegmentedView, {\n                    member,\n                }),\n            })\n        ],\n        modalDisplayStyle: \"popup\"\n    });\n}\n</script>\n","<template>\n    <div class=\"hover-box container\">\n        <hr>\n        <dl class=\"details-grid hover\">\n            <template v-if=\"member.patchedMember.details.name\">\n                <dt>Naam</dt>\n                <dd v-copyable>\n                    {{ member.patchedMember.details.name }}\n                </dd>\n            </template>\n\n            <template v-if=\"member.patchedMember.details.memberNumber\">\n                <dt>Lidnummer</dt>\n                <dd v-copyable>\n                    {{ member.patchedMember.details.memberNumber }}\n                </dd>\n            </template>\n\n            <template v-if=\"member.patchedMember.details.birthDay\">\n                <dt>Verjaardag</dt>\n                <dd v-copyable>\n                    {{ member.patchedMember.details.birthDayFormatted }} ({{ member.patchedMember.details.age }} jaar)\n                </dd>\n            </template>\n\n            <template v-if=\"member.patchedMember.details.trackingYear\">\n                <dt>{{ $t('99b87ddc-3a72-45fa-923a-10bf130fb4de') }}</dt>\n                <dd v-copyable>\n                    {{ member.patchedMember.details.trackingYear }}\n                </dd>\n            </template>\n\n            <template v-if=\"member.patchedMember.details.phone\">\n                <dt>{{ $t('90d84282-3274-4d85-81cd-b2ae95429c34') }}</dt>\n                <dd v-copyable>\n                    {{ member.patchedMember.details.phone }}\n                </dd>\n            </template>\n\n            <template v-if=\"member.patchedMember.details.email\">\n                <dt>E-mailadres {{ member.patchedMember.details.alternativeEmails.length ? '1' : '' }}</dt>\n                <dd v-copyable>\n                    {{ member.patchedMember.details.email }}\n                </dd>\n            </template>\n\n            <template v-for=\"(email, index) of member.patchedMember.details.alternativeEmails\" :key=\"index\">\n                <dt>E-mailadres {{ index + 2 }}</dt>\n                <dd v-copyable>\n                    {{ email }}\n                </dd>\n            </template>\n\n            <template v-if=\"member.patchedMember.details.address\">\n                <dt>Adres</dt>\n                <dd v-copyable>\n                    {{ member.patchedMember.details.address.street }} {{ member.patchedMember.details.address.number }}<br>{{ member.patchedMember.details.address.postalCode }}\n                    {{ member.patchedMember.details.address.city }}\n                    <template v-if=\"member.patchedMember.details.address.country !== currentCountry\">\n                        <br>{{ formatCountry(member.patchedMember.details.address.country) }}\n                    </template>\n                </dd>\n            </template>\n\n            <template v-if=\"member.patchedMember.details.uitpasNumber\">\n                <dt>UiTPAS-nummer</dt>\n                <dd v-copyable>\n                    {{ member.patchedMember.details.uitpasNumber }}\n                </dd>\n            </template>\n\n            <template v-if=\"member.patchedMember.details.nationalRegisterNumber && member.patchedMember.details.nationalRegisterNumber !== NationalRegisterNumberOptOut\">\n                <dt>Rijksregisternummer</dt>\n                <dd v-copyable>\n                    {{ member.patchedMember.details.nationalRegisterNumber }}\n                </dd>\n            </template>\n\n            <template v-if=\"member.member.createdAt\">\n                <dt>Aanmaakdatum</dt>\n                <dd v-copyable>\n                    {{ formatDate(member.member.createdAt, true) }}\n                </dd>\n            </template>\n        </dl>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { NationalRegisterNumberOptOut, PlatformMember } from '@stamhoofd/structures';\nimport { useCountry } from '../../../hooks';\n\ndefineOptions({\n    inheritAttrs: false,\n});\n\ndefineProps<{\n    member: PlatformMember;\n}>();\n\nconst currentCountry = useCountry();\n</script>\n","<template>\n    <div v-if=\"notes\">\n        <div class=\"hover-box container\">\n            <hr>\n            <h2 class=\"style-with-button\">\n                <div>Notities</div>\n                <div class=\"hover-show\">\n                    <button v-if=\"hasWrite\" type=\"button\" class=\"button icon edit gray\" @click.prevent=\"editThisMember\" />\n                </div>\n            </h2>\n            <p class=\"style-description-small notes\">\n                {{ notes }}\n            </p>\n        </div>  \n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { PermissionLevel, PlatformMember } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { useAuth } from '../../../hooks';\nimport { useEditMember } from '../../composables/useEditMember';\n\ndefineOptions({\n    inheritAttrs: false\n})\n\nconst props = defineProps<{\n    member: PlatformMember\n}>();\n\nconst editMember = useEditMember();\nconst auth = useAuth();\n\nconst memberDetails = computed(() => props.member.patchedMember.details);\nconst notes = computed(() => memberDetails.value.notes);\nconst hasWrite = auth.canAccessPlatformMember(props.member, PermissionLevel.Write);\n\nasync function editThisMember() {\n    await editMember(props.member);\n}\n</script>\n\n\n<style lang=\"scss\" scoped>\n.notes {\n    white-space: pre-line;\n}\n</style>\n","<template>\n    <div class=\"hover-box container\">\n        <hr>\n        <h2 class=\"style-with-button\">\n            <div>{{ ParentTypeHelper.getName(parent.type) }}</div>\n        </h2>\n\n        <dl class=\"details-grid hover\">\n            <dt>Naam</dt>\n            <dd v-copyable>\n                {{ parent.name }}\n            </dd>\n\n            <template v-if=\"parent.phone\">\n                <dt>{{ $t('90d84282-3274-4d85-81cd-b2ae95429c34') }}</dt>\n                <dd v-copyable>\n                    {{ parent.phone }}\n                </dd>\n            </template>\n\n            <template v-if=\"parent.email\">\n                <dt>E-mailadres {{ parent.alternativeEmails.length ? '1' : '' }}</dt>\n                <dd v-copyable>\n                    {{ parent.email }}\n                </dd>\n            </template>\n\n            <template v-for=\"(email, index) of parent.alternativeEmails\" :key=\"index\">\n                <dt>E-mailadres {{ index + 2 }}</dt>\n                <dd v-copyable>\n                    {{ email }}\n                </dd>\n            </template>\n\n            <template v-if=\"parent.address\">\n                <dt>Adres</dt>\n                <dd v-copyable>\n                    {{ parent.address.street }} {{ parent.address.number }}<br>{{ parent.address.postalCode }}\n                    {{ parent.address.city }}\n                    <template v-if=\"parent.address.country !== currentCountry\">\n                        <br>{{ formatCountry(parent.address.country) }}\n                    </template>\n                </dd>\n            </template>\n\n            <template v-if=\"parent.nationalRegisterNumber && parent.nationalRegisterNumber !== NationalRegisterNumberOptOut\">\n                <dt>Rijksregisternummer</dt>\n                <dd v-copyable>\n                    {{ parent.nationalRegisterNumber }}\n                </dd>\n            </template>\n        </dl>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { Parent, PlatformMember, ParentTypeHelper, NationalRegisterNumberOptOut } from '@stamhoofd/structures';\nimport { useCountry } from '../../../hooks';\n\ndefineOptions({\n    inheritAttrs: false,\n});\n\ndefineProps<{\n    parent: Parent;\n    member: PlatformMember;\n}>();\n\nconst currentCountry = useCountry();\n\n</script>\n","<template>\n    <STList v-if=\"!compact\" class=\"info\">\n        <STListItem v-for=\"{record, answer, recordCheckboxAnswer, recordFileAnswer} of recordsWithAnswers\" :key=\"record.id\">\n            <h3 class=\"style-definition-label\">\n                {{ record.name }}\n            </h3>\n            <p v-if=\"!answer\" class=\"style-definition-text\">\n                <span>Niet ingevuld</span>\n            </p>\n            <template v-else-if=\"recordCheckboxAnswer\">\n                <p class=\"style-definition-text\">\n                    <span v-if=\"recordCheckboxAnswer.selected\" class=\"icon success primary\" />\n                    <span v-else class=\"icon canceled gray\" />\n                    <span v-if=\"recordCheckboxAnswer.comments\" v-copyable class=\"pre-wrap style-copyable\" v-text=\"recordCheckboxAnswer.comments\" />\n                </p>\n            </template>\n            <p v-else-if=\"recordFileAnswer\" class=\"style-definition-text\">\n                <span v-if=\"!recordFileAnswer.file\">Leeg</span>\n                <template v-else>\n                    <a :href=\"recordFileAnswer.file?.getPublicPath()\" target=\"_blank\" class=\"button text\">\n                        <span class=\"icon download\" />\n                        <span>{{ recordFileAnswer.file.name }}</span>\n                    </a>\n                </template>\n            </p>\n            <p v-else v-copyable class=\"style-definition-text pre-wrap style-copyable\" v-text=\"answer.stringValue\" />\n        </STListItem>\n\n        <STListItem v-for=\"cc of childCategories\" :key=\"cc.id\">\n            <h3 class=\"style-definition-label\">\n                {{ cc.name }}\n            </h3>\n            <RecordCategoryAnswersBox :value=\"value\" :category=\"cc\" :compact=\"true\" />\n        </STListItem>\n    </STList>\n\n    <template v-else-if=\"isAllCheckboxAnswers\">\n        <template v-for=\"{record, recordCheckboxAnswer} of recordsWithAnswers.filter(({recordCheckboxAnswer}) => recordCheckboxAnswer?.selected)\" :key=\"record.id\">\n            <p class=\"style-definition-text\">\n                {{ record.name }}\n            </p>\n            <p v-if=\"recordCheckboxAnswer?.comments\" v-copyable class=\"style-description-small pre-wrap\" v-text=\"recordCheckboxAnswer.comments\" />\n        </template>\n        <p v-if=\"recordsWithAnswers.filter(({recordCheckboxAnswer}) => recordCheckboxAnswer?.selected).length === 0\" class=\"style-description\">\n            Geen\n        </p>\n    </template>\n\n    <dl v-else class=\"details-grid\">\n        <template v-for=\"{record, answer, recordCheckboxAnswer} of recordsWithAnswers\" :key=\"record.id\">\n            <dt class=\"center\">\n                {{ record.name }}\n            </dt>\n            <dd v-if=\"!answer\">\n                /\n            </dd>\n            <template v-else-if=\"recordCheckboxAnswer\">\n                <dd>\n                    <span v-if=\"recordCheckboxAnswer.selected\" class=\"icon success primary\" />\n                    <span v-else class=\"icon canceled gray\" />\n                </dd>\n                <dd v-if=\"recordCheckboxAnswer.comments\" :key=\"'dd-description-'+record.id\" v-copyable class=\"description pre-wrap style-copyable\" v-text=\"recordCheckboxAnswer.comments\" />\n            </template>\n            <dd v-else v-copyable class=\"pre-wrap style-copyable\" v-text=\"answer.stringValue\" />\n        </template>\n    </dl>\n</template>\n\n<script lang=\"ts\" setup generic=\"T extends ObjectWithRecords\">\nimport { ObjectWithRecords, PermissionLevel, RecordCategory, RecordCheckboxAnswer, RecordFileAnswer } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { useAppContext } from '../../context';\n\nconst props = withDefaults(\n    defineProps<{\n        value: T;\n        category: RecordCategory;\n        compact?: boolean;\n    }>(),\n    {\n        compact: false,\n    },\n);\n\nconst app = useAppContext();\nconst isAdmin = app === 'dashboard' || app === 'admin';\nconst filterOptions = isAdmin\n    ? undefined\n    : {\n            level: PermissionLevel.Read,\n        };\n\nconst answers = computed(() => {\n    return props.value.getRecordAnswers();\n});\n\nconst recordsWithAnswers = computed(() => {\n    const records = props.category.filterRecords(props.value, filterOptions);\n\n    return records.map((record) => {\n        const answer = answers.value.get(record.id);\n        return {\n            record,\n            answer,\n            recordCheckboxAnswer: answer instanceof RecordCheckboxAnswer ? answer : null,\n            recordFileAnswer: answer instanceof RecordFileAnswer ? answer : null,\n        };\n    });\n});\n\nconst childCategories = computed(() => {\n    return props.category.filterChildCategories(props.value, filterOptions);\n});\n\nconst isAllCheckboxAnswers = computed(() => {\n    return recordsWithAnswers.value.every(({ recordCheckboxAnswer }) => recordCheckboxAnswer);\n});\n\n</script>\n","<template>\n    <div class=\"container\">\n        <hr>\n        <h2 class=\"style-with-button\">\n            <div>\n                {{ category.name }}\n                <slot name=\"title-suffix\" />\n            </div>\n            <div>\n                <slot name=\"buttons\" />\n            </div>\n        </h2>\n\n        <RecordCategoryAnswersBox :value=\"value\" :category=\"category\" :compact=\"compact\" />\n    </div>\n</template>\n\n<script lang=\"ts\" setup generic=\"T extends ObjectWithRecords\">\nimport { ObjectWithRecords, PermissionLevel, RecordCategory, RecordCheckboxAnswer } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { useAppContext } from '../../context';\nimport RecordCategoryAnswersBox from './RecordCategoryAnswersBox.vue';\n\nconst props = withDefaults(\n    defineProps<{\n        value: T;\n        category: RecordCategory;\n        compact?: boolean;\n    }>(),\n    {\n        compact: false,\n    },\n);\n\nconst app = useAppContext();\nconst isAdmin = app === 'dashboard' || app === 'admin';\nconst filterOptions = isAdmin\n    ? undefined\n    : {\n            level: PermissionLevel.Read,\n        };\n\nconst answers = computed(() => {\n    return props.value.getRecordAnswers();\n});\n\nconst recordsWithAnswers = computed(() => {\n    const records = props.category.filterRecords(props.value, filterOptions);\n\n    return records.map((record) => {\n        const answer = answers.value.get(record.id);\n        return {\n            record,\n            answer,\n            recordCheckboxAnswer: answer instanceof RecordCheckboxAnswer ? answer : null,\n        };\n    });\n});\n\nconst childCategories = computed(() => {\n    return props.category.filterChildCategories(props.value, filterOptions);\n});\n\n</script>\n","<template>\n    <ViewRecordCategoryAnswersBox :value=\"member\" :category=\"category\">\n        <template v-if=\"titleSuffix\" #title-suffix>\n            <span class=\"title-suffix hover-show\">\n                {{ titleSuffix }}\n            </span>\n        </template>\n    </ViewRecordCategoryAnswersBox>\n</template>\n\n<script setup lang=\"ts\">\nimport { PlatformMember, RecordCategory } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { useAppContext } from '../../../context/appContext';\nimport { useOrganization } from '../../../hooks';\nimport ViewRecordCategoryAnswersBox from '../../../records/components/ViewRecordCategoryAnswersBox.vue';\n\nconst props = defineProps<{\n    category: RecordCategory;\n    member: PlatformMember;\n}>();\n\nconst app = useAppContext();\nconst organization = useOrganization();\n\nconst owningOrganization = computed(() => {\n    return props.member.organizations.find(o => o.meta.recordsConfiguration.recordCategories.find(c => c.id === props.category.id));\n});\nconst titleSuffix = computed(() => {\n    if (app === 'registration') {\n        return '';\n    }\n\n    // Platform admins can see who owns the record category\n    if (owningOrganization.value && (!organization.value || owningOrganization.value.id !== organization.value.id)) {\n        return owningOrganization.value.name;\n    }\n\n    return '';\n});\n\n</script>\n","<template>\n    <div>\n        <ViewMemberRecordCategoryBox v-for=\"category of recordCategories\" :key=\"category.id\" :member=\"member\" :category=\"category\" />\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { PermissionLevel, PlatformMember, RecordCategory } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { useAuth } from '../../../hooks';\nimport ViewMemberRecordCategoryBox from './ViewMemberRecordCategoryBox.vue';\n\ndefineOptions({\n    inheritAttrs: false,\n});\n\nconst props = defineProps<{\n    member: PlatformMember;\n}>();\n\nconst auth = useAuth();\n\nconst recordCategories = computed(() => {\n    const checkPermissions = {\n        user: auth.user!,\n        level: PermissionLevel.Read,\n    };\n\n    const member = props.member;\n    const categories = member.getEnabledRecordCategories({\n        checkPermissions,\n    });\n\n    return RecordCategory.filterCategories(categories, member);\n});\n\n</script>\n","<template>\n    <STListItem v-long-press=\"editRegistration\" v-color=\"registrationOrganization && (app !== 'dashboard' || !organization || registrationOrganization.id !== organization.id) ? registrationOrganization.meta.color : null\" :selectable=\"isEditable\" class=\"hover-box\" :class=\"{'theme-secundary': !registration.deactivatedAt && registration.isTrial, 'theme-error': !!registration.deactivatedAt}\" @contextmenu.prevent=\"editRegistration($event)\" @click.prevent=\"editRegistration($event)\">\n        <template #left>\n            <GroupIconWithWaitingList :group=\"group\" :icon=\"registration.deactivatedAt ? 'disabled error' : (registration.isTrial? 'trial secundary' : '')\" :organization=\"registrationOrganization && (app !== 'dashboard' || !organization || registrationOrganization.id !== organization.id) ? registrationOrganization : null\" />\n        </template>\n        <p v-if=\"registrationOrganization && (app !== 'dashboard' || !organization || registrationOrganization.id !== organization.id)\" class=\"style-title-prefix-list\">\n            {{ registrationOrganization.name }}\n        </p>\n        <p v-else-if=\"registration.deactivatedAt\" class=\"style-title-prefix-list\">\n            {{ $t('9f80f234-d51c-4ef2-ba59-fc55fb1044c4') }}\n        </p>\n        <p v-else-if=\"registration.isTrial\" class=\"style-title-prefix-list\">\n            {{ $t('7e75723b-d09c-4722-942f-3ae2777de14c') }}\n        </p>\n\n        <h3 class=\"style-title-list\">\n            <span>{{ group.settings.name }}</span>\n        </h3>\n        <p v-if=\"defaultAgeGroup && group.settings.name !== defaultAgeGroup && app === 'admin'\" class=\"style-description-small\" v-text=\"defaultAgeGroup\" />\n\n        <p v-if=\"registration.description\" class=\"style-description-small pre-wrap\" v-text=\"registration.description\" />\n\n        <p v-if=\"registration.startDate\" class=\"style-description-small\">\n            Gestart op {{ formatDate(registration.startDate) }}\n        </p>\n\n        <p v-if=\"registration.registeredAt && !(registration.startDate && formatDate(registration.registeredAt) === formatDate(registration.startDate))\" class=\"style-description-small\">\n            Ingeschreven op {{ formatDate(registration.registeredAt) }}\n        </p>\n        <p v-if=\"registration.deactivatedAt\" class=\"style-description-small\">\n            Uitgeschreven op {{ formatDate(registration.deactivatedAt) }}\n        </p>\n        <p v-if=\"registration.isTrial && registration.trialUntil\" class=\"style-description-small\">\n            Proefperiode tot {{ formatDate(registration.trialUntil) }}\n        </p>\n        <p v-else-if=\"registration.startDate && registration.trialUntil\" class=\"style-description-small\">\n            Had een proefperiode van {{ Formatter.dateNumber(registration.startDate) }} tot {{ Formatter.dateNumber(registration.trialUntil) }}\n        </p>\n\n        <p v-if=\"!registration.registeredAt && registration.canRegister\" class=\"style-description-small\">\n            Uitgenodigd om in te schrijven\n        </p>\n\n        <p v-if=\"registration.payingOrganizationId\" class=\"style-description-small\">\n            Via groepsinschrijving\n        </p>\n\n        <template v-if=\"isEditable\" #right>\n            <span class=\"icon arrow-down-small gray\" />\n        </template>\n    </STListItem>\n</template>\n\n<script lang=\"ts\" setup>\nimport { PlatformMember, Registration } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed, getCurrentInstance } from 'vue';\nimport { useAppContext } from '../../../context/appContext';\nimport { useNow, useOrganization, usePlatform } from '../../../hooks';\nimport GroupIconWithWaitingList from '../group/GroupIconWithWaitingList.vue';\n\nconst props = defineProps<{\n    registration: Registration;\n    member: PlatformMember;\n}>();\nconst emit = defineEmits(['edit']);\nconst now = useNow();\n\nconst instance = getCurrentInstance();\nconst organization = useOrganization();\nconst platform = usePlatform();\nconst app = useAppContext();\nconst isDeactivated = computed(() => props.registration.deactivatedAt !== null);\nconst isEditable = computed(() => {\n    if (isDeactivated.value) {\n        return false;\n    }\n    return !!instance?.vnode.props?.onEdit;\n});\nconst group = computed(() => {\n    return props.registration.group;\n});\nconst registrationOrganization = computed(() => {\n    return props.member.organizations.find(o => o.id === group.value.organizationId);\n});\n\nconst defaultAgeGroup = computed(() => {\n    if (!group.value.defaultAgeGroupId) {\n        return 'Geen standaard leeftijdsgroep';\n    }\n    return platform.value.config.defaultAgeGroups.find(ag => ag.id === group.value.defaultAgeGroupId)?.name;\n});\n\nfunction editRegistration(event: any) {\n    if (isDeactivated.value) {\n        return;\n    }\n    emit('edit', event);\n}\n</script>\n","<template>\n    <article class=\"container\">\n        <hr>\n        <h2 class=\"style-with-button\">\n            <button v-long-press=\"(e) => switchCycle(e)\" type=\"button\" class=\"button\" @click.prevent=\"switchCycle\" @contextmenu.prevent=\"switchCycle\">\n                {{ visibleRegistrationsTitle }}\n                <span class=\"icon arrow-down-small\" />\n            </button>\n            <div>\n                <button v-if=\"hasWrite\" v-long-press=\"(e) => addRegistration(e)\" type=\"button\" class=\"button icon add gray\" @click.prevent=\"addRegistration\" @contextmenu.prevent=\"addRegistration\" />\n            </div>\n        </h2>\n\n        <button v-if=\"!member.family.checkout.cart.isEmpty && app === 'registration'\" class=\"info-box selectable icon\" type=\"button\" @click=\"openCart\">\n            <span>Er staan inschrijvingen klaar in je mandje. Reken ze af om ze definitief te maken.</span>\n            <span class=\"button icon arrow-right-small\" />\n        </button>\n        <template v-else>\n            <p v-if=\"visibleRegistrations.length === 0 && period.id === defaultPeriod.id\" class=\"info-box\">\n                {{ member.patchedMember.firstName }} is niet ingeschreven\n            </p>\n            <p v-else-if=\"visibleRegistrations.length === 0\" class=\"info-box\">\n                {{ member.patchedMember.firstName }} was niet ingeschreven\n            </p>\n        </template>\n\n        <STList v-if=\"hasWrite && app !== 'registration'\">\n            <ViewMemberRegistrationRow v-for=\"registration in visibleRegistrations\" :key=\"registration.id\" :member=\"member\" :registration=\"registration\" @edit=\"(e) => editRegistration(registration, e)\" />\n        </STList>\n        <STList v-else>\n            <ViewMemberRegistrationRow v-for=\"registration in visibleRegistrations\" :key=\"registration.id\" :member=\"member\" :registration=\"registration\" />\n        </STList>\n\n        <footer v-if=\"hasDeleted && !showDeleted\" class=\"style-button-bar\">\n            <button class=\"button text\" type=\"button\" @click=\"showDeleted = true;\">\n                Toon beëindigde inschrijvingen\n            </button>\n        </footer>\n    </article>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ComponentWithProperties, useDismiss, usePresent } from '@simonbackx/vue-app-navigation';\nimport { useOrganizationManager, usePlatformManager, useRequestOwner } from '@stamhoofd/networking';\nimport { LimitedFilteredRequest, PermissionLevel, PlatformMember, Registration, RegistrationPeriod } from '@stamhoofd/structures';\nimport { Sorter } from '@stamhoofd/utility';\nimport { Ref, computed, ref } from 'vue';\nimport { useAppContext } from '../../../context/appContext';\nimport { GlobalEventBus } from '../../../EventBus';\nimport { useMembersObjectFetcher } from '../../../fetchers/useMembersObjectFetcher';\nimport { useAuth, useOrganization, usePlatform } from '../../../hooks';\nimport { ContextMenu, ContextMenuItem } from '../../../overlays/ContextMenu';\nimport { Toast } from '../../../overlays/Toast';\nimport { TableActionSelection } from '../../../tables';\nimport TableActionsContextMenu from '../../../tables/TableActionsContextMenu.vue';\nimport { useChooseGroupForMember } from '../../checkout';\nimport { useRegistrationActionBuilder } from '../../classes/RegistrationActionBuilder';\nimport ViewMemberRegistrationRow from './ViewMemberRegistrationRow.vue';\n\nconst props = defineProps<{\n    member: PlatformMember;\n}>();\n\nconst visibleRegistrationsTitle = computed(() => {\n    return period.value.name;\n});\n\nconst auth = useAuth();\nconst present = usePresent();\nconst organization = useOrganization();\nconst organizationManager = useOrganizationManager();\nconst platform = usePlatform();\n\n// If the organization of this member already moved to the next period, select it by default\nconst defaultPeriod = organization.value?.period?.period ?? props.member.filterOrganizations({ currentPeriod: true })[0]?.period?.period ?? props.member.filterOrganizations({})[0]?.period?.period ?? platform.value.period;\nconst period = ref(defaultPeriod) as Ref<RegistrationPeriod>;\n\nconst platformManager = usePlatformManager();\nconst owner = useRequestOwner();\nconst showDeleted = ref(false);\nconst app = useAppContext();\nconst hasDeleted = computed(() => {\n    return filteredRegistrations.value.some(r => r.deactivatedAt);\n});\nconst dismiss = useDismiss();\n\nplatformManager.value.loadPeriods(false, true, owner).catch(console.error);\n\nconst hasWrite = computed(() => {\n    return !period.value.locked && auth.canAccessPlatformMember(props.member, PermissionLevel.Write);\n});\n\nconst filteredRegistrations = computed(() => {\n    return props.member.patchedMember.registrations.filter((r) => {\n        if (!auth.hasSomePlatformAccess() && organization.value && r.organizationId !== organization.value.id && r.payingOrganizationId !== organization.value.id) {\n            return false;\n        }\n        if (r.group.periodId !== period.value.id) {\n            return false;\n        }\n        return true;\n    }).sort((a, b) =>\n        Sorter.stack(\n            Sorter.byDateValue(a.deactivatedAt ?? new Date(2034522839 * 1000), b.deactivatedAt ?? new Date(2034522839 * 1000)),\n            Sorter.byDateValue(b.registeredAt ?? b.createdAt, a.registeredAt ?? a.createdAt),\n\n        ),\n    );\n});\nconst visibleRegistrations = computed(() => {\n    if (!showDeleted.value) {\n        return filteredRegistrations.value.filter(r => !r.deactivatedAt);\n    }\n    return filteredRegistrations.value;\n});\n\nconst chooseGroupForMember = useChooseGroupForMember();\n\nasync function addRegistration() {\n    await chooseGroupForMember({ member: props.member, displayOptions: { action: 'present', modalDisplayStyle: 'popup' } });\n}\n\nasync function openCart() {\n    await dismiss({ force: true });\n    await GlobalEventBus.sendEvent('selectTabByName', 'mandje');\n}\n\nconst buildActions = useRegistrationActionBuilder();\nconst objectFetcher = useMembersObjectFetcher();\n\nasync function editRegistration(registration: Registration, event: MouseEvent) {\n    const builder = buildActions({\n        registration,\n        member: props.member,\n    });\n\n    const el = event.currentTarget! as HTMLElement;\n    const bounds = el.getBoundingClientRect();\n\n    const periods = await organizationManager.value.loadPeriods(false, true, owner).catch(console.error);\n    const selectedOrganizationRegistrationPeriod = periods?.organizationPeriods.find(p => p.period.id === registration.group.periodId);\n    const actions = builder.getActions({ selectedOrganizationRegistrationPeriod });\n\n    if (actions.filter(a => a.enabled).length === 0) {\n        Toast.warning('Er zijn geen acties beschikbaar voor deze inschrijving').show();\n        return;\n    }\n\n    const selection: TableActionSelection<PlatformMember> = {\n        filter: new LimitedFilteredRequest({\n            filter: {\n                id: props.member.id,\n            },\n            limit: 2,\n        }),\n        fetcher: objectFetcher, // todo\n        markedRows: new Map([[props.member.id, props.member]]),\n        markedRowsAreSelected: true,\n    };\n\n    const displayedComponent = new ComponentWithProperties(TableActionsContextMenu, {\n        x: bounds.right,\n        y: bounds.bottom,\n        xPlacement: 'left',\n        yPlacement: 'bottom',\n        actions,\n        selection,\n    });\n    await present(displayedComponent.setDisplayStyle('overlay'));\n}\n\nfunction switchCycle(event: MouseEvent) {\n    const menu = new ContextMenu([\n        (platform.value.periods ?? []).slice(0, 5).map((p) => {\n            return new ContextMenuItem({\n                name: p.name,\n                selected: p.id === period.value.id,\n                action: () => {\n                    period.value = p;\n                    return true;\n                },\n            });\n        }),\n    ]);\n    menu.show({ button: event.currentTarget as HTMLElement, yOffset: -10 }).catch(console.error);\n}\n\n</script>\n","<template>\n    <div v-if=\"securityCode\" class=\"hover-box container\">\n        <hr>\n        <h2 class=\"style-with-button\">\n            <div>Beveiligingscode</div>\n            <div v-if=\"shouldShowResetSecurityCode\">\n                <button type=\"button\" class=\"button icon retry hover-show\" @click=\"renewSecurityCode\" />\n            </div>\n        </h2>\n        <p>Gebruik deze code om een account toegang te geven tot dit lid als hun e-mailadres nog niet in het systeem zit. Deze staat ook altijd onderaan alle e-mails naar leden/ouders.</p>\n\n        <p class=\"style-description\">\n            <code v-copyable class=\"style-inline-code style-copyable\">{{ Formatter.spaceString(securityCode, 4, '\\u2011') }}</code>\n        </p>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { MemberDetails, MemberWithRegistrationsBlob, PermissionLevel, PlatformMember } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed, ref } from 'vue';\nimport { useAuth } from '../../../hooks';\nimport { CenteredMessage } from '../../../overlays/CenteredMessage';\nimport { Toast } from '../../../overlays/Toast';\nimport { usePlatformFamilyManager } from '../../PlatformFamilyManager';\n\ndefineOptions({\n    inheritAttrs: false\n})\nconst props = defineProps<{\n    member: PlatformMember\n}>()\nconst auth = useAuth()\nconst isRenewingSecurityCode = ref(false);\nconst platformFamilyManager = usePlatformFamilyManager()\nconst $t = useTranslate();\n\nconst shouldShowResetSecurityCode = computed(() => {\n    return auth.canAccessPlatformMember(props.member, PermissionLevel.Full);\n})\n\nconst securityCode = computed(() => props.member.patchedMember.details.securityCode);\n\nasync function renewSecurityCode() {\n    if(!await CenteredMessage.confirm(\n        $t('db2fa1f9-4a3d-4f03-ad7d-fba479452d14'),\n        $t('3341eabb-512a-40f9-8679-6420ae92f1c6'),\n        $t('d9870397-d89a-47ec-8ae6-0601e49b9116'))) {\n        return;\n    }\n\n    if (isRenewingSecurityCode.value) {\n        return\n    }\n\n    isRenewingSecurityCode.value = true;\n    \n    try {\n        const id = props.member.id\n        const patch = MemberWithRegistrationsBlob.patch({\n            id,\n            details: MemberDetails.patch({\n                securityCode: null\n            })\n        });\n\n        const arr = new PatchableArray() as PatchableArrayAutoEncoder<MemberWithRegistrationsBlob>\n        arr.addPatch(patch)\n        await platformFamilyManager.isolatedPatch([props.member], arr)\n        Toast.success($t('0c427a9d-2485-498f-bb88-a420843745f4')).show()\n    } catch (e) {\n        Toast.fromError(e).show()\n    }\n\n    isRenewingSecurityCode.value = false;\n}\n</script>\n","<template>\n    <dt v-if=\"label\">{{ label }}</dt>\n    <dd  class=\"with-icons hover-box\" :class=\"{button: $context.auth.hasFullAccess(), 'no-label': label === undefined}\">\n        <span v-copyable>\n            <template v-if=\"Array.isArray(value)\">\n                <template v-for=\"(line, index) of value\">\n                    {{ line }}\n                    <br v-if=\"index < value.length - 1\">\n                </template>\n            </template>\n            <template v-else>\n                {{ value }}\n            </template>\n        </span>\n        <Transition name=\"fade\" mode=\"out-in\">\n            <Spinner v-if =\"showLoader\"/>\n            <span v-else-if=\"$context.auth.hasFullAccess()\"\n                class=\"icon hover-show\" :class=\"[icon, color]\"\n                @click=\"clickHandler\"/>\n        </Transition>\n    </dd>\n</template>\n\n<script setup lang=\"ts\" generic=\"T extends string | string[]\">\nimport { Spinner } from '@stamhoofd/components';\nimport { computed, ref } from 'vue';\nconst props = defineProps<{label?: string, value: T, icon: string, color?: string, loading?: boolean, onClick?: () => Promise<void>}>();\nconst emits = defineEmits<{(e: 'clickButton'): void}>();\n\nconst isLoading = ref(false);\nconst showLoader = computed(() => props.loading || isLoading.value);\n\nfunction clickHandler() {\n    if(showLoader.value) return;\n    emits('clickButton');\n    const onDelete = props.onClick;\n    if(onDelete) {\n        isLoading.value = true;\n        onDelete().finally(() => isLoading.value = false);\n    }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.fade-enter-active,\n.fade-leave-active {\n  transition: opacity 0.2s ease !important;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n  opacity: 0 !important;\n}\n\n.no-label {\n    grid-column: span 2;\n}\n</style>\n","<template>\n    <div v-if=\"shouldShow\">\n        <div class=\"hover-box container\">\n            <hr>\n            <h2 class=\"style-with-button\"><div>Niet-geverifieerde gegevens</div></h2>\n            <p>Deze gegevens konden niet automatisch toegewezen worden aan het lid of aan een ouder.</p>\n            <dl class=\"details-grid hover\">\n                <template v-for=\"(email, index) of unverifiedEmails\">\n                    <MemberDetailWithButton\n                        :label=\"formatWithIndex('E-mailadres', index, unverifiedEmails)\"\n                        :value=\"email\" icon=\"trash\" color=\"gray\"\n                        :onClick=\"() => deleteEmail(email)\"/>\n                </template>\n\n                <template v-for=\"(phone, index) of unverifiedPhones\">\n                    <MemberDetailWithButton\n                        :label=\"formatWithIndex($t('90d84282-3274-4d85-81cd-b2ae95429c34'), index, unverifiedPhones)\"\n                        :value=\"phone\" icon=\"trash\" color=\"gray\"\n                        :onClick=\"() => deletePhone(phone)\"/>\n                </template>\n\n                <template v-for=\"(address, index) of unverifiedAddresses\">\n                    <MemberDetailWithButton\n                        :label=\"formatWithIndex('Adres', index, unverifiedAddresses)\"\n                        :value=\"addressToLines(address)\" icon=\"trash\" color=\"gray\"\n                        :onClick=\"() => deleteAddress(address)\"/>\n                </template>\n            </dl>\n        </div>  \n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { AutoEncoder, PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { Address, CountryHelper, MemberDetails, MemberWithRegistrationsBlob, PlatformMember } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { useCountry } from '../../../hooks';\nimport { CenteredMessage } from '../../../overlays/CenteredMessage';\nimport { Toast } from '../../../overlays/Toast';\nimport { usePlatformFamilyManager } from '../../PlatformFamilyManager';\nimport MemberDetailWithButton from '../detail/MemberDetailWithButton.vue';\n\ndefineOptions({\n    inheritAttrs: false\n})\n\nconst props = defineProps<{\n    member: PlatformMember\n}>();\n\nconst platformFamilyManager = usePlatformFamilyManager();\n\nconst currentCountry = useCountry();\n\nconst memberDetails = computed(() => props.member.patchedMember.details);\nconst unverifiedAddresses = computed(() => memberDetails.value.unverifiedAddresses ?? []);\nconst unverifiedPhones = computed(() => memberDetails.value.unverifiedPhones ?? []);\nconst unverifiedEmails = computed(() => memberDetails.value.unverifiedEmails ?? []);\n\nconst shouldShow = computed(() => unverifiedAddresses.value.length > 0 || unverifiedPhones.value.length > 0 || unverifiedEmails.value.length > 0);\n\nfunction formatWithIndex<T>(label: string, index: number, array: T[]) {\n    if(array.length === 1) return label;\n    return `${label} ${index + 1}`\n}\n\nfunction addressToLines(address: Address): string[] {\n    const lines = [`${address.street} ${address.number}`, `${address.postalCode} ${address.city}`];\n    if(address.country !== currentCountry.value) {\n        lines.push(CountryHelper.getName(address.country));\n    }\n    return lines;\n}\n\nasync function deletePhone(phone: string) {\n    deleteFromMemberDetails({\n        valueToDelete: phone,\n        confirmMessage: `Weet je zeker dat je het gsm nummer '${phone}' wilt verwijderen?`,\n        key: 'unverifiedPhones'\n    });\n}\n\nasync function deleteEmail(email: string) {\n    deleteFromMemberDetails({\n        valueToDelete: email,\n        confirmMessage: `Weet je zeker dat je het e-mailadres '${email}' wilt verwijderen?`,\n        key: 'unverifiedEmails'\n    });\n}\n\nasync function deleteAddress(address: Address) {\n    deleteFromMemberDetails({\n        valueToDelete: address,\n        confirmMessage: `Weet je zeker dat je het adres '${address}' wilt verwijderen?`,\n        key: 'unverifiedAddresses'\n    });\n}\n\nasync function deleteFromMemberDetails<T extends string | number | (AutoEncoder & {id: string})>({valueToDelete, key,confirmMessage, confirmButtonText}: {valueToDelete: T, confirmMessage: string, confirmButtonText?: string, key: keyof MemberDetails}) {\n    const isConfirm = await CenteredMessage.confirm(confirmMessage, confirmButtonText ?? 'Verwijderen');\n    if(isConfirm) {\n        const member = props.member;\n        const membersPatch = new PatchableArray() as PatchableArrayAutoEncoder<MemberWithRegistrationsBlob>;\n\n        let detailsPatch: PatchableArray<any, any, any>;\n            \n        if(typeof valueToDelete === 'string' || typeof valueToDelete === 'number') {\n            const arrayPatch = new PatchableArray<typeof valueToDelete, typeof valueToDelete, typeof valueToDelete>();\n            arrayPatch.addDelete(valueToDelete);\n            detailsPatch = arrayPatch;\n        } else {\n            const arrayPatch = new PatchableArray() as PatchableArrayAutoEncoder<AutoEncoder & {id: string}>;\n            arrayPatch.addDelete(valueToDelete.id);\n            detailsPatch = arrayPatch;\n        }\n\n        membersPatch.addPatch(MemberWithRegistrationsBlob.patch({\n            id: member.id,\n            details: MemberDetails.patch({[key]: detailsPatch})\n        }));\n    \n        try {\n            await platformFamilyManager.isolatedPatch([member], membersPatch);\n        } catch(error) {\n            Toast.fromError(error).show();\n        }\n    }\n}\n</script>\n","<template>\n    <div v-if=\"hasWarnings\" class=\"hover-box container\">\n        <hr>\n        <ul class=\"member-records\">\n            <li\n                v-for=\"warning in sortedWarnings\"\n                :key=\"warning.id\"\n                :class=\"{ [warning.type]: true }\"\n            >\n                <span :class=\"'icon '+warning.icon\" />\n                <span class=\"text\">{{ warning.text }}</span>\n            </li>\n        </ul>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { MemberPlatformMembership, MembershipStatus, PermissionLevel, PlatformMember, RecordAnswer, RecordWarning, RecordWarningType } from '@stamhoofd/structures';\nimport { Formatter, Sorter } from '@stamhoofd/utility';\nimport { computed } from 'vue';\nimport { useDataPermissionSettings, useFinancialSupportSettings } from '../../../groups';\nimport { useAuth } from '../../../hooks';\nimport { useIsPropertyEnabled } from '../../hooks/useIsPropertyRequired';\n\ndefineOptions({\n    inheritAttrs: false,\n});\n\nconst props = defineProps<{\n    member: PlatformMember;\n}>();\nconst auth = useAuth();\nconst isPropertyEnabled = useIsPropertyEnabled(computed(() => props.member), false);\nconst $t = useTranslate();\n\n// Possible the member didn't fill in the answers yet\nconst autoCompletedAnswers = computed(() => {\n    const recordCategories = props.member.getEnabledRecordCategories({\n        checkPermissions: {\n            user: auth.user!,\n            level: PermissionLevel.Read,\n        },\n    });\n    const allRecords = recordCategories.flatMap(category => category.getAllFilteredRecords(props.member));\n    const answerClone: typeof props.member.patchedMember.details.recordAnswers = new Map();\n\n    for (const record of allRecords) {\n        const answer = props.member.patchedMember.details.recordAnswers.get(record.id);\n        if (!answer) {\n            answerClone.set(record.id, RecordAnswer.createDefaultAnswer(record));\n        }\n        else {\n            answerClone.set(record.id, answer);\n        }\n    }\n\n    return answerClone;\n});\n\nconst { financialSupportSettings } = useFinancialSupportSettings();\nconst { dataPermissionSettings } = useDataPermissionSettings();\n\nconst warnings = computed(() => {\n    const warnings: RecordWarning[] = [];\n\n    for (const answer of autoCompletedAnswers.value.values()) {\n        warnings.push(...answer.getWarnings());\n    }\n\n    if (isPropertyEnabled('financialSupport')) {\n        if (props.member.patchedMember.details.requiresFinancialSupport && props.member.patchedMember.details.requiresFinancialSupport.value) {\n            warnings.push(RecordWarning.create({\n                text: financialSupportSettings.value.warningText,\n                type: RecordWarningType.Error,\n            }));\n        }\n    }\n\n    if (isPropertyEnabled('dataPermission')) {\n        if (props.member.patchedMember.details.dataPermissions && !props.member.patchedMember.details.dataPermissions.value) {\n            warnings.push(RecordWarning.create({\n                text: dataPermissionSettings.value.warningText,\n                type: RecordWarningType.Error,\n            }));\n        }\n    }\n\n    if (props.member.membershipStatus === MembershipStatus.Trial) {\n        warnings.push(RecordWarning.create({\n            text: $t('29343dad-93c5-4e72-a6d5-3960cfbfcf42'),\n            type: RecordWarningType.Info,\n        }));\n    }\n\n    if (props.member.membershipStatus === MembershipStatus.Inactive) {\n        // todo: check when temporal membership\n        const nextMembership = getNextMembership();\n\n        if (nextMembership) {\n            warnings.push(RecordWarning.create({\n                text: $t('880e4cac-5a7e-4d6d-80ad-c5472a005df6', { date: Formatter.date(nextMembership.startDate) }),\n                type: RecordWarningType.Warning,\n            }));\n        }\n        else {\n            warnings.push(RecordWarning.create({\n                text: $t('60871aaf-1b90-4a7c-a755-a4aeb0585a8e'),\n                type: RecordWarningType.Error,\n            }));\n        }\n    }\n\n    if (props.member.membershipStatus === MembershipStatus.Expiring) {\n        warnings.push(RecordWarning.create({\n            text: $t('1af084bf-42d6-4a59-a7da-d1e87c6dba8e'),\n            type: RecordWarningType.Warning,\n        }));\n    }\n\n    return warnings;\n});\nconst hasWarnings = computed(() => warnings.value.length > 0);\nconst sortedWarnings = computed(() => warnings.value.slice().sort(RecordWarning.sort));\n\nconst getNextMembership = (): MemberPlatformMembership | null => {\n    const now = new Date().getTime();\n    const nextMemberships = [...props.member.member.platformMemberships]\n        .filter(m => m.startDate.getTime() >= now)\n        .sort((a, b) => Sorter.stack(\n            Sorter.byDateValue(b.startDate, a.startDate),\n            Sorter.byDateValue(b.createdAt, a.createdAt),\n        ));\n\n    if (nextMemberships.length > 0) {\n        return nextMemberships[0];\n    }\n\n    return null;\n};\n</script>\n","<template>\n    <STListItem v-color=\"responsibilityOrganization ? responsibilityOrganization.meta.color : null\" class=\"hover-box right-stack\">\n        <template #left>\n            <ResponsibilityIcon v-if=\"resp\" :responsibility=\"resp\" :group=\"group\" :organization=\"responsibilityOrganization\" />\n        </template>\n\n        <p v-if=\"responsibilityOrganization && (app !== 'dashboard' || !organization || responsibilityOrganization.id !== organization.id)\" class=\"style-title-prefix-list\">\n            {{ responsibilityOrganization.name }}\n        </p>\n\n        <h3 class=\"style-title-list\">\n            {{ name }}\n        </h3>\n\n        <p v-if=\"responsibility.startDate\" class=\"style-description-small\">\n            Sinds {{ formatDate(responsibility.startDate, true) }}\n        </p>\n\n        <p v-if=\"responsibility.endDate\" class=\"style-description-small\">\n            Loopt automatisch af op {{ formatDateTime(responsibility.endDate) }}\n        </p>\n\n        <template #right>\n            <span v-if=\"!hasRegistration\" v-tooltip=\"$t('71b37c1d-7a2d-41c9-a6c0-fcd9c69a2492', {name: member.patchedMember.firstName})\" class=\"icon warning yellow\" />\n        </template>\n    </STListItem>\n</template>\n\n<script lang=\"ts\" setup>\nimport { MemberResponsibilityRecord, PlatformMember } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { useAppContext } from '../../../context/appContext';\nimport { useOrganization, usePlatform } from '../../../hooks';\nimport ResponsibilityIcon from '../ResponsibilityIcon.vue';\n\nconst props = defineProps<{\n    responsibility: MemberResponsibilityRecord;\n    member: PlatformMember;\n}>();\n\nconst organization = useOrganization();\nconst platform = usePlatform();\n\nconst app = useAppContext();\n\nconst responsibilityOrganization = computed(() => {\n    return props.member.organizations.find(o => o.id === props.responsibility.organizationId);\n});\n\nconst group = computed(() => {\n    return props.responsibility.group;\n});\n\nconst resp = computed(() => {\n    return platform.value.config.responsibilities.find(rr => rr.id === props.responsibility.responsibilityId)\n        ?? responsibilityOrganization.value?.privateMeta?.responsibilities?.find(rr => rr.id === props.responsibility.responsibilityId)\n        ?? null;\n});\n\nconst name = computed(() => {\n    const suffix = group.value ? ` van ${group.value.settings.name}` : (props.responsibility.groupId ? ' van onbekende groep' : '');\n    return (resp.value?.name ?? 'Verwijderde functie') + suffix;\n});\n\nconst hasRegistration = computed(() => {\n    return props.member.filterRegistrations({ currentPeriod: true, organizationId: responsibilityOrganization.value?.id ?? undefined }).length > 0;\n});\n</script>\n","<template>\n    <div v-if=\"hasResponsibilities && (sortedResponsibilities.length || auth.hasFullAccess())\" class=\"hover-box container\">\n        <hr>\n        <h2 class=\"style-with-button\">\n            <div>Functies</div>\n            <div class=\"hover-show\">\n                <button v-if=\"auth.hasFullAccess()\" type=\"button\" class=\"button icon edit gray\" @click.prevent=\"editResponsibilities\" />\n            </div>\n        </h2>\n\n        <button v-if=\"sortedResponsibilities.length === 0\" class=\"info-box selectable with-button\" type=\"button\" @click=\"editResponsibilities\">\n            {{ props.member.patchedMember.details.firstName }} heeft geen functies\n\n            <span class=\"button text\">\n                Bewerken\n            </span>\n        </button>\n\n        <STList v-else>\n            <ViewMemberResponsibilityRow v-for=\"responsibility in sortedResponsibilities\" :key=\"responsibility.id\" :member=\"member\" :responsibility=\"responsibility\" />\n        </STList>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { MemberResponsibilityRecord, PlatformMember } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { useAuth, useOrganization, usePlatform } from '../../../hooks';\nimport { useMemberActions } from '../../classes/MemberActionBuilder';\nimport ViewMemberResponsibilityRow from './ViewMemberResponsibilityRow.vue';\n\ndefineOptions({\n    inheritAttrs: false,\n});\n\nconst props = defineProps<{\n    member: PlatformMember;\n}>();\n\nconst platform = usePlatform();\nconst organization = useOrganization();\nconst auth = useAuth();\nconst hasResponsibilities = computed(() => ((platform.value.config.responsibilities.length > 0 || (organization.value && organization.value.privateMeta?.responsibilities?.length)) && props.member.patchedMember.details.defaultAge >= 16) || responsibilities.value.length);\nconst responsibilities = computed(() => props.member.getResponsibilities({ organization: organization.value ?? undefined }));\nconst buildActions = useMemberActions();\n\nconst nationalResponsibilities = computed(() => {\n    return platform.value.config.responsibilities.filter(r => !r.organizationBased);\n});\n\nconst organizationResponsibilities = computed(() => {\n    return platform.value.config.responsibilities.filter(r => r.organizationBased);\n});\n\nfunction getResponsibilityIndex(responsibility: MemberResponsibilityRecord) {\n    let index = nationalResponsibilities.value.findIndex(r => r.id === responsibility.responsibilityId);\n    if (index !== -1) {\n        return index;\n    }\n\n    index = organizationResponsibilities.value.findIndex(r => r.id === responsibility.responsibilityId);\n    if (index !== -1) {\n        return index + nationalResponsibilities.value.length;\n    }\n\n    const org = responsibility.organizationId ? props.member.organizations.find(o => o.id === responsibility.organizationId) : null;\n    if (org && org.privateMeta) {\n        const organizationIndex = org.privateMeta.responsibilities.findIndex(r => r.id === responsibility.responsibilityId);\n        if (organizationIndex !== -1) {\n            return organizationIndex + platform.value.config.responsibilities.length;\n        }\n        return org.privateMeta.responsibilities.length + platform.value.config.responsibilities.length;\n    }\n\n    return platform.value.config.responsibilities.length;\n}\n\nconst sortedResponsibilities = computed(() => {\n    // Sort based on index in platform.value.config.responsibilities, followed by index in organization.value.privateMeta.responsibilities\n    return responsibilities.value.slice().sort((a, b) => {\n        return getResponsibilityIndex(a) - getResponsibilityIndex(b);\n    });\n});\n\nasync function editResponsibilities() {\n    await buildActions().editResponsibilities(props.member);\n}\n</script>\n","<template>\n    <div class=\"member-view-details split\">\n        <div>\n            <ViewMemberWarningsBox v-if=\"isMobile\" :member=\"member\" />\n            <ViewMemberGeneralBox :member=\"member\" />\n            <ViewMemberResponsibilitiesBox :member=\"member\" />\n            <ViewMemberRegistrationsBox :member=\"member\" />\n            <ViewMemberUnverifiedBox :member=\"member\" />\n            <ViewMemberNotesBox :member=\"member\" />\n            <ViewMemberParentsBox :member=\"member\" />\n            <ViewMemberEmergencyContactsBox :member=\"member\" />\n            <ViewMemberRecordCategoriesBox :member=\"member\" />\n        </div>\n\n        <div>\n            <ViewMemberWarningsBox v-if=\"!isMobile\" :member=\"member\" />\n            <ViewMemberAccountsBox :member=\"member\" />\n            <ViewMemberFamilyBox :member=\"member\" />\n            <ViewMemberSecurityCodeBox :member=\"member\" />\n        </div>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useIsMobile, usePlatformFamilyManager } from '@stamhoofd/components';\nimport { PlatformMember } from '@stamhoofd/structures';\nimport { onMounted } from 'vue';\nimport { ViewMemberAccountsBox, ViewMemberEmergencyContactsBox, ViewMemberFamilyBox, ViewMemberGeneralBox, ViewMemberNotesBox, ViewMemberParentsBox, ViewMemberRecordCategoriesBox, ViewMemberRegistrationsBox, ViewMemberSecurityCodeBox, ViewMemberUnverifiedBox, ViewMemberWarningsBox } from '../components/view';\nimport ViewMemberResponsibilitiesBox from '../components/view/ViewMemberResponsibilitiesBox.vue';\n\nconst isMobile = useIsMobile();\n\nconst props = defineProps<{\n    member: PlatformMember;\n}>();\n\nconst platformFamilyManager = usePlatformFamilyManager();\n\nonMounted(() => {\n    platformFamilyManager.loadFamilyMembers(props.member, { shouldRetry: true }).catch(console.error);\n});\n</script>\n","<template>\n    <div class=\"member-payments-view\">\n        <main class=\"container\">\n            <p v-if=\"member.patchedMember.details.requiresFinancialSupport && member.patchedMember.details.requiresFinancialSupport.value\" class=\"warning-box\">\n                {{ financialSupportWarningText }}\n            </p>\n\n            <ReceivableBalanceBox :item=\"tmpItem\" :member=\"member\" />\n        </main>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ReceivableBalanceBox, useAuth, useFinancialSupportSettings, useOrganization } from '@stamhoofd/components';\nimport { PermissionLevel, PlatformMember, ReceivableBalance, ReceivableBalanceObject, ReceivableBalanceType } from '@stamhoofd/structures';\nimport { computed } from 'vue';\n\nconst props = defineProps<{\n    member: PlatformMember;\n}>();\n\nconst organization = useOrganization();\n\nconst tmpItem = ReceivableBalance.create({\n    organizationId: organization.value!.id,\n    objectType: ReceivableBalanceType.member,\n    object: ReceivableBalanceObject.create({\n        id: props.member.id,\n    }),\n});\nconst auth = useAuth();\nconst { financialSupportSettings } = useFinancialSupportSettings();\n\nconst financialSupportWarningText = computed(() => {\n    return financialSupportSettings.value.warningText;\n});\n\nconst hasWrite = computed(() => {\n    return auth.canAccessMemberPayments(props.member, PermissionLevel.Write);\n});\n\n</script>\n","<template>\n    <SaveView :title=\"title\" :loading=\"loading\" :save-text=\"saveText\" :disabled=\"!selectedOrganization\" @save=\"save\">\n        <h1>{{ title }}</h1>\n\n        <p v-if=\"availableOrganizations.length === 0\" class=\"warning-box\">\n            {{ $t('ec0c482e-0528-499f-82fa-b081bf708ded') }}\n        </p>\n        <p v-if=\"availableMembershipTypes.length === 0\" class=\"warning-box\">\n            {{ $t('d3a424d0-f851-48f2-8837-340e8b60374e') }}\n        </p>\n\n        <template v-else>\n            <ScrollableSegmentedControl v-if=\"availableOrganizations.length > 1\" v-model=\"selectedOrganization\" :items=\"availableOrganizations\" :labels=\"availableOrganizations.map(o => o.name)\" />\n\n            <p v-if=\"organization\" class=\"style-description-block\">\n                {{ $t('7c2fee1a-0838-4346-848d-a3d984e70fdc') }}\n            </p>\n            <p v-else class=\"style-description-block\">\n                {{ $t('525747e4-48df-4f20-979e-3c18142e64a5', {name: selectedOrganization.name }) }}\n            </p>\n\n            <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n            <STList>\n                <STListItem v-for=\"type of availableMembershipTypes\" :key=\"type.id\" :disabled=\"!getTypeAvailable(type)\" :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio v-model=\"selectedMembershipType\" :value=\"type\" :disabled=\"!getTypeAvailable(type)\" />\n                    </template>\n                    <h2 class=\"style-title-list\">\n                        {{ type.name }}\n                    </h2>\n                    <p v-if=\"getTypeDateDescription(type) \" class=\"style-description-small\">\n                        {{ getTypeDateDescription(type) }}\n                    </p>\n\n                    <p class=\"style-description-small\">\n                        {{ type.description }}\n                    </p>\n\n                    <div v-if=\"selectedMembershipType.id === type.id && type.behaviour === PlatformMembershipTypeBehaviour.Days\">\n                        <STInputBox :title=\"$t('3d3a30bb-3628-413e-8d1a-3864b1dae8e1')\" :error-box=\"errors.errorBox\" error-fields=\"startDate\">\n                            <DateSelection v-model=\"customStartDate\" class=\"option\" :min=\"minimumStartDateForDaysTypes\" />\n                        </STInputBox>\n\n                        <STInputBox :title=\"$t('f3cc0597-fe12-4cb1-bd41-4c7ce5d59235')\" :error-box=\"errors.errorBox\" error-fields=\"endDate\">\n                            <DateSelection v-model=\"customEndDate\" class=\"option\" :min=\"minimumStartDateForDaysTypes\" />\n                        </STInputBox>\n                    </div>\n                    <div v-else-if=\"selectedMembershipType.id === type.id\">\n                        <STInputBox :title=\"$t('3d3a30bb-3628-413e-8d1a-3864b1dae8e1')\" :error-box=\"errors.errorBox\" error-fields=\"startDate\">\n                            <DateSelection\n                                v-model=\"customStartDate\"\n                                class=\"option\"\n                                :min=\"selectedMembershipType.periods.get(period.id)?.startDate ?? null\"\n                                :max=\"selectedMembershipType.periods.get(period.id)?.endDate ?? null\"\n                            />\n                        </STInputBox>\n                    </div>\n\n                    <template #right>\n                        <span v-if=\"getTypePriceNormalPrice(type) === getTypePriceDescription(type)\">{{ getTypePriceDescription(type) }}</span>\n                        <template v-else>\n                            <span class=\"style-discount-old-price\">{{ getTypePriceNormalPrice(type) }}</span>\n                            <span class=\"style-discount-price\">{{ getTypePriceDescription(type) }}</span>\n                        </template>\n                    </template>\n                </STListItem>\n            </STList>\n        </template>\n    </SaveView>\n</template>\n\n<script setup lang=\"ts\">\nimport { PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\nimport { usePop } from '@simonbackx/vue-app-navigation';\nimport { ScrollableSegmentedControl, STErrorsDefault, Toast, usePlatformFamilyManager } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { MemberPlatformMembership, MemberWithRegistrationsBlob, PlatformMember, PlatformMembershipType, PlatformMembershipTypeBehaviour, RegistrationPeriod } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed, ref } from 'vue';\nimport { ErrorBox } from '../../../errors/ErrorBox';\nimport { useErrors } from '../../../errors/useErrors';\nimport { useOrganization, usePlatform } from '../../../hooks';\nimport DateSelection from '../../../inputs/DateSelection.vue';\n\nconst props = defineProps<{\n    member: PlatformMember;\n    period: RegistrationPeriod;\n}>();\n\nconst $t = useTranslate();\nconst title = $t('cb85826e-06fc-473c-95c2-ba338fdbab50');\nconst loading = ref(false);\nconst saveText = 'Toevoegen';\nconst organization = useOrganization();\nconst platform = usePlatform();\nconst now = new Date();\n\nconst today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\nconst customStartDate = ref(today);\nconst customEndDate = ref(today);\nconst minimumStartDateForDaysTypes = today;\n\nif (customStartDate.value < props.period.startDate) {\n    customStartDate.value = props.period.startDate;\n}\nif (customEndDate.value > props.period.endDate) {\n    customEndDate.value = props.period.endDate;\n}\n\nconst errors = useErrors();\nconst platformFamilyManager = usePlatformFamilyManager();\nconst pop = usePop();\n\nconst availableOrganizations = computed(() => organization.value ? [organization.value] : props.member.organizations);\nconst selectedOrganization = ref(availableOrganizations.value[0] ?? null);\n\nconst availableMembershipTypes = computed(() => {\n    if (!selectedOrganization.value) {\n        return [];\n    }\n    const tags = selectedOrganization.value!.meta.tags;\n\n    const memberDefaultAgeGroupIds = props.member.filterRegistrations({\n        periodId: props.period.id,\n    }).map(r => r.group.defaultAgeGroupId)\n        .filter(id => id !== null);\n\n    return platform.value.config.getEnabledPlatformMembershipTypes(tags, memberDefaultAgeGroupIds);\n});\n\nconst selectedMembershipType = ref(availableMembershipTypes.value[0] ?? null);\n\nasync function save() {\n    if (!selectedMembershipType.value) {\n        return;\n    }\n\n    if (loading.value) {\n        return;\n    }\n\n    loading.value = true;\n\n    errors.errorBox = null;\n\n    try {\n        const periodConfig = selectedMembershipType.value.periods.get(props.period.id);\n        if (!periodConfig) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: $t('b19c1fb0-f1a7-4435-9150-01bb2bb0799c'),\n            });\n        }\n\n        const errors = new SimpleErrors();\n\n        if (selectedMembershipType.value.behaviour === PlatformMembershipTypeBehaviour.Days) {\n            if (customStartDate.value < today) {\n                errors.addError(new SimpleError({\n                    code: 'invalid_field',\n                    field: 'startDate',\n                    message: 'De startdatum kan ten vroegste morgen zijn',\n                }));\n            }\n\n            if (customStartDate.value.getTime() > customEndDate.value.getTime()) {\n                errors.addError(new SimpleError({\n                    code: 'invalid_field',\n                    field: 'endDate',\n                    message: 'De einddatum moet na de startdatum liggen',\n                }));\n            }\n\n            if (customStartDate.value < periodConfig.startDate) {\n                errors.addError(new SimpleError({\n                    code: 'invalid_field',\n                    field: 'startDate',\n                    message: 'De startdatum kan niet voor ' + Formatter.date(periodConfig.startDate) + ' liggen',\n                }));\n            }\n\n            if (customStartDate.value > periodConfig.endDate) {\n                errors.addError(new SimpleError({\n                    code: 'invalid_field',\n                    field: 'startDate',\n                    message: 'De startdatum kan niet na ' + Formatter.date(periodConfig.endDate) + ' liggen',\n                }));\n            }\n\n            if (customEndDate.value > periodConfig.endDate) {\n                errors.addError(new SimpleError({\n                    code: 'invalid_field',\n                    field: 'endDate',\n                    message: 'De einddatum kan niet na ' + Formatter.date(periodConfig.endDate) + ' liggen',\n                }));\n            }\n        }\n\n        if (selectedMembershipType.value.behaviour === PlatformMembershipTypeBehaviour.Period) {\n            if (customStartDate.value < periodConfig.startDate) {\n                errors.addError(new SimpleError({\n                    code: 'invalid_field',\n                    field: 'startDate',\n                    message: 'De startdatum kan niet voor ' + Formatter.date(periodConfig.startDate) + ' liggen',\n                }));\n            }\n\n            if (customStartDate.value > periodConfig.endDate) {\n                errors.addError(new SimpleError({\n                    code: 'invalid_field',\n                    field: 'startDate',\n                    message: 'De startdatum kan niet na ' + Formatter.date(periodConfig.endDate) + ' liggen',\n                }));\n            }\n        }\n\n        errors.throwIfNotEmpty();\n\n        // Execute an isolated patch\n        const platformMembershipsPatch = new PatchableArray() as PatchableArrayAutoEncoder<MemberPlatformMembership>;\n        platformMembershipsPatch.addPut(\n            MemberPlatformMembership.create({\n                memberId: props.member.member.id,\n                membershipTypeId: selectedMembershipType.value.id,\n                organizationId: selectedOrganization.value!.id,\n                periodId: props.period.id,\n                startDate: customStartDate.value,\n                endDate: selectedMembershipType.value.behaviour === PlatformMembershipTypeBehaviour.Days ? customEndDate.value : periodConfig.endDate,\n                expireDate: selectedMembershipType.value.behaviour === PlatformMembershipTypeBehaviour.Days ? null : periodConfig.expireDate,\n            }),\n        );\n\n        const patch = new PatchableArray() as PatchableArrayAutoEncoder<MemberWithRegistrationsBlob>;\n        patch.addPatch(MemberWithRegistrationsBlob.patch({\n            id: props.member.member.id,\n            platformMemberships: platformMembershipsPatch,\n        }));\n\n        await platformFamilyManager.isolatedPatch([props.member], patch, false);\n\n        Toast.success('Aansluiting toegevoegd').show();\n        await pop({ force: true });\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n\n    loading.value = false;\n}\n\nfunction getTypeAvailable(type: PlatformMembershipType) {\n    return type.periods.has(props.period.id);\n}\n\nfunction getTypeDateDescription(type: PlatformMembershipType) {\n    const periodConfig = type.periods.get(props.period.id);\n    if (!periodConfig) {\n        return '';\n    }\n\n    if (type.behaviour === PlatformMembershipTypeBehaviour.Days) {\n        return '';\n    }\n\n    return Formatter.date(periodConfig.startDate, true) + ' - ' + Formatter.date(periodConfig.expireDate ?? periodConfig.endDate, true);\n}\n\nfunction getTypePriceDescription(type: PlatformMembershipType) {\n    return getPriceForDate(type, new Date());\n}\n\nfunction getTypePriceNormalPrice(type: PlatformMembershipType) {\n    return getPriceForDate(type, new Date(1));\n}\n\nfunction getPriceForDate(type: PlatformMembershipType, date: Date) {\n    const periodConfig = type.periods.get(props.period.id);\n    if (!periodConfig) {\n        return 'Niet beschikbaar';\n    }\n\n    const priceConfig = periodConfig.getPriceConfigForDate(date);\n\n    if (type.behaviour === PlatformMembershipTypeBehaviour.Days) {\n        return Formatter.price(priceConfig.pricePerDay) + ' per dag';\n    }\n\n    const tagIds = selectedOrganization.value?.meta.tags ?? [];\n    const shouldApplyReducedPrice = props.member.shouldApplyReducedPrice;\n    const price = priceConfig.getBasePrice(tagIds, shouldApplyReducedPrice);\n\n    return Formatter.price(price);\n}\n</script>\n","<template>\n    <LoadingBoxTransition :error-box=\"errors.errorBox\">\n        <div v-if=\"periods\" class=\"member-payments-view\">\n            <main class=\"container\">\n                <p v-if=\"hasFull\" class=\"style-description-block\">\n                    {{ $t('237be7e0-4534-4008-b7bc-3e6db776a72a') }}\n                </p>\n\n                <div v-for=\"period of filteredPeriods\" :key=\"period.id\" class=\"container\">\n                    <hr>\n                    <h2>{{ period.name }}</h2>\n                    <p v-if=\"getMembershipsForPeriod(period.id).length === 0\" class=\"warning-box\">\n                        {{ $t('65cbb5ad-4a6b-4800-a7db-59627fb576ef', {werkjaar: period.name}) }}\n                    </p>\n\n                    <STList v-else>\n                        <STListItem v-for=\"membership of getMembershipsForPeriod(period.id)\" :key=\"membership.id\" class=\"right-stack\">\n                            <template #left>\n                                <figure class=\"style-image-with-icon\" :class=\"{'theme-secundary': membership.isTrial}\">\n                                    <figure>\n                                        <span class=\"icon membership\" />\n                                    </figure>\n                                    <aside v-if=\"membership.endDate > now\">\n                                        <span v-if=\"membership.startDate > now\" class=\"icon small clock\" />\n                                        <span v-else-if=\"membership.expireDate && membership.expireDate < now\" class=\"icon small warning\" />\n                                        <span v-else-if=\"membership.isTrial\" class=\"icon trial stroke small secundary\" />\n                                        <span v-else class=\"icon small success primary\" />\n                                    </aside>\n                                </figure>\n                            </template>\n\n                            <p v-if=\"membership.isTrial\" class=\"style-title-prefix-list theme-secundary\">\n                                <span>Proefperiode</span>\n                            </p>\n                            <h3 class=\"style-title-list\">\n                                <span>{{ getMembershipType(membership).name }}</span>\n\n                                <span v-if=\"membership.freeAmount\" class=\"style-tag discount inline-first\">\n                                    {{ Formatter.pluralText(membership.freeAmount, 'dag', 'dagen') }} gratis\n                                </span>\n                            </h3>\n                            <p class=\"style-description-small style-tooltip\" v-tooltip=\"'Toegevoegd op ' + formatDate(membership.createdAt, true)\">\n                                {{ capitalizeFirstLetter(formatDateRange(membership.startDate, membership.expireDate ?? membership.endDate)) }}\n                            </p>\n                            <p v-if=\"membership.trialUntil && membership.trialUntil > now\" class=\"style-description-small\">\n                                Proefperiode tot {{ formatDate(membership.trialUntil, true) }}\n                            </p>\n\n                            <p class=\"style-description-small\" v-if=\"membership.organizationId === platform.membershipOrganizationId\">\n                                {{ $t('4a39e12b-efa2-46fe-aa30-83bc576548a3') }}\n                            </p>\n                            <p v-else class=\"style-description-small\">\n                                <p v-if=\"membership.price === 0\" class=\"style-description-small\">\n                                    {{ $t('c8f1e4d4-669c-4ccb-a9d9-30584f6c2d55', {organization: getOrganizationName(membership)}) }}\n                                </p>\n                                <p v-else-if=\"membership.balanceItemId\" class=\"style-description-small\">\n                                    {{ $t('f1582fe7-3168-4579-bcc5-9db17568dac0', {organization: getOrganizationName(membership)}) }}\n                                </p>\n                                <p v-else-if=\"membership.trialUntil && membership.trialUntil > now\">\n                                    {{ $t('b0a70381-66b1-4bff-a613-8332a35bec7a', {organization: getOrganizationName(membership)}) }}\n                                </p>\n                                <p v-else>\n                                    {{ $t('a2f6d632-9e20-4366-9393-b52431525596', {organization: getOrganizationName(membership)}) }}\n                                </p>\n                            </p>\n\n                            <p v-if=\"membership.expireDate && membership.expireDate < now && membership.endDate > now\" class=\"style-description-small\">\n                                Verlopen. Verleng de aansluiting om de verzekering te behouden.\n                            </p>\n\n                            <p v-if=\"membership.generated && auth.hasPlatformFullAccess()\" class=\"style-description-small\">\n                                {{ $t('41464f90-088a-4c6a-827b-cd5907ad1fac') }}\n                            </p>\n                            <template v-if=\"hasFull && (!organization || membership.organizationId === organization.id)\" #right>\n                                <span v-if=\"membership.price === 0 && (membership.organizationId === platform.membershipOrganizationId || period.locked)\"></span>\n                                <span v-else-if=\"membership.price === membership.priceWithoutDiscount || membership.priceWithoutDiscount === 0\" class=\"style-price-base\">{{ formatPrice(membership.price) }}</span>\n                                <template v-else>\n                                    <span class=\"style-discount-old-price\">{{ formatPrice(membership.priceWithoutDiscount) }}</span>\n                                    <span class=\"style-discount-price\">{{ formatPrice(membership.price) }}</span>\n                                </template>\n\n                                <LoadingButton v-if=\"!membership.locked && (!membership.generated || !isRegisteredAt(period.id, membership.organizationId)) && (!membership.balanceItemId || auth.hasPlatformFullAccess())\" :loading=\"deletingMemberships.has(membership.id)\">\n                                    <button class=\"button icon trash\" type=\"button\" @click=\"deleteMembership(membership)\" />\n                                </LoadingButton>\n\n                                <button v-if=\"membership.locked && (auth.hasPlatformFullAccess())\" v-tooltip=\"$t('b1c11fd1-81dc-46f2-8cfb-0ba02d260f19')\" class=\"button icon lock\" type=\"button\" @click=\"unlockMembership(membership)\" />\n                            </template>\n                        </STListItem>\n                    </STList>\n\n                    <p v-if=\"hasFull && !period.locked\">\n                        <button type=\"button\" class=\"button text\" @click=\"addMembership(period)\">\n                            <span class=\"icon add\" />\n                            <span>Aansluiting of verzekering toevoegen in {{ period.name }}</span>\n                        </button>\n                    </p>\n                </div>\n            </main>\n        </div>\n    </LoadingBoxTransition>\n</template>\n\n<script lang=\"ts\" setup>\nimport { PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, usePresent } from '@simonbackx/vue-app-navigation';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { usePlatformManager, useRequestOwner } from '@stamhoofd/networking';\nimport { GroupType, MemberPlatformMembership, MemberWithRegistrationsBlob, PlatformMember, PlatformMembershipType, RegistrationPeriod } from '@stamhoofd/structures';\nimport { Formatter, Sorter } from '@stamhoofd/utility';\nimport { computed, ref } from 'vue';\nimport { LoadingBoxTransition } from '../../containers';\nimport { ErrorBox } from '../../errors/ErrorBox';\nimport { useErrors } from '../../errors/useErrors';\nimport { useAuth, useOrganization, usePlatform } from '../../hooks';\nimport { CenteredMessage } from '../../overlays/CenteredMessage';\nimport { Toast } from '../../overlays/Toast';\nimport { usePlatformFamilyManager } from '../PlatformFamilyManager';\nimport SelectPlatformMembershipView from '../components/platform-membership/SelectPlatformMembershipView.vue';\n\nconst props = defineProps<{\n    member: PlatformMember;\n}>();\n\nconst $t = useTranslate();\nconst present = usePresent();\nconst platformFamilyManager = usePlatformFamilyManager();\nconst deletingMemberships = ref(new Set());\nconst patchingMemberships = ref(new Set());\nconst platform = usePlatform();\nconst now = new Date();\nconst auth = useAuth();\nconst hasFull = auth.hasFullAccess();\nconst platformManager = usePlatformManager();\nconst owner = useRequestOwner();\nconst errors = useErrors();\nplatformManager.value.loadPeriods(false, true, owner).catch(e => errors.errorBox = new ErrorBox(e));\nconst periods = computed(() => platformManager.value.$platform.periods);\nconst organization = useOrganization();\n\nfunction isRegisteredAt(periodId: string, organizationId: string) {\n    return props.member.filterRegistrations({ types: [GroupType.Membership], periodId, organizationId }).length > 0;\n}\n\nconst memberships = computed(() => {\n    return [...props.member.member.platformMemberships]\n        .sort((a, b) => Sorter.stack(\n            Sorter.byDateValue(b.startDate, a.startDate),\n            Sorter.byDateValue(b.createdAt, a.createdAt),\n        ));\n});\n\nconst filteredPeriods = computed(() => {\n    return periods.value?.filter(p => p.id === organization.value?.period?.period.id || (p.id === platform.value.period.id) || memberships.value.some(m => m.periodId === p.id)) ?? [];\n});\n\nfunction getMembershipsForPeriod(periodId: string) {\n    return memberships.value.filter(m => m.periodId === periodId);\n}\n\nfunction getOrganizationName(membership: MemberPlatformMembership) {\n    return props.member.organizations.find(o => o.id === membership.organizationId)?.name ?? 'Onbekende groep';\n}\n\nasync function addMembership(period: RegistrationPeriod) {\n    await present({\n        components: [\n            new ComponentWithProperties(SelectPlatformMembershipView, {\n                member: props.member,\n                period,\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function deleteMembership(membership: MemberPlatformMembership) {\n    if (deletingMemberships.value.has(membership.id)) {\n        return;\n    }\n\n    if (!await CenteredMessage.confirm('Ben je zeker dat je deze aansluiting wilt verwijderen?', 'Ja, verwijderen')) {\n        return;\n    }\n\n    deletingMemberships.value.add(membership.id);\n\n    try {\n        // Execute an isolated patch\n        const platformMembershipsPatch = new PatchableArray() as PatchableArrayAutoEncoder<MemberPlatformMembership>;\n        platformMembershipsPatch.addDelete(membership.id);\n\n        const patch = new PatchableArray() as PatchableArrayAutoEncoder<MemberWithRegistrationsBlob>;\n        patch.addPatch(MemberWithRegistrationsBlob.patch({\n            id: props.member.member.id,\n            platformMemberships: platformMembershipsPatch,\n        }));\n\n        await platformFamilyManager.isolatedPatch([props.member], patch, false);\n\n        Toast.success('Aansluiting verwijderd').show();\n    }\n    catch (e) {\n        Toast.fromError(e).show();\n    }\n    deletingMemberships.value.delete(membership.id);\n}\n\nasync function unlockMembership(membership: MemberPlatformMembership) {\n    if (patchingMemberships.value.has(membership.id)) {\n        return;\n    }\n\n    if (!await CenteredMessage.confirm($t('6468d392-6711-48cd-9602-a5a26afe6f22'), $t('ac1d3647-1c2f-48a1-a08a-ce4821103fb1'))) {\n        return;\n    }\n\n    patchingMemberships.value.add(membership.id);\n\n    try {\n        // Execute an isolated patch\n        const platformMembershipsPatch = new PatchableArray() as PatchableArrayAutoEncoder<MemberPlatformMembership>;\n        platformMembershipsPatch.addPatch(MemberPlatformMembership.patch({\n            id: membership.id,\n            locked: false,\n        }));\n\n        const patch = new PatchableArray() as PatchableArrayAutoEncoder<MemberWithRegistrationsBlob>;\n        patch.addPatch(MemberWithRegistrationsBlob.patch({\n            id: props.member.member.id,\n            platformMemberships: platformMembershipsPatch,\n        }));\n\n        await platformFamilyManager.isolatedPatch([props.member], patch, false);\n\n        Toast.success($t('04cac345-ed28-484c-8a50-96ac4db89911')).show();\n    }\n    catch (e) {\n        Toast.fromError(e).show();\n    }\n    patchingMemberships.value.delete(membership.id);\n}\n\nfunction getMembershipType(membership: MemberPlatformMembership) {\n    return platform.value.config.membershipTypes.find(t => t.id === membership.membershipTypeId) ?? PlatformMembershipType.create({\n        id: membership.membershipTypeId,\n        name: 'Onbekend',\n    });\n}\n</script>\n","<template>\n    <div class=\"st-view member-segmented-view\">\n        <STNavigationBar :title=\"member.member.details.name\">\n            <template #right>\n                <button v-if=\"hasPrevious || hasNext\" v-tooltip=\"'Ga naar vorige lid'\" type=\"button\" class=\"button navigation icon arrow-up\" :disabled=\"!hasPrevious\" @click=\"goBack\" />\n                <button v-if=\"hasNext || hasPrevious\" v-tooltip=\"'Ga naar volgende lid'\" type=\"button\" class=\"button navigation icon arrow-down\" :disabled=\"!hasNext\" @click=\"goForward\" />\n\n                <button v-if=\"hasWrite\" v-tooltip=\"$t('f2eb0c04-0dca-4c8e-b920-7044a65aee6a')\" class=\"button icon navigation edit\" type=\"button\" @click=\"editThisMember\" />\n                <button v-long-press=\"(e) => showContextMenu(e)\" class=\"button icon navigation more\" type=\"button\" @click.prevent=\"showContextMenu\" @contextmenu.prevent=\"showContextMenu\" />\n            </template>\n        </STNavigationBar>\n\n        <main>\n            <h1 class=\"style-navigation-title with-icons\">\n                <span class=\"icon-spacer\">{{ member.member.details.firstName }}</span>\n                <span v-if=\"member.member.details.gender === Gender.Male\" v-tooltip=\"member.member.details.defaultAge >= 18 ? 'Man' : 'Jongen'\" class=\"icon male blue icon-spacer\" />\n                <span v-if=\"member.member.details.gender === Gender.Female\" v-tooltip=\"member.member.details.defaultAge >= 18 ? 'Vrouw' : 'Meisje'\" class=\"icon female pink icon-spacer\" />\n            </h1>\n\n            <SegmentedControl v-model=\"tab\" :items=\"tabComponents\" :labels=\"tabLabels\" />\n            <component :is=\"tab\" :member=\"member\" />\n        </main>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ComponentWithProperties, useDismiss, usePresent } from '@simonbackx/vue-app-navigation';\nimport { SegmentedControl, TableActionsContextMenu, TableActionSelection, useAuth, useBackForward, useGlobalEventListener, useOrganization } from '@stamhoofd/components';\nimport { AccessRight, Gender, Group, LimitedFilteredRequest, PermissionLevel, PlatformMember } from '@stamhoofd/structures';\nimport { computed, markRaw, ref } from 'vue';\nimport { useMembersObjectFetcher } from '../fetchers/useMembersObjectFetcher';\nimport { useMemberActions } from './classes/MemberActionBuilder';\nimport { useEditMember } from './composables/useEditMember';\nimport MemberDetailsTab from './tabs/MemberDetailsTab.vue';\nimport MemberPaymentsTab from './tabs/MemberPaymentsTab.vue';\nimport MemberPlatformMembershipTab from './tabs/MemberPlatformMembershipTab.vue';\n\ntype PropType = {\n    member: PlatformMember;\n    initialTab?: number | null;\n    group?: Group | null;\n    getNext: (current: PlatformMember) => PlatformMember | null;\n    getPrevious: (current: PlatformMember) => PlatformMember | null;\n};\n\nconst props = withDefaults(\n    defineProps<PropType>(),\n    {\n        initialTab: null,\n        group: null,\n    },\n);\nconst auth = useAuth();\nconst dismiss = useDismiss();\nconst present = usePresent();\nconst editMember = useEditMember();\nconst organization = useOrganization();\n\nconst tabs = computed(() => {\n    const base: { name: string; component: unknown }[] = [{\n        name: 'Gegevens',\n        component: markRaw(MemberDetailsTab),\n    }];\n\n    if (STAMHOOFD.userMode === 'platform') {\n        base.push({\n            name: 'Aansluiting',\n            component: markRaw(MemberPlatformMembershipTab),\n        });\n    }\n\n    if (organization.value && auth.hasAccessRight(AccessRight.MemberReadFinancialData)) {\n        base.push({\n            name: 'Rekening',\n            component: markRaw(MemberPaymentsTab),\n        });\n    }\n\n    return base;\n});\n\nconst tabComponents = computed(() => {\n    return tabs.value.map(t => t.component);\n});\nconst tabLabels = computed(() => {\n    return tabs.value.map(t => t.name);\n});\n\nconst tab = ref(tabComponents.value[props.initialTab && props.initialTab < tabComponents.value.length ? (props.initialTab) : 0]);\nconst tabIndex = computed(() => {\n    return Math.max(0, tabComponents.value.findIndex(t => t === tab.value));\n});\n\nconst hasWrite = computed(() => {\n    return auth.canAccessPlatformMember(props.member, PermissionLevel.Write);\n});\n\nconst { hasNext, hasPrevious, goBack, goForward } = useBackForward('member', props, computed(() => {\n    return { initialTab: tabIndex.value };\n}));\n\nconst buildActions = useMemberActions();\nconst objectFetcher = useMembersObjectFetcher();\n\nasync function showContextMenu(event: MouseEvent) {\n    const builder = buildActions({\n        organizations: props.member.organizations,\n        groups: props.member.filterGroups({ currentPeriod: true, includePending: false }),\n        forceWriteAccess: hasWrite.value,\n    });\n\n    const actions = builder.getActions({ includeDelete: true, includeMove: false, includeEdit: true });\n\n    const el = event.currentTarget! as HTMLElement;\n    const bounds = el.getBoundingClientRect();\n\n    const selection: TableActionSelection<PlatformMember> = {\n        filter: new LimitedFilteredRequest({\n            filter: {\n                id: props.member.id,\n            },\n            limit: 2,\n        }),\n        fetcher: objectFetcher, // todo\n        markedRows: new Map([[props.member.id, props.member]]),\n        markedRowsAreSelected: true,\n    };\n\n    const displayedComponent = new ComponentWithProperties(TableActionsContextMenu, {\n        x: bounds.left,\n        y: bounds.bottom,\n        xPlacement: 'right',\n        yPlacement: 'bottom',\n        actions,\n        selection,\n    });\n    await present(displayedComponent.setDisplayStyle('overlay'));\n}\n\nasync function editThisMember() {\n    await editMember(props.member);\n}\n\nuseGlobalEventListener('members-deleted', async (members) => {\n    if (Array.isArray(members)) {\n        for (const member of members) {\n            if (member !== null && typeof member === 'object' && member.id === props.member.id) {\n                await dismiss({ force: true });\n                return;\n            }\n        }\n    }\n});\n\n</script>\n","<template>\n    <div class=\"input-icon-container icon arrow-down-small right gray\" @click=\"selectOrganization\">\n        <div class=\"input selectable\">\n            {{ model?.name ?? '' }}\n        </div>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ComponentWithProperties, usePresent } from '@simonbackx/vue-app-navigation';\nimport { NavigationActions, SearchOrganizationView } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { Organization } from '@stamhoofd/structures';\n\nconst model = defineModel<Organization | null>({\n    required: true });\n\nconst present = usePresent();\nconst $t = useTranslate();\n\nasync function selectOrganization() {\n    await present({\n        components: [\n            new ComponentWithProperties(SearchOrganizationView, {\n                title: $t('2a1a65d9-d04a-44f2-a86e-0d500f6186ee'),\n                description: $t('6f707b06-382b-417f-b64a-59c7076a08cd'),\n                selectOrganization: async (organization: Organization, navigation: NavigationActions) => {\n                    model.value = organization;\n                    await navigation.pop();\n                },\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n</script>\n","<template>\n    <SaveView :title=\"title\" :loading=\"saving\" :disabled=\"!hasChanges\" :save-text=\"$t('00bdd5bd-af3f-4f83-abe0-696d5b872ca9')\" save-icon=\"calculator\" @save=\"save\">\n        <h1 class=\"style-navigation-title\">\n            {{ title }}\n        </h1>\n\n        <p class=\"style-description\">\n            <span v-if=\"selectionCount === null\" class=\"style-placeholder-skeleton\" />\n            <span v-else>{{ chargeViewDescription }}</span>\n        </p>\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <div :class=\"{'split-inputs': modalDisplayStyle === 'popup' && showSelectOrganization}\">\n            <STInputBox v-if=\"showSelectOrganization\" :title=\"$t('4a5ca65c-3a96-4ca0-991c-518a9e92adb7')\" error-fields=\"organization\" :error-box=\"errors.errorBox\">\n                <OrganizationSelect v-model=\"selectedOrganization\" />\n            </STInputBox>\n\n            <STInputBox :title=\"$t('11d6f2fc-c72d-4c18-aa6d-b8118c2aaa5c')\" error-fields=\"description\" :error-box=\"errors.errorBox\">\n                <input v-model=\"description\" class=\"input\" type=\"text\" :placeholder=\"$t('e4a32f97-64aa-43d7-803f-3d18f7cdf8e4')\" autocomplete=\"given-name\">\n            </STInputBox>\n        </div>\n\n        <div class=\"split-inputs\">\n            <STInputBox :title=\"$t('7453643b-fdb2-4aa1-9964-ddd71762c983')\" error-fields=\"price\" :error-box=\"errors.errorBox\">\n                <PriceInput v-model=\"price\" :placeholder=\"formatPrice(0)\" :required=\"true\" :min=\"null\" />\n            </STInputBox>\n            <STInputBox :title=\"$t('a0f52fae-a4e6-4c3c-a6af-83218dd399b2')\" error-fields=\"amount\" :error-box=\"errors.errorBox\">\n                <NumberInput v-model=\"amount\" :title=\"$t('a0f52fae-a4e6-4c3c-a6af-83218dd399b2')\" :validator=\"errors.validator\" :min=\"1\" />\n            </STInputBox>\n        </div>\n\n        <div class=\"split-inputs\">\n            <div v-if=\"showCreatedAt\">\n                <STInputBox title=\"Verschuldigd sinds\" error-fields=\"createdAt\" :error-box=\"errors.errorBox\">\n                    <DateSelection v-model=\"createdAt\" />\n                </STInputBox>\n            </div>\n            <div v-if=\"canShowDueAt\">\n                <STInputBox :title=\"$t('Te betalen tegen') + (dueAtDescription ? '*' : '')\" error-fields=\"dueAt\" :error-box=\"errors.errorBox\">\n                    <DateSelection v-model=\"dueAt\" :required=\"false\" placeholder=\"Onmiddelijk\" :time=\"{hours: 0, minutes: 0, seconds: 0}\" />\n                </STInputBox>\n            </div>\n        </div>\n\n        <p v-if=\"canShowDueAt && dueAtDescription\" class=\"style-description-small\">\n            {{ dueAtDescription }}\n        </p>\n\n        <PriceBreakdownBox :price-breakdown=\"priceBreakdown\" />\n    </SaveView>\n</template>\n\n<script lang=\"ts\" setup>\nimport { AutoEncoder } from '@simonbackx/simple-encoding';\nimport { SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\nimport { usePop } from '@simonbackx/vue-app-navigation';\nimport { CenteredMessage, DateSelection, ErrorBox, NumberInput, PriceBreakdownBox, PriceInput, Toast, useContext, useErrors, useExternalOrganization, usePlatform, useValidation } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { useRequestOwner } from '@stamhoofd/networking';\nimport { LimitedFilteredRequest, Organization, StamhoofdFilter } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed, Ref, ref, watch } from 'vue';\nimport { useCount } from '../composables/useCount';\nimport OrganizationSelect from '../organizations/components/OrganizationSelect.vue';\n\nexport type ChargeViewOptions = {\n    filter: StamhoofdFilter;\n    countEndpointPath: string; chargeEndpointPath: string;\n    getDescription: (args: { count: number }) => string;\n    getConfirmationText: (args: { total: string; count: number | null }) => string;\n    dueAtDescription?: string;\n    createBody: (args: { organizationId: string;\n        price: number;\n        description: string;\n        amount: number | null;\n        dueAt: Date | null;\n        createdAt: Date | null; }) => AutoEncoder;\n    modalDisplayStyle?: 'sheet' | 'popup';\n    showCreatedAt?: boolean;\n    showDueAt?: boolean;\n    organization?: Organization | null;\n};\n\nconst props = withDefaults(defineProps<ChargeViewOptions>(), {\n    showCreatedAt: false,\n    showDueAt: false,\n    modalDisplayStyle: 'sheet',\n    organization: null,\n    dueAtDescription: undefined,\n});\n\nconst errors = useErrors();\nconst $t = useTranslate();\nconst pop = usePop();\nconst owner = useRequestOwner();\nconst context = useContext();\nconst platform = usePlatform();\nconst { count } = useCount(props.countEndpointPath);\n\ncount(props.filter)\n    .then((result: number | null) => {\n        if (result !== null) {\n            selectionCount.value = result;\n        }\n    })\n    .catch(console.error);\n\nconst selectionCount = ref<number | null>(null);\nconst selectedOrganization = ref(props.organization) as Ref<Organization | null>;\nconst showSelectOrganization = computed(() => props.organization === null);\nconst description = ref('');\nconst price = ref(0);\nconst amount = ref(1);\nconst hasChanges = computed(() => description.value !== '' || price.value !== 0);\nconst total = computed(() => price.value * amount.value);\nconst canShowDueAt = computed(() => props.showDueAt && (price.value >= 0));\n\nconst createdAt = ref(props.showCreatedAt ? new Date() : null);\nconst dueAt = ref(null);\n\nconst priceBreakdown = computed(() => {\n    return [{\n        name: 'Totaal',\n        price: total.value,\n    }];\n});\n\nconst chargeViewDescription = computed(() => {\n    if (selectionCount.value === null) {\n        return '';\n    }\n\n    return props.getDescription({ count: selectionCount.value });\n});\n\nconst saving = ref(false);\n\nconst title = $t('e412b71e-566b-41d4-8b1f-97ab7f140b29');\n\nconst defaultOrganizationId = computed(() => platform.value.membershipOrganizationId);\nconst { externalOrganization: defaultOrganization } = useExternalOrganization(defaultOrganizationId);\n\nwatch(defaultOrganization, (organization) => {\n    if (organization !== null && selectedOrganization.value === null) {\n        selectedOrganization.value = organization;\n    }\n}, { immediate: true });\n\nuseValidation(errors.validator, () => {\n    const se = new SimpleErrors();\n\n    if (selectedOrganization.value === null) {\n        se.addError(new SimpleError({\n            code: 'invalid_field',\n            message: 'Organisatie is verplicht',\n            field: 'organization',\n        }));\n    }\n\n    const descriptionNormalized = description.value.trim();\n\n    if (descriptionNormalized.length === 0) {\n        se.addError(new SimpleError({\n            code: 'invalid_field',\n            message: 'Beschrijving is verplicht',\n            field: 'description',\n        }));\n    }\n\n    if (price.value === 0) {\n        se.addError(new SimpleError({\n            code: 'invalid_field',\n            message: 'Bedrag kan niet 0 zijn',\n            field: 'price',\n        }));\n    }\n\n    if (se.errors.length > 0) {\n        errors.errorBox = new ErrorBox(se);\n        return false;\n    }\n\n    errors.errorBox = null;\n    return true;\n});\n\nasync function save() {\n    if (saving.value || !hasChanges.value) {\n        return;\n    }\n    saving.value = true;\n\n    const isValid = await errors.validator.validate();\n    if (!isValid) {\n        saving.value = false;\n        return;\n    }\n\n    const isConfirm = await CenteredMessage.confirm(props.getConfirmationText({ total: Formatter.price(total.value), count: selectionCount.value }),\n        $t('00bdd5bd-af3f-4f83-abe0-696d5b872ca9'),\n    );\n\n    if (!isConfirm) {\n        saving.value = false;\n        return;\n    }\n\n    try {\n        const limitedFilteredRequest = new LimitedFilteredRequest({\n            filter: props.filter,\n            limit: 100,\n        });\n\n        const body = props.createBody({\n            organizationId: selectedOrganization.value!.id,\n            price: price.value,\n            description: description.value,\n            amount: amount.value,\n            dueAt: dueAt.value,\n            createdAt: createdAt.value,\n        });\n\n        await context.value.authenticatedServer.request({\n            method: 'POST',\n            path: props.chargeEndpointPath,\n            query: limitedFilteredRequest,\n            shouldRetry: false,\n            body,\n            owner,\n        });\n\n        new Toast('Het bedrag werd aangerekend', 'success green').show();\n\n        await pop({ force: true });\n    }\n    catch (error: any) {\n        errors.errorBox = new ErrorBox(error);\n    }\n\n    saving.value = false;\n}\n\nconst shouldNavigateAway = async () => {\n    if (!hasChanges.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm($t('ddf3558e-ed2e-4217-9155-495c3984d769'), $t('f97c98d7-c64e-4cab-ac8f-fdda5b1bfb54'));\n};\n\ndefineExpose({\n    shouldNavigateAway,\n});\n</script>\n","<template>\n    <ChargeView :filter=\"filter\" count-endpoint-path=\"/members/count\" charge-endpoint-path=\"/admin/charge-members\" :create-body=\"createBody\" :get-description=\"getDescription\" :get-confirmation-text=\"getConfirmationText\" modal-display-style=\"popup\" :show-due-at=\"$feature('member-trials')\" :show-created-at=\"true\" :organization=\"organization\" :due-at-description=\"$t('15b6f0c8-6287-4b4d-bf34-4da2f4a0e575')\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport ChargeView from '@stamhoofd/components/src/views/ChargeView.vue';\nimport { ChargeMembersRequest, Organization, StamhoofdFilter } from '@stamhoofd/structures';\n\ndefineProps<{ filter: StamhoofdFilter; organization: Organization }>();\n\nfunction createBody(args: {\n    price: number;\n    description: string;\n    amount: number | null;\n    dueAt: Date | null;\n    createdAt: Date | null; }): ChargeMembersRequest {\n    return ChargeMembersRequest.create(args);\n}\n\nfunction getDescription({ count }: { count: number }) {\n    if (count === 1) {\n        return $t('Reken een bedrag aan aan het geselecteerde lid.');\n    }\n\n    return $t('Reken een bedrag aan aan de {count} geselecteerde leden.', { count: count.toString() });\n}\n\nfunction getConfirmationText({ total, count }: { total: string; count: number | null }) {\n    if (count === 1) {\n        return $t('Weet je zeker dat je {total} wilt aanrekenen aan 1 lid?', { total });\n    }\n\n    return $t('Weet je zeker dat je {total} wilt aanrekenen aan {count} leden?', { total, count: count === null ? '?' : count.toString() });\n}\n</script>\n","<template>\n    <LoadingViewTransition>\n        <ModernTableView\n            v-if=\"!loading\"\n            ref=\"modernTableView\"\n            :table-object-fetcher=\"tableObjectFetcher\"\n            :filter-builders=\"filterBuilders\"\n            :title=\"title\"\n            :column-configuration-id=\"configurationId\"\n            :default-filter=\"defaultFilter\"\n            :actions=\"actions\"\n            :all-columns=\"allColumns\"\n            :estimated-rows=\"estimatedRows\"\n            :Route=\"Route\"\n        >\n            <template #empty>\n                Geen leden ingeschreven\n            </template>\n        </ModernTableView>\n    </LoadingViewTransition>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ComponentWithProperties, usePresent } from '@simonbackx/vue-app-navigation';\nimport { AsyncTableAction, Column, ComponentExposed, InMemoryTableAction, LoadingViewTransition, ModernTableView, TableAction, TableActionSelection, useAdvancedMemberWithRegistrationsBlobUIFilterBuilders, useAppContext, useAuth, useChooseOrganizationMembersForGroup, useGlobalEventListener, useOrganization, usePlatform, useTableObjectFetcher } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { AccessRight, Group, GroupCategoryTree, GroupPrice, GroupType, MemberResponsibility, MembershipStatus, Organization, PermissionLevel, PlatformMember, RecordAnswer, RegisterItemOption, StamhoofdFilter } from '@stamhoofd/structures';\nimport { Formatter, Sorter } from '@stamhoofd/utility';\nimport { Ref, computed, ref } from 'vue';\nimport { useMembersObjectFetcher } from '../fetchers/useMembersObjectFetcher';\nimport ChargeMembersView from './ChargeMembersView.vue';\nimport { useDirectMemberActions } from './classes/MemberActionBuilder';\nimport MemberSegmentedView from './MemberSegmentedView.vue';\n\ntype ObjectType = PlatformMember;\n\nconst props = withDefaults(\n    defineProps<{\n        group?: Group | null;\n        category?: GroupCategoryTree | null;\n        periodId?: string | null;\n        responsibility?: MemberResponsibility | null; // for now only for saving column config\n        customFilter?: StamhoofdFilter | null;\n        customTitle?: string | null;\n    }>(), {\n        group: null,\n        category: null,\n        periodId: null,\n        customFilter: null,\n        customTitle: null,\n        responsibility: null,\n    },\n);\n\nconst waitingList = computed(() => props.group && props.group.type === GroupType.WaitingList);\n\nconst { filterBuilders, loading } = useAdvancedMemberWithRegistrationsBlobUIFilterBuilders();\n\nconst title = computed(() => {\n    if (props.customTitle) {\n        return props.customTitle;\n    }\n\n    if (props.group) {\n        return props.group.settings.name;\n    }\n\n    return 'Leden';\n});\n\nconst estimatedRows = computed(() => {\n    if (props.group) {\n        return props.group.settings.registeredMembers;\n    }\n    return 30;\n});\n\nconst app = useAppContext();\nconst $t = useTranslate();\nconst modernTableView = ref(null) as Ref<null | ComponentExposed<typeof ModernTableView>>;\nconst auth = useAuth();\nconst organization = useOrganization();\nconst platform = usePlatform();\nconst present = usePresent();\nconst filterPeriodId = props.periodId ?? props.group?.periodId ?? organization?.value?.period?.period?.id ?? platform.value.period.id;\nconst defaultFilter = app === 'admin' && !props.group\n    ? {\n            platformMemberships: {\n                $elemMatch: {\n                    endDate: {\n                        $gt: { $: '$now' },\n                    },\n                },\n            },\n        }\n    : null;\n\nconst organizationRegistrationPeriod = computed(() => {\n    const periodId = filterPeriodId;\n\n    return organization.value?.periods?.organizationPeriods?.find(p => p.period.id === periodId);\n});\n\nuseGlobalEventListener('members-deleted', async () => {\n    tableObjectFetcher.reset(true, true);\n});\nuseGlobalEventListener('members-added', async () => {\n    tableObjectFetcher.reset(true, true);\n});\nuseGlobalEventListener('members-registered', async () => {\n    tableObjectFetcher.reset(true, true);\n});\nuseGlobalEventListener('paymentPatch', async () => {\n    tableObjectFetcher.reset(true, true);\n});\n\nconst configurationId = computed(() => {\n    return 'members-' + app + '-org-' + (organization.value?.id ?? 'null') + '-' + (props.group ? '-group-' + props.group.id : '') + (props.category ? '-category-' + props.category.id : '') + (props.responsibility ? '-responsibility-' + props.responsibility.id : '');\n});\nconst financialRead = computed(() => auth.permissions?.hasAccessRight(AccessRight.MemberReadFinancialData) ?? false);\n\nconst groups = (() => {\n    if (props.group) {\n        return [props.group];\n    }\n    if (props.category) {\n        return props.category.getAllGroups();\n    }\n    return [];\n})();\n\nfunction getRequiredFilter(): StamhoofdFilter | null {\n    if (props.customFilter) {\n        return props.customFilter;\n    }\n\n    if (!props.group && !props.category) {\n        if (organization.value && props.periodId) {\n            // Only show members that are registered in the current period AND in this group\n            // (avoid showing old members that moved to other groups)\n            return {\n                registrations: {\n                    $elemMatch: {\n                        organizationId: organization.value.id,\n                        periodId: props.periodId,\n                    },\n                },\n            };\n        }\n\n        if (props.periodId) {\n            return {\n                registrations: {\n                    $elemMatch: {\n                        periodId: props.periodId,\n                    },\n                },\n            };\n        }\n        return null;\n    }\n\n    const extra: StamhoofdFilter[] = [];\n\n    if (organization.value && props.group && props.group.organizationId !== organization.value?.id) {\n        // Only show members that are registered in the current period AND in this group\n        // (avoid showing old members that moved to other groups)\n        const periodIds = [props.group.periodId];\n        if (props.periodId) {\n            periodIds.push(props.periodId);\n        }\n        if (organization?.value?.period?.period?.id) {\n            periodIds.push(organization.value.period.period.id);\n        }\n        if (platform.value.period.id) {\n            periodIds.push(platform.value.period.id);\n        }\n\n        extra.push({\n            registrations: {\n                $elemMatch: {\n                    organizationId: organization.value.id,\n                    periodId: {\n                        $in: Formatter.uniqueArray(periodIds),\n                    },\n                },\n            },\n        });\n    }\n\n    return [\n        {\n            registrations: {\n                $elemMatch: props.group\n                    ? {\n                            groupId: props.group.id,\n                        }\n                    : {\n                            groupId: {\n                                $in: groups.map(g => g.id),\n                            },\n                        },\n            },\n        },\n        ...extra,\n    ];\n}\n\nconst objectFetcher = useMembersObjectFetcher({\n    requiredFilter: getRequiredFilter(),\n});\n\nconst tableObjectFetcher = useTableObjectFetcher<ObjectType>(objectFetcher);\n\nconst allColumns: Column<ObjectType, any>[] = [\n    new Column<ObjectType, string>({\n        id: 'memberNumber',\n        name: '#',\n        getValue: member => member.member.details.memberNumber ?? '',\n        getStyle: val => val ? '' : 'gray',\n        format: val => val ? val : 'Geen',\n        minimumWidth: 100,\n        recommendedWidth: 150,\n        grow: true,\n        allowSorting: false,\n        enabled: false,\n    }),\n\n    new Column<ObjectType, string>({\n        id: 'name',\n        name: 'Naam',\n        getValue: member => member.member.name,\n        minimumWidth: 100,\n        recommendedWidth: 200,\n        grow: true,\n    }),\n    new Column<ObjectType, Date | null>({\n        id: 'birthDay',\n        name: 'Geboortedatum',\n        getValue: member => member.member.details.birthDay,\n        format: date => date ? Formatter.dateNumber(date, true) : '',\n        minimumWidth: 50,\n        recommendedWidth: 170,\n        enabled: false,\n    }),\n    new Column<ObjectType, number | null>({\n        id: 'age',\n        name: 'Leeftijd',\n        getValue: member => member.member.details.age,\n        format: (age, width) => age ? (width <= 60 ? Formatter.integer(age) : (Formatter.integer(age) + ' jaar')) : 'onbekend',\n        minimumWidth: 50,\n        recommendedWidth: 120,\n    }),\n    new Column<ObjectType, MembershipStatus>({\n        id: 'membership',\n        name: 'Aansluiting',\n        getValue: member => member.membershipStatus,\n        format: (status) => {\n            switch (status) {\n                case MembershipStatus.Trial:\n                    return 'Proefperiode';\n                case MembershipStatus.Active:\n                    return 'Actief';\n                case MembershipStatus.Expiring:\n                    return 'Verlopen';\n                case MembershipStatus.Temporary:\n                    return 'Tijdelijk';\n                case MembershipStatus.Inactive:\n                    return 'Niet verzekerd';\n            }\n        },\n        getStyle: (status) => {\n            switch (status) {\n                case MembershipStatus.Trial:\n                    return 'secundary';\n                case MembershipStatus.Active:\n                    return 'success';\n                case MembershipStatus.Expiring:\n                    return 'warn';\n                case MembershipStatus.Temporary:\n                    return 'secundary';\n                case MembershipStatus.Inactive:\n                    return 'error';\n            }\n        },\n        minimumWidth: 120,\n        recommendedWidth: 140,\n        allowSorting: false,\n    }),\n    new Column<ObjectType, string[]>({\n        name: 'Functies',\n        allowSorting: false,\n        getValue: member => member.getResponsibilities({ organization: organization.value ?? undefined }).map(l => l.getName(member, false)),\n        format: (list) => {\n            if (list.length === 0) {\n                return 'Geen';\n            }\n            return list.join(', ');\n        },\n        getStyle: list => list.length === 0 ? 'gray' : '',\n        minimumWidth: 100,\n        recommendedWidth: 200,\n        enabled: false,\n    }),\n    new Column<ObjectType, string[]>({\n        name: 'Account',\n        allowSorting: false,\n        getValue: member => member.patchedMember.users.filter(u => u.hasAccount).map(u => u.email),\n        format: (accounts) => {\n            if (accounts.length === 0) {\n                return 'Geen account';\n            }\n            return accounts.join(', ');\n        },\n        getStyle: accounts => accounts.length === 0 ? 'gray' : '',\n        minimumWidth: 100,\n        recommendedWidth: 200,\n        enabled: false,\n    }),\n];\n\nif (props.group) {\n    if (props.group.settings.prices.length > 1) {\n        allColumns.push(\n            new Column<ObjectType, GroupPrice[]>({\n                id: 'groupPrice',\n                allowSorting: false,\n                name: $t('a5ecc2e0-c1f2-4cfb-b4b2-8a17782787bc'),\n                getValue: member => member.filterRegistrations({ groups: [props.group!] }).map(r => r.groupPrice),\n                format: prices => Formatter.joinLast(prices.map(o => o.name).sort(), ', ', ' en ') || $t('e41660ea-180a-45ef-987c-e780319c4331'),\n                getStyle: prices => prices.length === 0 ? 'gray' : '',\n                minimumWidth: 100,\n                recommendedWidth: 300,\n            }),\n        );\n    }\n\n    for (const optionMenu of props.group.settings.optionMenus) {\n        allColumns.push(\n            new Column<ObjectType, RegisterItemOption[]>({\n                id: 'optionMenu-' + optionMenu.id,\n                allowSorting: false,\n                name: optionMenu.name,\n                getValue: member => member.filterRegistrations({ groups: [props.group!] }).flatMap((r) => {\n                    const option = r.options.find(o => o.optionMenu.id === optionMenu.id);\n                    if (!option) {\n                        return [];\n                    }\n                    return [option];\n                }),\n                format: (values) => {\n                    if (values.length === 0) {\n                        return 'Geen';\n                    }\n                    return values.map(v => v.option.allowAmount || v.amount > 1 ? (v.amount + 'x ' + v.option.name) : v.option.name).join(', ');\n                },\n                getStyle: values => values.length === 0 ? 'gray' : '',\n                minimumWidth: 100,\n                recommendedWidth: 200,\n            }),\n        );\n    }\n\n    for (const category of props.group.settings.recordCategories) {\n        for (const record of category.getAllRecords()) {\n            allColumns.push(\n                new Column<ObjectType, RecordAnswer | null>({\n                    id: 'record-' + record.id,\n                    allowSorting: false,\n                    name: record.name,\n                    getValue: (member) => {\n                        for (const registration of member.filterRegistrations({ groups: [props.group!] })) {\n                            const answer = registration.recordAnswers.get(record.id);\n                            if (answer) {\n                                return answer;\n                            }\n                        }\n                        return null;\n                    },\n                    format: (answer) => {\n                        if (answer === null) {\n                            return 'Ontbreekt';\n                        }\n                        return answer.stringValue;\n                    },\n                    getStyle: answer => answer === null || answer.isEmpty ? 'gray' : '',\n                    minimumWidth: 100,\n                    recommendedWidth: 200,\n                    enabled: false,\n                }),\n            );\n        }\n    }\n}\n\nif (groups.length) {\n    allColumns.push(\n        new Column<ObjectType, string[]>({\n            id: 'missing-record-categories',\n            allowSorting: false,\n            name: $t('2011b902-ec2f-4c5a-a98a-6e50a1351fae'),\n            getValue: (member) => {\n                const base: string[] = [];\n                const scope = {\n                    scopeGroups: groups,\n                    checkPermissions: {\n                        user: auth.user!,\n                        level: PermissionLevel.Read,\n                    },\n                };\n\n                // Check missing information\n                if (!member.patchedMember.details.phone && member.isPropertyRequired('phone', scope)) {\n                    base.push('telefoonnummer');\n                }\n\n                if (!member.patchedMember.details.email && member.isPropertyRequired('emailAddress', scope)) {\n                    base.push('e-mailadres');\n                }\n\n                if (!member.patchedMember.details.address && member.isPropertyRequired('address', scope)) {\n                    base.push('adres');\n                }\n\n                if (!member.patchedMember.details.birthDay && member.isPropertyRequired('birthDay', scope)) {\n                    base.push('geboortedatum');\n                }\n\n                if (!member.patchedMember.details.nationalRegisterNumber && member.isPropertyRequired('nationalRegisterNumber', scope)) {\n                    base.push('rijksregisternummer');\n                }\n                else {\n                    if (member.isPropertyRequired('parents', scope) && member.isPropertyRequired('nationalRegisterNumber', scope) && !member.patchedMember.details.parents.find(p => p.nationalRegisterNumber)) {\n                        base.push('rijksregisternummer ouders');\n                    }\n                }\n\n                if (member.isPropertyRequired('parents', scope)) {\n                    if (member.patchedMember.details.parents.length === 0) {\n                        base.push('ouders');\n                    }\n                }\n\n                if (member.patchedMember.details.emergencyContacts.length === 0 && member.isPropertyRequired('emergencyContacts', scope)) {\n                    base.push('noodcontactpersonen');\n                }\n\n                const enabledCategories = member.getEnabledRecordCategories(scope);\n\n                const incomplete = enabledCategories.filter(c => !c.isComplete(member));\n                return [...base, ...incomplete.map(c => c.name)];\n            },\n            format: prices => Formatter.capitalizeFirstLetter(Formatter.joinLast(prices, ', ', ' en ') || $t('e41660ea-180a-45ef-987c-e780319c4331')),\n            getStyle: prices => prices.length === 0 ? 'gray' : '',\n            minimumWidth: 100,\n            recommendedWidth: 300,\n            enabled: false,\n        }),\n    );\n}\n\nif (app === 'admin' || (props.group && props.group.settings.requireOrganizationIds.length !== 1 && props.group.type === GroupType.EventRegistration && auth.hasSomePlatformAccess())) {\n    allColumns.push(\n        new Column<ObjectType, Organization[]>({\n            id: 'organization',\n            allowSorting: false,\n            name: $t('2f325358-6e2f-418c-9fea-31a14abbc17a'),\n            getValue: member => member.filterOrganizations({ periodId: filterPeriodId, types: [GroupType.Membership] }),\n            format: organizations => Formatter.joinLast(organizations.map(o => o.name).sort(), ', ', ' en ') || $t('1a16a32a-7ee4-455d-af3d-6073821efa8f'),\n            getStyle: organizations => organizations.length === 0 ? 'gray' : '',\n            minimumWidth: 100,\n            recommendedWidth: 300,\n            enabled: app === 'admin',\n        }),\n    );\n\n    allColumns.push(\n        new Column<ObjectType, Organization[]>({\n            id: 'uri',\n            allowSorting: false,\n            name: $t('9d283cbb-7ba2-4a16-88ec-ff0c19f39674'),\n            getValue: member => member.filterOrganizations({ periodId: filterPeriodId, types: [GroupType.Membership] }),\n            format: organizations => Formatter.joinLast(organizations.map(o => o.uri).sort(), ', ', ' en ') || $t('e41660ea-180a-45ef-987c-e780319c4331'),\n            getStyle: organizations => organizations.length === 0 ? 'gray' : '',\n            minimumWidth: 100,\n            recommendedWidth: 300,\n            enabled: false,\n        }),\n    );\n}\n\n// Who has paid?\nif (props.group && props.group.type === GroupType.EventRegistration && props.group.settings.allowRegistrationsByOrganization) {\n    allColumns.push(\n        new Column<ObjectType, string | null>({\n            id: 'groupRegistration',\n            allowSorting: false,\n            name: $t('7289b10e-a284-40ea-bc57-8287c6566a82'),\n            getValue: (member) => {\n                const registrations = member.filterRegistrations({ groups, periodId: filterPeriodId });\n                if (registrations.find(r => r.payingOrganizationId)) {\n                    const organization = member.organizations.find(o => o.id === registrations[0].payingOrganizationId);\n                    return organization ? organization.name : 'Onbekend';\n                }\n                return null;\n            },\n            format: organizations => organizations || 'Nee',\n            getStyle: organizations => organizations === null ? 'gray' : '',\n            minimumWidth: 100,\n            recommendedWidth: 300,\n            enabled: false,\n        }),\n    );\n}\n\nif (groups.find(g => g.settings.trialDays)) {\n    allColumns.push(\n        new Column<ObjectType, Date | null>({\n            name: 'Proefperiode',\n            allowSorting: false,\n            getValue: (v) => {\n                const registrations = v.filterRegistrations({ groups, periodId: props.periodId ?? props.group?.periodId ?? '' });\n\n                if (registrations.length === 0) {\n                    return null;\n                }\n\n                const now = new Date();\n                const filtered = registrations.filter(r => r.trialUntil && r.trialUntil > now).map(r => r.trialUntil!.getTime());\n\n                if (filtered.length === 0) {\n                    return null;\n                }\n                return new Date(Math.min(...filtered));\n            },\n            format: (v, width) => {\n                if (!v) {\n                    return 'Geen';\n                }\n                return 'Tot ' + (width < 200 ? Formatter.dateNumber(v) : Formatter.date(v));\n            },\n            getStyle: v => v === null ? 'gray' : 'secundary',\n            minimumWidth: 80,\n            recommendedWidth: 160,\n        }),\n    );\n}\n\nallColumns.push(\n    new Column<ObjectType, Date | null>({\n        name: 'Startdatum',\n        allowSorting: false,\n        getValue: (v) => {\n            const registrations = v.filterRegistrations({ groups, periodId: filterPeriodId });\n\n            if (registrations.length === 0) {\n                return null;\n            }\n\n            const filtered = registrations.filter(r => r.startDate).map(r => r.startDate!.getTime());\n\n            if (filtered.length === 0) {\n                return null;\n            }\n            return new Date(Math.min(...filtered));\n        },\n        format: (v, width) => v ? (width < 200 ? (width < 140 ? Formatter.dateNumber(v, false) : Formatter.dateNumber(v, true)) : (width > 240 ? Formatter.dateTime(v) : Formatter.date(v, true))) : 'Onbekend',\n        getStyle: v => v === null ? 'gray' : '',\n        minimumWidth: 80,\n        recommendedWidth: 200,\n        enabled: false,\n    }),\n);\n\nallColumns.push(\n    new Column<ObjectType, Date | null>({\n        name: waitingList.value ? 'Sinds' : 'Inschrijvingsdatum',\n        allowSorting: false,\n        getValue: (v) => {\n            const registrations = v.filterRegistrations({ groups, periodId: filterPeriodId });\n\n            if (registrations.length === 0) {\n                return null;\n            }\n\n            const filtered = registrations.filter(r => r.registeredAt).map(r => r.registeredAt!.getTime());\n\n            if (filtered.length === 0) {\n                return null;\n            }\n            return new Date(Math.min(...filtered));\n        },\n        format: (v, width) => v ? (width < 200 ? (width < 140 ? Formatter.dateNumber(v, false) : Formatter.dateNumber(v, true)) : (width > 240 ? Formatter.dateTime(v) : Formatter.date(v, true))) : 'Onbekend',\n        getStyle: v => v === null ? 'gray' : '',\n        minimumWidth: 80,\n        recommendedWidth: 200,\n    }),\n);\n\nif (!waitingList.value && financialRead.value) {\n    allColumns.push(\n        new Column<ObjectType, number>({\n            name: 'Prijs',\n            allowSorting: false,\n            getValue: v => v.filterRegistrations({ groups: groups }).flatMap(r => r.balances).reduce((sum, r) => sum + (r.amountOpen + r.amountPaid + r.amountPending), 0),\n            format: (outstandingBalance) => {\n                if (outstandingBalance < 0) {\n                    return Formatter.price(outstandingBalance);\n                }\n                if (outstandingBalance <= 0) {\n                    return 'Gratis';\n                }\n                return Formatter.price(outstandingBalance);\n            },\n            getStyle: v => v <= 0 ? 'gray' : '',\n            minimumWidth: 70,\n            recommendedWidth: 80,\n            enabled: false,\n        }),\n    );\n\n    allColumns.push(\n        new Column<ObjectType, number>({\n            name: 'Te betalen',\n            allowSorting: false,\n            getValue: v => v.filterRegistrations({ groups: groups }).flatMap(r => r.balances).reduce((sum, r) => sum + (r.amountOpen), 0),\n            format: (outstandingBalance) => {\n                if (outstandingBalance < 0) {\n                    return Formatter.price(outstandingBalance);\n                }\n                if (outstandingBalance <= 0) {\n                    return 'Betaald';\n                }\n                return Formatter.price(outstandingBalance);\n            },\n            getStyle: v => v <= 0 ? 'gray' : '',\n            minimumWidth: 70,\n            recommendedWidth: 80,\n            enabled: false,\n        }),\n    );\n}\n\nif (props.category) {\n    allColumns.push(\n        new Column<ObjectType, Group[]>({\n            id: 'category',\n            allowSorting: false,\n            name: waitingList.value ? 'Wachtlijst' : (props.category.settings.name || $t('b467444b-879a-4bce-b604-f7e890008c4f')),\n            getValue: (member) => {\n                if (!props.category) {\n                    return [];\n                }\n                const groups = props.category.getAllGroups();\n                const memberGroups = member.filterGroups({ groups: groups, periodId: filterPeriodId });\n                const getIndex = g => groups.findIndex(_g => _g.id === g.id);\n                return memberGroups.sort((a, b) => Sorter.byNumberValue(getIndex(b), getIndex(a)));\n            },\n            format: (groups) => {\n                if (groups.length === 0) {\n                    return 'Geen';\n                }\n                return groups.map(g => g.settings.name).join(', ');\n            },\n            getStyle: groups => groups.length === 0 ? 'gray' : '',\n            minimumWidth: 100,\n            recommendedWidth: 300,\n            enabled: false,\n        }),\n    );\n}\n\nif (!props.group && !props.category) {\n    allColumns.push(\n        new Column<ObjectType, Group[]>({\n            id: 'category',\n            allowSorting: false,\n            name: $t('b467444b-879a-4bce-b604-f7e890008c4f'),\n            getValue: (member) => {\n                let memberGroups = member.filterGroups({ periodId: filterPeriodId, types: [GroupType.Membership, GroupType.WaitingList] });\n                if (app === 'admin') {\n                    memberGroups = memberGroups.filter(g => g.defaultAgeGroupId !== null);\n                }\n                return memberGroups.sort((a, b) => Sorter.byStringValue(a.settings.name, b.settings.name));\n            },\n            format: (groups) => {\n                if (groups.length === 0) {\n                    return 'Geen';\n                }\n                return groups.map(g => g.settings.name).join(', ');\n            },\n            getStyle: groups => groups.length === 0 ? 'gray' : '',\n            minimumWidth: 100,\n            recommendedWidth: 300,\n            enabled: false,\n        }),\n    );\n}\n\nconst Route = {\n    Component: MemberSegmentedView,\n    objectKey: 'member',\n    getProperties: () => ({\n        group: props.group,\n    }),\n};\n\nconst actionBuilder = useDirectMemberActions({\n    groups: props.group ? [props.group] : (props.category ? props.category.getAllGroups() : []),\n});\n\nconst chooseOrganizationMembersForGroup = useChooseOrganizationMembersForGroup();\nlet canAdd = (props.group ? auth.canRegisterMembersInGroup(props.group) : false);\nif (!organization.value) {\n    // For now not possible via admin panel\n    canAdd = false;\n}\n\n// registrations for events of another organization should not be editable\nconst excludeEdit = props.group && props.group.type === GroupType.EventRegistration && !!organization.value && props.group.organizationId !== organization.value.id;\n\nconst actions: TableAction<ObjectType>[] = [\n    new InMemoryTableAction({\n        name: 'Leden inschrijven',\n        icon: 'add',\n        priority: 0,\n        groupIndex: 1,\n        needsSelection: false,\n        enabled: canAdd,\n        handler: async () => {\n            await chooseOrganizationMembersForGroup({\n                members: [],\n                group: props.group!,\n            });\n        },\n    }),\n    ...actionBuilder.getActions({ selectedOrganizationRegistrationPeriod: organizationRegistrationPeriod.value, includeMove: true, includeEdit: !excludeEdit }),\n];\n\nif (app !== 'admin' && auth.canManagePayments()) {\n    actions.push(new AsyncTableAction({\n        name: 'Bedrag aanrekenen',\n        icon: 'calculator',\n        priority: 13,\n        groupIndex: 4,\n        handler: async (selection: TableActionSelection<ObjectType>) => {\n            await present({\n                modalDisplayStyle: 'popup',\n                components: [\n                    new ComponentWithProperties(ChargeMembersView, {\n                        filter: selection.filter.filter,\n                        organization: organization.value!,\n                    }),\n                ],\n            });\n        },\n    }));\n}\n</script>\n","export default import.meta.ROLLUP_FILE_URL_cres4tNw;","export default import.meta.ROLLUP_FILE_URL_o$BCv$ko;","<template>\n    <div class=\"code-input\">\n        <div :class=\"{small: codeLength > 6}\">\n            <!-- Name incluses 'search' to disable safari autocomplete, who tries to autocomplete an email in a number input?! -->\n            <template v-for=\"index in codeLength\" :key=\"index\">\n                <input \n                    ref=\"numberInput\" \n                    :inputmode=\"numbersOnly ? 'numeric' : undefined\" \n                    class=\"input\" \n                    :class=\"{small: codeLength > 6}\"\n                    autocomplete=\"one-time-code\"\n                    :name=\"'search-code_'+index\" \n                    @input=\"onInput(index - 1)\" \n                    @click=\"selectNext(index - 1)\" \n                    @keyup.delete=\"clearInput(index - 1)\" \n                    @keyup.left=\"selectNext(index - 2)\" \n                    @keyup.right=\"selectNext(index)\"\n                    @change=\"updateValue\"\n                >\n                <span v-if=\"index%spaceLength === 0 && index !== codeLength\" class=\"bump\">-</span>\n                <span v-if=\"index%(spaceLength*2) === 0 && index !== codeLength\" class=\"break\"></span>\n            </template>\n        </div>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { Component, Prop, VueComponent, Watch } from \"@simonbackx/vue-app-navigation/classes\";\n\n@Component({\n    emits: ['update:modelValue', 'complete']\n})\nexport default class CodeInput extends VueComponent {\n    valid = true;\n\n    @Prop({ default: \"\" })\n        modelValue!: string\n\n    @Prop({ default: 6 })\n        codeLength!: number\n\n    @Prop({ default: 3 })\n        spaceLength!: number\n\n    @Prop({ default: true })\n        numbersOnly!: boolean\n\n    @Watch(\"modelValue\")\n    onValueChanged(value: string, _oldValue: string) {\n        if (value === _oldValue) {\n            return\n        }\n        if (value === this.getInternalValue()) {\n            return\n        }\n        if (!(this.$refs && this.$refs.numberInput && Array.isArray(this.$refs.numberInput))) {\n            return\n        }\n        for (let index = 0; index < this.codeLength; index++) {\n            const element = this.$refs.numberInput[index] as HTMLInputElement;\n            \n            if (index < value.length) {\n                const letter = value[index]\n                element.value = letter\n            } else {\n                element.value = \"\"\n            }\n        }\n    }\n\n    mounted() {\n        setTimeout(() => {\n            this.selectNext(0)\n        }, 300)\n    }\n\n    onInput(index: number) {\n        if (!(this.$refs && this.$refs.numberInput && Array.isArray(this.$refs.numberInput))) {\n            return\n        }\n\n        const input = this.$refs.numberInput[index] as HTMLInputElement;\n        input.value = this.numbersOnly ? (input.value as string).replace(/[^0-9]/g, '') : (input.value as string).toLocaleUpperCase().replace(/[^0-9A-Z]/g, '')\n        if (input.value.length >= 1) {\n            this.selectNext(index + 1)\n        }\n    }\n\n    clearInput(index: number, select = true) {\n        if (!(this.$refs && this.$refs.numberInput && Array.isArray(this.$refs.numberInput))) {\n            return\n        }\n\n        // Move everything one to the left\n        const input = this.$refs.numberInput[index] as HTMLInputElement;\n        if (input.value.length === 0 && index < this.codeLength - 1) {\n            input.value = (this.$refs.numberInput[index + 1] as HTMLInputElement).value;\n            (this.$refs.numberInput[index + 1] as HTMLInputElement).value = \"\"\n            this.clearInput(index + 1, false)\n        }\n\n        if (select) {\n            if (index > 0) {\n                this.selectNext(index - 1)\n            } else {\n                // reselect\n                this.selectNext(index)\n            }\n            this.updateValue()\n        }\n    }\n\n    selectNext(index: number) {\n        if (index < 0) {\n            return\n        }\n\n        if (!(this.$refs && this.$refs.numberInput && Array.isArray(this.$refs.numberInput))) {\n            return\n        }\n\n        console.log(\"select next \", index)\n        if (index >= this.codeLength) {\n            const prev = this.$refs.numberInput[index - 1] as HTMLInputElement;\n            const val = prev.value;\n            if (val.length > 1) {\n                prev.value = val.substr(0, 1)\n            }\n            for (let index = 0; index < this.codeLength; index++) {\n                const element = this.$refs.numberInput[index] as HTMLInputElement;\n                element.blur()\n            }\n            this.updateValue()\n\n            if (this.getInternalValue().length === this.codeLength) {\n                this.$emit(\"complete\")\n            }\n            return\n        }\n        if (index >= 1) {\n            const prev = this.$refs.numberInput[index - 1] as HTMLInputElement;\n            const val = prev.value;\n            if (val.length > 1) {\n                prev.value = val.substr(0, 1);\n                (this.$refs.numberInput[index] as HTMLInputElement).value = val.substr(1)\n                this.selectNext(index + 1)\n                return\n            }\n        }\n        (this.$refs.numberInput[index] as HTMLInputElement).focus();\n\n        if ((this.$refs.numberInput[index] as HTMLInputElement).value.length > 0) {\n            // iOS fix\n            (this.$refs.numberInput[index] as HTMLInputElement).select();\n        }\n        this.updateValue()\n    }\n\n    getInternalValue() {\n        if (!(this.$refs && this.$refs.numberInput && Array.isArray(this.$refs.numberInput))) {\n            return \"\"\n        }\n\n        let val = \"\"\n        for (let index = 0; index < this.codeLength; index++) {\n            const element = this.$refs.numberInput[index] as HTMLInputElement;\n            const letter = element.value.substr(0, 1).toUpperCase()\n            val += letter\n            if (letter.length === 0) {\n                break\n            }\n        }\n        return val\n    }\n\n    updateValue() {\n        this.$emit('update:modelValue', this.getInternalValue())\n    }\n\n}\n</script>\n\n<!-- Add \"scoped\" attribute to limit CSS to this component only -->\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/text-styles.scss\" as *;\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n\n.code-input {\n    -webkit-touch-callout: none !important;\n\n    > div {\n        display: inline-flex;\n        flex-direction: row;\n\n        .input {\n            margin: 0 2px;\n            max-width: 32px;\n            padding-left: 0;\n            padding-right: 0;\n            text-align: center;\n            font-size: 20px;\n            caret-color: transparent;\n            text-transform: uppercase;\n            -webkit-touch-callout: none !important;\n        }\n\n        .bump {\n            width: 15px;\n            align-self: center;\n            text-align: center;\n            font-size: 20px;\n            line-height: 1;\n            font-weight: $font-weight-default;\n            color: $color-gray-text;\n        }\n\n        &.small {\n            flex-wrap: wrap;\n            row-gap: 5px;\n\n            @media (max-width: 600px) {\n                .break {\n                    width: auto;\n                    flex-basis: 100%;\n                    opacity: 0;\n                    height: 0;\n                }\n            }\n        }\n\n    }\n}\n\n</style>\n","<template>\n    <SaveView :title=\"title\" :loading=\"loading\" :save-text=\"isDuplicate ? 'Doorgaan' : saveText\" @save=\"save\">\n        <template v-if=\"isDuplicate\">\n            <h1>Krijg toegang tot de gegevens van {{ cloned.patchedMember.details.firstName }}</h1>\n            <p>{{ cloned.patchedMember.details.firstName }} is al gekend in ons systeem, maar jouw e-mailadres niet. Om toegang te krijgen heb je de beveiligingscode nodig.</p>\n\n            <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n            <STInputBox title=\"Beveiligingscode\" error-fields=\"code\" :error-box=\"errors.errorBox\" class=\"max\">\n                <CodeInput v-model=\"code\" :code-length=\"16\" :space-length=\"4\" :numbers-only=\"false\" @complete=\"save\" />\n            </STInputBox>\n\n            <hr>\n            <h2>Waar vind ik deze code?</h2>\n\n            <STList class=\"illustration-list\">\n                <STListItem class=\"left-center\">\n                    <template #left>\n                        <img src=\"@stamhoofd/assets/images/illustrations/communication.svg\">\n                    </template>\n                    <h2 class=\"style-title-list\">\n                        Vraag de code aan jouw leiding\n                    </h2>\n                    <p class=\"style-description\">\n                        {{ $t('f5229cc1-c908-4409-855a-1dba40371815') }}\n                    </p>\n                </STListItem>\n\n                <STListItem class=\"left-center\">\n                    <template #left>\n                        <img src=\"@stamhoofd/assets/images/illustrations/email.svg\">\n                    </template>\n                    <h2 class=\"style-title-list\">\n                        Zoek de code onderaan een e-mail die je van ons kreeg\n                    </h2>\n                    <p class=\"style-description\">\n                        Zoek de laatste (recente) e-mail die je van ons kreeg op een e-mailadres die we wél kennen. Daar vind je normaal een beveiligingscode.\n                    </p>\n                </STListItem>\n            </STList>\n        </template>\n        <component :is=\"component\" v-else :validator=\"errors.validator\" :parent-error-box=\"errors.errorBox\" :member=\"cloned\" :will-mark-reviewed=\"willMarkReviewed\" v-bind=\"$attrs\" :level=\"1\" />\n    </SaveView>\n</template>\n\n<script setup lang=\"ts\">\nimport { patchContainsChanges } from '@simonbackx/simple-encoding';\nimport { useDismiss, usePop, usePresent, useShow } from '@simonbackx/vue-app-navigation';\nimport { PlatformMember, Version } from '@stamhoofd/structures';\nimport { ComponentOptions, computed, onActivated, Ref, ref } from 'vue';\n\nimport { isSimpleError, isSimpleErrors, SimpleError } from '@simonbackx/simple-errors';\nimport { useAppContext } from '../context';\nimport { ErrorBox } from '../errors/ErrorBox';\nimport { useErrors } from '../errors/useErrors';\nimport CodeInput from '../inputs/CodeInput.vue';\nimport { CenteredMessage } from '../overlays/CenteredMessage';\nimport { Toast } from '../overlays/Toast';\nimport { NavigationActions } from '../types/NavigationActions';\nimport { usePlatformFamilyManager } from './PlatformFamilyManager';\n\ndefineOptions({\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(\n    defineProps<{\n        title: string;\n        saveText?: string;\n        component: ComponentOptions;\n        // do not change this\n        member: PlatformMember;\n        // Whether the member should be saved to the API\n        doSave?: boolean;\n        markReviewed?: string[];\n        saveHandler?: ((navigate: NavigationActions) => Promise<void> | void) | null;\n    }>(), {\n        doSave: true,\n        saveText: 'Opslaan',\n        saveHandler: null,\n        markReviewed: () => [],\n    },\n);\n\n// We use a clone, so we don't propate the patches to the rest of the app until the save was successful\nconst cloned = ref(props.member.clone() as any) as Ref<PlatformMember>;\n\nonActivated(() => {\n    /**\n     * Update the clone when the component is activated again\n     * because the member could have been patched in other steps.\n     */\n    const newClone = props.member.clone();\n    newClone.addPatch(cloned.value.patch);\n    cloned.value = newClone;\n});\n\nconst show = useShow();\nconst present = usePresent();\nconst dismiss = useDismiss();\nconst pop = usePop();\nconst loading = ref(false);\nconst errors = useErrors();\nconst manager = usePlatformFamilyManager();\nconst app = useAppContext();\nconst isAdmin = app === 'dashboard' || app === 'admin';\nconst willMarkReviewed = !isAdmin;\nconst isDuplicate = ref(false);\nconst code = ref('');\n\nfunction patchMemberWithReviewed(member: PlatformMember) {\n    if (props.markReviewed.length && willMarkReviewed) {\n        const times = member.patchedMember.details.reviewTimes.clone();\n\n        for (const r of props.markReviewed) {\n            times.markReviewed(r as any, new Date());\n        }\n\n        member.addDetailsPatch({\n            reviewTimes: times,\n        });\n    }\n}\n\nasync function save() {\n    if (loading.value) {\n        return;\n    }\n\n    loading.value = true;\n\n    try {\n        if (!await errors.validator.validate()) {\n            loading.value = false;\n            return;\n        }\n\n        if (isDuplicate.value) {\n            if (code.value.length !== 16) {\n                errors.errorBox = new ErrorBox(new SimpleError({\n                    code: 'invalid_field',\n                    message: 'Vul de beveiligingscode in',\n                    field: 'code',\n                }));\n                loading.value = false;\n                return;\n            }\n\n            // Set security code on member details - this allows the backend to go through with the request\n            cloned.value.addDetailsPatch({\n                securityCode: code.value,\n            });\n        }\n\n        if (props.doSave) {\n            // Extra clone for saving, so the view doesn't change during saving\n            const saveClone = cloned.value.clone();\n            patchMemberWithReviewed(saveClone);\n            await manager.save(saveClone.family.members);\n            props.member.family.copyFromClone(saveClone.family);\n            cloned.value = saveClone;\n        }\n        else {\n            // Copy over clone\n            patchMemberWithReviewed(cloned.value);\n            props.member.family.copyFromClone(cloned.value.family);\n        }\n\n        if (isDuplicate.value) {\n            Toast.success($t('c113898b-d8ce-47ca-915d-2d069496aa88', { name: cloned.value.patchedMember.details.firstName })).show();\n            isDuplicate.value = false;\n        }\n\n        if (props.saveHandler) {\n            await props.saveHandler({\n                show, present, dismiss, pop,\n            });\n        }\n        else {\n            await pop({ force: true });\n        }\n    }\n    catch (e) {\n        if (isSimpleError(e) || isSimpleErrors(e)) {\n            if (e.hasCode('known_member_missing_rights')) {\n                isDuplicate.value = true;\n                loading.value = false;\n                return;\n            }\n        }\n        errors.errorBox = new ErrorBox(e);\n    }\n    loading.value = false;\n}\n\nconst hasChanges = computed(() => {\n    return cloned.value.isNew || patchContainsChanges(cloned.value.patch, cloned.value.member, { version: Version });\n});\n\nasync function shouldNavigateAway() {\n    if (!hasChanges.value && !loading.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm('Ben je zeker dat je wilt sluiten zonder op te slaan?', 'Niet opslaan');\n}\n\ndefineExpose({\n    shouldNavigateAway,\n});\n\n</script>\n","<template>\n    <STListItem :selectable=\"true\">\n        <template #left>\n            <GroupIconWithWaitingList :group=\"group\" :icon=\"willChangeToWaitingList ? 'clock' : ''\" />\n        </template>\n\n        <h4 class=\"style-title-list \">\n            {{ group.settings.name }}\n        </h4>\n\n        <p v-if=\"group.settings.description\" class=\"style-description-small style-limit-lines\">\n            {{ group.settings.description.trim() }}\n        </p>\n\n        <template #right>\n            <span v-if=\"validationWarning\" v-tooltip=\"validationWarning\" class=\"icon warning yellow\" />\n            <span class=\"icon arrow-right-small gray\" />\n        </template>\n    </STListItem>\n</template>\n\n<script setup lang=\"ts\">\nimport { Group, Organization, PlatformMember, RegisterItem } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport GroupIconWithWaitingList from './GroupIconWithWaitingList.vue';\n\nconst props = defineProps<{\n    group: Group;\n    member: PlatformMember;\n    organization: Organization;\n}>();\n\nconst willChangeToWaitingList = computed(() => {\n    return !props.member.canRegister(props.group, props.organization) && props.member.canRegisterForWaitingList(props.group, props.organization);\n});\n\nconst item = RegisterItem.defaultFor(props.member, props.group, props.organization);\n\nconst validationWarning = computed(() => {\n    if (item.validationError) {\n        return null;\n    }\n\n    if (item.validationWarning) {\n        return item.validationWarning;\n    }\n\n    return null;\n});\n</script>\n","<template>\n    <SearchOrganizationView v-if=\"!selectedOrganization\" :member=\"member\" :select-organization=\"addOrganization\" :title=\"searchOrganizationTitle\" />\n    <div v-else class=\"st-view\">\n        <STNavigationBar :title=\"member.patchedMember.name\" />\n\n        <main class=\"center\">\n            <h1>Waarvoor wil je {{ member.patchedMember.firstName }} inschrijven?</h1>\n\n            <ScrollableSegmentedControl v-if=\"allowChangingOrganization\" v-model=\"selectedOrganization\" :items=\"items\" :labels=\"labels\">\n                <template #right>\n                    <button v-tooltip=\"'Bij een andere vereniging inschrijven'\" class=\"button icon gray add\" type=\"button\" @click=\"searchOrganization\" />\n                </template>\n            </ScrollableSegmentedControl>\n\n            <p v-if=\"differentOrganization\" class=\"info-box icon basket\">\n                Reken eerst jouw huidige winkelmandje af. Je kan de huidige inhoud van jouw winkelmandje niet samen afrekenen met een inschrijving bij {{ selectedOrganization.name }}.\n            </p>\n\n            <template v-else>\n                <p v-if=\"alreadyRegisteredMessage\" class=\"info-box\">\n                    {{ alreadyRegisteredMessage }}\n                </p>\n                <p v-if=\"noGroupsMessage\" class=\"info-box\">\n                    {{ noGroupsMessage }}\n                </p>\n            </template>\n\n            <div v-for=\"(category, index) of tree.categories\" :key=\"category.id\" class=\"container\">\n                <hr v-if=\"index > 0 || !allowChangingOrganization\">\n                <h2 class=\"style-with-button\">\n                    <div>\n                        {{ category.settings.name }}\n                        <span v-if=\"!category.settings.public\" v-tooltip=\"'Deze categorie is niet zichtbaar voor gewone leden'\" class=\"icon lock gray\" />\n                    </div>\n                    <div>\n                        <span class=\"title-suffix\">{{ selectedOrganization.period.period.nameShort }}</span>\n                    </div>\n                </h2>\n                <STList class=\"illustration-list\">\n                    <RegisterMemberGroupRow v-for=\"group in category.groups\" :key=\"group.id\" :group=\"group\" :member=\"member\" :organization=\"selectedOrganization\" @click=\"openGroup(group)\" />\n                </STList>\n            </div>\n        </main>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ComponentWithProperties, usePresent } from '@simonbackx/vue-app-navigation';\nimport { NavigationActions, ScrollableSegmentedControl, Toast, useAppContext, useNavigationActions, useOrganization, useUninheritedPermissions } from '@stamhoofd/components';\nimport { Group, GroupCategoryTree, GroupType, Organization, PlatformMember } from '@stamhoofd/structures';\nimport { computed, onMounted, Ref, ref, watch } from 'vue';\n\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { Formatter } from '@stamhoofd/utility';\nimport RegisterMemberGroupRow from './components/group/RegisterMemberGroupRow.vue';\nimport SearchOrganizationView from './SearchOrganizationView.vue';\n\nconst props = defineProps<{\n    member: PlatformMember;\n    selectionHandler: (data: { group: Group; groupOrganization: Organization }, navigate: NavigationActions) => Promise<void> | void;\n}>();\n\nconst selectedOrganization = ref((props.member.organizations[0] ?? null) as any) as Ref<Organization | null>;\nconst auth = useUninheritedPermissions({ patchedOrganization: selectedOrganization });\nconst present = usePresent();\nconst app = useAppContext();\nconst $t = useTranslate();\nconst searchOrganizationTitle = computed(() => $t('2669729c-718d-49a1-9e4f-b3a65a6479a8', { firstName: props.member.patchedMember.firstName }));\nconst navigate = useNavigationActions();\nconst organization = useOrganization();\nconst differentOrganization = computed(() => selectedOrganization.value && !props.member.family.checkout.cart.isEmpty && props.member.family.checkout.singleOrganization?.id !== selectedOrganization.value.id);\n\nwatch(selectedOrganization, () => {\n    checkOrganization();\n});\n\nfunction checkOrganization() {\n    if (app !== 'registration') {\n        if (!organization.value) {\n            // Administration panel: register as organizing organization\n            props.member.family.checkout.asOrganizationId = selectedOrganization.value?.id ?? null;\n        }\n        else {\n            props.member.family.checkout.asOrganizationId = organization.value.id;\n        }\n        props.member.family.checkout.defaultOrganization = selectedOrganization.value;\n    }\n}\n\nonMounted(() => {\n    checkOrganization();\n});\n\nconst items = computed(() => {\n    return props.member.organizations;\n});\nconst labels = computed(() => {\n    return items.value.map(o => o.name);\n});\nconst allowChangingOrganization = STAMHOOFD.userMode === 'platform' && (app === 'registration' || app === 'admin');\n\nconst tree = computed(() => treeFactory({\n    filterGroups: (g) => {\n        return props.member.family.checkout.isAdminFromSameOrganization || props.member.canRegister(g, selectedOrganization.value!) || props.member.canRegisterForWaitingList(g, selectedOrganization.value!);\n    },\n}));\n\nconst alreadyRegisteredGroups = computed(() => {\n    const organizationId = selectedOrganization.value?.id;\n\n    if (!organizationId) {\n        return [];\n    }\n\n    return props.member.filterGroups({ organizationId, currentPeriod: true, includePending: false, types: [GroupType.WaitingList, GroupType.Membership] });\n});\n\nconst alreadyRegisteredMessage = computed(() => {\n    const groups = alreadyRegisteredGroups.value;\n\n    if (groups.length > 0) {\n        const firstName = props.member.patchedMember.firstName;\n        const groupsString = Formatter.joinLast(groups.map(g => g.settings.name), ', ', ' en ');\n        return `${firstName} is reeds ingeschreven bij ${groupsString}.`;\n    }\n\n    return null;\n});\n\nfunction treeFactory({ filterGroups }: { filterGroups?: ((group: Group) => boolean) | undefined }) {\n    if (!selectedOrganization.value) {\n        return GroupCategoryTree.create({});\n    }\n    return selectedOrganization.value.getCategoryTree({\n        maxDepth: 1,\n        admin: !!auth.permissions,\n        smartCombine: true, // don't concat group names with multiple levels if all categories only contain one group\n        filterGroups,\n    });\n}\n\nconst noGroupsMessage = computed(() => {\n    if (tree.value.categories.length > 0) {\n        return null;\n    }\n\n    const groups = alreadyRegisteredGroups.value;\n\n    const firstName = props.member.patchedMember.firstName;\n    const organizationName = selectedOrganization.value?.name;\n\n    if (groups.length > 0) {\n        return `Er zijn geen andere groepen bij ${organizationName} waarvoor ${firstName} kan inschrijven. Dit kan het geval zijn als: de inschrijvingen gesloten zijn of als dit lid in geen enkele andere groep 'past' (bv. leeftijd).`;\n    }\n\n    return `${firstName} kan je op dit moment niet inschrijven bij ${organizationName}. Dit kan het geval zijn als: de inschrijvingen gesloten zijn of als dit lid in geen enkele groep 'past' (bv. leeftijd).`;\n});\n\nfunction addOrganization(organization: Organization) {\n    props.member.insertOrganization(organization);\n    selectedOrganization.value = organization;\n}\n\nasync function openGroup(group: Group) {\n    try {\n        await props.selectionHandler({ group, groupOrganization: selectedOrganization.value! }, navigate);\n    }\n    catch (e) {\n        Toast.fromError(e).show();\n    }\n}\n\nasync function searchOrganization() {\n    await present({\n        url: 'zoeken',\n        components: [\n            new ComponentWithProperties(SearchOrganizationView, {\n                title: searchOrganizationTitle.value,\n                selectOrganization: async (organization: Organization, { pop }: NavigationActions) => {\n                    addOrganization(organization);\n                    await pop({ force: true });\n                },\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\n</script>\n","<template>\n    <STInputBox :title=\"title\" error-fields=\"birthDay\" :error-box=\"errors.errorBox\">\n        <div class=\"input birth-day-selection\">\n            <div class=\"input-icon-container right icon arrow-down-small gray\">\n                <select v-model=\"day\" autocomplete=\"bday-day\" name=\"bday-day\" @change=\"updateDate\">\n                    <!-- name is needed for autocomplete in safari -->\n                    <option :disabled=\"required\" :value=\"null\">\n                        Dag\n                    </option>\n                    <option v-for=\"day in 31\" :key=\"day\" :value=\"day\" autocomplete=\"bday-day\">\n                        {{ day }}\n                    </option>\n                </select>\n            </div>\n\n            <div class=\"input-icon-container right icon arrow-down-small gray\">\n                <select v-model=\"month\" autocomplete=\"bday-month\" name=\"bday-month\" @change=\"updateDate\">\n                    <option :disabled=\"required\" :value=\"null\">\n                        Maand\n                    </option>\n                    <option v-for=\"month in 12\" :key=\"month\" :value=\"month\" autocomplete=\"bday-month\">\n                        {{ monthText(month) }}\n                    </option>\n                </select>\n            </div>\n\n            <div class=\"input-icon-container right icon arrow-down-small gray\">\n                <select v-model=\"year\" autocomplete=\"bday-year\" name=\"bday-year\" @change=\"updateDate\">\n                    <option :disabled=\"required\" :value=\"null\">\n                        Jaar\n                    </option>\n                    <option v-for=\"year in 100\" :key=\"year\" :value=\"currentYear - year + 1\" autocomplete=\"bday-year\">\n                        {{ currentYear - year + 1 }}\n                    </option>\n                </select>\n            </div>\n        </div>\n        <template #right>\n            <slot name=\"right\" />\n        </template>\n    </STInputBox>\n</template>\n\n<script lang=\"ts\" setup>\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { Formatter } from \"@stamhoofd/utility\";\n\nimport { ref, watch } from 'vue';\nimport { ErrorBox } from \"../errors/ErrorBox\";\nimport { useErrors } from '../errors/useErrors';\nimport { useValidation } from '../errors/useValidation';\nimport { Validator } from \"../errors/Validator\";\nimport STInputBox from \"./STInputBox.vue\";\n\nconst props = withDefaults(defineProps<{\n    title: string,\n    required: boolean,\n    validator: Validator | null\n}>(), {\n    title: '',\n    required: true,\n    validator: null\n});\n\nconst model = defineModel<Date | null>({default: null});\n\nconst errors = useErrors({ validator: props.validator });\n\nconst day = ref(model.value?.getDate() ?? null);\nconst month = ref( model.value ? model.value.getMonth() + 1 : null);\nconst year = ref(model.value?.getFullYear() ?? null);\nconst currentYear = new Date().getFullYear();\n\nuseValidation(errors.validator, validate);\n\nwatch(() => model.value, (val: Date | null) => {\n    if (val) {\n        day.value = val.getDate()\n        month.value = val.getMonth() + 1\n        year.value = val.getFullYear()\n    } else {\n        day.value = null;\n        month.value = null;\n        year.value = null;\n    }\n})\n\nfunction monthText(month: number) {\n    return Formatter.month(month)\n}\n\nfunction updateDate() {\n    if (year.value && month.value && day.value) {\n        model.value = new Date(year.value, month.value - 1, day.value, 12)\n    } else {\n        model.value = null;\n    }\n}\n\nfunction validate() {\n    if (year.value && month.value && day.value) {\n        if (!model.value) {\n            model.value =  new Date(year.value, month.value - 1, day.value, 12)\n        }\n        errors.errorBox = null;\n        return true\n    }\n\n    if (!props.required) {\n        errors.errorBox = null\n\n        if (model.value !== null) {\n            model.value = null;\n        }\n        return true\n    }\n\n    if (model.value !== null) {\n        model.value = null;\n    }\n\n    errors.errorBox = new ErrorBox(new SimpleError({\n        code: \"empty_field\",\n        message: \"Vul de geboortedatum in\",\n        field: \"birthDay\"\n    }))\n\n    return false\n}\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/text-styles.scss\" as *;\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n\n.input.birth-day-selection {\n    padding-right: 0;\n    display: grid;\n    grid-template-columns: auto 1fr auto;\n    grid-template-rows: auto;\n    align-items: stretch;\n\n    > div {\n        display: flex;\n        align-items: stretch;\n\n        > select {\n            @extend .style-input;\n            color: $color-dark;\n        }\n\n        // Remove dotted line in Firefox\n        > select:-moz-focusring {\n            color: transparent;\n            text-shadow: 0 0 0 #000;\n        }\n    }\n\n}\n</style>\n","<template>\n    <div class=\"radio-group\">\n        <slot />\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { Component, VueComponent } from \"@simonbackx/vue-app-navigation/classes\";\n\n@Component\nexport default class RadioGroup extends VueComponent {}\n</script>\n\n<style lang=\"scss\">\n.radio-group {\n    display: flex;\n    flex-wrap: wrap;\n\n    .radio {\n        flex-shrink: 0;\n        padding-right: 20px;\n    }\n\n    &.column {\n        flex-direction: column;\n        flex-wrap: nowrap;\n\n        .radio {\n            padding-right: 0px;\n        }\n    }\n\n    @media (max-width: 550px) {\n        flex-direction: column;\n        flex-wrap: nowrap;\n\n        .radio {\n            padding-right: 0px;\n        }\n    }\n}\n</style>\n","<template>\n    <STInputBox :title=\"$t('99b87ddc-3a72-45fa-923a-10bf130fb4de')\" error-fields=\"trackingYear\" :error-box=\"errors.errorBox\">\n        <NumberInput v-model=\"trackingYear\" :title=\"$t('99b87ddc-3a72-45fa-923a-10bf130fb4de')\" :validator=\"errors.validator\" :min=\"1900\" :max=\"max\" />\n        <template #right>\n            <slot name=\"right\" />\n        </template>\n    </STInputBox>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useErrors } from '../errors/useErrors';\nimport { Validator } from '../errors/Validator';\nimport NumberInput from './NumberInput.vue';\nimport STInputBox from './STInputBox.vue';\n\nconst props = withDefaults(defineProps<{\n    required: boolean;\n    validator: Validator | null;\n}>(), {\n    required: true,\n    validator: null,\n});\n\nconst max = new Date().getFullYear();\nconst trackingYear = defineModel<number>({ default: new Date().getFullYear() });\nconst errors = useErrors({ validator: props.validator });\n</script>\n","<template>\n    <div class=\"container\">\n        <Title v-bind=\"$attrs\" :title=\"title\" />\n\n        <STErrorsDefault :error-box=\"parentErrorBox\" />\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n        <div class=\"split-inputs\">\n            <div>\n                <STInputBox title=\"Naam\" error-fields=\"firstName,lastName\" :error-box=\"errors.errorBox\">\n                    <div class=\"input-group\">\n                        <div>\n                            <input v-model=\"firstName\" class=\"input\" type=\"text\" placeholder=\"Voornaam\" autocomplete=\"given-name\">\n                        </div>\n                        <div>\n                            <input v-model=\"lastName\" class=\"input\" type=\"text\" placeholder=\"Achternaam\" autocomplete=\"family-name\">\n                        </div>\n                    </div>\n                </STInputBox>\n\n                <BirthDayInput v-if=\"isPropertyEnabled('birthDay') || birthDay\" v-model=\"birthDay\" :title=\"isPropertyRequired('birthDay') ? 'Geboortedatum' : 'Geboortedatum (optioneel)'\" :validator=\"validator\" :required=\"isPropertyRequired('birthDay')\">\n                    <template v-if=\"!trackingYear && isAdmin\" #right>\n                        <button class=\"button icon more-horizontal small gray\" type=\"button\" @click=\"showBirthDayMenu\" />\n                    </template>\n                </BirthDayInput>\n\n                <template v-if=\"isAdmin && trackingYear\">\n                    <TrackingYearInput v-model=\"trackingYear\" :required=\"false\" :validator=\"validator\">\n                        <template #right>\n                            <button v-tooltip=\"'Volgjaar verwijderen'\" class=\"button icon trash small gray\" type=\"button\" @click=\"deleteTrackingYear\" />\n                        </template>\n                    </TrackingYearInput>\n                    <p class=\"style-description-small\">\n                        {{ $t('3ebf23d3-9609-42b3-b7ae-54bd9c4d08a1') }}\n                    </p>\n                </template>\n\n                <STInputBox v-if=\"isPropertyEnabled('gender') || gender !== Gender.Other\" title=\"Identificeert zich als...\" error-fields=\"gender\" :error-box=\"errors.errorBox\">\n                    <RadioGroup>\n                        <Radio v-model=\"gender\" :value=\"Gender.Male\" autocomplete=\"sex\" name=\"sex\">\n                            Man\n                        </Radio>\n                        <Radio v-model=\"gender\" :value=\"Gender.Female\" autocomplete=\"sex\" name=\"sex\">\n                            Vrouw\n                        </Radio>\n                        <Radio v-model=\"gender\" :value=\"Gender.Other\" autocomplete=\"sex\" name=\"sex\">\n                            Andere\n                        </Radio>\n                    </RadioGroup>\n                </STInputBox>\n\n                <PhoneInput v-if=\"!member.isNew && (isPropertyEnabled('phone') || phone)\" v-model=\"phone\" :title=\"$t('90d84282-3274-4d85-81cd-b2ae95429c34') + lidSuffix \" :validator=\"validator\" :required=\"isPropertyRequired('phone')\" :placeholder=\"isPropertyRequired('phone') ? 'Enkel van lid zelf': 'Optioneel. Enkel van lid zelf'\" />\n                <EmailInput v-if=\"(!member.isNew || birthDay) && (isPropertyEnabled('emailAddress') || email)\" v-model=\"email\" :required=\"isPropertyRequired('emailAddress')\" :title=\"'E-mailadres' + lidSuffix \" :placeholder=\"isPropertyRequired('emailAddress') ? 'Enkel van lid zelf': 'Optioneel. Enkel van lid zelf'\" :validator=\"validator\">\n                    <template #right>\n                        <button v-tooltip=\"'Alternatief e-mailadres toevoegen'\" class=\"button icon add small gray\" type=\"button\" @click=\"addEmail\" />\n                    </template>\n                </EmailInput>\n                <EmailInput\n                    v-for=\"n in alternativeEmails.length\"\n                    :key=\"n\"\n                    :model-value=\"getEmail(n - 1)\"\n                    :required=\"true\"\n                    :title=\"'Alternatief e-mailadres ' + (alternativeEmails.length > 1 ? n : '') \"\n                    :placeholder=\"'Enkel van lid zelf'\"\n                    :validator=\"validator\"\n                    @update:model-value=\"setEmail(n - 1, $event)\"\n                >\n                    <template #right>\n                        <button class=\"button icon trash small gray\" type=\"button\" @click=\"deleteEmail(n - 1)\" />\n                    </template>\n                </EmailInput>\n                <div v-if=\"!member.isNew && (isPropertyEnabled('emailAddress') || email)\">\n                    <p class=\"style-description-small\">\n                        {{ member.patchedMember.firstName }} kan zelf inloggen of registreren op <template v-if=\"alternativeEmails.length\">\n                            één van de ingevoerde e-mailadressen.\n                        </template><template v-else>\n                            het ingevoerde e-mailadres.\n                        </template> Daarnaast kan je in één van de volgende stappen één of meerdere ouders toevoegen, met een e-mailadres, die ook toegang krijgen. Vul hier enkel een e-mailadres van {{ member.patchedMember.firstName }} zelf in.\n                    </p>\n                </div>\n\n                <div v-if=\"!member.isNew && (nationalRegisterNumber || isPropertyEnabled('nationalRegisterNumber') )\">\n                    <NRNInput v-model=\"nationalRegisterNumber\" :title=\"'Rijksregisternummer' + lidSuffix\" :required=\"isPropertyRequired('nationalRegisterNumber')\" :nullable=\"true\" :validator=\"validator\" :birth-day=\"birthDay\">\n                        <template v-if=\"!isPropertyEnabled('nationalRegisterNumber')\" #right>\n                            <button class=\"button icon trash small gray\" type=\"button\" @click=\"nationalRegisterNumber = null\" />\n                        </template>\n                    </NRNInput>\n                    <p v-if=\"nationalRegisterNumber !== NationalRegisterNumberOptOut\" class=\"style-description-small\">\n                        Het rijksregisternummer wordt gebruikt om fiscale attesten op te maken. Heeft {{ firstName || 'dit lid' }} geen Belgische nationaliteit, <button class=\"inline-link\" type=\"button\" @click=\"nationalRegisterNumber = NationalRegisterNumberOptOut\">\n                            klik dan hier\n                        </button>.\n                    </p>\n                    <p v-else class=\"style-description-small\">\n                        Je ontvangt geen fiscale attesten. Toch een Belgische nationaliteit, <button class=\"inline-link\" type=\"button\" @click=\"nationalRegisterNumber = null\">\n                            klik dan hier\n                        </button>.\n                    </p>\n                </div>\n            </div>\n\n            <div v-if=\"!member.isNew\">\n                <SelectionAddressInput v-if=\"address || isPropertyEnabled('address')\" v-model=\"address\" :addresses=\"availableAddresses\" :required=\"isPropertyRequired('address')\" :title=\"'Adres' + lidSuffix + (isPropertyRequired('address') ? '' : ' (optioneel)')\" :validator=\"validator\" />\n            </div>\n        </div>\n\n        <p v-if=\"!willMarkReviewed && reviewDate && isAdmin\" class=\"style-description-small\">\n            Laatst nagekeken op {{ formatDate(reviewDate) }}. <button v-tooltip=\"'Het lid zal deze stap terug moeten doorlopen via het ledenportaal'\" type=\"button\" class=\"inline-link\" @click=\"clear\">\n                Wissen\n            </button>.\n        </p>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\nimport { Gender, NationalRegisterNumberOptOut, PlatformMember } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { useAppContext } from '../../../context/appContext';\nimport { ErrorBox } from '../../../errors/ErrorBox';\nimport { Validator } from '../../../errors/Validator';\nimport { useErrors } from '../../../errors/useErrors';\nimport { useValidation } from '../../../errors/useValidation';\nimport BirthDayInput from '../../../inputs/BirthDayInput.vue';\nimport EmailInput from '../../../inputs/EmailInput.vue';\nimport NRNInput from '../../../inputs/NRNInput.vue';\nimport PhoneInput from '../../../inputs/PhoneInput.vue';\nimport RadioGroup from '../../../inputs/RadioGroup.vue';\nimport SelectionAddressInput from '../../../inputs/SelectionAddressInput.vue';\nimport TrackingYearInput from '../../../inputs/TrackingYearInput.vue';\nimport { ContextMenu, ContextMenuItem } from '../../../overlays/ContextMenu';\nimport { useIsPropertyEnabled, useIsPropertyRequired } from '../../hooks/useIsPropertyRequired';\nimport Title from './Title.vue';\n\ndefineOptions({\n    inheritAttrs: false,\n});\n\nconst props = defineProps<{\n    member: PlatformMember;\n    validator: Validator;\n    parentErrorBox?: ErrorBox | null;\n    willMarkReviewed?: boolean;\n}>();\n\nconst isPropertyRequired = useIsPropertyRequired(computed(() => props.member));\nconst isPropertyEnabled = useIsPropertyEnabled(computed(() => props.member), true);\nconst errors = useErrors({ validator: props.validator });\nconst app = useAppContext();\nconst isAdmin = app === 'dashboard' || app === 'admin';\n\nconst title = computed(() => {\n    if (props.member.isNew) {\n        return 'Nieuw lid';\n    }\n    return 'Algemeen';\n});\n\nuseValidation(errors.validator, () => {\n    const se = new SimpleErrors();\n    if (firstName.value.trim().length < 2) {\n        se.addError(new SimpleError({\n            code: 'invalid_field',\n            message: 'Vul de voornaam in',\n            field: 'firstName',\n        }));\n    }\n    if (lastName.value.trim().length < 2) {\n        se.addError(new SimpleError({\n            code: 'invalid_field',\n            message: 'Vul de achternaam in',\n            field: 'lastName',\n        }));\n    }\n\n    if (isPropertyEnabled('phone') && phone.value) {\n        // Check if duplicate\n        const clone = props.member.patchedMember.details.clone();\n        clone.cleanData();\n        if (clone.phone === null) {\n            se.addError(new SimpleError({\n                code: 'invalid_field',\n                message: `Je kan het GSM-nummer van een ouder niet opgeven als het GSM-nummer van ${props.member.patchedMember.details.firstName} of omgekeerd. Vul het GSM-nummer van ${props.member.patchedMember.details.firstName} zelf in.`,\n                field: 'phone',\n            }));\n        }\n    }\n\n    if (isPropertyEnabled('emailAddress') && email.value) {\n        // Check if duplicate\n        const clone = props.member.patchedMember.details.clone();\n        clone.cleanData();\n        if (clone.email === null) {\n            se.addError(new SimpleError({\n                code: 'invalid_field',\n                message: `Je kan het e-mailadres van een ouder niet opgeven als het e-mailadres van ${props.member.patchedMember.details.firstName} of omgekeerd. Vul het e-mailadres van ${props.member.patchedMember.details.firstName} zelf in.`,\n                field: 'email',\n            }));\n        }\n    }\n\n    if (se.errors.length > 0) {\n        errors.errorBox = new ErrorBox(se);\n        return false;\n    }\n    errors.errorBox = null;\n\n    return true;\n});\n\nconst lidSuffix = computed(() => {\n    if (firstName.value.length < 2) {\n        if (props.member.patchedMember.details.defaultAge < 24) {\n            return ' van dit lid';\n        }\n        return '';\n    }\n    if (props.member.patchedMember.details.defaultAge < 24) {\n        return ' van ' + firstName.value;\n    }\n    return '';\n});\n\nconst firstName = computed({\n    get: () => props.member.patchedMember.details.firstName,\n    set: firstName => props.member.addDetailsPatch({ firstName }),\n});\n\nconst lastName = computed({\n    get: () => props.member.patchedMember.details.lastName,\n    set: lastName => props.member.addDetailsPatch({ lastName }),\n});\n\nconst nationalRegisterNumber = computed({\n    get: () => props.member.patchedMember.details.nationalRegisterNumber,\n    set: nationalRegisterNumber => props.member.addDetailsPatch({ nationalRegisterNumber }),\n});\n\nconst birthDay = computed({\n    get: () => props.member.patchedMember.details.birthDay,\n    set: birthDay => props.member.addDetailsPatch({ birthDay }),\n});\n\nconst trackingYear = computed({\n    get: () => props.member.patchedMember.details.trackingYear,\n    set: trackingYear => props.member.addDetailsPatch({ trackingYear }),\n});\n\nconst gender = computed({\n    get: () => props.member.patchedMember.details.gender,\n    set: gender => props.member.addDetailsPatch({ gender }),\n});\n\nconst address = computed({\n    get: () => props.member.patchedMember.details.address,\n    set: address => props.member.addDetailsPatch({ address }),\n});\n\nconst email = computed({\n    get: () => props.member.patchedMember.details.email,\n    set: email => props.member.addDetailsPatch({ email }),\n});\n\nconst phone = computed({\n    get: () => props.member.patchedMember.details.phone,\n    set: phone => props.member.addDetailsPatch({ phone }),\n});\n\nconst alternativeEmails = computed({\n    get: () => props.member.patchedMember.details.alternativeEmails,\n    set: alternativeEmails => props.member.addDetailsPatch({\n        alternativeEmails: alternativeEmails as any,\n    }),\n});\n\nconst availableAddresses = computed(() => {\n    return props.member.family.getAddressesWithoutPatches({ memberId: props.member.id });\n});\n\nfunction deleteEmail(n: number) {\n    const newEmails = [...alternativeEmails.value];\n    newEmails.splice(n, 1);\n    alternativeEmails.value = newEmails;\n}\n\nfunction addEmail() {\n    alternativeEmails.value = [...alternativeEmails.value, ''];\n}\n\nfunction getEmail(index: number) {\n    return alternativeEmails.value[index] ?? '';\n}\n\nfunction setEmail(index: number, value: string) {\n    const newEmails = [...alternativeEmails.value];\n    newEmails[index] = value;\n    alternativeEmails.value = newEmails;\n}\n\nasync function showBirthDayMenu(event: MouseEvent) {\n    const menu = new ContextMenu([\n        [new ContextMenuItem({\n            name: 'Volgjaar toevoegen',\n            action: () => addTrackingYear(),\n        })],\n    ]);\n\n    await menu.show({\n        button: event.currentTarget as HTMLElement,\n    });\n}\n\nfunction addTrackingYear() {\n    trackingYear.value = (birthDay.value ?? new Date()).getFullYear();\n}\n\nfunction deleteTrackingYear() {\n    trackingYear.value = null;\n}\n\nconst reviewDate = computed(() => {\n    return props.member.patchedMember.details.reviewTimes.getLastReview('details');\n});\n\nfunction clear() {\n    const times = props.member.patchedMember.details.reviewTimes.clone();\n    times.removeReview('details');\n    props.member.addDetailsPatch({\n        reviewTimes: times,\n    });\n}\n</script>\n","<template>\n    <div class=\"container\">\n        <Title v-bind=\"$attrs\" title=\"Notities\" />\n\n        <STErrorsDefault :error-box=\"parentErrorBox\" />\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n        <STInputBox title=\"\" error-fields=\"notes\" :error-box=\"errors.errorBox\" class=\"max\">\n            <textarea\n                v-model=\"notes\"\n                class=\"input\"\n                type=\"text\"\n                placeholder=\"Bijkomende informatie over dit lid (onzichtbaar voor het lid).\"\n                autocomplete=\"off\"\n                enterkeyhint=\"next\"\n                :maxlength=\"maxLength\"\n            />\n        </STInputBox>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { PlatformMember } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { useAppContext } from '../../../context/appContext';\nimport { ErrorBox } from '../../../errors/ErrorBox';\nimport { Validator } from '../../../errors/Validator';\nimport { useErrors } from '../../../errors/useErrors';\nimport Title from './Title.vue';\n\ndefineOptions({\n    inheritAttrs: false\n});\n\nconst props = defineProps<{\n    member: PlatformMember,\n    validator: Validator,\n    parentErrorBox?: ErrorBox | null\n}>();\n\nconst maxLength = 1000;\nconst errors = useErrors({validator: props.validator});\nconst appContext = useAppContext();\n\nconst notes = computed({\n    get: () => props.member.patchedMember.details.notes,\n    set: (notes) => {\n            if(notes !== null) {\n                // cut long notes\n                if(notes.length > maxLength) {\n                    notes = notes.substring(0, maxLength);\n                }\n\n                // remove empty notes\n                if(/^\\s*$/.test(notes)) {\n                    notes = null;\n                }\n            }\n\n            props.member.addDetailsPatch({notes});\n        }\n    });\n\n</script>\n","<template>\n    <div class=\"container\">\n        <Title :title=\"member.patchedMember.firstName + ' bewerken'\" :level=\"level\" />\n\n        <STErrorsDefault :error-box=\"parentErrorBox\" />\n        <EditMemberGeneralBox v-bind=\"$attrs\" :member=\"member\" :validator=\"validator\" />\n\n        <div v-if=\"isPropertyEnabled('dataPermission')\" class=\"container\">\n            <hr>\n            <EditMemberDataPermissionsBox v-bind=\"$attrs\" :member=\"member\" :level=\"level + 1\" :validator=\"validator\" />\n        </div>\n\n        <div v-if=\"member.patchedMember.details.parents.length || isPropertyEnabled('parents')\" class=\"container\">\n            <hr>\n            <EditMemberParentsBox v-bind=\"$attrs\" :member=\"member\" :level=\"level + 1\" :validator=\"validator\" />\n        </div>\n\n        <div v-if=\"member.patchedMember.details.emergencyContacts.length || isPropertyEnabled('emergencyContacts')\" class=\"container\">\n            <hr>\n            <EditEmergencyContactsBox v-bind=\"$attrs\" :member=\"member\" :level=\"level + 1\" :validator=\"validator\" />\n        </div>\n\n        <div v-if=\"member.patchedMember.details.uitpasNumber || isPropertyEnabled('uitpasNumber')\" class=\"container\">\n            <hr>\n            <EditMemberUitpasBox v-bind=\"$attrs\" :member=\"member\" :level=\"level + 1\" :validator=\"validator\" />\n        </div>\n\n        <div v-if=\"isPropertyEnabled('financialSupport')\" class=\"container\">\n            <hr>\n            <EditMemberFinancialSupportBox v-bind=\"$attrs\" :member=\"member\" :level=\"level + 1\" :validator=\"validator\" />\n        </div>\n\n        <div v-for=\"category of recordCategories\" :key=\"category.id\" class=\"container\">\n            <hr>\n            <EditMemberRecordCategoryBox v-bind=\"$attrs\" :member=\"member\" :category=\"category\" :level=\"level + 1\" :validator=\"validator\" />\n        </div>\n\n        <div v-if=\"app !== 'registration'\" class=\"container\">\n            <hr>\n            <EditMemberNotesBox v-bind=\"$attrs\" :member=\"member\" :level=\"level + 1\" :validator=\"validator\" />\n        </div>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { PermissionLevel, PlatformMember } from '@stamhoofd/structures';\n\nimport { computed } from 'vue';\nimport { useAppContext } from '../../../context/appContext';\nimport { ErrorBox } from '../../../errors/ErrorBox';\nimport { Validator } from '../../../errors/Validator';\nimport { useAuth, useOrganization } from '../../../hooks';\nimport { useIsPropertyEnabled } from '../../hooks/useIsPropertyRequired';\nimport EditEmergencyContactsBox from './EditEmergencyContactsBox.vue';\nimport EditMemberDataPermissionsBox from './EditMemberDataPermissionsBox.vue';\nimport EditMemberFinancialSupportBox from './EditMemberFinancialSupportBox.vue';\nimport EditMemberGeneralBox from './EditMemberGeneralBox.vue';\nimport EditMemberNotesBox from './EditMemberNotesBox.vue';\nimport EditMemberParentsBox from './EditMemberParentsBox.vue';\nimport EditMemberRecordCategoryBox from './EditMemberRecordCategoryBox.vue';\nimport EditMemberUitpasBox from './EditMemberUitpasBox.vue';\nimport Title from './Title.vue';\n\ndefineOptions({\n    inheritAttrs: false,\n});\n\nconst props = withDefaults(\n    defineProps<{\n        member: PlatformMember;\n        validator: Validator;\n        level?: number;\n        parentErrorBox?: ErrorBox | null;\n    }>(), {\n        level: 0,\n        parentErrorBox: null,\n    },\n);\nconst auth = useAuth();\nconst app = useAppContext();\nconst isPropertyEnabled = useIsPropertyEnabled(computed(() => props.member), true);\n\nconst recordCategories = computed(() =>\n    props.member.getEnabledRecordCategories({\n        checkPermissions: { user: auth.user!, level: PermissionLevel.Write },\n    }),\n);\n</script>\n","<template>\n    <span v-if=\"count !== null\">{{ formatInteger(count) }}</span>\n    <span v-else class=\"style-placeholder-skeleton\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport { Decoder } from '@simonbackx/simple-encoding';\nimport { Request } from '@simonbackx/simple-networking';\nimport { useContext } from '@stamhoofd/components';\nimport { useRequestOwner } from '@stamhoofd/networking';\nimport { CountResponse, StamhoofdFilter } from '@stamhoofd/structures';\nimport { ref, watch } from 'vue';\n\nconst props = defineProps<{\n    filter: StamhoofdFilter,\n}>();\nconst context = useContext()\nconst count = ref(null as null | number);\nconst owner = useRequestOwner()\n\nwatch(() => props.filter, async () => {\n    Request.cancelAll(owner);\n    const response = await context.value.authenticatedServer.request({\n        method: 'GET',\n        path: `/members/count`,\n        query: {\n            filter: JSON.stringify(props.filter)\n        },\n        decoder: CountResponse as Decoder<CountResponse>,\n        owner\n    })\n\n    count.value = response.data.count;\n}, { immediate: true });\n\n</script>\n","<template>\n    <Transition name=\"fade\" mode=\"out-in\">\n        <slot/>\n    </Transition>\n</template>\n\n<style lang=\"scss\" scoped>\n.fade-enter-active,\n.fade-leave-active {\n  transition: opacity 0.2s ease !important;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n  opacity: 0 !important;\n}\n\n.no-label {\n    grid-column: span 2;\n}\n</style>\n","<template>\n    <div class=\"property-filter-value-input\">\n        <STInputBox v-if=\"!isAlwaysEnabled() || hasFilters\" title=\"Wanneer ingeschakeld?\" class=\"max\">\n            <STList>\n                <STListItem :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio :model-value=\"isAlwaysEnabled()\" :value=\"true\" @update:model-value=\"setAlwaysEnabled()\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        Altijd\n                    </h3>\n                </STListItem>\n\n                <STListItem :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio :model-value=\"isAlwaysEnabled()\" :value=\"false\" @update:model-value=\"setEnabledWhen(true)\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        Als...\n                    </h3>\n                    <p class=\"style-description-small\">\n                        {{ enabledText }}\n                    </p>\n                    <template #right>\n                        <button v-if=\"!isAlwaysEnabled()\" class=\"button text\" type=\"button\" @click=\"setEnabledWhen(false)\">\n                            <span class=\"icon edit\" />\n                            <span class=\"hide-small\">Wijzig</span>\n                        </button>\n                    </template>\n                </STListItem>\n            </STList>\n        </STInputBox>\n\n        <STInputBox v-if=\"allowOptional\" title=\"Wanneer verplicht invullen?*\" class=\"max\">\n            <STList>\n                <STListItem :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio :model-value=\"isAlwaysRequired()\" :value=\"true\" @update:model-value=\"setAlwaysRequired()\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        Stap kan niet worden overgeslagen\n                    </h3>\n                </STListItem>\n\n                <STListItem :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio :model-value=\"isNeverRequired()\" :value=\"true\" @update:model-value=\"setNeverRequired()\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        Stap kan altijd worden overgeslagen\n                    </h3>\n                </STListItem>\n\n                <STListItem v-if=\"hasFilters || (!isAlwaysRequired() && !isNeverRequired())\" :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio :model-value=\"!isAlwaysRequired() && !isNeverRequired()\" :value=\"true\" @update:model-value=\"setRequiredWhen(true)\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        Als...\n                    </h3>\n                    <p class=\"style-description-small\">\n                        {{ requiredText }}\n                    </p>\n                    <template #right>\n                        <button v-if=\"!isAlwaysRequired() && !isNeverRequired()\" class=\"button text\" type=\"button\" @click=\"setRequiredWhen(false)\">\n                            <span class=\"icon edit\" />\n                            <span class=\"hide-small\">Wijzig</span>\n                        </button>\n                    </template>\n                </STListItem>\n            </STList>\n        </STInputBox>\n        <p v-if=\"allowOptional\" class=\"style-description-small\">\n            * Als een vragenlijst niet verplicht is, zal men de stap kunnen overslaan zolang nog niets werd ingevuld. Meestal is het niet nodig om dit te gebruiken. Als de vragenlijst altijd verplicht is om in te vullen, kan je ook nog steeds optionele vragen in die lijst hebben. Meestal is het gewoon duidelijker om optionele vragen te gebruiken. Maar soms wil je bijvoorbeeld 'alles invullen' of 'niets invullen', dan kan je dit best gebruiken.\n        </p>\n\n        <div v-if=\"isDevelopment\">\n            <code class=\"style-code\">\n                {{ encodedJson }}\n            </code>\n        </div>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { ComponentWithProperties, NavigationController, NavigationMixin } from '@simonbackx/vue-app-navigation';\nimport { Component, Mixins, Prop } from '@simonbackx/vue-app-navigation/classes';\nimport { isEmptyFilter, PropertyFilter, StamhoofdFilter, Version } from '@stamhoofd/structures';\n\nimport Radio from '../inputs/Radio.vue';\nimport STInputBox from '../inputs/STInputBox.vue';\nimport STList from '../layout/STList.vue';\nimport STListItem from '../layout/STListItem.vue';\nimport { GroupUIFilterBuilder } from './GroupUIFilter';\nimport { filterToString, UIFilter, UIFilterBuilder } from './UIFilter';\nimport UIFilterEditor from './UIFilterEditor.vue';\n\n@Component({\n    components: {\n        STInputBox,\n        STList,\n        STListItem,\n        Radio,\n    },\n})\nexport default class PropertyFilterInput extends Mixins(NavigationMixin) {\n    @Prop({ required: true })\n    modelValue!: PropertyFilter;\n\n    @Prop({ default: true })\n    allowOptional!: boolean;\n\n    @Prop({ required: true })\n    builder!: UIFilterBuilder;\n\n    cachedRequiredFilter: StamhoofdFilter | null = null;\n    cachedEnabledFilter: StamhoofdFilter | null = null;\n\n    isAlwaysEnabled() {\n        return this.modelValue.enabledWhen === null || isEmptyFilter(this.modelValue.enabledWhen);\n    }\n\n    isAlwaysRequired() {\n        return this.modelValue.requiredWhen !== null && isEmptyFilter(this.modelValue.requiredWhen);\n    }\n\n    isNeverRequired() {\n        return this.modelValue.requiredWhen === null;\n    }\n\n    get hasFilters() {\n        return this.builder instanceof GroupUIFilterBuilder && this.builder.builders.length > 1;\n    }\n\n    mounted() {\n        this.cacheIfNeeded();\n    }\n\n    get isDevelopment() {\n        return STAMHOOFD.environment === 'development';\n    }\n\n    get encodedJson() {\n        return JSON.stringify(\n            this.modelValue.encode({ version: Version }),\n            null,\n            4,\n        );\n    }\n\n    cacheIfNeeded() {\n        if (this.modelValue.requiredWhen && !isEmptyFilter(this.modelValue.requiredWhen)) {\n            this.cachedRequiredFilter = this.modelValue.requiredWhen;\n        }\n        if (this.modelValue.enabledWhen && !isEmptyFilter(this.modelValue.enabledWhen)) {\n            this.cachedEnabledFilter = this.modelValue.enabledWhen;\n        }\n    }\n\n    setAlwaysEnabled() {\n        this.$emit('update:modelValue',\n            new PropertyFilter(\n                null,\n                this.modelValue.requiredWhen,\n            ),\n        );\n    }\n\n    setEnabledWhen(useCache = false) {\n        if (useCache && this.cachedEnabledFilter && !isEmptyFilter(this.cachedEnabledFilter)) {\n            this.$emit('update:modelValue',\n                new PropertyFilter(\n                    this.cachedEnabledFilter,\n                    this.modelValue.requiredWhen,\n                ),\n            );\n            return;\n        }\n\n        const filter = this.modelValue.enabledWhen ? this.builder.fromFilter(this.modelValue.enabledWhen) : this.builder.create();\n\n        this.present({\n            components: [\n                new ComponentWithProperties(NavigationController, {\n                    root: new ComponentWithProperties(UIFilterEditor, {\n                        filter,\n                        saveHandler: (filter: UIFilter) => {\n                            this.cachedEnabledFilter = filter.build();\n                            console.log('set enabled when', filter, this.cachedEnabledFilter);\n                            this.$emit('update:modelValue',\n                                new PropertyFilter(\n                                    this.cachedEnabledFilter,\n                                    this.modelValue.requiredWhen,\n                                ),\n                            );\n                        },\n                    }),\n                }),\n            ],\n            modalDisplayStyle: 'sheet',\n        });\n    }\n\n    setAlwaysRequired() {\n        this.$emit('update:modelValue',\n            new PropertyFilter(\n                this.modelValue.enabledWhen,\n                {},\n            ),\n        );\n    }\n\n    setNeverRequired() {\n        this.$emit('update:modelValue',\n            new PropertyFilter(\n                this.modelValue.enabledWhen,\n                null,\n            ),\n        );\n    }\n\n    setRequiredWhen(useCache = false) {\n        if (useCache && this.cachedRequiredFilter && !isEmptyFilter(this.cachedRequiredFilter)) {\n            this.$emit('update:modelValue',\n                new PropertyFilter(\n                    this.modelValue.enabledWhen,\n                    this.cachedRequiredFilter,\n                ),\n            );\n            return;\n        }\n\n        const filter = isEmptyFilter(this.modelValue.requiredWhen) ? this.builder.create() : this.builder.fromFilter(this.modelValue.requiredWhen);\n\n        this.present({\n            components: [\n                new ComponentWithProperties(NavigationController, {\n                    root: new ComponentWithProperties(UIFilterEditor, {\n                        filter,\n                        saveHandler: (filter: UIFilter) => {\n                            this.cachedRequiredFilter = filter.build();\n\n                            this.$emit('update:modelValue',\n                                new PropertyFilter(\n                                    this.modelValue.enabledWhen,\n                                    this.cachedRequiredFilter,\n                                ),\n                            );\n                        },\n                    }),\n                }),\n            ],\n            modalDisplayStyle: 'sheet',\n        });\n    }\n\n    get enabledText() {\n        return this.modelValue.enabledWhen ? filterToString(this.modelValue.enabledWhen, this.builder) : '';\n    }\n\n    get requiredText() {\n        if (isEmptyFilter(this.modelValue.requiredWhen)) {\n            return '';\n        }\n        return filterToString(this.modelValue.requiredWhen, this.builder);\n    }\n}\n</script>\n","<template>\n    <form class=\"st-view filter-editor\" @submit.prevent=\"save\">\n        <STNavigationBar :title=\"title\" />\n\n        <main>\n            <h1>\n                {{ title }}\n            </h1>\n            <p v-if=\"options?.description\">\n                {{ options.description }}\n            </p>\n\n            <p class=\"warning-box\" v-if=\"options?.warning\">\n                {{ options.warning }}\n            </p>\n            <!-- Todo: hier selector: nieuwe filter maken of bestaande filter bewerken, of opslaan als niewue filter -->\n\n            <PropertyFilterInput v-model=\"editingConfiguration\" :builder=\"builder\" />\n        </main>\n\n        <STToolbar>\n            <template #right>\n                <button class=\"button secundary\" type=\"button\" @click=\"cancel\">\n                    Annuleren\n                </button>\n                <button class=\"button primary\" type=\"button\" @click=\"save\">\n                    Opslaan\n                </button>\n            </template>\n        </STToolbar>\n    </form>\n</template>\n\n<script lang=\"ts\">\nimport { NavigationMixin } from \"@simonbackx/vue-app-navigation\";\nimport { Component, Mixins, Prop } from \"@simonbackx/vue-app-navigation/classes\";\nimport { PropertyFilter, Version } from \"@stamhoofd/structures\";\n\nimport STNavigationBar from \"../navigation/STNavigationBar.vue\";\nimport STToolbar from \"../navigation/STToolbar.vue\";\nimport { CenteredMessage } from \"../overlays/CenteredMessage\";\nimport { UIFilterBuilder } from \"./UIFilter\";\nimport PropertyFilterInput from \"./PropertyFilterInput.vue\";\n\n@Component({\n    components: {\n        STNavigationBar,\n        PropertyFilterInput,\n        STToolbar\n    },\n})\nexport default class PropertyFilterView extends Mixins(NavigationMixin) {\n    @Prop({ default: \"\" })\n        title!: string\n\n    @Prop({ default: () => ({}) })\n        options?: {warning?: string, description?: string}\n\n    @Prop({ required: true })\n        builder!: UIFilterBuilder\n\n    @Prop({ required: true })\n        configuration!: PropertyFilter\n\n    @Prop({ required: true })\n        setConfiguration!: (configuration: PropertyFilter) => void\n\n    editingConfiguration: PropertyFilter = this.configuration\n\n    cancel() {\n        this.dismiss({ force: true })\n    }\n\n    save() {\n        this.setConfiguration(this.editingConfiguration)\n        this.dismiss({ force: true })\n    }\n\n    isChanged() {\n        return JSON.stringify(this.editingConfiguration.encode({ version: Version })) !== JSON.stringify(this.configuration.encode({ version: Version }))\n    }\n\n    async shouldNavigateAway() {\n        if (!this.isChanged()) {\n            return true\n        }\n        return await CenteredMessage.confirm(\"Ben je zeker dat je wilt sluiten zonder op te slaan?\", \"Niet opslaan\")\n    }\n}\n</script>\n","<template>\n    <STList v-if=\"data.step && props.data.isDone\">\n        <STListItem class=\"left-center right-stack\" :selectable=\"true\" element-name=\"label\">\n            <template #left>\n                <div class=\"progress-container\">\n                    <Checkbox v-model=\"value\" />\n                </div>\n            </template>\n            <h2 class=\"style-title-list\">\n                {{ checkboxTitle }}\n            </h2>\n            <TransitionFade>\n                <p v-if=\"$review\" class=\"style-description-small\">\n                    {{ getDescription($review) }}\n                </p>\n            </TransitionFade>\n        </STListItem>\n    </STList>\n</template>\n\n<script lang=\"ts\" setup>\nimport { TransitionFade, useSetupStepReviewDescription, useSetupStepTranslations } from '@stamhoofd/components';\nimport { computed } from 'vue';\nimport { ReviewCheckboxData } from './useReview';\n\nconst props = defineProps<{data: ReviewCheckboxData}>();\nconst $review = computed(() => props.data.step?.review);\nconst setupStepTranslations = useSetupStepTranslations();\nconst {getDescription} = useSetupStepReviewDescription();\n\nconst checkboxTitle = computed(() => setupStepTranslations.getReviewCheckboxTitle(props.data.type));\n\nconst value = computed({\n    get: () => props.data.checkboxValue,\n    set: value => props.data.setValue(value)\n})\n</script>\n","<template>\n    <STList>\n        <CheckboxListItem v-model=\"doesNotHaveCompanyNumber\" label=\"Feitelijke vereniging\" description=\"Een feitelijke vereniging is niet geregistreerd en heeft geen ondernemingsnummer\" />\n        <CheckboxListItem v-if=\"hasCompanyNumber\" v-model=\"hasVATNumber\" label=\"BTW-plichtig\" description=\"Een VZW is bijna nooit BTW-plichtig\" />\n    </STList>\n\n    <hr>\n    <h2>Gegevens</h2>\n\n    <div class=\"split-inputs\">\n        <div>\n            <STInputBox :title=\"hasCompanyNumber ? 'Bedrijfsnaam en rechtsvorm' : 'Naam vereniging'\" error-fields=\"companyName\" :error-box=\"errors.errorBox\">\n                <input\n                    id=\"business-name\"\n                    v-model=\"companyName\"\n                    class=\"input\"\n                    type=\"text\"\n                    :placeholder=\"country === Country.Belgium ? 'bv. Ruimtereis VZW' : 'bv. Ruimtereis vereniging'\"\n                    autocomplete=\"organization\"\n                >\n            </STInputBox>\n            <p v-if=\"hasCompanyNumber && country === Country.Belgium\" class=\"style-description-small\">\n                Vul ook de rechtsvorm in, bv. VZW.\n            </p>\n        </div>\n        <div>\n            <CompanyNumberInput v-if=\"hasCompanyNumber && (!hasVATNumber || country !== Country.Belgium)\" v-model=\"companyNumber\" :country=\"country\" placeholder=\"Ondernemingsnummer\" :validator=\"validator\" :required=\"true\" />\n            <VATNumberInput v-if=\"hasVATNumber\" v-model=\"VATNumber\" title=\"BTW-nummer\" placeholder=\"BTW-nummer\" :country=\"country\" :validator=\"validator\" :required=\"true\" />\n        </div>\n    </div>\n\n    <div class=\"split-inputs\">\n        <div>\n            <AddressInput v-model=\"companyAddress\" :required=\"true\" :title=\"doesNotHaveCompanyNumber ? 'Adres' : 'Maatschappelijke zetel'\" :validator=\"validator\" />\n        </div>\n        <EmailInput v-model=\"administrationEmail\" title=\"E-mailadres boekhouding (optioneel)\" :validator=\"validator\" :required=\"false\" placeholder=\"Optioneel\" />\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { AddressInput, CheckboxListItem, CompanyNumberInput, EmailInput, ErrorBox, useValidation, Validator, VATNumberInput } from '@stamhoofd/components';\nimport { Company, Country } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { useErrors } from '../../errors/useErrors';\nimport { useCountry, useEmitPatch } from '../../hooks';\n\nconst props = defineProps<{\n    company: Company,\n    validator: Validator\n}>();\n\nconst emit = defineEmits(['patch:company'])\nconst {addPatch} = useEmitPatch<Company>(props, emit, 'company')\nconst currentCountry = useCountry()\nconst errors = useErrors()\n\nuseValidation(props.validator, async () => {\n    if (hasVATNumber.value && country.value === Country.Belgium && companyNumber.value !== VATNumber.value) {\n        companyNumber.value = VATNumber.value\n    }\n\n    if (companyName.value.length < 2) {\n        errors.errorBox = new ErrorBox(\n            new SimpleError({\n                code: 'missing_field',\n                field: 'companyName',\n                message: 'Gelieve een geldige naam in te vullen',\n            })\n        )\n        return false;\n    }\n\n    return true;\n})\n\nconst country = computed(() => companyAddress.value?.country ?? currentCountry.value)\nconst hasCompanyNumber = computed({\n    get: () => props.company.companyNumber !== null,\n    set: (value: boolean) => {\n        if (value === (props.company.companyNumber !== null)) {\n            return;\n        }\n\n        if (!value) {\n            addPatch({\n                companyNumber: null,\n                VATNumber: null,\n            })\n        } else {\n            addPatch({\n                companyNumber: '',\n            })\n        }\n    }\n})\nconst doesNotHaveCompanyNumber = computed({\n    get: () => !hasCompanyNumber.value,\n    set: (value: boolean) => hasCompanyNumber.value = !value\n})\n\nconst hasVATNumber = computed({\n    get: () => props.company.VATNumber !== null,\n    set: (value: boolean) => {\n        if (value === (props.company.VATNumber !== null)) {\n            return;\n        }\n\n        if (!value) {\n            addPatch({\n                VATNumber: null,\n            })\n        } else {\n            addPatch({\n                VATNumber: '',\n            })\n        }\n    }\n})\n\nconst companyName = computed({\n    get: () => props.company.name,\n    set: (value) => {\n        addPatch({\n            name: value,\n        })\n    }\n})\n\nconst companyAddress = computed({\n    get: () => props.company.address,\n    set: (value) => {\n        addPatch({\n            address: value,\n        })\n    }\n})\n\nconst companyNumber = computed({\n    get: () => props.company.companyNumber,\n    set: (value) => {\n        addPatch({\n            companyNumber: value,\n        })\n    }\n})\n\nconst administrationEmail = computed({\n    get: () => props.company.administrationEmail,\n    set: (value) => {\n        addPatch({\n            administrationEmail: value,\n        })\n    }\n})\n\nconst VATNumber = computed({\n    get: () => props.company.VATNumber,\n    set: (value) => {\n        addPatch({\n            VATNumber: value,\n            companyNumber: country.value === Country.Belgium ? value : undefined,\n        })\n    }\n})\n</script>\n","<template>\n    <SaveView :loading=\"saving\" :title=\"title\" :disabled=\"!hasChanges && !isNew\" class=\"group-edit-view\" :deleting=\"deleting\" @save=\"save\" v-on=\"!isNew && deleteHandler ? {delete: deleteMe} : {}\">\n        <h1>\n            {{ title }}\n        </h1>\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n        <CompanyInputBox :company=\"patched\" :validator=\"errors.validator\" @patch:company=\"addPatch\" />\n    </SaveView>\n</template>\n\n<script setup lang=\"ts\">\nimport { AutoEncoderPatchType } from '@simonbackx/simple-encoding';\nimport { usePop } from '@simonbackx/vue-app-navigation';\nimport { CenteredMessage, ErrorBox, Toast, useErrors, usePatch } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { Company } from '@stamhoofd/structures';\nimport { computed, ref } from 'vue';\nimport CompanyInputBox from './CompanyInputBox.vue';\n\nconst props = withDefaults(\n    defineProps<{\n        company: Company;\n        isNew: boolean;\n        saveHandler: (group: AutoEncoderPatchType<Company>) => Promise<void>;\n        deleteHandler?: (() => Promise<void>)|null;\n    }>(),\n    {\n        deleteHandler: null\n    }\n);\n\nconst {patched, hasChanges, addPatch, patch} = usePatch(props.company);\nconst errors = useErrors();\nconst saving = ref(false);\nconst deleting = ref(false);\n\nconst $t = useTranslate();\nconst pop = usePop();\n\nconst title = computed(() => {\n    return props.isNew ? $t('2d998332-6028-4be3-aa81-fd0f34d00be7') : $t('119d091e-820f-46f0-91f0-5b036fa63e55');\n});\n\nasync function save() {\n    if (deleting.value || saving.value) {\n        return;\n    }\n\n    saving.value = true;\n    try {\n        errors.errorBox = null\n        if (!await errors.validator.validate()) {\n            saving.value = false;\n            return;\n        }\n        await props.saveHandler(patch.value);\n        await pop({force: true})\n    } catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    } finally {\n        saving.value = false;\n    }\n}\n\nasync function deleteMe() {\n    if (!await CenteredMessage.confirm($t('3f81e947-a0a3-4d21-81d7-3298e65d49b1'), $t('201437e3-f779-47b6-b4de-a0fa00f3863e'))) {\n        return;\n    }\n    if (deleting.value || saving.value || !props.deleteHandler) {\n        return;\n    }\n\n    deleting.value = true;\n    try {\n        await props.deleteHandler();\n        await pop({force: true})\n    } catch (e) {\n        Toast.fromError(e).show();\n    } finally {\n        deleting.value = false;\n    }\n}\n\nconst shouldNavigateAway = async () => {\n    if (!hasChanges.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm($t('996a4109-5524-4679-8d17-6968282a2a75'), $t('106b3169-6336-48b8-8544-4512d42c4fd6'))\n}\n\ndefineExpose({\n    shouldNavigateAway\n})\n\n\n</script>\n","<template>\n    <SaveView :loading=\"saving\" title=\"Algemeen\" :disabled=\"!hasSomeChanges\" @save=\"save\">\n        <h1>\n            {{ title }}\n        </h1>\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <div v-if=\"isReview\" class=\"container\">\n            <ReviewCheckbox :data=\"$reviewCheckboxData\" />\n        </div>\n\n        <div v-else class=\"split-inputs\">\n            <div>\n                <STInputBox :title=\"$t('840ac72d-d4b3-40ea-afb4-b0109e88c640')\" error-fields=\"name\" :error-box=\"errors.errorBox\">\n                    <input\n                        id=\"organization-name\"\n                        ref=\"firstInput\"\n                        v-model=\"name\"\n                        class=\"input\"\n                        type=\"text\"\n                        :placeholder=\"$t('cb51b737-c4cf-4ea7-aeb5-b5736a43c333')\"\n                        autocomplete=\"organization\"\n                    >\n                </STInputBox>\n\n                <AddressInput v-model=\"address\" :title=\"$t('68c40b9e-30d7-4ce5-8069-f7ca93221906')\" :validator=\"errors.validator\" :link-country-to-locale=\"true\" />\n            </div>\n\n            <div>\n                <UrlInput v-model=\"website\" :title=\"$t('0e17f20e-e0a6-4fa0-8ec4-378e4325bea5')\" :placeholder=\"$t('5d75775a-a4b5-426a-aea9-b1e75ee5f055')\" :validator=\"errors.validator\" :required=\"false\" />\n\n                <p class=\"style-description-small\">\n                    {{ $t('ffdbd596-e9c8-4c67-bfdf-41a5199de133') }}\n                </p>\n            </div>\n        </div>\n\n        <hr>\n\n        <h2>Facturatiegegevens</h2>\n        <p>Voeg één of meerdere juridische entiteiten toe. Als je zowel een feitelijke vereniging als een VZW hebt, voeg ze dan beide toe. De eerste in de lijst wordt standaard gebruikt als je betalingen uitvoert.</p>\n\n        <p v-if=\"draggableCompanies.length === 0\" class=\"info-box\">\n            Geen facturatiegegevens toegevoegd\n        </p>\n\n        <STList v-else v-model=\"draggableCompanies\" :draggable=\"true\">\n            <template #item=\"{item: company, index}\">\n                <STListItem :selectable=\"true\" class=\"right-stack\" @click=\"editCompany(company)\">\n                    <template #left>\n                        <span class=\"icon email\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        {{ company.name || 'Naamloos' }}\n                    </h3>\n\n                    <p v-if=\"company.VATNumber\" class=\"style-description-small\">\n                        {{ company.VATNumber }} (BTW-plichtig)\n                    </p>\n                    <p v-else-if=\"company.companyNumber\" class=\"style-description-small\">\n                        {{ company.companyNumber }}\n                    </p>\n                    <p v-else class=\"style-description-small\">\n                        Feitelijke vereniging\n                    </p>\n\n                    <p v-if=\"company.address\" class=\"style-description-small\">\n                        {{ company.address.shortString() }}\n                    </p>\n                    <p v-else class=\"style-description-small\">\n                        <span class=\"style-tag error\">Adres ontbreekt</span>\n                    </p>\n\n                    <p v-if=\"company.administrationEmail\" class=\"style-description-small\">\n                        {{ company.administrationEmail }}\n                    </p>\n\n                    <template #right>\n                        <span v-if=\"index === 0\" class=\"style-tag\">\n                            Standaard\n                        </span>\n                        <span class=\"button icon drag gray\" @click.stop @contextmenu.stop />\n                        <span class=\"icon arrow-right-small gray\" />\n                    </template>\n                </STListItem>\n            </template>\n        </STList>\n\n        <p class=\"style-button-bar\">\n            <button class=\"button text\" type=\"button\" @click=\"addCompany\">\n                <span class=\"icon add\" />\n                <span>Toevoegen</span>\n            </button>\n        </p>\n\n        <div v-if=\"!isReview\">\n            <div v-for=\"category of recordCategories\" :key=\"category.id\" class=\"container\">\n                <hr>\n                <FillRecordCategoryBox :category=\"category\" :value=\"patched\" :validator=\"errors.validator\" :level=\"2\" :all-optional=\"false\" :force-mark-reviewed=\"true\" @patch=\"patchAnswers\" />\n            </div>\n        </div>\n    </SaveView>\n</template>\n\n<script lang=\"ts\" setup>\nimport { AutoEncoderPatchType } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, usePop, usePresent } from '@simonbackx/vue-app-navigation';\nimport { AddressInput, CenteredMessage, ErrorBox, FillRecordCategoryBox, SaveView, STErrorsDefault, STInputBox, UrlInput, useDraggableArray, useErrors, usePatch, usePlatform, useReview } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { useOrganizationManager } from '@stamhoofd/networking';\nimport { Company, OrganizationMetaData, OrganizationPrivateMetaData, PatchAnswers, SetupStepType } from '@stamhoofd/structures';\nimport { computed, ref, watch } from 'vue';\nimport ReviewCheckbox from '../ReviewCheckbox.vue';\nimport EditCompanyView from './components/EditCompanyView.vue';\n\nconst props = defineProps<{ isReview?: boolean }>();\n\nconst title = computed(() => props.isReview ? $t('31df7737-2a25-4a6c-9766-39acc3ccdbc8') : 'Algemene instellingen');\nconst organizationManager = useOrganizationManager();\nconst platform = usePlatform();\n\nconst errors = useErrors();\nconst saving = ref(false);\nconst pop = usePop();\nconst present = usePresent();\nconst { patched, hasChanges, addPatch, patch } = usePatch(computed(() => organizationManager.value.organization));\nconst $t = useTranslate();\nconst { $overrideIsDone, $hasChanges: $hasReviewChanges, save: saveReview, $reviewCheckboxData } = useReview(SetupStepType.Companies);\n\nconst hasSomeChanges = computed(() => {\n    if (props.isReview) {\n        return hasChanges.value || $hasReviewChanges.value;\n    }\n\n    return hasChanges.value;\n});\n\nconst draggableCompanies = useDraggableArray<Company>(() => patched.value.meta.companies, companies => addPatch({\n    meta: OrganizationMetaData.patch({\n        companies,\n    }),\n}));\n\nwatch(draggableCompanies, (companies) => {\n    $overrideIsDone.value = companies.length > 0;\n});\n\nconst name = computed({\n    get: () => patched.value.name,\n    set: (name) => {\n        addPatch({\n            name,\n        });\n    },\n});\n\nconst address = computed({\n    get: () => patched.value.address,\n    set: (address) => {\n        addPatch({\n            address,\n        });\n    },\n});\n\nconst website = computed({\n    get: () => patched.value.website,\n    set: (website) => {\n        addPatch({\n            website,\n        });\n    },\n});\n\nconst recordCategories = computed(() =>\n    platform.value.config.organizationLevelRecordsConfiguration.recordCategories.filter(x => x.isEnabled(patched.value)),\n);\n\nasync function addCompany() {\n    const company = Company.create({\n        name: patched.value.name,\n        address: patched.value.address,\n    });\n\n    await present({\n        components: [\n            new ComponentWithProperties(EditCompanyView, {\n                company,\n                isNew: true,\n                saveHandler: (patch: AutoEncoderPatchType<Company>) => {\n                    const meta = OrganizationMetaData.patch({});\n                    meta.companies.addPut(\n                        company.patch(patch),\n                    );\n\n                    addPatch({\n                        meta,\n                    });\n                },\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function editCompany(company: Company) {\n    if (!company.id) {\n        return;\n    }\n    await present({\n        components: [\n            new ComponentWithProperties(EditCompanyView, {\n                company,\n                isNew: false,\n                saveHandler: (patch: AutoEncoderPatchType<Company>) => {\n                    patch.id = company.id;\n                    const meta = OrganizationMetaData.patch({});\n                    meta.companies.addPatch(patch);\n\n                    addPatch({\n                        meta,\n                    });\n                },\n                deleteHandler: () => {\n                    const meta = OrganizationMetaData.patch({});\n                    meta.companies.addDelete(company.id);\n\n                    addPatch({\n                        meta,\n                    });\n                },\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nfunction patchAnswers(patch: PatchAnswers) {\n    addPatch({\n        privateMeta: OrganizationPrivateMetaData.patch({ recordAnswers: patch }),\n    });\n}\n\nasync function save() {\n    if (saving.value) {\n        return;\n    }\n\n    saving.value = true;\n    try {\n        if (hasChanges.value) {\n            errors.errorBox = null;\n            if (!await errors.validator.validate()) {\n                saving.value = false;\n                return;\n            }\n            await organizationManager.value.patch(patch.value);\n        }\n\n        if (props.isReview) {\n            await saveReview();\n        }\n\n        await pop({ force: true });\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    finally {\n        saving.value = false;\n    }\n}\n\nconst shouldNavigateAway = async () => {\n    if (!hasSomeChanges.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm($t('996a4109-5524-4679-8d17-6968282a2a75'), $t('106b3169-6336-48b8-8544-4512d42c4fd6'));\n};\n\ndefineExpose({\n    shouldNavigateAway,\n});\n</script>\n","<template>\n    <LoadingBoxTransition :error-box=\"errorBox\" v-if=\"actions.length || loading\">\n        <div v-if=\"actions.length\" class=\"container\" key=\"view\">\n            <hr>\n            <h2>\n                Snelle acties\n            </h2>\n\n            <STList>\n                <STListItem v-for=\"action of actions\" class=\"left-center right-stack\" :selectable=\"true\" @click=\"action.action\">\n                    <template #left>\n                        <component :is=\"action.leftComponent\" v-if=\"action.leftComponent\" />\n                        <img v-else :src=\"action.illustration\" class=\"style-illustration-img\">\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        {{ action.title }}\n                    </h3>\n                    <p v-if=\"action.description\" class=\"style-description-small\">\n                        {{ action.description }}\n                    </p>\n\n                    <template #right>\n                        <span :class=\"action.rightTextClass ?? ''\" v-if=\"action.rightText\">\n                            {{ action.rightText }}\n                        </span>\n                        <span class=\"icon arrow-right-small gray\" />\n                    </template>\n                </STListItem>\n            </STList>\n        </div>\n    </LoadingBoxTransition>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, unref } from 'vue';\nimport { LoadingBoxTransition } from '../containers';\nimport { QuickActions } from './classes/QuickActions';\n\nconst props = defineProps<{\n    quickActions: QuickActions\n}>();\n\nconst actions = computed(() => unref(props.quickActions.actions));\nconst errorBox = computed(() => unref(props.quickActions.errorBox));\nconst loading = computed(() => unref(props.quickActions.loading));\n\n</script>\n","export default import.meta.ROLLUP_FILE_URL_s$FIAVbs;","export default import.meta.ROLLUP_FILE_URL_FntHJZry;","export default import.meta.ROLLUP_FILE_URL_BAqkN8Mn;","export default import.meta.ROLLUP_FILE_URL_Sp6b81Mt;","import { Decoder } from '@simonbackx/simple-encoding';\nimport { useMemberManager, useRequestOwner } from '@stamhoofd/networking';\nimport { GroupType, PayableBalanceCollection, PlatformMember } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed, onActivated, onMounted, ref, Ref } from 'vue';\nimport { ErrorBox } from '../../errors/ErrorBox';\nimport { useErrors } from '../../errors/useErrors';\nimport { GlobalEventBus } from '../../EventBus';\nimport { useContext, useUser } from '../../hooks';\nimport { useEditMember } from '../../members';\nimport { MemberStepManager } from '../../members/classes/MemberStepManager';\nimport { getAllMemberSteps } from '../../members/classes/steps';\nimport { useNavigationActions } from '../../types/NavigationActions';\nimport { QuickAction, QuickActions } from '../classes/QuickActions';\n\nimport cartSvg from '@stamhoofd/assets/images/illustrations/cart.svg';\nimport emailWarningSvg from '@stamhoofd/assets/images/illustrations/email-warning.svg';\nimport missingDataSvg from '@stamhoofd/assets/images/illustrations/missing-data.svg';\nimport outstandingAmountSvg from '@stamhoofd/assets/images/illustrations/outstanding-amount.svg';\nimport { useNavigate } from '@simonbackx/vue-app-navigation';\nimport { useVisibilityChange } from '../../composables';\n\nexport function useRegistrationQuickActions(): QuickActions {\n    const memberManager = useMemberManager();\n    const checkout = computed(() => memberManager.family.checkout);\n    const context = useContext();\n    const navigate = useNavigationActions();\n    const user = useUser();\n    const editMember = useEditMember();\n    const owner = useRequestOwner();\n    const errors = useErrors();\n    const $navigate = useNavigate();\n\n    async function openCart() {\n        await GlobalEventBus.sendEvent('selectTabByName', 'mandje');\n    }\n\n    async function fillInMemberMissingData(member: PlatformMember) {\n        const steps = getAllMemberSteps(member, null, { outdatedTime: null });\n        const manager = new MemberStepManager(context.value, member, steps, async (navigate) => {\n            await navigate.dismiss({ force: true });\n        }, { action: 'present', modalDisplayStyle: 'popup' });\n\n        await manager.saveHandler(null, navigate);\n    }\n\n    async function checkAllMemberData(member: PlatformMember) {\n        await editMember(member, { title: 'Gegevens nakijken' });\n    }\n\n    const activeMembers = computed(() => memberManager.family.members.filter(m => m.filterRegistrations({ currentPeriod: true, types: [GroupType.Membership] }).length > 0));\n\n    const membersWithMissingData = computed(() => activeMembers.value.flatMap((member) => {\n        const steps = getAllMemberSteps(member, null, { outdatedTime: null });\n        const manager = new MemberStepManager(context.value, member, steps, () => {});\n        const activeSteps = steps.filter(s => s.isEnabled(manager));\n\n        if (activeSteps.length > 0) {\n            return [\n                {\n                    member,\n                    steps: Formatter.joinLast(activeSteps.map(s => s.getName(manager)), ', ', ' en '),\n                },\n            ];\n        }\n\n        return [];\n    }));\n\n    const membersWithoutMissingData = computed(() => activeMembers.value.filter((member) => {\n        return !membersWithMissingData.value.find(m => m.member.id === member.id);\n    }));\n\n    const membersWithMissingEmail = computed(() => {\n        return membersWithoutMissingData.value.filter((member) => {\n            return !member.patchedMember.details.hasEmail(user.value?.email ?? '');\n        });\n    });\n\n    // Load outstanding amount\n    console.log('Load outstanding balance setup');\n    const outstandingBalance = ref(null) as Ref<PayableBalanceCollection | null>;\n    let lastLoadedBalance = new Date(0)\n\n    // Fetch balance\n    async function updateBalance() {\n        if (lastLoadedBalance.getTime() > new Date().getTime() - 5 * 60 * 1000) {\n            return;\n        }\n        lastLoadedBalance = new Date();\n        try {\n            const response = await context.value.authenticatedServer.request({\n                method: 'GET',\n                path: `/user/payable-balance`,\n                decoder: PayableBalanceCollection as Decoder<PayableBalanceCollection>,\n                shouldRetry: true,\n                owner,\n                timeout: 5 * 60 * 1000,\n            });\n\n            outstandingBalance.value = response.data;\n        }\n        catch (e) {\n            errors.errorBox = new ErrorBox(e);\n        }\n    }\n\n    onMounted(() => {\n        updateBalance().catch(console.error);\n    });\n\n    onActivated(() => {\n        updateBalance().catch(console.error);\n    });\n\n    useVisibilityChange(() => {\n        updateBalance().catch(console.error);\n    });\n\n    return {\n        actions: computed(() => {\n            const arr: QuickAction[] = [];\n            if (!checkout.value.cart.isEmpty) {\n                arr.push({\n                    illustration: cartSvg,\n                    title: 'Mandje afrekenen',\n                    description: checkout.value.cart.price > 0 ? 'Betaal en bevestig je inschrijvingen.' : 'Bevestig je inschrijvingen.',\n                    action: openCart,\n                });\n            }\n\n            for (const organizationStatus of outstandingBalance.value?.organizations || []) {\n                const open = organizationStatus.amountOpen;\n                if (open <= 0) {\n                    continue;\n                }\n\n                arr.push({\n                    illustration: outstandingAmountSvg,\n                    title: 'Betaal jouw openstaand bedrag aan ' + organizationStatus.organization.name,\n                    description: 'Je hebt een openstaand bedrag van ' + Formatter.price(open) + ' bij ' + organizationStatus.organization.name + '',\n                    rightText: Formatter.price(open),\n                    rightTextClass: 'style-price',\n                    action: async () => {\n                        await $navigate('payments');\n                    },\n                });\n            }\n\n            for (const member of membersWithMissingData.value) {\n                arr.push({\n                    illustration: missingDataSvg,\n                    title: `Vul ontbrekende gegevens aan van ${member.member.patchedMember.firstName}`,\n                    description: `Enkele gegevens van ${member.member.patchedMember.firstName} ontbreken. Vul deze aan.`,\n                    action: () => fillInMemberMissingData(member.member),\n                });\n            }\n\n            for (const member of membersWithMissingEmail.value) {\n                // Het e-mailadres van dit account is niet toegevoegd bij\n                arr.push({\n                    illustration: emailWarningSvg,\n                    title: `Voeg e-mailadres toe van ${member.patchedMember.firstName}`,\n                    description: `Voeg het e-mailadres waarmee je inlogt (${user.value?.email}) toe bij ${member.patchedMember.details.firstName}, anders wordt jouw account losgekoppeld van dit lid. Of wijzig het e-mailadres waarmee je inlogt.`,\n                    action: () => checkAllMemberData(member),\n                });\n            }\n\n            return arr;\n        }),\n        loading: computed(() => {\n            return (outstandingBalance.value === null);\n        }),\n        errorBox: computed(() => {\n            return errors.errorBox;\n        }),\n    };\n}\n","<template>\n    <STListItem class=\"left-center right-stack\" :selectable=\"isSelectable\">\n        <template #left>\n            <IconContainer :class=\"color\" :icon=\"icon\">\n                <template #aside>\n                    <ProgressIcon v-if=\"$secondaryIcon || $progress\" :icon=\"$secondaryIcon\" :progress=\"$progress\" />\n                </template>\n            </IconContainer>\n        </template>\n        <h2 class=\"style-title-list\">\n            {{ title }}\n        </h2>\n        <p v-if=\"listType === 'todo'\" class=\"style-description\">\n            {{ description }}\n        </p>\n        <p v-else class=\"style-description-small\">\n            {{ reviewDescription }}\n        </p>\n        <template #right>\n            <span v-if=\"!step.isDone\" class=\"style-description-small\">{{ step.finishedSteps }} / {{ step.totalSteps }}</span>\n            <span v-if=\"isSelectable\" class=\"icon arrow-right-small gray\" />\n        </template>\n    </STListItem>\n</template>\n\n<script setup lang=\"ts\">\nimport { IconContainer, ProgressIcon, STListItem, useSetupStepReviewDescription, useSetupStepTranslations } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { SetupStep, SetupStepType } from '@stamhoofd/structures';\nimport { computed } from 'vue';\n\nconst props = defineProps<{\n    setupStepType: SetupStepType;\n    step: SetupStep;\n    listType: 'review' | 'todo';\n}>();\n\nconst setupStepTranslations = useSetupStepTranslations();\nconst $t = useTranslate();\nconst { getDescription: getReviewDescription } = useSetupStepReviewDescription();\n\nconst isSelectable = computed(() => props.listType === 'todo');\nconst title = computed(() => $isDone.value ? setupStepTranslations.getReviewTitle(props.setupStepType) : setupStepTranslations.getTodoTitle(props.setupStepType));\nconst description = computed(() => $isDone.value ? setupStepTranslations.getReviewDescription(props.setupStepType) : setupStepTranslations.getTodoDescription(props.setupStepType));\nconst reviewDescription = computed(() => {\n    const step = props.step;\n    const textIfNotReviewed = $t('c75d45e6-b741-462b-899e-56a41e10918a');\n\n    if (step.isDone) {\n        return getReviewDescription(step.review, true, $t('586cb220-498a-496a-8db5-89a4f10ba3df'));\n    }\n\n    return textIfNotReviewed;\n});\n\nconst $isDone = computed(() => props.step.isDone);\n\nconst $progress = computed(() => {\n    // do not show progress if step is done\n    if ($isDone.value) return undefined;\n    return props.step.progress;\n});\n\nconst $secondaryIcon = computed(() => {\n    if (props.step.isComplete) {\n        return 'success';\n    }\n    return undefined;\n});\n\nconst color = computed(() => {\n    const icon = $secondaryIcon.value;\n    if (icon === 'success') return 'success';\n    return 'gray';\n});\n\nconst icons: Record<SetupStepType, string> = {\n    [SetupStepType.Premises]: 'home',\n    [SetupStepType.Groups]: 'group',\n    [SetupStepType.Responsibilities]: 'star',\n    [SetupStepType.Companies]: 'file-filled',\n    [SetupStepType.Emails]: 'email',\n    [SetupStepType.Payment]: 'bank',\n    [SetupStepType.Registrations]: 'edit',\n};\n\nconst icon = computed(() => icons[props.setupStepType]);\n</script>\n\n<style lang=\"scss\" scoped>\n.progress-container {\n    width: 28px;\n}\n</style>\n","<template>\n    <STList :with-animation=\"false\">\n        <SetupStepRow\n            v-for=\"{ step, type } in $stepsByPriority\" :key=\"type\" :setup-step-type=\"type\" :step=\"step\"\n            :list-type=\"listType\"\n            @click=\"emits('select', type)\"\n        />\n    </STList>\n</template>\n\n<script lang=\"ts\" setup>\nimport { SetupSteps, SetupStepType } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport SetupStepRow from './SetupStepRow.vue';\n\nconst props = defineProps<{\n    steps: SetupSteps,\n    listType: 'review' | 'todo'\n}>();\n\nconst emits = defineEmits<{(e: 'select', setupStepType: SetupStepType): void}>();\n\nconst $steps = computed(() => props.steps.getAll() ?? []);\nconst $stepsByPriority = computed(() => [...$steps.value].sort((a, b) => b.step.priority - a.step.priority));\n</script>\n","<template>\n    <div class=\"stamhoofd-logo-container\">\n        <svg width=\"147\" height=\"27\" viewBox=\"0 0 147 27\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"stamhoofd-logo\">\n            <g clip-path=\"url(#clip0_12577_1236)\">\n                <path class=\"text\" d=\"M39.2662 20.6902C36.9295 20.6902 34.848 19.9048 33.2771 18.4517L34.9462 16.4684C36.2226 17.568 37.6757 18.2357 39.384 18.2357C40.8371 18.2357 41.5833 17.568 41.5833 16.7237C41.5833 15.7615 40.7978 15.467 38.736 14.9957C35.8887 14.3477 33.8662 13.5426 33.8662 10.931C33.8662 8.43713 35.9084 6.72877 38.8538 6.72877C41.0531 6.72877 42.7615 7.41604 44.136 8.59423L42.624 10.6757C41.4262 9.7135 40.0713 9.18332 38.7753 9.18332C37.5382 9.18332 36.792 9.83132 36.792 10.6364C36.792 11.6182 37.5971 11.9324 39.6786 12.4037C42.5848 13.0517 44.5091 13.9157 44.5091 16.4095C44.5091 18.9819 42.5651 20.6902 39.2662 20.6902ZM51.0408 17.9411L51.7281 19.8066C51.139 20.3368 50.2161 20.6902 49.411 20.6902C47.6044 20.6902 46.3477 19.4139 46.3477 17.5877V12.6197H44.9535V10.3026H46.3477V7.51423H49.1164V10.3026H51.3157V12.6197H49.1164V17.136C49.1164 17.8037 49.5288 18.275 50.0786 18.275C50.4714 18.275 50.8444 18.1375 51.0408 17.9411ZM56.7889 10.067C59.4398 10.067 61.266 11.736 61.266 14.387V20.4546H58.4973V19.4335C57.7707 20.2386 56.6122 20.6902 55.4929 20.6902C53.3329 20.6902 51.6834 19.3942 51.6834 17.4502C51.6834 15.4473 53.5489 14.0728 55.8856 14.0728C56.7104 14.0728 57.6333 14.2495 58.4973 14.603V14.387C58.4973 13.307 57.81 12.3644 56.1409 12.3644C55.1984 12.3644 54.3147 12.6786 53.5096 13.091L52.5474 11.1862C53.9809 10.4597 55.3751 10.067 56.7889 10.067ZM56.1409 18.707C57.2405 18.707 58.2813 18.1964 58.4973 17.2539V16.331C57.8493 16.0757 57.0834 15.9382 56.298 15.9382C55.2573 15.9382 54.4129 16.547 54.4129 17.3717C54.4129 18.1964 55.1591 18.707 56.1409 18.707ZM75.3784 10.067C77.4991 10.067 79.1289 11.6968 79.1289 13.9942V20.435H76.3799V14.4851C76.3799 13.307 75.6337 12.4822 74.5929 12.4822C73.4344 12.4822 72.6293 13.248 72.6293 14.328V20.435H69.8606V14.4851C69.8606 13.307 69.134 12.4822 68.0737 12.4822C66.9151 12.4822 66.11 13.248 66.11 14.328V20.435H63.2431V10.3026H66.11V11.6379C66.6009 10.6757 67.622 10.067 68.8788 10.067C70.2337 10.067 71.3922 10.7346 72.0402 11.8146C72.6489 10.7346 73.8664 10.067 75.3784 10.067ZM87.182 10.067C89.4009 10.067 90.9522 11.6771 90.9522 13.9942V20.4546H88.2031V14.603C88.2031 13.3462 87.398 12.4822 86.2591 12.4822C85.0613 12.4822 84.1384 13.3462 84.1384 14.4459V20.4546H81.2715V6.72877H84.1384V11.5397C84.7667 10.6364 85.886 10.067 87.182 10.067ZM97.8757 20.6902C94.8321 20.6902 92.3382 18.2946 92.3382 15.3688C92.3382 12.443 94.8321 10.067 97.8757 10.067C100.919 10.067 103.413 12.443 103.413 15.3688C103.413 18.2946 100.919 20.6902 97.8757 20.6902ZM97.8757 18.275C99.4073 18.275 100.664 16.9593 100.664 15.3688C100.664 13.7782 99.4073 12.4822 97.8757 12.4822C96.3441 12.4822 95.0873 13.7782 95.0873 15.3688C95.0873 16.9593 96.3441 18.275 97.8757 18.275ZM109.937 20.6902C106.894 20.6902 104.4 18.2946 104.4 15.3688C104.4 12.443 106.894 10.067 109.937 10.067C112.981 10.067 115.475 12.443 115.475 15.3688C115.475 18.2946 112.981 20.6902 109.937 20.6902ZM109.937 18.275C111.469 18.275 112.726 16.9593 112.726 15.3688C112.726 13.7782 111.469 12.4822 109.937 12.4822C108.406 12.4822 107.149 13.7782 107.149 15.3688C107.149 16.9593 108.406 18.275 109.937 18.275ZM120.376 9.75277V10.3026H122.575V12.6197H120.376V20.4546H117.607V12.6197H116.213V10.3026H117.607V9.41895C117.607 7.59277 118.864 6.31641 120.67 6.31641C121.476 6.31641 122.398 6.66986 122.988 7.20004L122.3 8.94768C122.104 8.75132 121.711 8.61386 121.318 8.61386C120.788 8.61386 120.376 9.08513 120.376 9.75277ZM131.553 6.72877H134.42V20.4546H131.553V19.0211C130.748 20.0619 129.55 20.6902 128.136 20.6902C125.426 20.6902 123.482 18.491 123.482 15.3688C123.482 12.2662 125.426 10.067 128.136 10.067C129.55 10.067 130.748 10.6953 131.553 11.736V6.72877ZM128.961 18.275C130.492 18.275 131.553 17.0771 131.553 15.3688C131.553 13.68 130.492 12.4822 128.961 12.4822C127.39 12.4822 126.27 13.68 126.27 15.3688C126.27 17.0771 127.39 18.275 128.961 18.275Z\" fill=\"#1D2129\" />\n                <path class=\"icon-fill\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M11.4065 17.8551L15.2803 25.4306H6.07574L9.94955 17.8551C10.1553 17.4528 10.6482 17.2935 11.0505 17.4992C11.2036 17.5775 11.3282 17.702 11.4065 17.8551Z\" fill=\"#0053FF\" />\n                <path class=\"icon\" d=\"M7.81434 3.33972L19.6064 23.3863C19.8355 23.7758 19.7055 24.2772 19.316 24.5063C19.2738 24.5312 19.2294 24.5522 19.1834 24.5691C16.8777 25.4162 14.0425 25.8397 10.678 25.8397C7.3134 25.8397 4.47827 25.4162 2.17257 24.5691C1.74845 24.4132 1.53094 23.9431 1.68676 23.5189C1.70367 23.4729 1.72468 23.4285 1.74953 23.3863L14.5436 1.63635\" stroke=\"#0053FF\" stroke-width=\"2.45455\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n            </g>\n            <defs>\n                <clipPath id=\"clip0_12577_1236\">\n                    <rect width=\"146.455\" height=\"27\" fill=\"white\" />\n                </clipPath>\n            </defs>\n        </svg>\n\n        <svg width=\"26\" height=\"34\" viewBox=\"0 0 26 34\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"stamhoofd-logo\">\n            <path class=\"icon-fill\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M13.9412 21.823L18.6759 31.0819H7.4259L12.1606 21.823C12.412 21.3313 13.0145 21.1365 13.5062 21.388C13.6933 21.4837 13.8456 21.6359 13.9412 21.823Z\" fill=\"#0053FF\" />\n            <path class=\"icon\" d=\"M9.55088 4.08189L23.9634 28.5832C24.2434 29.0593 24.0845 29.6722 23.6085 29.9522C23.5569 29.9825 23.5026 30.0082 23.4463 30.0289C20.6283 31.0642 17.1631 31.5819 13.0509 31.5819C8.93862 31.5819 5.47345 31.0642 2.65537 30.0289C2.137 29.8384 1.87116 29.2638 2.06161 28.7454C2.08228 28.6891 2.10795 28.6349 2.13833 28.5832L17.7755 2\" stroke=\"#0053FF\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n        </svg>\n    </div>\n</template>\n\n<style lang=\"scss\">\n@use '@stamhoofd/scss/base/variables' as *;\n\n.logo-container {\n    gap: 10px;\n    text-decoration: none;\n    align-items: center;\n    display: flex;\n    justify-content: flex-start;\n    width: var(--block-width, 40px);\n    height: var(--block-width, 40px);\n}\n\n.logo-text {\n    -webkit-text-fill-color: transparent;\n    text-fill-color: transparent;\n    background: linear-gradient(94.7deg, #0053ff 29.42%, #7000ff 71.5%), #868686;\n    -webkit-background-clip: text;\n    background-clip: text;\n    font-size: 16px;\n    opacity: 1;\n    font-style: normal;\n    font-weight: $font-weight-bold;\n    display: block;\n\n    &.vertical {\n        font-size: 14px;\n        padding-left: 33px;\n        padding-top: 5px;\n    }\n\n    &.horizontal {\n        @media (max-width: 450px) {\n            display: none;\n        }\n    }\n}\n\n.stamhoofd-logo {\n    display: block;\n\n    .text {\n        fill: $color-dark;\n    }\n\n    .icon-fill {\n        fill: $color-primary;\n    }\n\n    .icon {\n        stroke: $color-primary;\n    }\n\n    &:last-child {\n        display: none;\n        width: calc(var(--block-width, 40px) - 10px);\n        height: calc(var(--block-width, 40px) - 10px);\n    }\n}\n\n.stamhoofd-logo-container {\n    display: inline-block;  \n\n    &.small {\n        svg:first-child {\n            display: none;\n        }\n        svg:last-child {\n            display: inline-block;\n        }\n    }\n\n    &.responsive {\n        @media (max-width: 450px) {\n            svg:first-child {\n                display: none;\n            }\n            svg:last-child {\n                display: inline-block;\n            }\n        }\n    }\n}\n\n</style>\n","<template>\n    <h1 class=\"st-navigation-title\">\n        <slot />\n    </h1>\n</template>\n\n<script lang=\"ts\">\nimport { Component, VueComponent } from \"@simonbackx/vue-app-navigation/classes\";\n\n@Component\nexport default class STNavigationTitle extends VueComponent {}\n</script>\n\n<style lang=\"scss\">\n@use '@stamhoofd/scss/base/text-styles.scss';\n\n.st-navigation-title {\n    margin-bottom: 20px;\n    @extend .style-title-1;\n}\n</style>\n","export default import.meta.ROLLUP_FILE_URL_4h4mPYFc;","export default import.meta.ROLLUP_FILE_URL_BYZH3HR8;","export default import.meta.ROLLUP_FILE_URL_BAlyePLi;","<template>\n    <form class=\"centered-message-container\" @submit.prevent @mousedown=\"onClickOutside\" @touchdown=\"onClickOutside\">\n        <div class=\"centered-message\" @mousedown.stop=\"\" @touchdown.stop=\"\">\n            <div class=\"header\">\n                <Spinner v-if=\"centeredMessage.type === 'loading'\" class=\"\" />\n                <img v-else-if=\"centeredMessage.type === 'clock'\" class=\"center\" src=\"@stamhoofd/assets/images/illustrations/clock.svg\">\n                <img v-else-if=\"centeredMessage.type === 'health'\" class=\"center\" src=\"@stamhoofd/assets/images/illustrations/health-data.svg\">\n                <img v-else-if=\"centeredMessage.type === 'sync'\" class=\"center\" src=\"@stamhoofd/assets/images/illustrations/sync.svg\">\n                <span v-else-if=\"centeredMessage.type !== 'none'\" :class=\"'center icon '+centeredMessage.type\" />\n            </div>\n\n            <h1>\n                {{ centeredMessage.title }}\n            </h1>\n            <p>{{ centeredMessage.description }}</p>\n\n            <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n            <div class=\"buttons\">\n                <LoadingButton v-for=\"(button, index) in centeredMessage.buttons\" :key=\"index\" :loading=\"button.loading\">\n                    <a v-if=\"button.href\" ref=\"buttons\" :href=\"button.href\" class=\"button full\" :class=\"button.type\" @click=\"onClickButton(button)\">\n                        <span v-if=\"button.icon\" class=\"icon\" :class=\"button.icon\" />\n                        <span>{{ button.text }}</span>\n                    </a>\n                    <button v-else ref=\"buttons\" class=\"button full\" :class=\"button.type\" type=\"button\" :tabindex=\"0\" @click=\"onClickButton(button)\">\n                        <span v-if=\"button.icon\" class=\"icon\" :class=\"button.icon\" />\n                        <span>{{ button.text }}</span>\n                    </button>\n                </LoadingButton>\n            </div>\n        </div>\n    </form>\n</template>\n\n<script lang=\"ts\" setup>\nimport { usePop } from '@simonbackx/vue-app-navigation';\n\nimport { ErrorBox } from '../errors/ErrorBox';\nimport STErrorsDefault from \"../errors/STErrorsDefault.vue\"\nimport LoadingButton from \"../navigation/LoadingButton.vue\"\nimport Spinner from \"../Spinner.vue\"\nimport { CenteredMessage, CenteredMessageButton } from './CenteredMessage';\nimport { onActivated, onDeactivated, onMounted, ref, useTemplateRef } from 'vue';\nimport { useErrors } from '../errors/useErrors';\n\nconst props = defineProps<{\n    centeredMessage: CenteredMessage\n}>()\nconst isClosing = ref(false);\nconst errors = useErrors();\nconst pop = usePop();\nconst buttonsRef = useTemplateRef<HTMLButtonElement[] | HTMLButtonElement | null>('buttons')\n\nonMounted(() => {\n    props.centeredMessage.doHide = () => {\n        close()\n    }\n\n    if (document.activeElement && (document.activeElement as any).blur) {\n        (document.activeElement as any).blur();\n    }\n    setTimeout(() => {\n        focusNextButton()\n    }, 200)\n})\n\nfunction onClickOutside() {\n    // If this is a touch device, do nothing\n    if (('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || ((navigator as any).msMaxTouchPoints > 0)) {\n        return\n    }\n    dismiss();\n}\n\nasync function onClickButton(button: CenteredMessageButton) {\n    if (isClosing.value) {\n        return\n    }\n    if (button.loading) {\n        return;\n    }\n    if (button.action) {\n        button.loading = true;\n        try {\n            await button.action()\n        } catch (e) {\n            errors.errorBox = new ErrorBox(e)\n            button.loading = false\n            return;\n        }\n        errors.errorBox = null\n        button.loading = false\n    }\n    close()\n}\n\nfunction dismiss() {\n    const closeButton = props.centeredMessage.buttons.find(b => b.type === \"secundary\")\n    if (!closeButton) {\n        return;\n    }\n\n    onClickButton(closeButton).catch(console.error)\n}\n\nfunction close() {\n    if (isClosing.value) {\n        return\n    }\n    isClosing.value = true\n    pop({ force: true })\n}\n\nonActivated(() => {\n    document.addEventListener(\"keydown\", onKey);\n})\n\nonDeactivated(() => {\n    document.removeEventListener(\"keydown\", onKey);\n})\n\nfunction getButtons() {\n    let buttons = buttonsRef.value\n\n    console.log('getButtons', buttons)\n\n    if (!buttons) {\n        return [];\n    }\n\n    if (!Array.isArray(buttons)) {\n        buttons = [buttons]\n    }\n    return buttons;\n}\n\nfunction focusNextButton() {\n    console.log('focusNextButton')\n    let buttons = getButtons()\n    if (buttons.length === 0) {\n        console.log('no buttons')\n        return\n    }\n\n    // Find first focused button and select the next one or first one if it is the last one\n    const focusedButton = buttons.findIndex((b: any) => b === document.activeElement)\n    \n    let button = buttons[0];\n    if (focusedButton !== -1) {\n        if (focusedButton > 0) {\n            button = buttons[focusedButton - 1];\n        } else {\n            button = buttons[buttons.length - 1];\n        }\n    }\n\n    // Fix unreliable focus visible\n    button.classList.add(\"focus-visible\");\n\n    // And we'll remove it again on blur, once\n    button.addEventListener(\"blur\", function () {\n        button.classList.remove(\"focus-visible\");\n    }, { once: true });\n    \n    button.focus()\n}\n\nfunction onKey(event: KeyboardEvent) {\n    if (event.defaultPrevented || event.repeat) {\n        return;\n    }\n\n    const key = event.key || event.keyCode;\n    const closeButton = props.centeredMessage.buttons.find(b => b.type === \"secundary\")\n\n    if (key === \"Tab\") {\n        focusNextButton();\n        event.preventDefault();\n        return;\n    }\n\n    if (key === \"Escape\" || key === \"Esc\" || key === 27) {\n        if (!closeButton) {\n            return;\n        }\n\n        onClickButton(closeButton).catch(console.error)\n        event.preventDefault();\n        return;\n    }\n\n    if (key === \"Enter\" || key === 13) {\n        const focusedButton = getButtons().find((b: any) => b === document.activeElement)\n        if (focusedButton) {\n            // Browser default\n            return;\n        }\n        // Do we have a default action?\n        const defaultButton = props.centeredMessage.buttons.find(b => b.action !== null && b.type !== \"destructive\")\n        if (defaultButton) {\n            onClickButton(defaultButton).catch(console.error)\n            event.preventDefault();\n            return;\n        }\n    }\n}\n\n// \n// @Component({\n//     components: {\n//         Spinner,\n//         STErrorsDefault,\n//         LoadingButton\n//     }\n// })\n// export default class CenteredMessageView extends Mixins(NavigationMixin) {\n//     @Prop({ required: true})\n//     centeredMessage: CenteredMessage\n// \n//     isClosing = false\n//     errorBox: ErrorBox | null = null\n// \n//     mounted() {\n//         this.centeredMessage.doHide = () => {\n//             this.close()\n//         }\n// \n//         if (document.activeElement && (document.activeElement as any).blur) {\n//             (document.activeElement as any).blur();\n//         }\n//         setTimeout(() => {\n//             this.focusNextButton()\n//         }, 200)\n//     }\n// \n//     onClickOutside() {\n//         // If this is a touch device, do nothing\n//         if (('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || ((navigator as any).msMaxTouchPoints > 0)) {\n//             return\n//         }\n//         this.dismiss();\n//     }\n// \n//     async onClickButton(button: CenteredMessageButton) {\n//         if (this.isClosing) {\n//             return\n//         }\n//         if (button.loading) {\n//             return;\n//         }\n//         if (button.action) {\n//             button.loading = true;\n//             try {\n//                 await button.action()\n//             } catch (e) {\n//                 this.errorBox = new ErrorBox(e)\n//                 button.loading = false\n//                 return;\n//             }\n//             this.errorBox = null\n//             button.loading = false\n//         }\n//         this.close()\n//     }\n// \n//     dismiss() {\n//         const closeButton = this.centeredMessage.buttons.find(b => b.type === \"secundary\")\n//         if (!closeButton) {\n//             return;\n//         }\n// \n//         this.onClickButton(closeButton).catch(console.error)\n//     }\n// \n//     close() {\n//         if (this.isClosing) {\n//             return\n//         }\n//         this.isClosing = true\n//         this.pop({ force: true })\n//     }\n// \n//     activated() {\n//         document.addEventListener(\"keydown\", this.onKey);\n//     }\n// \n//     deactivated() {\n//         document.removeEventListener(\"keydown\", this.onKey);\n//     }\n// \n//     getButtons() {\n//         let buttons = this.$refs.buttons as any\n// \n//         if (!buttons) {\n//             return [];\n//         }\n// \n//         if (buttons.length === undefined) {\n//             buttons = [buttons]\n//         }\n//         return buttons;\n//     }\n// \n//     focusNextButton() {\n//         console.log('focusNextButton')\n//         let buttons = this.getButtons()\n//         if (buttons.length === 0) {\n//             console.log('no buttons')\n//             return\n//         }\n// \n//         // Find first focused button and select the next one or first one if it is the last one\n//         const focusedButton = buttons.findIndex((b: any) => b === document.activeElement)\n//         \n//         let button = buttons[0];\n//         if (focusedButton !== -1) {\n//             if (focusedButton >= buttons.length - 2) {\n//                 button = buttons[0];\n//             } else {\n//                 button = buttons[focusedButton+1]\n//             }\n//         }\n// \n//         // Fix unreliable focus visible\n//         button.classList.add(\"focus-visible\");\n// \n//         // And we'll remove it again on blur, once\n//         button.addEventListener(\"blur\", function () {\n//             button.classList.remove(\"focus-visible\");\n//         }, { once: true });\n//         \n//         button.focus()\n//     }\n// \n//     onKey(event) {\n//         if (event.defaultPrevented || event.repeat) {\n//             return;\n//         }\n// \n//         const key = event.key || event.keyCode;\n//         const closeButton = this.centeredMessage.buttons.find(b => b.type === \"secundary\")\n// \n//         if (key === \"Tab\") {\n//             this.focusNextButton();\n//             event.preventDefault();\n//             return;\n//         }\n// \n//         if (key === \"Escape\" || key === \"Esc\" || key === 27) {\n//             if (!closeButton) {\n//                 return;\n//             }\n// \n//             this.onClickButton(closeButton).catch(console.error)\n//             event.preventDefault();\n//             return;\n//         }\n// \n//         if (key === \"Enter\" || key === 13) {\n//             const focusedButton = this.getButtons().find((b: any) => b === document.activeElement)\n//             if (focusedButton) {\n//                 // Browser default\n//                 return;\n//             }\n//             // Do we have a default action?\n//             const defaultButton = this.centeredMessage.buttons.find(b => b.action !== null && b.type !== \"destructive\")\n//             if (defaultButton) {\n//                 this.onClickButton(defaultButton).catch(console.error)\n//                 event.preventDefault();\n//                 return;\n//             }\n//         }\n//     }\n// }\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use '@stamhoofd/scss/base/text-styles.scss';\n\n.centered-message {\n    position: fixed;\n    z-index: 10000;\n    left: 50%;\n    top: 50%;\n    transform: translate(-50%, -50%);\n    @extend .style-overlay-shadow;\n    border-radius: $border-radius-modals;\n    background: $color-background;\n    max-width: calc(100vw - 30px);\n    width: 350px;\n    \n    box-sizing: border-box;\n    max-height: 100vh;\n    overflow: auto;\n    overflow-x: hidden;\n\n    @media (max-width: 551px) {\n        padding: 20px;\n\n        .buttons {\n            display: flex;\n            flex-direction: column;\n            gap: 10px;\n            padding-top: 20px;\n        }\n    }\n\n    @media (min-width: 550px) {\n        width: 550px;\n        padding: 30px 40px;\n\n        .buttons {\n            border-top: $border-width-thin solid $color-border-shade;\n            padding: 15px 40px 15px 40px;\n            margin: 25px -40px -30px -40px;\n            display: flex;\n            flex-wrap: wrap;\n            justify-content: flex-start;\n            flex-direction: row-reverse;\n            gap: 10px;\n        }\n    }\n\n    > *:first-child {\n        margin-top: 10px;\n    }\n    \n    > img.center, > .icon.center {\n        display: block;\n        margin: 0 auto;\n    }\n\n    > .loading-button {\n        display: block;\n    }\n\n    > h1 {\n        padding-bottom: 10px;\n        text-align: left;\n        @extend .style-title-2;\n\n        + p {\n            @extend .style-description;\n        }\n    }\n}\n\n.centered-message-container {\n    position: fixed;\n    z-index: 10000;\n    left: 0;\n    top: 0;\n    bottom: 0;\n    right: 0;\n    background: rgba(0, 0, 0, 0.3);\n    opacity: 1;\n\n    @media (prefers-color-scheme: dark) {\n        background: rgba(8, 8, 8, 0.7);\n    }\n\n    &.show-enter-active {\n        transition: opacity 0.30s;\n\n        > .centered-message  {\n            transition: transform 0.30s cubic-bezier(0.0, 0.0, 0.2, 1);\n        }\n    }\n\n\n    &.show-leave-active {\n        transition: opacity 0.25s;\n\n        > .centered-message  {\n            transition: transform 0.25s cubic-bezier(0.4, 0.0, 1, 1);\n        }\n    }\n\n    &.show-enter-from, &.show-leave-to /* .fade-leave-active below version 2.1.8 */ {\n        // Instant appearing context menu! (only leave animation)\n        opacity: 0;\n\n        > .centered-message  {\n            @media (not (prefers-reduced-motion)) {\n                transform: translate(-50%, 50vh);\n            }\n\n        }\n    }\n}\n\n</style>\n","<template>\n    <SaveView :title=\"title\" :loading=\"saving\" :save-text=\"saveText\" @save=\"save\">\n        <h1>\n            {{ title }}\n        </h1>\n        <p v-if=\"description\">\n            {{ description }}\n        </p>\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <textarea\n            v-if=\"props.multiline\"\n            ref=\"firstInput\"\n            v-model=\"value\"\n            class=\"input\"\n            :placeholder=\"placeholder\"\n            autocomplete=\"off\"\n        />\n\n        <input\n            v-else\n            ref=\"firstInput\"\n            v-model=\"value\"\n            class=\"input\"\n            type=\"text\"\n            :placeholder=\"placeholder\"\n            autocomplete=\"off\"\n        >\n    </SaveView>\n</template>\n\n<script lang=\"ts\" setup>\nimport { usePop } from '@simonbackx/vue-app-navigation';\nimport { CenteredMessage, ErrorBox, useErrors } from '@stamhoofd/components';\nimport { computed, ref } from 'vue';\n\nconst props = withDefaults(\n    defineProps<{\n        title: string;\n        description?: string;\n        placeholder?: string;\n        defaultValue?: string;\n        multiline?: boolean;\n        saveText?: string;\n        saveHandler: (value: string) => Promise<void> | void;\n    }>(), {\n        description: '',\n        placeholder: '',\n        defaultValue: '',\n        saveText: undefined,\n        multiline: false,\n    });\n\nconst errors = useErrors();\nconst value = ref(props.defaultValue);\nconst saving = ref(false);\nconst pop = usePop();\n\nasync function save() {\n    if (saving.value) {\n        return;\n    }\n    saving.value = true;\n    try {\n        await props.saveHandler(value.value);\n        await pop({ force: true });\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    saving.value = false;\n}\n\nconst hasChanges = computed(() => {\n    return value.value !== props.defaultValue;\n});\n\nconst shouldNavigateAway = async () => {\n    if (!hasChanges.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm($t('996a4109-5524-4679-8d17-6968282a2a75'), $t('106b3169-6336-48b8-8544-4512d42c4fd6'));\n};\n\ndefineExpose({\n    shouldNavigateAway,\n});\n\n</script>\n","<template>\n    <div class=\"toast-view-container\">\n        <component class=\"toast-view\" :class=\"(toast.icon ?? '') + (toast.button && toast.forceButtonClick ? ' button' : '')\" @click=\"clicked\" @mousedown.prevent :is=\"!toast.button || !toast.forceButtonClick ? 'div' : (toast.button.href ? 'a' : 'button')\"  :href=\"toast.forceButtonClick ? (toast.button?.href ?? undefined) : undefined\" :download=\"toast.forceButtonClick ? (toast.button?.download ?? undefined) : undefined\">\n            <div v-if=\"toast.progress !== null\" class=\"progress\" :style=\"{ width: toast.progress * 100 + '%' }\" :class=\"{ hide: toast.progress >= 1 }\" />\n            <Spinner v-if=\"toast.icon === 'spinner'\" />\n            <span v-else-if=\"toast.icon\" class=\"first icon\" :class=\"toast.icon\" />\n            <div>\n                <div>{{ message }}</div>\n                <component v-if=\"toast.button\" :is=\"toast.forceButtonClick ? 'span' : (toast.button.href ? 'a' : 'button')\" :href=\"toast.button.href ?? undefined\" :download=\"toast.button.download ?? undefined\" class=\"button text increase-click-area\" type=\"button\" @click.stop=\"clickedButton\">\n                    {{ toast.button.text }}\n                </component>\n            </div>\n            <span v-if=\"toast.action\" class=\"icon arrow-right\" />\n        </component>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { NavigationMixin } from \"@simonbackx/vue-app-navigation\";\nimport { Component, Mixins, Prop } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport Spinner from '../Spinner.vue';\nimport { Toast } from './Toast';\n\n/**\n * This component will automatically show the root if we have a valid token. If the user logs out, we'll automatically show the login view\n*/\n@Component({\n    components: {\n        Spinner\n    }\n})\nexport default class ToastView extends Mixins(NavigationMixin) {\n    @Prop({ required: true })\n        toast: Toast\n\n    get message() {\n        return this.toast.message\n    }\n\n    isClosing = false\n\n    @Prop({default: null})\n        onClose: (() => void) | null\n\n    mounted() {\n        if (this.toast.autohideAfter) {\n            window.setTimeout(() => {\n                this.close();\n            }, this.toast.autohideAfter)\n        }\n        this.toast.doHide = () => {\n            this.close()\n        }\n    }\n\n    clicked() {\n        if (this.toast.forceButtonClick) {\n            return this.clickedButton()\n        }\n\n        this.close();\n        \n        if (this.toast.action) {\n            this.toast.action()\n        }\n    }\n\n    close() {\n        if (this.onClose && !this.isClosing) {\n            this.onClose();\n        }\n        this.isClosing = true\n        this.pop();\n    }\n\n    clickedButton() {\n        this.toast.button!.action()\n        this.close()\n    }\n}\n</script>\n\n<style lang=\"scss\">\n@use '@stamhoofd/scss/base/variables' as *;\n@use '@stamhoofd/scss/base/text-styles' as *;\n\n.toast-view-container {\n    padding: 5px 0;\n\n    @media (max-width: 550px) {\n        padding: 2.5px 0;\n    }\n}\n\n.toast-view {\n    touch-action: manipulation;\n    user-select: none;\n    cursor: pointer;\n    padding: 15px;\n    width: 450px;\n    max-width: 100%;\n\n    @media (max-width: 550px) {\n        padding: 15px 10px;\n        width: 100%;\n    }\n\n    box-sizing: border-box;\n    @extend .style-input-shadow;\n    background: $color-primary-background;\n    border-radius: $border-radius-modals;\n    pointer-events:all;   \n\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: flex-start;\n\n    font-size: 16px;\n    line-height: 1.4;\n    font-weight: $font-weight-semibold;\n    color: $color-primary;\n\n    @media (max-width: 700px) {\n        font-size: 14px;\n    }\n\n    div, .icon.dark {\n        color: $color-dark;\n    }\n\n    position: relative;\n    overflow: hidden;\n\n    .progress {\n        position: absolute;\n        left: 0;\n        top: 0;\n        height: 2px;\n        pointer-events: none;\n        background: $color-primary;\n        border-top-right-radius: 1px;\n        border-bottom-right-radius: 1px;\n        width: 0;\n        opacity: 1;\n        transition: width 0.3s, opacity 0.3s;\n\n        &.hide {\n            transition: width 0.3s, opacity 0.2s 0.3s;\n            opacity: 0;\n        }\n    }\n\n    .icon {\n        flex-shrink: 0;\n    }\n\n    .icon.first {\n        margin-left: 5px;\n        margin-right: 15px;\n\n        @media (max-width: 700px) {\n            margin-left: 0px;\n            margin-right: 10px;\n        }\n    }\n\n    &.green {\n        background-color: $color-success-background;\n        color: $color-success-dark;\n\n        .progress {\n            background: $color-success;\n        }\n    }\n\n    &.red {\n        background-color: $color-error-background;\n        color: $color-error-dark;;\n\n        .progress {\n            background: $color-error;\n        }\n    }\n\n    &.yellow {\n        background-color: $color-warning-background;\n        color: $color-warning-dark;;\n\n        .progress {\n            background: $color-warning;\n        }\n\n        .button {\n            color: $color-warning-dark;\n        }\n    }\n\n    &.button {\n        &:hover {\n            background: $color-primary-light;\n\n            .button:hover {\n                opacity: 1;\n            }\n        }\n    }\n    &> .spinner-container {\n        margin-right: 75px - 30px - 28px;\n    }\n\n    .button {\n        margin-top: 5px;\n    }\n}\n</style>\n","<template>\n    <div class=\"toast-box\" :class=\"{ withOffset: withOffset }\">\n        <transition-group name=\"move\" tag=\"div\">\n            <div v-for=\"(component, index) in components\"\n                 :key=\"component.key\"\n            >\n                <ComponentWithPropertiesInstance\n                    ref=\"children\"\n                    :component=\"component\"\n                    :custom-provide=\"getCustomProvide(index, component.key)\"\n                />\n            </div>\n        </transition-group>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { ComponentWithProperties, ComponentWithPropertiesInstance } from \"@simonbackx/vue-app-navigation\";\nimport { Component, VueComponent } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport { Toast } from \"./Toast\"\nimport ToastView from './ToastView.vue';\n/**\n * This component will automatically show the root if we have a valid token. If the user logs out, we'll automatically show the login view\n*/\n@Component({\n    components: {\n        ComponentWithPropertiesInstance\n    }\n})\nexport default class ToastBox extends VueComponent {\n    components: ComponentWithProperties[] = []\n    lastOffset = false\n\n    mounted() {\n        Toast.addListener(this, this.showToast)\n    }\n\n    getCustomProvide(index: number, key: number) {\n        return {\n            reactive_navigation_pop: () => {\n                this.removeAt(index, key);\n            },\n            reactive_navigation_dismiss: () => {\n                console.warn('Avoid calling dismiss in components on the ToastBox, since options are not supported here')\n                this.removeAt(index, key);\n            }\n        };\n    }\n\n    showToast(toast: Toast) {\n        this.show(new ComponentWithProperties(ToastView, { toast }))\n    }\n\n    hide(tag: string) {\n        for (const [index, component] of this.components.entries()) {\n            if (component.properties.tags && Array.isArray(component.properties.tags) && component.properties.tags.includes(tag)) {\n                this.removeAt(index, component.key)\n            }\n        }\n    }\n\n    show(component: ComponentWithProperties) {\n        // Make sure this component is not counted in navigation stuff\n        component.modalDisplayStyle = \"overlay\"\n\n        // if mobile: add to beginning\n        if (document.body.offsetWidth <= 450) {\n            this.components.unshift(component);\n        } else {\n            this.components.push(component);\n        }\n    }\n\n    removeAt(index: number, key: number) {\n        if (this.components[index] && this.components[index].key === key) {\n            this.components.splice(index, 1);\n            return;\n        }\n\n        // Search\n        for (let i = 0; i < this.components.length; i++) {\n            if (this.components[i].key === key) {\n                this.components.splice(i, 1);\n                return;\n            }\n        }\n\n        console.warn(\"Expected component with key \" + key + \" at index\" + index);\n    }\n\n    beforeUnmount() {\n        Toast.removeListener(this)\n        this.components = [];\n    }\n\n    get withOffset() {\n        if (this.components.length === 0) {\n            return this.lastOffset\n        }\n\n        for (const [index, component] of this.components.entries()) {\n            if (component.properties.toast && component.properties.toast.withOffset) {\n                this.lastOffset = true;\n                return true\n            }\n        }\n        this.lastOffset = false;\n        return false\n    }\n}\n</script>\n\n<style lang=\"scss\">\n@use '@stamhoofd/scss/base/variables' as *;\n\n.toast-box {\n    position: fixed;\n    bottom: 0;\n    right: 0;\n    z-index: 10001;\n    overflow: visible;\n    padding: 0 10px;\n    pointer-events:none;   \n    width: 450px;\n    padding-bottom: 0;\n    padding-top: calc(10px + var(--st-safe-area-top, 0px));\n\n    @media (max-width: 550px) {\n        padding: 0 5px;\n        width: 100%;\n    }\n\n    max-width: 100vw;\n    box-sizing: border-box;\n    transition: transform 0.3s;\n\n    transform: translateY(\n        calc(\n            -5px \n            - max(\n                var(--st-safe-area-bottom, 0px), \n                var(--keyboard-height, 0px)\n            ) \n        )\n    );\n    \n    &.withOffset {\n        transform: translateY(calc(-70px - max(var(--st-safe-area-bottom, 0px), var(--bottom-padding, 0px), var(--keyboard-height, 0px)) + var(--bottom-padding, 0px)));\n    }\n\n    > div > div {\n        transition: transform 0.35s, opacity 0.35s;\n        transform: scale(1, 1) translate(0, 0);\n        cursor: pointer;\n        touch-action: manipulation;\n\n        &:hover:not(:has(button:hover)):not(:has(a:hover)) {\n            transform: scale(0.98, 0.98) translateY(5px);\n            opacity: 0.8;\n        }\n    }\n\n    .move-enter-from, .move-leave-to\n        /* .list-complete-leave-active below version 2.1.8 */ {\n        opacity: 0;\n        transform: scale(0.9, 0.9) translateY(100%);\n        transform-origin: center center;\n    }\n\n\n    .move-leave-active {\n        height: 0;\n        z-index: -10;\n        pointer-events: none;\n    }\n}\n</style>\n","<template>\n    <label class=\"age-input input\" :class=\"{ error: !valid }\">\n        <!-- \n            We use type = text here because the specs of number inputs ensure that we can't get \n            the raw string value, but we need this for our placeholder logic.\n            Also inputmode is more specific on mobile devices. \n            Only downside is that we lose the stepper input on desktop.\n        -->\n        <input\n            ref=\"input\"\n            v-model=\"valueString\"\n            type=\"text\"\n            inputmode=\"numeric\"\n            step=\"any\"\n            @blur=\"clean\"\n            @keydown.up.prevent=\"step(1)\"\n            @keydown.down.prevent=\"step(-1)\"\n        >\n        <div v-if=\"!valid\">\n            <span>{{ valueString }}</span>\n        </div>\n        <div v-else-if=\"valueString !== ''\">\n            <span>{{ valueString }}</span> {{ descriptionText }}\n        </div>\n        <div v-else>{{ placeholder }}</div>\n    </label>\n</template>\n\n<script lang=\"ts\">\nimport { Component, Prop, VueComponent, Watch } from \"@simonbackx/vue-app-navigation/classes\";\n\n@Component({\n    emits: ['update:modelValue']\n})\nexport default class AgeInput extends VueComponent {\n    @Prop({ default: 0 })\n        min!: number\n\n    @Prop({ default: false })\n        nullable!: boolean\n\n    @Prop({ default: 99 })\n        max!: number | null\n\n    @Prop({ default: null })\n        year!: number | null\n\n    valueString = \"\";\n    valid = true;\n\n    /** Price in cents */\n    @Prop({ default: null })\n        modelValue!: number | null\n\n    @Prop({ default: \"\" })\n        placeholder!: string\n\n    get internalValue() {\n        return this.modelValue\n    }\n\n    set internalValue(val: number | null) {\n        this.$emit('update:modelValue', val)\n    }\n\n    get descriptionText() {\n        if (!this.modelValue) {\n            return \"\"\n        }\n        return \"(geboren in \"+((this.year ?? new Date().getFullYear()) - this.modelValue)+\")\"\n    }\n\n    mounted() {\n        this.clean()\n    }\n\n    @Watch(\"valueString\")\n    onValueChanged(value: string, _oldValue: string) {\n        // We need the value string here! Vue does some converting to numbers automatically\n        // but for our placeholder system we need exactly the same string\n        if (value === \"\") {\n            this.valid = true;\n            if (this.nullable) {\n                this.internalValue = null\n            } else {\n                this.internalValue = Math.max(0, this.min);\n            }\n        } else {\n            const v = parseInt(value);\n            if (isNaN(v)) {\n                this.valid = false;\n\n                if (this.nullable) {\n                    this.internalValue = null\n                } else {\n                    this.internalValue = this.min;\n                }\n            } else {\n                this.valid = true;\n\n                // Remove extra decimals\n                this.internalValue = this.constrain(v);\n            }\n        }\n    }\n\n    // Restore invalid input, make the input value again\n    // And set valueString\n    clean() {\n        if (!this.valid) {\n            return;\n        }\n        if (this.internalValue === null) {\n            this.valueString = \"\"\n            return\n        }\n        // Check if has decimals\n        this.valueString = Math.floor(this.internalValue) + \"\";\n    }\n\n    // Limit value to bounds\n    constrain(value: number): number {\n        value = Math.max(this.min, value);\n        if (this.max !== null && value > this.max) {\n            value = this.max;\n        }\n        return value\n    }\n\n    step(add: number) {\n        if (!this.valid) {\n            return;\n        }\n        if (this.internalValue === null) {\n            return;\n        }\n        const val = this.constrain(this.internalValue + add);\n        this.valueString = Math.floor(val) + \"\";\n    }\n}\n</script>\n\n<!-- Add \"scoped\" attribute to limit CSS to this component only -->\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n\n.age-input {\n    position: relative;\n\n    & > div {\n        pointer-events: none;\n        user-select: none;\n        white-space: nowrap;\n\n        span {\n            white-space: pre;\n        }\n    }\n\n    & > input {\n        position: absolute;\n        left: 0;\n        right: 0;\n        top: 0;\n        bottom: 0;\n        opacity: 0;\n        width: 100%;\n        box-sizing: border-box;\n        padding: 5px 15px;\n        height:  calc(#{$input-height} - 2 * #{$border-width});\n        line-height: calc(#{$input-height} - 10px - 2 * #{$border-width});\n\n        &:focus {\n            opacity: 1;\n\n            & + div {\n                opacity: 0.5;\n\n                span {\n                    visibility: hidden;\n                }\n            }\n        }\n    }\n}\n</style>\n","<template>\n    <STListItem :selectable=\"!disabled\" element-name=\"label\">\n        <template #left>\n            <Checkbox v-model=\"model\" :disabled=\"disabled\" />\n        </template>\n\n        <h3 class=\"style-title-list\">\n            {{ label }}\n        </h3>\n        <p v-if=\"description\" class=\"style-description-small\">\n            {{ description }}\n        </p>\n\n        <slot />\n\n        <template #right>\n            <slot name=\"right\" />\n        </template>\n    </STListItem>\n</template>\n\n<script lang=\"ts\" setup>\n\nwithDefaults(defineProps<{\n    disabled?: boolean;\n    label: string;\n    description?: string | null;\n}>(), {\n    disabled: false,\n    description: null,\n});\nconst model = defineModel<boolean>();\n\n</script>\n","<template>\n    <STInputBox :title=\"calculatedTitle\" error-fields=\"companyNumber\" :error-box=\"errorBox\">\n        <input v-model=\"companyNumberRaw\" class=\"input\" type=\"text\" :class=\"{ error: !valid }\" :placeholder=\"placeholder\" :autocomplete=\"autocomplete\" @change=\"validate\">\n    </STInputBox>\n</template>\n\n<script lang=\"ts\">\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { Component, Prop, VueComponent, Watch } from '@simonbackx/vue-app-navigation/classes';\nimport { Country } from '@stamhoofd/structures';\n\nimport { ErrorBox } from '../errors/ErrorBox';\nimport { Validator } from '../errors/Validator';\nimport STInputBox from './STInputBox.vue';\n\n@Component({\n    components: {\n        STInputBox,\n    },\n})\nexport default class CompanyNumberInput extends VueComponent {\n    @Prop({ required: true })\n    country!: Country;\n\n    @Prop({ default: '' })\n    title: string;\n\n    get calculatedTitle() {\n        if (this.title) {\n            return this.title;\n        }\n        if (this.country === Country.Netherlands) {\n            return 'KVK-nummer';\n        }\n        return 'Ondernemingsnummer';\n    }\n\n    @Prop({ default: null })\n    validator: Validator | null;\n\n    companyNumberRaw = '';\n    valid = true;\n\n    @Prop({ default: null })\n    modelValue!: string | null;\n\n    @Prop({ default: true })\n    required!: boolean;\n\n    @Prop({ default: 'Vul jouw ondernemingsnummer hier in' })\n    placeholder!: string;\n\n    @Prop({ default: 'vat number' })\n    autocomplete!: string;\n\n    errorBox: ErrorBox | null = null;\n\n    @Watch('modelValue')\n    onValueChanged(val: string | null) {\n        if (val === null) {\n            return;\n        }\n        this.companyNumberRaw = val;\n    }\n\n    mounted() {\n        if (this.validator) {\n            this.validator.addValidation(this, () => {\n                return this.validate();\n            });\n        }\n\n        this.companyNumberRaw = this.modelValue ?? '';\n    }\n\n    unmounted() {\n        if (this.validator) {\n            this.validator.removeValidation(this);\n        }\n    }\n\n    validate() {\n        this.companyNumberRaw = this.companyNumberRaw.trim().toUpperCase().replace(/\\s/g, ' '); // replacement is needed because some apps use non breaking spaces when copying\n\n        if (!this.required && this.companyNumberRaw.length === 0) {\n            this.errorBox = null;\n            this.$emit('update:modelValue', null);\n            return true;\n        }\n\n        if (this.companyNumberRaw.length === 0) {\n            this.errorBox = new ErrorBox(new SimpleError({\n                code: 'invalid_field',\n                message: 'Verplicht in te vullen',\n                field: 'companyNumber',\n            }));\n            return false;\n        }\n        else {\n            this.$emit('update:modelValue', this.companyNumberRaw);\n            this.errorBox = null;\n            return true;\n        }\n    }\n}\n</script>\n","<template>\n    <STInputBox title=\"Wachtwoord sterkte\">\n        <div class=\"password-strength\">\n            <div :style=\"{ width: strength+'%' }\" :class=\"type\" />\n        </div>\n        <p v-if=\"!modelValue\" class=\"style-description-small\">\n            Gebruik bij voorkeur de wachtwoord-beheerder van jouw browser\n        </p>\n        <p v-else-if=\"warning.length > 0\" class=\"style-description-small\">\n            {{ warning }}\n        </p>\n        <p v-else-if=\"duration <= 60*60\" class=\"style-description-small\">\n            Kan in enkele minuten worden geraden door een computer\n        </p>\n        <p v-else-if=\"duration <= 60*60*24\" class=\"style-description-small\">\n            Kan in enkele uren worden geraden door een computer\n        </p>\n        <p v-else-if=\"duration <= 60*60*24*30\" class=\"style-description-small\">\n            Kan in enkele dagen worden geraden door een computer\n        </p>\n        <p v-else-if=\"duration <= 60*60*24*30*12\" class=\"style-description-small\">\n            Kan binnen het jaar worden geraden door een computer\n        </p>\n        <p v-else class=\"style-description-small\">\n            Jouw wachtwoord ziet er goed uit\n        </p>\n\n        <template #right>\n            <span v-if=\"modelValue\" :class=\"type\" class=\"password-strength-description\">{{ description }}</span>\n        </template>\n    </STInputBox>\n</template>\n\n<script lang=\"ts\">\nimport { Component, Prop, VueComponent, Watch } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport STInputBox from \"./STInputBox.vue\";\n\n@Component({\n    components: {\n        STInputBox\n    }\n})\nexport default class PasswordStrength extends VueComponent {\n    @Prop({ default: null })\n        modelValue!: string | null\n\n    strength = 0\n    duration = 0\n    warning = \"\"\n\n    calculateCounter = 0\n    loading = false\n\n    @Watch('modelValue')\n    onValueChanged(val: string | null) {\n        if (val === null || val.length === 0) {\n            this.calculateCounter++\n            this.strength = 0;\n            this.duration = 0;\n            this.loading = false\n            return\n        }\n        this.calculateStrength(val).catch(e => {\n            console.error(e)\n        })\n    }\n\n    async calculateStrength(password: string) {\n        this.calculateCounter++\n        const saved = this.calculateCounter\n        this.loading = true\n\n        try {\n            const calculator = await import(/* webpackChunkName: \"PasswordStrengthCalculator\" */ \"./PasswordStrengthCalculator\")\n            if (saved !== this.calculateCounter) {\n                // skip\n                return\n            }\n            const result = calculator.checkPassword(password)\n            if (saved !== this.calculateCounter) {\n                // skip\n                return\n            }\n            this.warning = result.feedback.warning ?? \"\"\n            this.strength = result.score*25\n            this.duration = result.crackTimesSeconds.offlineSlowHashing1e4PerSecond\n\n        } catch (e) {\n            // ignore\n        }\n\n        if (saved === this.calculateCounter) {\n            this.loading = false\n        }\n    }\n\n    get type() {\n        const strength = this.strength\n        if (strength === 0) {\n            return \"none\"\n        }\n\n        if (strength < 50) {\n            return \"error\"\n        }\n\n        if (strength < 100) {\n            return \"warning\"\n        }\n\n        return \"success\"\n    }\n\n    get description() {\n        const strength = this.strength\n        if (strength < 50) {\n            return \"Heel zwak\"\n        }\n\n        if (strength < 75) {\n            return \"Zwak\"\n        }\n\n        if (strength < 100) {\n            return \"Matig\"\n        }\n\n        return \"Sterk\"\n    }\n\n    get detailDescription() {\n        if (this.warning.length > 0) {\n            return this.warning\n        }\n    }\n\n}\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n\n.password-strength {\n    width: 100%;\n    height: 4px;\n    border-radius: 2px;\n    background: $color-border;\n    position: relative;\n    overflow: hidden;\n    margin-top: 5px !important;\n\n    > div {\n        left: 0;\n        top: 0;\n        bottom: 0;\n        position: absolute;\n        background: $color-primary;\n        border-radius: 2px;\n        width: 0;\n        transition: width 0.2s, background-color 0.2s;\n\n        &.none {\n            background: $color-border;\n        }\n\n        &.error {\n            background: $color-error;\n        }\n\n        &.warning {\n            background: $color-warning;\n        }\n\n        &.success {\n            background: $color-success;\n        }\n    }\n}\n\n.password-strength-description {\n    font-weight: bold;\n\n    &.none {\n        color: $color-gray-text;\n    }\n\n    &.error {\n        color: $color-error;\n    }\n\n    &.warning {\n        color: $color-warning;\n    }\n\n    &.success {\n        color: $color-success;\n    }   \n}\n</style>\n","<template>\n    <label class=\"permyriad-input input\" :class=\"{ error: !valid }\">\n        <!-- \n            We use type = text here because the specs of number inputs ensure that we can't get \n            the raw string value, but we need this for our placeholder logic.\n            Also inputmode is more specific on mobile devices. \n            Only downside is that we lose the stepper input on desktop.\n        -->\n        <input\n            ref=\"input\"\n            v-model=\"valueString\"\n            type=\"text\"\n            inputmode=\"decimal\"\n            step=\"any\"\n            @blur=\"clean\"\n            @keydown.up.prevent=\"step(100)\"\n            @keydown.down.prevent=\"step(-100)\"\n        >\n        <div v-if=\"!valid\">\n            <span>{{ valueString }}</span>\n        </div>\n        <div v-else-if=\"valueString !== ''\">\n            <span>{{ valueString }}</span> {{ suffix }}\n        </div>\n        <div v-else class=\"placeholder\">{{ placeholder }}</div>\n    </label>\n</template>\n\n<script lang=\"ts\">\nimport { Component, Prop, VueComponent, Watch } from \"@simonbackx/vue-app-navigation/classes\";\n\n@Component\nexport default class PermyriadInput extends VueComponent {\n    /** in per ten thousands */\n    @Prop({ default: 0 })\n        min!: number | null\n\n    /** in per ten thousand */\n    @Prop({ default: 10000 })\n        max!: number | null\n\n    valueString = \"40\";\n    valid = true;\n\n    /** Price in cents */\n    @Prop({ default: null })\n        modelValue!: number | null\n\n    suffix = \"%\";\n\n    @Prop({ default: \"\" })\n        placeholder!: string\n\n    @Prop({ default: true })\n        required!: boolean\n\n    @Watch('modelValue')\n    onRealValueChanged(val: number | null, old: number | null) {\n        if (old === val) {\n            return\n        }\n        const {value: currentValue} = this.stringToValue(this.valueString)\n\n        if (currentValue === val) {\n            return\n        }\n\n        if (val === null)  {\n            if (this.required) {\n                this.internalValue = this.constrain(this.modelValue ?? this.min ?? 0);\n            }\n            this.clean();\n            return;\n        }\n\n        this.internalValue = this.constrain(val);\n        this.clean();\n    }\n\n    get internalValue() {\n        return this.modelValue\n    }\n\n    set internalValue(val: number | null) {\n        this.$emit('update:modelValue', val)\n    }\n\n    mounted() {\n        this.clean()\n    }\n\n    stringToValue(str: string) {\n        // We need the value string here! Vue does some converting to numbers automatically\n        // but for our placeholder system we need exactly the same string\n        if (str === \"\") {\n            if (this.required) {\n                return {\n                    value: Math.max(0, this.min ?? 0),\n                    valid: true\n                }\n            } else {\n                return {\n                    value: null,\n                    valid: true\n                }\n            }\n        } else {\n            if (!str.includes(\".\")) {\n                // We do this for all locales since some browsers report the language locale instead of the formatting locale\n                str = str.replace(\",\", \".\");\n            }\n            const v = parseFloat(str);\n            if (isNaN(v)) {\n                return {\n                    value: this.min ?? 0,\n                    valid: false\n                }\n            } else {\n                // Remove extra decimals\n                return {\n                    value: this.constrain(Math.round(v * 100)),\n                    valid: true\n                }\n            }\n        }\n    }\n\n    @Watch(\"valueString\")\n    onValueChanged(value: string, _oldValue: string) {\n        const {valid, value: newValue} = this.stringToValue(value);\n        this.valid = valid;\n        this.internalValue = newValue;\n    }\n\n    /// Returns the decimal separator of the system. Might be wrong if the system has a region set different from the language with an unknown combination.\n    whatDecimalSeparator(): string {\n        const n = 1.1;\n        const str = n.toLocaleString().substring(1, 2);\n        return str;\n    }\n\n    // Restore invalid input, make the input value again\n    // And set valueString\n    clean() {\n        if (!this.valid) {\n            return;\n        }\n\n        const value = this.internalValue\n\n        if (value === null) {\n            this.valueString = \"\"\n            return\n        }\n\n        // Check if has decimals\n        const float = value / 100\n        const decimals = float % 1;\n        const abs = Math.abs(float);\n\n        if (decimals !== 0) {\n            // Include decimals\n            this.valueString =\n                (float < 0 ? \"-\" : \"\") +\n                Math.floor(abs) +\n                this.whatDecimalSeparator() +\n                (\"\"+Math.round(Math.abs(decimals) * 100)).padStart(2, \"0\");\n        } else {\n            // Hide decimals\n            this.valueString = float + \"\";\n        }\n    }\n\n    // Limit value to bounds\n    constrain(value: number): number {\n        if (this.min !== null && value < this.min) {\n            value = this.min;\n        } else if (this.max !== null && value > this.max) {\n            value = this.max;\n        }\n        return value\n    }\n\n    step(add: number) {\n        if (!this.valid) {\n            return;\n        }\n        this.internalValue = this.constrain((this.modelValue ?? this.min ?? 0) + add);\n        this.$nextTick(() => {\n            this.clean();\n        })\n    }\n}\n</script>\n\n<!-- Add \"scoped\" attribute to limit CSS to this component only -->\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n\n.permyriad-input {\n    position: relative;\n\n    & > div {\n        pointer-events: none;\n        user-select: none;\n        white-space: nowrap;\n\n        span {\n            white-space: pre;\n        }\n\n        &.placeholder {\n            opacity: 0.5;\n        }\n    }\n\n    & > input {\n        position: absolute;\n        left: 0;\n        right: 0;\n        top: 0;\n        bottom: 0;\n        opacity: 0;\n        width: 100%;\n        box-sizing: border-box;\n        padding: 5px 15px;\n        height:  calc(#{$input-height} - 2 * #{$border-width});\n        line-height: calc(#{$input-height} - 10px - 2 * #{$border-width});\n\n        &:focus {\n            opacity: 1;\n\n            & + div {\n                opacity: 0.5;\n\n                span {\n                    visibility: hidden;\n                }\n            }\n        }\n    }\n}\n</style>\n","<template>\n    <label class=\"prefix-input input\" :class=\"{ error: !valid }\">\n        <div class=\"prefix\" :class=\"{ fade: fadePrefix || focussed }\">\n            {{ focusPrefix !== null && focussed ? focusPrefix : prefix }}\n        </div>\n        <input\n            ref=\"input\"\n            v-model=\"internalValue\"\n            type=\"text\"\n            :spellcheck=\"false\"\n            autocorrect=\"off\"\n            autocomplete=\"off\"\n            autocapitalize=\"none\"\n            @focus=\"onFocus\"\n            @blur=\"onBlur\"\n        >\n    </label>\n</template>\n\n<script lang=\"ts\">\nimport { Component, Prop, VueComponent } from \"@simonbackx/vue-app-navigation/classes\";\n\n@Component({\n    emits: {\n        'update:modelValue': (_value: string) => true\n    }\n})\nexport default class PrefixInput extends VueComponent {\n    valid = true;\n\n    /** Price in cents */\n    @Prop({ default: \"\" })\n        modelValue!: string\n\n    @Prop({ default: \"\" })\n        prefix!: string\n\n    @Prop({ default: \"\" })\n        placeholder!: string\n\n    @Prop({ default: true })\n        fadePrefix!: boolean\n\n    @Prop({ default: null })\n        focusPrefix!: string | null\n\n    focussed = false\n\n    onFocus(event) {\n        this.focussed = true\n        this.$emit(\"focus\", event);\n    }\n\n    onBlur(event) {\n        this.focussed = false\n        this.$emit(\"blur\", event);\n    }\n\n    get internalValue() {\n        return this.modelValue\n    }\n\n    set internalValue(val: string) {\n        this.$emit('update:modelValue', val)\n    }\n}\n</script>\n\n<!-- Add \"scoped\" attribute to limit CSS to this component only -->\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n\n.input.prefix-input {\n    position: relative;\n    display: grid;\n    grid-template-columns: auto 1fr;\n    gap: 0;\n    align-items: stretch;\n    overflow: visible;\n\n    & > .prefix {\n        pointer-events: none;\n        user-select: none;\n        white-space: nowrap;\n        opacity: 1;\n        transition: opacity 0.2s;\n\n        &.fade {\n            opacity: 0.5;\n        }\n\n        box-sizing: border-box;\n        \n        \n        line-height: calc(#{$input-height} - 10px - 2 * #{$border-width});\n        display: block;\n\n        @media (max-width: 350px) {\n            letter-spacing: -0.5px;\n        }\n    }\n\n    & > input {\n        box-sizing: border-box;\n        display: block;\n        width: auto;\n        min-width: 0;\n\n        padding: 5px 15px;\n        margin: -5px -15px;\n\n        padding-right: 0;\n        margin-right: 0;\n\n        // Clicking on the prefix should set the cursor to the start + allow text selection easily\n        padding-left: 200px;\n        margin-left: -200px;\n\n        line-height: calc(#{$input-height} - 10px - 2 * #{$border-width});\n\n        text-overflow: ellipsis;\n        overflow: hidden;\n        white-space: nowrap;\n    }\n}\n</style>\n","<template>\n    <div class=\"segmented-control\">\n        <div\n            v-for=\"(item, index) in items\"\n            :key=\"index\"\n            class=\"item\"\n            :class=\"{ selected: item === modelValue }\"\n            @click=\"selectItem(index)\"\n        >\n            <div :data-text=\"labels ? labels[index] : item\" />\n        </div>\n        <div\n            class=\"pointer\"\n            :style=\"{\n                transform: pointerTransform\n            }\"\n        >\n            <div\n                :style=\"{\n                    width: 100 / items.length + '%',\n                }\"\n            />\n        </div>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { Component, Prop, VueComponent } from '@simonbackx/vue-app-navigation/classes';\n\n@Component({\n    props: {\n        items: Array,\n        value: String,\n    },\n    emits: ['update:modelValue'],\n})\nexport default class SegmentedControl extends VueComponent {\n    @Prop({ type: Array })\n    public items!: any[];\n\n    @Prop({ default: null })\n    public labels!: string[] | null;\n\n    @Prop()\n    public modelValue!: any;\n\n    get selectedIndex() {\n        return this.items.indexOf(this.modelValue);\n    }\n\n    get pointerTransform() {\n        const percentage = (this.selectedIndex / this.items.length) * 100;\n        return 'translateX(' + percentage.toFixed(2) + '%)';\n    }\n\n    selectItem(index) {\n        this.$emit('update:modelValue', this.items[index]);\n    }\n}\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use '@stamhoofd/scss/base/text-styles.scss';\n\n$segmented-control-border-width: 2px;\n$segmented-control-height: 38px;\n$segmented-control-inner-height: $segmented-control-height - $segmented-control-border-width * 2;\n\n$border-radius: 9px;\n\n.st-view > main > h1 + .segmented-control{\n    margin-bottom: 20px;\n\n    @media (max-width: 550px) {\n        margin-bottom: 15px;\n    }\n}\n\n.segmented-control.with-margin {\n    margin-bottom: 15px;\n}\n\n.segmented-control {\n    user-select: none;\n    -webkit-touch-callout: none;\n    background: $color-gray-3;\n    padding: $segmented-control-border-width;\n    border-radius: $border-radius;\n    width: 100%;\n    box-sizing: border-box;\n    display: flex;\n    position: relative;\n    z-index: 0;\n    overflow: hidden;\n    @extend .style-button-smaller;\n    height: $segmented-control-height;\n    contain: strict;\n\n    & > .item {\n        flex-grow: 1;\n        height: $segmented-control-inner-height;\n        padding: 0 10px;\n\n        cursor: pointer;\n        user-select: none;\n        position: relative;\n        touch-action: manipulation;\n        -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n\n        &::before {\n            content: \"\";\n            position: absolute;\n            z-index: -10;\n            top: 5px;\n            bottom: 5px;\n            left: calc(-1 * $segmented-control-border-width / 2);\n            width: $segmented-control-border-width;\n            border-radius: calc($segmented-control-border-width / 2);\n            background: $color-gray-2;\n            opacity: 1;\n            transition: opacity 0.2s;\n        }\n\n        &.selected,\n        &:first-child,\n        &.selected + div {\n            &::before {\n                opacity: 0;\n            }\n        }\n\n        & > div {\n            display: block;\n\n            &::before {\n                content: attr(data-text);\n                position: absolute;\n                left: 10px;\n                right: 10px;\n                top: 0;\n                height: $segmented-control-inner-height;;\n                line-height: $segmented-control-inner-height;;\n                text-align: center;\n                text-overflow: ellipsis;\n                opacity: 1;\n                overflow: hidden;\n                white-space: nowrap;\n                transition: opacity 0.2s 0.1s;\n\n                // Fixes bug on Safari (desktop) that causes the text to jump up and down during animation\n                will-change: opacity;\n            }\n\n            &::after {\n                content: attr(data-text);\n                position: absolute;\n                left: 10px;\n                right: 10px;\n                top: 0;\n                height: $segmented-control-inner-height;;\n                line-height: $segmented-control-inner-height;;\n                text-align: center;\n                text-overflow: ellipsis;\n                font-weight: 600;\n                overflow: hidden;\n                white-space: nowrap;\n                opacity: 0;\n                transition: opacity 0.2s 0.1s;\n\n                // Fixes bug on Safari (desktop) that causes the text to jump up and down during animation\n                will-change: opacity;\n            }\n        }\n\n        &:active > div {\n            &::before {\n                opacity: 0.4;\n            }\n        }\n\n        // Animate font weight change\n        &.selected > div {\n            &::before {\n                opacity: 0;\n            }\n            &::after {\n                opacity: 1;\n            }\n        }\n\n        // Animate font weight change\n        &.selected:active > div {\n            &::after {\n                opacity: 0.4;\n            }\n        }\n    }\n    & > .pointer {\n        // Width needs to be correct, because transformX will use percentages!\n        position: absolute;\n        top: $segmented-control-border-width;\n        height: $segmented-control-inner-height;;\n        left: $segmented-control-border-width;\n        right: $segmented-control-border-width;\n        z-index: -1;\n        pointer-events: none;\n\n        transition: transform 0.25s ease;\n        transform: translate(0, 0);\n        will-change: transform;\n\n        & > div {\n            position: absolute;\n            left: 0;\n            top: 0;\n            height: $segmented-control-inner-height;\n            background: $color-background-highlight;\n            border-radius: $border-radius - $segmented-control-border-width;\n            box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.25);\n        }\n    }\n}\n</style>\n","<template>\n    <STInputBox :title=\"title\" error-fields=\"time\" :error-box=\"errorBox\">\n        <input v-model=\"timeRaw\" class=\"input\" type=\"time\" :class=\"{ error: !valid }\" :placeholder=\"placeholder\" :autocomplete=\"autocomplete\" :disabled=\"disabled\" @input=\"(event) => {timeRaw = event.currentTarget.value; validate();}\">\n    </STInputBox>\n</template>\n\n<script lang=\"ts\">\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { Component, Prop, VueComponent, Watch } from \"@simonbackx/vue-app-navigation/classes\";\nimport { Formatter } from '@stamhoofd/utility';\n\nimport { ErrorBox } from \"../errors/ErrorBox\";\nimport { Validator } from \"../errors/Validator\";\nimport STInputBox from \"./STInputBox.vue\";\n\n@Component({\n    components: {\n        STInputBox\n    }\n})\nexport default class TimeInput extends VueComponent {\n    @Prop({ default: \"\" }) \n        title: string;\n\n    @Prop({ default: null }) \n        validator: Validator | null\n\n    timeRaw = \"\";\n    valid = true;\n\n    @Prop({ required: true })\n        modelValue!: Date\n\n    @Prop({ default: false })\n        disabled!: boolean\n\n    @Prop({ default: \"\" })\n        placeholder!: string\n\n    @Prop({ default: \"\" })\n        autocomplete!: string\n\n    errorBox: ErrorBox | null = null\n\n    @Watch('modelValue', {deep: true})\n    onValueChanged(val: Date) {\n        if (val === null) {\n            return\n        }\n        this.timeRaw = Formatter.timeIso(this.modelValue)\n    }\n\n    mounted() {\n        if (this.validator) {\n            this.validator.addValidation(this, () => {\n                return this.validate()\n            })\n        }\n        this.timeRaw = Formatter.timeIso(this.modelValue)\n    }\n\n    unmounted() {\n        if (this.validator) {\n            this.validator.removeValidation(this)\n        }\n    }\n\n    async validate() {\n        this.timeRaw = this.timeRaw.trim().toLowerCase()\n\n        const regex = /^([0-9]{1,2}:)?[0-9]{1,2}$/;\n        \n        if (!regex.test(this.timeRaw)) {\n            this.errorBox = new ErrorBox(new SimpleError({\n                \"code\": \"invalid_field\",\n                \"message\": \"Ongeldig tijdstip. Voer in zoals bv. '12:30'\",\n                \"field\": \"time\"\n            }))\n            return false\n\n        } else {\n            const split = this.timeRaw.split(\":\")\n            let hours = parseInt(split[0])\n            let minutes = parseInt(split[1] ?? \"0\")\n\n            if (isNaN(hours)) {\n                hours = 0;\n            }\n\n            if (isNaN(minutes)) {\n                minutes = 0;\n            }\n\n            if (hours > 24 || minutes > 60) {\n                this.errorBox = new ErrorBox(new SimpleError({\n                    \"code\": \"invalid_field\",\n                    \"message\": \"Ongeldig tijdstip. Voer in zoals bv. '12:30'\",\n                    \"field\": \"time\"\n                }))\n                return false\n            }\n \n            const d = new Date(this.modelValue.getTime())\n            d.setHours(hours, minutes, 0, 0)\n            this.$emit('update:modelValue', d)\n\n            this.errorBox = null\n            return true\n        }\n    }\n}\n</script>\n","<template>\n    <STInputBox :title=\"title\" error-fields=\"url\" :error-box=\"errorBox\">\n        <input v-model=\"urlRaw\" class=\"input\" :class=\"{ error: !valid }\" :placeholder=\"placeholder || $t('5d75775a-a4b5-426a-aea9-b1e75ee5f055')\" autocomplete=\"url\" @change=\"validate(false)\" @input=\"(event) => {urlRaw = event.target.value; onTyping();}\">\n    </STInputBox>\n</template>\n\n<script lang=\"ts\">\nimport { isSimpleError, isSimpleErrors, SimpleError } from '@simonbackx/simple-errors';\nimport { Component, Prop, VueComponent, Watch } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport {ErrorBox} from \"../errors/ErrorBox\";\nimport {Validator} from \"../errors/Validator\";\nimport STInputBox from \"./STInputBox.vue\";\n\n@Component({\n    components: {\n        STInputBox\n    }\n})\nexport default class UrlInput extends VueComponent {\n    @Prop({ default: \"\" })\n        title: string\n\n    @Prop({ default: null }) \n        validator: Validator | null\n\n    urlRaw = \"\";\n    valid = true;\n\n    @Prop({ default: null })\n        modelValue!: string | null\n\n    @Prop({ default: true })\n        required!: boolean\n\n    /**\n     * Whether the value can be set to null if it is empty (even when it is required, will still be invalid)\n     * Only used if required = false\n     */\n    @Prop({ default: false })\n        nullable!: boolean\n\n    @Prop({ default: \"\" })\n        placeholder!: string\n\n    errorBox: ErrorBox | null = null\n\n    @Watch('modelValue')\n    onValueChanged(val: string | null) {\n        if (val === null) {\n            this.urlRaw = \"\"\n            return\n        }\n        this.urlRaw = val\n    }\n\n    onTyping() {\n        // Silently send value to parents, but don't show visible errors yet\n        this.validate(false, true);\n    }\n\n    mounted() {\n        if (this.validator) {\n            this.validator.addValidation(this, () => {\n                return this.validate(true)\n            })\n        }\n\n        this.urlRaw = this.modelValue ?? \"\"\n    }\n\n    unmounted() {\n        if (this.validator) {\n            this.validator.removeValidation(this)\n        }\n    }\n\n    validate(final: boolean, silent = false) {\n        if (this.urlRaw.length === 0) {\n\n            if (!this.required) {\n                if (!silent) {\n                    this.errorBox = null\n                }\n\n                if (this.modelValue !== null) {\n                    this.$emit('update:modelValue', null)\n                }\n                return true\n            }\n\n            if (!final) {\n                if (!silent) {\n                    this.errorBox = null\n                }\n\n                if (this.nullable && this.modelValue !== null) {\n                    this.$emit('update:modelValue', null)\n                }\n                return false\n            }\n        }\n        try {\n            let autoCorrected = this.urlRaw\n\n            if (!autoCorrected.startsWith(\"http://\") && !autoCorrected.startsWith(\"https://\")) {\n                autoCorrected = \"https://\"+autoCorrected\n            }\n\n            try {\n                const u = new URL(autoCorrected)\n                autoCorrected = u.href;\n                if (u.pathname === '/' && autoCorrected[autoCorrected.length - 1] === '/') {\n                    // Remove trailing slash on root domains (because ugly)\n                    autoCorrected = autoCorrected.substring(0, autoCorrected.length - 1);\n                }\n            } catch (e) {\n                throw new SimpleError({\n                    code: 'invalid_field',\n                    field: 'url',\n                    message: 'Invalid url',\n                    human: this.$t(\"a68b5c92-df5d-4413-a00a-61139f6efe19\").toString(),\n                })\n            }\n\n            const v = silent ? this.urlRaw : autoCorrected;\n            this.urlRaw = v\n    \n            if (this.modelValue !== v) {\n                this.$emit('update:modelValue', v)\n            }\n            if (!silent) {\n                this.errorBox = null\n            }\n            return true\n        } catch (e) {\n            console.error(e)\n            if (!silent) {\n                if (isSimpleError(e) || isSimpleErrors(e)) {\n                    this.errorBox = new ErrorBox(e);\n                    return false;\n                }\n                this.errorBox = new ErrorBox(new SimpleError({\n                    \"code\": \"invalid_field\",\n                    \"message\": this.$t(\"a68b5c92-df5d-4413-a00a-61139f6efe19\").toString(),\n                    \"field\": \"url\"\n                }))\n            }\n            return false\n        }\n        \n    }\n}\n</script>\n","<template>\n    <STInputBox :title=\"title\" error-fields=\"VATNumber\" :error-box=\"errorBox\">\n        <input v-model=\"VATNumberRaw\" class=\"input\" type=\"text\" :class=\"{ error: !valid }\" :placeholder=\"placeholder\" :autocomplete=\"autocomplete\" @change=\"validate\">\n    </STInputBox>\n</template>\n\n<script lang=\"ts\">\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { Component, Prop, VueComponent, Watch } from \"@simonbackx/vue-app-navigation/classes\";\nimport { Country } from '@stamhoofd/structures';\n\nimport { ErrorBox } from \"../errors/ErrorBox\";\nimport { Validator } from \"../errors/Validator\";\nimport STInputBox from \"./STInputBox.vue\";\n\n@Component({\n    components: {\n        STInputBox\n    }\n})\nexport default class VATNumberInput extends VueComponent {\n    @Prop({ required: true }) \n        country!: Country;\n    \n    @Prop({ default: \"\" }) \n        title: string;\n\n    @Prop({ default: null }) \n        validator: Validator | null\n    \n    VATNumberRaw = \"\";\n    valid = true;\n\n    @Prop({ default: null })\n        modelValue!: string | null\n\n    @Prop({ default: true })\n        required!: boolean\n\n    @Prop({ default: \"Vul jouw BTW-nummer hier in\" })\n        placeholder!: string\n\n    @Prop({ default: \"vat number\" })\n        autocomplete!: string\n\n    errorBox: ErrorBox | null = null\n\n    @Watch('modelValue')\n    onValueChanged(val: string | null) {\n        if (val === null) {\n            return\n        }\n        this.VATNumberRaw = val\n    }\n\n    mounted() {\n        if (this.validator) {\n            this.validator.addValidation(this, () => {\n                return this.validate()\n            })\n        }\n\n        this.VATNumberRaw = this.modelValue ?? \"\"\n    }\n\n    unmounted() {\n        if (this.validator) {\n            this.validator.removeValidation(this)\n        }\n    }\n\n    async validate() {\n        this.VATNumberRaw = this.VATNumberRaw.trim().toUpperCase().replace(/\\s/g, \" \") // replacement is needed because some apps use non breaking spaces when copying\n\n        if (!this.required && this.VATNumberRaw.length === 0) {\n            this.errorBox = null\n            this.$emit('update:modelValue', null)\n            return true\n        }\n\n        if (this.required && this.VATNumberRaw.length === 0) {\n            this.errorBox = new ErrorBox(new SimpleError({\n                \"code\": \"invalid_field\",\n                \"message\": \"Vul een BTW-nummer in\",\n                \"field\": \"VATNumber\"\n            }))\n            return false\n        }\n\n        if (this.VATNumberRaw.length > 2 && this.VATNumberRaw.substr(0, 2) !== this.country) {\n            // Add required country in VAT number\n            this.VATNumberRaw = this.country+this.VATNumberRaw\n        }\n\n        const jsvat = await import(/* webpackChunkName: \"jsvat-next\" */ 'jsvat-next');\n        const result = jsvat.checkVAT(this.VATNumberRaw, this.country === Country.Belgium ? [jsvat.belgium] : [jsvat.netherlands]);\n        \n        if (!result.isValid) {\n            this.errorBox = new ErrorBox(new SimpleError({\n                \"code\": \"invalid_field\",\n                \"message\": \"Ongeldig BTW-nummer: \"+ this.VATNumberRaw,\n                \"field\": \"VATNumber\"\n            }))\n            return false\n\n        } else {\n            this.VATNumberRaw = result.value ?? this.VATNumberRaw\n            this.$emit('update:modelValue', this.VATNumberRaw)\n            this.errorBox = null\n            return true\n        }\n    }\n}\n</script>\n","import { Extension, isNodeEmpty } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport { Decoration, DecorationSet } from '@tiptap/pm/view';\n\n/**\n * This extension allows you to add a placeholder to your editor.\n * A placeholder is a text that appears when the editor or a node is empty.\n * @see https://www.tiptap.dev/api/extensions/placeholder\n */\nconst Placeholder = Extension.create({\n    name: 'placeholder',\n    addOptions() {\n        return {\n            emptyEditorClass: 'is-editor-empty',\n            emptyNodeClass: 'is-empty',\n            placeholder: 'Write something …',\n            showOnlyWhenEditable: true,\n            showOnlyCurrent: true,\n            includeChildren: false,\n        };\n    },\n    addProseMirrorPlugins() {\n        return [\n            new Plugin({\n                key: new PluginKey('placeholder'),\n                props: {\n                    decorations: ({ doc, selection }) => {\n                        const active = this.editor.isEditable || !this.options.showOnlyWhenEditable;\n                        const { anchor } = selection;\n                        const decorations = [];\n                        if (!active) {\n                            return null;\n                        }\n                        const isEmptyDoc = this.editor.isEmpty;\n                        doc.descendants((node, pos) => {\n                            const hasAnchor = anchor >= pos && anchor <= pos + node.nodeSize;\n                            const isEmpty = !node.isLeaf && isNodeEmpty(node);\n                            if ((hasAnchor || !this.options.showOnlyCurrent) && isEmpty) {\n                                const classes = [this.options.emptyNodeClass];\n                                if (isEmptyDoc) {\n                                    classes.push(this.options.emptyEditorClass);\n                                }\n                                const decoration = Decoration.node(pos, pos + node.nodeSize, {\n                                    class: classes.join(' '),\n                                    'data-placeholder': typeof this.options.placeholder === 'function'\n                                        ? this.options.placeholder({\n                                            editor: this.editor,\n                                            node,\n                                            pos,\n                                            hasAnchor,\n                                        })\n                                        : this.options.placeholder,\n                                });\n                                decorations.push(decoration);\n                            }\n                            return this.options.includeChildren;\n                        });\n                        return DecorationSet.create(doc, decorations);\n                    },\n                },\n            }),\n        ];\n    },\n});\n\nexport { Placeholder, Placeholder as default };\n//# sourceMappingURL=index.js.map\n","import { DarkMode } from '@stamhoofd/structures';\nimport { Colors } from '@stamhoofd/utility';\n\nexport class ColorHelper {\n    static primaryColor: string | null;\n    static hue;\n    static saturation;\n\n    static setColor(color: string, element?: HTMLElement) {\n        const { h, s, l } = Colors.hexToHSL(color);\n        const rgb = Colors.hexToRGB(color);\n\n        element = element ?? document.documentElement;\n        element.style.setProperty('--color-primary-hue', h + 'deg');\n        element.style.setProperty('--color-primary-saturation', s + '%');\n        element.style.setProperty('--color-primary-saturation-factor', (s / 100).toFixed(2));\n\n        this.primaryColor = color;\n        this.hue = h;\n        this.saturation = s;\n\n        // Calculate contrast color\n        const contrastColor = Colors.getContrastColor(rgb);\n\n        element.style.setProperty('--color-primary-contrast', contrastColor);\n        element.style.setProperty('--dark-theme-color-primary-contrast', contrastColor);\n\n        element.style.setProperty('--color-primary', color);\n\n        const colorDark = Colors.hslToHex({\n            h: h,\n            s: s,\n            l: Math.min(100, l + 5),\n        });\n\n        element.style.setProperty('--dark-theme-color-primary', colorDark);\n\n        // Invert dark or light colors depending on theme\n        const blackContrast = Colors.getAPCAContrast(rgb, { r: 0, g: 0, b: 0 });\n        const whiteContrast = Colors.getAPCAContrast(rgb, { r: 255, g: 255, b: 255 });\n        if (blackContrast < 50) {\n            const newL = 100 - l;\n            const newRGB = Colors.HSLToRGB(h, s, newL);\n            const newBlackContrast = Colors.getContrastRatio(newRGB, { r: 0, g: 0, b: 0 });\n\n            if (newBlackContrast > blackContrast) {\n                element.style.setProperty('--dark-theme-color-primary', `hsl(${h}, ${s}%, ${newL}%)`);\n\n                // Revert contrast color\n                element.style.setProperty('--dark-theme-color-primary-contrast', Colors.getContrastColor(newRGB));\n            }\n        }\n\n        if (whiteContrast < 50) {\n            const newL = 100 - l;\n            const newRGB = Colors.HSLToRGB(h, s, newL);\n            const newWhiteContrast = Colors.getContrastRatio(newRGB, { r: 255, g: 255, b: 255 });\n\n            if (newWhiteContrast > whiteContrast) {\n                element.style.setProperty('--color-primary', `hsl(${h}, ${s}%, ${newL}%)`);\n\n                // Invert contrast color\n                element.style.setProperty('--color-primary-contrast', Colors.getContrastColor(newRGB));\n            }\n        }\n    }\n\n    static setDarkMode(darkMode: DarkMode) {\n        if (darkMode === DarkMode.On) {\n            document.body.classList.add('dark');\n        }\n        else if (darkMode === DarkMode.Off) {\n            document.body.classList.add('light');\n        }\n    }\n}\n\n(window as any).ColorHelper = ColorHelper;\n","import { Node } from '@tiptap/core'\n\ntype BoxType = 'info' | 'warning'\ndeclare module '@tiptap/core' {\n    interface Commands<ReturnType> {\n        warningBox: {\n            /**\n       * Set a heading node\n       */\n            setBox: (BoxType) => ReturnType,\n            /**\n       * Toggle a heading node\n       */\n            toggleBox: (BoxType) => ReturnType,\n        }\n    }\n}\n\nexport const WarningBox = Node.create({\n    name: 'warningBox',\n\n    content: 'inline*',\n\n    group: 'block',\n\n    defining: true,\n\n    addAttributes() {\n        return {\n            type: {\n                default: 'warning',\n                rendered: false,\n            },\n        }\n    },\n\n    addCommands() {\n        return {\n            setBox: (type: BoxType) => ({ commands }) => {\n                return commands.setNode(this.name, {type})\n            },\n            toggleBox: (type: BoxType) => ({ commands }) => {\n                return commands.toggleNode(this.name, 'paragraph', {type})\n            },\n        }\n    },\n\n    parseHTML() {\n        return [\n            {\n                tag: `p`,\n                getAttrs: node => {\n                    if ((node as any)?.getAttribute('class') === 'warning-box') {\n                        return {type: 'warning'}\n                    }\n                    return false;\n                },\n                priority: 51, // 50 is default, so check before the normal paragraphs\n            },\n            {\n                tag: `p`,\n                getAttrs: node => {\n                    if ((node as any)?.getAttribute('class') === 'info-box') {\n                        return {type: 'info'}\n                    }\n                    return false;\n                },\n                priority: 51, // 50 is default, so check before the normal paragraphs\n            }\n        ]\n    },\n\n    renderHTML({ node }) {\n        return ['p', { class: node.attrs.type + '-box' }, 0]\n    },\n})","<template>\n    <div v-if=\"editor\" class=\"wysiwyg-text-input\">\n        <editor-content :editor=\"editor\" class=\"editor-content\" />\n\n        <div class=\"tools\">\n            <form v-if=\"showLinkEditor\" class=\"editor-button-bar sticky link\" autocomplete=\"off\" novalidate data-submit-last-field @submit.prevent=\"saveLink()\">\n                <STList>\n                    <STListItem class=\"no-padding right-stack\">\n                        <div class=\"list-input-box\">\n                            <span>Link:</span>\n\n                            <input ref=\"linkInput\" v-model=\"editLink\" class=\"list-input\" type=\"url\" placeholder=\"https://\" enterkeyhint=\"go\">\n                        </div>\n                        <template #right>\n                            <button class=\"button text\" type=\"submit\" @mousedown.prevent>\n                                {{ editLink.length === 0 ? \"Sluiten\" : \"Opslaan\" }}\n                            </button>\n                            <button v-if=\"editor.isActive('link')\" v-tooltip=\"'Link verwijderen'\" class=\"button icon trash gray\" type=\"button\" @mousedown.prevent @click.stop.prevent=\"clearLink()\" />\n                        </template>\n                    </STListItem>\n                </STList>\n            </form>\n\n            <div v-else class=\"small editor-button-bar sticky\">\n                <button v-tooltip=\"'Vet gedrukte tekst'\" class=\"button icon bold\" :class=\"{ 'is-active': editor.isActive('bold') }\" type=\"button\" @click=\"editor.chain().focus().toggleBold().run()\" />\n                <button v-tooltip=\"'Schuine tekst'\" class=\"button icon italic\" type=\"button\" :class=\"{ 'is-active': editor.isActive('italic') }\" @click=\"editor.chain().focus().toggleItalic().run()\" />\n                <button v-tooltip=\"'Onderlijn tekst'\" class=\"button icon underline\" type=\"button\" :class=\"{ 'is-active': editor.isActive('underline') }\" @click=\"editor.chain().focus().toggleUnderline().run()\" />\n\n                <hr v-if=\"!$isMobile\">\n\n                <button v-tooltip=\"'Titel'\" class=\"button icon text-style\" type=\"button\" @click=\"openTextStyles\" />\n                <button v-tooltip=\"'Horizontale lijn'\" class=\"button icon hr\" type=\"button\" @click=\"editor.chain().focus().setHorizontalRule().run()\" @mousedown.prevent />\n                <button v-tooltip=\"'Link toevoegen'\" class=\"button icon link\" type=\"button\" :class=\"{ 'is-active': editor.isActive('link') }\" @click.prevent.stop=\"openLinkEditor()\" @mousedown.prevent />\n            </div>\n        </div>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { Component, Prop, VueComponent, Watch } from '@simonbackx/vue-app-navigation/classes';\nimport { RichText } from '@stamhoofd/structures';\nimport Link from '@tiptap/extension-link';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Typography from '@tiptap/extension-typography';\nimport Underline from '@tiptap/extension-underline';\nimport StarterKit from '@tiptap/starter-kit';\nimport { Editor, EditorContent } from '@tiptap/vue-3';\n\nimport { ColorHelper } from '../ColorHelper';\nimport TooltipDirective from '../directives/Tooltip';\nimport { WarningBox } from '../editor/EditorWarningBox';\nimport STList from '../layout/STList.vue';\nimport STListItem from '../layout/STListItem.vue';\nimport STButtonToolbar from '../navigation/STButtonToolbar.vue';\nimport { ContextMenu, ContextMenuItem } from '../overlays/ContextMenu';\nimport { Toast } from '../overlays/Toast';\nimport { DataValidator } from '@stamhoofd/utility';\n\nfunction escapeHtml(unsafe: string): string {\n    return unsafe\n        .replace(/&/g, '&amp;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;')\n        .replace(/\"/g, '&quot;')\n        .replace(/'/g, '&#039;');\n}\n\n@Component({\n    components: {\n        EditorContent,\n        STButtonToolbar,\n        STList,\n        STListItem,\n    },\n    directives: {\n        Tooltip: TooltipDirective,\n    },\n    emits: ['update:modelValue'],\n})\nexport default class WYSIWYGTextInput extends VueComponent {\n    @Prop({ required: true })\n    modelValue!: RichText;\n\n    @Prop({ default: '' })\n    placeholder!: string;\n\n    @Prop({ default: 2 })\n    headingStartLevel!: number;\n\n    @Prop({ required: false, default: null })\n    color!: string | null;\n\n    @Prop({ default: '' })\n    editorClass!: string;\n\n    showLinkEditor = false;\n    editLink = '';\n    editor: Editor | null = null;\n    showTextStyles = false;\n\n    beforeMount() {\n        this.editor = this.buildEditor();\n    }\n\n    mounted() {\n        if (this.color) {\n            const el = (this.$el as HTMLElement).querySelector('.editor-content') as HTMLElement;\n            if (el) {\n                ColorHelper.setColor(this.color, el);\n            }\n        }\n    }\n\n    @Watch('color')\n    onColorChanged() {\n        if (this.color) {\n            const el = (this.$el as HTMLElement).querySelector('.editor-content') as HTMLElement;\n            if (el) {\n                ColorHelper.setColor(this.color, el);\n            }\n        }\n    }\n\n    beforeUnmount() {\n        // This fixes a glitch that the editor content is wiped before the transition is finished\n        const content = (this.$el as HTMLElement).innerHTML;\n        (this.$el as HTMLElement).innerHTML = content;\n        this.editor?.destroy();\n    }\n\n    buildEditor() {\n        let content = this.modelValue.html;\n\n        if (!content && this.modelValue.text) {\n            // Special conversion operation\n            const splitted = this.modelValue.text.split('\\n');\n            for (const split of splitted) (\n                content += `<p>${escapeHtml(split)}</p>`\n            );\n        }\n        return new Editor({\n            content,\n            extensions: [\n                StarterKit.configure({\n                    heading: {\n                        levels: [this.headingStartLevel as any, this.headingStartLevel + 1 as any],\n                    },\n                }),\n                Placeholder.configure({\n                    placeholder: this.placeholder,\n                }),\n                WarningBox.configure({}),\n                Typography.configure({}),\n                Link.configure({\n                    openOnClick: false,\n                    protocols: ['mailto'],\n                }),\n                Underline,\n            ],\n            onSelectionUpdate: ({ editor }) => {\n                if (this.showLinkEditor) {\n                    if (editor.isActive('link')) {\n                        this.editLink = editor.getAttributes('link')?.href ?? '';\n                    }\n                    else {\n                        if (editor.state.selection.empty) {\n                            this.showLinkEditor = false;\n                        }\n                    }\n                }\n            },\n            onUpdate: ({ editor }) => {\n                this.$emit('update:modelValue', RichText.create({ html: editor.getHTML(), text: editor.getText() }));\n            },\n            editorProps: {\n                attributes: {\n                    class: this.editorClass,\n                },\n            },\n        });\n    }\n\n    openLinkEditor() {\n        if (this.showLinkEditor) {\n            this.editor.chain().focus().run();\n            this.$nextTick(() => {\n                this.showLinkEditor = false;\n            });\n            return;\n        }\n        if (!this.editor.isActive('link') && this.editor.state.selection.empty) {\n            new Toast('Selecteer eerst tekst die je klikbaar wilt maken', 'info').show();\n            return;\n        }\n        this.editLink = this.editor.getAttributes('link')?.href ?? '';\n        this.showLinkEditor = true;\n        this.$nextTick(() => {\n            (this.$refs.linkInput as HTMLInputElement).focus();\n        });\n    }\n\n    openTextStyles(event) {\n        // Get initial selection\n        const m = this;\n        const menu = new ContextMenu([\n            [\n                new ContextMenuItem({\n                    name: 'Titel',\n                    icon: 'h1',\n                    selected: this.editor.isActive('heading', { level: this.headingStartLevel }),\n                    action: () => {\n                        m.editor.chain().focus().toggleHeading({ level: this.headingStartLevel as any }).run();\n                        return true;\n                    },\n                }),\n                new ContextMenuItem({\n                    name: 'Koptekst',\n                    icon: 'h2',\n                    selected: this.editor.isActive('heading', { level: this.headingStartLevel + 1 }),\n                    action: () => {\n                        m.editor.chain().focus().toggleHeading({ level: this.headingStartLevel + 1 as any }).run();\n                        return true;\n                    },\n                }),\n                new ContextMenuItem({\n                    name: 'Waarschuwing',\n                    icon: 'warning',\n                    selected: this.editor.isActive('warningBox', { type: 'warning' }),\n                    action: () => {\n                        m.editor.chain().focus().toggleBox('warning').run();\n                        return true;\n                    },\n                }),\n                new ContextMenuItem({\n                    name: 'Info',\n                    icon: 'info',\n                    selected: this.editor.isActive('warningBox', { type: 'info' }),\n                    action: () => {\n                        m.editor.chain().focus().toggleBox('info').run();\n                        return true;\n                    },\n                }),\n            ],\n            [\n                new ContextMenuItem({\n                    name: 'Opsomming met bolletjes',\n                    icon: 'ul',\n                    selected: this.editor.isActive('bulletList'),\n                    action: () => {\n                        m.editor.chain().focus().toggleBulletList().run();\n                        return true;\n                    },\n                }),\n                new ContextMenuItem({\n                    name: 'Opsomming met nummers',\n                    icon: 'ol',\n                    selected: this.editor.isActive('orderedList'),\n                    action: () => {\n                        m.editor.chain().focus().toggleOrderedList().run();\n                        return true;\n                    },\n                }),\n            ],\n        ]);\n        menu.show({ button: event.currentTarget, yPlacement: 'top' }).catch(console.error);\n    }\n\n    isValidHttpUrl(string: string) {\n        if (string.startsWith('mailto:')) {\n            // Strip mailto and validate email address\n            string = string.substring(7);\n            if (DataValidator.isEmailValid(string)) {\n                return true;\n            }\n            return false;\n        }\n\n        let url;\n\n        try {\n            url = new URL(string);\n        }\n        catch (_) {\n            return false;\n        }\n\n        return url.protocol === 'http:' || url.protocol === 'https:';\n    }\n\n    saveLink() {\n        let cleanedUrl = this.editLink.trim();\n\n        if (cleanedUrl.length === 0) {\n            this.clearLink();\n            return;\n        }\n\n        if (!this.isValidHttpUrl(cleanedUrl)) {\n            if (!cleanedUrl.startsWith('mailto:') && !cleanedUrl.startsWith('http://') && !cleanedUrl.startsWith('https://') && DataValidator.isEmailValid(cleanedUrl)) {\n                cleanedUrl = 'mailto:' + cleanedUrl;\n            } else if (this.isValidHttpUrl('http://' + cleanedUrl)) {\n                cleanedUrl = 'http://' + cleanedUrl;\n            }\n        }\n\n        if (!this.isValidHttpUrl(cleanedUrl)) {\n            new Toast('Ongeldige URL', 'error red').show();\n            return;\n        }\n\n        this.editor.chain().focus().extendMarkRange('link').setLink({ href: cleanedUrl }).focus().run();\n        this.$nextTick(() => {\n            this.showLinkEditor = false;\n        });\n    }\n\n    clearLink() {\n        this.editor.chain().focus().unsetLink().focus().run();\n        this.$nextTick(() => {\n            this.showLinkEditor = false;\n        });\n    }\n}\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use '@stamhoofd/scss/base/text-styles.scss';\n\n.wysiwyg-text-input {\n    @extend .style-input;\n    @extend .style-input-box;\n\n    .ProseMirror {\n        max-width: none;\n        padding: 12px 15px;\n        height: auto;\n        min-height: calc($input-height * 2);\n        line-height: 1.4;\n        outline: none;\n        min-height: 100px;\n\n        @extend .style-wysiwyg;\n    }\n\n    .tiptap p.is-editor-empty:first-child::before {\n        color: $color-gray-5;\n        content: attr(data-placeholder);\n        float: left;\n        height: 0;\n        pointer-events: none;\n    }\n\n    .tools {\n        opacity: 0;\n        pointer-events: none;\n        transition: opacity 0.2s, transform 0.2s;\n        transform: translateY(10px);\n        padding: 0 15px 12px 15px;\n        position: sticky;\n        bottom: -15px; // compensate main padding\n\n        &:focus-within {\n            opacity: 1;\n            pointer-events: auto;\n            transform: translateY(0px);\n        }\n    }\n\n    &:focus-within {\n        .tools {\n            opacity: 1;\n            pointer-events: auto;\n            transform: translateY(0px);\n        }\n    }\n\n}\n</style>\n","<template>\n    <div class=\"container\">\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <STList>\n            <STListItem v-if=\"nullable\" :selectable=\"true\" element-name=\"label\">\n                <template #left>\n                    <Checkbox v-model=\"allTags\" />\n                </template>\n                <h3 class=\"style-title-list\">\n                    {{ $t('4835dfd4-10b0-4e91-b581-d1b3eefa73f7') }}\n                </h3>\n            </STListItem>\n            <template v-if=\"model !== null\">\n                <STListItem v-for=\"option of options\" :key=\"option.tag.id\" :selectable=\"option.isEnabled && !option.isLocked\" element-name=\"label\">\n                    <template #left>\n                        <Checkbox :model-value=\"getTagValue(option.tag.id)\" :disabled=\"!option.isEnabled || option.isLocked\" @update:model-value=\"setTagValue(option.tag.id, $event)\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        {{ option.tag.name }}\n                    </h3>\n                </STListItem>\n            </template>\n        </STList>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\nimport { ErrorBox, useErrors, usePlatform, useValidation, Validator } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { OrganizationTag } from '@stamhoofd/structures';\nimport { computed, ref, watch, watchEffect } from 'vue';\n\nconst props = withDefaults(\n    defineProps<{\n        nullable?: boolean;\n        isTagEnabledPredicate?: (tag: OrganizationTag) => boolean;\n        validator: Validator;\n        shouldSelectAtLeastOne?: boolean;\n    }>(), {\n        nullable: false,\n        isTagEnabledPredicate: undefined,\n        shouldSelectAtLeastOne: true,\n    },\n);\n\nconst model = defineModel<string[] | null>({ required: true });\nconst platform = usePlatform();\nconst errors = useErrors({ validator: props.validator });\nconst $t = useTranslate();\n\nconst tags = computed(() => platform.value.config.tags);\nconst lastCachedValue = ref<string[] | null>(null);\n\nwatchEffect(() => {\n    if (model.value !== null) {\n        lastCachedValue.value = model.value;\n    }\n});\n\nconst options = computed(() => {\n    const isEnabledOperator = props.isTagEnabledPredicate;\n\n    let result: { tag: OrganizationTag; isEnabled: boolean; isLocked: boolean }[] = [];\n\n    if (isEnabledOperator !== undefined) {\n        result = tags.value.map(tag => ({ tag, isEnabled: isEnabledOperator(tag), isLocked: false }));\n    }\n    else {\n        result = tags.value.map(tag => ({ tag, isEnabled: true, isLocked: false }));\n    }\n\n    if (result.filter(x => x.isEnabled).length === 1) {\n        const firstEnabled = result.find(x => x.isEnabled);\n        if (firstEnabled) {\n            firstEnabled.isLocked = true;\n        }\n    }\n\n    return result;\n});\n\nuseValidation(errors.validator, () => {\n    const se = new SimpleErrors();\n    if (props.shouldSelectAtLeastOne) {\n        if (model.value !== null && model.value.length === 0) {\n            se.addError(new SimpleError({\n                code: 'invalid_field',\n                message: $t('074933d6-e0da-4542-8ec0-efb759645826'),\n                field: 'tags',\n            }));\n        }\n    }\n\n    if (se.errors.length > 0) {\n        errors.errorBox = new ErrorBox(se);\n        return false;\n    }\n\n    return true;\n});\n\nconst enabledOptions = computed(() => options.value.filter(t => t.isEnabled).map(t => t.tag.id));\n\nwatch(enabledOptions, (options) => {\n    if (options.length === 1) {\n        if (model.value === null) {\n            model.value = [options[0]];\n        }\n        else if (model.value.length === 0) {\n            model.value.push(options[0]);\n        }\n    }\n}, { immediate: true });\n\nconst allTags = computed({\n    get: () => model.value === null,\n    set: (allTags) => {\n        if (allTags) {\n            model.value = null;\n        }\n        else {\n            model.value = (lastCachedValue.value ?? []).slice();\n        }\n    },\n});\n\nfunction getTagValue(tag: string) {\n    return model.value?.includes(tag) ?? false;\n}\n\nfunction setTagValue(tag: string, value: boolean) {\n    if (model.value === null) {\n        return;\n    }\n    if (value) {\n        model.value = [...model.value.filter(t => t !== tag), tag];\n    }\n    else {\n        model.value = model.value.filter(t => t !== tag);\n    }\n}\n</script>\n","<template>\n    <LoadingBoxTransition>\n        <div v-if=\"!loading\" class=\"container\">\n            <hr>\n            <h2 class=\"style-with-button\">\n                <span>{{ title }}</span>\n                <div>\n                    <button v-long-press=\"(e) => switchCycle(e)\" type=\"button\" class=\"button text\" @click.prevent=\"switchCycle\" @contextmenu.prevent=\"switchCycle\">\n                        {{ period.name }}\n                        <span class=\"icon arrow-down-small\" />\n                    </button>\n                </div>\n            </h2>\n\n            <STList v-if=\"nullable || groups.length > 0\">\n                <STListItem v-if=\"nullable\" :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Checkbox v-model=\"allGroups\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        {{ $t('07d642d2-d04a-4d96-b155-8dbdb1a9e4ff') }}\n                    </h3>\n                </STListItem>\n\n                <template v-if=\"model !== null\">\n                    <STListItem v-for=\"group of groups\" :key=\"group.id\" :selectable=\"true\" element-name=\"label\">\n                        <template #left>\n                            <Checkbox :model-value=\"getGroupValue(group)\" @update:model-value=\"setGroupValue(group, $event)\" />\n                        </template>\n                        <h3 class=\"style-title-list\">\n                            {{ group.name }}\n                        </h3>\n                        <p v-if=\"group.description\" class=\"style-description-small\">\n                            {{ group.description }}\n                        </p>\n                    </STListItem>\n                </template>\n            </STList>\n\n            <p v-if=\"groups.length === 0\" class=\"info-box\">\n                {{ $t('fd52fa36-16e6-4106-807c-c387bc0acc0e') }}\n            </p>\n        </div>\n    </LoadingBoxTransition>\n</template>\n\n<script setup lang=\"ts\">\nimport { ContextMenu, ContextMenuItem, LoadingBoxTransition, useOrganization, usePlatform } from '@stamhoofd/components';\nimport { useOrganizationManager, useRequestOwner } from '@stamhoofd/networking';\nimport { GroupType, NamedObject, RegistrationPeriod, RegistrationPeriodList } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed, Ref, ref, watchEffect } from 'vue';\n\nconst props = withDefaults(\n    defineProps<{\n        nullable?: boolean;\n        defaultPeriodId?: string | null;\n        title?: string;\n    }>(), {\n        nullable: false,\n        defaultPeriodId: null,\n        title: 'Groepen',\n    },\n);\n\nconst model = defineModel<string[] | null>({ required: true });\nconst organization = useOrganization();\nconst organizationManager = useOrganizationManager();\nconst owner = useRequestOwner();\nconst platform = usePlatform();\nconst defaultPeriod = organization.value?.period?.period ?? platform.value.period;\nconst period = ref(defaultPeriod) as Ref<RegistrationPeriod>;\n\nconst lastCachedValue = ref<string[] | null>(null);\nconst periods = ref(RegistrationPeriodList.create({}) as any) as Ref<RegistrationPeriodList>;\nconst loading = ref(true);\nconst organizationPeriod = computed(() => periods.value.organizationPeriods.find(p => p.period.id === period.value.id));\n\nconst groups = computed(() => {\n    const p = organizationPeriod.value;\n    if (!p) {\n        return [];\n    }\n    return p.adminCategoryTree.getAllGroups().filter(g => g.type === GroupType.Membership).map(group => NamedObject.create({\n        id: group.id,\n        name: group.settings.name,\n        description: p.period.nameShort,\n    }));\n});\n\norganizationManager.value.loadPeriods(false, true, owner).then((p) => {\n    periods.value = p;\n\n    if (props.defaultPeriodId !== null) {\n        const pp = periods.value.periods.find(p => p.id === props.defaultPeriodId);\n\n        if (pp) {\n            period.value = pp;\n        }\n    }\n\n    loading.value = false;\n}).catch(console.error);\n\nfunction switchCycle(event: MouseEvent) {\n    const menu = new ContextMenu([\n        (periods.value.organizationPeriods ?? []).map((p) => {\n            const c = p.adminCategoryTree.getAllGroups().map(g => g.id).reduce((a, b) => a + (model.value?.includes(b) ? 1 : 0), 0);\n\n            return new ContextMenuItem({\n                name: p.period.name,\n                selected: p.period.id === period.value.id,\n                rightText: c > 0 ? Formatter.integer(c) : '',\n                action: () => {\n                    period.value = p.period;\n                    return true;\n                },\n            });\n        }),\n    ]);\n    menu.show({ button: event.currentTarget as HTMLElement, yOffset: -10 }).catch(console.error);\n}\n\nwatchEffect(() => {\n    if (model.value !== null) {\n        lastCachedValue.value = model.value;\n    }\n});\n\nconst allGroups = computed({\n    get: () => model.value === null,\n    set: (allGroups) => {\n        if (allGroups) {\n            model.value = null;\n        }\n        else {\n            model.value = (lastCachedValue.value ?? []).slice();\n        }\n    },\n});\n\nfunction getGroupValue(group: NamedObject) {\n    return !!model.value?.find(id => id === group.id);\n}\n\nfunction setGroupValue(group: NamedObject, value: boolean) {\n    if (model.value === null) {\n        return;\n    }\n    if (value) {\n        model.value = [...model.value.filter(id => id !== group.id), group.id];\n    }\n    else {\n        model.value = model.value.filter(id => id !== group.id);\n    }\n}\n</script>\n","<template>\n    <figure class=\"group-avatar\">\n        <div v-if=\"logoSrc\" class=\"logo\">\n            <img :src=\"logoSrc\" :srcset=\"logoSrcSet\">\n        </div>\n        <span v-else-if=\"allowEmpty\" class=\"icon gray\" />\n        <div v-else class=\"letter-logo\" :data-length=\"letters.length\">\n            {{ letters }}\n        </div>\n    </figure>\n</template>\n\n<script lang=\"ts\">\nimport { Group } from \"@stamhoofd/structures\";\nimport { Formatter } from \"@stamhoofd/utility\";\nimport { Component, Prop, VueComponent } from \"@simonbackx/vue-app-navigation/classes\";\n\n@Component\nexport default class GroupAvatar extends VueComponent {\n    @Prop({ required: true })\n        group!: Group\n\n    @Prop({ default: false })\n        allowEmpty!: boolean\n\n    get letters() {\n        return Formatter.firstLetters(this.group.settings.name, 2)\n    }\n\n    get logoSrc() {\n        return (this.group.settings.squarePhoto)?.getPathForSize(24, 24)\n    }\n\n    get logoSrcSet() {\n        if (!this.group.settings.squarePhoto) {\n            return null\n        }\n        return (this.group.settings.squarePhoto)!.getPathForSize(24, 24) + \" 1x, \"+(this.group.settings.squarePhoto)!.getPathForSize(24*2, 24*2)+\" 2x, \"+(this.group.settings.squarePhoto)!.getPathForSize(24*3, 24*3)+\" 3x\"\n    }\n}\n</script>\n\n<style lang=\"scss\">\n@use '@stamhoofd/scss/base/variables' as *;\n\n.group-avatar {\n    .letter-logo {\n        width: var(--block-width, 40px);\n        height: var(--block-width, 40px);\n        border-radius: 4px;\n        text-align: center;\n        background: $color-primary-light;\n        color: $color-primary-dark;\n        text-transform: uppercase;\n        line-height: var(--block-width, 40px);\n        font-size: 10px;\n        font-weight: $font-weight-bold;\n        position: relative;\n    }\n\n    .logo {\n        img {\n            width: var(--block-width, 40px);\n            height: var(--block-width, 40px);\n            object-fit: contain;\n        }\n        width: var(--block-width, 40px);\n        height: var(--block-width, 40px);\n        margin: -5px 0;\n        border-radius: 4px;\n        overflow: hidden;\n        //background: $color-background;\n        //box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.05), 0px 2px 15px rgba(0, 0, 0, 0.05);\n        position: relative;\n\n        &::after {\n            border-radius: 12px;\n            // inset box shadow doesn't work over img tags\n            //box-shadow: inset 0px 0px 0px 2px rgba(0, 0, 0, 0.2);\n            content: '';\n            display: block;\n            height: 100%;\n            position: absolute;\n            top: 0;\n            width: 100%;\n\n            mix-blend-mode: luminosity;\n        }\n    }\n}\n</style>\n","<template>\n    <header :data-scrolled=\"scrolled\">\n        <div>\n            <div class=\"left\">\n                <slot name=\"left\" />\n            </div>\n            <div class=\"center\">\n                <slot name=\"center\" />\n            </div>\n            <div class=\"right\">\n                <slot name=\"right\" />\n            </div>\n            <div class=\"progress\" :style=\"{ width: progress * 100 + '%' }\" :class=\"{ hide: progress >= 1 }\" />\n        </div>\n    </header>\n</template>\n\n<script lang=\"ts\">\nimport { Component, Prop, VueComponent } from \"@simonbackx/vue-app-navigation/classes\";\n\n// The header component detects if the user scrolled past the header position and adds a background gradient in an animation\n@Component\nexport default class StepsHeader extends VueComponent {\n    scrolled = false;\n\n    @Prop()\n    progress!: number;\n\n    deactivated() {\n        // Vue somehow does the binding under the hood. Couldn't find any documentation..?\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        document.removeEventListener(\"scroll\", this.onScroll);\n    }\n\n    activated() {\n        // Vue somehow does the binding under the hood. Couldn't find any documentation..?\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        document.addEventListener(\"scroll\", this.onScroll, { passive: true });\n    }\n\n    onScroll() {\n        const scroll = window.scrollY;\n        if (scroll > 10) {\n            this.scrolled = true;\n        } else if (scroll < 5) {\n            this.scrolled = false;\n        }\n    }\n}\n</script>\n","<template>\n    <div class=\"steps-layout\">\n        <div class=\"progress\" :style=\"{ width: progress * 100 + '%' }\" :class=\"{ hide: progress >= 1 }\" />\n\n        <main>\n            <NavigationController\n                ref=\"navigationController\"\n                :root=\"root\"\n                @didPop=\"updateProgress\"\n                @didPush=\"updateProgress\"\n            />\n        </main>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { ComponentWithProperties, NavigationController } from \"@simonbackx/vue-app-navigation\";\nimport { CenteredMessage, STNavigationBar } from \"@stamhoofd/components\"\nimport { Component, Prop,Ref, VueComponent } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport StepsHeader from \"./StepsHeader.vue\";\n\n@Component({\n    components: {\n        StepsHeader,\n        NavigationController,\n        STNavigationBar\n    },\n})\nexport default class Steps extends VueComponent {\n    step = 0;\n\n    canPop = false\n\n    @Prop({ default: null })\n    totalSteps!: number | null\n\n    @Prop({ required: true })\n    root!: ComponentWithProperties\n\n    @Ref(\"navigationController\") readonly navigationController!: NavigationController;\n\n    get progress() {\n        return this.totalSteps && this.step ? ((this.step - 1) / this.totalSteps) : 0\n    }\n\n    updateProgress() {\n        if (this.navigationController.components.length <= 1) {\n            this.canPop = false\n        }\n        this.$nextTick(() => {\n            this.canPop = (this.navigationController.mainComponent?.componentInstance() as any)?.isStepsPoppable ?? (this.navigationController.components.length > 1);\n            this.step = (this.navigationController.mainComponent?.componentInstance() as any)?.step ?? -1;\n            if (this.step === -1) {\n                this.step = this.navigationController.components.length \n            }\n        })\n        \n    }\n\n    get canDismiss() {\n        return (this.navigationController?.mainComponent?.componentInstance() as any)?.canDismiss ?? false\n    }\n}\n</script>\n\n<style lang=\"scss\">\n@use '@stamhoofd/scss/base/variables' as *;\n@use '@stamhoofd/scss/base/text-styles' as *;\n\n.steps-layout {\n    min-height: 100vh;\n    min-height: calc(var(--vh, 1vh) * 100);\n    position: relative;\n\n    > main {\n        min-height: 100vh;\n        min-height: calc(var(--vh, 1vh) * 100);\n        box-sizing: border-box;\n    }\n\n    > .progress {\n        position: fixed;\n        left: 0;\n        top: 0;\n        height: 2px;\n        pointer-events: none;\n        background: $color-primary;\n        border-top-right-radius: 1px;\n        border-bottom-right-radius: 1px;\n        width: 0;\n        opacity: 1;\n        transition: width 0.3s, opacity 0.3s;\n        z-index: 300;\n\n        &.hide {\n            transition: width 0.3s, opacity 0.2s 0.3s;\n            opacity: 0;\n        }\n    }\n}\n\n</style>\n","import { Decoder } from \"@simonbackx/simple-encoding\";\nimport { CenteredMessage, Toast, useContext, useOrganization } from \"@stamhoofd/components\";\nimport { useOrganizationManager, useRequestOwner } from \"@stamhoofd/networking\";\nimport {\n    OrganizationRegistrationPeriod,\n    SetupStep,\n    SetupStepType,\n} from \"@stamhoofd/structures\";\nimport { computed, ComputedRef, readonly, Ref, ref } from \"vue\";\n\nexport type ReviewCheckboxData = {\n    step: SetupStep | undefined;\n    checkboxValue: boolean;\n    setValue: (value: boolean) => void;\n    type: SetupStepType;\n    isDone: boolean;\n}\n\nexport type UseReview = {\n    readonly step: ComputedRef<SetupStep | undefined>;\n    readonly save: () => Promise<boolean>;\n    readonly forceUpdate: () => Promise<void>;\n    readonly $isSaving: Ref<boolean>,\n    readonly $hasChanges: ComputedRef<boolean>;\n    readonly $overrideIsDone: Ref<boolean | null>;\n    readonly $reviewCheckboxData: ComputedRef<ReviewCheckboxData>\n}\n\nexport function useReview(type: SetupStepType): UseReview {\n    const organizationManager = useOrganizationManager();\n    const owner = useRequestOwner();\n    \n    const $organization = useOrganization();\n    const $context = useContext();\n    const $step = computed(() => $organization.value?.period.setupSteps.get(type));\n    let originalCheckboxValue = !!$step.value?.isReviewed;\n\n    const $checkboxValue = ref(originalCheckboxValue);\n    const isSaving = ref(false);\n    const $hasChanges = computed(() => originalCheckboxValue !== $checkboxValue.value);\n    const $overrideIsDone = ref<boolean | null>(null);\n    const $isDone = computed(() => $overrideIsDone.value !== null ? $overrideIsDone.value : !!$step.value?.isDone);\n\n    const updateReviewedAt = async (isReviewed: boolean): Promise<boolean> => {\n        if(!$hasChanges.value) return true;\n\n        const periodId = $organization.value?.period.id;\n        if (!periodId) {\n            return false;\n        }\n\n        try {\n            isSaving.value = true;\n            const updatedPeriod =\n                await $context.value.authenticatedServer.request({\n                    method: \"POST\",\n                    path: `/organization/registration-period/${periodId}/setup-steps/review`,\n                    body: {type, isReviewed},\n                    shouldRetry: false,\n                    owner,\n                    decoder:\n                        OrganizationRegistrationPeriod as Decoder<OrganizationRegistrationPeriod>,\n                });\n\n            organizationManager.value.updatePeriods([updatedPeriod.data]);\n        } catch (error) {\n            Toast.fromError(error).show()\n            isSaving.value = false;\n            return false;\n        }\n\n        isSaving.value = false;\n        return true;\n    };\n\n    const save = async () => {\n        if(!$hasChanges.value) return true;\n\n        const isConfirm = $checkboxValue.value ? await CenteredMessage.confirm(\"Ben je zeker dat je alles goed hebt nagekeken?\", \"Markeer als nagekeken\") : \n            await CenteredMessage.confirm(\"Ben je zeker dat je deze stap wil markeren als niet nagekeken?\", \"Ja\");\n\n        if(!isConfirm) return false;\n\n        const isReviewed = $checkboxValue.value;\n        const isSuccess = await updateReviewedAt(isReviewed);\n        if(isSuccess) {\n            originalCheckboxValue = isReviewed;\n        }\n        return isSuccess;\n    }\n\n    const setValue = (value: boolean) => {\n        $checkboxValue.value = value\n    }\n\n    const forceUpdate = () => organizationManager.value.forceUpdate().catch(console.error);\n\n    const $reviewCheckboxData = computed<ReviewCheckboxData>(() => {\n        return {\n            step: $step.value,\n            checkboxValue: $checkboxValue.value,\n            setValue,\n            type,\n            isDone: $isDone.value\n        }\n    })\n\n    return {\n        step: $step,\n        save,\n        forceUpdate,\n        $isSaving: readonly(isSaving),\n        $hasChanges: $hasChanges,\n        $overrideIsDone: $overrideIsDone,\n        $reviewCheckboxData\n    }\n}\n","<template>\n    <div class=\"st-gradient-background\">\n        <div class=\"pattern\">\n            <svg width=\"1512\" height=\"779\" viewBox=\"0 0 1512 779\" fill=\"none\" preserveAspectRatio=\"xMidYMid meet\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M448.918 114.43L435.971 131.754C370.52 219.333 248.695 241.796 156.313 183.319C106.23 151.617 50.6545 144.236 0 155.443V779H1512V0H1126.02L1125.43 0.669208C1038.73 97.8919 897.599 124.884 781.144 66.5148L739.604 45.6948C638.848 -4.80535 516.386 24.1519 448.918 114.43Z\" fill=\"url(#paint0_linear_43_2205)\" />\n                <defs>\n                    <linearGradient id=\"paint0_linear_43_2205\" x1=\"756\" y1=\"0\" x2=\"756\" y2=\"779\" gradientUnits=\"userSpaceOnUse\">\n                        <stop stop-color=\"#0053FF\" />\n                        <stop offset=\"1\" stop-color=\"#0053FF\" stop-opacity=\"0\" />\n                    </linearGradient>\n                </defs>\n            </svg>\n            <div class=\"fill-remaining\" />\n        </div>\n    </div>\n</template>\n\n<style lang=\"scss\">\n@use '@stamhoofd/scss/base/variables' as *;\n\n.st-gradient-background {\n    pointer-events: none;\n    position: absolute;\n    height: 1000px;\n    width: 100%;\n    z-index: 0;\n\n    background: linear-gradient(180deg, rgba($color-primary-original, 0.1), rgba($color-primary-original, 0) 100%);\n\n    .pattern {\n        display: grid;\n        grid-template-columns: auto 1fr;\n        opacity: 0.03;\n\n        svg {\n            max-width: 100%;\n            height: auto;\n        }\n\n        > .fill-remaining {\n            background: linear-gradient(180deg, $color-primary-original 0%, rgba($color-primary-original, 0) 100%);\n        }\n    }\n}\n\n</style>","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M20.8%2012.2084C20.8%2011.5584%2020.7417%2010.9334%2020.6333%2010.3334H12V13.8834H16.9333C16.7167%2015.025%2016.0667%2015.9917%2015.0917%2016.6417V18.95H18.0667C19.8%2017.35%2020.8%2015%2020.8%2012.2084Z'%20fill='%234285F4'/%3e%3cpath%20d='M12%2021.1667C14.475%2021.1667%2016.55%2020.35%2018.0667%2018.95L15.0916%2016.6417C14.275%2017.1917%2013.2333%2017.525%2012%2017.525C9.61665%2017.525%207.59165%2015.9167%206.86665%2013.75H3.81665V16.1167C5.32498%2019.1083%208.41665%2021.1667%2012%2021.1667Z'%20fill='%2334A853'/%3e%3cpath%20d='M6.86671%2013.7416C6.68337%2013.1916%206.57504%2012.6083%206.57504%2011.9999C6.57504%2011.3916%206.68337%2010.8083%206.86671%2010.2583V7.8916H3.81671C3.19171%209.12493%202.83337%2010.5166%202.83337%2011.9999C2.83337%2013.4833%203.19171%2014.8749%203.81671%2016.1083L6.19171%2014.2583L6.86671%2013.7416Z'%20fill='%23FBBC05'/%3e%3cpath%20d='M12%206.48337C13.35%206.48337%2014.55%206.95004%2015.5083%207.85004L18.1333%205.22504C16.5417%203.74171%2014.475%202.83337%2012%202.83337C8.41665%202.83337%205.32498%204.89171%203.81665%207.89171L6.86665%2010.2584C7.59165%208.09171%209.61665%206.48337%2012%206.48337Z'%20fill='%23EA4335'/%3e%3c/svg%3e\"","<template>\n    <div class=\"container\">\n        <p v-if=\"!isEnteringDiscountCode\">\n            <button type=\"button\" class=\"button text\" @click=\"addDiscountCode\">\n                <span class=\"icon label\" />\n                <span>Kortingscode inwisselen</span>\n            </button>\n        </p>\n        <hr v-if=\"isEnteringDiscountCode\">\n        <form v-if=\"isEnteringDiscountCode\" @submit.prevent=\"addEnteredCode\" data-submit-last-field>\n            <STInputBox title=\"Kortingscode\" error-fields=\"code\" :error-box=\"errorBox\" class=\"max\">\n                <div class=\"split-inputs\">\n                    <input\n                        v-model=\"code\"\n                        autofocus\n                        enterkeyhint=\"go\"\n                        class=\"input\"\n                        type=\"text\"\n                        placeholder=\"Vul hier je kortingscode in\"\n                        autocomplete=\"off\"\n                        @blur=\"cleanCode\"\n                    >\n                    <LoadingButton :loading=\"loading\">\n                        <button class=\"button primary\" type=\"submit\">\n                            Inwisselen\n                        </button>\n                    </LoadingButton>\n                </div>\n            </STInputBox>\n        </form>\n    </div>\n</template>\n\n\n<script lang=\"ts\">\nimport { isSimpleError, isSimpleErrors, SimpleError } from '@simonbackx/simple-errors';\nimport { ErrorBox, LoadingButton, STInputBox, STList, STListItem } from '@stamhoofd/components';\nimport { Formatter } from '@stamhoofd/utility';\nimport { Component, Prop, VueComponent } from '@simonbackx/vue-app-navigation/classes';\n\n@Component({\n    components: {\n        STList,\n        STListItem,\n        LoadingButton,\n        STInputBox\n    }\n})\nexport default class AddDiscountCodeBox extends VueComponent {\n    @Prop({required: true })\n    applyCode: (code: string) => Promise<boolean>\n\n    isEnteringDiscountCode = false;\n    code = ''\n    errorBox: ErrorBox | null = null\n    loading = false\n\n    addDiscountCode() {\n        this.isEnteringDiscountCode = true\n    }\n\n    cleanCode() {\n        this.code = Formatter.slug(this.code.trim()).toUpperCase()\n    }\n\n\n    async addEnteredCode() {\n        if (this.loading) {\n            return;\n        }\n        this.loading = true;\n        try {\n            this.cleanCode()\n            if (await this.applyCode(this.code)) {\n                this.isEnteringDiscountCode = false\n                this.code = \"\"\n            } else {\n                this.errorBox = new ErrorBox(new SimpleError({\n                    code: 'invalid_code',\n                    field: 'code',\n                    message: 'Deze kortingscode is ongeldig'\n                }))\n            }\n        } catch (e) {\n            console.error(e)\n            if (isSimpleError(e) || isSimpleErrors(e)) {\n                e.addNamespace('code')\n            }\n            this.errorBox = new ErrorBox(e)\n        }\n        this.loading = false\n    }\n\n}\n</script>\n","<template>\n    <STListItem class=\"cart-item-row\" :selectable=\"editable\" @click=\"editItem()\">\n        <h3>\n            <span>{{ cartItem.product.name }}</span>\n            <span v-if=\"editable\" class=\"icon arrow-right-small gray\" />\n        </h3>\n        <p v-if=\"cartItem.description\" class=\"description\" v-text=\"cartItem.description\" />\n\n        <p v-if=\"labels.length > 0\" class=\"discount-tags\">\n            <span v-for=\"discount of labels\" :key=\"discount.id\" class=\"style-tag discount\">\n                {{ discount.cartLabel }}\n            </span>\n        </p>\n\n        <footer>\n            <p v-if=\"!cartItem.getFormattedPriceWithDiscount()\" class=\"price\">\n                {{ cartItem.getFormattedPriceWithoutDiscount() }}\n            </p>\n            <p v-else class=\"price\">\n                <span class=\"style-discount-old-price\">{{ cartItem.getFormattedPriceWithoutDiscount() }}</span>\n                <span class=\"style-discount-price\">{{ cartItem.getFormattedPriceWithDiscount() }}</span>\n            </p>\n            <div @click.stop>\n                <span v-if=\"cartItem.formattedAmount\" class=\"amount\">{{ cartItem.formattedAmount }}</span>\n                <StepperInput v-if=\"editable && !cartItem.cartError && cartItem.seats.length === 0 && (maximumRemaining === null || maximumRemaining > 1)\" v-model=\"amount\" :min=\"1\" :max=\"maximumRemaining\" @click.native.stop />\n                <button v-if=\"editable\" class=\"button icon trash\" type=\"button\" @click=\"deleteItem()\" />\n            </div>\n        </footer>\n\n        <p v-if=\"cartItem.cartError\" class=\"error-box small\">\n            {{ cartItem.cartError.getHuman() }}\n\n            <span v-if=\"editable\" class=\"button text\">\n                <span>Corrigeren</span>\n                <span class=\"icon arrow-right-small\" />\n            </span>\n        </p>\n\n        <figure v-if=\"cartItem.product.images[0]\" slot=\"right\">\n            <ImageComponent :image=\"cartItem.product.images[0]\" :auto-height=\"true\" />\n        </figure>\n    </STListItem>\n</template>\n\n\n<script lang=\"ts\">\nimport { Cart, CartItem, Webshop } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { Component, Prop, VueComponent } from '@simonbackx/vue-app-navigation/classes';\n\nimport StepperInput from '../inputs/StepperInput.vue';\nimport STList from '../layout/STList.vue';\nimport STListItem from '../layout/STListItem.vue';\nimport ImageComponent from './ImageComponent.vue';\n\n@Component({\n    components: {\n        STList,\n        STListItem,\n        StepperInput,\n        ImageComponent\n    },\n    filters: {\n        price: Formatter.price.bind(Formatter),\n    },\n    emits: ['edit', 'amount', 'delete']\n})\nexport default class CartItemRow extends VueComponent {\n    @Prop({required: true })\n        cart!: Cart\n\n    @Prop({required: true })\n        webshop!: Webshop\n\n    @Prop({default: false })\n        admin!: boolean\n\n    @Prop({required: true })\n        cartItem!: CartItem\n\n    @Prop({required: false, default: false })\n        editable!: boolean\n\n    editItem() {\n        if (!this.editable) {\n            return;\n        }\n        this.$emit('edit')\n    }\n\n    get amount() {\n        return this.cartItem.amount\n    }\n\n    set amount(amount: number) {\n        if (!this.editable) {\n            return;\n        }\n        this.$emit('amount', amount)\n    }\n\n    deleteItem() {\n        if (!this.editable) {\n            return;\n        }\n        this.$emit('delete');\n    }\n\n    get labels() {\n        return this.cartItem.discounts.filter(d => !!d.cartLabel)\n    }\n\n    get maximumRemaining() {\n        const remaining = this.cartItem.getMaximumRemaining(this.cartItem, this.cart, this.webshop, this.admin);\n        return remaining\n    }\n}\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use \"@stamhoofd/scss/base/text-styles.scss\" as *;\n\n.cart-item-row {\n    h3 {\n        padding-top: 5px;\n        @extend .style-title-3;\n        display: flex;\n        justify-content: space-between;\n        align-items: flex-end;\n    }\n\n    .description {\n        @extend .style-description-small;\n        padding-top: 5px;\n        white-space: pre-wrap;\n    }\n\n    .price {\n        font-size: 14px;\n        line-height: 1.4;\n        font-weight: 600;\n        color: $color-primary;\n    }\n\n    .amount {\n        font-size: 14px;\n        line-height: 1.4;\n        font-weight: 600;\n        margin-right: 15px;\n    }\n\n    .discount-tags {\n        padding-top: 5px;\n\n        > .style-tag {\n            margin-left: 5px;\n\n            &:first-child {\n                margin-left: 0;\n            }\n        }\n    }\n\n    footer {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n    }\n\n    figure {\n        width: 70px;\n\n        @media (min-width: 340px) {\n            width: 80px;\n        }\n\n        @media (min-width: 801px) {\n            width: 100px;\n        }\n\n        img {\n            border-radius: $border-radius;\n        }\n    }\n}\n\n</style>\n","<template>\n    <div class=\"container field-box\">\n        <hr v-if=\"withTitle\">\n        <h2 v-if=\"withTitle\">\n            {{ field.name || 'Maak een keuze' }}\n        </h2>\n        <STInputBox :title=\"withTitle ? undefined : (field.name || 'Maak een keuze')\" :error-box=\"errorBox\" :error-fields=\"'fieldAnswers.'+field.id\" :class=\"{'no-padding': withTitle}\">\n            <input v-model=\"value\" :placeholder=\"field.required ? (field.placeholder || field.name) : 'Optioneel' \" class=\"input\">\n            <p v-if=\"field.description\" class=\"style-description-small\" v-text=\"field.description\" />\n        </STInputBox>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { NavigationMixin } from \"@simonbackx/vue-app-navigation\";\nimport { ErrorBox, STInputBox } from \"@stamhoofd/components\"\nimport { WebshopField, WebshopFieldAnswer } from '@stamhoofd/structures';\nimport { Component, Mixins, Prop } from \"@simonbackx/vue-app-navigation/classes\";\n\n@Component({\n    components: {\n        STInputBox\n    }\n})\nexport default class FieldBox extends Mixins(NavigationMixin){\n    @Prop({ default: true })\n        withTitle: boolean\n\n    @Prop({ required: true })\n        field: WebshopField\n\n    @Prop({ required: true })\n        errorBox: ErrorBox\n\n    @Prop({ required: true })\n        answers: WebshopFieldAnswer[]\n\n    get value() {\n        return this.answers.find(a => a.field.id === this.field.id)?.answer ?? \"\"\n    }\n\n    set value(value: string) {\n        const answer = this.answers.find(a => a.field.id === this.field.id)\n\n        if (answer) {\n            answer.answer = value\n        } else {\n            this.answers.push(WebshopFieldAnswer.create({\n                field: this.field,\n                answer: value\n            }))\n        }\n    }\n}\n</script>\n\n<style lang=\"scss\">\n.field-box {\n    .style-description-small {\n        padding-top: 5px;\n        white-space: pre-wrap;\n    }\n}\n\n</style>","<template>\n    <div class=\"container\">\n        <hr>\n        <h2>\n            {{ optionMenu.name || 'Maak een keuze' }}\n        </h2>\n        <STList>\n            <STListItem v-for=\"option in optionMenu.options\" :key=\"option.id\" class=\"no-border right-price\" :selectable=\"canSelectOption(option)\" :disabled=\"!canSelectOption(option)\" element-name=\"label\">\n                <template #left>\n                    <Radio v-if=\"!optionMenu.multipleChoice\" v-model=\"selectedOption\" :value=\"option.id\" :name=\"optionMenu.id+'-optionmenu'\" :disabled=\"!canSelectOption(option)\" />\n                    <Checkbox v-else :model-value=\"isOptionSelected(option)\" :disabled=\"!canSelectOption(option)\" @update:model-value=\"selectOption(option, $event)\" />\n                </template>\n\n                <h4 class=\"style-title-list\">\n                    {{ option.name || 'Naamloos' }}\n                </h4>\n\n                <p v-if=\"getOptionStockText(option)\" class=\"style-description-small\">\n                    {{ getOptionStockText(option) }}\n                </p>\n\n                <template v-if=\"option.price !== 0\" slot=\"right\">\n                    {{ formatPriceChange(option.price) }}\n                </template>\n            </STListItem>\n        </STList>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { NavigationMixin } from \"@simonbackx/vue-app-navigation\";\nimport { Checkbox, Radio, STList, STListItem, STNavigationBar, STToolbar } from \"@stamhoofd/components\"\nimport { Cart, CartItem, CartItemOption, CartStockHelper,Option, OptionMenu, Webshop } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { Component, Mixins, Prop } from \"@simonbackx/vue-app-navigation/classes\";\n\n@Component({\n    components: {\n        STNavigationBar,\n        STToolbar,\n        STList,\n        STListItem,\n        Radio,\n        Checkbox\n    },\n    filters: {\n        price: Formatter.price.bind(Formatter),\n        priceChange: Formatter.priceChange.bind(Formatter)\n    }\n})\nexport default class OptionMenuBox extends Mixins(NavigationMixin){\n    @Prop({ required: true })\n        webshop: Webshop\n\n    @Prop({ required: true })\n        cart: Cart\n\n    @Prop({ required: true })\n        cartItem: CartItem\n\n    @Prop({ required: true })\n        optionMenu: OptionMenu\n\n    @Prop({ default: null })\n        oldItem: CartItem | null\n    \n    @Prop({ default: false })\n        admin: boolean\n        \n    isOptionSelected(option: Option) {\n        return !!this.cartItem.options.find(o => o.optionMenu.id === this.optionMenu.id && o.option.id === option.id)\n    }\n\n    selectOption(option: Option, selected: boolean) {\n        const filtered = this.cartItem.options.filter(o => o.optionMenu.id !== this.optionMenu.id || o.option.id !== option.id)\n        if (selected) {\n            filtered.push(CartItemOption.create({ optionMenu: this.optionMenu, option }))\n        }\n        this.cartItem.options = filtered\n    }\n\n    get selectedOption() {\n        return this.cartItem.options.find(o => o.optionMenu.id === this.optionMenu.id)?.option?.id ?? \"\"\n    }\n\n    set selectedOption(id: string) {\n        const option = this.optionMenu.options.find(o => o.id === id)\n        if (!option) {\n            return\n        }\n        const filtered = this.cartItem.options.filter(o => o.optionMenu.id !== this.optionMenu.id)\n        filtered.push(CartItemOption.create({ optionMenu: this.optionMenu, option }))\n        this.cartItem.options = filtered\n    }\n\n    get product() {\n        return this.cartItem.product\n    }\n\n    get maximumRemainingAcrossOptions() {\n        return CartStockHelper.getRemainingAcrossOptions({\n            product: this.product,\n            oldItem: this.oldItem,\n            cart: this.cart,\n            webshop: this.webshop,\n            admin: this.admin,\n            amount: this.cartItem.amount\n        }, {inMultipleCartItems: false})\n    }\n\n    getOptionStock(option: Option) {\n        const optionStock = CartStockHelper.getOptionStock({product: this.product, oldItem: this.oldItem, cart: this.cart, option, webshop: this.webshop, admin: this.admin, amount: this.cartItem.amount})\n        if (!optionStock) {\n            return null\n        }\n\n        if (optionStock.remaining !== null && this.maximumRemainingAcrossOptions !== null && optionStock.remaining > this.maximumRemainingAcrossOptions) {\n            // Doesn't matter to show this\n            return null;\n        }\n        return optionStock\n    }\n\n    getOptionStockText(option: Option) {\n        // Don't show text if all options are sold out\n        if (this.maximumRemainingAcrossOptions === 0) {\n            return null\n        }\n\n        return this.getOptionStock(option)?.shortText\n    }\n\n    canSelectOption(option: Option) {\n        if (this.maximumRemainingAcrossOptions === 0) {\n            return false\n        }\n\n        return this.getOptionStock(option)?.remaining !== 0\n    }\n}\n</script>\n","<template>\n    <div>\n        <div\n            class=\"seat-selection-box\"\n            :class=\"{'can-select': !!setSeats || !!onClickSeat}\"\n            :style=\"{\n                '--sw': size.width + 'px',\n                '--sh': size.height + 'px',\n            }\"\n        >\n            <div class=\"padding-container\">\n                <div\n                    class=\"seating-plan-seats\"\n                >\n                    <div\n                        v-for=\"row of rows\"\n                        :key=\"row.uuid\"\n                        class=\"seating-plan-row\"\n                        :style=\"{\n                            '--rw': row.width + 'px',\n                            '--rh': row.height + 'px',\n                            '--rx': row.x + 'px',\n                            '--ry': row.y + 'px',\n                        }\"\n                    >\n                        <span class=\"row-label left\">{{ row.label }}</span>\n                        <span class=\"row-label right\">{{ row.label }}</span>\n\n                        <div>\n                            <button\n                                v-for=\"seat of row.seats\"\n                                :key=\"seat.uuid\"\n                                :ref=\"isSelected(row, seat) ? 'selectedSeats' : undefined\"\n                                type=\"button\"\n                                class=\"seat\"\n                                :class=\"{\n                                    space: seat.isSpace,\n                                    disabledPerson: isDisabledPersonSeat(seat),\n                                    selected: isSelected(row, seat),\n                                    highlighted: isHighlighted(row, seat) && !isSelected(row, seat),\n                                    hasHighlights: highlightSeats.length > 0 && !setSeats,\n                                    occupied: isOccupied(row, seat) && !isSelected(row, seat) && !isHighlighted(row, seat),\n                                }\"\n                                :style=\"{\n                                    '--w': seat.width + 'px',\n                                    '--h': seat.height + 'px',\n                                    '--x': seat.x + 'px',\n                                    '--y': seat.y + 'px',\n                                    '--color': getSeatColor(seat),\n                                }\"\n                                @click=\"onClick(row, seat)\"\n                                @mouseover=\"onHover(row, seat)\"\n                            >\n                                <span class=\"nr\">{{ seat.label }}</span>\n                                <span v-if=\"isDisabledPersonSeat(seat)\" class=\"icon disabled-person\" />\n                            </button>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { NavigationMixin } from '@simonbackx/vue-app-navigation';\nimport { Component, Mixins, Prop, Watch } from '@simonbackx/vue-app-navigation/classes';\nimport { CartReservedSeat, ReservedSeat, SeatingPlan, SeatingPlanRow, SeatingPlanSeat, SeatingPlanSection, SeatingSizeConfiguration, SeatMarkings } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\n\nimport { Toast } from '../overlays/Toast';\n\n@Component({\n    components: {\n\n    },\n})\nexport default class SeatSelectionBox extends Mixins(NavigationMixin) {\n    @Prop({ default: false })\n    admin: boolean;\n\n    @Prop({ required: false, default: null })\n    sizeConfig: SeatingSizeConfiguration | null;\n\n    @Prop({ required: true })\n    seatingPlan!: SeatingPlan;\n\n    @Prop({ required: true })\n    seatingPlanSection!: SeatingPlanSection;\n\n    @Prop({ required: false, default: null })\n    amount: number | null;\n\n    @Prop({ required: false, default: () => [] })\n    seats!: ReservedSeat[];\n\n    /**\n     * Seats that are not available for selection anymore\n     */\n    @Prop({ required: false, default: () => [] })\n    reservedSeats!: ReservedSeat[];\n\n    @Prop({ required: false, default: () => [] })\n    highlightSeats!: ReservedSeat[];\n\n    @Prop({ required: false })\n    setSeats?: (seats: ReservedSeat[]) => void;\n\n    @Prop({ required: false })\n    onClickSeat?: (seat: ReservedSeat) => void;\n\n    @Prop({ required: false })\n    onHoverSeat?: (seat: ReservedSeat) => void;\n\n    lastPriceToast: Toast | null = null;\n\n    created() {\n        this.seatingPlanSection.updatePositions(this.sizeConfig ?? this.defaultSizeConfig);\n\n        // Default selection\n        if (this.amount && this.setSeats) {\n            // if (this.seats.length < this.amount) {\n            //     let seats: ReservedSeat[] = []\n            //     const plan = this.seatingPlan\n            //     for (const section of plan.sections) {\n            //         for (const row of section.rows) {\n            //             for (const seat of row.seats) {\n            //                 if (seats.length >= this.amount) {\n            //                     break\n            //                 }\n            //\n            //                 if (seat.isSpace) {\n            //                     continue\n            //                 }\n            //\n            //                 const s = ReservedSeat.create({\n            //                     section: section.id,\n            //                     row: row.label,\n            //                     seat: seat.label\n            //                 })\n            //\n            //                 if (this.reservedSeats.find(r => r.equals(s))) {\n            //                     continue\n            //                 }\n            //\n            //                 seats.push(\n            //                     s\n            //                 )\n            //             }\n            //         }\n            //     }\n            //     this.setSeats?.(seats)\n            // }\n            let updatedSeats = this.seats.slice();\n\n            // Remove invalid seats\n            updatedSeats = updatedSeats.filter((seat) => {\n                return this.seatingPlan.isValidSeat(seat, this.reservedSeats);\n            });\n\n            if (updatedSeats.length > this.amount) {\n                this.setSeats(updatedSeats.slice(0, this.amount));\n            }\n            else {\n                this.setSeats(updatedSeats);\n            }\n        }\n    }\n\n    mounted() {\n        setTimeout(() => {\n            if (this.$refs.selectedSeats) {\n                const selectedSeats = this.$refs.selectedSeats as HTMLElement[];\n                if (selectedSeats.length > 0) {\n                    const bounds = selectedSeats[0].getBoundingClientRect();\n                    const scrollHeight = selectedSeats[0].closest('main')?.clientHeight;\n\n                    if (!scrollHeight) {\n                        return;\n                    }\n\n                    if (bounds.top + bounds.height > scrollHeight - 30) {\n                        selectedSeats[0].scrollIntoView({\n                            behavior: 'smooth',\n                            block: 'center',\n                            inline: 'center',\n                        });\n\n                        // iOS fix:\n                        document.documentElement.scrollTop = 0;\n                    }\n                }\n            }\n        }, 400);\n    }\n\n    @Watch('seatingPlanSection')\n    onPlanChange() {\n        this.seatingPlanSection.updatePositions(this.sizeConfig ?? this.defaultSizeConfig);\n    }\n\n    get rows() {\n        return this.seatingPlanSection.rows;\n    }\n\n    get defaultSizeConfig() {\n        let config = new SeatingSizeConfiguration({\n            seatWidth: 28,\n            seatHeight: 28,\n            seatXSpacing: 3,\n            seatYSpacing: 8\n        })\n\n        if (!this.setSeats && (this as any).$isMobile) {\n            config = new SeatingSizeConfiguration({\n                seatWidth: 20,\n                seatHeight: 20,\n                seatXSpacing: 2,\n                seatYSpacing: 8\n            })\n        } else if ((this as any).$isMobile) {\n            config = new SeatingSizeConfiguration({\n                seatWidth: 30,\n                seatHeight: 30,\n                seatXSpacing: 3,\n                seatYSpacing: 8\n            })\n        }\n\n        this.seatingPlanSection.correctSizeConfig(config)\n        return config\n    }\n\n    get size() {\n        return this.seatingPlanSection.calculateSize(this.sizeConfig ?? this.defaultSizeConfig);\n    }\n\n    isDisabledPersonSeat(seat: SeatingPlanSeat) {\n        return seat.markings.includes(SeatMarkings.DisabledPerson);\n    }\n\n    isSelected(row: SeatingPlanRow, seat: SeatingPlanSeat) {\n        const s = ReservedSeat.create({\n            section: this.seatingPlanSection.id,\n            row: row.label,\n            seat: seat.label,\n        });\n\n        for (const reservedSeat of this.seats) {\n            if (reservedSeat.equals(s)) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    isHighlighted(row: SeatingPlanRow, seat: SeatingPlanSeat) {\n        const s = ReservedSeat.create({\n            section: this.seatingPlanSection.id,\n            row: row.label,\n            seat: seat.label,\n        });\n        return !!this.highlightSeats.find(r => r.equals(s));\n    }\n\n    isOccupied(row: SeatingPlanRow, seat: SeatingPlanSeat) {\n        const category = this.seatingPlan.categories.find(c => c.id === seat.category);\n        if (!this.admin && category && category.adminOnly) {\n            return true;\n        }\n\n        const s = ReservedSeat.create({\n            section: this.seatingPlanSection.id,\n            row: row.label,\n            seat: seat.label,\n        });\n        return !!this.reservedSeats.find(r => r.equals(s));\n    }\n\n    getSeatColor(seat: SeatingPlanSeat) {\n        return this.seatingPlan.getSeatColor(seat);\n    }\n\n    onHover(row: SeatingPlanRow, seat: SeatingPlanSeat) {\n        if (this.onHoverSeat) {\n            this.onHoverSeat(ReservedSeat.create({\n                section: this.seatingPlanSection.id,\n                row: row.label,\n                seat: seat.label,\n            }));\n            return;\n        }\n    }\n\n    onClick(row: SeatingPlanRow, seat: SeatingPlanSeat) {\n        if (this.onClickSeat) {\n            this.onClickSeat(ReservedSeat.create({\n                section: this.seatingPlanSection.id,\n                row: row.label,\n                seat: seat.label,\n            }));\n            return;\n        }\n        if (!this.setSeats) {\n            return;\n        }\n\n        if (seat.isSpace) {\n            return;\n        }\n\n        if (this.lastPriceToast) {\n            this.lastPriceToast.hide();\n            this.lastPriceToast = null;\n        }\n\n        // select/deselect this seat\n        const selected = this.isSelected(row, seat);\n        if (selected) {\n            // deselect\n            this.setSeats(\n                this.seats.filter(s => s.section !== this.seatingPlanSection.id || s.row !== row.label || s.seat !== seat.label),\n            );\n        }\n        else {\n            if (this.isOccupied(row, seat)) {\n                new Toast('Deze plaats is al bezet', 'error red').show();\n                return;\n            }\n\n            // select\n            const addedSeat = ReservedSeat.create({\n                section: this.seatingPlanSection.id,\n                row: row.label,\n                seat: seat.label,\n            });\n\n            let seats = [...this.seats, addedSeat];\n\n            if (this.amount && seats.length > this.amount) {\n                // Remove seat that is the furthest away\n                let currentPosition = { x: seat.x, y: seat.y };\n\n                let furthestSeat: { seat: ReservedSeat; distance: number } | null = null;\n\n                for (const s of seats) {\n                    if (s.equals(addedSeat)) {\n                        continue;\n                    }\n                    if (s.section !== this.seatingPlanSection.id) {\n                        continue;\n                    }\n\n                    const row = this.seatingPlanSection.rows.find(r => r.label === s.row);\n                    if (!row) {\n                        continue;\n                    }\n\n                    const seat = row.seats.find(ss => ss.label === s.seat);\n                    if (!seat) {\n                        continue;\n                    }\n\n                    const distance = Math.sqrt(Math.pow(currentPosition.x - seat.x, 2) + Math.pow(currentPosition.y - seat.y, 2));\n                    if (!furthestSeat || distance > furthestSeat.distance) {\n                        furthestSeat = { seat: s, distance };\n                    }\n                }\n\n                if (furthestSeat) {\n                    seats = seats.filter(s => !s.equals(furthestSeat!.seat));\n                }\n                else {\n                    // Remove first\n                    seats = seats.slice(1);\n                }\n            }\n\n            this.setSeats(seats);\n\n            // Show a toast if price is higher\n            const cartReservedSeat = CartReservedSeat.create(addedSeat);\n            cartReservedSeat.calculatePrice(this.seatingPlan);\n\n            if (cartReservedSeat.price > 0) {\n                this.lastPriceToast = new Toast('Deze plaats heeft een meerprijs van ' + Formatter.price(cartReservedSeat.price), 'info');\n                this.lastPriceToast.show();\n            }\n        }\n    }\n}\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use \"@stamhoofd/scss/base/text-styles.scss\" as *;\n\n.seat-selection-box {\n    margin: 0 calc(-1 * var(--st-horizontal-padding, 40px));\n    position: relative;\n    overflow-x: auto;\n\n    // Fixes drawing issues\n    transform: translate3d(0, 0, 0);\n\n    .padding-container {\n        // Padding should be here (otherwise won't be included in scollable area)\n        padding: 15px calc(45px + var(--st-horizontal-padding));\n        padding-bottom: 30px;\n        width: var(--sw);\n        margin: 0 auto;\n        box-sizing: content-box;\n\n        @media (max-width: 800px) {\n            padding: 15px calc(25px + var(--st-horizontal-padding));\n        }\n    }\n\n    .row-label {\n        position: absolute;\n        top: calc(var(--ry));\n        height: var(--rh);\n        line-height: var(--rh);\n        font-size: 12px;\n        @extend .style-description;\n\n        &.left {\n            left: -45px;\n\n            @media (max-width: 800px) {\n                left: -30px;\n            }\n        }\n\n        &.right {\n            right: -45px;\n            text-align: right;\n\n            @media (max-width: 800px) {\n                right: -30px;\n            }\n        }\n    }\n\n    .seating-plan-seats {\n        position: relative;\n        width: var(--sw);\n        height: var(--sh);\n    }\n\n    .seat {\n        position: absolute;\n        display: block;\n        left: var(--x);\n        top: var(--y);\n        width: var(--w);\n        height: var(--h);\n        box-sizing: border-box;\n        border-radius: 5px;\n        @extend .style-interactive-small;\n        line-height: var(--h);\n        color: $color-dark;\n        color: var(--color, $color-dark);\n\n        &.disabledPerson > .nr {\n            position: absolute;\n            display: block;\n            left: 0;\n            top: 0;\n            font-size: 10px;\n            text-align: left;\n            line-height: 15px;\n            height: 15px;\n            padding: 2px;\n        }\n\n        &::after {\n            position: absolute;\n            content: '';\n            left: 0;\n            top: 0;\n            right: 0;\n            bottom: 0;\n            z-index: -1;\n            border-radius: 5px;\n\n            border: $border-width solid $color-border;\n            background: $color-background;\n            box-shadow: 0px 1px 1px 0px rgba(0, 0, 0, 0.1);\n\n            transition: background-color 0.2s, transform 0.2s;\n            transform: scale(1, 1);\n            animation-fill-mode: forwards;\n        }\n\n        .nr {\n            opacity: 0.5;\n        }\n        &.space {\n            font-size: 16px;\n            color: $color-gray-text;\n            font-weight: $font-weight-default;\n\n            &::after {\n                display: none;\n            }\n\n            .nr {\n                opacity: 1;\n            }\n\n            &:first-child {\n                text-align: left;\n            }\n\n            &:last-child {\n                text-align: right;\n            }\n\n            &:first-child:last-child {\n                text-align: center;\n            }\n        }\n\n        &.highlighted {\n            font-weight: bold;\n            color: $color-background;\n\n            &::after {\n                background: $color-primary-gray-light;\n                border-color: $color-primary-gray-light;\n            }\n\n            .nr {\n                opacity: 1;\n            }\n        }\n\n        &.selected {\n            color: $color-primary-contrast;\n            font-weight: bold;\n\n            &::after {\n                background: $color-primary;\n                animation: increase 0.2s;\n                border-color: $color-primary;\n\n                background: var(--color, $color-primary);\n                border-color: var(--color, $color-primary);\n            }\n\n            .nr {\n                opacity: 1;\n            }\n\n            &.hasHighlights {\n                z-index: 1;\n\n                &::after {\n                    animation: 0.6s ease 0.4s bringToAttention;\n                }\n            }\n        }\n\n        &.occupied {\n            .canSelect & {\n                cursor: not-allowed;\n            }\n\n             .nr {\n                opacity: 0.2;\n            }\n\n            &::after {\n                background: $color-border;\n            }\n\n        }\n    }\n\n    &.can-select .seat {\n        touch-action: manipulation;\n        user-select: none;\n        cursor: pointer;\n    }\n\n    .seat > .icon {\n        position: absolute;\n        left: calc((var(--w) - 18px) / 2 + 3px);\n        top: calc((var(--h) - 18px) / 2 + 2px);\n        z-index: 0;\n        font-size: 18px;\n\n        &:before {\n            font-size: 18px;\n        }\n    }\n}\n\n@keyframes bringToAttention {\n    0% {\n        transform: scale(1, 1);\n    }\n    25% {\n        transform: scale(1.8, 1.8);\n        border-radius: 10px;\n        background-color: $color-primary-dark;\n    }\n    50% {\n        transform: scale(1, 1);\n    }\n    75% {\n        transform: scale(2, 2);\n        border-radius: 10px;\n        background-color: $color-primary-dark;\n    }\n    100% {\n        transform: scale(1, 1);\n    }\n}\n\n@keyframes increase {\n    0% {\n        transform: scale(1, 1);\n    }\n    50% {\n        transform: scale(1.3, 1.3);\n        border-radius: 8px;\n    }\n    100% {\n        transform: scale(1, 1);\n    }\n}\n\n</style>\n","<template>\n    <form class=\"st-view choose-seats-view shade\" @submit.prevent=\"save\">\n        <STNavigationBar :title=\"title\" />\n        <main v-if=\"seatingPlan\">\n            <h1>\n                {{ title }}\n                <span v-if=\"amount\" class=\"title-suffix\">\n                    {{ selectedAmount }} / {{ amount }}\n                </span>\n            </h1>\n            <p class=\"inline-size style-description\">\n                {{ description }}\n            </p>\n            \n\n            <STErrorsDefault :error-box=\"errorBox\" />\n\n\n            <div v-for=\"(seatingPlanSection, index) of seatingPlan.sections\" :key=\"seatingPlanSection.id\" class=\"container\">\n                <hr v-if=\"index > 0\">\n                <h2 v-if=\"seatingPlan.sections.length > 1 && seatingPlanSection.name\">\n                    {{ seatingPlanSection.name }}\n                </h2>\n\n                <SeatSelectionBox \n                    :seating-plan=\"seatingPlan\"\n                    :seating-plan-section=\"seatingPlanSection\"\n                    :seats=\"cartItem.seats\"\n                    :amount=\"cartItem.amount\"\n                    :reserved-seats=\"reservedSeats\"\n                    :highlight-seats=\"highlighedSeats\"\n                    :set-seats=\"setSeats\"\n                    :admin=\"admin\"\n                />\n            </div>\n        </main>\n\n        <STToolbar>\n            <template #right><button class=\"button primary\" type=\"submit\" :disabled=\"selectedAmount !== amount\">\n                <span>Bevestigen</span>\n                <span class=\"icon arrow-right\" />\n            </button></template>\n        </STToolbar>\n    </form>\n</template>\n\n\n<script lang=\"ts\">\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { NavigationMixin } from '@simonbackx/vue-app-navigation';\nimport { BackButton, ErrorBox, NumberInput, Radio, StepperInput, STErrorsDefault, STList, STListItem, STNavigationBar, STToolbar } from '@stamhoofd/components';\nimport { Cart, CartItem, CartReservedSeat, ReservedSeat, Webshop } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { Component, Mixins, Prop } from '@simonbackx/vue-app-navigation/classes';\n\nimport FieldBox from './FieldBox.vue';\nimport OptionMenuBox from './OptionMenuBox.vue';\nimport SeatSelectionBox from './SeatSelectionBox.vue';\n\n@Component({\n    components: {\n        STNavigationBar,\n        STToolbar,\n        STList,\n        STListItem,\n        Radio,\n        NumberInput,\n        OptionMenuBox,\n        StepperInput,\n        FieldBox,\n        STErrorsDefault,\n        BackButton,\n        SeatSelectionBox\n    },\n    filters: {\n        price: Formatter.price.bind(Formatter),\n        priceChange: Formatter.priceChange.bind(Formatter),\n        priceFree: (p: number) => {\n            if (p === 0) {\n                return \"Gratis\"\n            }\n            return Formatter.price(p);\n        }\n    }\n})\nexport default class ChooseSeatsView extends Mixins(NavigationMixin){\n    @Prop({ default: false })\n        admin: boolean\n        \n    @Prop({ required: true })\n        cartItem: CartItem\n\n    @Prop({ default: null })\n        oldItem: CartItem | null\n\n    @Prop({ required: true })\n        webshop: Webshop\n\n    @Prop({ required: true })\n        cart: Cart\n\n    @Prop({ required: true })\n        saveHandler: (newItem: CartItem, oldItem: CartItem | null, component) => void\n\n    errorBox: ErrorBox | null = null\n\n    get amount() {\n        return this.cartItem.amount\n    }\n\n    get selectedAmount() {\n        return this.cartItem.seats.length\n    }\n\n    get remainingAmount() {\n        return this.amount - this.selectedAmount\n    }\n\n    get title() {\n        if (this.remainingAmount === 0) {\n            return 'Bevestig je plaatsen'\n        }\n\n        if (this.remainingAmount === this.amount) {\n            return `Kies ${Formatter.pluralText(this.remainingAmount, 'plaats', 'plaatsen')}`\n        }\n\n        return `Kies nog ${Formatter.pluralText(this.remainingAmount, 'plaats', 'plaatsen')}`\n    }\n\n    get description() {\n        return 'Kies in totaal ' + Formatter.pluralText(this.amount, 'plaats', 'plaatsen') + ' door de plaatsen één voor één aan te klikken. Je kan een plaats deselecteren door er nog eens op te klikken.'\n    }\n    \n    get seatingPlanSection() {\n        const plan = this.seatingPlan\n        if (!plan) {\n            return null\n        }\n        const seat = this.cartItem.seats[0]\n        if (!seat) {\n            return plan.sections[0]\n        }\n        return plan.sections.find(s => s.id === seat.section) ?? null\n    }\n\n    setSeats(seats: ReservedSeat[]) {\n        // todo: attach prices\n        this.cartItem.seats = seats.map(s => CartReservedSeat.create(s))\n    }\n\n    get reservedSeats() {\n        const planId = this.cartItem.product.seatingPlanId\n        \n        // All reserved seats, except the ones that are already reserved by this item\n        return [\n            ...this.cartItem.product.reservedSeats, \n            ...this.cart.items.filter(i => i.product.seatingPlanId === planId && i.product.id === this.cartItem.product.id).flatMap(i => i.seats).filter(r => !this.oldItem?.seats.find(rr => rr.equals(r)))\n        ].filter(r => !this.cartItem.reservedSeats.find(rr => rr.equals(r)))\n    }\n\n    get highlighedSeats() {\n        const planId = this.cartItem.product.seatingPlanId\n        return this.cart.items.filter(i => i.product.seatingPlanId === planId && i.product.id === this.cartItem.product.id).flatMap(i => i.seats).filter(r => !this.oldItem?.seats.find(rr => rr.equals(r)))\n    }\n\n    get cartEnabled() {\n        return this.webshop.shouldEnableCart\n    }\n\n    get seatingPlan() {\n        return this.webshop.meta.seatingPlans.find(p => p.id === this.cartItem.product.seatingPlanId)\n    }\n\n    validate() {\n        try {\n            const clonedCart = this.cart.clone()\n            \n            if (!this.cartEnabled) {\n                clonedCart.clear()\n            } else if (this.oldItem) {\n                clonedCart.removeItem(this.oldItem)\n            }\n\n            this.cartItem.validate(this.webshop, clonedCart, {\n                refresh: true,\n                admin: this.admin,\n                validateSeats: true\n            })\n        } catch (e) {\n            console.error(e);\n            this.errorBox = new ErrorBox(e)\n            return false\n        }\n        this.errorBox = null\n        return true;\n    }\n\n    save() {\n        // Check seats are optimal\n        if (this.seatingPlan && this.seatingPlan.requireOptimalReservation && !this.admin) {\n            const adjusted = this.seatingPlan?.adjustSeatsForBetterFit(this.cartItem.seats, this.reservedSeats)\n\n            if (adjusted) {\n                this.setSeats(adjusted)\n\n                this.errorBox = new ErrorBox(new SimpleError({\n                    code: 'adjusted',\n                    message: 'We hebben jouw gekozen plaatsen aangepast zodat er minder enkele plaatsen overblijven. Klik opnieuw op \"Bevestigen\" om verder te gaan.'\n                }))\n                return;\n            }\n        }\n\n        if (!this.validate()) {\n            return;\n        }\n\n        try {\n            this.saveHandler(this.cartItem, this.oldItem, this)\n        } catch (e) {\n            console.error(e);\n            this.errorBox = new ErrorBox(e)\n            return\n        }\n        this.errorBox = null // required if dismiss is disabled\n        //this.dismiss({ force: true })\n    }\n}\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use \"@stamhoofd/scss/base/text-styles.scss\" as *;\n\n.sheet .choose-seats-view {\n    width: max-content !important;\n    min-width: min(100vw, var(--st-sheet-width, 400px));\n    max-width: 100vw;\n}\n</style>","<template>\n    <form class=\"st-view cart-item-view\" @submit.prevent=\"addToCart\">\n        <STNavigationBar :title=\"cartItem.product.name\">\n            <template #left>\n                <p v-if=\"!webshop.isAllFree || pricedItem.getPriceWithDiscounts()\">\n                    <span v-if=\"formattedPriceWithDiscount\" class=\"style-tag discount\">{{ formattedPriceWithDiscount }}</span>\n                    <span v-else class=\"style-tag\">{{ formattedPriceWithoutDiscount }}</span>\n                </p>\n            </template>\n        </STNavigationBar>\n        <main>\n            <h1>{{ cartItem.product.name }}</h1>\n\n            <figure v-if=\"imageSrc\" class=\"image-box\">\n                <div>\n                    <img :src=\"imageSrc\" :width=\"image.width\" :height=\"image.height\">\n                </div>\n            </figure>\n            <p v-if=\"cartItem.product.description\" class=\"description\" v-text=\"cartItem.product.description\" />\n\n            <p v-if=\"oldItem && oldItem.cartError\" class=\"error-box small\">\n                {{ oldItem.cartError.getHuman() }}\n            </p>\n\n            <p v-if=\"!cartItem.product.isEnabled\" class=\"info-box\">\n                {{ cartItem.product.isEnabledTextLong }}\n            </p>\n\n            <p v-else-if=\"cartItem.product.isSoldOut\" class=\"warning-box\">\n                Dit artikel is uitverkocht\n            </p>\n\n            <p v-else-if=\"areSeatsSoldOut\" class=\"warning-box\">\n                Alle plaatsen zijn volzet\n            </p>\n\n            <p v-else-if=\"!canOrder\" class=\"warning-box\">\n                Je hebt het maximaal aantal stuks bereikt dat je nog kan bestellen van dit artikel\n            </p>\n\n            <p v-else-if=\"cartItem.product.closesSoonText\" class=\"info-box\">\n                {{ cartItem.product.closesSoonText }}\n            </p>\n\n            <p v-if=\"remainingReduced > 0\" class=\"info-box\">\n                Bestel je {{ cartItem.productPrice.discountAmount }} of meer stuks, dan betaal je maar {{ formatPrice(discountPrice) }} per stuk!\n            </p>\n\n            <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n            <STList v-if=\"(cartItem.product.type === 'Ticket' || cartItem.product.type === 'Voucher') && cartItem.product.location\" class=\"info\">\n                <STListItem>\n                    <h3 class=\"style-definition-label\">\n                        Locatie\n                    </h3>\n                    <p class=\"style-definition-text\">\n                        {{ cartItem.product.location.name }}\n                    </p>\n                    <p v-if=\"cartItem.product.location.address\" class=\"style-description-small\">\n                        {{ cartItem.product.location.address }}\n                    </p>\n                </STListItem>\n\n                <STListItem v-if=\"cartItem.product.dateRange\">\n                    <h3 class=\"style-definition-label\">\n                        Wanneer?\n                    </h3>\n                    <p class=\"style-definition-text\">\n                        {{ formatDateRange(cartItem.product.dateRange) }}\n                    </p>\n                </STListItem>\n            </STList>\n\n            <div v-if=\"cartItem.product.filteredPrices({admin}).length > 1\" class=\"container\">\n                <hr>\n                <STList>\n                    <STListItem v-for=\"price in cartItem.product.filteredPrices({admin})\" :key=\"price.id\" class=\"no-border right-price\" :selectable=\"canSelectPrice(price)\" :disabled=\"!canSelectPrice(price)\" element-name=\"label\">\n                        <template #left>\n                            <Radio v-model=\"cartItem.productPrice\" :value=\"price\" :name=\"cartItem.product.id+'price'\" :disabled=\"!canSelectPrice(price)\" />\n                        </template>\n                        <h4 class=\"style-title-list\">\n                            {{ price.name || 'Naamloos' }}\n                        </h4>\n\n                        <p v-if=\"price.discountPrice\" class=\"style-description-small\">\n                            {{ formatPrice(price.discountPrice) }} / stuk vanaf {{ price.discountAmount }} {{ price.discountAmount === 1 ? 'stuk' : 'stuks' }}\n                        </p>\n\n                        <p v-if=\"getPriceStockText(price)\" class=\"style-description-small\">\n                            {{ getPriceStockText(price) }}\n                        </p>\n\n                        <template #right>\n                            {{ formatPrice(price.price) }}\n                        </template>\n                    </STListItem>\n                </STList>\n            </div>\n\n            <OptionMenuBox v-for=\"optionMenu in cartItem.product.optionMenus\" :key=\"optionMenu.id\" :cart-item=\"cartItem\" :option-menu=\"optionMenu\" :cart=\"cart\" :old-item=\"oldItem\" :admin=\"admin\" :webshop=\"webshop\" />\n\n            <FieldBox v-for=\"field in cartItem.product.customFields\" :key=\"field.id\" :field=\"field\" :answers=\"cartItem.fieldAnswers\" :error-box=\"errors.errorBox\" />\n\n            <template v-if=\"canOrder && canSelectAmount\">\n                <hr>\n                <h2>Aantal</h2>\n\n                <NumberInput v-model=\"cartItem.amount\" :suffix=\"suffix\" :suffix-singular=\"suffixSingular\" :max=\"maximumRemaining\" :min=\"1\" :stepper=\"true\" />\n\n                <p v-if=\"stockText\" class=\"st-list-description\" v-text=\"stockText\" />\n            </template>\n\n            <div v-if=\"!cartEnabled && (pricedCheckout.priceBreakown.length > 1 || pricedCheckout.totalPrice > 0)\" class=\"pricing-box max\">\n                <PriceBreakdownBox :price-breakdown=\"pricedCheckout.priceBreakown\" />\n            </div>\n        </main>\n\n        <STToolbar v-if=\"canOrder\">\n            <template #right>\n                <button v-if=\"willNeedSeats\" class=\"button primary\" type=\"submit\">\n                    <span>Kies plaatsen</span>\n                    <span class=\"icon arrow-right\" />\n                </button>\n                <button v-else-if=\"oldItem && cartEnabled\" class=\"button primary\" type=\"submit\">\n                    <span class=\"icon basket\" />\n                    <span>Opslaan</span>\n                </button>\n                <button v-else class=\"button primary\" type=\"submit\">\n                    <span v-if=\"cartEnabled\" class=\"icon basket\" />\n                    <span v-if=\"cartEnabled\">Toevoegen</span>\n                    <span v-else>Doorgaan</span>\n                    <span v-if=\"!cartEnabled\" class=\"icon arrow-right\" />\n                </button>\n            </template>\n        </STToolbar>\n    </form>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ComponentWithProperties, useCanDismiss, useDismiss, usePresent, useShow } from '@simonbackx/vue-app-navigation';\nimport { CartItem, CartStockHelper, Checkout, ProductDateRange, ProductPrice, ProductType, Webshop } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\n\nimport { computed, onMounted, ref, Ref, watch } from 'vue';\nimport { ErrorBox } from '../errors/ErrorBox';\nimport STErrorsDefault from '../errors/STErrorsDefault.vue';\nimport { useErrors } from '../errors/useErrors';\nimport NumberInput from '../inputs/NumberInput.vue';\nimport Radio from '../inputs/Radio.vue';\nimport STList from '../layout/STList.vue';\nimport STListItem from '../layout/STListItem.vue';\nimport STNavigationBar from '../navigation/STNavigationBar.vue';\nimport STToolbar from '../navigation/STToolbar.vue';\nimport ChooseSeatsView from './ChooseSeatsView.vue';\nimport FieldBox from './FieldBox.vue';\nimport OptionMenuBox from './OptionMenuBox.vue';\nimport PriceBreakdownBox from './PriceBreakdownBox.vue';\n\nconst props = withDefaults(defineProps<{\n    admin?: boolean;\n    cartItem: CartItem;\n    webshop: Webshop;\n    checkout: Checkout;\n    saveHandler: (newItem: CartItem, oldItem: CartItem | null,\n        component: { dismiss: ReturnType<typeof useDismiss>; canDismiss: boolean }) => void;\n    oldItem?: CartItem | null;\n\n}>(), {\n    admin: false,\n    oldItem: null,\n});\n\nconst present = usePresent();\nconst show = useShow();\nconst dismiss = useDismiss();\nconst canDismiss = useCanDismiss();\nconst pricedItem = ref(props.cartItem) as Ref<CartItem>;\nconst pricedCheckout = ref(props.checkout) as Ref<Checkout>;\nconst errors = useErrors();\n\nconst willNeedSeats = computed(() => withSeats.value);\nconst cart = computed(() => props.checkout.cart);\n\nonMounted(() => {\n    onChangeItem();\n    console.log('Cartview', this, props.cartItem);\n});\n\n// External changes should trigger a price update\nwatch(() => props.checkout, () => {\n    onChangeItem();\n});\n\nwatch(() => props.cartItem, () => {\n    onChangeItem();\n}, { deep: true });\n\nfunction onChangeItem() {\n    // Update the cart price on changes\n    const clonedCheckout = props.checkout.clone();\n    if (props.oldItem) {\n        clonedCheckout.cart.removeItem(props.oldItem);\n    }\n    const pricedItemClone = props.cartItem.clone();\n    clonedCheckout.cart.addItem(pricedItemClone, false); // No merging (otherwise prices are not updated)\n\n    // Calculate prices\n    clonedCheckout.update(props.webshop);\n    pricedCheckout.value = clonedCheckout;\n    pricedItem.value = pricedItemClone;\n}\n\nconst formattedPriceWithDiscount = computed(() => pricedItem.value.getFormattedPriceWithDiscount());\nconst formattedPriceWithoutDiscount = computed(() => pricedItem.value.getFormattedPriceWithoutDiscount());\n\nfunction validate() {\n    try {\n        const clonedCart = cart.value.clone();\n\n        if (!cartEnabled.value) {\n            clonedCart.clear();\n        }\n        else if (props.oldItem) {\n            clonedCart.removeItem(props.oldItem);\n        }\n\n        props.cartItem.validate(props.webshop, clonedCart, {\n            refresh: true,\n            admin: props.admin,\n            validateSeats: false,\n        });\n    }\n    catch (e) {\n        console.error(e);\n        errors.errorBox = new ErrorBox(e);\n        return false;\n    }\n    errors.errorBox = null;\n    return true;\n}\n\nfunction addToCart() {\n    if (!validate()) {\n        return;\n    }\n\n    if (willNeedSeats.value) {\n        chooseSeats();\n        return;\n    }\n\n    try {\n        props.saveHandler(props.cartItem, props.oldItem, {\n            dismiss,\n            canDismiss: canDismiss.value,\n        });\n    }\n    catch (e) {\n        console.error(e);\n        errors.errorBox = new ErrorBox(e);\n        return;\n    }\n}\n\nfunction chooseSeats() {\n    const component = new ComponentWithProperties(ChooseSeatsView, {\n        cartItem: props.cartItem,\n        oldItem: props.oldItem,\n        webshop: props.webshop,\n        admin: props.admin,\n        cart: cart.value,\n        saveHandler: props.saveHandler,\n    });\n\n    if (!canDismiss.value) {\n        present({\n            components: [\n                component,\n            ],\n            modalDisplayStyle: 'sheet',\n        }).catch(console.error);\n    }\n    else {\n        // Sheet\n        show({\n            components: [\n                component,\n            ],\n        }).catch(console.error);\n    }\n}\n\nconst cartEnabled = computed(() => props.webshop.shouldEnableCart);\nconst withSeats = computed(() => props.cartItem.product.seatingPlanId !== null);\nconst suffixSingular = computed(() => {\n    if (props.cartItem.product.type === ProductType.Ticket) {\n        return 'ticket';\n    }\n    return props.cartItem.product.type === ProductType.Person ? 'persoon' : 'stuk';\n});\n\nconst suffix = computed(() => {\n    if (props.cartItem.product.type === ProductType.Ticket) {\n        return 'tickets';\n    }\n    return props.cartItem.product.type === ProductType.Person ? 'personen' : 'stuks';\n});\n\nconst image = computed(() => props.cartItem.product.images[0]?.getResolutionForSize(600, undefined));\nconst imageSrc = computed(() => image.value?.file?.getPublicPath());\nconst product = computed(() => props.cartItem.product);\nconst remainingReduced = computed(() => {\n    if (props.cartItem.productPrice.discountPrice === null) {\n        return 0;\n    }\n    return props.cartItem.productPrice.discountAmount - count.value;\n});\nconst discountPrice = computed(() => props.cartItem.productPrice.discountPrice ?? 0);\nconst count = computed(() => {\n    return cart.value.items.reduce((prev, item) => {\n        if (item.product.id !== product.value.id) {\n            return prev;\n        }\n        return prev + item.amount;\n    }, 0) - (props.oldItem?.amount ?? 0);\n});\n\nconst availableStock = computed(() => {\n    return props.cartItem.getAvailableStock(props.oldItem, cart.value, props.webshop, props.admin);\n});\n\nconst maximumRemaining = computed(() => props.cartItem.getMaximumRemaining(props.oldItem, cart.value, props.webshop, props.admin));\nconst maximumRemainingAcrossOptions = computed(() => {\n    return CartStockHelper.getRemainingAcrossOptions({\n        product: product.value,\n        oldItem: props.oldItem,\n        cart: cart.value,\n        webshop: props.webshop,\n        admin: props.admin,\n        amount: props.cartItem.amount,\n    }, { inMultipleCartItems: false });\n});\n\nconst stockText = computed(() => {\n    const maximumRemainingValue = maximumRemaining.value;\n    return availableStock.value.filter(v => v.text !== null && (!v.remaining || !maximumRemainingValue || v.remaining <= maximumRemainingValue)).map(s => s.text)[0];\n});\n\nfunction getPriceStock(price: ProductPrice) {\n    const priceStock = CartStockHelper.getPriceStock({ product: product.value, oldItem: props.oldItem, cart: cart.value, productPrice: price, webshop: props.webshop, admin: props.admin, amount: props.cartItem.amount });\n    if (!priceStock) {\n        return null;\n    }\n\n    if (priceStock.remaining !== null && maximumRemainingAcrossOptions.value !== null && priceStock.remaining > maximumRemainingAcrossOptions.value) {\n        // Doesn't matter to show this\n        return null;\n    }\n    return priceStock;\n}\n\nfunction getPriceStockText(price: ProductPrice) {\n    // Don't show text if all options are sold out\n    if (maximumRemainingAcrossOptions.value === 0) {\n        return null;\n    }\n\n    return getPriceStock(price)?.shortText;\n}\n\nfunction canSelectPrice(price: ProductPrice) {\n    if (maximumRemainingAcrossOptions.value === 0) {\n        return false;\n    }\n\n    return getPriceStock(price)?.remaining !== 0;\n}\n\nfunction formatDateRange(dateRange: ProductDateRange) {\n    return Formatter.capitalizeFirstLetter(dateRange.toString());\n}\n\nconst areSeatsSoldOut = computed(() => {\n    return CartStockHelper.getSeatsStock({ product: product.value, oldItem: props.oldItem, cart: cart.value, webshop: props.webshop, admin: props.admin, amount: props.cartItem.amount })?.stock === 0;\n});\n\nconst canOrder = computed(() => {\n    return (maximumRemaining.value === null || maximumRemaining.value > 0) && (product.value.isEnabled || props.admin);\n    // return (props.admin || ((maximumRemaining.value === null || maximumRemaining.value > 0 || !!props.oldItem) && product.value.isEnabled)) && !this.areSeatsSoldOut\n});\n\nconst canSelectAmount = computed(() => product.value.maxPerOrder !== 1 && product.value.allowMultiple);\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use \"@stamhoofd/scss/base/text-styles.scss\" as *;\n\n.cart-item-view {\n    .sheet & {\n       --st-horizontal-padding: 25px;\n    }\n\n    .image-box {\n        position: relative;\n        overflow: hidden;\n        border-radius: $border-radius;\n\n        > div {\n            display: flex;\n            flex-direction: row;\n            justify-content: center;\n        }\n\n        img {\n            height: auto;\n            max-width: 100%;\n            border-radius: $border-radius;\n            object-fit: cover;\n        }\n    }\n    .image {\n        width: 100%;\n        border-radius: $border-radius;\n    }\n\n    .description {\n        @extend .style-description;\n        padding-top: 15px;\n        white-space: pre-wrap;\n    }\n\n    .info {\n        padding-top: 15px;\n    }\n\n    h1 + .description {\n        // Remove duplicate padding\n        padding-top: 0;\n    }\n\n    h1 + .info {\n        padding-top: 0;\n    }\n\n    .pricing-box {\n        padding-top: 15px;\n    }\n}\n\n</style>\n","<template>\n    <article class=\"product-box\" :class=\"{ selected: count > 0}\" @click=\"onClicked\">\n        <div class=\"left\" />\n        <div class=\"content\">\n            <div>\n                <h3>\n                    <div class=\"counter\">\n                        {{ count }} x\n                    </div>\n                    {{ product.name }}\n                </h3>\n\n                <p v-if=\"(product.type === 'Ticket' || product.type === 'Voucher') && product.location\" class=\"description\" v-text=\"product.location.name\" />\n                <p v-if=\"(product.type === 'Ticket' || product.type === 'Voucher') && product.dateRange\" class=\"description\" v-text=\"formatDateRange(product.dateRange)\" />\n                <p v-else-if=\"product.description\" class=\"description\" v-text=\"product.description\" />\n\n                <p class=\"price\">\n                    {{ priceString }}\n\n                    <span v-if=\"product.enableInFuture\" class=\"style-tag\">Vanaf {{ product.enableAfter ? formatDateTime(product.enableAfter) : '?' }}</span>\n                    <span v-else-if=\"!product.isEnabled && !admin\" class=\"style-tag error\">Onbeschikbaar</span>\n                    <span v-else-if=\"product.isSoldOut\" class=\"style-tag error\">Uitverkocht</span>\n                    <span v-else-if=\"stockText !== null\" class=\"style-tag\" :class=\"stockText.style\">{{ stockText.text }}</span>\n                </p>\n            </div>\n            <figure v-if=\"imageSrc\">\n                <img :src=\"imageSrc\" :width=\"imgWidth\" :height=\"imgHeight\" :alt=\"product.name\">\n            </figure>\n            <figure v-else>\n                <span v-if=\"product.type === 'Ticket' || product.type === 'Voucher'\" class=\"icon ticket gray\" />\n                <span class=\"icon arrow-right-small gray\" />\n            </figure>\n            <hr>\n        </div>\n    </article>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ComponentWithProperties, NavigationController, useCanDismiss, usePresent, useShow } from '@simonbackx/vue-app-navigation';\nimport { CartItemView } from '@stamhoofd/components';\nimport { Cart, CartItem, CartStockHelper, Checkout, Product, ProductDateRange, Webshop } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed } from 'vue';\n\nconst props = withDefaults(defineProps<{\n    admin?: boolean;\n    product: Product;\n    webshop: Webshop;\n    checkout: Checkout;\n    saveHandler: (newItem: CartItem, oldItem: CartItem | null) => void;\n}>(), {\n    admin: false,\n});\n\nconst present = usePresent();\nconst show = useShow();\nconst canDismiss = useCanDismiss();\nconst cart = computed(() => props.checkout.cart);\n\nconst priceString = computed(() => {\n    const priceRanges = Formatter.uniqueArray(props.product.filteredPrices({ admin: props.admin }).map(p => p.price));\n    if (priceRanges.length === 1) {\n        if (priceRanges[0] === 0) {\n            if (props.webshop.isAllFree) {\n                return '';\n            }\n            return 'Gratis';\n        }\n        return Formatter.price(priceRanges[0]);\n    }\n    const minimum = Math.min(...priceRanges);\n    const maximum = Math.max(...priceRanges);\n    return Formatter.price(minimum, true) + ' - ' + Formatter.price(maximum, true);\n});\n\nconst count = computed(() => {\n    return cart.value.items.reduce((prev, item) => {\n        if (item.product.id !== props.product.id) {\n            return prev;\n        }\n        return prev + item.amount;\n    }, 0);\n});\n\nconst imageResolution = computed(() => props.product.images[0]?.getResolutionForSize(100, 100));\nconst imageSrc = computed(() => imageResolution.value?.file.getPublicPath());\nconst imgWidth = computed(() => imageResolution.value?.width);\nconst imgHeight = computed(() => imageResolution.value?.height);\n\nconst stockText = computed(() => {\n    const remainingWithoutCart = CartStockHelper.getRemainingAcrossOptions({ cart: new Cart(), product: props.product, webshop: props.webshop, admin: props.admin }, { inMultipleCartItems: true, excludeOrder: true });\n\n    if (remainingWithoutCart === 0) {\n        return {\n            text: 'Uitverkocht',\n            style: 'error',\n        };\n    }\n\n    if (editExisting.value) {\n        if (remainingWithoutCart === null || remainingWithoutCart > 25) {\n            return null;\n        }\n\n        const maxOrder = CartStockHelper.getOrderMaximum({ cart: new Cart(), product: props.product, webshop: props.webshop, admin: props.admin });\n        if (maxOrder && maxOrder.remaining !== null && maxOrder.remaining < remainingWithoutCart) {\n            // No point in showing stock: you can only order x items in one order\n            return null;\n        }\n\n        return {\n            text: 'Nog ' + props.product.getRemainingStockText(remainingWithoutCart),\n            style: 'warn',\n        };\n    }\n\n    // How much we can still order from this product\n    const maxOrder = CartStockHelper.getOrderMaximum({ cart: cart.value, product: props.product, webshop: props.webshop, admin: props.admin });\n    const remaining = CartStockHelper.getRemainingAcrossOptions({ cart: cart.value, product: props.product, webshop: props.webshop, admin: props.admin }, { inMultipleCartItems: true, excludeOrder: true });\n\n    if (maxOrder && maxOrder.remaining === 0) {\n        return {\n            text: 'Maximum bereikt',\n            style: 'error',\n        };\n    }\n\n    if (remaining === null) {\n        return null;\n    }\n\n    if (remaining > 25 || (maxOrder && maxOrder.remaining !== null && remaining > maxOrder.remaining)) {\n        // No point in showing stock: you can only order x items in one order\n        return null;\n    }\n\n    if (remaining === 0) {\n        return {\n            text: 'Maximum bereikt',\n            style: 'error',\n        };\n    }\n\n    return {\n        text: 'Nog ' + props.product.getRemainingStockText(remaining),\n        style: 'warn',\n    };\n});\n\nconst editExisting = computed(() => props.product.isUnique || !props.webshop.shouldEnableCart);\n\nfunction onClicked() {\n    const editExistingValue = editExisting.value;\n    const oldItem = editExistingValue ? cart.value.items.find(i => i.product.id === props.product.id) : undefined;\n\n    let cartItem = oldItem?.clone() ?? CartItem.createDefault(props.product, cart.value, props.webshop, { admin: props.admin });\n\n    // refresh: to make sure we display the latest data\n    if (oldItem) {\n        try {\n            cartItem.refresh(props.webshop);\n        }\n        catch (e) {\n            console.error(e);\n\n            // Not recoverable\n            cartItem = CartItem.createDefault(props.product, cart.value, props.webshop, { admin: props.admin });\n        }\n    }\n\n    if (canDismiss.value) {\n        show(new ComponentWithProperties(CartItemView, {\n            admin: props.admin,\n            cartItem,\n            oldItem,\n            cart: cart.value,\n            webshop: props.webshop,\n            checkout: props.checkout,\n            saveHandler: props.saveHandler,\n        })).catch(console.error);\n    }\n    else {\n        present({\n            components: [\n                new ComponentWithProperties(NavigationController, {\n                    root: new ComponentWithProperties(CartItemView, {\n                        admin: props.admin,\n                        cartItem,\n                        oldItem,\n                        webshop: props.webshop,\n                        checkout: props.checkout,\n                        saveHandler: props.saveHandler,\n                    }),\n                }),\n            ],\n            modalDisplayStyle: 'sheet',\n        }).catch(console.error);\n    }\n}\n\nfunction formatDateRange(dateRange: ProductDateRange) {\n    return Formatter.capitalizeFirstLetter(dateRange.toString());\n}\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use \"@stamhoofd/scss/base/text-styles.scss\" as *;\n\n.product-box {\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    cursor: pointer;\n    touch-action: manipulation;\n    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n    user-select: none;\n    transition: background-color 0.2s 0.1s;\n\n    margin: 0 calc(-1 * var(--st-horizontal-padding, 40px));\n    padding-right: var(--st-horizontal-padding, 15px);\n\n    .maskingSvg {\n        display: none;\n    }\n\n    > .content > hr {\n        border: 0;\n        outline: 0;\n        height: $border-width;\n        background: $color-border;\n        border-radius: calc($border-width / 2);\n        margin: 0;\n        position: absolute;\n        bottom: 0;\n        left: 0;\n        right: calc(-1 * var(--st-horizontal-padding, 15px));\n    }\n\n    &:last-child {\n        > .content > hr {\n            display: none;\n        }\n    }\n\n    &:active {\n        transition: none;\n        background: $color-primary-background;\n    }\n\n    > .left {\n        overflow: hidden;\n        width: 4px;\n        flex-shrink: 0;\n        background: $color-primary;\n        align-self: stretch;\n        border-radius: $border-radius;\n        opacity: 0;\n        transform: translateX(-4px);\n        transition: opacity 0.2s, transform 0.2s;\n        margin-right: var(--st-horizontal-padding, 15px);\n    }\n\n    &.selected {\n        > .left {\n            opacity: 1;\n            transform: translateX(0);\n        }\n    }\n\n    > .content {\n        flex-grow: 1;\n        min-width: 0;\n        align-self: stretch;\n        display: flex;\n        align-items: center;\n        position: relative;\n\n        > div {\n            padding: 15px 0;\n\n            flex-grow: 1;\n            min-width: 0;\n\n            > h3 {\n                padding-top: 5px;\n                @extend .style-title-3;\n                line-height: 1.3;\n                padding-right: 30px;\n                position: relative;\n                transition: transform 0.2s;\n\n                > .counter {\n                    position: absolute;\n                    left: 0;\n                    opacity: 0;\n                    width: 30px;\n\n                    font-size: 14px;\n                    line-height: 1.4;\n                    font-weight: 600;\n                    color: $color-primary;\n\n                    transform: translateX(-30px);\n                    transition: opacity 0.2s;\n                    white-space: nowrap;\n                }\n            }\n\n            > .description {\n                @extend .style-description-small;\n                padding-top: 5px;\n                text-overflow: ellipsis;\n                overflow: hidden;\n                display: -webkit-box;\n                white-space: pre-wrap;\n                line-clamp: 2; /* number of lines to show */\n                -webkit-line-clamp: 2; /* number of lines to show */\n                -webkit-box-orient: vertical;\n\n                + .description {\n                    padding-top: 0;\n                }\n            }\n\n            > .price {\n                font-size: 14px;\n                line-height: 1.4;\n                font-weight: 600;\n                padding-top: 10px;\n                color: $color-primary;\n                display: flex;\n                flex-direction: row;\n\n                .style-tag {\n                    margin-left: auto;\n                }\n            }\n        }\n\n    }\n\n    &.ticket {\n        position: relative;\n    }\n\n    &.selected {\n        > .content > div {\n            > h3 {\n                transform: translateX(30px);\n\n                >.counter {\n                    opacity: 1;\n                }\n            }\n        }\n    }\n\n    figure {\n        flex-shrink: 0;\n        padding: 15px 0 15px 15px;\n\n        img {\n            //width: auto; // breaks layout shift on load\n            height: auto;\n            max-width: 70px;\n            // max-height: 70px; // breaks aspect ratio\n            border-radius: $border-radius;\n            display: block;\n\n            @media (min-width: 340px) {\n                max-width: 80px;\n                // max-height: 80px; // breaks aspect ratio\n            }\n        }\n    }\n}\n\n.enable-grid .product-box {\n    @media (min-width: 801px) {\n        background: $color-background;\n        border-radius: $border-radius;\n        margin: 0;\n\n        box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.05), 0px 20px 50px $color-shadow, inset 0px 0px 0px 1px $color-shadow;\n        overflow: hidden;\n\n        padding-right: 0;\n\n        &:active {\n            transition: none;\n            background: $color-primary-background;\n        }\n\n        > .content > hr {\n            display: none;\n        }\n\n        > .left {\n            margin-right: 0;\n        }\n\n        > .content > div {\n            padding: 15px;\n        }\n\n        figure {\n            padding: 15px 15px 15px 15px;\n\n            img {\n                // width: auto; // breaks layout shift on load\n                height: auto;\n                max-width: 100px;\n                // max-height: 100px; // breaks aspect ratio\n            }\n        }\n\n        &.ticket {\n            overflow: visible;\n\n            .maskingSvg {\n                display: block;\n                z-index: -1;\n                position: absolute;\n                height: 100%;\n                width: 100%;\n            }\n\n            background: none;\n\n            // Force hardware acceleration (for filter)\n            transform: translate3d(0, 0, 0);\n            backface-visibility: hidden;\n            position: relative;\n            z-index: 1;\n\n            filter: drop-shadow($color-shadow 0px 20px 50px) drop-shadow(rgba(0, 0, 0, 0.05) 0px 4px 4px);\n            box-shadow: none;\n\n            > .left {\n                order: 30;\n                transform: translateX(4px);\n            }\n\n            &.selected > .left {\n                transform: translateX(0px);\n            }\n\n            > .content > div {\n                padding-left: 30px;\n                padding-top: 30px;\n                padding-bottom: 30px;\n            }\n\n            .svg-background {\n                transition: fill 0.2s 0.1s;\n                fill: $color-background;\n            }\n\n            &:active {\n                background: none;\n\n                .svg-background {\n                    transition: none;\n                    fill: $color-primary-background;\n                }\n            }\n        }\n    }\n}\n\n</style>\n","<template>\n    <div class=\"product-grid\" :class=\"{single: products.length === 1}\">\n        <ProductBox v-for=\"product in products\" :key=\"product.id\" :product=\"product\" :webshop=\"webshop\" :checkout=\"checkout\" :save-handler=\"saveHandler\" :admin=\"admin\" />\n    </div>\n</template>\n\n\n<script lang=\"ts\">\nimport { NavigationMixin } from \"@simonbackx/vue-app-navigation\";\nimport { Checkbox, STList, STListItem, STNavigationBar, STToolbar } from \"@stamhoofd/components\"\nimport { CartItem, Checkout, Product, Webshop } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { Component, Mixins, Prop } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport ProductBox from \"./ProductBox.vue\"\n\n@Component({\n    components: {\n        STNavigationBar,\n        STToolbar,\n        STList,\n        STListItem,\n        Checkbox,\n        ProductBox\n    },\n    filters: {\n        price: Formatter.price\n    }\n})\nexport default class ProductGrid extends Mixins(NavigationMixin){\n    @Prop({ default: false })\n        admin: boolean\n\n    @Prop({ required: true })\n        products: Product[]\n\n    @Prop({ required: true })\n        webshop: Webshop\n        \n    @Prop({ required: true })\n        checkout: Checkout\n\n    @Prop({ required: true })\n        saveHandler: (newItem: CartItem, oldItem: CartItem | null, component) => void\n}\n</script>\n\n<style lang=\"scss\">\n.product-grid {\n    display: grid;\n    gap: 0;\n    grid-template-columns: 1fr;\n}\n\n.enable-grid .product-grid {\n    @media (min-width: 801px) {\n        grid-template-columns: repeat(2, 1fr);\n        gap: 15px;\n\n        &.single {\n            grid-template-columns: 1fr;\n        }\n    }\n}\n</style>","<template>\n    <div class=\"category-box container\">\n        <h2 class=\"larger\">\n            {{ category.name }}\n        </h2>\n        <p v-if=\"category.description.length > 0\" class=\"style-description-small\" v-text=\"category.description\" />\n\n        <ProductGrid :products=\"products\" :webshop=\"webshop\" :checkout=\"checkout\" :save-handler=\"saveHandler\" :admin=\"admin\" />\n        <hr v-if=\"!isLast\">\n    </div>\n</template>\n\n\n<script lang=\"ts\">\nimport { NavigationMixin } from \"@simonbackx/vue-app-navigation\";\nimport { Checkbox,LoadingView, STList, STListItem, STNavigationBar, STToolbar } from \"@stamhoofd/components\"\nimport { Cart, CartItem, Category, Checkout, Webshop } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { Component, Mixins, Prop } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport ProductGrid from \"./ProductGrid.vue\"\n\n@Component({\n    components: {\n        STNavigationBar,\n        STToolbar,\n        STList,\n        STListItem,\n        LoadingView,\n        Checkbox,\n        ProductGrid\n    },\n    filters: {\n        price: Formatter.price\n    }\n})\nexport default class CategoryBox extends Mixins(NavigationMixin){\n    @Prop({ default: false })\n        admin: boolean\n\n    @Prop({ required: true })\n        category: Category\n\n    @Prop({ required: true })\n        webshop: Webshop\n\n    @Prop({ default: false })\n        isLast: boolean\n\n    @Prop({ required: true })\n        checkout: Checkout\n\n    @Prop({ required: true })\n        saveHandler: (newItem: CartItem, oldItem: CartItem | null, component) => void\n\n    get products() {\n        return this.category.productIds.flatMap(id => {\n            const product = this.webshop.products.find(p => p.id === id)\n            if (product && (!product.hidden || this.admin)) {\n                return [product]\n            }\n            return []\n        })\n    }\n\n}\n</script>\n\n<style lang=\"scss\">\n.category-box > p {\n    padding-bottom: 20px;\n    white-space: pre-wrap;\n}\n</style>","<template>\n    <SaveView class=\"auto\" data-submit-last-field title=\"Wachtwoord wijzigen\" save-icon=\"lock\" @save=\"submit\">\n        <h1 v-if=\"$context.user?.hasPassword\">\n            Wachtwoord wijzigen\n        </h1>\n        <h1 v-else>\n            Wachtwoord instellen\n        </h1>\n\n        <STErrorsDefault :error-box=\"errorBox\" />\n\n        <input id=\"username\" style=\"display: none;\" type=\"text\" name=\"username\" autocomplete=\"username\" :value=\"email\">\n\n        <STInputBox title=\"Kies een wachtwoord\">\n            <input id=\"new-password\" v-model=\"password\" class=\"input\" enterkeyhint=\"next\" placeholder=\"Kies een nieuw wachtwoord\" autocomplete=\"new-password\" type=\"password\">\n        </STInputBox>\n\n        <STInputBox title=\"Herhaal wachtwoord\">\n            <input id=\"confirm-password\" v-model=\"passwordRepeat\" enterkeyhint=\"go\" class=\"input\" placeholder=\"Herhaal nieuw wachtwoord\" autocomplete=\"new-password\" type=\"password\">\n        </STInputBox>\n\n        <PasswordStrength v-model=\"password\" />\n    </SaveView>\n</template>\n\n<script lang=\"ts\">\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { NavigationMixin } from '@simonbackx/vue-app-navigation';\nimport { Component, Mixins } from '@simonbackx/vue-app-navigation/classes';\nimport { ErrorBox, LoadingButton, PasswordStrength, SaveView, STErrorsDefault, STFloatingFooter, STInputBox, STNavigationBar, Toast, Validator } from '@stamhoofd/components';\nimport { LoginHelper } from '@stamhoofd/networking';\n\n@Component({\n    components: {\n        STNavigationBar,\n        STFloatingFooter,\n        STInputBox,\n        LoadingButton,\n        STErrorsDefault,\n        PasswordStrength,\n        SaveView,\n    },\n})\nexport default class ChangePasswordView extends Mixins(NavigationMixin) {\n    loading = false;\n\n    password = '';\n    passwordRepeat = '';\n\n    errorBox: ErrorBox | null = null;\n    validator = new Validator();\n\n    get email() {\n        return this.$context.user?.email ?? '';\n    }\n\n    async submit() {\n        if (this.loading) {\n            return;\n        }\n\n        // Request the key constants\n\n        if (this.password !== this.passwordRepeat) {\n            this.errorBox = new ErrorBox(new SimpleError({\n                code: '',\n                message: 'De ingevoerde wachtwoorden komen niet overeen',\n            }));\n            return;\n        }\n\n        if (this.password.length < 8) {\n            this.errorBox = new ErrorBox(new SimpleError({\n                code: '',\n                message: 'Jouw wachtwoord moet uit minstens 8 karakters bestaan.',\n            }));\n            return;\n        }\n        this.loading = true;\n\n        try {\n            await LoginHelper.changePassword(this.$context, this.password);\n            this.dismiss({ force: true });\n            new Toast('Jouw nieuwe wachtwoord is opgeslagen', 'success').show();\n        }\n        catch (e) {\n            this.loading = false;\n            this.errorBox = new ErrorBox(e);\n            return;\n        }\n    }\n}\n</script>\n","<template>\n    <SaveView :loading=\"loading\" :save-text=\"saveText\" @save=\"save\">\n        <FillRecordCategoryBox :category=\"category\" :value=\"patchedValue\" :validator=\"errors.validator\" :force-mark-reviewed=\"forceMarkReviewed\" @patch=\"addPatch\" />\n    </SaveView>\n</template>\n\n<script setup lang=\"ts\" generic=\"T extends ObjectWithRecords\">\nimport { PatchMap, patchObject } from '@simonbackx/simple-encoding';\nimport { ObjectWithRecords, PatchAnswers, RecordCategory } from '@stamhoofd/structures';\nimport { computed, ref } from 'vue';\n\nimport { ErrorBox } from '../errors/ErrorBox';\nimport { useErrors } from '../errors/useErrors';\nimport { CenteredMessage } from '../overlays/CenteredMessage';\nimport { NavigationActions, useNavigationActions } from '../types/NavigationActions';\nimport FillRecordCategoryBox from './components/FillRecordCategoryBox.vue';\n\nconst props = withDefaults(\n    defineProps<{\n        category: RecordCategory;\n        value: T;\n        saveHandler: (patch: PatchAnswers, navigate: NavigationActions) => Promise<void> | void;\n        saveText?: string;\n        forceMarkReviewed?: boolean | null;\n    }>(), {\n        saveText: 'Opslaan',\n        forceMarkReviewed: null,\n    },\n);\n\nconst patch = ref(new PatchMap() as PatchAnswers);\nconst patchedValue = computed(() => {\n    const patched = props.value.patchRecordAnswers(patch.value);\n    return patched;\n});\n\nfunction addPatch(p: PatchAnswers) {\n    patch.value = patchObject(patch.value, p);\n}\n\nconst loading = ref(false);\nconst errors = useErrors();\nconst navigate = useNavigationActions();\n\nasync function save() {\n    if (loading.value) {\n        return;\n    }\n\n    loading.value = true;\n\n    try {\n        if (!await errors.validator.validate()) {\n            loading.value = false;\n            return;\n        }\n\n        await props.saveHandler(patch.value, navigate);\n        patch.value = new PatchMap() as PatchAnswers;\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    loading.value = false;\n}\n\nconst hasChanges = computed(() => {\n    return patch.value.size > 0;\n});\n\nasync function shouldNavigateAway() {\n    if (!hasChanges.value && !loading.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm('Ben je zeker dat je wilt sluiten zonder op te slaan?', 'Niet opslaan');\n}\n\ndefineExpose({\n    shouldNavigateAway,\n});\n\n</script>\n","<template>\n    <div>\n        <div v-if=\"darkMode === 'Off' || darkMode === 'Auto'\" class=\"split-inputs\">\n            <div>\n                <ImageInput v-model=\"horizontalLogo\" :placeholder=\"horizontalLogoPlaceholder\" title=\"Horizontaal\" :validator=\"validator\" :resolutions=\"horizontalLogoResolutions\" :required=\"false\" />\n\n                <p class=\"style-description-small\">\n                    Voor grotere schermen.\n                </p>\n            </div>\n\n            <div>\n                <ImageInput v-model=\"squareLogo\" :placeholder=\"squareLogoPlaceholder\" title=\"Vierkant\" :validator=\"validator\" :resolutions=\"squareLogoResolutions\" :required=\"false\" />\n                <p class=\"style-description-small\">\n                    Voor op kleine schermen. Laat tekst zoveel mogelijk weg uit dit logo.\n                </p>\n            </div>\n        </div>\n        <div v-if=\"darkMode === 'On' || darkMode === 'Auto'\" class=\"split-inputs\">\n            <div>\n                <ImageInput v-model=\"horizontalLogoDark\" :placeholder=\"horizontalLogoDarkPlaceholder\" title=\"Horizontaal op donkere achtergrond\" :validator=\"validator\" :resolutions=\"horizontalLogoResolutions\" :required=\"false\" :dark=\"true\" />\n\n                <p class=\"style-description-small\">\n                    Voor grotere schermen. In donkere modus.\n                </p>\n            </div>\n\n            <div>\n                <ImageInput v-model=\"squareLogoDark\" :placeholder=\"squareLogoDarkPlaceholder\" title=\"Vierkant\" :validator=\"validator\" :resolutions=\"squareLogoResolutions\" :required=\"false\" :dark=\"true\" />\n                <p class=\"style-description-small\">\n                    Voor op kleine schermen. In donkere modus. Laat tekst zoveel mogelijk weg uit dit logo.\n                </p>\n            </div>\n        </div>\n\n        <Checkbox v-model=\"expandLogo\">\n            Logo groter weergeven (afgeraden)\n        </Checkbox>\n    </div>\n</template>\n\n\n<script lang=\"ts\">\nimport { NavigationMixin } from '@simonbackx/vue-app-navigation';\nimport { DarkMode, Image, OrganizationMetaData, PlatformConfig, ResolutionFit, ResolutionRequest, WebshopMetaData } from '@stamhoofd/structures';\nimport { Component, Mixins, Prop } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport { Validator } from '../errors/Validator';\nimport Checkbox from '../inputs/Checkbox.vue';\nimport ImageInput from '../inputs/ImageInput.vue';\n\n@Component({\n    components: {\n        Checkbox,\n        ImageInput\n    }\n})\nexport default class LogoEditor extends Mixins(NavigationMixin) {\n    @Prop({ required: true }) \n        metaData: WebshopMetaData | OrganizationMetaData | PlatformConfig\n    \n    @Prop({ default: null }) \n        validator: Validator | null\n\n    @Prop({ default: DarkMode.Off }) \n        darkMode!: DarkMode\n\n    get squareLogo() {\n        return this.metaData.squareLogo\n    }\n\n    set squareLogo(image: Image | null) {\n        this.$emit('patch', (this.metaData.constructor as typeof WebshopMetaData | typeof OrganizationMetaData | typeof PlatformConfig).patch({ squareLogo: image }))\n    }\n\n    get squareLogoPlaceholder() {\n        return this.metaData.horizontalLogo ?? this.metaData.squareLogoDark ?? this.metaData.horizontalLogoDark\n    }\n\n    get expandLogo() {\n        return this.metaData.expandLogo\n    }\n\n    set expandLogo(enable: boolean) {\n        this.$emit('patch', (this.metaData.constructor as typeof WebshopMetaData | typeof OrganizationMetaData).patch({ expandLogo: enable }))\n    }\n\n\n    get horizontalLogo() {\n        return this.metaData.horizontalLogo\n    }\n\n    set horizontalLogo(image: Image | null) {\n        this.$emit('patch', (this.metaData.constructor as typeof WebshopMetaData | typeof OrganizationMetaData).patch({ horizontalLogo: image }))\n    }\n\n    get horizontalLogoPlaceholder() {\n        return this.metaData.squareLogo ?? this.metaData.horizontalLogoDark ?? this.metaData.squareLogoDark\n    }\n\n    get squareLogoDark() {\n        return this.metaData.squareLogoDark\n    }\n\n    set squareLogoDark(image: Image | null) {\n        this.$emit('patch', (this.metaData.constructor as typeof WebshopMetaData| typeof OrganizationMetaData).patch({ squareLogoDark: image }))\n    }\n\n    get squareLogoDarkPlaceholder() {\n        return this.metaData.horizontalLogoDark ?? this.metaData.squareLogo ?? this.metaData.horizontalLogo\n    }\n\n    get horizontalLogoDark() {\n        return this.metaData.horizontalLogoDark\n    }\n\n    set horizontalLogoDark(image: Image | null) {\n        this.$emit('patch', (this.metaData.constructor as typeof WebshopMetaData| typeof OrganizationMetaData).patch({ horizontalLogoDark: image }))\n    }\n\n    get horizontalLogoDarkPlaceholder() {\n        return this.metaData.squareLogoDark ?? this.metaData.horizontalLogo ?? this.metaData.squareLogo\n    }\n\n    get squareLogoResolutions() {\n        return [\n            ResolutionRequest.create({\n                height: 50,\n                width: 50,\n                fit: ResolutionFit.Inside\n            }),\n            ResolutionRequest.create({\n                height: 70,\n                width: 70,\n                fit: ResolutionFit.Inside\n            }),\n            ResolutionRequest.create({\n                height: 50*3,\n                width: 50*3,\n                fit: ResolutionFit.Inside\n            }),\n            ResolutionRequest.create({\n                height: 70*3,\n                width: 70*3,\n                fit: ResolutionFit.Inside\n            }),\n            ResolutionRequest.create({\n                height: 70*3,\n                width: 70*3,\n                fit: ResolutionFit.Inside\n            })\n        ]\n    }\n\n    get horizontalLogoResolutions() {\n        return [\n            ResolutionRequest.create({\n                height: 50,\n                width: 300,\n                fit: ResolutionFit.Inside\n            }),\n            ResolutionRequest.create({\n                height: 70,\n                width: 300,\n                fit: ResolutionFit.Inside\n            }),\n            ResolutionRequest.create({\n                height: 50*3,\n                width: 300*3,\n                fit: ResolutionFit.Inside\n            }),\n            ResolutionRequest.create({\n                height: 70*3,\n                width: 300*3,\n                fit: ResolutionFit.Inside\n            }),\n        ]\n    }\n}\n</script>\n","<template>\n    <div class=\"st-view show-seats-view shade\">\n        <STNavigationBar title=\"Jouw plaatsen\" :disableDismiss=\"!allowDismiss\" />\n        <main>\n            <h1>Jouw plaatsen</h1>\n\n            <STList>\n                <STListItem v-if=\"seatDescription.length\">\n                    <div class=\"split-info\">\n                        <div v-for=\"(row, index) in seatDescription\" :key=\"index\">\n                            <h3 class=\"style-definition-label\">\n                                {{ row.title }}\n                            </h3>\n                            <p class=\"style-definition-text\">\n                                {{ row.value }}\n                            </p>\n                        </div>\n                    </div>\n                </STListItem>\n            </STList>\n\n            <hr>\n\n            <SeatSelectionBox \n                v-if=\"seatingPlan && seatingPlanSection\"\n                :allow-changes=\"false\"\n                :seating-plan=\"seatingPlan\"\n                :seating-plan-section=\"seatingPlanSection\"\n                :seats=\"seats\"\n                :reserved-seats=\"reservedSeats\"\n                :highlight-seats=\"highlightSeats\"\n            />\n        </main>\n    </div>\n</template>\n\n\n<script lang=\"ts\">\nimport { NavigationMixin } from '@simonbackx/vue-app-navigation';\nimport { STErrorsDefault, STList, STListItem, STNavigationBar, STToolbar } from '@stamhoofd/components';\nimport { Order, TicketPublic, Webshop } from '@stamhoofd/structures';\nimport { Component, Mixins, Prop } from '@simonbackx/vue-app-navigation/classes';\n\nimport SeatSelectionBox from './SeatSelectionBox.vue';\n\n@Component({\n    components: {\n        STNavigationBar,\n        STToolbar,\n        STErrorsDefault,\n        SeatSelectionBox,\n        STListItem,\n        STList\n    }\n})\nexport default class ShowSeatsView extends Mixins(NavigationMixin){\n    @Prop({ required: true })\n        ticket: TicketPublic\n\n    @Prop({ required: false, default: null })\n        order: Order | null\n\n    @Prop({ required: true })\n        webshop: Webshop\n\n    @Prop({ default: true })\n        allowDismiss: boolean\n\n    get seatingPlanSection() {\n        const plan = this.seatingPlan\n        if (!plan) {\n            return null\n        }\n        const seat = this.ticket.seat\n        if (!seat) {\n            return plan.sections[0]\n        }\n        return plan.sections.find(s => s.id === seat.section) ?? null\n    }\n\n    get seatingPlan() {\n        const id = this.ticket.getSeatingPlanId()\n        return this.webshop.meta.seatingPlans.find(p => p.id === id)\n    }\n\n    get seats() {\n        const seat = this.ticket.seat\n        if (!seat) {\n            return []\n        }\n        return [seat]\n    }\n\n    get seatDescription() {\n        const seat = this.ticket.seat\n        const product =  this.ticket.items[0]?.product\n        if (!seat || !product) {\n            return []\n        }\n        return seat.getName(this.webshop, product)\n    }\n\n    get reservedSeats() {\n        const product = this.ticket.items[0]?.product\n        if (product) {\n            const updatedProduct = this.webshop.products.find(p => p.id === product.id)\n            if (updatedProduct) {\n                return updatedProduct.reservedSeats\n            }\n        }\n        return []\n    }\n\n    get highlightSeats() {\n        // Other seats from this order (if any)\n        if (!this.order) {\n            return []\n        }\n        const product = this.ticket.items[0]?.product\n        if (!product) {\n            return []\n        }\n        return this.order.data.cart.items.filter(i => i.product.seatingPlanId === this.seatingPlan?.id && i.product.id === product.id).flatMap(i => i.seats)\n    }\n}\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use \"@stamhoofd/scss/base/text-styles.scss\" as *;\n\n.sheet .show-seats-view {\n    width: max-content !important;\n    min-width: min(100vw, var(--st-sheet-width, 400px));\n    max-width: 100vw;\n}\n\n.show-seats-view {\n    --st-vertical-padding: 0px;\n}\n</style>","<template>\n    <div class=\"st-view\">\n        <STNavigationBar title=\"Betaling\" />\n\n        <main v-if=\"payment && payment.status === 'Pending' && payment.method === 'DirectDebit'\">\n            <h1>Betaling in verwerking</h1>\n            <p>Jouw betaling is aangevraagd via jouw bank. Het kan tot 5 werkdagen duren voor we een bevestiging van de betaling ontvangen. In tussentijd blijft de betaling de status 'in verwerking' behouden.</p>\n        </main>\n\n        <main v-else-if=\"!payment || payment.status !== 'Failed'\">\n            <h1>Wachten op betaalbevestiging...</h1>\n            <p>We wachten op de betaalbevestiging van de bank. Verlaat deze pagina niet. Dit duurt hooguit 5 minuten.</p>\n\n            <Spinner />\n        </main>\n\n        <main v-else>\n            <h1>Betaling mislukt</h1>\n            <p>De betaling werd geannuleerd of door de bank geweigerd.</p>\n        </main>\n\n        <STToolbar v-if=\"payment && (payment.status === 'Failed' || payment.method === 'Payconiq')\">\n            <template #right>\n                <LoadingButton :loading=\"loading\">\n                    <button class=\"button primary\" type=\"button\" @click=\"retry\">\n                        <span>Opnieuw proberen</span>\n                    </button>\n                </LoadingButton>\n            </template>\n        </STToolbar>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Decoder } from '@simonbackx/simple-encoding';\nimport { Server } from '@simonbackx/simple-networking';\nimport { useNavigationController, usePopup } from '@simonbackx/vue-app-navigation';\nimport { LoadingButton, NavigationActions, Spinner, STNavigationBar, STToolbar, useNavigationActions } from '@stamhoofd/components';\nimport { PaymentGeneral, PaymentStatus } from '@stamhoofd/structures';\nimport { onBeforeUnmount, onMounted, ref } from 'vue';\n\nconst props = withDefaults(defineProps<{\n    paymentId: string;\n    // Try to cancel the payment if still possible\n    cancel?: boolean;\n    server: Server;\n    finishedHandler: (navigationActions: NavigationActions & { popup: ReturnType<typeof usePopup> }, payment: PaymentGeneral | null) => void;\n    errorHandler?: null | ((navigationActions: NavigationActions, error: unknown) => Promise<void> | void);\n}>(), {\n    cancel: false,\n    errorHandler: null,\n});\n\nconst navigationActions = useNavigationActions();\nconst popup = usePopup();\nconst navigationController = useNavigationController();\nconst payment = ref<PaymentGeneral | null>(null);\nconst loading = ref(false);\n\nlet pollCount = 0;\nlet timeout: NodeJS.Timeout | null = null;\nlet didFinish = false;\n\nonMounted(() => {\n    timeout = setTimeout(() => poll(), 200);\n});\n\nfunction retry() {\n    if (confirm('Probeer alleen opnieuw als je zeker bent dat je niet hebt betaald! Anders moet je gewoon even wachten.')) {\n        if (navigationController.value!.components.length > 1) {\n            navigationActions.pop()?.catch(console.error);\n        }\n        else {\n            props.finishedHandler({ ...navigationActions, popup }, payment.value);\n        }\n    }\n}\n\nfunction poll() {\n    timeout = null;\n\n    if (didFinish) {\n        return;\n    }\n    const paymentId = props.paymentId;\n    props.server\n        .request({\n            method: 'POST',\n            path: '/payments/' + paymentId,\n            decoder: PaymentGeneral as Decoder<PaymentGeneral>,\n            query: {\n                cancel: props.cancel,\n            },\n        }).then((response) => {\n            const paymentFromResponse = response.data;\n            payment.value = paymentFromResponse;\n\n            pollCount++;\n\n            if (didFinish) {\n                return;\n            }\n            if (payment.value && (payment.value.status === PaymentStatus.Succeeded || payment.value.status === PaymentStatus.Failed)) {\n                didFinish = true;\n                props.finishedHandler({ ...navigationActions, popup }, payment.value);\n                return;\n            }\n            timeout = setTimeout(() => poll(), 3000 + Math.min(10 * 1000, pollCount * 1000));\n        }).catch((e) => {\n            if (didFinish) {\n                return;\n            }\n            didFinish = true;\n            if (props.errorHandler) {\n                props.errorHandler(navigationActions, e)?.catch(console.error);\n            }\n            else {\n                props.finishedHandler({ ...navigationActions, popup }, payment.value);\n            }\n        });\n}\n\nonBeforeUnmount(() => {\n    if (timeout) {\n        clearTimeout(timeout);\n        timeout = null;\n    }\n});\n</script>\n","export default \"__VITE_ASSET__DTxXz1FT__\"","<template>\n    <div>\n        <p v-if=\"selectedPaymentMethod && getWarning(selectedPaymentMethod)\" class=\"warning-box\">\n            {{ getWarning(selectedPaymentMethod) }}\n        </p>\n\n        <STList class=\"payment-selection-list\">\n            <STListItem v-for=\"paymentMethod in sortedPaymentMethods\" :key=\"paymentMethod\" :selectable=\"true\" element-name=\"label\" class=\"right-stack left-center\">\n                <template #left>\n                    <Radio v-model=\"selectedPaymentMethod\" name=\"choose-payment-method\" :value=\"paymentMethod\" />\n                </template>\n\n                <h2 :class=\"{ 'style-title-list': !!getDescription(paymentMethod) }\">\n                    {{ getName(paymentMethod) }}\n\n                    <span v-if=\"paymentMethod === 'Payconiq' && hasNonPayconiq\" class=\"style-tag inline-first\">Meest gebruikt</span>\n                </h2>\n                <p v-if=\"getDescription(paymentMethod)\" class=\"style-description-small\">\n                    {{ getDescription(paymentMethod) }}\n                </p>\n\n                <div v-if=\"paymentMethod === 'Payconiq'\" class=\"payment-app-banner\">\n                    <img class=\"payment-app-logo\" src=\"@stamhoofd/assets/images/partners/payconiq/app.svg\">\n                    <img class=\"payment-app-logo\" src=\"@stamhoofd/assets/images/partners/kbc/app.svg\">\n                    <img class=\"payment-app-logo\" src=\"@stamhoofd/assets/images/partners/ing/app.svg\">\n                    <img class=\"payment-app-logo\" src=\"@stamhoofd/assets/images/partners/belfius/app.svg\">\n                    <img class=\"payment-app-logo\" src=\"@stamhoofd/assets/images/partners/bnp/app.png\">\n                    <img class=\"payment-app-logo\" src=\"@stamhoofd/assets/images/partners/hello-bank/app.png\">\n                    <img class=\"payment-app-logo\" src=\"@stamhoofd/assets/images/partners/argenta/app.png\">\n                </div>\n\n                <template #right>\n                    <PaymentMethodIcon\n                        v-if=\"(!$isMobile || paymentMethod !== 'Payconiq')\"\n                        :method=\"paymentMethod\"\n                        :type=\"PaymentType.Payment\"\n                    />\n                </template>\n            </STListItem>\n        </STList>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Radio, STList, STListItem } from '@stamhoofd/components';\nimport { Country, Organization, PaymentConfiguration, PaymentCustomer, PaymentMethod, PaymentMethodHelper, PaymentType } from '@stamhoofd/structures';\nimport { computed, onMounted } from 'vue';\nimport PaymentMethodIcon from '../payments/components/PaymentMethodIcon.vue';\n\nconst props = withDefaults(defineProps<{\n    organization: Organization;\n    paymentConfiguration: PaymentConfiguration;\n    context?: null | 'takeout' | 'delivery';\n    amount: number;\n    customer?: PaymentCustomer | null;\n}>(), {\n    context: null,\n    customer: null,\n});\n\nconst selectedPaymentMethod = defineModel<PaymentMethod | null>();\nconst paymentMethods = computed(() => props.paymentConfiguration.getAvailablePaymentMethods({\n    amount: props.amount,\n    customer: props.customer,\n}));\n\nconst sortedPaymentMethods = computed(() => {\n    const methods = paymentMethods.value;\n    const r: PaymentMethod[] = [];\n\n    // Force a given ordering\n    if (methods.includes(PaymentMethod.iDEAL) && props.organization.address.country === Country.Netherlands) {\n        r.push(PaymentMethod.iDEAL);\n    }\n\n    // Force a given ordering\n    if (methods.includes(PaymentMethod.Payconiq)) {\n        r.push(PaymentMethod.Payconiq);\n    }\n\n    // Force a given ordering\n    if (methods.includes(PaymentMethod.Bancontact)) {\n        r.push(PaymentMethod.Bancontact);\n    }\n\n    // Force a given ordering\n    if (methods.includes(PaymentMethod.iDEAL) && props.organization.address.country !== Country.Netherlands) {\n        r.push(PaymentMethod.iDEAL);\n    }\n\n    // Force a given ordering\n    if (methods.includes(PaymentMethod.CreditCard)) {\n        r.push(PaymentMethod.CreditCard);\n    }\n\n    // Force a given ordering\n    if (methods.includes(PaymentMethod.Transfer)) {\n        r.push(PaymentMethod.Transfer);\n    }\n\n    // Others\n    r.push(...methods.filter(p => p !== PaymentMethod.Payconiq && p !== PaymentMethod.Bancontact && p !== PaymentMethod.iDEAL && p !== PaymentMethod.CreditCard && p !== PaymentMethod.Transfer));\n\n    return r;\n});\n\nonMounted(() => {\n    if (!selectedPaymentMethod.value || selectedPaymentMethod.value === PaymentMethod.Unknown || !paymentMethods.value.includes(selectedPaymentMethod.value)) {\n        selectedPaymentMethod.value = sortedPaymentMethods.value[0] ?? null;\n    }\n});\n\nconst hasNonPayconiq = computed(() => {\n    const hasTransfer = paymentMethods.value.includes(PaymentMethod.Transfer) ? 1 : 0;\n    const hasPOS = paymentMethods.value.includes(PaymentMethod.PointOfSale) ? 1 : 0;\n    return paymentMethods.value.length > 1 || !!hasTransfer || !!hasPOS;\n});\n\nfunction getName(paymentMethod: PaymentMethod): string {\n    switch (paymentMethod) {\n        case PaymentMethod.Payconiq: return 'Payconiq by Bancontact';\n        case PaymentMethod.Transfer: return 'Via overschrijving';\n        case PaymentMethod.DirectDebit: return 'Domiciliëring';\n    }\n    return PaymentMethodHelper.getNameCapitalized(paymentMethod, props.context);\n}\n\nfunction getDescription(paymentMethod: PaymentMethod): string {\n    switch (paymentMethod) {\n        case PaymentMethod.Payconiq: return 'Betaal met de Payconiq by Bancontact app, de KBC-app, Belfius, BNP Paribas Fortis, ING-app, Fintro, Hello bank!, Argenta of Crelan app';\n        case PaymentMethod.Transfer: return 'Betaalbevestiging kan enkele dagen duren';\n        case PaymentMethod.Bancontact: return props.organization.address.country === Country.Belgium ? '' : '';\n        case PaymentMethod.iDEAL: return props.organization.address.country === Country.Netherlands ? 'Meest gebruikte betaalmethode.' : '';\n        case PaymentMethod.Unknown: return '';\n        case PaymentMethod.DirectDebit: return 'Betaalbevestiging kan 5 werkdagen duren';\n        case PaymentMethod.CreditCard: return '';\n        case PaymentMethod.PointOfSale: return '';\n    }\n}\n\nfunction getWarning(paymentMethod: PaymentMethod): string {\n    const settings = props.paymentConfiguration.paymentMethodSettings.get(paymentMethod);\n    if (settings) {\n        if (settings.warningText) {\n            if (settings.warningAmount === null || settings.warningAmount <= props.amount) {\n                return settings.warningText;\n            }\n        }\n    }\n    return '';\n}\n\n</script>\n\n<style lang=\"scss\">\n.payment-selection-list {\n    .payment-method-logo {\n        max-height: 30px;\n\n        &.bancontact {\n            max-height: 38px;\n            margin: -4px 0 !important; // Fix white borders in bancontact logo\n        }\n    }\n\n    .payment-app-logo {\n        height: 28px;\n        width: 28px;\n    }\n\n    .payment-app-banner {\n        display: flex;\n        flex-direction: row;\n        padding-top: 10px;\n\n        > * {\n            margin-right: 5px\n        }\n    }\n}\n\n</style>\n","import { ColorHelper } from '@stamhoofd/components';\nimport { Colors, Formatter } from '@stamhoofd/utility';\nimport type { ObjectDirective } from \"vue\";\n\nexport const ColorDirective: ObjectDirective<HTMLElement> = {\n    // called right before the element is inserted into the DOM.\n    beforeMount(el, binding) {\n        if (!binding.value) {\n            return;\n        }\n        const id = typeof binding.value === \"string\" ? binding.value : binding.value.id;\n        el.classList.add(\"st-color-directive\"); // Fixes dark mode colors\n\n        if (id.startsWith(\"#\")) {\n            return ColorHelper.setColor(id, el)\n        }\n\n        const hue = Formatter.stringToNumber(id, 360);\n        const color = Colors.hslToHex({\n            h: hue,\n            s: 100,\n            l: 20\n        });\n    \n        ColorHelper.setColor(color, el)\n    }\n}\n","import type { ObjectDirective } from 'vue';\n\nexport function formatInput(input: HTMLInputElement, cleaner: (value: string) => string, formatter: (value: string) => string) {\n    if (input.selectionStart === null) {\n        input.value = formatter(cleaner(input.value));\n        return;\n    }\n\n    if (input.selectionStart !== input.selectionEnd) {\n        return;\n    }\n\n    let formatted = formatter(cleaner(input.value));\n    if (cleaner(formatted) !== cleaner(input.value)) {\n        console.warn('[formatInput] Formatted value removed or added extra characters that are not cleaned');\n        formatted = cleaner(input.value);\n    }\n\n    const before = input.value.substring(0, input.selectionStart);\n    const cleanedBefore = cleaner(before);\n    const cleanedSelectionStart = cleanedBefore.length;\n\n    // Find the next selection start within the new formatted string\n    let newSelectionStart = 0;\n    let count = 0;\n\n    for (let i = 0; i < formatted.length; i++) {\n        const char = formatted[i];\n\n        if (cleaner(char).length === 0) {\n            continue;\n        }\n\n        count += 1;\n\n        if (count === cleanedSelectionStart) {\n            newSelectionStart = i + 1;\n            break;\n        }\n    }\n\n    input.value = formatted;\n    input.setSelectionRange(newSelectionStart, newSelectionStart);\n}\n\ntype FormatterDefinition = {\n    cleaner: (value: string) => string;\n    formatter: (value: string) => string;\n};\n\nexport const FormatInputDirective: ObjectDirective<HTMLInputElement, FormatterDefinition> = {\n    mounted(el: HTMLInputElement, binding) {\n        el.addEventListener('input', () => {\n            if (!binding.value) {\n                return;\n            }\n\n            formatInput(el, binding.value.cleaner, binding.value.formatter);\n        }, { capture: true });\n    },\n};\n","import { Request } from '@simonbackx/simple-networking';\nimport { injectHooks, useCurrentComponent, useUrl } from '@simonbackx/vue-app-navigation';\nimport { AppManager } from '@stamhoofd/networking';\nimport { CountryHelper } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { type App } from 'vue';\n\nimport { LocalizedDomains } from '@stamhoofd/frontend-i18n';\nimport { Checkbox, CopyableDirective, GlobalEventBus, LoadingButton, LoadingView, LongPressDirective, Radio, SaveView, Spinner, STList, STToolbar, TooltipDirective, useAppContext } from '..';\nimport PromiseView from './containers/PromiseView.vue';\nimport { ColorDirective } from './directives/ColorDirective';\nimport { FormatInputDirective } from './directives/FormatInputDirective';\nimport STErrorsDefault from './errors/STErrorsDefault.vue';\nimport { useContext, useFeatureFlag, useOrganization, usePlatform, useUser } from './hooks';\nimport STInputBox from './inputs/STInputBox.vue';\nimport STListItem from './layout/STListItem.vue';\nimport STNavigationBar from './navigation/STNavigationBar.vue';\n\nexport type ComponentExposed<T> =\n\tT extends new (...args: any[]) => infer E ? E :\n\t    T extends ((props: any, ctx: any, expose: (exposed: infer E) => any, ...args: any[]) => any) ? NonNullable<E> :\n\t        object;\n\n/**\n * Return false if it should not cancel the default behaviour\n */\nfunction focusNextElement() {\n    const activeElement = document.activeElement as HTMLInputElement | undefined;\n    if (!activeElement) {\n        return false;\n    }\n\n    // add all elements we want to include in our selection\n    const focussableElements = 'input:not([disabled]), textarea:not([disabled]), select:not([disabled]), button[type=\"submit\"], button:not([type=\"button\"])';\n    if (activeElement && activeElement.form) {\n        const focussable = Array.prototype.filter.call(activeElement.form.querySelectorAll(focussableElements),\n            function (element) {\n            // check for visibility while always include the current activeElement\n                return element.offsetWidth > 0 || element.offsetHeight > 0 || element === activeElement;\n            });\n        const index = focussable.indexOf(activeElement);\n        if (index > -1) {\n            const nextElement = focussable[index + 1];\n            if (!nextElement) {\n                if (activeElement.form.hasAttribute('data-submit-last-field')) {\n                    // don't blur, or the default handler won't work\n                    return false;\n                }\n\n                // On mobile, we'll just blur the last element and not submit, while on desktop we'll focus the submit button (which will be last)\n                activeElement.blur();\n                return true;\n            }\n\n            if (nextElement.tagName === 'BUTTON') {\n                if (activeElement.form.hasAttribute('data-submit-last-field')) {\n                    // don't blur, or the default handler won't work\n                    return false;\n                }\n\n                if (('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || ((navigator as any).msMaxTouchPoints > 0)) {\n                    // Don't focus buttons on mobile\n                    activeElement.blur();\n                    return true;\n                }\n\n                // If the next element is a button, we'll add the class .focus-visible to it, as Safari doesn't support the :focus-visible pseudo-class on buttons\n                nextElement.classList.add('focus-visible');\n\n                // And we'll remove it again on blur, once\n                nextElement.addEventListener('blur', function () {\n                    nextElement.classList.remove('focus-visible');\n                }, { once: true });\n            }\n\n            nextElement.focus();\n        }\n    }\n    return true;\n}\n\nexport class VueGlobalHelper {\n    static setup(app: App<Element>) {\n        (window as any).PromiseComponent = PromiseView;\n        app.config.globalProperties.$country = 'BE'; // todo\n        app.config.globalProperties.$isMobile = document.documentElement.clientWidth <= 550 || document.documentElement.clientHeight <= 400;\n        app.config.globalProperties.$focusNext = () => {\n            focusNextElement();\n        };\n\n        app.config.globalProperties.$OS = AppManager.shared.getOS();\n        app.config.globalProperties.$isNative = AppManager.shared.isNative;\n        app.config.globalProperties.$isTouch = ('ontouchstart' in window) || (navigator.maxTouchPoints > 0) || ((navigator as any).msMaxTouchPoints > 0);\n\n        app.config.globalProperties.$isAndroid = app.config.globalProperties.$OS === 'android';\n        app.config.globalProperties.$isIOS = app.config.globalProperties.$OS === 'iOS';\n        app.config.globalProperties.$isMac = app.config.globalProperties.$OS === 'macOS';\n        app.config.globalProperties.STAMHOOFD = STAMHOOFD;\n        app.config.globalProperties.$domains = LocalizedDomains;\n\n        app.config.globalProperties.pluralText = function (num: number, singular: string, plural: string) {\n            return Formatter.pluralText(num, singular, plural);\n        };\n\n        app.config.warnHandler = function (msg, instance, trace) {\n            // Shorter error message because the trace is complete garbage\n            console.warn(msg, instance);\n        };\n\n        // Register shared components\n        app.component('STList', STList);\n        app.component('STListItem', STListItem);\n        app.component('STNavigationBar', STNavigationBar);\n        app.component('STInputBox', STInputBox);\n        app.component('STErrorsDefault', STErrorsDefault);\n        app.component('SaveView', SaveView);\n        app.component('Checkbox', Checkbox);\n        app.component('Radio', Radio);\n        app.component('LoadingView', LoadingView);\n        app.component('LoadingButton', LoadingButton);\n        app.component('STToolbar', STToolbar);\n        app.component('Spinner', Spinner);\n\n        document.addEventListener('keydown', (event) => {\n            const element = event.target as HTMLInputElement;\n            if (element && (element.tagName === 'INPUT' || element.tagName === 'SELECT') && element.form && !element.closest('[data-disable-enter-focus]')) {\n                if (event.which === 13) {\n                    if (focusNextElement() === true) {\n                        event.preventDefault();\n                    }\n                }\n            }\n        });\n\n        if (app.config.globalProperties.$OS === 'android') {\n            document.addEventListener('touchstart', (event) => {\n                const target = event.target as HTMLElement;\n                if (target && target.tagName === 'BUTTON') {\n                    target.classList.add('active');\n\n                    window.setTimeout(() => {\n                        target.classList.remove('active');\n                    }, 250);\n                }\n            }, { passive: true });\n        }\n\n        app.mixin({\n            directives: {\n                tooltip: TooltipDirective,\n                copyable: CopyableDirective,\n                LongPress: LongPressDirective,\n                color: ColorDirective,\n                formatInput: FormatInputDirective,\n            },\n            filters: {\n                price: Formatter.price.bind(Formatter),\n                date: Formatter.date.bind(Formatter),\n                dateTime: Formatter.dateTime.bind(Formatter),\n            },\n            inject: {\n                $context: {\n                    default: function () {\n                        return null;\n                    },\n                },\n                $organizationManager: {\n                    default: function () {\n                        return null;\n                    },\n                },\n                $memberManager: {\n                    default: function () {\n                        return null;\n                    },\n                },\n                $webshopManager: {\n                    default: function () {\n                        return null;\n                    },\n                },\n                $checkoutManager: {\n                    default: function () {\n                        return null;\n                    },\n                },\n                urlPrefix: {\n                    from: 'urlPrefix',\n                    default: function () {\n                        return null;\n                    },\n                },\n            },\n            beforeUnmount() {\n                // Clear all pending requests\n                GlobalEventBus.removeListener(this);\n                Request.cancelAll(this);\n            },\n            created() {\n                const directives = {\n                    currentComponent: useCurrentComponent(),\n                    $url: useUrl(),\n                    $user: useUser(),\n                    $organization: useOrganization(),\n                    $context: useContext(),\n                    $platform: usePlatform(),\n                    $app: useAppContext(),\n                    $feature: useFeatureFlag(),\n                };\n\n                injectHooks(this, directives);\n            },\n            methods: {\n                formatPrice: Formatter.price.bind(Formatter),\n                formatDate: Formatter.date.bind(Formatter),\n                formatDateRange: Formatter.dateRange.bind(Formatter),\n                formatStartDate: Formatter.startDate.bind(Formatter),\n                formatEndDate: Formatter.endDate.bind(Formatter),\n                formatDateTime: Formatter.dateTime.bind(Formatter),\n                formatPriceChange: Formatter.priceChange.bind(Formatter),\n                formatMinutes: Formatter.minutes.bind(Formatter),\n                capitalizeFirstLetter: Formatter.capitalizeFirstLetter.bind(Formatter),\n                formatDateWithDay: Formatter.dateWithDay.bind(Formatter),\n                formatTime: Formatter.time.bind(Formatter),\n                setUrl(url: string, title?: string) {\n                    console.warn('old usage of this.setUrl, change to $url.setTitle and move url definitions to parent components');\n                },\n                formatCountry: CountryHelper.getName.bind(CountryHelper),\n                formatInteger: Formatter.integer.bind(Formatter),\n                formatFloat: Formatter.float.bind(Formatter),\n                pluralText: Formatter.pluralText.bind(Formatter),\n            },\n        });\n    }\n}\n","/*!\n * Chart.js v3.9.1\n * https://www.chartjs.org\n * (c) 2022 Chart.js Contributors\n * Released under the MIT License\n */\nfunction noop() {}\nconst uid = (function() {\n  let id = 0;\n  return function() {\n    return id++;\n  };\n}());\nfunction isNullOrUndef(value) {\n  return value === null || typeof value === 'undefined';\n}\nfunction isArray(value) {\n  if (Array.isArray && Array.isArray(value)) {\n    return true;\n  }\n  const type = Object.prototype.toString.call(value);\n  if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n    return true;\n  }\n  return false;\n}\nfunction isObject(value) {\n  return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\nconst isNumberFinite = (value) => (typeof value === 'number' || value instanceof Number) && isFinite(+value);\nfunction finiteOrDefault(value, defaultValue) {\n  return isNumberFinite(value) ? value : defaultValue;\n}\nfunction valueOrDefault(value, defaultValue) {\n  return typeof value === 'undefined' ? defaultValue : value;\n}\nconst toPercentage = (value, dimension) =>\n  typeof value === 'string' && value.endsWith('%') ?\n    parseFloat(value) / 100\n    : value / dimension;\nconst toDimension = (value, dimension) =>\n  typeof value === 'string' && value.endsWith('%') ?\n    parseFloat(value) / 100 * dimension\n    : +value;\nfunction callback(fn, args, thisArg) {\n  if (fn && typeof fn.call === 'function') {\n    return fn.apply(thisArg, args);\n  }\n}\nfunction each(loopable, fn, thisArg, reverse) {\n  let i, len, keys;\n  if (isArray(loopable)) {\n    len = loopable.length;\n    if (reverse) {\n      for (i = len - 1; i >= 0; i--) {\n        fn.call(thisArg, loopable[i], i);\n      }\n    } else {\n      for (i = 0; i < len; i++) {\n        fn.call(thisArg, loopable[i], i);\n      }\n    }\n  } else if (isObject(loopable)) {\n    keys = Object.keys(loopable);\n    len = keys.length;\n    for (i = 0; i < len; i++) {\n      fn.call(thisArg, loopable[keys[i]], keys[i]);\n    }\n  }\n}\nfunction _elementsEqual(a0, a1) {\n  let i, ilen, v0, v1;\n  if (!a0 || !a1 || a0.length !== a1.length) {\n    return false;\n  }\n  for (i = 0, ilen = a0.length; i < ilen; ++i) {\n    v0 = a0[i];\n    v1 = a1[i];\n    if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction clone$1(source) {\n  if (isArray(source)) {\n    return source.map(clone$1);\n  }\n  if (isObject(source)) {\n    const target = Object.create(null);\n    const keys = Object.keys(source);\n    const klen = keys.length;\n    let k = 0;\n    for (; k < klen; ++k) {\n      target[keys[k]] = clone$1(source[keys[k]]);\n    }\n    return target;\n  }\n  return source;\n}\nfunction isValidKey(key) {\n  return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\nfunction _merger(key, target, source, options) {\n  if (!isValidKey(key)) {\n    return;\n  }\n  const tval = target[key];\n  const sval = source[key];\n  if (isObject(tval) && isObject(sval)) {\n    merge(tval, sval, options);\n  } else {\n    target[key] = clone$1(sval);\n  }\n}\nfunction merge(target, source, options) {\n  const sources = isArray(source) ? source : [source];\n  const ilen = sources.length;\n  if (!isObject(target)) {\n    return target;\n  }\n  options = options || {};\n  const merger = options.merger || _merger;\n  for (let i = 0; i < ilen; ++i) {\n    source = sources[i];\n    if (!isObject(source)) {\n      continue;\n    }\n    const keys = Object.keys(source);\n    for (let k = 0, klen = keys.length; k < klen; ++k) {\n      merger(keys[k], target, source, options);\n    }\n  }\n  return target;\n}\nfunction mergeIf(target, source) {\n  return merge(target, source, {merger: _mergerIf});\n}\nfunction _mergerIf(key, target, source) {\n  if (!isValidKey(key)) {\n    return;\n  }\n  const tval = target[key];\n  const sval = source[key];\n  if (isObject(tval) && isObject(sval)) {\n    mergeIf(tval, sval);\n  } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n    target[key] = clone$1(sval);\n  }\n}\nfunction _deprecated(scope, value, previous, current) {\n  if (value !== undefined) {\n    console.warn(scope + ': \"' + previous +\n\t\t\t'\" is deprecated. Please use \"' + current + '\" instead');\n  }\n}\nconst keyResolvers = {\n  '': v => v,\n  x: o => o.x,\n  y: o => o.y\n};\nfunction resolveObjectKey(obj, key) {\n  const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n  return resolver(obj);\n}\nfunction _getKeyResolver(key) {\n  const keys = _splitKey(key);\n  return obj => {\n    for (const k of keys) {\n      if (k === '') {\n        break;\n      }\n      obj = obj && obj[k];\n    }\n    return obj;\n  };\n}\nfunction _splitKey(key) {\n  const parts = key.split('.');\n  const keys = [];\n  let tmp = '';\n  for (const part of parts) {\n    tmp += part;\n    if (tmp.endsWith('\\\\')) {\n      tmp = tmp.slice(0, -1) + '.';\n    } else {\n      keys.push(tmp);\n      tmp = '';\n    }\n  }\n  return keys;\n}\nfunction _capitalize(str) {\n  return str.charAt(0).toUpperCase() + str.slice(1);\n}\nconst defined = (value) => typeof value !== 'undefined';\nconst isFunction = (value) => typeof value === 'function';\nconst setsEqual = (a, b) => {\n  if (a.size !== b.size) {\n    return false;\n  }\n  for (const item of a) {\n    if (!b.has(item)) {\n      return false;\n    }\n  }\n  return true;\n};\nfunction _isClickEvent(e) {\n  return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n\nconst PI = Math.PI;\nconst TAU = 2 * PI;\nconst PITAU = TAU + PI;\nconst INFINITY = Number.POSITIVE_INFINITY;\nconst RAD_PER_DEG = PI / 180;\nconst HALF_PI = PI / 2;\nconst QUARTER_PI = PI / 4;\nconst TWO_THIRDS_PI = PI * 2 / 3;\nconst log10 = Math.log10;\nconst sign = Math.sign;\nfunction niceNum(range) {\n  const roundedRange = Math.round(range);\n  range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n  const niceRange = Math.pow(10, Math.floor(log10(range)));\n  const fraction = range / niceRange;\n  const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n  return niceFraction * niceRange;\n}\nfunction _factorize(value) {\n  const result = [];\n  const sqrt = Math.sqrt(value);\n  let i;\n  for (i = 1; i < sqrt; i++) {\n    if (value % i === 0) {\n      result.push(i);\n      result.push(value / i);\n    }\n  }\n  if (sqrt === (sqrt | 0)) {\n    result.push(sqrt);\n  }\n  result.sort((a, b) => a - b).pop();\n  return result;\n}\nfunction isNumber(n) {\n  return !isNaN(parseFloat(n)) && isFinite(n);\n}\nfunction almostEquals(x, y, epsilon) {\n  return Math.abs(x - y) < epsilon;\n}\nfunction almostWhole(x, epsilon) {\n  const rounded = Math.round(x);\n  return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\nfunction _setMinAndMaxByKey(array, target, property) {\n  let i, ilen, value;\n  for (i = 0, ilen = array.length; i < ilen; i++) {\n    value = array[i][property];\n    if (!isNaN(value)) {\n      target.min = Math.min(target.min, value);\n      target.max = Math.max(target.max, value);\n    }\n  }\n}\nfunction toRadians(degrees) {\n  return degrees * (PI / 180);\n}\nfunction toDegrees(radians) {\n  return radians * (180 / PI);\n}\nfunction _decimalPlaces(x) {\n  if (!isNumberFinite(x)) {\n    return;\n  }\n  let e = 1;\n  let p = 0;\n  while (Math.round(x * e) / e !== x) {\n    e *= 10;\n    p++;\n  }\n  return p;\n}\nfunction getAngleFromPoint(centrePoint, anglePoint) {\n  const distanceFromXCenter = anglePoint.x - centrePoint.x;\n  const distanceFromYCenter = anglePoint.y - centrePoint.y;\n  const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n  let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n  if (angle < (-0.5 * PI)) {\n    angle += TAU;\n  }\n  return {\n    angle,\n    distance: radialDistanceFromCenter\n  };\n}\nfunction distanceBetweenPoints(pt1, pt2) {\n  return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\nfunction _angleDiff(a, b) {\n  return (a - b + PITAU) % TAU - PI;\n}\nfunction _normalizeAngle(a) {\n  return (a % TAU + TAU) % TAU;\n}\nfunction _angleBetween(angle, start, end, sameAngleIsFullCircle) {\n  const a = _normalizeAngle(angle);\n  const s = _normalizeAngle(start);\n  const e = _normalizeAngle(end);\n  const angleToStart = _normalizeAngle(s - a);\n  const angleToEnd = _normalizeAngle(e - a);\n  const startToAngle = _normalizeAngle(a - s);\n  const endToAngle = _normalizeAngle(a - e);\n  return a === s || a === e || (sameAngleIsFullCircle && s === e)\n    || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\nfunction _limitValue(value, min, max) {\n  return Math.max(min, Math.min(max, value));\n}\nfunction _int16Range(value) {\n  return _limitValue(value, -32768, 32767);\n}\nfunction _isBetween(value, start, end, epsilon = 1e-6) {\n  return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n\nfunction _lookup(table, value, cmp) {\n  cmp = cmp || ((index) => table[index] < value);\n  let hi = table.length - 1;\n  let lo = 0;\n  let mid;\n  while (hi - lo > 1) {\n    mid = (lo + hi) >> 1;\n    if (cmp(mid)) {\n      lo = mid;\n    } else {\n      hi = mid;\n    }\n  }\n  return {lo, hi};\n}\nconst _lookupByKey = (table, key, value, last) =>\n  _lookup(table, value, last\n    ? index => table[index][key] <= value\n    : index => table[index][key] < value);\nconst _rlookupByKey = (table, key, value) =>\n  _lookup(table, value, index => table[index][key] >= value);\nfunction _filterBetween(values, min, max) {\n  let start = 0;\n  let end = values.length;\n  while (start < end && values[start] < min) {\n    start++;\n  }\n  while (end > start && values[end - 1] > max) {\n    end--;\n  }\n  return start > 0 || end < values.length\n    ? values.slice(start, end)\n    : values;\n}\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\nfunction listenArrayEvents(array, listener) {\n  if (array._chartjs) {\n    array._chartjs.listeners.push(listener);\n    return;\n  }\n  Object.defineProperty(array, '_chartjs', {\n    configurable: true,\n    enumerable: false,\n    value: {\n      listeners: [listener]\n    }\n  });\n  arrayEvents.forEach((key) => {\n    const method = '_onData' + _capitalize(key);\n    const base = array[key];\n    Object.defineProperty(array, key, {\n      configurable: true,\n      enumerable: false,\n      value(...args) {\n        const res = base.apply(this, args);\n        array._chartjs.listeners.forEach((object) => {\n          if (typeof object[method] === 'function') {\n            object[method](...args);\n          }\n        });\n        return res;\n      }\n    });\n  });\n}\nfunction unlistenArrayEvents(array, listener) {\n  const stub = array._chartjs;\n  if (!stub) {\n    return;\n  }\n  const listeners = stub.listeners;\n  const index = listeners.indexOf(listener);\n  if (index !== -1) {\n    listeners.splice(index, 1);\n  }\n  if (listeners.length > 0) {\n    return;\n  }\n  arrayEvents.forEach((key) => {\n    delete array[key];\n  });\n  delete array._chartjs;\n}\nfunction _arrayUnique(items) {\n  const set = new Set();\n  let i, ilen;\n  for (i = 0, ilen = items.length; i < ilen; ++i) {\n    set.add(items[i]);\n  }\n  if (set.size === ilen) {\n    return items;\n  }\n  return Array.from(set);\n}\n\nfunction fontString(pixelSize, fontStyle, fontFamily) {\n  return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\nconst requestAnimFrame = (function() {\n  if (typeof window === 'undefined') {\n    return function(callback) {\n      return callback();\n    };\n  }\n  return window.requestAnimationFrame;\n}());\nfunction throttled(fn, thisArg, updateFn) {\n  const updateArgs = updateFn || ((args) => Array.prototype.slice.call(args));\n  let ticking = false;\n  let args = [];\n  return function(...rest) {\n    args = updateArgs(rest);\n    if (!ticking) {\n      ticking = true;\n      requestAnimFrame.call(window, () => {\n        ticking = false;\n        fn.apply(thisArg, args);\n      });\n    }\n  };\n}\nfunction debounce(fn, delay) {\n  let timeout;\n  return function(...args) {\n    if (delay) {\n      clearTimeout(timeout);\n      timeout = setTimeout(fn, delay, args);\n    } else {\n      fn.apply(this, args);\n    }\n    return delay;\n  };\n}\nconst _toLeftRightCenter = (align) => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\nconst _alignStartEnd = (align, start, end) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\nconst _textX = (align, left, right, rtl) => {\n  const check = rtl ? 'left' : 'right';\n  return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\nfunction _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled) {\n  const pointCount = points.length;\n  let start = 0;\n  let count = pointCount;\n  if (meta._sorted) {\n    const {iScale, _parsed} = meta;\n    const axis = iScale.axis;\n    const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n    if (minDefined) {\n      start = _limitValue(Math.min(\n        _lookupByKey(_parsed, iScale.axis, min).lo,\n        animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo),\n      0, pointCount - 1);\n    }\n    if (maxDefined) {\n      count = _limitValue(Math.max(\n        _lookupByKey(_parsed, iScale.axis, max, true).hi + 1,\n        animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1),\n      start, pointCount) - start;\n    } else {\n      count = pointCount - start;\n    }\n  }\n  return {start, count};\n}\nfunction _scaleRangesChanged(meta) {\n  const {xScale, yScale, _scaleRanges} = meta;\n  const newRanges = {\n    xmin: xScale.min,\n    xmax: xScale.max,\n    ymin: yScale.min,\n    ymax: yScale.max\n  };\n  if (!_scaleRanges) {\n    meta._scaleRanges = newRanges;\n    return true;\n  }\n  const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n  Object.assign(_scaleRanges, newRanges);\n  return changed;\n}\n\nconst atEdge = (t) => t === 0 || t === 1;\nconst elasticIn = (t, s, p) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t, s, p) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\nconst effects = {\n  linear: t => t,\n  easeInQuad: t => t * t,\n  easeOutQuad: t => -t * (t - 2),\n  easeInOutQuad: t => ((t /= 0.5) < 1)\n    ? 0.5 * t * t\n    : -0.5 * ((--t) * (t - 2) - 1),\n  easeInCubic: t => t * t * t,\n  easeOutCubic: t => (t -= 1) * t * t + 1,\n  easeInOutCubic: t => ((t /= 0.5) < 1)\n    ? 0.5 * t * t * t\n    : 0.5 * ((t -= 2) * t * t + 2),\n  easeInQuart: t => t * t * t * t,\n  easeOutQuart: t => -((t -= 1) * t * t * t - 1),\n  easeInOutQuart: t => ((t /= 0.5) < 1)\n    ? 0.5 * t * t * t * t\n    : -0.5 * ((t -= 2) * t * t * t - 2),\n  easeInQuint: t => t * t * t * t * t,\n  easeOutQuint: t => (t -= 1) * t * t * t * t + 1,\n  easeInOutQuint: t => ((t /= 0.5) < 1)\n    ? 0.5 * t * t * t * t * t\n    : 0.5 * ((t -= 2) * t * t * t * t + 2),\n  easeInSine: t => -Math.cos(t * HALF_PI) + 1,\n  easeOutSine: t => Math.sin(t * HALF_PI),\n  easeInOutSine: t => -0.5 * (Math.cos(PI * t) - 1),\n  easeInExpo: t => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n  easeOutExpo: t => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n  easeInOutExpo: t => atEdge(t) ? t : t < 0.5\n    ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n    : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n  easeInCirc: t => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n  easeOutCirc: t => Math.sqrt(1 - (t -= 1) * t),\n  easeInOutCirc: t => ((t /= 0.5) < 1)\n    ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n    : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n  easeInElastic: t => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n  easeOutElastic: t => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n  easeInOutElastic(t) {\n    const s = 0.1125;\n    const p = 0.45;\n    return atEdge(t) ? t :\n      t < 0.5\n        ? 0.5 * elasticIn(t * 2, s, p)\n        : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n  },\n  easeInBack(t) {\n    const s = 1.70158;\n    return t * t * ((s + 1) * t - s);\n  },\n  easeOutBack(t) {\n    const s = 1.70158;\n    return (t -= 1) * t * ((s + 1) * t + s) + 1;\n  },\n  easeInOutBack(t) {\n    let s = 1.70158;\n    if ((t /= 0.5) < 1) {\n      return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n    }\n    return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n  },\n  easeInBounce: t => 1 - effects.easeOutBounce(1 - t),\n  easeOutBounce(t) {\n    const m = 7.5625;\n    const d = 2.75;\n    if (t < (1 / d)) {\n      return m * t * t;\n    }\n    if (t < (2 / d)) {\n      return m * (t -= (1.5 / d)) * t + 0.75;\n    }\n    if (t < (2.5 / d)) {\n      return m * (t -= (2.25 / d)) * t + 0.9375;\n    }\n    return m * (t -= (2.625 / d)) * t + 0.984375;\n  },\n  easeInOutBounce: t => (t < 0.5)\n    ? effects.easeInBounce(t * 2) * 0.5\n    : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n};\n\n/*!\n * @kurkle/color v0.2.1\n * https://github.com/kurkle/color#readme\n * (c) 2022 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n  return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n  return lim(round(v * 2.55), 0, 255);\n}\nfunction n2b(v) {\n  return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n  return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n  return lim(round(v * 100), 0, 100);\n}\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n  var len = str.length;\n  var ret;\n  if (str[0] === '#') {\n    if (len === 4 || len === 5) {\n      ret = {\n        r: 255 & map$1[str[1]] * 17,\n        g: 255 & map$1[str[2]] * 17,\n        b: 255 & map$1[str[3]] * 17,\n        a: len === 5 ? map$1[str[4]] * 17 : 255\n      };\n    } else if (len === 7 || len === 9) {\n      ret = {\n        r: map$1[str[1]] << 4 | map$1[str[2]],\n        g: map$1[str[3]] << 4 | map$1[str[4]],\n        b: map$1[str[5]] << 4 | map$1[str[6]],\n        a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n      };\n    }\n  }\n  return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n  var f = isShort(v) ? h1 : h2;\n  return v\n    ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n    : undefined;\n}\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n  const a = s * Math.min(l, 1 - l);\n  const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n  return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n  const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n  return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n  const rgb = hsl2rgbn(h, 1, 0.5);\n  let i;\n  if (w + b > 1) {\n    i = 1 / (w + b);\n    w *= i;\n    b *= i;\n  }\n  for (i = 0; i < 3; i++) {\n    rgb[i] *= 1 - w - b;\n    rgb[i] += w;\n  }\n  return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n  if (r === max) {\n    return ((g - b) / d) + (g < b ? 6 : 0);\n  }\n  if (g === max) {\n    return (b - r) / d + 2;\n  }\n  return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n  const range = 255;\n  const r = v.r / range;\n  const g = v.g / range;\n  const b = v.b / range;\n  const max = Math.max(r, g, b);\n  const min = Math.min(r, g, b);\n  const l = (max + min) / 2;\n  let h, s, d;\n  if (max !== min) {\n    d = max - min;\n    s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n    h = hueValue(r, g, b, d, max);\n    h = h * 60 + 0.5;\n  }\n  return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n  return (\n    Array.isArray(a)\n      ? f(a[0], a[1], a[2])\n      : f(a, b, c)\n  ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n  return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n  return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n  return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n  return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n  const m = HUE_RE.exec(str);\n  let a = 255;\n  let v;\n  if (!m) {\n    return;\n  }\n  if (m[5] !== v) {\n    a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n  }\n  const h = hue(+m[2]);\n  const p1 = +m[3] / 100;\n  const p2 = +m[4] / 100;\n  if (m[1] === 'hwb') {\n    v = hwb2rgb(h, p1, p2);\n  } else if (m[1] === 'hsv') {\n    v = hsv2rgb(h, p1, p2);\n  } else {\n    v = hsl2rgb(h, p1, p2);\n  }\n  return {\n    r: v[0],\n    g: v[1],\n    b: v[2],\n    a: a\n  };\n}\nfunction rotate(v, deg) {\n  var h = rgb2hsl(v);\n  h[0] = hue(h[0] + deg);\n  h = hsl2rgb(h);\n  v.r = h[0];\n  v.g = h[1];\n  v.b = h[2];\n}\nfunction hslString(v) {\n  if (!v) {\n    return;\n  }\n  const a = rgb2hsl(v);\n  const h = a[0];\n  const s = n2p(a[1]);\n  const l = n2p(a[2]);\n  return v.a < 255\n    ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n    : `hsl(${h}, ${s}%, ${l}%)`;\n}\nconst map = {\n  x: 'dark',\n  Z: 'light',\n  Y: 're',\n  X: 'blu',\n  W: 'gr',\n  V: 'medium',\n  U: 'slate',\n  A: 'ee',\n  T: 'ol',\n  S: 'or',\n  B: 'ra',\n  C: 'lateg',\n  D: 'ights',\n  R: 'in',\n  Q: 'turquois',\n  E: 'hi',\n  P: 'ro',\n  O: 'al',\n  N: 'le',\n  M: 'de',\n  L: 'yello',\n  F: 'en',\n  K: 'ch',\n  G: 'arks',\n  H: 'ea',\n  I: 'ightg',\n  J: 'wh'\n};\nconst names$1 = {\n  OiceXe: 'f0f8ff',\n  antiquewEte: 'faebd7',\n  aqua: 'ffff',\n  aquamarRe: '7fffd4',\n  azuY: 'f0ffff',\n  beige: 'f5f5dc',\n  bisque: 'ffe4c4',\n  black: '0',\n  blanKedOmond: 'ffebcd',\n  Xe: 'ff',\n  XeviTet: '8a2be2',\n  bPwn: 'a52a2a',\n  burlywood: 'deb887',\n  caMtXe: '5f9ea0',\n  KartYuse: '7fff00',\n  KocTate: 'd2691e',\n  cSO: 'ff7f50',\n  cSnflowerXe: '6495ed',\n  cSnsilk: 'fff8dc',\n  crimson: 'dc143c',\n  cyan: 'ffff',\n  xXe: '8b',\n  xcyan: '8b8b',\n  xgTMnPd: 'b8860b',\n  xWay: 'a9a9a9',\n  xgYF: '6400',\n  xgYy: 'a9a9a9',\n  xkhaki: 'bdb76b',\n  xmagFta: '8b008b',\n  xTivegYF: '556b2f',\n  xSange: 'ff8c00',\n  xScEd: '9932cc',\n  xYd: '8b0000',\n  xsOmon: 'e9967a',\n  xsHgYF: '8fbc8f',\n  xUXe: '483d8b',\n  xUWay: '2f4f4f',\n  xUgYy: '2f4f4f',\n  xQe: 'ced1',\n  xviTet: '9400d3',\n  dAppRk: 'ff1493',\n  dApskyXe: 'bfff',\n  dimWay: '696969',\n  dimgYy: '696969',\n  dodgerXe: '1e90ff',\n  fiYbrick: 'b22222',\n  flSOwEte: 'fffaf0',\n  foYstWAn: '228b22',\n  fuKsia: 'ff00ff',\n  gaRsbSo: 'dcdcdc',\n  ghostwEte: 'f8f8ff',\n  gTd: 'ffd700',\n  gTMnPd: 'daa520',\n  Way: '808080',\n  gYF: '8000',\n  gYFLw: 'adff2f',\n  gYy: '808080',\n  honeyMw: 'f0fff0',\n  hotpRk: 'ff69b4',\n  RdianYd: 'cd5c5c',\n  Rdigo: '4b0082',\n  ivSy: 'fffff0',\n  khaki: 'f0e68c',\n  lavFMr: 'e6e6fa',\n  lavFMrXsh: 'fff0f5',\n  lawngYF: '7cfc00',\n  NmoncEffon: 'fffacd',\n  ZXe: 'add8e6',\n  ZcSO: 'f08080',\n  Zcyan: 'e0ffff',\n  ZgTMnPdLw: 'fafad2',\n  ZWay: 'd3d3d3',\n  ZgYF: '90ee90',\n  ZgYy: 'd3d3d3',\n  ZpRk: 'ffb6c1',\n  ZsOmon: 'ffa07a',\n  ZsHgYF: '20b2aa',\n  ZskyXe: '87cefa',\n  ZUWay: '778899',\n  ZUgYy: '778899',\n  ZstAlXe: 'b0c4de',\n  ZLw: 'ffffe0',\n  lime: 'ff00',\n  limegYF: '32cd32',\n  lRF: 'faf0e6',\n  magFta: 'ff00ff',\n  maPon: '800000',\n  VaquamarRe: '66cdaa',\n  VXe: 'cd',\n  VScEd: 'ba55d3',\n  VpurpN: '9370db',\n  VsHgYF: '3cb371',\n  VUXe: '7b68ee',\n  VsprRggYF: 'fa9a',\n  VQe: '48d1cc',\n  VviTetYd: 'c71585',\n  midnightXe: '191970',\n  mRtcYam: 'f5fffa',\n  mistyPse: 'ffe4e1',\n  moccasR: 'ffe4b5',\n  navajowEte: 'ffdead',\n  navy: '80',\n  Tdlace: 'fdf5e6',\n  Tive: '808000',\n  TivedBb: '6b8e23',\n  Sange: 'ffa500',\n  SangeYd: 'ff4500',\n  ScEd: 'da70d6',\n  pOegTMnPd: 'eee8aa',\n  pOegYF: '98fb98',\n  pOeQe: 'afeeee',\n  pOeviTetYd: 'db7093',\n  papayawEp: 'ffefd5',\n  pHKpuff: 'ffdab9',\n  peru: 'cd853f',\n  pRk: 'ffc0cb',\n  plum: 'dda0dd',\n  powMrXe: 'b0e0e6',\n  purpN: '800080',\n  YbeccapurpN: '663399',\n  Yd: 'ff0000',\n  Psybrown: 'bc8f8f',\n  PyOXe: '4169e1',\n  saddNbPwn: '8b4513',\n  sOmon: 'fa8072',\n  sandybPwn: 'f4a460',\n  sHgYF: '2e8b57',\n  sHshell: 'fff5ee',\n  siFna: 'a0522d',\n  silver: 'c0c0c0',\n  skyXe: '87ceeb',\n  UXe: '6a5acd',\n  UWay: '708090',\n  UgYy: '708090',\n  snow: 'fffafa',\n  sprRggYF: 'ff7f',\n  stAlXe: '4682b4',\n  tan: 'd2b48c',\n  teO: '8080',\n  tEstN: 'd8bfd8',\n  tomato: 'ff6347',\n  Qe: '40e0d0',\n  viTet: 'ee82ee',\n  JHt: 'f5deb3',\n  wEte: 'ffffff',\n  wEtesmoke: 'f5f5f5',\n  Lw: 'ffff00',\n  LwgYF: '9acd32'\n};\nfunction unpack() {\n  const unpacked = {};\n  const keys = Object.keys(names$1);\n  const tkeys = Object.keys(map);\n  let i, j, k, ok, nk;\n  for (i = 0; i < keys.length; i++) {\n    ok = nk = keys[i];\n    for (j = 0; j < tkeys.length; j++) {\n      k = tkeys[j];\n      nk = nk.replace(k, map[k]);\n    }\n    k = parseInt(names$1[ok], 16);\n    unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n  }\n  return unpacked;\n}\nlet names;\nfunction nameParse(str) {\n  if (!names) {\n    names = unpack();\n    names.transparent = [0, 0, 0, 0];\n  }\n  const a = names[str.toLowerCase()];\n  return a && {\n    r: a[0],\n    g: a[1],\n    b: a[2],\n    a: a.length === 4 ? a[3] : 255\n  };\n}\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n  const m = RGB_RE.exec(str);\n  let a = 255;\n  let r, g, b;\n  if (!m) {\n    return;\n  }\n  if (m[7] !== r) {\n    const v = +m[7];\n    a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n  }\n  r = +m[1];\n  g = +m[3];\n  b = +m[5];\n  r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n  g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n  b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n  return {\n    r: r,\n    g: g,\n    b: b,\n    a: a\n  };\n}\nfunction rgbString(v) {\n  return v && (\n    v.a < 255\n      ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n      : `rgb(${v.r}, ${v.g}, ${v.b})`\n  );\n}\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n  const r = from(b2n(rgb1.r));\n  const g = from(b2n(rgb1.g));\n  const b = from(b2n(rgb1.b));\n  return {\n    r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n    g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n    b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n    a: rgb1.a + t * (rgb2.a - rgb1.a)\n  };\n}\nfunction modHSL(v, i, ratio) {\n  if (v) {\n    let tmp = rgb2hsl(v);\n    tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n    tmp = hsl2rgb(tmp);\n    v.r = tmp[0];\n    v.g = tmp[1];\n    v.b = tmp[2];\n  }\n}\nfunction clone(v, proto) {\n  return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n  var v = {r: 0, g: 0, b: 0, a: 255};\n  if (Array.isArray(input)) {\n    if (input.length >= 3) {\n      v = {r: input[0], g: input[1], b: input[2], a: 255};\n      if (input.length > 3) {\n        v.a = n2b(input[3]);\n      }\n    }\n  } else {\n    v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n    v.a = n2b(v.a);\n  }\n  return v;\n}\nfunction functionParse(str) {\n  if (str.charAt(0) === 'r') {\n    return rgbParse(str);\n  }\n  return hueParse(str);\n}\nclass Color {\n  constructor(input) {\n    if (input instanceof Color) {\n      return input;\n    }\n    const type = typeof input;\n    let v;\n    if (type === 'object') {\n      v = fromObject(input);\n    } else if (type === 'string') {\n      v = hexParse(input) || nameParse(input) || functionParse(input);\n    }\n    this._rgb = v;\n    this._valid = !!v;\n  }\n  get valid() {\n    return this._valid;\n  }\n  get rgb() {\n    var v = clone(this._rgb);\n    if (v) {\n      v.a = b2n(v.a);\n    }\n    return v;\n  }\n  set rgb(obj) {\n    this._rgb = fromObject(obj);\n  }\n  rgbString() {\n    return this._valid ? rgbString(this._rgb) : undefined;\n  }\n  hexString() {\n    return this._valid ? hexString(this._rgb) : undefined;\n  }\n  hslString() {\n    return this._valid ? hslString(this._rgb) : undefined;\n  }\n  mix(color, weight) {\n    if (color) {\n      const c1 = this.rgb;\n      const c2 = color.rgb;\n      let w2;\n      const p = weight === w2 ? 0.5 : weight;\n      const w = 2 * p - 1;\n      const a = c1.a - c2.a;\n      const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n      w2 = 1 - w1;\n      c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n      c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n      c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n      c1.a = p * c1.a + (1 - p) * c2.a;\n      this.rgb = c1;\n    }\n    return this;\n  }\n  interpolate(color, t) {\n    if (color) {\n      this._rgb = interpolate(this._rgb, color._rgb, t);\n    }\n    return this;\n  }\n  clone() {\n    return new Color(this.rgb);\n  }\n  alpha(a) {\n    this._rgb.a = n2b(a);\n    return this;\n  }\n  clearer(ratio) {\n    const rgb = this._rgb;\n    rgb.a *= 1 - ratio;\n    return this;\n  }\n  greyscale() {\n    const rgb = this._rgb;\n    const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n    rgb.r = rgb.g = rgb.b = val;\n    return this;\n  }\n  opaquer(ratio) {\n    const rgb = this._rgb;\n    rgb.a *= 1 + ratio;\n    return this;\n  }\n  negate() {\n    const v = this._rgb;\n    v.r = 255 - v.r;\n    v.g = 255 - v.g;\n    v.b = 255 - v.b;\n    return this;\n  }\n  lighten(ratio) {\n    modHSL(this._rgb, 2, ratio);\n    return this;\n  }\n  darken(ratio) {\n    modHSL(this._rgb, 2, -ratio);\n    return this;\n  }\n  saturate(ratio) {\n    modHSL(this._rgb, 1, ratio);\n    return this;\n  }\n  desaturate(ratio) {\n    modHSL(this._rgb, 1, -ratio);\n    return this;\n  }\n  rotate(deg) {\n    rotate(this._rgb, deg);\n    return this;\n  }\n}\nfunction index_esm(input) {\n  return new Color(input);\n}\n\nfunction isPatternOrGradient(value) {\n  if (value && typeof value === 'object') {\n    const type = value.toString();\n    return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n  }\n  return false;\n}\nfunction color(value) {\n  return isPatternOrGradient(value) ? value : index_esm(value);\n}\nfunction getHoverColor(value) {\n  return isPatternOrGradient(value)\n    ? value\n    : index_esm(value).saturate(0.5).darken(0.1).hexString();\n}\n\nconst overrides = Object.create(null);\nconst descriptors = Object.create(null);\nfunction getScope$1(node, key) {\n  if (!key) {\n    return node;\n  }\n  const keys = key.split('.');\n  for (let i = 0, n = keys.length; i < n; ++i) {\n    const k = keys[i];\n    node = node[k] || (node[k] = Object.create(null));\n  }\n  return node;\n}\nfunction set(root, scope, values) {\n  if (typeof scope === 'string') {\n    return merge(getScope$1(root, scope), values);\n  }\n  return merge(getScope$1(root, ''), scope);\n}\nclass Defaults {\n  constructor(_descriptors) {\n    this.animation = undefined;\n    this.backgroundColor = 'rgba(0,0,0,0.1)';\n    this.borderColor = 'rgba(0,0,0,0.1)';\n    this.color = '#666';\n    this.datasets = {};\n    this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n    this.elements = {};\n    this.events = [\n      'mousemove',\n      'mouseout',\n      'click',\n      'touchstart',\n      'touchmove'\n    ];\n    this.font = {\n      family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n      size: 12,\n      style: 'normal',\n      lineHeight: 1.2,\n      weight: null\n    };\n    this.hover = {};\n    this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n    this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n    this.hoverColor = (ctx, options) => getHoverColor(options.color);\n    this.indexAxis = 'x';\n    this.interaction = {\n      mode: 'nearest',\n      intersect: true,\n      includeInvisible: false\n    };\n    this.maintainAspectRatio = true;\n    this.onHover = null;\n    this.onClick = null;\n    this.parsing = true;\n    this.plugins = {};\n    this.responsive = true;\n    this.scale = undefined;\n    this.scales = {};\n    this.showLine = true;\n    this.drawActiveElementsOnTop = true;\n    this.describe(_descriptors);\n  }\n  set(scope, values) {\n    return set(this, scope, values);\n  }\n  get(scope) {\n    return getScope$1(this, scope);\n  }\n  describe(scope, values) {\n    return set(descriptors, scope, values);\n  }\n  override(scope, values) {\n    return set(overrides, scope, values);\n  }\n  route(scope, name, targetScope, targetName) {\n    const scopeObject = getScope$1(this, scope);\n    const targetScopeObject = getScope$1(this, targetScope);\n    const privateName = '_' + name;\n    Object.defineProperties(scopeObject, {\n      [privateName]: {\n        value: scopeObject[name],\n        writable: true\n      },\n      [name]: {\n        enumerable: true,\n        get() {\n          const local = this[privateName];\n          const target = targetScopeObject[targetName];\n          if (isObject(local)) {\n            return Object.assign({}, target, local);\n          }\n          return valueOrDefault(local, target);\n        },\n        set(value) {\n          this[privateName] = value;\n        }\n      }\n    });\n  }\n}\nvar defaults = new Defaults({\n  _scriptable: (name) => !name.startsWith('on'),\n  _indexable: (name) => name !== 'events',\n  hover: {\n    _fallback: 'interaction'\n  },\n  interaction: {\n    _scriptable: false,\n    _indexable: false,\n  }\n});\n\nfunction toFontString(font) {\n  if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n    return null;\n  }\n  return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\nfunction _measureText(ctx, data, gc, longest, string) {\n  let textWidth = data[string];\n  if (!textWidth) {\n    textWidth = data[string] = ctx.measureText(string).width;\n    gc.push(string);\n  }\n  if (textWidth > longest) {\n    longest = textWidth;\n  }\n  return longest;\n}\nfunction _longestText(ctx, font, arrayOfThings, cache) {\n  cache = cache || {};\n  let data = cache.data = cache.data || {};\n  let gc = cache.garbageCollect = cache.garbageCollect || [];\n  if (cache.font !== font) {\n    data = cache.data = {};\n    gc = cache.garbageCollect = [];\n    cache.font = font;\n  }\n  ctx.save();\n  ctx.font = font;\n  let longest = 0;\n  const ilen = arrayOfThings.length;\n  let i, j, jlen, thing, nestedThing;\n  for (i = 0; i < ilen; i++) {\n    thing = arrayOfThings[i];\n    if (thing !== undefined && thing !== null && isArray(thing) !== true) {\n      longest = _measureText(ctx, data, gc, longest, thing);\n    } else if (isArray(thing)) {\n      for (j = 0, jlen = thing.length; j < jlen; j++) {\n        nestedThing = thing[j];\n        if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n          longest = _measureText(ctx, data, gc, longest, nestedThing);\n        }\n      }\n    }\n  }\n  ctx.restore();\n  const gcLen = gc.length / 2;\n  if (gcLen > arrayOfThings.length) {\n    for (i = 0; i < gcLen; i++) {\n      delete data[gc[i]];\n    }\n    gc.splice(0, gcLen);\n  }\n  return longest;\n}\nfunction _alignPixel(chart, pixel, width) {\n  const devicePixelRatio = chart.currentDevicePixelRatio;\n  const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n  return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\nfunction clearCanvas(canvas, ctx) {\n  ctx = ctx || canvas.getContext('2d');\n  ctx.save();\n  ctx.resetTransform();\n  ctx.clearRect(0, 0, canvas.width, canvas.height);\n  ctx.restore();\n}\nfunction drawPoint(ctx, options, x, y) {\n  drawPointLegend(ctx, options, x, y, null);\n}\nfunction drawPointLegend(ctx, options, x, y, w) {\n  let type, xOffset, yOffset, size, cornerRadius, width;\n  const style = options.pointStyle;\n  const rotation = options.rotation;\n  const radius = options.radius;\n  let rad = (rotation || 0) * RAD_PER_DEG;\n  if (style && typeof style === 'object') {\n    type = style.toString();\n    if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n      ctx.save();\n      ctx.translate(x, y);\n      ctx.rotate(rad);\n      ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n      ctx.restore();\n      return;\n    }\n  }\n  if (isNaN(radius) || radius <= 0) {\n    return;\n  }\n  ctx.beginPath();\n  switch (style) {\n  default:\n    if (w) {\n      ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n    } else {\n      ctx.arc(x, y, radius, 0, TAU);\n    }\n    ctx.closePath();\n    break;\n  case 'triangle':\n    ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n    rad += TWO_THIRDS_PI;\n    ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n    rad += TWO_THIRDS_PI;\n    ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n    ctx.closePath();\n    break;\n  case 'rectRounded':\n    cornerRadius = radius * 0.516;\n    size = radius - cornerRadius;\n    xOffset = Math.cos(rad + QUARTER_PI) * size;\n    yOffset = Math.sin(rad + QUARTER_PI) * size;\n    ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n    ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n    ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n    ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n    ctx.closePath();\n    break;\n  case 'rect':\n    if (!rotation) {\n      size = Math.SQRT1_2 * radius;\n      width = w ? w / 2 : size;\n      ctx.rect(x - width, y - size, 2 * width, 2 * size);\n      break;\n    }\n    rad += QUARTER_PI;\n  case 'rectRot':\n    xOffset = Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + yOffset, y - xOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    ctx.lineTo(x - yOffset, y + xOffset);\n    ctx.closePath();\n    break;\n  case 'crossRot':\n    rad += QUARTER_PI;\n  case 'cross':\n    xOffset = Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    ctx.moveTo(x + yOffset, y - xOffset);\n    ctx.lineTo(x - yOffset, y + xOffset);\n    break;\n  case 'star':\n    xOffset = Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    ctx.moveTo(x + yOffset, y - xOffset);\n    ctx.lineTo(x - yOffset, y + xOffset);\n    rad += QUARTER_PI;\n    xOffset = Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    ctx.moveTo(x + yOffset, y - xOffset);\n    ctx.lineTo(x - yOffset, y + xOffset);\n    break;\n  case 'line':\n    xOffset = w ? w / 2 : Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    break;\n  case 'dash':\n    ctx.moveTo(x, y);\n    ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius);\n    break;\n  }\n  ctx.fill();\n  if (options.borderWidth > 0) {\n    ctx.stroke();\n  }\n}\nfunction _isPointInArea(point, area, margin) {\n  margin = margin || 0.5;\n  return !area || (point && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin);\n}\nfunction clipArea(ctx, area) {\n  ctx.save();\n  ctx.beginPath();\n  ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n  ctx.clip();\n}\nfunction unclipArea(ctx) {\n  ctx.restore();\n}\nfunction _steppedLineTo(ctx, previous, target, flip, mode) {\n  if (!previous) {\n    return ctx.lineTo(target.x, target.y);\n  }\n  if (mode === 'middle') {\n    const midpoint = (previous.x + target.x) / 2.0;\n    ctx.lineTo(midpoint, previous.y);\n    ctx.lineTo(midpoint, target.y);\n  } else if (mode === 'after' !== !!flip) {\n    ctx.lineTo(previous.x, target.y);\n  } else {\n    ctx.lineTo(target.x, previous.y);\n  }\n  ctx.lineTo(target.x, target.y);\n}\nfunction _bezierCurveTo(ctx, previous, target, flip) {\n  if (!previous) {\n    return ctx.lineTo(target.x, target.y);\n  }\n  ctx.bezierCurveTo(\n    flip ? previous.cp1x : previous.cp2x,\n    flip ? previous.cp1y : previous.cp2y,\n    flip ? target.cp2x : target.cp1x,\n    flip ? target.cp2y : target.cp1y,\n    target.x,\n    target.y);\n}\nfunction renderText(ctx, text, x, y, font, opts = {}) {\n  const lines = isArray(text) ? text : [text];\n  const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n  let i, line;\n  ctx.save();\n  ctx.font = font.string;\n  setRenderOpts(ctx, opts);\n  for (i = 0; i < lines.length; ++i) {\n    line = lines[i];\n    if (stroke) {\n      if (opts.strokeColor) {\n        ctx.strokeStyle = opts.strokeColor;\n      }\n      if (!isNullOrUndef(opts.strokeWidth)) {\n        ctx.lineWidth = opts.strokeWidth;\n      }\n      ctx.strokeText(line, x, y, opts.maxWidth);\n    }\n    ctx.fillText(line, x, y, opts.maxWidth);\n    decorateText(ctx, x, y, line, opts);\n    y += font.lineHeight;\n  }\n  ctx.restore();\n}\nfunction setRenderOpts(ctx, opts) {\n  if (opts.translation) {\n    ctx.translate(opts.translation[0], opts.translation[1]);\n  }\n  if (!isNullOrUndef(opts.rotation)) {\n    ctx.rotate(opts.rotation);\n  }\n  if (opts.color) {\n    ctx.fillStyle = opts.color;\n  }\n  if (opts.textAlign) {\n    ctx.textAlign = opts.textAlign;\n  }\n  if (opts.textBaseline) {\n    ctx.textBaseline = opts.textBaseline;\n  }\n}\nfunction decorateText(ctx, x, y, line, opts) {\n  if (opts.strikethrough || opts.underline) {\n    const metrics = ctx.measureText(line);\n    const left = x - metrics.actualBoundingBoxLeft;\n    const right = x + metrics.actualBoundingBoxRight;\n    const top = y - metrics.actualBoundingBoxAscent;\n    const bottom = y + metrics.actualBoundingBoxDescent;\n    const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n    ctx.strokeStyle = ctx.fillStyle;\n    ctx.beginPath();\n    ctx.lineWidth = opts.decorationWidth || 2;\n    ctx.moveTo(left, yDecoration);\n    ctx.lineTo(right, yDecoration);\n    ctx.stroke();\n  }\n}\nfunction addRoundedRectPath(ctx, rect) {\n  const {x, y, w, h, radius} = rect;\n  ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, -HALF_PI, PI, true);\n  ctx.lineTo(x, y + h - radius.bottomLeft);\n  ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n  ctx.lineTo(x + w - radius.bottomRight, y + h);\n  ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n  ctx.lineTo(x + w, y + radius.topRight);\n  ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n  ctx.lineTo(x + radius.topLeft, y);\n}\n\nconst LINE_HEIGHT = new RegExp(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);\nconst FONT_STYLE = new RegExp(/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/);\nfunction toLineHeight(value, size) {\n  const matches = ('' + value).match(LINE_HEIGHT);\n  if (!matches || matches[1] === 'normal') {\n    return size * 1.2;\n  }\n  value = +matches[2];\n  switch (matches[3]) {\n  case 'px':\n    return value;\n  case '%':\n    value /= 100;\n    break;\n  }\n  return size * value;\n}\nconst numberOrZero = v => +v || 0;\nfunction _readValueToProps(value, props) {\n  const ret = {};\n  const objProps = isObject(props);\n  const keys = objProps ? Object.keys(props) : props;\n  const read = isObject(value)\n    ? objProps\n      ? prop => valueOrDefault(value[prop], value[props[prop]])\n      : prop => value[prop]\n    : () => value;\n  for (const prop of keys) {\n    ret[prop] = numberOrZero(read(prop));\n  }\n  return ret;\n}\nfunction toTRBL(value) {\n  return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\nfunction toTRBLCorners(value) {\n  return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\nfunction toPadding(value) {\n  const obj = toTRBL(value);\n  obj.width = obj.left + obj.right;\n  obj.height = obj.top + obj.bottom;\n  return obj;\n}\nfunction toFont(options, fallback) {\n  options = options || {};\n  fallback = fallback || defaults.font;\n  let size = valueOrDefault(options.size, fallback.size);\n  if (typeof size === 'string') {\n    size = parseInt(size, 10);\n  }\n  let style = valueOrDefault(options.style, fallback.style);\n  if (style && !('' + style).match(FONT_STYLE)) {\n    console.warn('Invalid font style specified: \"' + style + '\"');\n    style = '';\n  }\n  const font = {\n    family: valueOrDefault(options.family, fallback.family),\n    lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n    size,\n    style,\n    weight: valueOrDefault(options.weight, fallback.weight),\n    string: ''\n  };\n  font.string = toFontString(font);\n  return font;\n}\nfunction resolve(inputs, context, index, info) {\n  let cacheable = true;\n  let i, ilen, value;\n  for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n    value = inputs[i];\n    if (value === undefined) {\n      continue;\n    }\n    if (context !== undefined && typeof value === 'function') {\n      value = value(context);\n      cacheable = false;\n    }\n    if (index !== undefined && isArray(value)) {\n      value = value[index % value.length];\n      cacheable = false;\n    }\n    if (value !== undefined) {\n      if (info && !cacheable) {\n        info.cacheable = false;\n      }\n      return value;\n    }\n  }\n}\nfunction _addGrace(minmax, grace, beginAtZero) {\n  const {min, max} = minmax;\n  const change = toDimension(grace, (max - min) / 2);\n  const keepZero = (value, add) => beginAtZero && value === 0 ? 0 : value + add;\n  return {\n    min: keepZero(min, -Math.abs(change)),\n    max: keepZero(max, change)\n  };\n}\nfunction createContext(parentContext, context) {\n  return Object.assign(Object.create(parentContext), context);\n}\n\nfunction _createResolver(scopes, prefixes = [''], rootScopes = scopes, fallback, getTarget = () => scopes[0]) {\n  if (!defined(fallback)) {\n    fallback = _resolve('_fallback', scopes);\n  }\n  const cache = {\n    [Symbol.toStringTag]: 'Object',\n    _cacheable: true,\n    _scopes: scopes,\n    _rootScopes: rootScopes,\n    _fallback: fallback,\n    _getTarget: getTarget,\n    override: (scope) => _createResolver([scope, ...scopes], prefixes, rootScopes, fallback),\n  };\n  return new Proxy(cache, {\n    deleteProperty(target, prop) {\n      delete target[prop];\n      delete target._keys;\n      delete scopes[0][prop];\n      return true;\n    },\n    get(target, prop) {\n      return _cached(target, prop,\n        () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n    },\n    getOwnPropertyDescriptor(target, prop) {\n      return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n    },\n    getPrototypeOf() {\n      return Reflect.getPrototypeOf(scopes[0]);\n    },\n    has(target, prop) {\n      return getKeysFromAllScopes(target).includes(prop);\n    },\n    ownKeys(target) {\n      return getKeysFromAllScopes(target);\n    },\n    set(target, prop, value) {\n      const storage = target._storage || (target._storage = getTarget());\n      target[prop] = storage[prop] = value;\n      delete target._keys;\n      return true;\n    }\n  });\n}\nfunction _attachContext(proxy, context, subProxy, descriptorDefaults) {\n  const cache = {\n    _cacheable: false,\n    _proxy: proxy,\n    _context: context,\n    _subProxy: subProxy,\n    _stack: new Set(),\n    _descriptors: _descriptors(proxy, descriptorDefaults),\n    setContext: (ctx) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n    override: (scope) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n  };\n  return new Proxy(cache, {\n    deleteProperty(target, prop) {\n      delete target[prop];\n      delete proxy[prop];\n      return true;\n    },\n    get(target, prop, receiver) {\n      return _cached(target, prop,\n        () => _resolveWithContext(target, prop, receiver));\n    },\n    getOwnPropertyDescriptor(target, prop) {\n      return target._descriptors.allKeys\n        ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n        : Reflect.getOwnPropertyDescriptor(proxy, prop);\n    },\n    getPrototypeOf() {\n      return Reflect.getPrototypeOf(proxy);\n    },\n    has(target, prop) {\n      return Reflect.has(proxy, prop);\n    },\n    ownKeys() {\n      return Reflect.ownKeys(proxy);\n    },\n    set(target, prop, value) {\n      proxy[prop] = value;\n      delete target[prop];\n      return true;\n    }\n  });\n}\nfunction _descriptors(proxy, defaults = {scriptable: true, indexable: true}) {\n  const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n  return {\n    allKeys: _allKeys,\n    scriptable: _scriptable,\n    indexable: _indexable,\n    isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n    isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n  };\n}\nconst readKey = (prefix, name) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop, value) => isObject(value) && prop !== 'adapters' &&\n  (Object.getPrototypeOf(value) === null || value.constructor === Object);\nfunction _cached(target, prop, resolve) {\n  if (Object.prototype.hasOwnProperty.call(target, prop)) {\n    return target[prop];\n  }\n  const value = resolve();\n  target[prop] = value;\n  return value;\n}\nfunction _resolveWithContext(target, prop, receiver) {\n  const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n  let value = _proxy[prop];\n  if (isFunction(value) && descriptors.isScriptable(prop)) {\n    value = _resolveScriptable(prop, value, target, receiver);\n  }\n  if (isArray(value) && value.length) {\n    value = _resolveArray(prop, value, target, descriptors.isIndexable);\n  }\n  if (needsSubResolver(prop, value)) {\n    value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n  }\n  return value;\n}\nfunction _resolveScriptable(prop, value, target, receiver) {\n  const {_proxy, _context, _subProxy, _stack} = target;\n  if (_stack.has(prop)) {\n    throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n  }\n  _stack.add(prop);\n  value = value(_context, _subProxy || receiver);\n  _stack.delete(prop);\n  if (needsSubResolver(prop, value)) {\n    value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n  }\n  return value;\n}\nfunction _resolveArray(prop, value, target, isIndexable) {\n  const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n  if (defined(_context.index) && isIndexable(prop)) {\n    value = value[_context.index % value.length];\n  } else if (isObject(value[0])) {\n    const arr = value;\n    const scopes = _proxy._scopes.filter(s => s !== arr);\n    value = [];\n    for (const item of arr) {\n      const resolver = createSubResolver(scopes, _proxy, prop, item);\n      value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n    }\n  }\n  return value;\n}\nfunction resolveFallback(fallback, prop, value) {\n  return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\nconst getScope = (key, parent) => key === true ? parent\n  : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\nfunction addScopes(set, parentScopes, key, parentFallback, value) {\n  for (const parent of parentScopes) {\n    const scope = getScope(key, parent);\n    if (scope) {\n      set.add(scope);\n      const fallback = resolveFallback(scope._fallback, key, value);\n      if (defined(fallback) && fallback !== key && fallback !== parentFallback) {\n        return fallback;\n      }\n    } else if (scope === false && defined(parentFallback) && key !== parentFallback) {\n      return null;\n    }\n  }\n  return false;\n}\nfunction createSubResolver(parentScopes, resolver, prop, value) {\n  const rootScopes = resolver._rootScopes;\n  const fallback = resolveFallback(resolver._fallback, prop, value);\n  const allScopes = [...parentScopes, ...rootScopes];\n  const set = new Set();\n  set.add(value);\n  let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n  if (key === null) {\n    return false;\n  }\n  if (defined(fallback) && fallback !== prop) {\n    key = addScopesFromKey(set, allScopes, fallback, key, value);\n    if (key === null) {\n      return false;\n    }\n  }\n  return _createResolver(Array.from(set), [''], rootScopes, fallback,\n    () => subGetTarget(resolver, prop, value));\n}\nfunction addScopesFromKey(set, allScopes, key, fallback, item) {\n  while (key) {\n    key = addScopes(set, allScopes, key, fallback, item);\n  }\n  return key;\n}\nfunction subGetTarget(resolver, prop, value) {\n  const parent = resolver._getTarget();\n  if (!(prop in parent)) {\n    parent[prop] = {};\n  }\n  const target = parent[prop];\n  if (isArray(target) && isObject(value)) {\n    return value;\n  }\n  return target;\n}\nfunction _resolveWithPrefixes(prop, prefixes, scopes, proxy) {\n  let value;\n  for (const prefix of prefixes) {\n    value = _resolve(readKey(prefix, prop), scopes);\n    if (defined(value)) {\n      return needsSubResolver(prop, value)\n        ? createSubResolver(scopes, proxy, prop, value)\n        : value;\n    }\n  }\n}\nfunction _resolve(key, scopes) {\n  for (const scope of scopes) {\n    if (!scope) {\n      continue;\n    }\n    const value = scope[key];\n    if (defined(value)) {\n      return value;\n    }\n  }\n}\nfunction getKeysFromAllScopes(target) {\n  let keys = target._keys;\n  if (!keys) {\n    keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n  }\n  return keys;\n}\nfunction resolveKeysFromAllScopes(scopes) {\n  const set = new Set();\n  for (const scope of scopes) {\n    for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n      set.add(key);\n    }\n  }\n  return Array.from(set);\n}\nfunction _parseObjectDataRadialScale(meta, data, start, count) {\n  const {iScale} = meta;\n  const {key = 'r'} = this._parsing;\n  const parsed = new Array(count);\n  let i, ilen, index, item;\n  for (i = 0, ilen = count; i < ilen; ++i) {\n    index = i + start;\n    item = data[index];\n    parsed[i] = {\n      r: iScale.parse(resolveObjectKey(item, key), index)\n    };\n  }\n  return parsed;\n}\n\nconst EPSILON = Number.EPSILON || 1e-14;\nconst getPoint = (points, i) => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis) => indexAxis === 'x' ? 'y' : 'x';\nfunction splineCurve(firstPoint, middlePoint, afterPoint, t) {\n  const previous = firstPoint.skip ? middlePoint : firstPoint;\n  const current = middlePoint;\n  const next = afterPoint.skip ? middlePoint : afterPoint;\n  const d01 = distanceBetweenPoints(current, previous);\n  const d12 = distanceBetweenPoints(next, current);\n  let s01 = d01 / (d01 + d12);\n  let s12 = d12 / (d01 + d12);\n  s01 = isNaN(s01) ? 0 : s01;\n  s12 = isNaN(s12) ? 0 : s12;\n  const fa = t * s01;\n  const fb = t * s12;\n  return {\n    previous: {\n      x: current.x - fa * (next.x - previous.x),\n      y: current.y - fa * (next.y - previous.y)\n    },\n    next: {\n      x: current.x + fb * (next.x - previous.x),\n      y: current.y + fb * (next.y - previous.y)\n    }\n  };\n}\nfunction monotoneAdjust(points, deltaK, mK) {\n  const pointsLen = points.length;\n  let alphaK, betaK, tauK, squaredMagnitude, pointCurrent;\n  let pointAfter = getPoint(points, 0);\n  for (let i = 0; i < pointsLen - 1; ++i) {\n    pointCurrent = pointAfter;\n    pointAfter = getPoint(points, i + 1);\n    if (!pointCurrent || !pointAfter) {\n      continue;\n    }\n    if (almostEquals(deltaK[i], 0, EPSILON)) {\n      mK[i] = mK[i + 1] = 0;\n      continue;\n    }\n    alphaK = mK[i] / deltaK[i];\n    betaK = mK[i + 1] / deltaK[i];\n    squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n    if (squaredMagnitude <= 9) {\n      continue;\n    }\n    tauK = 3 / Math.sqrt(squaredMagnitude);\n    mK[i] = alphaK * tauK * deltaK[i];\n    mK[i + 1] = betaK * tauK * deltaK[i];\n  }\n}\nfunction monotoneCompute(points, mK, indexAxis = 'x') {\n  const valueAxis = getValueAxis(indexAxis);\n  const pointsLen = points.length;\n  let delta, pointBefore, pointCurrent;\n  let pointAfter = getPoint(points, 0);\n  for (let i = 0; i < pointsLen; ++i) {\n    pointBefore = pointCurrent;\n    pointCurrent = pointAfter;\n    pointAfter = getPoint(points, i + 1);\n    if (!pointCurrent) {\n      continue;\n    }\n    const iPixel = pointCurrent[indexAxis];\n    const vPixel = pointCurrent[valueAxis];\n    if (pointBefore) {\n      delta = (iPixel - pointBefore[indexAxis]) / 3;\n      pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n      pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n    }\n    if (pointAfter) {\n      delta = (pointAfter[indexAxis] - iPixel) / 3;\n      pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n      pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n    }\n  }\n}\nfunction splineCurveMonotone(points, indexAxis = 'x') {\n  const valueAxis = getValueAxis(indexAxis);\n  const pointsLen = points.length;\n  const deltaK = Array(pointsLen).fill(0);\n  const mK = Array(pointsLen);\n  let i, pointBefore, pointCurrent;\n  let pointAfter = getPoint(points, 0);\n  for (i = 0; i < pointsLen; ++i) {\n    pointBefore = pointCurrent;\n    pointCurrent = pointAfter;\n    pointAfter = getPoint(points, i + 1);\n    if (!pointCurrent) {\n      continue;\n    }\n    if (pointAfter) {\n      const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n      deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n    }\n    mK[i] = !pointBefore ? deltaK[i]\n      : !pointAfter ? deltaK[i - 1]\n      : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n      : (deltaK[i - 1] + deltaK[i]) / 2;\n  }\n  monotoneAdjust(points, deltaK, mK);\n  monotoneCompute(points, mK, indexAxis);\n}\nfunction capControlPoint(pt, min, max) {\n  return Math.max(Math.min(pt, max), min);\n}\nfunction capBezierPoints(points, area) {\n  let i, ilen, point, inArea, inAreaPrev;\n  let inAreaNext = _isPointInArea(points[0], area);\n  for (i = 0, ilen = points.length; i < ilen; ++i) {\n    inAreaPrev = inArea;\n    inArea = inAreaNext;\n    inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n    if (!inArea) {\n      continue;\n    }\n    point = points[i];\n    if (inAreaPrev) {\n      point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n      point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n    }\n    if (inAreaNext) {\n      point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n      point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n    }\n  }\n}\nfunction _updateBezierControlPoints(points, options, area, loop, indexAxis) {\n  let i, ilen, point, controlPoints;\n  if (options.spanGaps) {\n    points = points.filter((pt) => !pt.skip);\n  }\n  if (options.cubicInterpolationMode === 'monotone') {\n    splineCurveMonotone(points, indexAxis);\n  } else {\n    let prev = loop ? points[points.length - 1] : points[0];\n    for (i = 0, ilen = points.length; i < ilen; ++i) {\n      point = points[i];\n      controlPoints = splineCurve(\n        prev,\n        point,\n        points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n        options.tension\n      );\n      point.cp1x = controlPoints.previous.x;\n      point.cp1y = controlPoints.previous.y;\n      point.cp2x = controlPoints.next.x;\n      point.cp2y = controlPoints.next.y;\n      prev = point;\n    }\n  }\n  if (options.capBezierPoints) {\n    capBezierPoints(points, area);\n  }\n}\n\nfunction _isDomSupported() {\n  return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\nfunction _getParentNode(domNode) {\n  let parent = domNode.parentNode;\n  if (parent && parent.toString() === '[object ShadowRoot]') {\n    parent = parent.host;\n  }\n  return parent;\n}\nfunction parseMaxStyle(styleValue, node, parentProperty) {\n  let valueInPixels;\n  if (typeof styleValue === 'string') {\n    valueInPixels = parseInt(styleValue, 10);\n    if (styleValue.indexOf('%') !== -1) {\n      valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n    }\n  } else {\n    valueInPixels = styleValue;\n  }\n  return valueInPixels;\n}\nconst getComputedStyle = (element) => window.getComputedStyle(element, null);\nfunction getStyle(el, property) {\n  return getComputedStyle(el).getPropertyValue(property);\n}\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles, style, suffix) {\n  const result = {};\n  suffix = suffix ? '-' + suffix : '';\n  for (let i = 0; i < 4; i++) {\n    const pos = positions[i];\n    result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n  }\n  result.width = result.left + result.right;\n  result.height = result.top + result.bottom;\n  return result;\n}\nconst useOffsetPos = (x, y, target) => (x > 0 || y > 0) && (!target || !target.shadowRoot);\nfunction getCanvasPosition(e, canvas) {\n  const touches = e.touches;\n  const source = touches && touches.length ? touches[0] : e;\n  const {offsetX, offsetY} = source;\n  let box = false;\n  let x, y;\n  if (useOffsetPos(offsetX, offsetY, e.target)) {\n    x = offsetX;\n    y = offsetY;\n  } else {\n    const rect = canvas.getBoundingClientRect();\n    x = source.clientX - rect.left;\n    y = source.clientY - rect.top;\n    box = true;\n  }\n  return {x, y, box};\n}\nfunction getRelativePosition(evt, chart) {\n  if ('native' in evt) {\n    return evt;\n  }\n  const {canvas, currentDevicePixelRatio} = chart;\n  const style = getComputedStyle(canvas);\n  const borderBox = style.boxSizing === 'border-box';\n  const paddings = getPositionedStyle(style, 'padding');\n  const borders = getPositionedStyle(style, 'border', 'width');\n  const {x, y, box} = getCanvasPosition(evt, canvas);\n  const xOffset = paddings.left + (box && borders.left);\n  const yOffset = paddings.top + (box && borders.top);\n  let {width, height} = chart;\n  if (borderBox) {\n    width -= paddings.width + borders.width;\n    height -= paddings.height + borders.height;\n  }\n  return {\n    x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n    y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n  };\n}\nfunction getContainerSize(canvas, width, height) {\n  let maxWidth, maxHeight;\n  if (width === undefined || height === undefined) {\n    const container = _getParentNode(canvas);\n    if (!container) {\n      width = canvas.clientWidth;\n      height = canvas.clientHeight;\n    } else {\n      const rect = container.getBoundingClientRect();\n      const containerStyle = getComputedStyle(container);\n      const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n      const containerPadding = getPositionedStyle(containerStyle, 'padding');\n      width = rect.width - containerPadding.width - containerBorder.width;\n      height = rect.height - containerPadding.height - containerBorder.height;\n      maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n      maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n    }\n  }\n  return {\n    width,\n    height,\n    maxWidth: maxWidth || INFINITY,\n    maxHeight: maxHeight || INFINITY\n  };\n}\nconst round1 = v => Math.round(v * 10) / 10;\nfunction getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) {\n  const style = getComputedStyle(canvas);\n  const margins = getPositionedStyle(style, 'margin');\n  const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n  const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n  const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n  let {width, height} = containerSize;\n  if (style.boxSizing === 'content-box') {\n    const borders = getPositionedStyle(style, 'border', 'width');\n    const paddings = getPositionedStyle(style, 'padding');\n    width -= paddings.width + borders.width;\n    height -= paddings.height + borders.height;\n  }\n  width = Math.max(0, width - margins.width);\n  height = Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height - margins.height);\n  width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n  height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n  if (width && !height) {\n    height = round1(width / 2);\n  }\n  return {\n    width,\n    height\n  };\n}\nfunction retinaScale(chart, forceRatio, forceStyle) {\n  const pixelRatio = forceRatio || 1;\n  const deviceHeight = Math.floor(chart.height * pixelRatio);\n  const deviceWidth = Math.floor(chart.width * pixelRatio);\n  chart.height = deviceHeight / pixelRatio;\n  chart.width = deviceWidth / pixelRatio;\n  const canvas = chart.canvas;\n  if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n    canvas.style.height = `${chart.height}px`;\n    canvas.style.width = `${chart.width}px`;\n  }\n  if (chart.currentDevicePixelRatio !== pixelRatio\n      || canvas.height !== deviceHeight\n      || canvas.width !== deviceWidth) {\n    chart.currentDevicePixelRatio = pixelRatio;\n    canvas.height = deviceHeight;\n    canvas.width = deviceWidth;\n    chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n    return true;\n  }\n  return false;\n}\nconst supportsEventListenerOptions = (function() {\n  let passiveSupported = false;\n  try {\n    const options = {\n      get passive() {\n        passiveSupported = true;\n        return false;\n      }\n    };\n    window.addEventListener('test', null, options);\n    window.removeEventListener('test', null, options);\n  } catch (e) {\n  }\n  return passiveSupported;\n}());\nfunction readUsedSize(element, property) {\n  const value = getStyle(element, property);\n  const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n  return matches ? +matches[1] : undefined;\n}\n\nfunction _pointInLine(p1, p2, t, mode) {\n  return {\n    x: p1.x + t * (p2.x - p1.x),\n    y: p1.y + t * (p2.y - p1.y)\n  };\n}\nfunction _steppedInterpolation(p1, p2, t, mode) {\n  return {\n    x: p1.x + t * (p2.x - p1.x),\n    y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n    : mode === 'after' ? t < 1 ? p1.y : p2.y\n    : t > 0 ? p2.y : p1.y\n  };\n}\nfunction _bezierInterpolation(p1, p2, t, mode) {\n  const cp1 = {x: p1.cp2x, y: p1.cp2y};\n  const cp2 = {x: p2.cp1x, y: p2.cp1y};\n  const a = _pointInLine(p1, cp1, t);\n  const b = _pointInLine(cp1, cp2, t);\n  const c = _pointInLine(cp2, p2, t);\n  const d = _pointInLine(a, b, t);\n  const e = _pointInLine(b, c, t);\n  return _pointInLine(d, e, t);\n}\n\nconst intlCache = new Map();\nfunction getNumberFormat(locale, options) {\n  options = options || {};\n  const cacheKey = locale + JSON.stringify(options);\n  let formatter = intlCache.get(cacheKey);\n  if (!formatter) {\n    formatter = new Intl.NumberFormat(locale, options);\n    intlCache.set(cacheKey, formatter);\n  }\n  return formatter;\n}\nfunction formatNumber(num, locale, options) {\n  return getNumberFormat(locale, options).format(num);\n}\n\nconst getRightToLeftAdapter = function(rectX, width) {\n  return {\n    x(x) {\n      return rectX + rectX + width - x;\n    },\n    setWidth(w) {\n      width = w;\n    },\n    textAlign(align) {\n      if (align === 'center') {\n        return align;\n      }\n      return align === 'right' ? 'left' : 'right';\n    },\n    xPlus(x, value) {\n      return x - value;\n    },\n    leftForLtr(x, itemWidth) {\n      return x - itemWidth;\n    },\n  };\n};\nconst getLeftToRightAdapter = function() {\n  return {\n    x(x) {\n      return x;\n    },\n    setWidth(w) {\n    },\n    textAlign(align) {\n      return align;\n    },\n    xPlus(x, value) {\n      return x + value;\n    },\n    leftForLtr(x, _itemWidth) {\n      return x;\n    },\n  };\n};\nfunction getRtlAdapter(rtl, rectX, width) {\n  return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\nfunction overrideTextDirection(ctx, direction) {\n  let style, original;\n  if (direction === 'ltr' || direction === 'rtl') {\n    style = ctx.canvas.style;\n    original = [\n      style.getPropertyValue('direction'),\n      style.getPropertyPriority('direction'),\n    ];\n    style.setProperty('direction', direction, 'important');\n    ctx.prevTextDirection = original;\n  }\n}\nfunction restoreTextDirection(ctx, original) {\n  if (original !== undefined) {\n    delete ctx.prevTextDirection;\n    ctx.canvas.style.setProperty('direction', original[0], original[1]);\n  }\n}\n\nfunction propertyFn(property) {\n  if (property === 'angle') {\n    return {\n      between: _angleBetween,\n      compare: _angleDiff,\n      normalize: _normalizeAngle,\n    };\n  }\n  return {\n    between: _isBetween,\n    compare: (a, b) => a - b,\n    normalize: x => x\n  };\n}\nfunction normalizeSegment({start, end, count, loop, style}) {\n  return {\n    start: start % count,\n    end: end % count,\n    loop: loop && (end - start + 1) % count === 0,\n    style\n  };\n}\nfunction getSegment(segment, points, bounds) {\n  const {property, start: startBound, end: endBound} = bounds;\n  const {between, normalize} = propertyFn(property);\n  const count = points.length;\n  let {start, end, loop} = segment;\n  let i, ilen;\n  if (loop) {\n    start += count;\n    end += count;\n    for (i = 0, ilen = count; i < ilen; ++i) {\n      if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n        break;\n      }\n      start--;\n      end--;\n    }\n    start %= count;\n    end %= count;\n  }\n  if (end < start) {\n    end += count;\n  }\n  return {start, end, loop, style: segment.style};\n}\nfunction _boundSegment(segment, points, bounds) {\n  if (!bounds) {\n    return [segment];\n  }\n  const {property, start: startBound, end: endBound} = bounds;\n  const count = points.length;\n  const {compare, between, normalize} = propertyFn(property);\n  const {start, end, loop, style} = getSegment(segment, points, bounds);\n  const result = [];\n  let inside = false;\n  let subStart = null;\n  let value, point, prevValue;\n  const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n  const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n  const shouldStart = () => inside || startIsBefore();\n  const shouldStop = () => !inside || endIsBefore();\n  for (let i = start, prev = start; i <= end; ++i) {\n    point = points[i % count];\n    if (point.skip) {\n      continue;\n    }\n    value = normalize(point[property]);\n    if (value === prevValue) {\n      continue;\n    }\n    inside = between(value, startBound, endBound);\n    if (subStart === null && shouldStart()) {\n      subStart = compare(value, startBound) === 0 ? i : prev;\n    }\n    if (subStart !== null && shouldStop()) {\n      result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n      subStart = null;\n    }\n    prev = i;\n    prevValue = value;\n  }\n  if (subStart !== null) {\n    result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n  }\n  return result;\n}\nfunction _boundSegments(line, bounds) {\n  const result = [];\n  const segments = line.segments;\n  for (let i = 0; i < segments.length; i++) {\n    const sub = _boundSegment(segments[i], line.points, bounds);\n    if (sub.length) {\n      result.push(...sub);\n    }\n  }\n  return result;\n}\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n  let start = 0;\n  let end = count - 1;\n  if (loop && !spanGaps) {\n    while (start < count && !points[start].skip) {\n      start++;\n    }\n  }\n  while (start < count && points[start].skip) {\n    start++;\n  }\n  start %= count;\n  if (loop) {\n    end += start;\n  }\n  while (end > start && points[end % count].skip) {\n    end--;\n  }\n  end %= count;\n  return {start, end};\n}\nfunction solidSegments(points, start, max, loop) {\n  const count = points.length;\n  const result = [];\n  let last = start;\n  let prev = points[start];\n  let end;\n  for (end = start + 1; end <= max; ++end) {\n    const cur = points[end % count];\n    if (cur.skip || cur.stop) {\n      if (!prev.skip) {\n        loop = false;\n        result.push({start: start % count, end: (end - 1) % count, loop});\n        start = last = cur.stop ? end : null;\n      }\n    } else {\n      last = end;\n      if (prev.skip) {\n        start = end;\n      }\n    }\n    prev = cur;\n  }\n  if (last !== null) {\n    result.push({start: start % count, end: last % count, loop});\n  }\n  return result;\n}\nfunction _computeSegments(line, segmentOptions) {\n  const points = line.points;\n  const spanGaps = line.options.spanGaps;\n  const count = points.length;\n  if (!count) {\n    return [];\n  }\n  const loop = !!line._loop;\n  const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n  if (spanGaps === true) {\n    return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n  }\n  const max = end < start ? end + count : end;\n  const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n  return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\nfunction splitByStyles(line, segments, points, segmentOptions) {\n  if (!segmentOptions || !segmentOptions.setContext || !points) {\n    return segments;\n  }\n  return doSplitByStyles(line, segments, points, segmentOptions);\n}\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n  const chartContext = line._chart.getContext();\n  const baseStyle = readStyle(line.options);\n  const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n  const count = points.length;\n  const result = [];\n  let prevStyle = baseStyle;\n  let start = segments[0].start;\n  let i = start;\n  function addStyle(s, e, l, st) {\n    const dir = spanGaps ? -1 : 1;\n    if (s === e) {\n      return;\n    }\n    s += count;\n    while (points[s % count].skip) {\n      s -= dir;\n    }\n    while (points[e % count].skip) {\n      e += dir;\n    }\n    if (s % count !== e % count) {\n      result.push({start: s % count, end: e % count, loop: l, style: st});\n      prevStyle = st;\n      start = e % count;\n    }\n  }\n  for (const segment of segments) {\n    start = spanGaps ? start : segment.start;\n    let prev = points[start % count];\n    let style;\n    for (i = start + 1; i <= segment.end; i++) {\n      const pt = points[i % count];\n      style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n        type: 'segment',\n        p0: prev,\n        p1: pt,\n        p0DataIndex: (i - 1) % count,\n        p1DataIndex: i % count,\n        datasetIndex\n      })));\n      if (styleChanged(style, prevStyle)) {\n        addStyle(start, i - 1, segment.loop, prevStyle);\n      }\n      prev = pt;\n      prevStyle = style;\n    }\n    if (start < i - 1) {\n      addStyle(start, i - 1, segment.loop, prevStyle);\n    }\n  }\n  return result;\n}\nfunction readStyle(options) {\n  return {\n    backgroundColor: options.backgroundColor,\n    borderCapStyle: options.borderCapStyle,\n    borderDash: options.borderDash,\n    borderDashOffset: options.borderDashOffset,\n    borderJoinStyle: options.borderJoinStyle,\n    borderWidth: options.borderWidth,\n    borderColor: options.borderColor\n  };\n}\nfunction styleChanged(style, prevStyle) {\n  return prevStyle && JSON.stringify(style) !== JSON.stringify(prevStyle);\n}\n\nexport { _isPointInArea as $, _factorize as A, finiteOrDefault as B, callback as C, _addGrace as D, _limitValue as E, toDegrees as F, _measureText as G, HALF_PI as H, _int16Range as I, _alignPixel as J, toPadding as K, clipArea as L, renderText as M, unclipArea as N, toFont as O, PI as P, each as Q, _toLeftRightCenter as R, _alignStartEnd as S, TAU as T, overrides as U, merge as V, _capitalize as W, getRelativePosition as X, _rlookupByKey as Y, _lookupByKey as Z, _arrayUnique as _, resolve as a, toLineHeight as a$, getAngleFromPoint as a0, getMaximumSize as a1, _getParentNode as a2, readUsedSize as a3, throttled as a4, supportsEventListenerOptions as a5, _isDomSupported as a6, descriptors as a7, isFunction as a8, _attachContext as a9, getRtlAdapter as aA, overrideTextDirection as aB, _textX as aC, restoreTextDirection as aD, drawPointLegend as aE, noop as aF, distanceBetweenPoints as aG, _setMinAndMaxByKey as aH, niceNum as aI, almostWhole as aJ, almostEquals as aK, _decimalPlaces as aL, _longestText as aM, _filterBetween as aN, _lookup as aO, isPatternOrGradient as aP, getHoverColor as aQ, clone$1 as aR, _merger as aS, _mergerIf as aT, _deprecated as aU, _splitKey as aV, toFontString as aW, splineCurve as aX, splineCurveMonotone as aY, getStyle as aZ, fontString as a_, _createResolver as aa, _descriptors as ab, mergeIf as ac, uid as ad, debounce as ae, retinaScale as af, clearCanvas as ag, setsEqual as ah, _elementsEqual as ai, _isClickEvent as aj, _isBetween as ak, _readValueToProps as al, _updateBezierControlPoints as am, _computeSegments as an, _boundSegments as ao, _steppedInterpolation as ap, _bezierInterpolation as aq, _pointInLine as ar, _steppedLineTo as as, _bezierCurveTo as at, drawPoint as au, addRoundedRectPath as av, toTRBL as aw, toTRBLCorners as ax, _boundSegment as ay, _normalizeAngle as az, isArray as b, PITAU as b0, INFINITY as b1, RAD_PER_DEG as b2, QUARTER_PI as b3, TWO_THIRDS_PI as b4, _angleDiff as b5, color as c, defaults as d, effects as e, resolveObjectKey as f, isNumberFinite as g, createContext as h, isObject as i, defined as j, isNullOrUndef as k, listenArrayEvents as l, toPercentage as m, toDimension as n, formatNumber as o, _angleBetween as p, _getStartAndCountOfVisiblePoints as q, requestAnimFrame as r, sign as s, toRadians as t, unlistenArrayEvents as u, valueOrDefault as v, _scaleRangesChanged as w, isNumber as x, _parseObjectDataRadialScale as y, log10 as z };\n","/*!\n * Chart.js v3.9.1\n * https://www.chartjs.org\n * (c) 2022 Chart.js Contributors\n * Released under the MIT License\n */\nimport { r as requestAnimFrame, a as resolve, e as effects, c as color, d as defaults, i as isObject, b as isArray, v as valueOrDefault, u as unlistenArrayEvents, l as listenArrayEvents, f as resolveObjectKey, g as isNumberFinite, h as createContext, j as defined, s as sign, k as isNullOrUndef, _ as _arrayUnique, t as toRadians, m as toPercentage, n as toDimension, T as TAU, o as formatNumber, p as _angleBetween, H as HALF_PI, P as PI, q as _getStartAndCountOfVisiblePoints, w as _scaleRangesChanged, x as isNumber, y as _parseObjectDataRadialScale, z as log10, A as _factorize, B as finiteOrDefault, C as callback, D as _addGrace, E as _limitValue, F as toDegrees, G as _measureText, I as _int16Range, J as _alignPixel, K as toPadding, L as clipArea, M as renderText, N as unclipArea, O as toFont, Q as each, R as _toLeftRightCenter, S as _alignStartEnd, U as overrides, V as merge, W as _capitalize, X as getRelativePosition, Y as _rlookupByKey, Z as _lookupByKey, $ as _isPointInArea, a0 as getAngleFromPoint, a1 as getMaximumSize, a2 as _getParentNode, a3 as readUsedSize, a4 as throttled, a5 as supportsEventListenerOptions, a6 as _isDomSupported, a7 as descriptors, a8 as isFunction, a9 as _attachContext, aa as _createResolver, ab as _descriptors, ac as mergeIf, ad as uid, ae as debounce, af as retinaScale, ag as clearCanvas, ah as setsEqual, ai as _elementsEqual, aj as _isClickEvent, ak as _isBetween, al as _readValueToProps, am as _updateBezierControlPoints, an as _computeSegments, ao as _boundSegments, ap as _steppedInterpolation, aq as _bezierInterpolation, ar as _pointInLine, as as _steppedLineTo, at as _bezierCurveTo, au as drawPoint, av as addRoundedRectPath, aw as toTRBL, ax as toTRBLCorners, ay as _boundSegment, az as _normalizeAngle, aA as getRtlAdapter, aB as overrideTextDirection, aC as _textX, aD as restoreTextDirection, aE as drawPointLegend, aF as noop, aG as distanceBetweenPoints, aH as _setMinAndMaxByKey, aI as niceNum, aJ as almostWhole, aK as almostEquals, aL as _decimalPlaces, aM as _longestText, aN as _filterBetween, aO as _lookup } from './chunks/helpers.segment.mjs';\nexport { d as defaults } from './chunks/helpers.segment.mjs';\n\nclass Animator {\n  constructor() {\n    this._request = null;\n    this._charts = new Map();\n    this._running = false;\n    this._lastDate = undefined;\n  }\n  _notify(chart, anims, date, type) {\n    const callbacks = anims.listeners[type];\n    const numSteps = anims.duration;\n    callbacks.forEach(fn => fn({\n      chart,\n      initial: anims.initial,\n      numSteps,\n      currentStep: Math.min(date - anims.start, numSteps)\n    }));\n  }\n  _refresh() {\n    if (this._request) {\n      return;\n    }\n    this._running = true;\n    this._request = requestAnimFrame.call(window, () => {\n      this._update();\n      this._request = null;\n      if (this._running) {\n        this._refresh();\n      }\n    });\n  }\n  _update(date = Date.now()) {\n    let remaining = 0;\n    this._charts.forEach((anims, chart) => {\n      if (!anims.running || !anims.items.length) {\n        return;\n      }\n      const items = anims.items;\n      let i = items.length - 1;\n      let draw = false;\n      let item;\n      for (; i >= 0; --i) {\n        item = items[i];\n        if (item._active) {\n          if (item._total > anims.duration) {\n            anims.duration = item._total;\n          }\n          item.tick(date);\n          draw = true;\n        } else {\n          items[i] = items[items.length - 1];\n          items.pop();\n        }\n      }\n      if (draw) {\n        chart.draw();\n        this._notify(chart, anims, date, 'progress');\n      }\n      if (!items.length) {\n        anims.running = false;\n        this._notify(chart, anims, date, 'complete');\n        anims.initial = false;\n      }\n      remaining += items.length;\n    });\n    this._lastDate = date;\n    if (remaining === 0) {\n      this._running = false;\n    }\n  }\n  _getAnims(chart) {\n    const charts = this._charts;\n    let anims = charts.get(chart);\n    if (!anims) {\n      anims = {\n        running: false,\n        initial: true,\n        items: [],\n        listeners: {\n          complete: [],\n          progress: []\n        }\n      };\n      charts.set(chart, anims);\n    }\n    return anims;\n  }\n  listen(chart, event, cb) {\n    this._getAnims(chart).listeners[event].push(cb);\n  }\n  add(chart, items) {\n    if (!items || !items.length) {\n      return;\n    }\n    this._getAnims(chart).items.push(...items);\n  }\n  has(chart) {\n    return this._getAnims(chart).items.length > 0;\n  }\n  start(chart) {\n    const anims = this._charts.get(chart);\n    if (!anims) {\n      return;\n    }\n    anims.running = true;\n    anims.start = Date.now();\n    anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n    this._refresh();\n  }\n  running(chart) {\n    if (!this._running) {\n      return false;\n    }\n    const anims = this._charts.get(chart);\n    if (!anims || !anims.running || !anims.items.length) {\n      return false;\n    }\n    return true;\n  }\n  stop(chart) {\n    const anims = this._charts.get(chart);\n    if (!anims || !anims.items.length) {\n      return;\n    }\n    const items = anims.items;\n    let i = items.length - 1;\n    for (; i >= 0; --i) {\n      items[i].cancel();\n    }\n    anims.items = [];\n    this._notify(chart, anims, Date.now(), 'complete');\n  }\n  remove(chart) {\n    return this._charts.delete(chart);\n  }\n}\nvar animator = new Animator();\n\nconst transparent = 'transparent';\nconst interpolators = {\n  boolean(from, to, factor) {\n    return factor > 0.5 ? to : from;\n  },\n  color(from, to, factor) {\n    const c0 = color(from || transparent);\n    const c1 = c0.valid && color(to || transparent);\n    return c1 && c1.valid\n      ? c1.mix(c0, factor).hexString()\n      : to;\n  },\n  number(from, to, factor) {\n    return from + (to - from) * factor;\n  }\n};\nclass Animation {\n  constructor(cfg, target, prop, to) {\n    const currentValue = target[prop];\n    to = resolve([cfg.to, to, currentValue, cfg.from]);\n    const from = resolve([cfg.from, currentValue, to]);\n    this._active = true;\n    this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n    this._easing = effects[cfg.easing] || effects.linear;\n    this._start = Math.floor(Date.now() + (cfg.delay || 0));\n    this._duration = this._total = Math.floor(cfg.duration);\n    this._loop = !!cfg.loop;\n    this._target = target;\n    this._prop = prop;\n    this._from = from;\n    this._to = to;\n    this._promises = undefined;\n  }\n  active() {\n    return this._active;\n  }\n  update(cfg, to, date) {\n    if (this._active) {\n      this._notify(false);\n      const currentValue = this._target[this._prop];\n      const elapsed = date - this._start;\n      const remain = this._duration - elapsed;\n      this._start = date;\n      this._duration = Math.floor(Math.max(remain, cfg.duration));\n      this._total += elapsed;\n      this._loop = !!cfg.loop;\n      this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n      this._from = resolve([cfg.from, currentValue, to]);\n    }\n  }\n  cancel() {\n    if (this._active) {\n      this.tick(Date.now());\n      this._active = false;\n      this._notify(false);\n    }\n  }\n  tick(date) {\n    const elapsed = date - this._start;\n    const duration = this._duration;\n    const prop = this._prop;\n    const from = this._from;\n    const loop = this._loop;\n    const to = this._to;\n    let factor;\n    this._active = from !== to && (loop || (elapsed < duration));\n    if (!this._active) {\n      this._target[prop] = to;\n      this._notify(true);\n      return;\n    }\n    if (elapsed < 0) {\n      this._target[prop] = from;\n      return;\n    }\n    factor = (elapsed / duration) % 2;\n    factor = loop && factor > 1 ? 2 - factor : factor;\n    factor = this._easing(Math.min(1, Math.max(0, factor)));\n    this._target[prop] = this._fn(from, to, factor);\n  }\n  wait() {\n    const promises = this._promises || (this._promises = []);\n    return new Promise((res, rej) => {\n      promises.push({res, rej});\n    });\n  }\n  _notify(resolved) {\n    const method = resolved ? 'res' : 'rej';\n    const promises = this._promises || [];\n    for (let i = 0; i < promises.length; i++) {\n      promises[i][method]();\n    }\n  }\n}\n\nconst numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\ndefaults.set('animation', {\n  delay: undefined,\n  duration: 1000,\n  easing: 'easeOutQuart',\n  fn: undefined,\n  from: undefined,\n  loop: undefined,\n  to: undefined,\n  type: undefined,\n});\nconst animationOptions = Object.keys(defaults.animation);\ndefaults.describe('animation', {\n  _fallback: false,\n  _indexable: false,\n  _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n});\ndefaults.set('animations', {\n  colors: {\n    type: 'color',\n    properties: colors\n  },\n  numbers: {\n    type: 'number',\n    properties: numbers\n  },\n});\ndefaults.describe('animations', {\n  _fallback: 'animation',\n});\ndefaults.set('transitions', {\n  active: {\n    animation: {\n      duration: 400\n    }\n  },\n  resize: {\n    animation: {\n      duration: 0\n    }\n  },\n  show: {\n    animations: {\n      colors: {\n        from: 'transparent'\n      },\n      visible: {\n        type: 'boolean',\n        duration: 0\n      },\n    }\n  },\n  hide: {\n    animations: {\n      colors: {\n        to: 'transparent'\n      },\n      visible: {\n        type: 'boolean',\n        easing: 'linear',\n        fn: v => v | 0\n      },\n    }\n  }\n});\nclass Animations {\n  constructor(chart, config) {\n    this._chart = chart;\n    this._properties = new Map();\n    this.configure(config);\n  }\n  configure(config) {\n    if (!isObject(config)) {\n      return;\n    }\n    const animatedProps = this._properties;\n    Object.getOwnPropertyNames(config).forEach(key => {\n      const cfg = config[key];\n      if (!isObject(cfg)) {\n        return;\n      }\n      const resolved = {};\n      for (const option of animationOptions) {\n        resolved[option] = cfg[option];\n      }\n      (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n        if (prop === key || !animatedProps.has(prop)) {\n          animatedProps.set(prop, resolved);\n        }\n      });\n    });\n  }\n  _animateOptions(target, values) {\n    const newOptions = values.options;\n    const options = resolveTargetOptions(target, newOptions);\n    if (!options) {\n      return [];\n    }\n    const animations = this._createAnimations(options, newOptions);\n    if (newOptions.$shared) {\n      awaitAll(target.options.$animations, newOptions).then(() => {\n        target.options = newOptions;\n      }, () => {\n      });\n    }\n    return animations;\n  }\n  _createAnimations(target, values) {\n    const animatedProps = this._properties;\n    const animations = [];\n    const running = target.$animations || (target.$animations = {});\n    const props = Object.keys(values);\n    const date = Date.now();\n    let i;\n    for (i = props.length - 1; i >= 0; --i) {\n      const prop = props[i];\n      if (prop.charAt(0) === '$') {\n        continue;\n      }\n      if (prop === 'options') {\n        animations.push(...this._animateOptions(target, values));\n        continue;\n      }\n      const value = values[prop];\n      let animation = running[prop];\n      const cfg = animatedProps.get(prop);\n      if (animation) {\n        if (cfg && animation.active()) {\n          animation.update(cfg, value, date);\n          continue;\n        } else {\n          animation.cancel();\n        }\n      }\n      if (!cfg || !cfg.duration) {\n        target[prop] = value;\n        continue;\n      }\n      running[prop] = animation = new Animation(cfg, target, prop, value);\n      animations.push(animation);\n    }\n    return animations;\n  }\n  update(target, values) {\n    if (this._properties.size === 0) {\n      Object.assign(target, values);\n      return;\n    }\n    const animations = this._createAnimations(target, values);\n    if (animations.length) {\n      animator.add(this._chart, animations);\n      return true;\n    }\n  }\n}\nfunction awaitAll(animations, properties) {\n  const running = [];\n  const keys = Object.keys(properties);\n  for (let i = 0; i < keys.length; i++) {\n    const anim = animations[keys[i]];\n    if (anim && anim.active()) {\n      running.push(anim.wait());\n    }\n  }\n  return Promise.all(running);\n}\nfunction resolveTargetOptions(target, newOptions) {\n  if (!newOptions) {\n    return;\n  }\n  let options = target.options;\n  if (!options) {\n    target.options = newOptions;\n    return;\n  }\n  if (options.$shared) {\n    target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n  }\n  return options;\n}\n\nfunction scaleClip(scale, allowedOverflow) {\n  const opts = scale && scale.options || {};\n  const reverse = opts.reverse;\n  const min = opts.min === undefined ? allowedOverflow : 0;\n  const max = opts.max === undefined ? allowedOverflow : 0;\n  return {\n    start: reverse ? max : min,\n    end: reverse ? min : max\n  };\n}\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n  if (allowedOverflow === false) {\n    return false;\n  }\n  const x = scaleClip(xScale, allowedOverflow);\n  const y = scaleClip(yScale, allowedOverflow);\n  return {\n    top: y.end,\n    right: x.end,\n    bottom: y.start,\n    left: x.start\n  };\n}\nfunction toClip(value) {\n  let t, r, b, l;\n  if (isObject(value)) {\n    t = value.top;\n    r = value.right;\n    b = value.bottom;\n    l = value.left;\n  } else {\n    t = r = b = l = value;\n  }\n  return {\n    top: t,\n    right: r,\n    bottom: b,\n    left: l,\n    disabled: value === false\n  };\n}\nfunction getSortedDatasetIndices(chart, filterVisible) {\n  const keys = [];\n  const metasets = chart._getSortedDatasetMetas(filterVisible);\n  let i, ilen;\n  for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n    keys.push(metasets[i].index);\n  }\n  return keys;\n}\nfunction applyStack(stack, value, dsIndex, options = {}) {\n  const keys = stack.keys;\n  const singleMode = options.mode === 'single';\n  let i, ilen, datasetIndex, otherValue;\n  if (value === null) {\n    return;\n  }\n  for (i = 0, ilen = keys.length; i < ilen; ++i) {\n    datasetIndex = +keys[i];\n    if (datasetIndex === dsIndex) {\n      if (options.all) {\n        continue;\n      }\n      break;\n    }\n    otherValue = stack.values[datasetIndex];\n    if (isNumberFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n      value += otherValue;\n    }\n  }\n  return value;\n}\nfunction convertObjectDataToArray(data) {\n  const keys = Object.keys(data);\n  const adata = new Array(keys.length);\n  let i, ilen, key;\n  for (i = 0, ilen = keys.length; i < ilen; ++i) {\n    key = keys[i];\n    adata[i] = {\n      x: key,\n      y: data[key]\n    };\n  }\n  return adata;\n}\nfunction isStacked(scale, meta) {\n  const stacked = scale && scale.options.stacked;\n  return stacked || (stacked === undefined && meta.stack !== undefined);\n}\nfunction getStackKey(indexScale, valueScale, meta) {\n  return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\nfunction getUserBounds(scale) {\n  const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n  return {\n    min: minDefined ? min : Number.NEGATIVE_INFINITY,\n    max: maxDefined ? max : Number.POSITIVE_INFINITY\n  };\n}\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n  const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n  return subStack[indexValue] || (subStack[indexValue] = {});\n}\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n  for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {\n    const value = stack[meta.index];\n    if ((positive && value > 0) || (!positive && value < 0)) {\n      return meta.index;\n    }\n  }\n  return null;\n}\nfunction updateStacks(controller, parsed) {\n  const {chart, _cachedMeta: meta} = controller;\n  const stacks = chart._stacks || (chart._stacks = {});\n  const {iScale, vScale, index: datasetIndex} = meta;\n  const iAxis = iScale.axis;\n  const vAxis = vScale.axis;\n  const key = getStackKey(iScale, vScale, meta);\n  const ilen = parsed.length;\n  let stack;\n  for (let i = 0; i < ilen; ++i) {\n    const item = parsed[i];\n    const {[iAxis]: index, [vAxis]: value} = item;\n    const itemStacks = item._stacks || (item._stacks = {});\n    stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n    stack[datasetIndex] = value;\n    stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n    stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n  }\n}\nfunction getFirstScaleId(chart, axis) {\n  const scales = chart.scales;\n  return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\nfunction createDatasetContext(parent, index) {\n  return createContext(parent,\n    {\n      active: false,\n      dataset: undefined,\n      datasetIndex: index,\n      index,\n      mode: 'default',\n      type: 'dataset'\n    }\n  );\n}\nfunction createDataContext(parent, index, element) {\n  return createContext(parent, {\n    active: false,\n    dataIndex: index,\n    parsed: undefined,\n    raw: undefined,\n    element,\n    index,\n    mode: 'default',\n    type: 'data'\n  });\n}\nfunction clearStacks(meta, items) {\n  const datasetIndex = meta.controller.index;\n  const axis = meta.vScale && meta.vScale.axis;\n  if (!axis) {\n    return;\n  }\n  items = items || meta._parsed;\n  for (const parsed of items) {\n    const stacks = parsed._stacks;\n    if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n      return;\n    }\n    delete stacks[axis][datasetIndex];\n  }\n}\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n  && {keys: getSortedDatasetIndices(chart, true), values: null};\nclass DatasetController {\n  constructor(chart, datasetIndex) {\n    this.chart = chart;\n    this._ctx = chart.ctx;\n    this.index = datasetIndex;\n    this._cachedDataOpts = {};\n    this._cachedMeta = this.getMeta();\n    this._type = this._cachedMeta.type;\n    this.options = undefined;\n    this._parsing = false;\n    this._data = undefined;\n    this._objectData = undefined;\n    this._sharedOptions = undefined;\n    this._drawStart = undefined;\n    this._drawCount = undefined;\n    this.enableOptionSharing = false;\n    this.supportsDecimation = false;\n    this.$context = undefined;\n    this._syncList = [];\n    this.initialize();\n  }\n  initialize() {\n    const meta = this._cachedMeta;\n    this.configure();\n    this.linkScales();\n    meta._stacked = isStacked(meta.vScale, meta);\n    this.addElements();\n  }\n  updateIndex(datasetIndex) {\n    if (this.index !== datasetIndex) {\n      clearStacks(this._cachedMeta);\n    }\n    this.index = datasetIndex;\n  }\n  linkScales() {\n    const chart = this.chart;\n    const meta = this._cachedMeta;\n    const dataset = this.getDataset();\n    const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n    const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n    const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n    const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n    const indexAxis = meta.indexAxis;\n    const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n    const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n    meta.xScale = this.getScaleForId(xid);\n    meta.yScale = this.getScaleForId(yid);\n    meta.rScale = this.getScaleForId(rid);\n    meta.iScale = this.getScaleForId(iid);\n    meta.vScale = this.getScaleForId(vid);\n  }\n  getDataset() {\n    return this.chart.data.datasets[this.index];\n  }\n  getMeta() {\n    return this.chart.getDatasetMeta(this.index);\n  }\n  getScaleForId(scaleID) {\n    return this.chart.scales[scaleID];\n  }\n  _getOtherScale(scale) {\n    const meta = this._cachedMeta;\n    return scale === meta.iScale\n      ? meta.vScale\n      : meta.iScale;\n  }\n  reset() {\n    this._update('reset');\n  }\n  _destroy() {\n    const meta = this._cachedMeta;\n    if (this._data) {\n      unlistenArrayEvents(this._data, this);\n    }\n    if (meta._stacked) {\n      clearStacks(meta);\n    }\n  }\n  _dataCheck() {\n    const dataset = this.getDataset();\n    const data = dataset.data || (dataset.data = []);\n    const _data = this._data;\n    if (isObject(data)) {\n      this._data = convertObjectDataToArray(data);\n    } else if (_data !== data) {\n      if (_data) {\n        unlistenArrayEvents(_data, this);\n        const meta = this._cachedMeta;\n        clearStacks(meta);\n        meta._parsed = [];\n      }\n      if (data && Object.isExtensible(data)) {\n        listenArrayEvents(data, this);\n      }\n      this._syncList = [];\n      this._data = data;\n    }\n  }\n  addElements() {\n    const meta = this._cachedMeta;\n    this._dataCheck();\n    if (this.datasetElementType) {\n      meta.dataset = new this.datasetElementType();\n    }\n  }\n  buildOrUpdateElements(resetNewElements) {\n    const meta = this._cachedMeta;\n    const dataset = this.getDataset();\n    let stackChanged = false;\n    this._dataCheck();\n    const oldStacked = meta._stacked;\n    meta._stacked = isStacked(meta.vScale, meta);\n    if (meta.stack !== dataset.stack) {\n      stackChanged = true;\n      clearStacks(meta);\n      meta.stack = dataset.stack;\n    }\n    this._resyncElements(resetNewElements);\n    if (stackChanged || oldStacked !== meta._stacked) {\n      updateStacks(this, meta._parsed);\n    }\n  }\n  configure() {\n    const config = this.chart.config;\n    const scopeKeys = config.datasetScopeKeys(this._type);\n    const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n    this.options = config.createResolver(scopes, this.getContext());\n    this._parsing = this.options.parsing;\n    this._cachedDataOpts = {};\n  }\n  parse(start, count) {\n    const {_cachedMeta: meta, _data: data} = this;\n    const {iScale, _stacked} = meta;\n    const iAxis = iScale.axis;\n    let sorted = start === 0 && count === data.length ? true : meta._sorted;\n    let prev = start > 0 && meta._parsed[start - 1];\n    let i, cur, parsed;\n    if (this._parsing === false) {\n      meta._parsed = data;\n      meta._sorted = true;\n      parsed = data;\n    } else {\n      if (isArray(data[start])) {\n        parsed = this.parseArrayData(meta, data, start, count);\n      } else if (isObject(data[start])) {\n        parsed = this.parseObjectData(meta, data, start, count);\n      } else {\n        parsed = this.parsePrimitiveData(meta, data, start, count);\n      }\n      const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n      for (i = 0; i < count; ++i) {\n        meta._parsed[i + start] = cur = parsed[i];\n        if (sorted) {\n          if (isNotInOrderComparedToPrev()) {\n            sorted = false;\n          }\n          prev = cur;\n        }\n      }\n      meta._sorted = sorted;\n    }\n    if (_stacked) {\n      updateStacks(this, parsed);\n    }\n  }\n  parsePrimitiveData(meta, data, start, count) {\n    const {iScale, vScale} = meta;\n    const iAxis = iScale.axis;\n    const vAxis = vScale.axis;\n    const labels = iScale.getLabels();\n    const singleScale = iScale === vScale;\n    const parsed = new Array(count);\n    let i, ilen, index;\n    for (i = 0, ilen = count; i < ilen; ++i) {\n      index = i + start;\n      parsed[i] = {\n        [iAxis]: singleScale || iScale.parse(labels[index], index),\n        [vAxis]: vScale.parse(data[index], index)\n      };\n    }\n    return parsed;\n  }\n  parseArrayData(meta, data, start, count) {\n    const {xScale, yScale} = meta;\n    const parsed = new Array(count);\n    let i, ilen, index, item;\n    for (i = 0, ilen = count; i < ilen; ++i) {\n      index = i + start;\n      item = data[index];\n      parsed[i] = {\n        x: xScale.parse(item[0], index),\n        y: yScale.parse(item[1], index)\n      };\n    }\n    return parsed;\n  }\n  parseObjectData(meta, data, start, count) {\n    const {xScale, yScale} = meta;\n    const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n    const parsed = new Array(count);\n    let i, ilen, index, item;\n    for (i = 0, ilen = count; i < ilen; ++i) {\n      index = i + start;\n      item = data[index];\n      parsed[i] = {\n        x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n        y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n      };\n    }\n    return parsed;\n  }\n  getParsed(index) {\n    return this._cachedMeta._parsed[index];\n  }\n  getDataElement(index) {\n    return this._cachedMeta.data[index];\n  }\n  applyStack(scale, parsed, mode) {\n    const chart = this.chart;\n    const meta = this._cachedMeta;\n    const value = parsed[scale.axis];\n    const stack = {\n      keys: getSortedDatasetIndices(chart, true),\n      values: parsed._stacks[scale.axis]\n    };\n    return applyStack(stack, value, meta.index, {mode});\n  }\n  updateRangeFromParsed(range, scale, parsed, stack) {\n    const parsedValue = parsed[scale.axis];\n    let value = parsedValue === null ? NaN : parsedValue;\n    const values = stack && parsed._stacks[scale.axis];\n    if (stack && values) {\n      stack.values = values;\n      value = applyStack(stack, parsedValue, this._cachedMeta.index);\n    }\n    range.min = Math.min(range.min, value);\n    range.max = Math.max(range.max, value);\n  }\n  getMinMax(scale, canStack) {\n    const meta = this._cachedMeta;\n    const _parsed = meta._parsed;\n    const sorted = meta._sorted && scale === meta.iScale;\n    const ilen = _parsed.length;\n    const otherScale = this._getOtherScale(scale);\n    const stack = createStack(canStack, meta, this.chart);\n    const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n    const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n    let i, parsed;\n    function _skip() {\n      parsed = _parsed[i];\n      const otherValue = parsed[otherScale.axis];\n      return !isNumberFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n    }\n    for (i = 0; i < ilen; ++i) {\n      if (_skip()) {\n        continue;\n      }\n      this.updateRangeFromParsed(range, scale, parsed, stack);\n      if (sorted) {\n        break;\n      }\n    }\n    if (sorted) {\n      for (i = ilen - 1; i >= 0; --i) {\n        if (_skip()) {\n          continue;\n        }\n        this.updateRangeFromParsed(range, scale, parsed, stack);\n        break;\n      }\n    }\n    return range;\n  }\n  getAllParsedValues(scale) {\n    const parsed = this._cachedMeta._parsed;\n    const values = [];\n    let i, ilen, value;\n    for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n      value = parsed[i][scale.axis];\n      if (isNumberFinite(value)) {\n        values.push(value);\n      }\n    }\n    return values;\n  }\n  getMaxOverflow() {\n    return false;\n  }\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const iScale = meta.iScale;\n    const vScale = meta.vScale;\n    const parsed = this.getParsed(index);\n    return {\n      label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n      value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n    };\n  }\n  _update(mode) {\n    const meta = this._cachedMeta;\n    this.update(mode || 'default');\n    meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n  }\n  update(mode) {}\n  draw() {\n    const ctx = this._ctx;\n    const chart = this.chart;\n    const meta = this._cachedMeta;\n    const elements = meta.data || [];\n    const area = chart.chartArea;\n    const active = [];\n    const start = this._drawStart || 0;\n    const count = this._drawCount || (elements.length - start);\n    const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n    let i;\n    if (meta.dataset) {\n      meta.dataset.draw(ctx, area, start, count);\n    }\n    for (i = start; i < start + count; ++i) {\n      const element = elements[i];\n      if (element.hidden) {\n        continue;\n      }\n      if (element.active && drawActiveElementsOnTop) {\n        active.push(element);\n      } else {\n        element.draw(ctx, area);\n      }\n    }\n    for (i = 0; i < active.length; ++i) {\n      active[i].draw(ctx, area);\n    }\n  }\n  getStyle(index, active) {\n    const mode = active ? 'active' : 'default';\n    return index === undefined && this._cachedMeta.dataset\n      ? this.resolveDatasetElementOptions(mode)\n      : this.resolveDataElementOptions(index || 0, mode);\n  }\n  getContext(index, active, mode) {\n    const dataset = this.getDataset();\n    let context;\n    if (index >= 0 && index < this._cachedMeta.data.length) {\n      const element = this._cachedMeta.data[index];\n      context = element.$context ||\n        (element.$context = createDataContext(this.getContext(), index, element));\n      context.parsed = this.getParsed(index);\n      context.raw = dataset.data[index];\n      context.index = context.dataIndex = index;\n    } else {\n      context = this.$context ||\n        (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n      context.dataset = dataset;\n      context.index = context.datasetIndex = this.index;\n    }\n    context.active = !!active;\n    context.mode = mode;\n    return context;\n  }\n  resolveDatasetElementOptions(mode) {\n    return this._resolveElementOptions(this.datasetElementType.id, mode);\n  }\n  resolveDataElementOptions(index, mode) {\n    return this._resolveElementOptions(this.dataElementType.id, mode, index);\n  }\n  _resolveElementOptions(elementType, mode = 'default', index) {\n    const active = mode === 'active';\n    const cache = this._cachedDataOpts;\n    const cacheKey = elementType + '-' + mode;\n    const cached = cache[cacheKey];\n    const sharing = this.enableOptionSharing && defined(index);\n    if (cached) {\n      return cloneIfNotShared(cached, sharing);\n    }\n    const config = this.chart.config;\n    const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n    const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n    const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n    const names = Object.keys(defaults.elements[elementType]);\n    const context = () => this.getContext(index, active);\n    const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n    if (values.$shared) {\n      values.$shared = sharing;\n      cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n    }\n    return values;\n  }\n  _resolveAnimations(index, transition, active) {\n    const chart = this.chart;\n    const cache = this._cachedDataOpts;\n    const cacheKey = `animation-${transition}`;\n    const cached = cache[cacheKey];\n    if (cached) {\n      return cached;\n    }\n    let options;\n    if (chart.options.animation !== false) {\n      const config = this.chart.config;\n      const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n      const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n      options = config.createResolver(scopes, this.getContext(index, active, transition));\n    }\n    const animations = new Animations(chart, options && options.animations);\n    if (options && options._cacheable) {\n      cache[cacheKey] = Object.freeze(animations);\n    }\n    return animations;\n  }\n  getSharedOptions(options) {\n    if (!options.$shared) {\n      return;\n    }\n    return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n  }\n  includeOptions(mode, sharedOptions) {\n    return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n  }\n  _getSharedOptions(start, mode) {\n    const firstOpts = this.resolveDataElementOptions(start, mode);\n    const previouslySharedOptions = this._sharedOptions;\n    const sharedOptions = this.getSharedOptions(firstOpts);\n    const includeOptions = this.includeOptions(mode, sharedOptions) || (sharedOptions !== previouslySharedOptions);\n    this.updateSharedOptions(sharedOptions, mode, firstOpts);\n    return {sharedOptions, includeOptions};\n  }\n  updateElement(element, index, properties, mode) {\n    if (isDirectUpdateMode(mode)) {\n      Object.assign(element, properties);\n    } else {\n      this._resolveAnimations(index, mode).update(element, properties);\n    }\n  }\n  updateSharedOptions(sharedOptions, mode, newOptions) {\n    if (sharedOptions && !isDirectUpdateMode(mode)) {\n      this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n    }\n  }\n  _setStyle(element, index, mode, active) {\n    element.active = active;\n    const options = this.getStyle(index, active);\n    this._resolveAnimations(index, mode, active).update(element, {\n      options: (!active && this.getSharedOptions(options)) || options\n    });\n  }\n  removeHoverStyle(element, datasetIndex, index) {\n    this._setStyle(element, index, 'active', false);\n  }\n  setHoverStyle(element, datasetIndex, index) {\n    this._setStyle(element, index, 'active', true);\n  }\n  _removeDatasetHoverStyle() {\n    const element = this._cachedMeta.dataset;\n    if (element) {\n      this._setStyle(element, undefined, 'active', false);\n    }\n  }\n  _setDatasetHoverStyle() {\n    const element = this._cachedMeta.dataset;\n    if (element) {\n      this._setStyle(element, undefined, 'active', true);\n    }\n  }\n  _resyncElements(resetNewElements) {\n    const data = this._data;\n    const elements = this._cachedMeta.data;\n    for (const [method, arg1, arg2] of this._syncList) {\n      this[method](arg1, arg2);\n    }\n    this._syncList = [];\n    const numMeta = elements.length;\n    const numData = data.length;\n    const count = Math.min(numData, numMeta);\n    if (count) {\n      this.parse(0, count);\n    }\n    if (numData > numMeta) {\n      this._insertElements(numMeta, numData - numMeta, resetNewElements);\n    } else if (numData < numMeta) {\n      this._removeElements(numData, numMeta - numData);\n    }\n  }\n  _insertElements(start, count, resetNewElements = true) {\n    const meta = this._cachedMeta;\n    const data = meta.data;\n    const end = start + count;\n    let i;\n    const move = (arr) => {\n      arr.length += count;\n      for (i = arr.length - 1; i >= end; i--) {\n        arr[i] = arr[i - count];\n      }\n    };\n    move(data);\n    for (i = start; i < end; ++i) {\n      data[i] = new this.dataElementType();\n    }\n    if (this._parsing) {\n      move(meta._parsed);\n    }\n    this.parse(start, count);\n    if (resetNewElements) {\n      this.updateElements(data, start, count, 'reset');\n    }\n  }\n  updateElements(element, start, count, mode) {}\n  _removeElements(start, count) {\n    const meta = this._cachedMeta;\n    if (this._parsing) {\n      const removed = meta._parsed.splice(start, count);\n      if (meta._stacked) {\n        clearStacks(meta, removed);\n      }\n    }\n    meta.data.splice(start, count);\n  }\n  _sync(args) {\n    if (this._parsing) {\n      this._syncList.push(args);\n    } else {\n      const [method, arg1, arg2] = args;\n      this[method](arg1, arg2);\n    }\n    this.chart._dataChanges.push([this.index, ...args]);\n  }\n  _onDataPush() {\n    const count = arguments.length;\n    this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n  }\n  _onDataPop() {\n    this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n  }\n  _onDataShift() {\n    this._sync(['_removeElements', 0, 1]);\n  }\n  _onDataSplice(start, count) {\n    if (count) {\n      this._sync(['_removeElements', start, count]);\n    }\n    const newCount = arguments.length - 2;\n    if (newCount) {\n      this._sync(['_insertElements', start, newCount]);\n    }\n  }\n  _onDataUnshift() {\n    this._sync(['_insertElements', 0, arguments.length]);\n  }\n}\nDatasetController.defaults = {};\nDatasetController.prototype.datasetElementType = null;\nDatasetController.prototype.dataElementType = null;\n\nfunction getAllScaleValues(scale, type) {\n  if (!scale._cache.$bar) {\n    const visibleMetas = scale.getMatchingVisibleMetas(type);\n    let values = [];\n    for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n      values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n    }\n    scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n  }\n  return scale._cache.$bar;\n}\nfunction computeMinSampleSize(meta) {\n  const scale = meta.iScale;\n  const values = getAllScaleValues(scale, meta.type);\n  let min = scale._length;\n  let i, ilen, curr, prev;\n  const updateMinAndPrev = () => {\n    if (curr === 32767 || curr === -32768) {\n      return;\n    }\n    if (defined(prev)) {\n      min = Math.min(min, Math.abs(curr - prev) || min);\n    }\n    prev = curr;\n  };\n  for (i = 0, ilen = values.length; i < ilen; ++i) {\n    curr = scale.getPixelForValue(values[i]);\n    updateMinAndPrev();\n  }\n  prev = undefined;\n  for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n    curr = scale.getPixelForTick(i);\n    updateMinAndPrev();\n  }\n  return min;\n}\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n  const thickness = options.barThickness;\n  let size, ratio;\n  if (isNullOrUndef(thickness)) {\n    size = ruler.min * options.categoryPercentage;\n    ratio = options.barPercentage;\n  } else {\n    size = thickness * stackCount;\n    ratio = 1;\n  }\n  return {\n    chunk: size / stackCount,\n    ratio,\n    start: ruler.pixels[index] - (size / 2)\n  };\n}\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n  const pixels = ruler.pixels;\n  const curr = pixels[index];\n  let prev = index > 0 ? pixels[index - 1] : null;\n  let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n  const percent = options.categoryPercentage;\n  if (prev === null) {\n    prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n  }\n  if (next === null) {\n    next = curr + curr - prev;\n  }\n  const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n  const size = Math.abs(next - prev) / 2 * percent;\n  return {\n    chunk: size / stackCount,\n    ratio: options.barPercentage,\n    start\n  };\n}\nfunction parseFloatBar(entry, item, vScale, i) {\n  const startValue = vScale.parse(entry[0], i);\n  const endValue = vScale.parse(entry[1], i);\n  const min = Math.min(startValue, endValue);\n  const max = Math.max(startValue, endValue);\n  let barStart = min;\n  let barEnd = max;\n  if (Math.abs(min) > Math.abs(max)) {\n    barStart = max;\n    barEnd = min;\n  }\n  item[vScale.axis] = barEnd;\n  item._custom = {\n    barStart,\n    barEnd,\n    start: startValue,\n    end: endValue,\n    min,\n    max\n  };\n}\nfunction parseValue(entry, item, vScale, i) {\n  if (isArray(entry)) {\n    parseFloatBar(entry, item, vScale, i);\n  } else {\n    item[vScale.axis] = vScale.parse(entry, i);\n  }\n  return item;\n}\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n  const iScale = meta.iScale;\n  const vScale = meta.vScale;\n  const labels = iScale.getLabels();\n  const singleScale = iScale === vScale;\n  const parsed = [];\n  let i, ilen, item, entry;\n  for (i = start, ilen = start + count; i < ilen; ++i) {\n    entry = data[i];\n    item = {};\n    item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n    parsed.push(parseValue(entry, item, vScale, i));\n  }\n  return parsed;\n}\nfunction isFloatBar(custom) {\n  return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\nfunction barSign(size, vScale, actualBase) {\n  if (size !== 0) {\n    return sign(size);\n  }\n  return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\nfunction borderProps(properties) {\n  let reverse, start, end, top, bottom;\n  if (properties.horizontal) {\n    reverse = properties.base > properties.x;\n    start = 'left';\n    end = 'right';\n  } else {\n    reverse = properties.base < properties.y;\n    start = 'bottom';\n    end = 'top';\n  }\n  if (reverse) {\n    top = 'end';\n    bottom = 'start';\n  } else {\n    top = 'start';\n    bottom = 'end';\n  }\n  return {start, end, reverse, top, bottom};\n}\nfunction setBorderSkipped(properties, options, stack, index) {\n  let edge = options.borderSkipped;\n  const res = {};\n  if (!edge) {\n    properties.borderSkipped = res;\n    return;\n  }\n  if (edge === true) {\n    properties.borderSkipped = {top: true, right: true, bottom: true, left: true};\n    return;\n  }\n  const {start, end, reverse, top, bottom} = borderProps(properties);\n  if (edge === 'middle' && stack) {\n    properties.enableBorderRadius = true;\n    if ((stack._top || 0) === index) {\n      edge = top;\n    } else if ((stack._bottom || 0) === index) {\n      edge = bottom;\n    } else {\n      res[parseEdge(bottom, start, end, reverse)] = true;\n      edge = top;\n    }\n  }\n  res[parseEdge(edge, start, end, reverse)] = true;\n  properties.borderSkipped = res;\n}\nfunction parseEdge(edge, a, b, reverse) {\n  if (reverse) {\n    edge = swap(edge, a, b);\n    edge = startEnd(edge, b, a);\n  } else {\n    edge = startEnd(edge, a, b);\n  }\n  return edge;\n}\nfunction swap(orig, v1, v2) {\n  return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\nfunction startEnd(v, start, end) {\n  return v === 'start' ? start : v === 'end' ? end : v;\n}\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n  properties.inflateAmount = inflateAmount === 'auto'\n    ? ratio === 1 ? 0.33 : 0\n    : inflateAmount;\n}\nclass BarController extends DatasetController {\n  parsePrimitiveData(meta, data, start, count) {\n    return parseArrayOrPrimitive(meta, data, start, count);\n  }\n  parseArrayData(meta, data, start, count) {\n    return parseArrayOrPrimitive(meta, data, start, count);\n  }\n  parseObjectData(meta, data, start, count) {\n    const {iScale, vScale} = meta;\n    const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n    const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n    const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n    const parsed = [];\n    let i, ilen, item, obj;\n    for (i = start, ilen = start + count; i < ilen; ++i) {\n      obj = data[i];\n      item = {};\n      item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n      parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n    }\n    return parsed;\n  }\n  updateRangeFromParsed(range, scale, parsed, stack) {\n    super.updateRangeFromParsed(range, scale, parsed, stack);\n    const custom = parsed._custom;\n    if (custom && scale === this._cachedMeta.vScale) {\n      range.min = Math.min(range.min, custom.min);\n      range.max = Math.max(range.max, custom.max);\n    }\n  }\n  getMaxOverflow() {\n    return 0;\n  }\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const {iScale, vScale} = meta;\n    const parsed = this.getParsed(index);\n    const custom = parsed._custom;\n    const value = isFloatBar(custom)\n      ? '[' + custom.start + ', ' + custom.end + ']'\n      : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n    return {\n      label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n      value\n    };\n  }\n  initialize() {\n    this.enableOptionSharing = true;\n    super.initialize();\n    const meta = this._cachedMeta;\n    meta.stack = this.getDataset().stack;\n  }\n  update(mode) {\n    const meta = this._cachedMeta;\n    this.updateElements(meta.data, 0, meta.data.length, mode);\n  }\n  updateElements(bars, start, count, mode) {\n    const reset = mode === 'reset';\n    const {index, _cachedMeta: {vScale}} = this;\n    const base = vScale.getBasePixel();\n    const horizontal = vScale.isHorizontal();\n    const ruler = this._getRuler();\n    const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n    for (let i = start; i < start + count; i++) {\n      const parsed = this.getParsed(i);\n      const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n      const ipixels = this._calculateBarIndexPixels(i, ruler);\n      const stack = (parsed._stacks || {})[vScale.axis];\n      const properties = {\n        horizontal,\n        base: vpixels.base,\n        enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n        x: horizontal ? vpixels.head : ipixels.center,\n        y: horizontal ? ipixels.center : vpixels.head,\n        height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n        width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n      };\n      if (includeOptions) {\n        properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n      }\n      const options = properties.options || bars[i].options;\n      setBorderSkipped(properties, options, stack, index);\n      setInflateAmount(properties, options, ruler.ratio);\n      this.updateElement(bars[i], i, properties, mode);\n    }\n  }\n  _getStacks(last, dataIndex) {\n    const {iScale} = this._cachedMeta;\n    const metasets = iScale.getMatchingVisibleMetas(this._type)\n      .filter(meta => meta.controller.options.grouped);\n    const stacked = iScale.options.stacked;\n    const stacks = [];\n    const skipNull = (meta) => {\n      const parsed = meta.controller.getParsed(dataIndex);\n      const val = parsed && parsed[meta.vScale.axis];\n      if (isNullOrUndef(val) || isNaN(val)) {\n        return true;\n      }\n    };\n    for (const meta of metasets) {\n      if (dataIndex !== undefined && skipNull(meta)) {\n        continue;\n      }\n      if (stacked === false || stacks.indexOf(meta.stack) === -1 ||\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\n        stacks.push(meta.stack);\n      }\n      if (meta.index === last) {\n        break;\n      }\n    }\n    if (!stacks.length) {\n      stacks.push(undefined);\n    }\n    return stacks;\n  }\n  _getStackCount(index) {\n    return this._getStacks(undefined, index).length;\n  }\n  _getStackIndex(datasetIndex, name, dataIndex) {\n    const stacks = this._getStacks(datasetIndex, dataIndex);\n    const index = (name !== undefined)\n      ? stacks.indexOf(name)\n      : -1;\n    return (index === -1)\n      ? stacks.length - 1\n      : index;\n  }\n  _getRuler() {\n    const opts = this.options;\n    const meta = this._cachedMeta;\n    const iScale = meta.iScale;\n    const pixels = [];\n    let i, ilen;\n    for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n      pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n    }\n    const barThickness = opts.barThickness;\n    const min = barThickness || computeMinSampleSize(meta);\n    return {\n      min,\n      pixels,\n      start: iScale._startPixel,\n      end: iScale._endPixel,\n      stackCount: this._getStackCount(),\n      scale: iScale,\n      grouped: opts.grouped,\n      ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n    };\n  }\n  _calculateBarValuePixels(index) {\n    const {_cachedMeta: {vScale, _stacked}, options: {base: baseValue, minBarLength}} = this;\n    const actualBase = baseValue || 0;\n    const parsed = this.getParsed(index);\n    const custom = parsed._custom;\n    const floating = isFloatBar(custom);\n    let value = parsed[vScale.axis];\n    let start = 0;\n    let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n    let head, size;\n    if (length !== value) {\n      start = length - value;\n      length = value;\n    }\n    if (floating) {\n      value = custom.barStart;\n      length = custom.barEnd - custom.barStart;\n      if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n        start = 0;\n      }\n      start += value;\n    }\n    const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n    let base = vScale.getPixelForValue(startValue);\n    if (this.chart.getDataVisibility(index)) {\n      head = vScale.getPixelForValue(start + length);\n    } else {\n      head = base;\n    }\n    size = head - base;\n    if (Math.abs(size) < minBarLength) {\n      size = barSign(size, vScale, actualBase) * minBarLength;\n      if (value === actualBase) {\n        base -= size / 2;\n      }\n      const startPixel = vScale.getPixelForDecimal(0);\n      const endPixel = vScale.getPixelForDecimal(1);\n      const min = Math.min(startPixel, endPixel);\n      const max = Math.max(startPixel, endPixel);\n      base = Math.max(Math.min(base, max), min);\n      head = base + size;\n    }\n    if (base === vScale.getPixelForValue(actualBase)) {\n      const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n      base += halfGrid;\n      size -= halfGrid;\n    }\n    return {\n      size,\n      base,\n      head,\n      center: head + size / 2\n    };\n  }\n  _calculateBarIndexPixels(index, ruler) {\n    const scale = ruler.scale;\n    const options = this.options;\n    const skipNull = options.skipNull;\n    const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n    let center, size;\n    if (ruler.grouped) {\n      const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n      const range = options.barThickness === 'flex'\n        ? computeFlexCategoryTraits(index, ruler, options, stackCount)\n        : computeFitCategoryTraits(index, ruler, options, stackCount);\n      const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined);\n      center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n      size = Math.min(maxBarThickness, range.chunk * range.ratio);\n    } else {\n      center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n      size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n    }\n    return {\n      base: center - size / 2,\n      head: center + size / 2,\n      center,\n      size\n    };\n  }\n  draw() {\n    const meta = this._cachedMeta;\n    const vScale = meta.vScale;\n    const rects = meta.data;\n    const ilen = rects.length;\n    let i = 0;\n    for (; i < ilen; ++i) {\n      if (this.getParsed(i)[vScale.axis] !== null) {\n        rects[i].draw(this._ctx);\n      }\n    }\n  }\n}\nBarController.id = 'bar';\nBarController.defaults = {\n  datasetElementType: false,\n  dataElementType: 'bar',\n  categoryPercentage: 0.8,\n  barPercentage: 0.9,\n  grouped: true,\n  animations: {\n    numbers: {\n      type: 'number',\n      properties: ['x', 'y', 'base', 'width', 'height']\n    }\n  }\n};\nBarController.overrides = {\n  scales: {\n    _index_: {\n      type: 'category',\n      offset: true,\n      grid: {\n        offset: true\n      }\n    },\n    _value_: {\n      type: 'linear',\n      beginAtZero: true,\n    }\n  }\n};\n\nclass BubbleController extends DatasetController {\n  initialize() {\n    this.enableOptionSharing = true;\n    super.initialize();\n  }\n  parsePrimitiveData(meta, data, start, count) {\n    const parsed = super.parsePrimitiveData(meta, data, start, count);\n    for (let i = 0; i < parsed.length; i++) {\n      parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n    }\n    return parsed;\n  }\n  parseArrayData(meta, data, start, count) {\n    const parsed = super.parseArrayData(meta, data, start, count);\n    for (let i = 0; i < parsed.length; i++) {\n      const item = data[start + i];\n      parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n    }\n    return parsed;\n  }\n  parseObjectData(meta, data, start, count) {\n    const parsed = super.parseObjectData(meta, data, start, count);\n    for (let i = 0; i < parsed.length; i++) {\n      const item = data[start + i];\n      parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n    }\n    return parsed;\n  }\n  getMaxOverflow() {\n    const data = this._cachedMeta.data;\n    let max = 0;\n    for (let i = data.length - 1; i >= 0; --i) {\n      max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n    }\n    return max > 0 && max;\n  }\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const {xScale, yScale} = meta;\n    const parsed = this.getParsed(index);\n    const x = xScale.getLabelForValue(parsed.x);\n    const y = yScale.getLabelForValue(parsed.y);\n    const r = parsed._custom;\n    return {\n      label: meta.label,\n      value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n    };\n  }\n  update(mode) {\n    const points = this._cachedMeta.data;\n    this.updateElements(points, 0, points.length, mode);\n  }\n  updateElements(points, start, count, mode) {\n    const reset = mode === 'reset';\n    const {iScale, vScale} = this._cachedMeta;\n    const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n    const iAxis = iScale.axis;\n    const vAxis = vScale.axis;\n    for (let i = start; i < start + count; i++) {\n      const point = points[i];\n      const parsed = !reset && this.getParsed(i);\n      const properties = {};\n      const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n      const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n      properties.skip = isNaN(iPixel) || isNaN(vPixel);\n      if (includeOptions) {\n        properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n        if (reset) {\n          properties.options.radius = 0;\n        }\n      }\n      this.updateElement(point, i, properties, mode);\n    }\n  }\n  resolveDataElementOptions(index, mode) {\n    const parsed = this.getParsed(index);\n    let values = super.resolveDataElementOptions(index, mode);\n    if (values.$shared) {\n      values = Object.assign({}, values, {$shared: false});\n    }\n    const radius = values.radius;\n    if (mode !== 'active') {\n      values.radius = 0;\n    }\n    values.radius += valueOrDefault(parsed && parsed._custom, radius);\n    return values;\n  }\n}\nBubbleController.id = 'bubble';\nBubbleController.defaults = {\n  datasetElementType: false,\n  dataElementType: 'point',\n  animations: {\n    numbers: {\n      type: 'number',\n      properties: ['x', 'y', 'borderWidth', 'radius']\n    }\n  }\n};\nBubbleController.overrides = {\n  scales: {\n    x: {\n      type: 'linear'\n    },\n    y: {\n      type: 'linear'\n    }\n  },\n  plugins: {\n    tooltip: {\n      callbacks: {\n        title() {\n          return '';\n        }\n      }\n    }\n  }\n};\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n  let ratioX = 1;\n  let ratioY = 1;\n  let offsetX = 0;\n  let offsetY = 0;\n  if (circumference < TAU) {\n    const startAngle = rotation;\n    const endAngle = startAngle + circumference;\n    const startX = Math.cos(startAngle);\n    const startY = Math.sin(startAngle);\n    const endX = Math.cos(endAngle);\n    const endY = Math.sin(endAngle);\n    const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n    const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n    const maxX = calcMax(0, startX, endX);\n    const maxY = calcMax(HALF_PI, startY, endY);\n    const minX = calcMin(PI, startX, endX);\n    const minY = calcMin(PI + HALF_PI, startY, endY);\n    ratioX = (maxX - minX) / 2;\n    ratioY = (maxY - minY) / 2;\n    offsetX = -(maxX + minX) / 2;\n    offsetY = -(maxY + minY) / 2;\n  }\n  return {ratioX, ratioY, offsetX, offsetY};\n}\nclass DoughnutController extends DatasetController {\n  constructor(chart, datasetIndex) {\n    super(chart, datasetIndex);\n    this.enableOptionSharing = true;\n    this.innerRadius = undefined;\n    this.outerRadius = undefined;\n    this.offsetX = undefined;\n    this.offsetY = undefined;\n  }\n  linkScales() {}\n  parse(start, count) {\n    const data = this.getDataset().data;\n    const meta = this._cachedMeta;\n    if (this._parsing === false) {\n      meta._parsed = data;\n    } else {\n      let getter = (i) => +data[i];\n      if (isObject(data[start])) {\n        const {key = 'value'} = this._parsing;\n        getter = (i) => +resolveObjectKey(data[i], key);\n      }\n      let i, ilen;\n      for (i = start, ilen = start + count; i < ilen; ++i) {\n        meta._parsed[i] = getter(i);\n      }\n    }\n  }\n  _getRotation() {\n    return toRadians(this.options.rotation - 90);\n  }\n  _getCircumference() {\n    return toRadians(this.options.circumference);\n  }\n  _getRotationExtents() {\n    let min = TAU;\n    let max = -TAU;\n    for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n      if (this.chart.isDatasetVisible(i)) {\n        const controller = this.chart.getDatasetMeta(i).controller;\n        const rotation = controller._getRotation();\n        const circumference = controller._getCircumference();\n        min = Math.min(min, rotation);\n        max = Math.max(max, rotation + circumference);\n      }\n    }\n    return {\n      rotation: min,\n      circumference: max - min,\n    };\n  }\n  update(mode) {\n    const chart = this.chart;\n    const {chartArea} = chart;\n    const meta = this._cachedMeta;\n    const arcs = meta.data;\n    const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n    const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n    const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n    const chartWeight = this._getRingWeight(this.index);\n    const {circumference, rotation} = this._getRotationExtents();\n    const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n    const maxWidth = (chartArea.width - spacing) / ratioX;\n    const maxHeight = (chartArea.height - spacing) / ratioY;\n    const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n    const outerRadius = toDimension(this.options.radius, maxRadius);\n    const innerRadius = Math.max(outerRadius * cutout, 0);\n    const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n    this.offsetX = offsetX * outerRadius;\n    this.offsetY = offsetY * outerRadius;\n    meta.total = this.calculateTotal();\n    this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n    this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n    this.updateElements(arcs, 0, arcs.length, mode);\n  }\n  _circumference(i, reset) {\n    const opts = this.options;\n    const meta = this._cachedMeta;\n    const circumference = this._getCircumference();\n    if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n      return 0;\n    }\n    return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n  }\n  updateElements(arcs, start, count, mode) {\n    const reset = mode === 'reset';\n    const chart = this.chart;\n    const chartArea = chart.chartArea;\n    const opts = chart.options;\n    const animationOpts = opts.animation;\n    const centerX = (chartArea.left + chartArea.right) / 2;\n    const centerY = (chartArea.top + chartArea.bottom) / 2;\n    const animateScale = reset && animationOpts.animateScale;\n    const innerRadius = animateScale ? 0 : this.innerRadius;\n    const outerRadius = animateScale ? 0 : this.outerRadius;\n    const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n    let startAngle = this._getRotation();\n    let i;\n    for (i = 0; i < start; ++i) {\n      startAngle += this._circumference(i, reset);\n    }\n    for (i = start; i < start + count; ++i) {\n      const circumference = this._circumference(i, reset);\n      const arc = arcs[i];\n      const properties = {\n        x: centerX + this.offsetX,\n        y: centerY + this.offsetY,\n        startAngle,\n        endAngle: startAngle + circumference,\n        circumference,\n        outerRadius,\n        innerRadius\n      };\n      if (includeOptions) {\n        properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n      }\n      startAngle += circumference;\n      this.updateElement(arc, i, properties, mode);\n    }\n  }\n  calculateTotal() {\n    const meta = this._cachedMeta;\n    const metaData = meta.data;\n    let total = 0;\n    let i;\n    for (i = 0; i < metaData.length; i++) {\n      const value = meta._parsed[i];\n      if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n        total += Math.abs(value);\n      }\n    }\n    return total;\n  }\n  calculateCircumference(value) {\n    const total = this._cachedMeta.total;\n    if (total > 0 && !isNaN(value)) {\n      return TAU * (Math.abs(value) / total);\n    }\n    return 0;\n  }\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const chart = this.chart;\n    const labels = chart.data.labels || [];\n    const value = formatNumber(meta._parsed[index], chart.options.locale);\n    return {\n      label: labels[index] || '',\n      value,\n    };\n  }\n  getMaxBorderWidth(arcs) {\n    let max = 0;\n    const chart = this.chart;\n    let i, ilen, meta, controller, options;\n    if (!arcs) {\n      for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n        if (chart.isDatasetVisible(i)) {\n          meta = chart.getDatasetMeta(i);\n          arcs = meta.data;\n          controller = meta.controller;\n          break;\n        }\n      }\n    }\n    if (!arcs) {\n      return 0;\n    }\n    for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n      options = controller.resolveDataElementOptions(i);\n      if (options.borderAlign !== 'inner') {\n        max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n      }\n    }\n    return max;\n  }\n  getMaxOffset(arcs) {\n    let max = 0;\n    for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n      const options = this.resolveDataElementOptions(i);\n      max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n    }\n    return max;\n  }\n  _getRingWeightOffset(datasetIndex) {\n    let ringWeightOffset = 0;\n    for (let i = 0; i < datasetIndex; ++i) {\n      if (this.chart.isDatasetVisible(i)) {\n        ringWeightOffset += this._getRingWeight(i);\n      }\n    }\n    return ringWeightOffset;\n  }\n  _getRingWeight(datasetIndex) {\n    return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n  }\n  _getVisibleDatasetWeightTotal() {\n    return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n  }\n}\nDoughnutController.id = 'doughnut';\nDoughnutController.defaults = {\n  datasetElementType: false,\n  dataElementType: 'arc',\n  animation: {\n    animateRotate: true,\n    animateScale: false\n  },\n  animations: {\n    numbers: {\n      type: 'number',\n      properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n    },\n  },\n  cutout: '50%',\n  rotation: 0,\n  circumference: 360,\n  radius: '100%',\n  spacing: 0,\n  indexAxis: 'r',\n};\nDoughnutController.descriptors = {\n  _scriptable: (name) => name !== 'spacing',\n  _indexable: (name) => name !== 'spacing',\n};\nDoughnutController.overrides = {\n  aspectRatio: 1,\n  plugins: {\n    legend: {\n      labels: {\n        generateLabels(chart) {\n          const data = chart.data;\n          if (data.labels.length && data.datasets.length) {\n            const {labels: {pointStyle}} = chart.legend.options;\n            return data.labels.map((label, i) => {\n              const meta = chart.getDatasetMeta(0);\n              const style = meta.controller.getStyle(i);\n              return {\n                text: label,\n                fillStyle: style.backgroundColor,\n                strokeStyle: style.borderColor,\n                lineWidth: style.borderWidth,\n                pointStyle: pointStyle,\n                hidden: !chart.getDataVisibility(i),\n                index: i\n              };\n            });\n          }\n          return [];\n        }\n      },\n      onClick(e, legendItem, legend) {\n        legend.chart.toggleDataVisibility(legendItem.index);\n        legend.chart.update();\n      }\n    },\n    tooltip: {\n      callbacks: {\n        title() {\n          return '';\n        },\n        label(tooltipItem) {\n          let dataLabel = tooltipItem.label;\n          const value = ': ' + tooltipItem.formattedValue;\n          if (isArray(dataLabel)) {\n            dataLabel = dataLabel.slice();\n            dataLabel[0] += value;\n          } else {\n            dataLabel += value;\n          }\n          return dataLabel;\n        }\n      }\n    }\n  }\n};\n\nclass LineController extends DatasetController {\n  initialize() {\n    this.enableOptionSharing = true;\n    this.supportsDecimation = true;\n    super.initialize();\n  }\n  update(mode) {\n    const meta = this._cachedMeta;\n    const {dataset: line, data: points = [], _dataset} = meta;\n    const animationsDisabled = this.chart._animationsDisabled;\n    let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n    this._drawStart = start;\n    this._drawCount = count;\n    if (_scaleRangesChanged(meta)) {\n      start = 0;\n      count = points.length;\n    }\n    line._chart = this.chart;\n    line._datasetIndex = this.index;\n    line._decimated = !!_dataset._decimated;\n    line.points = points;\n    const options = this.resolveDatasetElementOptions(mode);\n    if (!this.options.showLine) {\n      options.borderWidth = 0;\n    }\n    options.segment = this.options.segment;\n    this.updateElement(line, undefined, {\n      animated: !animationsDisabled,\n      options\n    }, mode);\n    this.updateElements(points, start, count, mode);\n  }\n  updateElements(points, start, count, mode) {\n    const reset = mode === 'reset';\n    const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n    const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n    const iAxis = iScale.axis;\n    const vAxis = vScale.axis;\n    const {spanGaps, segment} = this.options;\n    const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n    const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n    let prevParsed = start > 0 && this.getParsed(start - 1);\n    for (let i = start; i < start + count; ++i) {\n      const point = points[i];\n      const parsed = this.getParsed(i);\n      const properties = directUpdate ? point : {};\n      const nullData = isNullOrUndef(parsed[vAxis]);\n      const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n      const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n      properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n      properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n      if (segment) {\n        properties.parsed = parsed;\n        properties.raw = _dataset.data[i];\n      }\n      if (includeOptions) {\n        properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n      }\n      if (!directUpdate) {\n        this.updateElement(point, i, properties, mode);\n      }\n      prevParsed = parsed;\n    }\n  }\n  getMaxOverflow() {\n    const meta = this._cachedMeta;\n    const dataset = meta.dataset;\n    const border = dataset.options && dataset.options.borderWidth || 0;\n    const data = meta.data || [];\n    if (!data.length) {\n      return border;\n    }\n    const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n    const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n    return Math.max(border, firstPoint, lastPoint) / 2;\n  }\n  draw() {\n    const meta = this._cachedMeta;\n    meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n    super.draw();\n  }\n}\nLineController.id = 'line';\nLineController.defaults = {\n  datasetElementType: 'line',\n  dataElementType: 'point',\n  showLine: true,\n  spanGaps: false,\n};\nLineController.overrides = {\n  scales: {\n    _index_: {\n      type: 'category',\n    },\n    _value_: {\n      type: 'linear',\n    },\n  }\n};\n\nclass PolarAreaController extends DatasetController {\n  constructor(chart, datasetIndex) {\n    super(chart, datasetIndex);\n    this.innerRadius = undefined;\n    this.outerRadius = undefined;\n  }\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const chart = this.chart;\n    const labels = chart.data.labels || [];\n    const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n    return {\n      label: labels[index] || '',\n      value,\n    };\n  }\n  parseObjectData(meta, data, start, count) {\n    return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n  }\n  update(mode) {\n    const arcs = this._cachedMeta.data;\n    this._updateRadius();\n    this.updateElements(arcs, 0, arcs.length, mode);\n  }\n  getMinMax() {\n    const meta = this._cachedMeta;\n    const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n    meta.data.forEach((element, index) => {\n      const parsed = this.getParsed(index).r;\n      if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n        if (parsed < range.min) {\n          range.min = parsed;\n        }\n        if (parsed > range.max) {\n          range.max = parsed;\n        }\n      }\n    });\n    return range;\n  }\n  _updateRadius() {\n    const chart = this.chart;\n    const chartArea = chart.chartArea;\n    const opts = chart.options;\n    const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n    const outerRadius = Math.max(minSize / 2, 0);\n    const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n    const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n    this.outerRadius = outerRadius - (radiusLength * this.index);\n    this.innerRadius = this.outerRadius - radiusLength;\n  }\n  updateElements(arcs, start, count, mode) {\n    const reset = mode === 'reset';\n    const chart = this.chart;\n    const opts = chart.options;\n    const animationOpts = opts.animation;\n    const scale = this._cachedMeta.rScale;\n    const centerX = scale.xCenter;\n    const centerY = scale.yCenter;\n    const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n    let angle = datasetStartAngle;\n    let i;\n    const defaultAngle = 360 / this.countVisibleElements();\n    for (i = 0; i < start; ++i) {\n      angle += this._computeAngle(i, mode, defaultAngle);\n    }\n    for (i = start; i < start + count; i++) {\n      const arc = arcs[i];\n      let startAngle = angle;\n      let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n      let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n      angle = endAngle;\n      if (reset) {\n        if (animationOpts.animateScale) {\n          outerRadius = 0;\n        }\n        if (animationOpts.animateRotate) {\n          startAngle = endAngle = datasetStartAngle;\n        }\n      }\n      const properties = {\n        x: centerX,\n        y: centerY,\n        innerRadius: 0,\n        outerRadius,\n        startAngle,\n        endAngle,\n        options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n      };\n      this.updateElement(arc, i, properties, mode);\n    }\n  }\n  countVisibleElements() {\n    const meta = this._cachedMeta;\n    let count = 0;\n    meta.data.forEach((element, index) => {\n      if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n        count++;\n      }\n    });\n    return count;\n  }\n  _computeAngle(index, mode, defaultAngle) {\n    return this.chart.getDataVisibility(index)\n      ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n      : 0;\n  }\n}\nPolarAreaController.id = 'polarArea';\nPolarAreaController.defaults = {\n  dataElementType: 'arc',\n  animation: {\n    animateRotate: true,\n    animateScale: true\n  },\n  animations: {\n    numbers: {\n      type: 'number',\n      properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n    },\n  },\n  indexAxis: 'r',\n  startAngle: 0,\n};\nPolarAreaController.overrides = {\n  aspectRatio: 1,\n  plugins: {\n    legend: {\n      labels: {\n        generateLabels(chart) {\n          const data = chart.data;\n          if (data.labels.length && data.datasets.length) {\n            const {labels: {pointStyle}} = chart.legend.options;\n            return data.labels.map((label, i) => {\n              const meta = chart.getDatasetMeta(0);\n              const style = meta.controller.getStyle(i);\n              return {\n                text: label,\n                fillStyle: style.backgroundColor,\n                strokeStyle: style.borderColor,\n                lineWidth: style.borderWidth,\n                pointStyle: pointStyle,\n                hidden: !chart.getDataVisibility(i),\n                index: i\n              };\n            });\n          }\n          return [];\n        }\n      },\n      onClick(e, legendItem, legend) {\n        legend.chart.toggleDataVisibility(legendItem.index);\n        legend.chart.update();\n      }\n    },\n    tooltip: {\n      callbacks: {\n        title() {\n          return '';\n        },\n        label(context) {\n          return context.chart.data.labels[context.dataIndex] + ': ' + context.formattedValue;\n        }\n      }\n    }\n  },\n  scales: {\n    r: {\n      type: 'radialLinear',\n      angleLines: {\n        display: false\n      },\n      beginAtZero: true,\n      grid: {\n        circular: true\n      },\n      pointLabels: {\n        display: false\n      },\n      startAngle: 0\n    }\n  }\n};\n\nclass PieController extends DoughnutController {\n}\nPieController.id = 'pie';\nPieController.defaults = {\n  cutout: 0,\n  rotation: 0,\n  circumference: 360,\n  radius: '100%'\n};\n\nclass RadarController extends DatasetController {\n  getLabelAndValue(index) {\n    const vScale = this._cachedMeta.vScale;\n    const parsed = this.getParsed(index);\n    return {\n      label: vScale.getLabels()[index],\n      value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n    };\n  }\n  parseObjectData(meta, data, start, count) {\n    return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n  }\n  update(mode) {\n    const meta = this._cachedMeta;\n    const line = meta.dataset;\n    const points = meta.data || [];\n    const labels = meta.iScale.getLabels();\n    line.points = points;\n    if (mode !== 'resize') {\n      const options = this.resolveDatasetElementOptions(mode);\n      if (!this.options.showLine) {\n        options.borderWidth = 0;\n      }\n      const properties = {\n        _loop: true,\n        _fullLoop: labels.length === points.length,\n        options\n      };\n      this.updateElement(line, undefined, properties, mode);\n    }\n    this.updateElements(points, 0, points.length, mode);\n  }\n  updateElements(points, start, count, mode) {\n    const scale = this._cachedMeta.rScale;\n    const reset = mode === 'reset';\n    for (let i = start; i < start + count; i++) {\n      const point = points[i];\n      const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n      const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n      const x = reset ? scale.xCenter : pointPosition.x;\n      const y = reset ? scale.yCenter : pointPosition.y;\n      const properties = {\n        x,\n        y,\n        angle: pointPosition.angle,\n        skip: isNaN(x) || isNaN(y),\n        options\n      };\n      this.updateElement(point, i, properties, mode);\n    }\n  }\n}\nRadarController.id = 'radar';\nRadarController.defaults = {\n  datasetElementType: 'line',\n  dataElementType: 'point',\n  indexAxis: 'r',\n  showLine: true,\n  elements: {\n    line: {\n      fill: 'start'\n    }\n  },\n};\nRadarController.overrides = {\n  aspectRatio: 1,\n  scales: {\n    r: {\n      type: 'radialLinear',\n    }\n  }\n};\n\nclass Element {\n  constructor() {\n    this.x = undefined;\n    this.y = undefined;\n    this.active = false;\n    this.options = undefined;\n    this.$animations = undefined;\n  }\n  tooltipPosition(useFinalPosition) {\n    const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n    return {x, y};\n  }\n  hasValue() {\n    return isNumber(this.x) && isNumber(this.y);\n  }\n  getProps(props, final) {\n    const anims = this.$animations;\n    if (!final || !anims) {\n      return this;\n    }\n    const ret = {};\n    props.forEach(prop => {\n      ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop];\n    });\n    return ret;\n  }\n}\nElement.defaults = {};\nElement.defaultRoutes = undefined;\n\nconst formatters = {\n  values(value) {\n    return isArray(value) ? value : '' + value;\n  },\n  numeric(tickValue, index, ticks) {\n    if (tickValue === 0) {\n      return '0';\n    }\n    const locale = this.chart.options.locale;\n    let notation;\n    let delta = tickValue;\n    if (ticks.length > 1) {\n      const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n      if (maxTick < 1e-4 || maxTick > 1e+15) {\n        notation = 'scientific';\n      }\n      delta = calculateDelta(tickValue, ticks);\n    }\n    const logDelta = log10(Math.abs(delta));\n    const numDecimal = Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n    const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n    Object.assign(options, this.options.ticks.format);\n    return formatNumber(tickValue, locale, options);\n  },\n  logarithmic(tickValue, index, ticks) {\n    if (tickValue === 0) {\n      return '0';\n    }\n    const remain = tickValue / (Math.pow(10, Math.floor(log10(tickValue))));\n    if (remain === 1 || remain === 2 || remain === 5) {\n      return formatters.numeric.call(this, tickValue, index, ticks);\n    }\n    return '';\n  }\n};\nfunction calculateDelta(tickValue, ticks) {\n  let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n  if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n    delta = tickValue - Math.floor(tickValue);\n  }\n  return delta;\n}\nvar Ticks = {formatters};\n\ndefaults.set('scale', {\n  display: true,\n  offset: false,\n  reverse: false,\n  beginAtZero: false,\n  bounds: 'ticks',\n  grace: 0,\n  grid: {\n    display: true,\n    lineWidth: 1,\n    drawBorder: true,\n    drawOnChartArea: true,\n    drawTicks: true,\n    tickLength: 8,\n    tickWidth: (_ctx, options) => options.lineWidth,\n    tickColor: (_ctx, options) => options.color,\n    offset: false,\n    borderDash: [],\n    borderDashOffset: 0.0,\n    borderWidth: 1\n  },\n  title: {\n    display: false,\n    text: '',\n    padding: {\n      top: 4,\n      bottom: 4\n    }\n  },\n  ticks: {\n    minRotation: 0,\n    maxRotation: 50,\n    mirror: false,\n    textStrokeWidth: 0,\n    textStrokeColor: '',\n    padding: 3,\n    display: true,\n    autoSkip: true,\n    autoSkipPadding: 3,\n    labelOffset: 0,\n    callback: Ticks.formatters.values,\n    minor: {},\n    major: {},\n    align: 'center',\n    crossAlign: 'near',\n    showLabelBackdrop: false,\n    backdropColor: 'rgba(255, 255, 255, 0.75)',\n    backdropPadding: 2,\n  }\n});\ndefaults.route('scale.ticks', 'color', '', 'color');\ndefaults.route('scale.grid', 'color', '', 'borderColor');\ndefaults.route('scale.grid', 'borderColor', '', 'borderColor');\ndefaults.route('scale.title', 'color', '', 'color');\ndefaults.describe('scale', {\n  _fallback: false,\n  _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n  _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash',\n});\ndefaults.describe('scales', {\n  _fallback: 'scale',\n});\ndefaults.describe('scale.ticks', {\n  _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n  _indexable: (name) => name !== 'backdropPadding',\n});\n\nfunction autoSkip(scale, ticks) {\n  const tickOpts = scale.options.ticks;\n  const ticksLimit = tickOpts.maxTicksLimit || determineMaxTicks(scale);\n  const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n  const numMajorIndices = majorIndices.length;\n  const first = majorIndices[0];\n  const last = majorIndices[numMajorIndices - 1];\n  const newTicks = [];\n  if (numMajorIndices > ticksLimit) {\n    skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n    return newTicks;\n  }\n  const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n  if (numMajorIndices > 0) {\n    let i, ilen;\n    const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n    skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n    for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n      skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n    }\n    skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n    return newTicks;\n  }\n  skip(ticks, newTicks, spacing);\n  return newTicks;\n}\nfunction determineMaxTicks(scale) {\n  const offset = scale.options.offset;\n  const tickLength = scale._tickSize();\n  const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n  const maxChart = scale._maxLength / tickLength;\n  return Math.floor(Math.min(maxScale, maxChart));\n}\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n  const evenMajorSpacing = getEvenSpacing(majorIndices);\n  const spacing = ticks.length / ticksLimit;\n  if (!evenMajorSpacing) {\n    return Math.max(spacing, 1);\n  }\n  const factors = _factorize(evenMajorSpacing);\n  for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n    const factor = factors[i];\n    if (factor > spacing) {\n      return factor;\n    }\n  }\n  return Math.max(spacing, 1);\n}\nfunction getMajorIndices(ticks) {\n  const result = [];\n  let i, ilen;\n  for (i = 0, ilen = ticks.length; i < ilen; i++) {\n    if (ticks[i].major) {\n      result.push(i);\n    }\n  }\n  return result;\n}\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n  let count = 0;\n  let next = majorIndices[0];\n  let i;\n  spacing = Math.ceil(spacing);\n  for (i = 0; i < ticks.length; i++) {\n    if (i === next) {\n      newTicks.push(ticks[i]);\n      count++;\n      next = majorIndices[count * spacing];\n    }\n  }\n}\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n  const start = valueOrDefault(majorStart, 0);\n  const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n  let count = 0;\n  let length, i, next;\n  spacing = Math.ceil(spacing);\n  if (majorEnd) {\n    length = majorEnd - majorStart;\n    spacing = length / Math.floor(length / spacing);\n  }\n  next = start;\n  while (next < 0) {\n    count++;\n    next = Math.round(start + count * spacing);\n  }\n  for (i = Math.max(start, 0); i < end; i++) {\n    if (i === next) {\n      newTicks.push(ticks[i]);\n      count++;\n      next = Math.round(start + count * spacing);\n    }\n  }\n}\nfunction getEvenSpacing(arr) {\n  const len = arr.length;\n  let i, diff;\n  if (len < 2) {\n    return false;\n  }\n  for (diff = arr[0], i = 1; i < len; ++i) {\n    if (arr[i] - arr[i - 1] !== diff) {\n      return false;\n    }\n  }\n  return diff;\n}\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nfunction sample(arr, numItems) {\n  const result = [];\n  const increment = arr.length / numItems;\n  const len = arr.length;\n  let i = 0;\n  for (; i < len; i += increment) {\n    result.push(arr[Math.floor(i)]);\n  }\n  return result;\n}\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n  const length = scale.ticks.length;\n  const validIndex = Math.min(index, length - 1);\n  const start = scale._startPixel;\n  const end = scale._endPixel;\n  const epsilon = 1e-6;\n  let lineValue = scale.getPixelForTick(validIndex);\n  let offset;\n  if (offsetGridLines) {\n    if (length === 1) {\n      offset = Math.max(lineValue - start, end - lineValue);\n    } else if (index === 0) {\n      offset = (scale.getPixelForTick(1) - lineValue) / 2;\n    } else {\n      offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n    }\n    lineValue += validIndex < index ? offset : -offset;\n    if (lineValue < start - epsilon || lineValue > end + epsilon) {\n      return;\n    }\n  }\n  return lineValue;\n}\nfunction garbageCollect(caches, length) {\n  each(caches, (cache) => {\n    const gc = cache.gc;\n    const gcLen = gc.length / 2;\n    let i;\n    if (gcLen > length) {\n      for (i = 0; i < gcLen; ++i) {\n        delete cache.data[gc[i]];\n      }\n      gc.splice(0, gcLen);\n    }\n  });\n}\nfunction getTickMarkLength(options) {\n  return options.drawTicks ? options.tickLength : 0;\n}\nfunction getTitleHeight(options, fallback) {\n  if (!options.display) {\n    return 0;\n  }\n  const font = toFont(options.font, fallback);\n  const padding = toPadding(options.padding);\n  const lines = isArray(options.text) ? options.text.length : 1;\n  return (lines * font.lineHeight) + padding.height;\n}\nfunction createScaleContext(parent, scale) {\n  return createContext(parent, {\n    scale,\n    type: 'scale'\n  });\n}\nfunction createTickContext(parent, index, tick) {\n  return createContext(parent, {\n    tick,\n    index,\n    type: 'tick'\n  });\n}\nfunction titleAlign(align, position, reverse) {\n  let ret = _toLeftRightCenter(align);\n  if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n    ret = reverseAlign(ret);\n  }\n  return ret;\n}\nfunction titleArgs(scale, offset, position, align) {\n  const {top, left, bottom, right, chart} = scale;\n  const {chartArea, scales} = chart;\n  let rotation = 0;\n  let maxWidth, titleX, titleY;\n  const height = bottom - top;\n  const width = right - left;\n  if (scale.isHorizontal()) {\n    titleX = _alignStartEnd(align, left, right);\n    if (isObject(position)) {\n      const positionAxisID = Object.keys(position)[0];\n      const value = position[positionAxisID];\n      titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n    } else if (position === 'center') {\n      titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n    } else {\n      titleY = offsetFromEdge(scale, position, offset);\n    }\n    maxWidth = right - left;\n  } else {\n    if (isObject(position)) {\n      const positionAxisID = Object.keys(position)[0];\n      const value = position[positionAxisID];\n      titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n    } else if (position === 'center') {\n      titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n    } else {\n      titleX = offsetFromEdge(scale, position, offset);\n    }\n    titleY = _alignStartEnd(align, bottom, top);\n    rotation = position === 'left' ? -HALF_PI : HALF_PI;\n  }\n  return {titleX, titleY, maxWidth, rotation};\n}\nclass Scale extends Element {\n  constructor(cfg) {\n    super();\n    this.id = cfg.id;\n    this.type = cfg.type;\n    this.options = undefined;\n    this.ctx = cfg.ctx;\n    this.chart = cfg.chart;\n    this.top = undefined;\n    this.bottom = undefined;\n    this.left = undefined;\n    this.right = undefined;\n    this.width = undefined;\n    this.height = undefined;\n    this._margins = {\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0\n    };\n    this.maxWidth = undefined;\n    this.maxHeight = undefined;\n    this.paddingTop = undefined;\n    this.paddingBottom = undefined;\n    this.paddingLeft = undefined;\n    this.paddingRight = undefined;\n    this.axis = undefined;\n    this.labelRotation = undefined;\n    this.min = undefined;\n    this.max = undefined;\n    this._range = undefined;\n    this.ticks = [];\n    this._gridLineItems = null;\n    this._labelItems = null;\n    this._labelSizes = null;\n    this._length = 0;\n    this._maxLength = 0;\n    this._longestTextCache = {};\n    this._startPixel = undefined;\n    this._endPixel = undefined;\n    this._reversePixels = false;\n    this._userMax = undefined;\n    this._userMin = undefined;\n    this._suggestedMax = undefined;\n    this._suggestedMin = undefined;\n    this._ticksLength = 0;\n    this._borderValue = 0;\n    this._cache = {};\n    this._dataLimitsCached = false;\n    this.$context = undefined;\n  }\n  init(options) {\n    this.options = options.setContext(this.getContext());\n    this.axis = options.axis;\n    this._userMin = this.parse(options.min);\n    this._userMax = this.parse(options.max);\n    this._suggestedMin = this.parse(options.suggestedMin);\n    this._suggestedMax = this.parse(options.suggestedMax);\n  }\n  parse(raw, index) {\n    return raw;\n  }\n  getUserBounds() {\n    let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n    _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n    _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n    _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n    _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n    return {\n      min: finiteOrDefault(_userMin, _suggestedMin),\n      max: finiteOrDefault(_userMax, _suggestedMax),\n      minDefined: isNumberFinite(_userMin),\n      maxDefined: isNumberFinite(_userMax)\n    };\n  }\n  getMinMax(canStack) {\n    let {min, max, minDefined, maxDefined} = this.getUserBounds();\n    let range;\n    if (minDefined && maxDefined) {\n      return {min, max};\n    }\n    const metas = this.getMatchingVisibleMetas();\n    for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n      range = metas[i].controller.getMinMax(this, canStack);\n      if (!minDefined) {\n        min = Math.min(min, range.min);\n      }\n      if (!maxDefined) {\n        max = Math.max(max, range.max);\n      }\n    }\n    min = maxDefined && min > max ? max : min;\n    max = minDefined && min > max ? min : max;\n    return {\n      min: finiteOrDefault(min, finiteOrDefault(max, min)),\n      max: finiteOrDefault(max, finiteOrDefault(min, max))\n    };\n  }\n  getPadding() {\n    return {\n      left: this.paddingLeft || 0,\n      top: this.paddingTop || 0,\n      right: this.paddingRight || 0,\n      bottom: this.paddingBottom || 0\n    };\n  }\n  getTicks() {\n    return this.ticks;\n  }\n  getLabels() {\n    const data = this.chart.data;\n    return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n  }\n  beforeLayout() {\n    this._cache = {};\n    this._dataLimitsCached = false;\n  }\n  beforeUpdate() {\n    callback(this.options.beforeUpdate, [this]);\n  }\n  update(maxWidth, maxHeight, margins) {\n    const {beginAtZero, grace, ticks: tickOpts} = this.options;\n    const sampleSize = tickOpts.sampleSize;\n    this.beforeUpdate();\n    this.maxWidth = maxWidth;\n    this.maxHeight = maxHeight;\n    this._margins = margins = Object.assign({\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0\n    }, margins);\n    this.ticks = null;\n    this._labelSizes = null;\n    this._gridLineItems = null;\n    this._labelItems = null;\n    this.beforeSetDimensions();\n    this.setDimensions();\n    this.afterSetDimensions();\n    this._maxLength = this.isHorizontal()\n      ? this.width + margins.left + margins.right\n      : this.height + margins.top + margins.bottom;\n    if (!this._dataLimitsCached) {\n      this.beforeDataLimits();\n      this.determineDataLimits();\n      this.afterDataLimits();\n      this._range = _addGrace(this, grace, beginAtZero);\n      this._dataLimitsCached = true;\n    }\n    this.beforeBuildTicks();\n    this.ticks = this.buildTicks() || [];\n    this.afterBuildTicks();\n    const samplingEnabled = sampleSize < this.ticks.length;\n    this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n    this.configure();\n    this.beforeCalculateLabelRotation();\n    this.calculateLabelRotation();\n    this.afterCalculateLabelRotation();\n    if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n      this.ticks = autoSkip(this, this.ticks);\n      this._labelSizes = null;\n      this.afterAutoSkip();\n    }\n    if (samplingEnabled) {\n      this._convertTicksToLabels(this.ticks);\n    }\n    this.beforeFit();\n    this.fit();\n    this.afterFit();\n    this.afterUpdate();\n  }\n  configure() {\n    let reversePixels = this.options.reverse;\n    let startPixel, endPixel;\n    if (this.isHorizontal()) {\n      startPixel = this.left;\n      endPixel = this.right;\n    } else {\n      startPixel = this.top;\n      endPixel = this.bottom;\n      reversePixels = !reversePixels;\n    }\n    this._startPixel = startPixel;\n    this._endPixel = endPixel;\n    this._reversePixels = reversePixels;\n    this._length = endPixel - startPixel;\n    this._alignToPixels = this.options.alignToPixels;\n  }\n  afterUpdate() {\n    callback(this.options.afterUpdate, [this]);\n  }\n  beforeSetDimensions() {\n    callback(this.options.beforeSetDimensions, [this]);\n  }\n  setDimensions() {\n    if (this.isHorizontal()) {\n      this.width = this.maxWidth;\n      this.left = 0;\n      this.right = this.width;\n    } else {\n      this.height = this.maxHeight;\n      this.top = 0;\n      this.bottom = this.height;\n    }\n    this.paddingLeft = 0;\n    this.paddingTop = 0;\n    this.paddingRight = 0;\n    this.paddingBottom = 0;\n  }\n  afterSetDimensions() {\n    callback(this.options.afterSetDimensions, [this]);\n  }\n  _callHooks(name) {\n    this.chart.notifyPlugins(name, this.getContext());\n    callback(this.options[name], [this]);\n  }\n  beforeDataLimits() {\n    this._callHooks('beforeDataLimits');\n  }\n  determineDataLimits() {}\n  afterDataLimits() {\n    this._callHooks('afterDataLimits');\n  }\n  beforeBuildTicks() {\n    this._callHooks('beforeBuildTicks');\n  }\n  buildTicks() {\n    return [];\n  }\n  afterBuildTicks() {\n    this._callHooks('afterBuildTicks');\n  }\n  beforeTickToLabelConversion() {\n    callback(this.options.beforeTickToLabelConversion, [this]);\n  }\n  generateTickLabels(ticks) {\n    const tickOpts = this.options.ticks;\n    let i, ilen, tick;\n    for (i = 0, ilen = ticks.length; i < ilen; i++) {\n      tick = ticks[i];\n      tick.label = callback(tickOpts.callback, [tick.value, i, ticks], this);\n    }\n  }\n  afterTickToLabelConversion() {\n    callback(this.options.afterTickToLabelConversion, [this]);\n  }\n  beforeCalculateLabelRotation() {\n    callback(this.options.beforeCalculateLabelRotation, [this]);\n  }\n  calculateLabelRotation() {\n    const options = this.options;\n    const tickOpts = options.ticks;\n    const numTicks = this.ticks.length;\n    const minRotation = tickOpts.minRotation || 0;\n    const maxRotation = tickOpts.maxRotation;\n    let labelRotation = minRotation;\n    let tickWidth, maxHeight, maxLabelDiagonal;\n    if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n      this.labelRotation = minRotation;\n      return;\n    }\n    const labelSizes = this._getLabelSizes();\n    const maxLabelWidth = labelSizes.widest.width;\n    const maxLabelHeight = labelSizes.highest.height;\n    const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n    tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n    if (maxLabelWidth + 6 > tickWidth) {\n      tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n      maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n      maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n      labelRotation = toDegrees(Math.min(\n        Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n        Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n      ));\n      labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n    }\n    this.labelRotation = labelRotation;\n  }\n  afterCalculateLabelRotation() {\n    callback(this.options.afterCalculateLabelRotation, [this]);\n  }\n  afterAutoSkip() {}\n  beforeFit() {\n    callback(this.options.beforeFit, [this]);\n  }\n  fit() {\n    const minSize = {\n      width: 0,\n      height: 0\n    };\n    const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n    const display = this._isVisible();\n    const isHorizontal = this.isHorizontal();\n    if (display) {\n      const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n      if (isHorizontal) {\n        minSize.width = this.maxWidth;\n        minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n      } else {\n        minSize.height = this.maxHeight;\n        minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n      }\n      if (tickOpts.display && this.ticks.length) {\n        const {first, last, widest, highest} = this._getLabelSizes();\n        const tickPadding = tickOpts.padding * 2;\n        const angleRadians = toRadians(this.labelRotation);\n        const cos = Math.cos(angleRadians);\n        const sin = Math.sin(angleRadians);\n        if (isHorizontal) {\n          const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n          minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n        } else {\n          const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n          minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n        }\n        this._calculatePadding(first, last, sin, cos);\n      }\n    }\n    this._handleMargins();\n    if (isHorizontal) {\n      this.width = this._length = chart.width - this._margins.left - this._margins.right;\n      this.height = minSize.height;\n    } else {\n      this.width = minSize.width;\n      this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n    }\n  }\n  _calculatePadding(first, last, sin, cos) {\n    const {ticks: {align, padding}, position} = this.options;\n    const isRotated = this.labelRotation !== 0;\n    const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n    if (this.isHorizontal()) {\n      const offsetLeft = this.getPixelForTick(0) - this.left;\n      const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n      let paddingLeft = 0;\n      let paddingRight = 0;\n      if (isRotated) {\n        if (labelsBelowTicks) {\n          paddingLeft = cos * first.width;\n          paddingRight = sin * last.height;\n        } else {\n          paddingLeft = sin * first.height;\n          paddingRight = cos * last.width;\n        }\n      } else if (align === 'start') {\n        paddingRight = last.width;\n      } else if (align === 'end') {\n        paddingLeft = first.width;\n      } else if (align !== 'inner') {\n        paddingLeft = first.width / 2;\n        paddingRight = last.width / 2;\n      }\n      this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n      this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n    } else {\n      let paddingTop = last.height / 2;\n      let paddingBottom = first.height / 2;\n      if (align === 'start') {\n        paddingTop = 0;\n        paddingBottom = first.height;\n      } else if (align === 'end') {\n        paddingTop = last.height;\n        paddingBottom = 0;\n      }\n      this.paddingTop = paddingTop + padding;\n      this.paddingBottom = paddingBottom + padding;\n    }\n  }\n  _handleMargins() {\n    if (this._margins) {\n      this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n      this._margins.top = Math.max(this.paddingTop, this._margins.top);\n      this._margins.right = Math.max(this.paddingRight, this._margins.right);\n      this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n    }\n  }\n  afterFit() {\n    callback(this.options.afterFit, [this]);\n  }\n  isHorizontal() {\n    const {axis, position} = this.options;\n    return position === 'top' || position === 'bottom' || axis === 'x';\n  }\n  isFullSize() {\n    return this.options.fullSize;\n  }\n  _convertTicksToLabels(ticks) {\n    this.beforeTickToLabelConversion();\n    this.generateTickLabels(ticks);\n    let i, ilen;\n    for (i = 0, ilen = ticks.length; i < ilen; i++) {\n      if (isNullOrUndef(ticks[i].label)) {\n        ticks.splice(i, 1);\n        ilen--;\n        i--;\n      }\n    }\n    this.afterTickToLabelConversion();\n  }\n  _getLabelSizes() {\n    let labelSizes = this._labelSizes;\n    if (!labelSizes) {\n      const sampleSize = this.options.ticks.sampleSize;\n      let ticks = this.ticks;\n      if (sampleSize < ticks.length) {\n        ticks = sample(ticks, sampleSize);\n      }\n      this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length);\n    }\n    return labelSizes;\n  }\n  _computeLabelSizes(ticks, length) {\n    const {ctx, _longestTextCache: caches} = this;\n    const widths = [];\n    const heights = [];\n    let widestLabelSize = 0;\n    let highestLabelSize = 0;\n    let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n    for (i = 0; i < length; ++i) {\n      label = ticks[i].label;\n      tickFont = this._resolveTickFontOptions(i);\n      ctx.font = fontString = tickFont.string;\n      cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n      lineHeight = tickFont.lineHeight;\n      width = height = 0;\n      if (!isNullOrUndef(label) && !isArray(label)) {\n        width = _measureText(ctx, cache.data, cache.gc, width, label);\n        height = lineHeight;\n      } else if (isArray(label)) {\n        for (j = 0, jlen = label.length; j < jlen; ++j) {\n          nestedLabel = label[j];\n          if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n            width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n            height += lineHeight;\n          }\n        }\n      }\n      widths.push(width);\n      heights.push(height);\n      widestLabelSize = Math.max(width, widestLabelSize);\n      highestLabelSize = Math.max(height, highestLabelSize);\n    }\n    garbageCollect(caches, length);\n    const widest = widths.indexOf(widestLabelSize);\n    const highest = heights.indexOf(highestLabelSize);\n    const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n    return {\n      first: valueAt(0),\n      last: valueAt(length - 1),\n      widest: valueAt(widest),\n      highest: valueAt(highest),\n      widths,\n      heights,\n    };\n  }\n  getLabelForValue(value) {\n    return value;\n  }\n  getPixelForValue(value, index) {\n    return NaN;\n  }\n  getValueForPixel(pixel) {}\n  getPixelForTick(index) {\n    const ticks = this.ticks;\n    if (index < 0 || index > ticks.length - 1) {\n      return null;\n    }\n    return this.getPixelForValue(ticks[index].value);\n  }\n  getPixelForDecimal(decimal) {\n    if (this._reversePixels) {\n      decimal = 1 - decimal;\n    }\n    const pixel = this._startPixel + decimal * this._length;\n    return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n  }\n  getDecimalForPixel(pixel) {\n    const decimal = (pixel - this._startPixel) / this._length;\n    return this._reversePixels ? 1 - decimal : decimal;\n  }\n  getBasePixel() {\n    return this.getPixelForValue(this.getBaseValue());\n  }\n  getBaseValue() {\n    const {min, max} = this;\n    return min < 0 && max < 0 ? max :\n      min > 0 && max > 0 ? min :\n      0;\n  }\n  getContext(index) {\n    const ticks = this.ticks || [];\n    if (index >= 0 && index < ticks.length) {\n      const tick = ticks[index];\n      return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(this.getContext(), index, tick));\n    }\n    return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n  }\n  _tickSize() {\n    const optionTicks = this.options.ticks;\n    const rot = toRadians(this.labelRotation);\n    const cos = Math.abs(Math.cos(rot));\n    const sin = Math.abs(Math.sin(rot));\n    const labelSizes = this._getLabelSizes();\n    const padding = optionTicks.autoSkipPadding || 0;\n    const w = labelSizes ? labelSizes.widest.width + padding : 0;\n    const h = labelSizes ? labelSizes.highest.height + padding : 0;\n    return this.isHorizontal()\n      ? h * cos > w * sin ? w / cos : h / sin\n      : h * sin < w * cos ? h / cos : w / sin;\n  }\n  _isVisible() {\n    const display = this.options.display;\n    if (display !== 'auto') {\n      return !!display;\n    }\n    return this.getMatchingVisibleMetas().length > 0;\n  }\n  _computeGridLineItems(chartArea) {\n    const axis = this.axis;\n    const chart = this.chart;\n    const options = this.options;\n    const {grid, position} = options;\n    const offset = grid.offset;\n    const isHorizontal = this.isHorizontal();\n    const ticks = this.ticks;\n    const ticksLength = ticks.length + (offset ? 1 : 0);\n    const tl = getTickMarkLength(grid);\n    const items = [];\n    const borderOpts = grid.setContext(this.getContext());\n    const axisWidth = borderOpts.drawBorder ? borderOpts.borderWidth : 0;\n    const axisHalfWidth = axisWidth / 2;\n    const alignBorderValue = function(pixel) {\n      return _alignPixel(chart, pixel, axisWidth);\n    };\n    let borderValue, i, lineValue, alignedLineValue;\n    let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n    if (position === 'top') {\n      borderValue = alignBorderValue(this.bottom);\n      ty1 = this.bottom - tl;\n      ty2 = borderValue - axisHalfWidth;\n      y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n      y2 = chartArea.bottom;\n    } else if (position === 'bottom') {\n      borderValue = alignBorderValue(this.top);\n      y1 = chartArea.top;\n      y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n      ty1 = borderValue + axisHalfWidth;\n      ty2 = this.top + tl;\n    } else if (position === 'left') {\n      borderValue = alignBorderValue(this.right);\n      tx1 = this.right - tl;\n      tx2 = borderValue - axisHalfWidth;\n      x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n      x2 = chartArea.right;\n    } else if (position === 'right') {\n      borderValue = alignBorderValue(this.left);\n      x1 = chartArea.left;\n      x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n      tx1 = borderValue + axisHalfWidth;\n      tx2 = this.left + tl;\n    } else if (axis === 'x') {\n      if (position === 'center') {\n        borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n      } else if (isObject(position)) {\n        const positionAxisID = Object.keys(position)[0];\n        const value = position[positionAxisID];\n        borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n      }\n      y1 = chartArea.top;\n      y2 = chartArea.bottom;\n      ty1 = borderValue + axisHalfWidth;\n      ty2 = ty1 + tl;\n    } else if (axis === 'y') {\n      if (position === 'center') {\n        borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n      } else if (isObject(position)) {\n        const positionAxisID = Object.keys(position)[0];\n        const value = position[positionAxisID];\n        borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n      }\n      tx1 = borderValue - axisHalfWidth;\n      tx2 = tx1 - tl;\n      x1 = chartArea.left;\n      x2 = chartArea.right;\n    }\n    const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n    const step = Math.max(1, Math.ceil(ticksLength / limit));\n    for (i = 0; i < ticksLength; i += step) {\n      const optsAtIndex = grid.setContext(this.getContext(i));\n      const lineWidth = optsAtIndex.lineWidth;\n      const lineColor = optsAtIndex.color;\n      const borderDash = optsAtIndex.borderDash || [];\n      const borderDashOffset = optsAtIndex.borderDashOffset;\n      const tickWidth = optsAtIndex.tickWidth;\n      const tickColor = optsAtIndex.tickColor;\n      const tickBorderDash = optsAtIndex.tickBorderDash || [];\n      const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n      lineValue = getPixelForGridLine(this, i, offset);\n      if (lineValue === undefined) {\n        continue;\n      }\n      alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n      if (isHorizontal) {\n        tx1 = tx2 = x1 = x2 = alignedLineValue;\n      } else {\n        ty1 = ty2 = y1 = y2 = alignedLineValue;\n      }\n      items.push({\n        tx1,\n        ty1,\n        tx2,\n        ty2,\n        x1,\n        y1,\n        x2,\n        y2,\n        width: lineWidth,\n        color: lineColor,\n        borderDash,\n        borderDashOffset,\n        tickWidth,\n        tickColor,\n        tickBorderDash,\n        tickBorderDashOffset,\n      });\n    }\n    this._ticksLength = ticksLength;\n    this._borderValue = borderValue;\n    return items;\n  }\n  _computeLabelItems(chartArea) {\n    const axis = this.axis;\n    const options = this.options;\n    const {position, ticks: optionTicks} = options;\n    const isHorizontal = this.isHorizontal();\n    const ticks = this.ticks;\n    const {align, crossAlign, padding, mirror} = optionTicks;\n    const tl = getTickMarkLength(options.grid);\n    const tickAndPadding = tl + padding;\n    const hTickAndPadding = mirror ? -padding : tickAndPadding;\n    const rotation = -toRadians(this.labelRotation);\n    const items = [];\n    let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n    let textBaseline = 'middle';\n    if (position === 'top') {\n      y = this.bottom - hTickAndPadding;\n      textAlign = this._getXAxisLabelAlignment();\n    } else if (position === 'bottom') {\n      y = this.top + hTickAndPadding;\n      textAlign = this._getXAxisLabelAlignment();\n    } else if (position === 'left') {\n      const ret = this._getYAxisLabelAlignment(tl);\n      textAlign = ret.textAlign;\n      x = ret.x;\n    } else if (position === 'right') {\n      const ret = this._getYAxisLabelAlignment(tl);\n      textAlign = ret.textAlign;\n      x = ret.x;\n    } else if (axis === 'x') {\n      if (position === 'center') {\n        y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n      } else if (isObject(position)) {\n        const positionAxisID = Object.keys(position)[0];\n        const value = position[positionAxisID];\n        y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n      }\n      textAlign = this._getXAxisLabelAlignment();\n    } else if (axis === 'y') {\n      if (position === 'center') {\n        x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n      } else if (isObject(position)) {\n        const positionAxisID = Object.keys(position)[0];\n        const value = position[positionAxisID];\n        x = this.chart.scales[positionAxisID].getPixelForValue(value);\n      }\n      textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n    }\n    if (axis === 'y') {\n      if (align === 'start') {\n        textBaseline = 'top';\n      } else if (align === 'end') {\n        textBaseline = 'bottom';\n      }\n    }\n    const labelSizes = this._getLabelSizes();\n    for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n      tick = ticks[i];\n      label = tick.label;\n      const optsAtIndex = optionTicks.setContext(this.getContext(i));\n      pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n      font = this._resolveTickFontOptions(i);\n      lineHeight = font.lineHeight;\n      lineCount = isArray(label) ? label.length : 1;\n      const halfCount = lineCount / 2;\n      const color = optsAtIndex.color;\n      const strokeColor = optsAtIndex.textStrokeColor;\n      const strokeWidth = optsAtIndex.textStrokeWidth;\n      let tickTextAlign = textAlign;\n      if (isHorizontal) {\n        x = pixel;\n        if (textAlign === 'inner') {\n          if (i === ilen - 1) {\n            tickTextAlign = !this.options.reverse ? 'right' : 'left';\n          } else if (i === 0) {\n            tickTextAlign = !this.options.reverse ? 'left' : 'right';\n          } else {\n            tickTextAlign = 'center';\n          }\n        }\n        if (position === 'top') {\n          if (crossAlign === 'near' || rotation !== 0) {\n            textOffset = -lineCount * lineHeight + lineHeight / 2;\n          } else if (crossAlign === 'center') {\n            textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n          } else {\n            textOffset = -labelSizes.highest.height + lineHeight / 2;\n          }\n        } else {\n          if (crossAlign === 'near' || rotation !== 0) {\n            textOffset = lineHeight / 2;\n          } else if (crossAlign === 'center') {\n            textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n          } else {\n            textOffset = labelSizes.highest.height - lineCount * lineHeight;\n          }\n        }\n        if (mirror) {\n          textOffset *= -1;\n        }\n      } else {\n        y = pixel;\n        textOffset = (1 - lineCount) * lineHeight / 2;\n      }\n      let backdrop;\n      if (optsAtIndex.showLabelBackdrop) {\n        const labelPadding = toPadding(optsAtIndex.backdropPadding);\n        const height = labelSizes.heights[i];\n        const width = labelSizes.widths[i];\n        let top = y + textOffset - labelPadding.top;\n        let left = x - labelPadding.left;\n        switch (textBaseline) {\n        case 'middle':\n          top -= height / 2;\n          break;\n        case 'bottom':\n          top -= height;\n          break;\n        }\n        switch (textAlign) {\n        case 'center':\n          left -= width / 2;\n          break;\n        case 'right':\n          left -= width;\n          break;\n        }\n        backdrop = {\n          left,\n          top,\n          width: width + labelPadding.width,\n          height: height + labelPadding.height,\n          color: optsAtIndex.backdropColor,\n        };\n      }\n      items.push({\n        rotation,\n        label,\n        font,\n        color,\n        strokeColor,\n        strokeWidth,\n        textOffset,\n        textAlign: tickTextAlign,\n        textBaseline,\n        translation: [x, y],\n        backdrop,\n      });\n    }\n    return items;\n  }\n  _getXAxisLabelAlignment() {\n    const {position, ticks} = this.options;\n    const rotation = -toRadians(this.labelRotation);\n    if (rotation) {\n      return position === 'top' ? 'left' : 'right';\n    }\n    let align = 'center';\n    if (ticks.align === 'start') {\n      align = 'left';\n    } else if (ticks.align === 'end') {\n      align = 'right';\n    } else if (ticks.align === 'inner') {\n      align = 'inner';\n    }\n    return align;\n  }\n  _getYAxisLabelAlignment(tl) {\n    const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n    const labelSizes = this._getLabelSizes();\n    const tickAndPadding = tl + padding;\n    const widest = labelSizes.widest.width;\n    let textAlign;\n    let x;\n    if (position === 'left') {\n      if (mirror) {\n        x = this.right + padding;\n        if (crossAlign === 'near') {\n          textAlign = 'left';\n        } else if (crossAlign === 'center') {\n          textAlign = 'center';\n          x += (widest / 2);\n        } else {\n          textAlign = 'right';\n          x += widest;\n        }\n      } else {\n        x = this.right - tickAndPadding;\n        if (crossAlign === 'near') {\n          textAlign = 'right';\n        } else if (crossAlign === 'center') {\n          textAlign = 'center';\n          x -= (widest / 2);\n        } else {\n          textAlign = 'left';\n          x = this.left;\n        }\n      }\n    } else if (position === 'right') {\n      if (mirror) {\n        x = this.left + padding;\n        if (crossAlign === 'near') {\n          textAlign = 'right';\n        } else if (crossAlign === 'center') {\n          textAlign = 'center';\n          x -= (widest / 2);\n        } else {\n          textAlign = 'left';\n          x -= widest;\n        }\n      } else {\n        x = this.left + tickAndPadding;\n        if (crossAlign === 'near') {\n          textAlign = 'left';\n        } else if (crossAlign === 'center') {\n          textAlign = 'center';\n          x += widest / 2;\n        } else {\n          textAlign = 'right';\n          x = this.right;\n        }\n      }\n    } else {\n      textAlign = 'right';\n    }\n    return {textAlign, x};\n  }\n  _computeLabelArea() {\n    if (this.options.ticks.mirror) {\n      return;\n    }\n    const chart = this.chart;\n    const position = this.options.position;\n    if (position === 'left' || position === 'right') {\n      return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n    } if (position === 'top' || position === 'bottom') {\n      return {top: this.top, left: 0, bottom: this.bottom, right: chart.width};\n    }\n  }\n  drawBackground() {\n    const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n    if (backgroundColor) {\n      ctx.save();\n      ctx.fillStyle = backgroundColor;\n      ctx.fillRect(left, top, width, height);\n      ctx.restore();\n    }\n  }\n  getLineWidthForValue(value) {\n    const grid = this.options.grid;\n    if (!this._isVisible() || !grid.display) {\n      return 0;\n    }\n    const ticks = this.ticks;\n    const index = ticks.findIndex(t => t.value === value);\n    if (index >= 0) {\n      const opts = grid.setContext(this.getContext(index));\n      return opts.lineWidth;\n    }\n    return 0;\n  }\n  drawGrid(chartArea) {\n    const grid = this.options.grid;\n    const ctx = this.ctx;\n    const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n    let i, ilen;\n    const drawLine = (p1, p2, style) => {\n      if (!style.width || !style.color) {\n        return;\n      }\n      ctx.save();\n      ctx.lineWidth = style.width;\n      ctx.strokeStyle = style.color;\n      ctx.setLineDash(style.borderDash || []);\n      ctx.lineDashOffset = style.borderDashOffset;\n      ctx.beginPath();\n      ctx.moveTo(p1.x, p1.y);\n      ctx.lineTo(p2.x, p2.y);\n      ctx.stroke();\n      ctx.restore();\n    };\n    if (grid.display) {\n      for (i = 0, ilen = items.length; i < ilen; ++i) {\n        const item = items[i];\n        if (grid.drawOnChartArea) {\n          drawLine(\n            {x: item.x1, y: item.y1},\n            {x: item.x2, y: item.y2},\n            item\n          );\n        }\n        if (grid.drawTicks) {\n          drawLine(\n            {x: item.tx1, y: item.ty1},\n            {x: item.tx2, y: item.ty2},\n            {\n              color: item.tickColor,\n              width: item.tickWidth,\n              borderDash: item.tickBorderDash,\n              borderDashOffset: item.tickBorderDashOffset\n            }\n          );\n        }\n      }\n    }\n  }\n  drawBorder() {\n    const {chart, ctx, options: {grid}} = this;\n    const borderOpts = grid.setContext(this.getContext());\n    const axisWidth = grid.drawBorder ? borderOpts.borderWidth : 0;\n    if (!axisWidth) {\n      return;\n    }\n    const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n    const borderValue = this._borderValue;\n    let x1, x2, y1, y2;\n    if (this.isHorizontal()) {\n      x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n      x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n      y1 = y2 = borderValue;\n    } else {\n      y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n      y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n      x1 = x2 = borderValue;\n    }\n    ctx.save();\n    ctx.lineWidth = borderOpts.borderWidth;\n    ctx.strokeStyle = borderOpts.borderColor;\n    ctx.beginPath();\n    ctx.moveTo(x1, y1);\n    ctx.lineTo(x2, y2);\n    ctx.stroke();\n    ctx.restore();\n  }\n  drawLabels(chartArea) {\n    const optionTicks = this.options.ticks;\n    if (!optionTicks.display) {\n      return;\n    }\n    const ctx = this.ctx;\n    const area = this._computeLabelArea();\n    if (area) {\n      clipArea(ctx, area);\n    }\n    const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n    let i, ilen;\n    for (i = 0, ilen = items.length; i < ilen; ++i) {\n      const item = items[i];\n      const tickFont = item.font;\n      const label = item.label;\n      if (item.backdrop) {\n        ctx.fillStyle = item.backdrop.color;\n        ctx.fillRect(item.backdrop.left, item.backdrop.top, item.backdrop.width, item.backdrop.height);\n      }\n      let y = item.textOffset;\n      renderText(ctx, label, 0, y, tickFont, item);\n    }\n    if (area) {\n      unclipArea(ctx);\n    }\n  }\n  drawTitle() {\n    const {ctx, options: {position, title, reverse}} = this;\n    if (!title.display) {\n      return;\n    }\n    const font = toFont(title.font);\n    const padding = toPadding(title.padding);\n    const align = title.align;\n    let offset = font.lineHeight / 2;\n    if (position === 'bottom' || position === 'center' || isObject(position)) {\n      offset += padding.bottom;\n      if (isArray(title.text)) {\n        offset += font.lineHeight * (title.text.length - 1);\n      }\n    } else {\n      offset += padding.top;\n    }\n    const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n    renderText(ctx, title.text, 0, 0, font, {\n      color: title.color,\n      maxWidth,\n      rotation,\n      textAlign: titleAlign(align, position, reverse),\n      textBaseline: 'middle',\n      translation: [titleX, titleY],\n    });\n  }\n  draw(chartArea) {\n    if (!this._isVisible()) {\n      return;\n    }\n    this.drawBackground();\n    this.drawGrid(chartArea);\n    this.drawBorder();\n    this.drawTitle();\n    this.drawLabels(chartArea);\n  }\n  _layers() {\n    const opts = this.options;\n    const tz = opts.ticks && opts.ticks.z || 0;\n    const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n    if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n      return [{\n        z: tz,\n        draw: (chartArea) => {\n          this.draw(chartArea);\n        }\n      }];\n    }\n    return [{\n      z: gz,\n      draw: (chartArea) => {\n        this.drawBackground();\n        this.drawGrid(chartArea);\n        this.drawTitle();\n      }\n    }, {\n      z: gz + 1,\n      draw: () => {\n        this.drawBorder();\n      }\n    }, {\n      z: tz,\n      draw: (chartArea) => {\n        this.drawLabels(chartArea);\n      }\n    }];\n  }\n  getMatchingVisibleMetas(type) {\n    const metas = this.chart.getSortedVisibleDatasetMetas();\n    const axisID = this.axis + 'AxisID';\n    const result = [];\n    let i, ilen;\n    for (i = 0, ilen = metas.length; i < ilen; ++i) {\n      const meta = metas[i];\n      if (meta[axisID] === this.id && (!type || meta.type === type)) {\n        result.push(meta);\n      }\n    }\n    return result;\n  }\n  _resolveTickFontOptions(index) {\n    const opts = this.options.ticks.setContext(this.getContext(index));\n    return toFont(opts.font);\n  }\n  _maxDigits() {\n    const fontSize = this._resolveTickFontOptions(0).lineHeight;\n    return (this.isHorizontal() ? this.width : this.height) / fontSize;\n  }\n}\n\nclass TypedRegistry {\n  constructor(type, scope, override) {\n    this.type = type;\n    this.scope = scope;\n    this.override = override;\n    this.items = Object.create(null);\n  }\n  isForType(type) {\n    return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n  }\n  register(item) {\n    const proto = Object.getPrototypeOf(item);\n    let parentScope;\n    if (isIChartComponent(proto)) {\n      parentScope = this.register(proto);\n    }\n    const items = this.items;\n    const id = item.id;\n    const scope = this.scope + '.' + id;\n    if (!id) {\n      throw new Error('class does not have id: ' + item);\n    }\n    if (id in items) {\n      return scope;\n    }\n    items[id] = item;\n    registerDefaults(item, scope, parentScope);\n    if (this.override) {\n      defaults.override(item.id, item.overrides);\n    }\n    return scope;\n  }\n  get(id) {\n    return this.items[id];\n  }\n  unregister(item) {\n    const items = this.items;\n    const id = item.id;\n    const scope = this.scope;\n    if (id in items) {\n      delete items[id];\n    }\n    if (scope && id in defaults[scope]) {\n      delete defaults[scope][id];\n      if (this.override) {\n        delete overrides[id];\n      }\n    }\n  }\n}\nfunction registerDefaults(item, scope, parentScope) {\n  const itemDefaults = merge(Object.create(null), [\n    parentScope ? defaults.get(parentScope) : {},\n    defaults.get(scope),\n    item.defaults\n  ]);\n  defaults.set(scope, itemDefaults);\n  if (item.defaultRoutes) {\n    routeDefaults(scope, item.defaultRoutes);\n  }\n  if (item.descriptors) {\n    defaults.describe(scope, item.descriptors);\n  }\n}\nfunction routeDefaults(scope, routes) {\n  Object.keys(routes).forEach(property => {\n    const propertyParts = property.split('.');\n    const sourceName = propertyParts.pop();\n    const sourceScope = [scope].concat(propertyParts).join('.');\n    const parts = routes[property].split('.');\n    const targetName = parts.pop();\n    const targetScope = parts.join('.');\n    defaults.route(sourceScope, sourceName, targetScope, targetName);\n  });\n}\nfunction isIChartComponent(proto) {\n  return 'id' in proto && 'defaults' in proto;\n}\n\nclass Registry {\n  constructor() {\n    this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n    this.elements = new TypedRegistry(Element, 'elements');\n    this.plugins = new TypedRegistry(Object, 'plugins');\n    this.scales = new TypedRegistry(Scale, 'scales');\n    this._typedRegistries = [this.controllers, this.scales, this.elements];\n  }\n  add(...args) {\n    this._each('register', args);\n  }\n  remove(...args) {\n    this._each('unregister', args);\n  }\n  addControllers(...args) {\n    this._each('register', args, this.controllers);\n  }\n  addElements(...args) {\n    this._each('register', args, this.elements);\n  }\n  addPlugins(...args) {\n    this._each('register', args, this.plugins);\n  }\n  addScales(...args) {\n    this._each('register', args, this.scales);\n  }\n  getController(id) {\n    return this._get(id, this.controllers, 'controller');\n  }\n  getElement(id) {\n    return this._get(id, this.elements, 'element');\n  }\n  getPlugin(id) {\n    return this._get(id, this.plugins, 'plugin');\n  }\n  getScale(id) {\n    return this._get(id, this.scales, 'scale');\n  }\n  removeControllers(...args) {\n    this._each('unregister', args, this.controllers);\n  }\n  removeElements(...args) {\n    this._each('unregister', args, this.elements);\n  }\n  removePlugins(...args) {\n    this._each('unregister', args, this.plugins);\n  }\n  removeScales(...args) {\n    this._each('unregister', args, this.scales);\n  }\n  _each(method, args, typedRegistry) {\n    [...args].forEach(arg => {\n      const reg = typedRegistry || this._getRegistryForType(arg);\n      if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n        this._exec(method, reg, arg);\n      } else {\n        each(arg, item => {\n          const itemReg = typedRegistry || this._getRegistryForType(item);\n          this._exec(method, itemReg, item);\n        });\n      }\n    });\n  }\n  _exec(method, registry, component) {\n    const camelMethod = _capitalize(method);\n    callback(component['before' + camelMethod], [], component);\n    registry[method](component);\n    callback(component['after' + camelMethod], [], component);\n  }\n  _getRegistryForType(type) {\n    for (let i = 0; i < this._typedRegistries.length; i++) {\n      const reg = this._typedRegistries[i];\n      if (reg.isForType(type)) {\n        return reg;\n      }\n    }\n    return this.plugins;\n  }\n  _get(id, typedRegistry, type) {\n    const item = typedRegistry.get(id);\n    if (item === undefined) {\n      throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n    }\n    return item;\n  }\n}\nvar registry = new Registry();\n\nclass ScatterController extends DatasetController {\n  update(mode) {\n    const meta = this._cachedMeta;\n    const {data: points = []} = meta;\n    const animationsDisabled = this.chart._animationsDisabled;\n    let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n    this._drawStart = start;\n    this._drawCount = count;\n    if (_scaleRangesChanged(meta)) {\n      start = 0;\n      count = points.length;\n    }\n    if (this.options.showLine) {\n      const {dataset: line, _dataset} = meta;\n      line._chart = this.chart;\n      line._datasetIndex = this.index;\n      line._decimated = !!_dataset._decimated;\n      line.points = points;\n      const options = this.resolveDatasetElementOptions(mode);\n      options.segment = this.options.segment;\n      this.updateElement(line, undefined, {\n        animated: !animationsDisabled,\n        options\n      }, mode);\n    }\n    this.updateElements(points, start, count, mode);\n  }\n  addElements() {\n    const {showLine} = this.options;\n    if (!this.datasetElementType && showLine) {\n      this.datasetElementType = registry.getElement('line');\n    }\n    super.addElements();\n  }\n  updateElements(points, start, count, mode) {\n    const reset = mode === 'reset';\n    const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n    const firstOpts = this.resolveDataElementOptions(start, mode);\n    const sharedOptions = this.getSharedOptions(firstOpts);\n    const includeOptions = this.includeOptions(mode, sharedOptions);\n    const iAxis = iScale.axis;\n    const vAxis = vScale.axis;\n    const {spanGaps, segment} = this.options;\n    const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n    const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n    let prevParsed = start > 0 && this.getParsed(start - 1);\n    for (let i = start; i < start + count; ++i) {\n      const point = points[i];\n      const parsed = this.getParsed(i);\n      const properties = directUpdate ? point : {};\n      const nullData = isNullOrUndef(parsed[vAxis]);\n      const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n      const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n      properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n      properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n      if (segment) {\n        properties.parsed = parsed;\n        properties.raw = _dataset.data[i];\n      }\n      if (includeOptions) {\n        properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n      }\n      if (!directUpdate) {\n        this.updateElement(point, i, properties, mode);\n      }\n      prevParsed = parsed;\n    }\n    this.updateSharedOptions(sharedOptions, mode, firstOpts);\n  }\n  getMaxOverflow() {\n    const meta = this._cachedMeta;\n    const data = meta.data || [];\n    if (!this.options.showLine) {\n      let max = 0;\n      for (let i = data.length - 1; i >= 0; --i) {\n        max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n      }\n      return max > 0 && max;\n    }\n    const dataset = meta.dataset;\n    const border = dataset.options && dataset.options.borderWidth || 0;\n    if (!data.length) {\n      return border;\n    }\n    const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n    const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n    return Math.max(border, firstPoint, lastPoint) / 2;\n  }\n}\nScatterController.id = 'scatter';\nScatterController.defaults = {\n  datasetElementType: false,\n  dataElementType: 'point',\n  showLine: false,\n  fill: false\n};\nScatterController.overrides = {\n  interaction: {\n    mode: 'point'\n  },\n  plugins: {\n    tooltip: {\n      callbacks: {\n        title() {\n          return '';\n        },\n        label(item) {\n          return '(' + item.label + ', ' + item.formattedValue + ')';\n        }\n      }\n    }\n  },\n  scales: {\n    x: {\n      type: 'linear'\n    },\n    y: {\n      type: 'linear'\n    }\n  }\n};\n\nvar controllers = /*#__PURE__*/Object.freeze({\n__proto__: null,\nBarController: BarController,\nBubbleController: BubbleController,\nDoughnutController: DoughnutController,\nLineController: LineController,\nPolarAreaController: PolarAreaController,\nPieController: PieController,\nRadarController: RadarController,\nScatterController: ScatterController\n});\n\nfunction abstract() {\n  throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\nclass DateAdapter {\n  constructor(options) {\n    this.options = options || {};\n  }\n  init(chartOptions) {}\n  formats() {\n    return abstract();\n  }\n  parse(value, format) {\n    return abstract();\n  }\n  format(timestamp, format) {\n    return abstract();\n  }\n  add(timestamp, amount, unit) {\n    return abstract();\n  }\n  diff(a, b, unit) {\n    return abstract();\n  }\n  startOf(timestamp, unit, weekday) {\n    return abstract();\n  }\n  endOf(timestamp, unit) {\n    return abstract();\n  }\n}\nDateAdapter.override = function(members) {\n  Object.assign(DateAdapter.prototype, members);\n};\nvar adapters = {\n  _date: DateAdapter\n};\n\nfunction binarySearch(metaset, axis, value, intersect) {\n  const {controller, data, _sorted} = metaset;\n  const iScale = controller._cachedMeta.iScale;\n  if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n    const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n    if (!intersect) {\n      return lookupMethod(data, axis, value);\n    } else if (controller._sharedOptions) {\n      const el = data[0];\n      const range = typeof el.getRange === 'function' && el.getRange(axis);\n      if (range) {\n        const start = lookupMethod(data, axis, value - range);\n        const end = lookupMethod(data, axis, value + range);\n        return {lo: start.lo, hi: end.hi};\n      }\n    }\n  }\n  return {lo: 0, hi: data.length - 1};\n}\nfunction evaluateInteractionItems(chart, axis, position, handler, intersect) {\n  const metasets = chart.getSortedVisibleDatasetMetas();\n  const value = position[axis];\n  for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n    const {index, data} = metasets[i];\n    const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n    for (let j = lo; j <= hi; ++j) {\n      const element = data[j];\n      if (!element.skip) {\n        handler(element, index, j);\n      }\n    }\n  }\n}\nfunction getDistanceMetricForAxis(axis) {\n  const useX = axis.indexOf('x') !== -1;\n  const useY = axis.indexOf('y') !== -1;\n  return function(pt1, pt2) {\n    const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n    const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n    return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n  };\n}\nfunction getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n  const items = [];\n  if (!includeInvisible && !chart.isPointInArea(position)) {\n    return items;\n  }\n  const evaluationFunc = function(element, datasetIndex, index) {\n    if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n      return;\n    }\n    if (element.inRange(position.x, position.y, useFinalPosition)) {\n      items.push({element, datasetIndex, index});\n    }\n  };\n  evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n  return items;\n}\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n  let items = [];\n  function evaluationFunc(element, datasetIndex, index) {\n    const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n    const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n    if (_angleBetween(angle, startAngle, endAngle)) {\n      items.push({element, datasetIndex, index});\n    }\n  }\n  evaluateInteractionItems(chart, axis, position, evaluationFunc);\n  return items;\n}\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n  let items = [];\n  const distanceMetric = getDistanceMetricForAxis(axis);\n  let minDistance = Number.POSITIVE_INFINITY;\n  function evaluationFunc(element, datasetIndex, index) {\n    const inRange = element.inRange(position.x, position.y, useFinalPosition);\n    if (intersect && !inRange) {\n      return;\n    }\n    const center = element.getCenterPoint(useFinalPosition);\n    const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n    if (!pointInArea && !inRange) {\n      return;\n    }\n    const distance = distanceMetric(position, center);\n    if (distance < minDistance) {\n      items = [{element, datasetIndex, index}];\n      minDistance = distance;\n    } else if (distance === minDistance) {\n      items.push({element, datasetIndex, index});\n    }\n  }\n  evaluateInteractionItems(chart, axis, position, evaluationFunc);\n  return items;\n}\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n  if (!includeInvisible && !chart.isPointInArea(position)) {\n    return [];\n  }\n  return axis === 'r' && !intersect\n    ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n    : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\nfunction getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n  const items = [];\n  const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n  let intersectsItem = false;\n  evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => {\n    if (element[rangeMethod](position[axis], useFinalPosition)) {\n      items.push({element, datasetIndex, index});\n      intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n    }\n  });\n  if (intersect && !intersectsItem) {\n    return [];\n  }\n  return items;\n}\nvar Interaction = {\n  evaluateInteractionItems,\n  modes: {\n    index(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      const axis = options.axis || 'x';\n      const includeInvisible = options.includeInvisible || false;\n      const items = options.intersect\n        ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible)\n        : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n      const elements = [];\n      if (!items.length) {\n        return [];\n      }\n      chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n        const index = items[0].index;\n        const element = meta.data[index];\n        if (element && !element.skip) {\n          elements.push({element, datasetIndex: meta.index, index});\n        }\n      });\n      return elements;\n    },\n    dataset(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      const axis = options.axis || 'xy';\n      const includeInvisible = options.includeInvisible || false;\n      let items = options.intersect\n        ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) :\n        getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n      if (items.length > 0) {\n        const datasetIndex = items[0].datasetIndex;\n        const data = chart.getDatasetMeta(datasetIndex).data;\n        items = [];\n        for (let i = 0; i < data.length; ++i) {\n          items.push({element: data[i], datasetIndex, index: i});\n        }\n      }\n      return items;\n    },\n    point(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      const axis = options.axis || 'xy';\n      const includeInvisible = options.includeInvisible || false;\n      return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n    },\n    nearest(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      const axis = options.axis || 'xy';\n      const includeInvisible = options.includeInvisible || false;\n      return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n    },\n    x(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n    },\n    y(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n    }\n  }\n};\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\nfunction filterByPosition(array, position) {\n  return array.filter(v => v.pos === position);\n}\nfunction filterDynamicPositionByAxis(array, axis) {\n  return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\nfunction sortByWeight(array, reverse) {\n  return array.sort((a, b) => {\n    const v0 = reverse ? b : a;\n    const v1 = reverse ? a : b;\n    return v0.weight === v1.weight ?\n      v0.index - v1.index :\n      v0.weight - v1.weight;\n  });\n}\nfunction wrapBoxes(boxes) {\n  const layoutBoxes = [];\n  let i, ilen, box, pos, stack, stackWeight;\n  for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n    box = boxes[i];\n    ({position: pos, options: {stack, stackWeight = 1}} = box);\n    layoutBoxes.push({\n      index: i,\n      box,\n      pos,\n      horizontal: box.isHorizontal(),\n      weight: box.weight,\n      stack: stack && (pos + stack),\n      stackWeight\n    });\n  }\n  return layoutBoxes;\n}\nfunction buildStacks(layouts) {\n  const stacks = {};\n  for (const wrap of layouts) {\n    const {stack, pos, stackWeight} = wrap;\n    if (!stack || !STATIC_POSITIONS.includes(pos)) {\n      continue;\n    }\n    const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n    _stack.count++;\n    _stack.weight += stackWeight;\n  }\n  return stacks;\n}\nfunction setLayoutDims(layouts, params) {\n  const stacks = buildStacks(layouts);\n  const {vBoxMaxWidth, hBoxMaxHeight} = params;\n  let i, ilen, layout;\n  for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n    layout = layouts[i];\n    const {fullSize} = layout.box;\n    const stack = stacks[layout.stack];\n    const factor = stack && layout.stackWeight / stack.weight;\n    if (layout.horizontal) {\n      layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n      layout.height = hBoxMaxHeight;\n    } else {\n      layout.width = vBoxMaxWidth;\n      layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n    }\n  }\n  return stacks;\n}\nfunction buildLayoutBoxes(boxes) {\n  const layoutBoxes = wrapBoxes(boxes);\n  const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n  const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n  const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n  const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n  const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n  const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n  const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n  return {\n    fullSize,\n    leftAndTop: left.concat(top),\n    rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n    chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n    vertical: left.concat(right).concat(centerVertical),\n    horizontal: top.concat(bottom).concat(centerHorizontal)\n  };\n}\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n  return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\nfunction updateMaxPadding(maxPadding, boxPadding) {\n  maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n  maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n  maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n  maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\nfunction updateDims(chartArea, params, layout, stacks) {\n  const {pos, box} = layout;\n  const maxPadding = chartArea.maxPadding;\n  if (!isObject(pos)) {\n    if (layout.size) {\n      chartArea[pos] -= layout.size;\n    }\n    const stack = stacks[layout.stack] || {size: 0, count: 1};\n    stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n    layout.size = stack.size / stack.count;\n    chartArea[pos] += layout.size;\n  }\n  if (box.getPadding) {\n    updateMaxPadding(maxPadding, box.getPadding());\n  }\n  const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n  const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n  const widthChanged = newWidth !== chartArea.w;\n  const heightChanged = newHeight !== chartArea.h;\n  chartArea.w = newWidth;\n  chartArea.h = newHeight;\n  return layout.horizontal\n    ? {same: widthChanged, other: heightChanged}\n    : {same: heightChanged, other: widthChanged};\n}\nfunction handleMaxPadding(chartArea) {\n  const maxPadding = chartArea.maxPadding;\n  function updatePos(pos) {\n    const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n    chartArea[pos] += change;\n    return change;\n  }\n  chartArea.y += updatePos('top');\n  chartArea.x += updatePos('left');\n  updatePos('right');\n  updatePos('bottom');\n}\nfunction getMargins(horizontal, chartArea) {\n  const maxPadding = chartArea.maxPadding;\n  function marginForPositions(positions) {\n    const margin = {left: 0, top: 0, right: 0, bottom: 0};\n    positions.forEach((pos) => {\n      margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n    });\n    return margin;\n  }\n  return horizontal\n    ? marginForPositions(['left', 'right'])\n    : marginForPositions(['top', 'bottom']);\n}\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n  const refitBoxes = [];\n  let i, ilen, layout, box, refit, changed;\n  for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n    layout = boxes[i];\n    box = layout.box;\n    box.update(\n      layout.width || chartArea.w,\n      layout.height || chartArea.h,\n      getMargins(layout.horizontal, chartArea)\n    );\n    const {same, other} = updateDims(chartArea, params, layout, stacks);\n    refit |= same && refitBoxes.length;\n    changed = changed || other;\n    if (!box.fullSize) {\n      refitBoxes.push(layout);\n    }\n  }\n  return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\nfunction setBoxDims(box, left, top, width, height) {\n  box.top = top;\n  box.left = left;\n  box.right = left + width;\n  box.bottom = top + height;\n  box.width = width;\n  box.height = height;\n}\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n  const userPadding = params.padding;\n  let {x, y} = chartArea;\n  for (const layout of boxes) {\n    const box = layout.box;\n    const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n    const weight = (layout.stackWeight / stack.weight) || 1;\n    if (layout.horizontal) {\n      const width = chartArea.w * weight;\n      const height = stack.size || box.height;\n      if (defined(stack.start)) {\n        y = stack.start;\n      }\n      if (box.fullSize) {\n        setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n      } else {\n        setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n      }\n      stack.start = y;\n      stack.placed += width;\n      y = box.bottom;\n    } else {\n      const height = chartArea.h * weight;\n      const width = stack.size || box.width;\n      if (defined(stack.start)) {\n        x = stack.start;\n      }\n      if (box.fullSize) {\n        setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n      } else {\n        setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n      }\n      stack.start = x;\n      stack.placed += height;\n      x = box.right;\n    }\n  }\n  chartArea.x = x;\n  chartArea.y = y;\n}\ndefaults.set('layout', {\n  autoPadding: true,\n  padding: {\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0\n  }\n});\nvar layouts = {\n  addBox(chart, item) {\n    if (!chart.boxes) {\n      chart.boxes = [];\n    }\n    item.fullSize = item.fullSize || false;\n    item.position = item.position || 'top';\n    item.weight = item.weight || 0;\n    item._layers = item._layers || function() {\n      return [{\n        z: 0,\n        draw(chartArea) {\n          item.draw(chartArea);\n        }\n      }];\n    };\n    chart.boxes.push(item);\n  },\n  removeBox(chart, layoutItem) {\n    const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n    if (index !== -1) {\n      chart.boxes.splice(index, 1);\n    }\n  },\n  configure(chart, item, options) {\n    item.fullSize = options.fullSize;\n    item.position = options.position;\n    item.weight = options.weight;\n  },\n  update(chart, width, height, minPadding) {\n    if (!chart) {\n      return;\n    }\n    const padding = toPadding(chart.options.layout.padding);\n    const availableWidth = Math.max(width - padding.width, 0);\n    const availableHeight = Math.max(height - padding.height, 0);\n    const boxes = buildLayoutBoxes(chart.boxes);\n    const verticalBoxes = boxes.vertical;\n    const horizontalBoxes = boxes.horizontal;\n    each(chart.boxes, box => {\n      if (typeof box.beforeLayout === 'function') {\n        box.beforeLayout();\n      }\n    });\n    const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n      wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n    const params = Object.freeze({\n      outerWidth: width,\n      outerHeight: height,\n      padding,\n      availableWidth,\n      availableHeight,\n      vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n      hBoxMaxHeight: availableHeight / 2\n    });\n    const maxPadding = Object.assign({}, padding);\n    updateMaxPadding(maxPadding, toPadding(minPadding));\n    const chartArea = Object.assign({\n      maxPadding,\n      w: availableWidth,\n      h: availableHeight,\n      x: padding.left,\n      y: padding.top\n    }, padding);\n    const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n    fitBoxes(boxes.fullSize, chartArea, params, stacks);\n    fitBoxes(verticalBoxes, chartArea, params, stacks);\n    if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n      fitBoxes(verticalBoxes, chartArea, params, stacks);\n    }\n    handleMaxPadding(chartArea);\n    placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n    chartArea.x += chartArea.w;\n    chartArea.y += chartArea.h;\n    placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n    chart.chartArea = {\n      left: chartArea.left,\n      top: chartArea.top,\n      right: chartArea.left + chartArea.w,\n      bottom: chartArea.top + chartArea.h,\n      height: chartArea.h,\n      width: chartArea.w,\n    };\n    each(boxes.chartArea, (layout) => {\n      const box = layout.box;\n      Object.assign(box, chart.chartArea);\n      box.update(chartArea.w, chartArea.h, {left: 0, top: 0, right: 0, bottom: 0});\n    });\n  }\n};\n\nclass BasePlatform {\n  acquireContext(canvas, aspectRatio) {}\n  releaseContext(context) {\n    return false;\n  }\n  addEventListener(chart, type, listener) {}\n  removeEventListener(chart, type, listener) {}\n  getDevicePixelRatio() {\n    return 1;\n  }\n  getMaximumSize(element, width, height, aspectRatio) {\n    width = Math.max(0, width || element.width);\n    height = height || element.height;\n    return {\n      width,\n      height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n    };\n  }\n  isAttached(canvas) {\n    return true;\n  }\n  updateConfig(config) {\n  }\n}\n\nclass BasicPlatform extends BasePlatform {\n  acquireContext(item) {\n    return item && item.getContext && item.getContext('2d') || null;\n  }\n  updateConfig(config) {\n    config.options.animation = false;\n  }\n}\n\nconst EXPANDO_KEY = '$chartjs';\nconst EVENT_TYPES = {\n  touchstart: 'mousedown',\n  touchmove: 'mousemove',\n  touchend: 'mouseup',\n  pointerenter: 'mouseenter',\n  pointerdown: 'mousedown',\n  pointermove: 'mousemove',\n  pointerup: 'mouseup',\n  pointerleave: 'mouseout',\n  pointerout: 'mouseout'\n};\nconst isNullOrEmpty = value => value === null || value === '';\nfunction initCanvas(canvas, aspectRatio) {\n  const style = canvas.style;\n  const renderHeight = canvas.getAttribute('height');\n  const renderWidth = canvas.getAttribute('width');\n  canvas[EXPANDO_KEY] = {\n    initial: {\n      height: renderHeight,\n      width: renderWidth,\n      style: {\n        display: style.display,\n        height: style.height,\n        width: style.width\n      }\n    }\n  };\n  style.display = style.display || 'block';\n  style.boxSizing = style.boxSizing || 'border-box';\n  if (isNullOrEmpty(renderWidth)) {\n    const displayWidth = readUsedSize(canvas, 'width');\n    if (displayWidth !== undefined) {\n      canvas.width = displayWidth;\n    }\n  }\n  if (isNullOrEmpty(renderHeight)) {\n    if (canvas.style.height === '') {\n      canvas.height = canvas.width / (aspectRatio || 2);\n    } else {\n      const displayHeight = readUsedSize(canvas, 'height');\n      if (displayHeight !== undefined) {\n        canvas.height = displayHeight;\n      }\n    }\n  }\n  return canvas;\n}\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\nfunction addListener(node, type, listener) {\n  node.addEventListener(type, listener, eventListenerOptions);\n}\nfunction removeListener(chart, type, listener) {\n  chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n}\nfunction fromNativeEvent(event, chart) {\n  const type = EVENT_TYPES[event.type] || event.type;\n  const {x, y} = getRelativePosition(event, chart);\n  return {\n    type,\n    chart,\n    native: event,\n    x: x !== undefined ? x : null,\n    y: y !== undefined ? y : null,\n  };\n}\nfunction nodeListContains(nodeList, canvas) {\n  for (const node of nodeList) {\n    if (node === canvas || node.contains(canvas)) {\n      return true;\n    }\n  }\n}\nfunction createAttachObserver(chart, type, listener) {\n  const canvas = chart.canvas;\n  const observer = new MutationObserver(entries => {\n    let trigger = false;\n    for (const entry of entries) {\n      trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n      trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n    }\n    if (trigger) {\n      listener();\n    }\n  });\n  observer.observe(document, {childList: true, subtree: true});\n  return observer;\n}\nfunction createDetachObserver(chart, type, listener) {\n  const canvas = chart.canvas;\n  const observer = new MutationObserver(entries => {\n    let trigger = false;\n    for (const entry of entries) {\n      trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n      trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n    }\n    if (trigger) {\n      listener();\n    }\n  });\n  observer.observe(document, {childList: true, subtree: true});\n  return observer;\n}\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\nfunction onWindowResize() {\n  const dpr = window.devicePixelRatio;\n  if (dpr === oldDevicePixelRatio) {\n    return;\n  }\n  oldDevicePixelRatio = dpr;\n  drpListeningCharts.forEach((resize, chart) => {\n    if (chart.currentDevicePixelRatio !== dpr) {\n      resize();\n    }\n  });\n}\nfunction listenDevicePixelRatioChanges(chart, resize) {\n  if (!drpListeningCharts.size) {\n    window.addEventListener('resize', onWindowResize);\n  }\n  drpListeningCharts.set(chart, resize);\n}\nfunction unlistenDevicePixelRatioChanges(chart) {\n  drpListeningCharts.delete(chart);\n  if (!drpListeningCharts.size) {\n    window.removeEventListener('resize', onWindowResize);\n  }\n}\nfunction createResizeObserver(chart, type, listener) {\n  const canvas = chart.canvas;\n  const container = canvas && _getParentNode(canvas);\n  if (!container) {\n    return;\n  }\n  const resize = throttled((width, height) => {\n    const w = container.clientWidth;\n    listener(width, height);\n    if (w < container.clientWidth) {\n      listener();\n    }\n  }, window);\n  const observer = new ResizeObserver(entries => {\n    const entry = entries[0];\n    const width = entry.contentRect.width;\n    const height = entry.contentRect.height;\n    if (width === 0 && height === 0) {\n      return;\n    }\n    resize(width, height);\n  });\n  observer.observe(container);\n  listenDevicePixelRatioChanges(chart, resize);\n  return observer;\n}\nfunction releaseObserver(chart, type, observer) {\n  if (observer) {\n    observer.disconnect();\n  }\n  if (type === 'resize') {\n    unlistenDevicePixelRatioChanges(chart);\n  }\n}\nfunction createProxyAndListen(chart, type, listener) {\n  const canvas = chart.canvas;\n  const proxy = throttled((event) => {\n    if (chart.ctx !== null) {\n      listener(fromNativeEvent(event, chart));\n    }\n  }, chart, (args) => {\n    const event = args[0];\n    return [event, event.offsetX, event.offsetY];\n  });\n  addListener(canvas, type, proxy);\n  return proxy;\n}\nclass DomPlatform extends BasePlatform {\n  acquireContext(canvas, aspectRatio) {\n    const context = canvas && canvas.getContext && canvas.getContext('2d');\n    if (context && context.canvas === canvas) {\n      initCanvas(canvas, aspectRatio);\n      return context;\n    }\n    return null;\n  }\n  releaseContext(context) {\n    const canvas = context.canvas;\n    if (!canvas[EXPANDO_KEY]) {\n      return false;\n    }\n    const initial = canvas[EXPANDO_KEY].initial;\n    ['height', 'width'].forEach((prop) => {\n      const value = initial[prop];\n      if (isNullOrUndef(value)) {\n        canvas.removeAttribute(prop);\n      } else {\n        canvas.setAttribute(prop, value);\n      }\n    });\n    const style = initial.style || {};\n    Object.keys(style).forEach((key) => {\n      canvas.style[key] = style[key];\n    });\n    canvas.width = canvas.width;\n    delete canvas[EXPANDO_KEY];\n    return true;\n  }\n  addEventListener(chart, type, listener) {\n    this.removeEventListener(chart, type);\n    const proxies = chart.$proxies || (chart.$proxies = {});\n    const handlers = {\n      attach: createAttachObserver,\n      detach: createDetachObserver,\n      resize: createResizeObserver\n    };\n    const handler = handlers[type] || createProxyAndListen;\n    proxies[type] = handler(chart, type, listener);\n  }\n  removeEventListener(chart, type) {\n    const proxies = chart.$proxies || (chart.$proxies = {});\n    const proxy = proxies[type];\n    if (!proxy) {\n      return;\n    }\n    const handlers = {\n      attach: releaseObserver,\n      detach: releaseObserver,\n      resize: releaseObserver\n    };\n    const handler = handlers[type] || removeListener;\n    handler(chart, type, proxy);\n    proxies[type] = undefined;\n  }\n  getDevicePixelRatio() {\n    return window.devicePixelRatio;\n  }\n  getMaximumSize(canvas, width, height, aspectRatio) {\n    return getMaximumSize(canvas, width, height, aspectRatio);\n  }\n  isAttached(canvas) {\n    const container = _getParentNode(canvas);\n    return !!(container && container.isConnected);\n  }\n}\n\nfunction _detectPlatform(canvas) {\n  if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n    return BasicPlatform;\n  }\n  return DomPlatform;\n}\n\nclass PluginService {\n  constructor() {\n    this._init = [];\n  }\n  notify(chart, hook, args, filter) {\n    if (hook === 'beforeInit') {\n      this._init = this._createDescriptors(chart, true);\n      this._notify(this._init, chart, 'install');\n    }\n    const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n    const result = this._notify(descriptors, chart, hook, args);\n    if (hook === 'afterDestroy') {\n      this._notify(descriptors, chart, 'stop');\n      this._notify(this._init, chart, 'uninstall');\n    }\n    return result;\n  }\n  _notify(descriptors, chart, hook, args) {\n    args = args || {};\n    for (const descriptor of descriptors) {\n      const plugin = descriptor.plugin;\n      const method = plugin[hook];\n      const params = [chart, args, descriptor.options];\n      if (callback(method, params, plugin) === false && args.cancelable) {\n        return false;\n      }\n    }\n    return true;\n  }\n  invalidate() {\n    if (!isNullOrUndef(this._cache)) {\n      this._oldCache = this._cache;\n      this._cache = undefined;\n    }\n  }\n  _descriptors(chart) {\n    if (this._cache) {\n      return this._cache;\n    }\n    const descriptors = this._cache = this._createDescriptors(chart);\n    this._notifyStateChanges(chart);\n    return descriptors;\n  }\n  _createDescriptors(chart, all) {\n    const config = chart && chart.config;\n    const options = valueOrDefault(config.options && config.options.plugins, {});\n    const plugins = allPlugins(config);\n    return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n  }\n  _notifyStateChanges(chart) {\n    const previousDescriptors = this._oldCache || [];\n    const descriptors = this._cache;\n    const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n    this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n    this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n  }\n}\nfunction allPlugins(config) {\n  const localIds = {};\n  const plugins = [];\n  const keys = Object.keys(registry.plugins.items);\n  for (let i = 0; i < keys.length; i++) {\n    plugins.push(registry.getPlugin(keys[i]));\n  }\n  const local = config.plugins || [];\n  for (let i = 0; i < local.length; i++) {\n    const plugin = local[i];\n    if (plugins.indexOf(plugin) === -1) {\n      plugins.push(plugin);\n      localIds[plugin.id] = true;\n    }\n  }\n  return {plugins, localIds};\n}\nfunction getOpts(options, all) {\n  if (!all && options === false) {\n    return null;\n  }\n  if (options === true) {\n    return {};\n  }\n  return options;\n}\nfunction createDescriptors(chart, {plugins, localIds}, options, all) {\n  const result = [];\n  const context = chart.getContext();\n  for (const plugin of plugins) {\n    const id = plugin.id;\n    const opts = getOpts(options[id], all);\n    if (opts === null) {\n      continue;\n    }\n    result.push({\n      plugin,\n      options: pluginOpts(chart.config, {plugin, local: localIds[id]}, opts, context)\n    });\n  }\n  return result;\n}\nfunction pluginOpts(config, {plugin, local}, opts, context) {\n  const keys = config.pluginScopeKeys(plugin);\n  const scopes = config.getOptionScopes(opts, keys);\n  if (local && plugin.defaults) {\n    scopes.push(plugin.defaults);\n  }\n  return config.createResolver(scopes, context, [''], {\n    scriptable: false,\n    indexable: false,\n    allKeys: true\n  });\n}\n\nfunction getIndexAxis(type, options) {\n  const datasetDefaults = defaults.datasets[type] || {};\n  const datasetOptions = (options.datasets || {})[type] || {};\n  return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n  let axis = id;\n  if (id === '_index_') {\n    axis = indexAxis;\n  } else if (id === '_value_') {\n    axis = indexAxis === 'x' ? 'y' : 'x';\n  }\n  return axis;\n}\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n  return axis === indexAxis ? '_index_' : '_value_';\n}\nfunction axisFromPosition(position) {\n  if (position === 'top' || position === 'bottom') {\n    return 'x';\n  }\n  if (position === 'left' || position === 'right') {\n    return 'y';\n  }\n}\nfunction determineAxis(id, scaleOptions) {\n  if (id === 'x' || id === 'y') {\n    return id;\n  }\n  return scaleOptions.axis || axisFromPosition(scaleOptions.position) || id.charAt(0).toLowerCase();\n}\nfunction mergeScaleConfig(config, options) {\n  const chartDefaults = overrides[config.type] || {scales: {}};\n  const configScales = options.scales || {};\n  const chartIndexAxis = getIndexAxis(config.type, options);\n  const firstIDs = Object.create(null);\n  const scales = Object.create(null);\n  Object.keys(configScales).forEach(id => {\n    const scaleConf = configScales[id];\n    if (!isObject(scaleConf)) {\n      return console.error(`Invalid scale configuration for scale: ${id}`);\n    }\n    if (scaleConf._proxy) {\n      return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n    }\n    const axis = determineAxis(id, scaleConf);\n    const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n    const defaultScaleOptions = chartDefaults.scales || {};\n    firstIDs[axis] = firstIDs[axis] || id;\n    scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n  });\n  config.data.datasets.forEach(dataset => {\n    const type = dataset.type || config.type;\n    const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n    const datasetDefaults = overrides[type] || {};\n    const defaultScaleOptions = datasetDefaults.scales || {};\n    Object.keys(defaultScaleOptions).forEach(defaultID => {\n      const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n      const id = dataset[axis + 'AxisID'] || firstIDs[axis] || axis;\n      scales[id] = scales[id] || Object.create(null);\n      mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n    });\n  });\n  Object.keys(scales).forEach(key => {\n    const scale = scales[key];\n    mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n  });\n  return scales;\n}\nfunction initOptions(config) {\n  const options = config.options || (config.options = {});\n  options.plugins = valueOrDefault(options.plugins, {});\n  options.scales = mergeScaleConfig(config, options);\n}\nfunction initData(data) {\n  data = data || {};\n  data.datasets = data.datasets || [];\n  data.labels = data.labels || [];\n  return data;\n}\nfunction initConfig(config) {\n  config = config || {};\n  config.data = initData(config.data);\n  initOptions(config);\n  return config;\n}\nconst keyCache = new Map();\nconst keysCached = new Set();\nfunction cachedKeys(cacheKey, generate) {\n  let keys = keyCache.get(cacheKey);\n  if (!keys) {\n    keys = generate();\n    keyCache.set(cacheKey, keys);\n    keysCached.add(keys);\n  }\n  return keys;\n}\nconst addIfFound = (set, obj, key) => {\n  const opts = resolveObjectKey(obj, key);\n  if (opts !== undefined) {\n    set.add(opts);\n  }\n};\nclass Config {\n  constructor(config) {\n    this._config = initConfig(config);\n    this._scopeCache = new Map();\n    this._resolverCache = new Map();\n  }\n  get platform() {\n    return this._config.platform;\n  }\n  get type() {\n    return this._config.type;\n  }\n  set type(type) {\n    this._config.type = type;\n  }\n  get data() {\n    return this._config.data;\n  }\n  set data(data) {\n    this._config.data = initData(data);\n  }\n  get options() {\n    return this._config.options;\n  }\n  set options(options) {\n    this._config.options = options;\n  }\n  get plugins() {\n    return this._config.plugins;\n  }\n  update() {\n    const config = this._config;\n    this.clearCache();\n    initOptions(config);\n  }\n  clearCache() {\n    this._scopeCache.clear();\n    this._resolverCache.clear();\n  }\n  datasetScopeKeys(datasetType) {\n    return cachedKeys(datasetType,\n      () => [[\n        `datasets.${datasetType}`,\n        ''\n      ]]);\n  }\n  datasetAnimationScopeKeys(datasetType, transition) {\n    return cachedKeys(`${datasetType}.transition.${transition}`,\n      () => [\n        [\n          `datasets.${datasetType}.transitions.${transition}`,\n          `transitions.${transition}`,\n        ],\n        [\n          `datasets.${datasetType}`,\n          ''\n        ]\n      ]);\n  }\n  datasetElementScopeKeys(datasetType, elementType) {\n    return cachedKeys(`${datasetType}-${elementType}`,\n      () => [[\n        `datasets.${datasetType}.elements.${elementType}`,\n        `datasets.${datasetType}`,\n        `elements.${elementType}`,\n        ''\n      ]]);\n  }\n  pluginScopeKeys(plugin) {\n    const id = plugin.id;\n    const type = this.type;\n    return cachedKeys(`${type}-plugin-${id}`,\n      () => [[\n        `plugins.${id}`,\n        ...plugin.additionalOptionScopes || [],\n      ]]);\n  }\n  _cachedScopes(mainScope, resetCache) {\n    const _scopeCache = this._scopeCache;\n    let cache = _scopeCache.get(mainScope);\n    if (!cache || resetCache) {\n      cache = new Map();\n      _scopeCache.set(mainScope, cache);\n    }\n    return cache;\n  }\n  getOptionScopes(mainScope, keyLists, resetCache) {\n    const {options, type} = this;\n    const cache = this._cachedScopes(mainScope, resetCache);\n    const cached = cache.get(keyLists);\n    if (cached) {\n      return cached;\n    }\n    const scopes = new Set();\n    keyLists.forEach(keys => {\n      if (mainScope) {\n        scopes.add(mainScope);\n        keys.forEach(key => addIfFound(scopes, mainScope, key));\n      }\n      keys.forEach(key => addIfFound(scopes, options, key));\n      keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n      keys.forEach(key => addIfFound(scopes, defaults, key));\n      keys.forEach(key => addIfFound(scopes, descriptors, key));\n    });\n    const array = Array.from(scopes);\n    if (array.length === 0) {\n      array.push(Object.create(null));\n    }\n    if (keysCached.has(keyLists)) {\n      cache.set(keyLists, array);\n    }\n    return array;\n  }\n  chartOptionScopes() {\n    const {options, type} = this;\n    return [\n      options,\n      overrides[type] || {},\n      defaults.datasets[type] || {},\n      {type},\n      defaults,\n      descriptors\n    ];\n  }\n  resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n    const result = {$shared: true};\n    const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n    let options = resolver;\n    if (needContext(resolver, names)) {\n      result.$shared = false;\n      context = isFunction(context) ? context() : context;\n      const subResolver = this.createResolver(scopes, context, subPrefixes);\n      options = _attachContext(resolver, context, subResolver);\n    }\n    for (const prop of names) {\n      result[prop] = options[prop];\n    }\n    return result;\n  }\n  createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n    const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n    return isObject(context)\n      ? _attachContext(resolver, context, undefined, descriptorDefaults)\n      : resolver;\n  }\n}\nfunction getResolver(resolverCache, scopes, prefixes) {\n  let cache = resolverCache.get(scopes);\n  if (!cache) {\n    cache = new Map();\n    resolverCache.set(scopes, cache);\n  }\n  const cacheKey = prefixes.join();\n  let cached = cache.get(cacheKey);\n  if (!cached) {\n    const resolver = _createResolver(scopes, prefixes);\n    cached = {\n      resolver,\n      subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n    };\n    cache.set(cacheKey, cached);\n  }\n  return cached;\n}\nconst hasFunction = value => isObject(value)\n  && Object.getOwnPropertyNames(value).reduce((acc, key) => acc || isFunction(value[key]), false);\nfunction needContext(proxy, names) {\n  const {isScriptable, isIndexable} = _descriptors(proxy);\n  for (const prop of names) {\n    const scriptable = isScriptable(prop);\n    const indexable = isIndexable(prop);\n    const value = (indexable || scriptable) && proxy[prop];\n    if ((scriptable && (isFunction(value) || hasFunction(value)))\n      || (indexable && isArray(value))) {\n      return true;\n    }\n  }\n  return false;\n}\n\nvar version = \"3.9.1\";\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n  return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\nfunction compare2Level(l1, l2) {\n  return function(a, b) {\n    return a[l1] === b[l1]\n      ? a[l2] - b[l2]\n      : a[l1] - b[l1];\n  };\n}\nfunction onAnimationsComplete(context) {\n  const chart = context.chart;\n  const animationOptions = chart.options.animation;\n  chart.notifyPlugins('afterRender');\n  callback(animationOptions && animationOptions.onComplete, [context], chart);\n}\nfunction onAnimationProgress(context) {\n  const chart = context.chart;\n  const animationOptions = chart.options.animation;\n  callback(animationOptions && animationOptions.onProgress, [context], chart);\n}\nfunction getCanvas(item) {\n  if (_isDomSupported() && typeof item === 'string') {\n    item = document.getElementById(item);\n  } else if (item && item.length) {\n    item = item[0];\n  }\n  if (item && item.canvas) {\n    item = item.canvas;\n  }\n  return item;\n}\nconst instances = {};\nconst getChart = (key) => {\n  const canvas = getCanvas(key);\n  return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\nfunction moveNumericKeys(obj, start, move) {\n  const keys = Object.keys(obj);\n  for (const key of keys) {\n    const intKey = +key;\n    if (intKey >= start) {\n      const value = obj[key];\n      delete obj[key];\n      if (move > 0 || intKey > start) {\n        obj[intKey + move] = value;\n      }\n    }\n  }\n}\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n  if (!inChartArea || e.type === 'mouseout') {\n    return null;\n  }\n  if (isClick) {\n    return lastEvent;\n  }\n  return e;\n}\nclass Chart {\n  constructor(item, userConfig) {\n    const config = this.config = new Config(userConfig);\n    const initialCanvas = getCanvas(item);\n    const existingChart = getChart(initialCanvas);\n    if (existingChart) {\n      throw new Error(\n        'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.'\n      );\n    }\n    const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n    this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n    this.platform.updateConfig(config);\n    const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n    const canvas = context && context.canvas;\n    const height = canvas && canvas.height;\n    const width = canvas && canvas.width;\n    this.id = uid();\n    this.ctx = context;\n    this.canvas = canvas;\n    this.width = width;\n    this.height = height;\n    this._options = options;\n    this._aspectRatio = this.aspectRatio;\n    this._layers = [];\n    this._metasets = [];\n    this._stacks = undefined;\n    this.boxes = [];\n    this.currentDevicePixelRatio = undefined;\n    this.chartArea = undefined;\n    this._active = [];\n    this._lastEvent = undefined;\n    this._listeners = {};\n    this._responsiveListeners = undefined;\n    this._sortedMetasets = [];\n    this.scales = {};\n    this._plugins = new PluginService();\n    this.$proxies = {};\n    this._hiddenIndices = {};\n    this.attached = false;\n    this._animationsDisabled = undefined;\n    this.$context = undefined;\n    this._doResize = debounce(mode => this.update(mode), options.resizeDelay || 0);\n    this._dataChanges = [];\n    instances[this.id] = this;\n    if (!context || !canvas) {\n      console.error(\"Failed to create chart: can't acquire context from the given item\");\n      return;\n    }\n    animator.listen(this, 'complete', onAnimationsComplete);\n    animator.listen(this, 'progress', onAnimationProgress);\n    this._initialize();\n    if (this.attached) {\n      this.update();\n    }\n  }\n  get aspectRatio() {\n    const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n    if (!isNullOrUndef(aspectRatio)) {\n      return aspectRatio;\n    }\n    if (maintainAspectRatio && _aspectRatio) {\n      return _aspectRatio;\n    }\n    return height ? width / height : null;\n  }\n  get data() {\n    return this.config.data;\n  }\n  set data(data) {\n    this.config.data = data;\n  }\n  get options() {\n    return this._options;\n  }\n  set options(options) {\n    this.config.options = options;\n  }\n  _initialize() {\n    this.notifyPlugins('beforeInit');\n    if (this.options.responsive) {\n      this.resize();\n    } else {\n      retinaScale(this, this.options.devicePixelRatio);\n    }\n    this.bindEvents();\n    this.notifyPlugins('afterInit');\n    return this;\n  }\n  clear() {\n    clearCanvas(this.canvas, this.ctx);\n    return this;\n  }\n  stop() {\n    animator.stop(this);\n    return this;\n  }\n  resize(width, height) {\n    if (!animator.running(this)) {\n      this._resize(width, height);\n    } else {\n      this._resizeBeforeDraw = {width, height};\n    }\n  }\n  _resize(width, height) {\n    const options = this.options;\n    const canvas = this.canvas;\n    const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n    const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n    const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n    const mode = this.width ? 'resize' : 'attach';\n    this.width = newSize.width;\n    this.height = newSize.height;\n    this._aspectRatio = this.aspectRatio;\n    if (!retinaScale(this, newRatio, true)) {\n      return;\n    }\n    this.notifyPlugins('resize', {size: newSize});\n    callback(options.onResize, [this, newSize], this);\n    if (this.attached) {\n      if (this._doResize(mode)) {\n        this.render();\n      }\n    }\n  }\n  ensureScalesHaveIDs() {\n    const options = this.options;\n    const scalesOptions = options.scales || {};\n    each(scalesOptions, (axisOptions, axisID) => {\n      axisOptions.id = axisID;\n    });\n  }\n  buildOrUpdateScales() {\n    const options = this.options;\n    const scaleOpts = options.scales;\n    const scales = this.scales;\n    const updated = Object.keys(scales).reduce((obj, id) => {\n      obj[id] = false;\n      return obj;\n    }, {});\n    let items = [];\n    if (scaleOpts) {\n      items = items.concat(\n        Object.keys(scaleOpts).map((id) => {\n          const scaleOptions = scaleOpts[id];\n          const axis = determineAxis(id, scaleOptions);\n          const isRadial = axis === 'r';\n          const isHorizontal = axis === 'x';\n          return {\n            options: scaleOptions,\n            dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n            dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n          };\n        })\n      );\n    }\n    each(items, (item) => {\n      const scaleOptions = item.options;\n      const id = scaleOptions.id;\n      const axis = determineAxis(id, scaleOptions);\n      const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n      if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n        scaleOptions.position = item.dposition;\n      }\n      updated[id] = true;\n      let scale = null;\n      if (id in scales && scales[id].type === scaleType) {\n        scale = scales[id];\n      } else {\n        const scaleClass = registry.getScale(scaleType);\n        scale = new scaleClass({\n          id,\n          type: scaleType,\n          ctx: this.ctx,\n          chart: this\n        });\n        scales[scale.id] = scale;\n      }\n      scale.init(scaleOptions, options);\n    });\n    each(updated, (hasUpdated, id) => {\n      if (!hasUpdated) {\n        delete scales[id];\n      }\n    });\n    each(scales, (scale) => {\n      layouts.configure(this, scale, scale.options);\n      layouts.addBox(this, scale);\n    });\n  }\n  _updateMetasets() {\n    const metasets = this._metasets;\n    const numData = this.data.datasets.length;\n    const numMeta = metasets.length;\n    metasets.sort((a, b) => a.index - b.index);\n    if (numMeta > numData) {\n      for (let i = numData; i < numMeta; ++i) {\n        this._destroyDatasetMeta(i);\n      }\n      metasets.splice(numData, numMeta - numData);\n    }\n    this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n  }\n  _removeUnreferencedMetasets() {\n    const {_metasets: metasets, data: {datasets}} = this;\n    if (metasets.length > datasets.length) {\n      delete this._stacks;\n    }\n    metasets.forEach((meta, index) => {\n      if (datasets.filter(x => x === meta._dataset).length === 0) {\n        this._destroyDatasetMeta(index);\n      }\n    });\n  }\n  buildOrUpdateControllers() {\n    const newControllers = [];\n    const datasets = this.data.datasets;\n    let i, ilen;\n    this._removeUnreferencedMetasets();\n    for (i = 0, ilen = datasets.length; i < ilen; i++) {\n      const dataset = datasets[i];\n      let meta = this.getDatasetMeta(i);\n      const type = dataset.type || this.config.type;\n      if (meta.type && meta.type !== type) {\n        this._destroyDatasetMeta(i);\n        meta = this.getDatasetMeta(i);\n      }\n      meta.type = type;\n      meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n      meta.order = dataset.order || 0;\n      meta.index = i;\n      meta.label = '' + dataset.label;\n      meta.visible = this.isDatasetVisible(i);\n      if (meta.controller) {\n        meta.controller.updateIndex(i);\n        meta.controller.linkScales();\n      } else {\n        const ControllerClass = registry.getController(type);\n        const {datasetElementType, dataElementType} = defaults.datasets[type];\n        Object.assign(ControllerClass.prototype, {\n          dataElementType: registry.getElement(dataElementType),\n          datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n        });\n        meta.controller = new ControllerClass(this, i);\n        newControllers.push(meta.controller);\n      }\n    }\n    this._updateMetasets();\n    return newControllers;\n  }\n  _resetElements() {\n    each(this.data.datasets, (dataset, datasetIndex) => {\n      this.getDatasetMeta(datasetIndex).controller.reset();\n    }, this);\n  }\n  reset() {\n    this._resetElements();\n    this.notifyPlugins('reset');\n  }\n  update(mode) {\n    const config = this.config;\n    config.update();\n    const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n    const animsDisabled = this._animationsDisabled = !options.animation;\n    this._updateScales();\n    this._checkEventBindings();\n    this._updateHiddenIndices();\n    this._plugins.invalidate();\n    if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n      return;\n    }\n    const newControllers = this.buildOrUpdateControllers();\n    this.notifyPlugins('beforeElementsUpdate');\n    let minPadding = 0;\n    for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n      const {controller} = this.getDatasetMeta(i);\n      const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n      controller.buildOrUpdateElements(reset);\n      minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n    }\n    minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n    this._updateLayout(minPadding);\n    if (!animsDisabled) {\n      each(newControllers, (controller) => {\n        controller.reset();\n      });\n    }\n    this._updateDatasets(mode);\n    this.notifyPlugins('afterUpdate', {mode});\n    this._layers.sort(compare2Level('z', '_idx'));\n    const {_active, _lastEvent} = this;\n    if (_lastEvent) {\n      this._eventHandler(_lastEvent, true);\n    } else if (_active.length) {\n      this._updateHoverStyles(_active, _active, true);\n    }\n    this.render();\n  }\n  _updateScales() {\n    each(this.scales, (scale) => {\n      layouts.removeBox(this, scale);\n    });\n    this.ensureScalesHaveIDs();\n    this.buildOrUpdateScales();\n  }\n  _checkEventBindings() {\n    const options = this.options;\n    const existingEvents = new Set(Object.keys(this._listeners));\n    const newEvents = new Set(options.events);\n    if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n      this.unbindEvents();\n      this.bindEvents();\n    }\n  }\n  _updateHiddenIndices() {\n    const {_hiddenIndices} = this;\n    const changes = this._getUniformDataChanges() || [];\n    for (const {method, start, count} of changes) {\n      const move = method === '_removeElements' ? -count : count;\n      moveNumericKeys(_hiddenIndices, start, move);\n    }\n  }\n  _getUniformDataChanges() {\n    const _dataChanges = this._dataChanges;\n    if (!_dataChanges || !_dataChanges.length) {\n      return;\n    }\n    this._dataChanges = [];\n    const datasetCount = this.data.datasets.length;\n    const makeSet = (idx) => new Set(\n      _dataChanges\n        .filter(c => c[0] === idx)\n        .map((c, i) => i + ',' + c.splice(1).join(','))\n    );\n    const changeSet = makeSet(0);\n    for (let i = 1; i < datasetCount; i++) {\n      if (!setsEqual(changeSet, makeSet(i))) {\n        return;\n      }\n    }\n    return Array.from(changeSet)\n      .map(c => c.split(','))\n      .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n  }\n  _updateLayout(minPadding) {\n    if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n      return;\n    }\n    layouts.update(this, this.width, this.height, minPadding);\n    const area = this.chartArea;\n    const noArea = area.width <= 0 || area.height <= 0;\n    this._layers = [];\n    each(this.boxes, (box) => {\n      if (noArea && box.position === 'chartArea') {\n        return;\n      }\n      if (box.configure) {\n        box.configure();\n      }\n      this._layers.push(...box._layers());\n    }, this);\n    this._layers.forEach((item, index) => {\n      item._idx = index;\n    });\n    this.notifyPlugins('afterLayout');\n  }\n  _updateDatasets(mode) {\n    if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n      return;\n    }\n    for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n      this.getDatasetMeta(i).controller.configure();\n    }\n    for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n      this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n    }\n    this.notifyPlugins('afterDatasetsUpdate', {mode});\n  }\n  _updateDataset(index, mode) {\n    const meta = this.getDatasetMeta(index);\n    const args = {meta, index, mode, cancelable: true};\n    if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n      return;\n    }\n    meta.controller._update(mode);\n    args.cancelable = false;\n    this.notifyPlugins('afterDatasetUpdate', args);\n  }\n  render() {\n    if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n      return;\n    }\n    if (animator.has(this)) {\n      if (this.attached && !animator.running(this)) {\n        animator.start(this);\n      }\n    } else {\n      this.draw();\n      onAnimationsComplete({chart: this});\n    }\n  }\n  draw() {\n    let i;\n    if (this._resizeBeforeDraw) {\n      const {width, height} = this._resizeBeforeDraw;\n      this._resize(width, height);\n      this._resizeBeforeDraw = null;\n    }\n    this.clear();\n    if (this.width <= 0 || this.height <= 0) {\n      return;\n    }\n    if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n      return;\n    }\n    const layers = this._layers;\n    for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n      layers[i].draw(this.chartArea);\n    }\n    this._drawDatasets();\n    for (; i < layers.length; ++i) {\n      layers[i].draw(this.chartArea);\n    }\n    this.notifyPlugins('afterDraw');\n  }\n  _getSortedDatasetMetas(filterVisible) {\n    const metasets = this._sortedMetasets;\n    const result = [];\n    let i, ilen;\n    for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n      const meta = metasets[i];\n      if (!filterVisible || meta.visible) {\n        result.push(meta);\n      }\n    }\n    return result;\n  }\n  getSortedVisibleDatasetMetas() {\n    return this._getSortedDatasetMetas(true);\n  }\n  _drawDatasets() {\n    if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n      return;\n    }\n    const metasets = this.getSortedVisibleDatasetMetas();\n    for (let i = metasets.length - 1; i >= 0; --i) {\n      this._drawDataset(metasets[i]);\n    }\n    this.notifyPlugins('afterDatasetsDraw');\n  }\n  _drawDataset(meta) {\n    const ctx = this.ctx;\n    const clip = meta._clip;\n    const useClip = !clip.disabled;\n    const area = this.chartArea;\n    const args = {\n      meta,\n      index: meta.index,\n      cancelable: true\n    };\n    if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n      return;\n    }\n    if (useClip) {\n      clipArea(ctx, {\n        left: clip.left === false ? 0 : area.left - clip.left,\n        right: clip.right === false ? this.width : area.right + clip.right,\n        top: clip.top === false ? 0 : area.top - clip.top,\n        bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom\n      });\n    }\n    meta.controller.draw();\n    if (useClip) {\n      unclipArea(ctx);\n    }\n    args.cancelable = false;\n    this.notifyPlugins('afterDatasetDraw', args);\n  }\n  isPointInArea(point) {\n    return _isPointInArea(point, this.chartArea, this._minPadding);\n  }\n  getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n    const method = Interaction.modes[mode];\n    if (typeof method === 'function') {\n      return method(this, e, options, useFinalPosition);\n    }\n    return [];\n  }\n  getDatasetMeta(datasetIndex) {\n    const dataset = this.data.datasets[datasetIndex];\n    const metasets = this._metasets;\n    let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n    if (!meta) {\n      meta = {\n        type: null,\n        data: [],\n        dataset: null,\n        controller: null,\n        hidden: null,\n        xAxisID: null,\n        yAxisID: null,\n        order: dataset && dataset.order || 0,\n        index: datasetIndex,\n        _dataset: dataset,\n        _parsed: [],\n        _sorted: false\n      };\n      metasets.push(meta);\n    }\n    return meta;\n  }\n  getContext() {\n    return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));\n  }\n  getVisibleDatasetCount() {\n    return this.getSortedVisibleDatasetMetas().length;\n  }\n  isDatasetVisible(datasetIndex) {\n    const dataset = this.data.datasets[datasetIndex];\n    if (!dataset) {\n      return false;\n    }\n    const meta = this.getDatasetMeta(datasetIndex);\n    return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n  }\n  setDatasetVisibility(datasetIndex, visible) {\n    const meta = this.getDatasetMeta(datasetIndex);\n    meta.hidden = !visible;\n  }\n  toggleDataVisibility(index) {\n    this._hiddenIndices[index] = !this._hiddenIndices[index];\n  }\n  getDataVisibility(index) {\n    return !this._hiddenIndices[index];\n  }\n  _updateVisibility(datasetIndex, dataIndex, visible) {\n    const mode = visible ? 'show' : 'hide';\n    const meta = this.getDatasetMeta(datasetIndex);\n    const anims = meta.controller._resolveAnimations(undefined, mode);\n    if (defined(dataIndex)) {\n      meta.data[dataIndex].hidden = !visible;\n      this.update();\n    } else {\n      this.setDatasetVisibility(datasetIndex, visible);\n      anims.update(meta, {visible});\n      this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n    }\n  }\n  hide(datasetIndex, dataIndex) {\n    this._updateVisibility(datasetIndex, dataIndex, false);\n  }\n  show(datasetIndex, dataIndex) {\n    this._updateVisibility(datasetIndex, dataIndex, true);\n  }\n  _destroyDatasetMeta(datasetIndex) {\n    const meta = this._metasets[datasetIndex];\n    if (meta && meta.controller) {\n      meta.controller._destroy();\n    }\n    delete this._metasets[datasetIndex];\n  }\n  _stop() {\n    let i, ilen;\n    this.stop();\n    animator.remove(this);\n    for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n      this._destroyDatasetMeta(i);\n    }\n  }\n  destroy() {\n    this.notifyPlugins('beforeDestroy');\n    const {canvas, ctx} = this;\n    this._stop();\n    this.config.clearCache();\n    if (canvas) {\n      this.unbindEvents();\n      clearCanvas(canvas, ctx);\n      this.platform.releaseContext(ctx);\n      this.canvas = null;\n      this.ctx = null;\n    }\n    this.notifyPlugins('destroy');\n    delete instances[this.id];\n    this.notifyPlugins('afterDestroy');\n  }\n  toBase64Image(...args) {\n    return this.canvas.toDataURL(...args);\n  }\n  bindEvents() {\n    this.bindUserEvents();\n    if (this.options.responsive) {\n      this.bindResponsiveEvents();\n    } else {\n      this.attached = true;\n    }\n  }\n  bindUserEvents() {\n    const listeners = this._listeners;\n    const platform = this.platform;\n    const _add = (type, listener) => {\n      platform.addEventListener(this, type, listener);\n      listeners[type] = listener;\n    };\n    const listener = (e, x, y) => {\n      e.offsetX = x;\n      e.offsetY = y;\n      this._eventHandler(e);\n    };\n    each(this.options.events, (type) => _add(type, listener));\n  }\n  bindResponsiveEvents() {\n    if (!this._responsiveListeners) {\n      this._responsiveListeners = {};\n    }\n    const listeners = this._responsiveListeners;\n    const platform = this.platform;\n    const _add = (type, listener) => {\n      platform.addEventListener(this, type, listener);\n      listeners[type] = listener;\n    };\n    const _remove = (type, listener) => {\n      if (listeners[type]) {\n        platform.removeEventListener(this, type, listener);\n        delete listeners[type];\n      }\n    };\n    const listener = (width, height) => {\n      if (this.canvas) {\n        this.resize(width, height);\n      }\n    };\n    let detached;\n    const attached = () => {\n      _remove('attach', attached);\n      this.attached = true;\n      this.resize();\n      _add('resize', listener);\n      _add('detach', detached);\n    };\n    detached = () => {\n      this.attached = false;\n      _remove('resize', listener);\n      this._stop();\n      this._resize(0, 0);\n      _add('attach', attached);\n    };\n    if (platform.isAttached(this.canvas)) {\n      attached();\n    } else {\n      detached();\n    }\n  }\n  unbindEvents() {\n    each(this._listeners, (listener, type) => {\n      this.platform.removeEventListener(this, type, listener);\n    });\n    this._listeners = {};\n    each(this._responsiveListeners, (listener, type) => {\n      this.platform.removeEventListener(this, type, listener);\n    });\n    this._responsiveListeners = undefined;\n  }\n  updateHoverStyle(items, mode, enabled) {\n    const prefix = enabled ? 'set' : 'remove';\n    let meta, item, i, ilen;\n    if (mode === 'dataset') {\n      meta = this.getDatasetMeta(items[0].datasetIndex);\n      meta.controller['_' + prefix + 'DatasetHoverStyle']();\n    }\n    for (i = 0, ilen = items.length; i < ilen; ++i) {\n      item = items[i];\n      const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n      if (controller) {\n        controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n      }\n    }\n  }\n  getActiveElements() {\n    return this._active || [];\n  }\n  setActiveElements(activeElements) {\n    const lastActive = this._active || [];\n    const active = activeElements.map(({datasetIndex, index}) => {\n      const meta = this.getDatasetMeta(datasetIndex);\n      if (!meta) {\n        throw new Error('No dataset found at index ' + datasetIndex);\n      }\n      return {\n        datasetIndex,\n        element: meta.data[index],\n        index,\n      };\n    });\n    const changed = !_elementsEqual(active, lastActive);\n    if (changed) {\n      this._active = active;\n      this._lastEvent = null;\n      this._updateHoverStyles(active, lastActive);\n    }\n  }\n  notifyPlugins(hook, args, filter) {\n    return this._plugins.notify(this, hook, args, filter);\n  }\n  _updateHoverStyles(active, lastActive, replay) {\n    const hoverOptions = this.options.hover;\n    const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n    const deactivated = diff(lastActive, active);\n    const activated = replay ? active : diff(active, lastActive);\n    if (deactivated.length) {\n      this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n    }\n    if (activated.length && hoverOptions.mode) {\n      this.updateHoverStyle(activated, hoverOptions.mode, true);\n    }\n  }\n  _eventHandler(e, replay) {\n    const args = {\n      event: e,\n      replay,\n      cancelable: true,\n      inChartArea: this.isPointInArea(e)\n    };\n    const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n    if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n      return;\n    }\n    const changed = this._handleEvent(e, replay, args.inChartArea);\n    args.cancelable = false;\n    this.notifyPlugins('afterEvent', args, eventFilter);\n    if (changed || args.changed) {\n      this.render();\n    }\n    return this;\n  }\n  _handleEvent(e, replay, inChartArea) {\n    const {_active: lastActive = [], options} = this;\n    const useFinalPosition = replay;\n    const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n    const isClick = _isClickEvent(e);\n    const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n    if (inChartArea) {\n      this._lastEvent = null;\n      callback(options.onHover, [e, active, this], this);\n      if (isClick) {\n        callback(options.onClick, [e, active, this], this);\n      }\n    }\n    const changed = !_elementsEqual(active, lastActive);\n    if (changed || replay) {\n      this._active = active;\n      this._updateHoverStyles(active, lastActive, replay);\n    }\n    this._lastEvent = lastEvent;\n    return changed;\n  }\n  _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n    if (e.type === 'mouseout') {\n      return [];\n    }\n    if (!inChartArea) {\n      return lastActive;\n    }\n    const hoverOptions = this.options.hover;\n    return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n  }\n}\nconst invalidatePlugins = () => each(Chart.instances, (chart) => chart._plugins.invalidate());\nconst enumerable = true;\nObject.defineProperties(Chart, {\n  defaults: {\n    enumerable,\n    value: defaults\n  },\n  instances: {\n    enumerable,\n    value: instances\n  },\n  overrides: {\n    enumerable,\n    value: overrides\n  },\n  registry: {\n    enumerable,\n    value: registry\n  },\n  version: {\n    enumerable,\n    value: version\n  },\n  getChart: {\n    enumerable,\n    value: getChart\n  },\n  register: {\n    enumerable,\n    value: (...items) => {\n      registry.add(...items);\n      invalidatePlugins();\n    }\n  },\n  unregister: {\n    enumerable,\n    value: (...items) => {\n      registry.remove(...items);\n      invalidatePlugins();\n    }\n  }\n});\n\nfunction clipArc(ctx, element, endAngle) {\n  const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n  let angleMargin = pixelMargin / outerRadius;\n  ctx.beginPath();\n  ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n  if (innerRadius > pixelMargin) {\n    angleMargin = pixelMargin / innerRadius;\n    ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n  } else {\n    ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n  }\n  ctx.closePath();\n  ctx.clip();\n}\nfunction toRadiusCorners(value) {\n  return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\nfunction parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) {\n  const o = toRadiusCorners(arc.options.borderRadius);\n  const halfThickness = (outerRadius - innerRadius) / 2;\n  const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n  const computeOuterLimit = (val) => {\n    const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n    return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n  };\n  return {\n    outerStart: computeOuterLimit(o.outerStart),\n    outerEnd: computeOuterLimit(o.outerEnd),\n    innerStart: _limitValue(o.innerStart, 0, innerLimit),\n    innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n  };\n}\nfunction rThetaToXY(r, theta, x, y) {\n  return {\n    x: x + r * Math.cos(theta),\n    y: y + r * Math.sin(theta),\n  };\n}\nfunction pathArc(ctx, element, offset, spacing, end, circular) {\n  const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n  const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n  const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n  let spacingOffset = 0;\n  const alpha = end - start;\n  if (spacing) {\n    const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n    const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n    const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n    const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n    spacingOffset = (alpha - adjustedAngle) / 2;\n  }\n  const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n  const angleOffset = (alpha - beta) / 2;\n  const startAngle = start + angleOffset + spacingOffset;\n  const endAngle = end - angleOffset - spacingOffset;\n  const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle);\n  const outerStartAdjustedRadius = outerRadius - outerStart;\n  const outerEndAdjustedRadius = outerRadius - outerEnd;\n  const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n  const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n  const innerStartAdjustedRadius = innerRadius + innerStart;\n  const innerEndAdjustedRadius = innerRadius + innerEnd;\n  const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n  const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n  ctx.beginPath();\n  if (circular) {\n    ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerEndAdjustedAngle);\n    if (outerEnd > 0) {\n      const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n      ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n    }\n    const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n    ctx.lineTo(p4.x, p4.y);\n    if (innerEnd > 0) {\n      const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n      ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n    }\n    ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), startAngle + (innerStart / innerRadius), true);\n    if (innerStart > 0) {\n      const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n      ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n    }\n    const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n    ctx.lineTo(p8.x, p8.y);\n    if (outerStart > 0) {\n      const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n      ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n    }\n  } else {\n    ctx.moveTo(x, y);\n    const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n    const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n    ctx.lineTo(outerStartX, outerStartY);\n    const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n    const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n    ctx.lineTo(outerEndX, outerEndY);\n  }\n  ctx.closePath();\n}\nfunction drawArc(ctx, element, offset, spacing, circular) {\n  const {fullCircles, startAngle, circumference} = element;\n  let endAngle = element.endAngle;\n  if (fullCircles) {\n    pathArc(ctx, element, offset, spacing, startAngle + TAU, circular);\n    for (let i = 0; i < fullCircles; ++i) {\n      ctx.fill();\n    }\n    if (!isNaN(circumference)) {\n      endAngle = startAngle + circumference % TAU;\n      if (circumference % TAU === 0) {\n        endAngle += TAU;\n      }\n    }\n  }\n  pathArc(ctx, element, offset, spacing, endAngle, circular);\n  ctx.fill();\n  return endAngle;\n}\nfunction drawFullCircleBorders(ctx, element, inner) {\n  const {x, y, startAngle, pixelMargin, fullCircles} = element;\n  const outerRadius = Math.max(element.outerRadius - pixelMargin, 0);\n  const innerRadius = element.innerRadius + pixelMargin;\n  let i;\n  if (inner) {\n    clipArc(ctx, element, startAngle + TAU);\n  }\n  ctx.beginPath();\n  ctx.arc(x, y, innerRadius, startAngle + TAU, startAngle, true);\n  for (i = 0; i < fullCircles; ++i) {\n    ctx.stroke();\n  }\n  ctx.beginPath();\n  ctx.arc(x, y, outerRadius, startAngle, startAngle + TAU);\n  for (i = 0; i < fullCircles; ++i) {\n    ctx.stroke();\n  }\n}\nfunction drawBorder(ctx, element, offset, spacing, endAngle, circular) {\n  const {options} = element;\n  const {borderWidth, borderJoinStyle} = options;\n  const inner = options.borderAlign === 'inner';\n  if (!borderWidth) {\n    return;\n  }\n  if (inner) {\n    ctx.lineWidth = borderWidth * 2;\n    ctx.lineJoin = borderJoinStyle || 'round';\n  } else {\n    ctx.lineWidth = borderWidth;\n    ctx.lineJoin = borderJoinStyle || 'bevel';\n  }\n  if (element.fullCircles) {\n    drawFullCircleBorders(ctx, element, inner);\n  }\n  if (inner) {\n    clipArc(ctx, element, endAngle);\n  }\n  pathArc(ctx, element, offset, spacing, endAngle, circular);\n  ctx.stroke();\n}\nclass ArcElement extends Element {\n  constructor(cfg) {\n    super();\n    this.options = undefined;\n    this.circumference = undefined;\n    this.startAngle = undefined;\n    this.endAngle = undefined;\n    this.innerRadius = undefined;\n    this.outerRadius = undefined;\n    this.pixelMargin = 0;\n    this.fullCircles = 0;\n    if (cfg) {\n      Object.assign(this, cfg);\n    }\n  }\n  inRange(chartX, chartY, useFinalPosition) {\n    const point = this.getProps(['x', 'y'], useFinalPosition);\n    const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n    const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n      'startAngle',\n      'endAngle',\n      'innerRadius',\n      'outerRadius',\n      'circumference'\n    ], useFinalPosition);\n    const rAdjust = this.options.spacing / 2;\n    const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n    const betweenAngles = _circumference >= TAU || _angleBetween(angle, startAngle, endAngle);\n    const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n    return (betweenAngles && withinRadius);\n  }\n  getCenterPoint(useFinalPosition) {\n    const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n      'x',\n      'y',\n      'startAngle',\n      'endAngle',\n      'innerRadius',\n      'outerRadius',\n      'circumference',\n    ], useFinalPosition);\n    const {offset, spacing} = this.options;\n    const halfAngle = (startAngle + endAngle) / 2;\n    const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n    return {\n      x: x + Math.cos(halfAngle) * halfRadius,\n      y: y + Math.sin(halfAngle) * halfRadius\n    };\n  }\n  tooltipPosition(useFinalPosition) {\n    return this.getCenterPoint(useFinalPosition);\n  }\n  draw(ctx) {\n    const {options, circumference} = this;\n    const offset = (options.offset || 0) / 2;\n    const spacing = (options.spacing || 0) / 2;\n    const circular = options.circular;\n    this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n    this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n    if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n      return;\n    }\n    ctx.save();\n    let radiusOffset = 0;\n    if (offset) {\n      radiusOffset = offset / 2;\n      const halfAngle = (this.startAngle + this.endAngle) / 2;\n      ctx.translate(Math.cos(halfAngle) * radiusOffset, Math.sin(halfAngle) * radiusOffset);\n      if (this.circumference >= PI) {\n        radiusOffset = offset;\n      }\n    }\n    ctx.fillStyle = options.backgroundColor;\n    ctx.strokeStyle = options.borderColor;\n    const endAngle = drawArc(ctx, this, radiusOffset, spacing, circular);\n    drawBorder(ctx, this, radiusOffset, spacing, endAngle, circular);\n    ctx.restore();\n  }\n}\nArcElement.id = 'arc';\nArcElement.defaults = {\n  borderAlign: 'center',\n  borderColor: '#fff',\n  borderJoinStyle: undefined,\n  borderRadius: 0,\n  borderWidth: 2,\n  offset: 0,\n  spacing: 0,\n  angle: undefined,\n  circular: true,\n};\nArcElement.defaultRoutes = {\n  backgroundColor: 'backgroundColor'\n};\n\nfunction setStyle(ctx, options, style = options) {\n  ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n  ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n  ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n  ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n  ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n  ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\nfunction lineTo(ctx, previous, target) {\n  ctx.lineTo(target.x, target.y);\n}\nfunction getLineMethod(options) {\n  if (options.stepped) {\n    return _steppedLineTo;\n  }\n  if (options.tension || options.cubicInterpolationMode === 'monotone') {\n    return _bezierCurveTo;\n  }\n  return lineTo;\n}\nfunction pathVars(points, segment, params = {}) {\n  const count = points.length;\n  const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n  const {start: segmentStart, end: segmentEnd} = segment;\n  const start = Math.max(paramsStart, segmentStart);\n  const end = Math.min(paramsEnd, segmentEnd);\n  const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n  return {\n    count,\n    start,\n    loop: segment.loop,\n    ilen: end < start && !outside ? count + end - start : end - start\n  };\n}\nfunction pathSegment(ctx, line, segment, params) {\n  const {points, options} = line;\n  const {count, start, loop, ilen} = pathVars(points, segment, params);\n  const lineMethod = getLineMethod(options);\n  let {move = true, reverse} = params || {};\n  let i, point, prev;\n  for (i = 0; i <= ilen; ++i) {\n    point = points[(start + (reverse ? ilen - i : i)) % count];\n    if (point.skip) {\n      continue;\n    } else if (move) {\n      ctx.moveTo(point.x, point.y);\n      move = false;\n    } else {\n      lineMethod(ctx, prev, point, reverse, options.stepped);\n    }\n    prev = point;\n  }\n  if (loop) {\n    point = points[(start + (reverse ? ilen : 0)) % count];\n    lineMethod(ctx, prev, point, reverse, options.stepped);\n  }\n  return !!loop;\n}\nfunction fastPathSegment(ctx, line, segment, params) {\n  const points = line.points;\n  const {count, start, ilen} = pathVars(points, segment, params);\n  const {move = true, reverse} = params || {};\n  let avgX = 0;\n  let countX = 0;\n  let i, point, prevX, minY, maxY, lastY;\n  const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n  const drawX = () => {\n    if (minY !== maxY) {\n      ctx.lineTo(avgX, maxY);\n      ctx.lineTo(avgX, minY);\n      ctx.lineTo(avgX, lastY);\n    }\n  };\n  if (move) {\n    point = points[pointIndex(0)];\n    ctx.moveTo(point.x, point.y);\n  }\n  for (i = 0; i <= ilen; ++i) {\n    point = points[pointIndex(i)];\n    if (point.skip) {\n      continue;\n    }\n    const x = point.x;\n    const y = point.y;\n    const truncX = x | 0;\n    if (truncX === prevX) {\n      if (y < minY) {\n        minY = y;\n      } else if (y > maxY) {\n        maxY = y;\n      }\n      avgX = (countX * avgX + x) / ++countX;\n    } else {\n      drawX();\n      ctx.lineTo(x, y);\n      prevX = truncX;\n      countX = 0;\n      minY = maxY = y;\n    }\n    lastY = y;\n  }\n  drawX();\n}\nfunction _getSegmentMethod(line) {\n  const opts = line.options;\n  const borderDash = opts.borderDash && opts.borderDash.length;\n  const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n  return useFastPath ? fastPathSegment : pathSegment;\n}\nfunction _getInterpolationMethod(options) {\n  if (options.stepped) {\n    return _steppedInterpolation;\n  }\n  if (options.tension || options.cubicInterpolationMode === 'monotone') {\n    return _bezierInterpolation;\n  }\n  return _pointInLine;\n}\nfunction strokePathWithCache(ctx, line, start, count) {\n  let path = line._path;\n  if (!path) {\n    path = line._path = new Path2D();\n    if (line.path(path, start, count)) {\n      path.closePath();\n    }\n  }\n  setStyle(ctx, line.options);\n  ctx.stroke(path);\n}\nfunction strokePathDirect(ctx, line, start, count) {\n  const {segments, options} = line;\n  const segmentMethod = _getSegmentMethod(line);\n  for (const segment of segments) {\n    setStyle(ctx, options, segment.style);\n    ctx.beginPath();\n    if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n      ctx.closePath();\n    }\n    ctx.stroke();\n  }\n}\nconst usePath2D = typeof Path2D === 'function';\nfunction draw(ctx, line, start, count) {\n  if (usePath2D && !line.options.segment) {\n    strokePathWithCache(ctx, line, start, count);\n  } else {\n    strokePathDirect(ctx, line, start, count);\n  }\n}\nclass LineElement extends Element {\n  constructor(cfg) {\n    super();\n    this.animated = true;\n    this.options = undefined;\n    this._chart = undefined;\n    this._loop = undefined;\n    this._fullLoop = undefined;\n    this._path = undefined;\n    this._points = undefined;\n    this._segments = undefined;\n    this._decimated = false;\n    this._pointsUpdated = false;\n    this._datasetIndex = undefined;\n    if (cfg) {\n      Object.assign(this, cfg);\n    }\n  }\n  updateControlPoints(chartArea, indexAxis) {\n    const options = this.options;\n    if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n      const loop = options.spanGaps ? this._loop : this._fullLoop;\n      _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n      this._pointsUpdated = true;\n    }\n  }\n  set points(points) {\n    this._points = points;\n    delete this._segments;\n    delete this._path;\n    this._pointsUpdated = false;\n  }\n  get points() {\n    return this._points;\n  }\n  get segments() {\n    return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n  }\n  first() {\n    const segments = this.segments;\n    const points = this.points;\n    return segments.length && points[segments[0].start];\n  }\n  last() {\n    const segments = this.segments;\n    const points = this.points;\n    const count = segments.length;\n    return count && points[segments[count - 1].end];\n  }\n  interpolate(point, property) {\n    const options = this.options;\n    const value = point[property];\n    const points = this.points;\n    const segments = _boundSegments(this, {property, start: value, end: value});\n    if (!segments.length) {\n      return;\n    }\n    const result = [];\n    const _interpolate = _getInterpolationMethod(options);\n    let i, ilen;\n    for (i = 0, ilen = segments.length; i < ilen; ++i) {\n      const {start, end} = segments[i];\n      const p1 = points[start];\n      const p2 = points[end];\n      if (p1 === p2) {\n        result.push(p1);\n        continue;\n      }\n      const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n      const interpolated = _interpolate(p1, p2, t, options.stepped);\n      interpolated[property] = point[property];\n      result.push(interpolated);\n    }\n    return result.length === 1 ? result[0] : result;\n  }\n  pathSegment(ctx, segment, params) {\n    const segmentMethod = _getSegmentMethod(this);\n    return segmentMethod(ctx, this, segment, params);\n  }\n  path(ctx, start, count) {\n    const segments = this.segments;\n    const segmentMethod = _getSegmentMethod(this);\n    let loop = this._loop;\n    start = start || 0;\n    count = count || (this.points.length - start);\n    for (const segment of segments) {\n      loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n    }\n    return !!loop;\n  }\n  draw(ctx, chartArea, start, count) {\n    const options = this.options || {};\n    const points = this.points || [];\n    if (points.length && options.borderWidth) {\n      ctx.save();\n      draw(ctx, this, start, count);\n      ctx.restore();\n    }\n    if (this.animated) {\n      this._pointsUpdated = false;\n      this._path = undefined;\n    }\n  }\n}\nLineElement.id = 'line';\nLineElement.defaults = {\n  borderCapStyle: 'butt',\n  borderDash: [],\n  borderDashOffset: 0,\n  borderJoinStyle: 'miter',\n  borderWidth: 3,\n  capBezierPoints: true,\n  cubicInterpolationMode: 'default',\n  fill: false,\n  spanGaps: false,\n  stepped: false,\n  tension: 0,\n};\nLineElement.defaultRoutes = {\n  backgroundColor: 'backgroundColor',\n  borderColor: 'borderColor'\n};\nLineElement.descriptors = {\n  _scriptable: true,\n  _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n};\n\nfunction inRange$1(el, pos, axis, useFinalPosition) {\n  const options = el.options;\n  const {[axis]: value} = el.getProps([axis], useFinalPosition);\n  return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\nclass PointElement extends Element {\n  constructor(cfg) {\n    super();\n    this.options = undefined;\n    this.parsed = undefined;\n    this.skip = undefined;\n    this.stop = undefined;\n    if (cfg) {\n      Object.assign(this, cfg);\n    }\n  }\n  inRange(mouseX, mouseY, useFinalPosition) {\n    const options = this.options;\n    const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n    return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n  }\n  inXRange(mouseX, useFinalPosition) {\n    return inRange$1(this, mouseX, 'x', useFinalPosition);\n  }\n  inYRange(mouseY, useFinalPosition) {\n    return inRange$1(this, mouseY, 'y', useFinalPosition);\n  }\n  getCenterPoint(useFinalPosition) {\n    const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n    return {x, y};\n  }\n  size(options) {\n    options = options || this.options || {};\n    let radius = options.radius || 0;\n    radius = Math.max(radius, radius && options.hoverRadius || 0);\n    const borderWidth = radius && options.borderWidth || 0;\n    return (radius + borderWidth) * 2;\n  }\n  draw(ctx, area) {\n    const options = this.options;\n    if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n      return;\n    }\n    ctx.strokeStyle = options.borderColor;\n    ctx.lineWidth = options.borderWidth;\n    ctx.fillStyle = options.backgroundColor;\n    drawPoint(ctx, options, this.x, this.y);\n  }\n  getRange() {\n    const options = this.options || {};\n    return options.radius + options.hitRadius;\n  }\n}\nPointElement.id = 'point';\nPointElement.defaults = {\n  borderWidth: 1,\n  hitRadius: 1,\n  hoverBorderWidth: 1,\n  hoverRadius: 4,\n  pointStyle: 'circle',\n  radius: 3,\n  rotation: 0\n};\nPointElement.defaultRoutes = {\n  backgroundColor: 'backgroundColor',\n  borderColor: 'borderColor'\n};\n\nfunction getBarBounds(bar, useFinalPosition) {\n  const {x, y, base, width, height} = bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition);\n  let left, right, top, bottom, half;\n  if (bar.horizontal) {\n    half = height / 2;\n    left = Math.min(x, base);\n    right = Math.max(x, base);\n    top = y - half;\n    bottom = y + half;\n  } else {\n    half = width / 2;\n    left = x - half;\n    right = x + half;\n    top = Math.min(y, base);\n    bottom = Math.max(y, base);\n  }\n  return {left, top, right, bottom};\n}\nfunction skipOrLimit(skip, value, min, max) {\n  return skip ? 0 : _limitValue(value, min, max);\n}\nfunction parseBorderWidth(bar, maxW, maxH) {\n  const value = bar.options.borderWidth;\n  const skip = bar.borderSkipped;\n  const o = toTRBL(value);\n  return {\n    t: skipOrLimit(skip.top, o.top, 0, maxH),\n    r: skipOrLimit(skip.right, o.right, 0, maxW),\n    b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n    l: skipOrLimit(skip.left, o.left, 0, maxW)\n  };\n}\nfunction parseBorderRadius(bar, maxW, maxH) {\n  const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n  const value = bar.options.borderRadius;\n  const o = toTRBLCorners(value);\n  const maxR = Math.min(maxW, maxH);\n  const skip = bar.borderSkipped;\n  const enableBorder = enableBorderRadius || isObject(value);\n  return {\n    topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n    topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n    bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n    bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n  };\n}\nfunction boundingRects(bar) {\n  const bounds = getBarBounds(bar);\n  const width = bounds.right - bounds.left;\n  const height = bounds.bottom - bounds.top;\n  const border = parseBorderWidth(bar, width / 2, height / 2);\n  const radius = parseBorderRadius(bar, width / 2, height / 2);\n  return {\n    outer: {\n      x: bounds.left,\n      y: bounds.top,\n      w: width,\n      h: height,\n      radius\n    },\n    inner: {\n      x: bounds.left + border.l,\n      y: bounds.top + border.t,\n      w: width - border.l - border.r,\n      h: height - border.t - border.b,\n      radius: {\n        topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n        topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n        bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n        bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n      }\n    }\n  };\n}\nfunction inRange(bar, x, y, useFinalPosition) {\n  const skipX = x === null;\n  const skipY = y === null;\n  const skipBoth = skipX && skipY;\n  const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n  return bounds\n\t\t&& (skipX || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\nfunction hasRadius(radius) {\n  return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\nfunction addNormalRectPath(ctx, rect) {\n  ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\nfunction inflateRect(rect, amount, refRect = {}) {\n  const x = rect.x !== refRect.x ? -amount : 0;\n  const y = rect.y !== refRect.y ? -amount : 0;\n  const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n  const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n  return {\n    x: rect.x + x,\n    y: rect.y + y,\n    w: rect.w + w,\n    h: rect.h + h,\n    radius: rect.radius\n  };\n}\nclass BarElement extends Element {\n  constructor(cfg) {\n    super();\n    this.options = undefined;\n    this.horizontal = undefined;\n    this.base = undefined;\n    this.width = undefined;\n    this.height = undefined;\n    this.inflateAmount = undefined;\n    if (cfg) {\n      Object.assign(this, cfg);\n    }\n  }\n  draw(ctx) {\n    const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n    const {inner, outer} = boundingRects(this);\n    const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n    ctx.save();\n    if (outer.w !== inner.w || outer.h !== inner.h) {\n      ctx.beginPath();\n      addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n      ctx.clip();\n      addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n      ctx.fillStyle = borderColor;\n      ctx.fill('evenodd');\n    }\n    ctx.beginPath();\n    addRectPath(ctx, inflateRect(inner, inflateAmount));\n    ctx.fillStyle = backgroundColor;\n    ctx.fill();\n    ctx.restore();\n  }\n  inRange(mouseX, mouseY, useFinalPosition) {\n    return inRange(this, mouseX, mouseY, useFinalPosition);\n  }\n  inXRange(mouseX, useFinalPosition) {\n    return inRange(this, mouseX, null, useFinalPosition);\n  }\n  inYRange(mouseY, useFinalPosition) {\n    return inRange(this, null, mouseY, useFinalPosition);\n  }\n  getCenterPoint(useFinalPosition) {\n    const {x, y, base, horizontal} = this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition);\n    return {\n      x: horizontal ? (x + base) / 2 : x,\n      y: horizontal ? y : (y + base) / 2\n    };\n  }\n  getRange(axis) {\n    return axis === 'x' ? this.width / 2 : this.height / 2;\n  }\n}\nBarElement.id = 'bar';\nBarElement.defaults = {\n  borderSkipped: 'start',\n  borderWidth: 0,\n  borderRadius: 0,\n  inflateAmount: 'auto',\n  pointStyle: undefined\n};\nBarElement.defaultRoutes = {\n  backgroundColor: 'backgroundColor',\n  borderColor: 'borderColor'\n};\n\nvar elements = /*#__PURE__*/Object.freeze({\n__proto__: null,\nArcElement: ArcElement,\nLineElement: LineElement,\nPointElement: PointElement,\nBarElement: BarElement\n});\n\nfunction lttbDecimation(data, start, count, availableWidth, options) {\n  const samples = options.samples || availableWidth;\n  if (samples >= count) {\n    return data.slice(start, start + count);\n  }\n  const decimated = [];\n  const bucketWidth = (count - 2) / (samples - 2);\n  let sampledIndex = 0;\n  const endIndex = start + count - 1;\n  let a = start;\n  let i, maxAreaPoint, maxArea, area, nextA;\n  decimated[sampledIndex++] = data[a];\n  for (i = 0; i < samples - 2; i++) {\n    let avgX = 0;\n    let avgY = 0;\n    let j;\n    const avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start;\n    const avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start;\n    const avgRangeLength = avgRangeEnd - avgRangeStart;\n    for (j = avgRangeStart; j < avgRangeEnd; j++) {\n      avgX += data[j].x;\n      avgY += data[j].y;\n    }\n    avgX /= avgRangeLength;\n    avgY /= avgRangeLength;\n    const rangeOffs = Math.floor(i * bucketWidth) + 1 + start;\n    const rangeTo = Math.min(Math.floor((i + 1) * bucketWidth) + 1, count) + start;\n    const {x: pointAx, y: pointAy} = data[a];\n    maxArea = area = -1;\n    for (j = rangeOffs; j < rangeTo; j++) {\n      area = 0.5 * Math.abs(\n        (pointAx - avgX) * (data[j].y - pointAy) -\n        (pointAx - data[j].x) * (avgY - pointAy)\n      );\n      if (area > maxArea) {\n        maxArea = area;\n        maxAreaPoint = data[j];\n        nextA = j;\n      }\n    }\n    decimated[sampledIndex++] = maxAreaPoint;\n    a = nextA;\n  }\n  decimated[sampledIndex++] = data[endIndex];\n  return decimated;\n}\nfunction minMaxDecimation(data, start, count, availableWidth) {\n  let avgX = 0;\n  let countX = 0;\n  let i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY;\n  const decimated = [];\n  const endIndex = start + count - 1;\n  const xMin = data[start].x;\n  const xMax = data[endIndex].x;\n  const dx = xMax - xMin;\n  for (i = start; i < start + count; ++i) {\n    point = data[i];\n    x = (point.x - xMin) / dx * availableWidth;\n    y = point.y;\n    const truncX = x | 0;\n    if (truncX === prevX) {\n      if (y < minY) {\n        minY = y;\n        minIndex = i;\n      } else if (y > maxY) {\n        maxY = y;\n        maxIndex = i;\n      }\n      avgX = (countX * avgX + point.x) / ++countX;\n    } else {\n      const lastIndex = i - 1;\n      if (!isNullOrUndef(minIndex) && !isNullOrUndef(maxIndex)) {\n        const intermediateIndex1 = Math.min(minIndex, maxIndex);\n        const intermediateIndex2 = Math.max(minIndex, maxIndex);\n        if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) {\n          decimated.push({\n            ...data[intermediateIndex1],\n            x: avgX,\n          });\n        }\n        if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) {\n          decimated.push({\n            ...data[intermediateIndex2],\n            x: avgX\n          });\n        }\n      }\n      if (i > 0 && lastIndex !== startIndex) {\n        decimated.push(data[lastIndex]);\n      }\n      decimated.push(point);\n      prevX = truncX;\n      countX = 0;\n      minY = maxY = y;\n      minIndex = maxIndex = startIndex = i;\n    }\n  }\n  return decimated;\n}\nfunction cleanDecimatedDataset(dataset) {\n  if (dataset._decimated) {\n    const data = dataset._data;\n    delete dataset._decimated;\n    delete dataset._data;\n    Object.defineProperty(dataset, 'data', {value: data});\n  }\n}\nfunction cleanDecimatedData(chart) {\n  chart.data.datasets.forEach((dataset) => {\n    cleanDecimatedDataset(dataset);\n  });\n}\nfunction getStartAndCountOfVisiblePointsSimplified(meta, points) {\n  const pointCount = points.length;\n  let start = 0;\n  let count;\n  const {iScale} = meta;\n  const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n  if (minDefined) {\n    start = _limitValue(_lookupByKey(points, iScale.axis, min).lo, 0, pointCount - 1);\n  }\n  if (maxDefined) {\n    count = _limitValue(_lookupByKey(points, iScale.axis, max).hi + 1, start, pointCount) - start;\n  } else {\n    count = pointCount - start;\n  }\n  return {start, count};\n}\nvar plugin_decimation = {\n  id: 'decimation',\n  defaults: {\n    algorithm: 'min-max',\n    enabled: false,\n  },\n  beforeElementsUpdate: (chart, args, options) => {\n    if (!options.enabled) {\n      cleanDecimatedData(chart);\n      return;\n    }\n    const availableWidth = chart.width;\n    chart.data.datasets.forEach((dataset, datasetIndex) => {\n      const {_data, indexAxis} = dataset;\n      const meta = chart.getDatasetMeta(datasetIndex);\n      const data = _data || dataset.data;\n      if (resolve([indexAxis, chart.options.indexAxis]) === 'y') {\n        return;\n      }\n      if (!meta.controller.supportsDecimation) {\n        return;\n      }\n      const xAxis = chart.scales[meta.xAxisID];\n      if (xAxis.type !== 'linear' && xAxis.type !== 'time') {\n        return;\n      }\n      if (chart.options.parsing) {\n        return;\n      }\n      let {start, count} = getStartAndCountOfVisiblePointsSimplified(meta, data);\n      const threshold = options.threshold || 4 * availableWidth;\n      if (count <= threshold) {\n        cleanDecimatedDataset(dataset);\n        return;\n      }\n      if (isNullOrUndef(_data)) {\n        dataset._data = data;\n        delete dataset.data;\n        Object.defineProperty(dataset, 'data', {\n          configurable: true,\n          enumerable: true,\n          get: function() {\n            return this._decimated;\n          },\n          set: function(d) {\n            this._data = d;\n          }\n        });\n      }\n      let decimated;\n      switch (options.algorithm) {\n      case 'lttb':\n        decimated = lttbDecimation(data, start, count, availableWidth, options);\n        break;\n      case 'min-max':\n        decimated = minMaxDecimation(data, start, count, availableWidth);\n        break;\n      default:\n        throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);\n      }\n      dataset._decimated = decimated;\n    });\n  },\n  destroy(chart) {\n    cleanDecimatedData(chart);\n  }\n};\n\nfunction _segments(line, target, property) {\n  const segments = line.segments;\n  const points = line.points;\n  const tpoints = target.points;\n  const parts = [];\n  for (const segment of segments) {\n    let {start, end} = segment;\n    end = _findSegmentEnd(start, end, points);\n    const bounds = _getBounds(property, points[start], points[end], segment.loop);\n    if (!target.segments) {\n      parts.push({\n        source: segment,\n        target: bounds,\n        start: points[start],\n        end: points[end]\n      });\n      continue;\n    }\n    const targetSegments = _boundSegments(target, bounds);\n    for (const tgt of targetSegments) {\n      const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n      const fillSources = _boundSegment(segment, points, subBounds);\n      for (const fillSource of fillSources) {\n        parts.push({\n          source: fillSource,\n          target: tgt,\n          start: {\n            [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n          },\n          end: {\n            [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n          }\n        });\n      }\n    }\n  }\n  return parts;\n}\nfunction _getBounds(property, first, last, loop) {\n  if (loop) {\n    return;\n  }\n  let start = first[property];\n  let end = last[property];\n  if (property === 'angle') {\n    start = _normalizeAngle(start);\n    end = _normalizeAngle(end);\n  }\n  return {property, start, end};\n}\nfunction _pointsFromSegments(boundary, line) {\n  const {x = null, y = null} = boundary || {};\n  const linePoints = line.points;\n  const points = [];\n  line.segments.forEach(({start, end}) => {\n    end = _findSegmentEnd(start, end, linePoints);\n    const first = linePoints[start];\n    const last = linePoints[end];\n    if (y !== null) {\n      points.push({x: first.x, y});\n      points.push({x: last.x, y});\n    } else if (x !== null) {\n      points.push({x, y: first.y});\n      points.push({x, y: last.y});\n    }\n  });\n  return points;\n}\nfunction _findSegmentEnd(start, end, points) {\n  for (;end > start; end--) {\n    const point = points[end];\n    if (!isNaN(point.x) && !isNaN(point.y)) {\n      break;\n    }\n  }\n  return end;\n}\nfunction _getEdge(a, b, prop, fn) {\n  if (a && b) {\n    return fn(a[prop], b[prop]);\n  }\n  return a ? a[prop] : b ? b[prop] : 0;\n}\n\nfunction _createBoundaryLine(boundary, line) {\n  let points = [];\n  let _loop = false;\n  if (isArray(boundary)) {\n    _loop = true;\n    points = boundary;\n  } else {\n    points = _pointsFromSegments(boundary, line);\n  }\n  return points.length ? new LineElement({\n    points,\n    options: {tension: 0},\n    _loop,\n    _fullLoop: _loop\n  }) : null;\n}\nfunction _shouldApplyFill(source) {\n  return source && source.fill !== false;\n}\n\nfunction _resolveTarget(sources, index, propagate) {\n  const source = sources[index];\n  let fill = source.fill;\n  const visited = [index];\n  let target;\n  if (!propagate) {\n    return fill;\n  }\n  while (fill !== false && visited.indexOf(fill) === -1) {\n    if (!isNumberFinite(fill)) {\n      return fill;\n    }\n    target = sources[fill];\n    if (!target) {\n      return false;\n    }\n    if (target.visible) {\n      return fill;\n    }\n    visited.push(fill);\n    fill = target.fill;\n  }\n  return false;\n}\nfunction _decodeFill(line, index, count) {\n  const fill = parseFillOption(line);\n  if (isObject(fill)) {\n    return isNaN(fill.value) ? false : fill;\n  }\n  let target = parseFloat(fill);\n  if (isNumberFinite(target) && Math.floor(target) === target) {\n    return decodeTargetIndex(fill[0], index, target, count);\n  }\n  return ['origin', 'start', 'end', 'stack', 'shape'].indexOf(fill) >= 0 && fill;\n}\nfunction decodeTargetIndex(firstCh, index, target, count) {\n  if (firstCh === '-' || firstCh === '+') {\n    target = index + target;\n  }\n  if (target === index || target < 0 || target >= count) {\n    return false;\n  }\n  return target;\n}\nfunction _getTargetPixel(fill, scale) {\n  let pixel = null;\n  if (fill === 'start') {\n    pixel = scale.bottom;\n  } else if (fill === 'end') {\n    pixel = scale.top;\n  } else if (isObject(fill)) {\n    pixel = scale.getPixelForValue(fill.value);\n  } else if (scale.getBasePixel) {\n    pixel = scale.getBasePixel();\n  }\n  return pixel;\n}\nfunction _getTargetValue(fill, scale, startValue) {\n  let value;\n  if (fill === 'start') {\n    value = startValue;\n  } else if (fill === 'end') {\n    value = scale.options.reverse ? scale.min : scale.max;\n  } else if (isObject(fill)) {\n    value = fill.value;\n  } else {\n    value = scale.getBaseValue();\n  }\n  return value;\n}\nfunction parseFillOption(line) {\n  const options = line.options;\n  const fillOption = options.fill;\n  let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n  if (fill === undefined) {\n    fill = !!options.backgroundColor;\n  }\n  if (fill === false || fill === null) {\n    return false;\n  }\n  if (fill === true) {\n    return 'origin';\n  }\n  return fill;\n}\n\nfunction _buildStackLine(source) {\n  const {scale, index, line} = source;\n  const points = [];\n  const segments = line.segments;\n  const sourcePoints = line.points;\n  const linesBelow = getLinesBelow(scale, index);\n  linesBelow.push(_createBoundaryLine({x: null, y: scale.bottom}, line));\n  for (let i = 0; i < segments.length; i++) {\n    const segment = segments[i];\n    for (let j = segment.start; j <= segment.end; j++) {\n      addPointsBelow(points, sourcePoints[j], linesBelow);\n    }\n  }\n  return new LineElement({points, options: {}});\n}\nfunction getLinesBelow(scale, index) {\n  const below = [];\n  const metas = scale.getMatchingVisibleMetas('line');\n  for (let i = 0; i < metas.length; i++) {\n    const meta = metas[i];\n    if (meta.index === index) {\n      break;\n    }\n    if (!meta.hidden) {\n      below.unshift(meta.dataset);\n    }\n  }\n  return below;\n}\nfunction addPointsBelow(points, sourcePoint, linesBelow) {\n  const postponed = [];\n  for (let j = 0; j < linesBelow.length; j++) {\n    const line = linesBelow[j];\n    const {first, last, point} = findPoint(line, sourcePoint, 'x');\n    if (!point || (first && last)) {\n      continue;\n    }\n    if (first) {\n      postponed.unshift(point);\n    } else {\n      points.push(point);\n      if (!last) {\n        break;\n      }\n    }\n  }\n  points.push(...postponed);\n}\nfunction findPoint(line, sourcePoint, property) {\n  const point = line.interpolate(sourcePoint, property);\n  if (!point) {\n    return {};\n  }\n  const pointValue = point[property];\n  const segments = line.segments;\n  const linePoints = line.points;\n  let first = false;\n  let last = false;\n  for (let i = 0; i < segments.length; i++) {\n    const segment = segments[i];\n    const firstValue = linePoints[segment.start][property];\n    const lastValue = linePoints[segment.end][property];\n    if (_isBetween(pointValue, firstValue, lastValue)) {\n      first = pointValue === firstValue;\n      last = pointValue === lastValue;\n      break;\n    }\n  }\n  return {first, last, point};\n}\n\nclass simpleArc {\n  constructor(opts) {\n    this.x = opts.x;\n    this.y = opts.y;\n    this.radius = opts.radius;\n  }\n  pathSegment(ctx, bounds, opts) {\n    const {x, y, radius} = this;\n    bounds = bounds || {start: 0, end: TAU};\n    ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n    return !opts.bounds;\n  }\n  interpolate(point) {\n    const {x, y, radius} = this;\n    const angle = point.angle;\n    return {\n      x: x + Math.cos(angle) * radius,\n      y: y + Math.sin(angle) * radius,\n      angle\n    };\n  }\n}\n\nfunction _getTarget(source) {\n  const {chart, fill, line} = source;\n  if (isNumberFinite(fill)) {\n    return getLineByIndex(chart, fill);\n  }\n  if (fill === 'stack') {\n    return _buildStackLine(source);\n  }\n  if (fill === 'shape') {\n    return true;\n  }\n  const boundary = computeBoundary(source);\n  if (boundary instanceof simpleArc) {\n    return boundary;\n  }\n  return _createBoundaryLine(boundary, line);\n}\nfunction getLineByIndex(chart, index) {\n  const meta = chart.getDatasetMeta(index);\n  const visible = meta && chart.isDatasetVisible(index);\n  return visible ? meta.dataset : null;\n}\nfunction computeBoundary(source) {\n  const scale = source.scale || {};\n  if (scale.getPointPositionForValue) {\n    return computeCircularBoundary(source);\n  }\n  return computeLinearBoundary(source);\n}\nfunction computeLinearBoundary(source) {\n  const {scale = {}, fill} = source;\n  const pixel = _getTargetPixel(fill, scale);\n  if (isNumberFinite(pixel)) {\n    const horizontal = scale.isHorizontal();\n    return {\n      x: horizontal ? pixel : null,\n      y: horizontal ? null : pixel\n    };\n  }\n  return null;\n}\nfunction computeCircularBoundary(source) {\n  const {scale, fill} = source;\n  const options = scale.options;\n  const length = scale.getLabels().length;\n  const start = options.reverse ? scale.max : scale.min;\n  const value = _getTargetValue(fill, scale, start);\n  const target = [];\n  if (options.grid.circular) {\n    const center = scale.getPointPositionForValue(0, start);\n    return new simpleArc({\n      x: center.x,\n      y: center.y,\n      radius: scale.getDistanceFromCenterForValue(value)\n    });\n  }\n  for (let i = 0; i < length; ++i) {\n    target.push(scale.getPointPositionForValue(i, value));\n  }\n  return target;\n}\n\nfunction _drawfill(ctx, source, area) {\n  const target = _getTarget(source);\n  const {line, scale, axis} = source;\n  const lineOpts = line.options;\n  const fillOption = lineOpts.fill;\n  const color = lineOpts.backgroundColor;\n  const {above = color, below = color} = fillOption || {};\n  if (target && line.points.length) {\n    clipArea(ctx, area);\n    doFill(ctx, {line, target, above, below, area, scale, axis});\n    unclipArea(ctx);\n  }\n}\nfunction doFill(ctx, cfg) {\n  const {line, target, above, below, area, scale} = cfg;\n  const property = line._loop ? 'angle' : cfg.axis;\n  ctx.save();\n  if (property === 'x' && below !== above) {\n    clipVertical(ctx, target, area.top);\n    fill(ctx, {line, target, color: above, scale, property});\n    ctx.restore();\n    ctx.save();\n    clipVertical(ctx, target, area.bottom);\n  }\n  fill(ctx, {line, target, color: below, scale, property});\n  ctx.restore();\n}\nfunction clipVertical(ctx, target, clipY) {\n  const {segments, points} = target;\n  let first = true;\n  let lineLoop = false;\n  ctx.beginPath();\n  for (const segment of segments) {\n    const {start, end} = segment;\n    const firstPoint = points[start];\n    const lastPoint = points[_findSegmentEnd(start, end, points)];\n    if (first) {\n      ctx.moveTo(firstPoint.x, firstPoint.y);\n      first = false;\n    } else {\n      ctx.lineTo(firstPoint.x, clipY);\n      ctx.lineTo(firstPoint.x, firstPoint.y);\n    }\n    lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n    if (lineLoop) {\n      ctx.closePath();\n    } else {\n      ctx.lineTo(lastPoint.x, clipY);\n    }\n  }\n  ctx.lineTo(target.first().x, clipY);\n  ctx.closePath();\n  ctx.clip();\n}\nfunction fill(ctx, cfg) {\n  const {line, target, property, color, scale} = cfg;\n  const segments = _segments(line, target, property);\n  for (const {source: src, target: tgt, start, end} of segments) {\n    const {style: {backgroundColor = color} = {}} = src;\n    const notShape = target !== true;\n    ctx.save();\n    ctx.fillStyle = backgroundColor;\n    clipBounds(ctx, scale, notShape && _getBounds(property, start, end));\n    ctx.beginPath();\n    const lineLoop = !!line.pathSegment(ctx, src);\n    let loop;\n    if (notShape) {\n      if (lineLoop) {\n        ctx.closePath();\n      } else {\n        interpolatedLineTo(ctx, target, end, property);\n      }\n      const targetLoop = !!target.pathSegment(ctx, tgt, {move: lineLoop, reverse: true});\n      loop = lineLoop && targetLoop;\n      if (!loop) {\n        interpolatedLineTo(ctx, target, start, property);\n      }\n    }\n    ctx.closePath();\n    ctx.fill(loop ? 'evenodd' : 'nonzero');\n    ctx.restore();\n  }\n}\nfunction clipBounds(ctx, scale, bounds) {\n  const {top, bottom} = scale.chart.chartArea;\n  const {property, start, end} = bounds || {};\n  if (property === 'x') {\n    ctx.beginPath();\n    ctx.rect(start, top, end - start, bottom - top);\n    ctx.clip();\n  }\n}\nfunction interpolatedLineTo(ctx, target, point, property) {\n  const interpolatedPoint = target.interpolate(point, property);\n  if (interpolatedPoint) {\n    ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n  }\n}\n\nvar index = {\n  id: 'filler',\n  afterDatasetsUpdate(chart, _args, options) {\n    const count = (chart.data.datasets || []).length;\n    const sources = [];\n    let meta, i, line, source;\n    for (i = 0; i < count; ++i) {\n      meta = chart.getDatasetMeta(i);\n      line = meta.dataset;\n      source = null;\n      if (line && line.options && line instanceof LineElement) {\n        source = {\n          visible: chart.isDatasetVisible(i),\n          index: i,\n          fill: _decodeFill(line, i, count),\n          chart,\n          axis: meta.controller.options.indexAxis,\n          scale: meta.vScale,\n          line,\n        };\n      }\n      meta.$filler = source;\n      sources.push(source);\n    }\n    for (i = 0; i < count; ++i) {\n      source = sources[i];\n      if (!source || source.fill === false) {\n        continue;\n      }\n      source.fill = _resolveTarget(sources, i, options.propagate);\n    }\n  },\n  beforeDraw(chart, _args, options) {\n    const draw = options.drawTime === 'beforeDraw';\n    const metasets = chart.getSortedVisibleDatasetMetas();\n    const area = chart.chartArea;\n    for (let i = metasets.length - 1; i >= 0; --i) {\n      const source = metasets[i].$filler;\n      if (!source) {\n        continue;\n      }\n      source.line.updateControlPoints(area, source.axis);\n      if (draw && source.fill) {\n        _drawfill(chart.ctx, source, area);\n      }\n    }\n  },\n  beforeDatasetsDraw(chart, _args, options) {\n    if (options.drawTime !== 'beforeDatasetsDraw') {\n      return;\n    }\n    const metasets = chart.getSortedVisibleDatasetMetas();\n    for (let i = metasets.length - 1; i >= 0; --i) {\n      const source = metasets[i].$filler;\n      if (_shouldApplyFill(source)) {\n        _drawfill(chart.ctx, source, chart.chartArea);\n      }\n    }\n  },\n  beforeDatasetDraw(chart, args, options) {\n    const source = args.meta.$filler;\n    if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n      return;\n    }\n    _drawfill(chart.ctx, source, chart.chartArea);\n  },\n  defaults: {\n    propagate: true,\n    drawTime: 'beforeDatasetDraw'\n  }\n};\n\nconst getBoxSize = (labelOpts, fontSize) => {\n  let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n  if (labelOpts.usePointStyle) {\n    boxHeight = Math.min(boxHeight, fontSize);\n    boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n  }\n  return {\n    boxWidth,\n    boxHeight,\n    itemHeight: Math.max(fontSize, boxHeight)\n  };\n};\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\nclass Legend extends Element {\n  constructor(config) {\n    super();\n    this._added = false;\n    this.legendHitBoxes = [];\n    this._hoveredItem = null;\n    this.doughnutMode = false;\n    this.chart = config.chart;\n    this.options = config.options;\n    this.ctx = config.ctx;\n    this.legendItems = undefined;\n    this.columnSizes = undefined;\n    this.lineWidths = undefined;\n    this.maxHeight = undefined;\n    this.maxWidth = undefined;\n    this.top = undefined;\n    this.bottom = undefined;\n    this.left = undefined;\n    this.right = undefined;\n    this.height = undefined;\n    this.width = undefined;\n    this._margins = undefined;\n    this.position = undefined;\n    this.weight = undefined;\n    this.fullSize = undefined;\n  }\n  update(maxWidth, maxHeight, margins) {\n    this.maxWidth = maxWidth;\n    this.maxHeight = maxHeight;\n    this._margins = margins;\n    this.setDimensions();\n    this.buildLabels();\n    this.fit();\n  }\n  setDimensions() {\n    if (this.isHorizontal()) {\n      this.width = this.maxWidth;\n      this.left = this._margins.left;\n      this.right = this.width;\n    } else {\n      this.height = this.maxHeight;\n      this.top = this._margins.top;\n      this.bottom = this.height;\n    }\n  }\n  buildLabels() {\n    const labelOpts = this.options.labels || {};\n    let legendItems = callback(labelOpts.generateLabels, [this.chart], this) || [];\n    if (labelOpts.filter) {\n      legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));\n    }\n    if (labelOpts.sort) {\n      legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));\n    }\n    if (this.options.reverse) {\n      legendItems.reverse();\n    }\n    this.legendItems = legendItems;\n  }\n  fit() {\n    const {options, ctx} = this;\n    if (!options.display) {\n      this.width = this.height = 0;\n      return;\n    }\n    const labelOpts = options.labels;\n    const labelFont = toFont(labelOpts.font);\n    const fontSize = labelFont.size;\n    const titleHeight = this._computeTitleHeight();\n    const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n    let width, height;\n    ctx.font = labelFont.string;\n    if (this.isHorizontal()) {\n      width = this.maxWidth;\n      height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n    } else {\n      height = this.maxHeight;\n      width = this._fitCols(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n    }\n    this.width = Math.min(width, options.maxWidth || this.maxWidth);\n    this.height = Math.min(height, options.maxHeight || this.maxHeight);\n  }\n  _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n    const {ctx, maxWidth, options: {labels: {padding}}} = this;\n    const hitboxes = this.legendHitBoxes = [];\n    const lineWidths = this.lineWidths = [0];\n    const lineHeight = itemHeight + padding;\n    let totalHeight = titleHeight;\n    ctx.textAlign = 'left';\n    ctx.textBaseline = 'middle';\n    let row = -1;\n    let top = -lineHeight;\n    this.legendItems.forEach((legendItem, i) => {\n      const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n      if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n        totalHeight += lineHeight;\n        lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n        top += lineHeight;\n        row++;\n      }\n      hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n      lineWidths[lineWidths.length - 1] += itemWidth + padding;\n    });\n    return totalHeight;\n  }\n  _fitCols(titleHeight, fontSize, boxWidth, itemHeight) {\n    const {ctx, maxHeight, options: {labels: {padding}}} = this;\n    const hitboxes = this.legendHitBoxes = [];\n    const columnSizes = this.columnSizes = [];\n    const heightLimit = maxHeight - titleHeight;\n    let totalWidth = padding;\n    let currentColWidth = 0;\n    let currentColHeight = 0;\n    let left = 0;\n    let col = 0;\n    this.legendItems.forEach((legendItem, i) => {\n      const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n      if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n        totalWidth += currentColWidth + padding;\n        columnSizes.push({width: currentColWidth, height: currentColHeight});\n        left += currentColWidth + padding;\n        col++;\n        currentColWidth = currentColHeight = 0;\n      }\n      hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n      currentColWidth = Math.max(currentColWidth, itemWidth);\n      currentColHeight += itemHeight + padding;\n    });\n    totalWidth += currentColWidth;\n    columnSizes.push({width: currentColWidth, height: currentColHeight});\n    return totalWidth;\n  }\n  adjustHitBoxes() {\n    if (!this.options.display) {\n      return;\n    }\n    const titleHeight = this._computeTitleHeight();\n    const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = this;\n    const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n    if (this.isHorizontal()) {\n      let row = 0;\n      let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n      for (const hitbox of hitboxes) {\n        if (row !== hitbox.row) {\n          row = hitbox.row;\n          left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n        }\n        hitbox.top += this.top + titleHeight + padding;\n        hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n        left += hitbox.width + padding;\n      }\n    } else {\n      let col = 0;\n      let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n      for (const hitbox of hitboxes) {\n        if (hitbox.col !== col) {\n          col = hitbox.col;\n          top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n        }\n        hitbox.top = top;\n        hitbox.left += this.left + padding;\n        hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n        top += hitbox.height + padding;\n      }\n    }\n  }\n  isHorizontal() {\n    return this.options.position === 'top' || this.options.position === 'bottom';\n  }\n  draw() {\n    if (this.options.display) {\n      const ctx = this.ctx;\n      clipArea(ctx, this);\n      this._draw();\n      unclipArea(ctx);\n    }\n  }\n  _draw() {\n    const {options: opts, columnSizes, lineWidths, ctx} = this;\n    const {align, labels: labelOpts} = opts;\n    const defaultColor = defaults.color;\n    const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n    const labelFont = toFont(labelOpts.font);\n    const {color: fontColor, padding} = labelOpts;\n    const fontSize = labelFont.size;\n    const halfFontSize = fontSize / 2;\n    let cursor;\n    this.drawTitle();\n    ctx.textAlign = rtlHelper.textAlign('left');\n    ctx.textBaseline = 'middle';\n    ctx.lineWidth = 0.5;\n    ctx.font = labelFont.string;\n    const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n    const drawLegendBox = function(x, y, legendItem) {\n      if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n        return;\n      }\n      ctx.save();\n      const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n      ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n      ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n      ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n      ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n      ctx.lineWidth = lineWidth;\n      ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n      ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n      if (labelOpts.usePointStyle) {\n        const drawOptions = {\n          radius: boxHeight * Math.SQRT2 / 2,\n          pointStyle: legendItem.pointStyle,\n          rotation: legendItem.rotation,\n          borderWidth: lineWidth\n        };\n        const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n        const centerY = y + halfFontSize;\n        drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n      } else {\n        const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n        const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n        const borderRadius = toTRBLCorners(legendItem.borderRadius);\n        ctx.beginPath();\n        if (Object.values(borderRadius).some(v => v !== 0)) {\n          addRoundedRectPath(ctx, {\n            x: xBoxLeft,\n            y: yBoxTop,\n            w: boxWidth,\n            h: boxHeight,\n            radius: borderRadius,\n          });\n        } else {\n          ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n        }\n        ctx.fill();\n        if (lineWidth !== 0) {\n          ctx.stroke();\n        }\n      }\n      ctx.restore();\n    };\n    const fillText = function(x, y, legendItem) {\n      renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n        strikethrough: legendItem.hidden,\n        textAlign: rtlHelper.textAlign(legendItem.textAlign)\n      });\n    };\n    const isHorizontal = this.isHorizontal();\n    const titleHeight = this._computeTitleHeight();\n    if (isHorizontal) {\n      cursor = {\n        x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n        y: this.top + padding + titleHeight,\n        line: 0\n      };\n    } else {\n      cursor = {\n        x: this.left + padding,\n        y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n        line: 0\n      };\n    }\n    overrideTextDirection(this.ctx, opts.textDirection);\n    const lineHeight = itemHeight + padding;\n    this.legendItems.forEach((legendItem, i) => {\n      ctx.strokeStyle = legendItem.fontColor || fontColor;\n      ctx.fillStyle = legendItem.fontColor || fontColor;\n      const textWidth = ctx.measureText(legendItem.text).width;\n      const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n      const width = boxWidth + halfFontSize + textWidth;\n      let x = cursor.x;\n      let y = cursor.y;\n      rtlHelper.setWidth(this.width);\n      if (isHorizontal) {\n        if (i > 0 && x + width + padding > this.right) {\n          y = cursor.y += lineHeight;\n          cursor.line++;\n          x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n        }\n      } else if (i > 0 && y + lineHeight > this.bottom) {\n        x = cursor.x = x + columnSizes[cursor.line].width + padding;\n        cursor.line++;\n        y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n      }\n      const realX = rtlHelper.x(x);\n      drawLegendBox(realX, y, legendItem);\n      x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n      fillText(rtlHelper.x(x), y, legendItem);\n      if (isHorizontal) {\n        cursor.x += width + padding;\n      } else {\n        cursor.y += lineHeight;\n      }\n    });\n    restoreTextDirection(this.ctx, opts.textDirection);\n  }\n  drawTitle() {\n    const opts = this.options;\n    const titleOpts = opts.title;\n    const titleFont = toFont(titleOpts.font);\n    const titlePadding = toPadding(titleOpts.padding);\n    if (!titleOpts.display) {\n      return;\n    }\n    const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n    const ctx = this.ctx;\n    const position = titleOpts.position;\n    const halfFontSize = titleFont.size / 2;\n    const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n    let y;\n    let left = this.left;\n    let maxWidth = this.width;\n    if (this.isHorizontal()) {\n      maxWidth = Math.max(...this.lineWidths);\n      y = this.top + topPaddingPlusHalfFontSize;\n      left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n    } else {\n      const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n      y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n    }\n    const x = _alignStartEnd(position, left, left + maxWidth);\n    ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n    ctx.textBaseline = 'middle';\n    ctx.strokeStyle = titleOpts.color;\n    ctx.fillStyle = titleOpts.color;\n    ctx.font = titleFont.string;\n    renderText(ctx, titleOpts.text, x, y, titleFont);\n  }\n  _computeTitleHeight() {\n    const titleOpts = this.options.title;\n    const titleFont = toFont(titleOpts.font);\n    const titlePadding = toPadding(titleOpts.padding);\n    return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n  }\n  _getLegendItemAt(x, y) {\n    let i, hitBox, lh;\n    if (_isBetween(x, this.left, this.right)\n      && _isBetween(y, this.top, this.bottom)) {\n      lh = this.legendHitBoxes;\n      for (i = 0; i < lh.length; ++i) {\n        hitBox = lh[i];\n        if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width)\n          && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n          return this.legendItems[i];\n        }\n      }\n    }\n    return null;\n  }\n  handleEvent(e) {\n    const opts = this.options;\n    if (!isListened(e.type, opts)) {\n      return;\n    }\n    const hoveredItem = this._getLegendItemAt(e.x, e.y);\n    if (e.type === 'mousemove' || e.type === 'mouseout') {\n      const previous = this._hoveredItem;\n      const sameItem = itemsEqual(previous, hoveredItem);\n      if (previous && !sameItem) {\n        callback(opts.onLeave, [e, previous, this], this);\n      }\n      this._hoveredItem = hoveredItem;\n      if (hoveredItem && !sameItem) {\n        callback(opts.onHover, [e, hoveredItem, this], this);\n      }\n    } else if (hoveredItem) {\n      callback(opts.onClick, [e, hoveredItem, this], this);\n    }\n  }\n}\nfunction isListened(type, opts) {\n  if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n    return true;\n  }\n  if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n    return true;\n  }\n  return false;\n}\nvar plugin_legend = {\n  id: 'legend',\n  _element: Legend,\n  start(chart, _args, options) {\n    const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n    layouts.configure(chart, legend, options);\n    layouts.addBox(chart, legend);\n  },\n  stop(chart) {\n    layouts.removeBox(chart, chart.legend);\n    delete chart.legend;\n  },\n  beforeUpdate(chart, _args, options) {\n    const legend = chart.legend;\n    layouts.configure(chart, legend, options);\n    legend.options = options;\n  },\n  afterUpdate(chart) {\n    const legend = chart.legend;\n    legend.buildLabels();\n    legend.adjustHitBoxes();\n  },\n  afterEvent(chart, args) {\n    if (!args.replay) {\n      chart.legend.handleEvent(args.event);\n    }\n  },\n  defaults: {\n    display: true,\n    position: 'top',\n    align: 'center',\n    fullSize: true,\n    reverse: false,\n    weight: 1000,\n    onClick(e, legendItem, legend) {\n      const index = legendItem.datasetIndex;\n      const ci = legend.chart;\n      if (ci.isDatasetVisible(index)) {\n        ci.hide(index);\n        legendItem.hidden = true;\n      } else {\n        ci.show(index);\n        legendItem.hidden = false;\n      }\n    },\n    onHover: null,\n    onLeave: null,\n    labels: {\n      color: (ctx) => ctx.chart.options.color,\n      boxWidth: 40,\n      padding: 10,\n      generateLabels(chart) {\n        const datasets = chart.data.datasets;\n        const {labels: {usePointStyle, pointStyle, textAlign, color}} = chart.legend.options;\n        return chart._getSortedDatasetMetas().map((meta) => {\n          const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n          const borderWidth = toPadding(style.borderWidth);\n          return {\n            text: datasets[meta.index].label,\n            fillStyle: style.backgroundColor,\n            fontColor: color,\n            hidden: !meta.visible,\n            lineCap: style.borderCapStyle,\n            lineDash: style.borderDash,\n            lineDashOffset: style.borderDashOffset,\n            lineJoin: style.borderJoinStyle,\n            lineWidth: (borderWidth.width + borderWidth.height) / 4,\n            strokeStyle: style.borderColor,\n            pointStyle: pointStyle || style.pointStyle,\n            rotation: style.rotation,\n            textAlign: textAlign || style.textAlign,\n            borderRadius: 0,\n            datasetIndex: meta.index\n          };\n        }, this);\n      }\n    },\n    title: {\n      color: (ctx) => ctx.chart.options.color,\n      display: false,\n      position: 'center',\n      text: '',\n    }\n  },\n  descriptors: {\n    _scriptable: (name) => !name.startsWith('on'),\n    labels: {\n      _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n    }\n  },\n};\n\nclass Title extends Element {\n  constructor(config) {\n    super();\n    this.chart = config.chart;\n    this.options = config.options;\n    this.ctx = config.ctx;\n    this._padding = undefined;\n    this.top = undefined;\n    this.bottom = undefined;\n    this.left = undefined;\n    this.right = undefined;\n    this.width = undefined;\n    this.height = undefined;\n    this.position = undefined;\n    this.weight = undefined;\n    this.fullSize = undefined;\n  }\n  update(maxWidth, maxHeight) {\n    const opts = this.options;\n    this.left = 0;\n    this.top = 0;\n    if (!opts.display) {\n      this.width = this.height = this.right = this.bottom = 0;\n      return;\n    }\n    this.width = this.right = maxWidth;\n    this.height = this.bottom = maxHeight;\n    const lineCount = isArray(opts.text) ? opts.text.length : 1;\n    this._padding = toPadding(opts.padding);\n    const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height;\n    if (this.isHorizontal()) {\n      this.height = textSize;\n    } else {\n      this.width = textSize;\n    }\n  }\n  isHorizontal() {\n    const pos = this.options.position;\n    return pos === 'top' || pos === 'bottom';\n  }\n  _drawArgs(offset) {\n    const {top, left, bottom, right, options} = this;\n    const align = options.align;\n    let rotation = 0;\n    let maxWidth, titleX, titleY;\n    if (this.isHorizontal()) {\n      titleX = _alignStartEnd(align, left, right);\n      titleY = top + offset;\n      maxWidth = right - left;\n    } else {\n      if (options.position === 'left') {\n        titleX = left + offset;\n        titleY = _alignStartEnd(align, bottom, top);\n        rotation = PI * -0.5;\n      } else {\n        titleX = right - offset;\n        titleY = _alignStartEnd(align, top, bottom);\n        rotation = PI * 0.5;\n      }\n      maxWidth = bottom - top;\n    }\n    return {titleX, titleY, maxWidth, rotation};\n  }\n  draw() {\n    const ctx = this.ctx;\n    const opts = this.options;\n    if (!opts.display) {\n      return;\n    }\n    const fontOpts = toFont(opts.font);\n    const lineHeight = fontOpts.lineHeight;\n    const offset = lineHeight / 2 + this._padding.top;\n    const {titleX, titleY, maxWidth, rotation} = this._drawArgs(offset);\n    renderText(ctx, opts.text, 0, 0, fontOpts, {\n      color: opts.color,\n      maxWidth,\n      rotation,\n      textAlign: _toLeftRightCenter(opts.align),\n      textBaseline: 'middle',\n      translation: [titleX, titleY],\n    });\n  }\n}\nfunction createTitle(chart, titleOpts) {\n  const title = new Title({\n    ctx: chart.ctx,\n    options: titleOpts,\n    chart\n  });\n  layouts.configure(chart, title, titleOpts);\n  layouts.addBox(chart, title);\n  chart.titleBlock = title;\n}\nvar plugin_title = {\n  id: 'title',\n  _element: Title,\n  start(chart, _args, options) {\n    createTitle(chart, options);\n  },\n  stop(chart) {\n    const titleBlock = chart.titleBlock;\n    layouts.removeBox(chart, titleBlock);\n    delete chart.titleBlock;\n  },\n  beforeUpdate(chart, _args, options) {\n    const title = chart.titleBlock;\n    layouts.configure(chart, title, options);\n    title.options = options;\n  },\n  defaults: {\n    align: 'center',\n    display: false,\n    font: {\n      weight: 'bold',\n    },\n    fullSize: true,\n    padding: 10,\n    position: 'top',\n    text: '',\n    weight: 2000\n  },\n  defaultRoutes: {\n    color: 'color'\n  },\n  descriptors: {\n    _scriptable: true,\n    _indexable: false,\n  },\n};\n\nconst map = new WeakMap();\nvar plugin_subtitle = {\n  id: 'subtitle',\n  start(chart, _args, options) {\n    const title = new Title({\n      ctx: chart.ctx,\n      options,\n      chart\n    });\n    layouts.configure(chart, title, options);\n    layouts.addBox(chart, title);\n    map.set(chart, title);\n  },\n  stop(chart) {\n    layouts.removeBox(chart, map.get(chart));\n    map.delete(chart);\n  },\n  beforeUpdate(chart, _args, options) {\n    const title = map.get(chart);\n    layouts.configure(chart, title, options);\n    title.options = options;\n  },\n  defaults: {\n    align: 'center',\n    display: false,\n    font: {\n      weight: 'normal',\n    },\n    fullSize: true,\n    padding: 0,\n    position: 'top',\n    text: '',\n    weight: 1500\n  },\n  defaultRoutes: {\n    color: 'color'\n  },\n  descriptors: {\n    _scriptable: true,\n    _indexable: false,\n  },\n};\n\nconst positioners = {\n  average(items) {\n    if (!items.length) {\n      return false;\n    }\n    let i, len;\n    let x = 0;\n    let y = 0;\n    let count = 0;\n    for (i = 0, len = items.length; i < len; ++i) {\n      const el = items[i].element;\n      if (el && el.hasValue()) {\n        const pos = el.tooltipPosition();\n        x += pos.x;\n        y += pos.y;\n        ++count;\n      }\n    }\n    return {\n      x: x / count,\n      y: y / count\n    };\n  },\n  nearest(items, eventPosition) {\n    if (!items.length) {\n      return false;\n    }\n    let x = eventPosition.x;\n    let y = eventPosition.y;\n    let minDistance = Number.POSITIVE_INFINITY;\n    let i, len, nearestElement;\n    for (i = 0, len = items.length; i < len; ++i) {\n      const el = items[i].element;\n      if (el && el.hasValue()) {\n        const center = el.getCenterPoint();\n        const d = distanceBetweenPoints(eventPosition, center);\n        if (d < minDistance) {\n          minDistance = d;\n          nearestElement = el;\n        }\n      }\n    }\n    if (nearestElement) {\n      const tp = nearestElement.tooltipPosition();\n      x = tp.x;\n      y = tp.y;\n    }\n    return {\n      x,\n      y\n    };\n  }\n};\nfunction pushOrConcat(base, toPush) {\n  if (toPush) {\n    if (isArray(toPush)) {\n      Array.prototype.push.apply(base, toPush);\n    } else {\n      base.push(toPush);\n    }\n  }\n  return base;\n}\nfunction splitNewlines(str) {\n  if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n    return str.split('\\n');\n  }\n  return str;\n}\nfunction createTooltipItem(chart, item) {\n  const {element, datasetIndex, index} = item;\n  const controller = chart.getDatasetMeta(datasetIndex).controller;\n  const {label, value} = controller.getLabelAndValue(index);\n  return {\n    chart,\n    label,\n    parsed: controller.getParsed(index),\n    raw: chart.data.datasets[datasetIndex].data[index],\n    formattedValue: value,\n    dataset: controller.getDataset(),\n    dataIndex: index,\n    datasetIndex,\n    element\n  };\n}\nfunction getTooltipSize(tooltip, options) {\n  const ctx = tooltip.chart.ctx;\n  const {body, footer, title} = tooltip;\n  const {boxWidth, boxHeight} = options;\n  const bodyFont = toFont(options.bodyFont);\n  const titleFont = toFont(options.titleFont);\n  const footerFont = toFont(options.footerFont);\n  const titleLineCount = title.length;\n  const footerLineCount = footer.length;\n  const bodyLineItemCount = body.length;\n  const padding = toPadding(options.padding);\n  let height = padding.height;\n  let width = 0;\n  let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n  combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n  if (titleLineCount) {\n    height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n  }\n  if (combinedBodyLength) {\n    const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n    height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n  }\n  if (footerLineCount) {\n    height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n  }\n  let widthPadding = 0;\n  const maxLineWidth = function(line) {\n    width = Math.max(width, ctx.measureText(line).width + widthPadding);\n  };\n  ctx.save();\n  ctx.font = titleFont.string;\n  each(tooltip.title, maxLineWidth);\n  ctx.font = bodyFont.string;\n  each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n  widthPadding = options.displayColors ? (boxWidth + 2 + options.boxPadding) : 0;\n  each(body, (bodyItem) => {\n    each(bodyItem.before, maxLineWidth);\n    each(bodyItem.lines, maxLineWidth);\n    each(bodyItem.after, maxLineWidth);\n  });\n  widthPadding = 0;\n  ctx.font = footerFont.string;\n  each(tooltip.footer, maxLineWidth);\n  ctx.restore();\n  width += padding.width;\n  return {width, height};\n}\nfunction determineYAlign(chart, size) {\n  const {y, height} = size;\n  if (y < height / 2) {\n    return 'top';\n  } else if (y > (chart.height - height / 2)) {\n    return 'bottom';\n  }\n  return 'center';\n}\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n  const {x, width} = size;\n  const caret = options.caretSize + options.caretPadding;\n  if (xAlign === 'left' && x + width + caret > chart.width) {\n    return true;\n  }\n  if (xAlign === 'right' && x - width - caret < 0) {\n    return true;\n  }\n}\nfunction determineXAlign(chart, options, size, yAlign) {\n  const {x, width} = size;\n  const {width: chartWidth, chartArea: {left, right}} = chart;\n  let xAlign = 'center';\n  if (yAlign === 'center') {\n    xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n  } else if (x <= width / 2) {\n    xAlign = 'left';\n  } else if (x >= chartWidth - width / 2) {\n    xAlign = 'right';\n  }\n  if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n    xAlign = 'center';\n  }\n  return xAlign;\n}\nfunction determineAlignment(chart, options, size) {\n  const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n  return {\n    xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n    yAlign\n  };\n}\nfunction alignX(size, xAlign) {\n  let {x, width} = size;\n  if (xAlign === 'right') {\n    x -= width;\n  } else if (xAlign === 'center') {\n    x -= (width / 2);\n  }\n  return x;\n}\nfunction alignY(size, yAlign, paddingAndSize) {\n  let {y, height} = size;\n  if (yAlign === 'top') {\n    y += paddingAndSize;\n  } else if (yAlign === 'bottom') {\n    y -= height + paddingAndSize;\n  } else {\n    y -= (height / 2);\n  }\n  return y;\n}\nfunction getBackgroundPoint(options, size, alignment, chart) {\n  const {caretSize, caretPadding, cornerRadius} = options;\n  const {xAlign, yAlign} = alignment;\n  const paddingAndSize = caretSize + caretPadding;\n  const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n  let x = alignX(size, xAlign);\n  const y = alignY(size, yAlign, paddingAndSize);\n  if (yAlign === 'center') {\n    if (xAlign === 'left') {\n      x += paddingAndSize;\n    } else if (xAlign === 'right') {\n      x -= paddingAndSize;\n    }\n  } else if (xAlign === 'left') {\n    x -= Math.max(topLeft, bottomLeft) + caretSize;\n  } else if (xAlign === 'right') {\n    x += Math.max(topRight, bottomRight) + caretSize;\n  }\n  return {\n    x: _limitValue(x, 0, chart.width - size.width),\n    y: _limitValue(y, 0, chart.height - size.height)\n  };\n}\nfunction getAlignedX(tooltip, align, options) {\n  const padding = toPadding(options.padding);\n  return align === 'center'\n    ? tooltip.x + tooltip.width / 2\n    : align === 'right'\n      ? tooltip.x + tooltip.width - padding.right\n      : tooltip.x + padding.left;\n}\nfunction getBeforeAfterBodyLines(callback) {\n  return pushOrConcat([], splitNewlines(callback));\n}\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n  return createContext(parent, {\n    tooltip,\n    tooltipItems,\n    type: 'tooltip'\n  });\n}\nfunction overrideCallbacks(callbacks, context) {\n  const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n  return override ? callbacks.override(override) : callbacks;\n}\nclass Tooltip extends Element {\n  constructor(config) {\n    super();\n    this.opacity = 0;\n    this._active = [];\n    this._eventPosition = undefined;\n    this._size = undefined;\n    this._cachedAnimations = undefined;\n    this._tooltipItems = [];\n    this.$animations = undefined;\n    this.$context = undefined;\n    this.chart = config.chart || config._chart;\n    this._chart = this.chart;\n    this.options = config.options;\n    this.dataPoints = undefined;\n    this.title = undefined;\n    this.beforeBody = undefined;\n    this.body = undefined;\n    this.afterBody = undefined;\n    this.footer = undefined;\n    this.xAlign = undefined;\n    this.yAlign = undefined;\n    this.x = undefined;\n    this.y = undefined;\n    this.height = undefined;\n    this.width = undefined;\n    this.caretX = undefined;\n    this.caretY = undefined;\n    this.labelColors = undefined;\n    this.labelPointStyles = undefined;\n    this.labelTextColors = undefined;\n  }\n  initialize(options) {\n    this.options = options;\n    this._cachedAnimations = undefined;\n    this.$context = undefined;\n  }\n  _resolveAnimations() {\n    const cached = this._cachedAnimations;\n    if (cached) {\n      return cached;\n    }\n    const chart = this.chart;\n    const options = this.options.setContext(this.getContext());\n    const opts = options.enabled && chart.options.animation && options.animations;\n    const animations = new Animations(this.chart, opts);\n    if (opts._cacheable) {\n      this._cachedAnimations = Object.freeze(animations);\n    }\n    return animations;\n  }\n  getContext() {\n    return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n  }\n  getTitle(context, options) {\n    const {callbacks} = options;\n    const beforeTitle = callbacks.beforeTitle.apply(this, [context]);\n    const title = callbacks.title.apply(this, [context]);\n    const afterTitle = callbacks.afterTitle.apply(this, [context]);\n    let lines = [];\n    lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n    lines = pushOrConcat(lines, splitNewlines(title));\n    lines = pushOrConcat(lines, splitNewlines(afterTitle));\n    return lines;\n  }\n  getBeforeBody(tooltipItems, options) {\n    return getBeforeAfterBodyLines(options.callbacks.beforeBody.apply(this, [tooltipItems]));\n  }\n  getBody(tooltipItems, options) {\n    const {callbacks} = options;\n    const bodyItems = [];\n    each(tooltipItems, (context) => {\n      const bodyItem = {\n        before: [],\n        lines: [],\n        after: []\n      };\n      const scoped = overrideCallbacks(callbacks, context);\n      pushOrConcat(bodyItem.before, splitNewlines(scoped.beforeLabel.call(this, context)));\n      pushOrConcat(bodyItem.lines, scoped.label.call(this, context));\n      pushOrConcat(bodyItem.after, splitNewlines(scoped.afterLabel.call(this, context)));\n      bodyItems.push(bodyItem);\n    });\n    return bodyItems;\n  }\n  getAfterBody(tooltipItems, options) {\n    return getBeforeAfterBodyLines(options.callbacks.afterBody.apply(this, [tooltipItems]));\n  }\n  getFooter(tooltipItems, options) {\n    const {callbacks} = options;\n    const beforeFooter = callbacks.beforeFooter.apply(this, [tooltipItems]);\n    const footer = callbacks.footer.apply(this, [tooltipItems]);\n    const afterFooter = callbacks.afterFooter.apply(this, [tooltipItems]);\n    let lines = [];\n    lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n    lines = pushOrConcat(lines, splitNewlines(footer));\n    lines = pushOrConcat(lines, splitNewlines(afterFooter));\n    return lines;\n  }\n  _createItems(options) {\n    const active = this._active;\n    const data = this.chart.data;\n    const labelColors = [];\n    const labelPointStyles = [];\n    const labelTextColors = [];\n    let tooltipItems = [];\n    let i, len;\n    for (i = 0, len = active.length; i < len; ++i) {\n      tooltipItems.push(createTooltipItem(this.chart, active[i]));\n    }\n    if (options.filter) {\n      tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n    }\n    if (options.itemSort) {\n      tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n    }\n    each(tooltipItems, (context) => {\n      const scoped = overrideCallbacks(options.callbacks, context);\n      labelColors.push(scoped.labelColor.call(this, context));\n      labelPointStyles.push(scoped.labelPointStyle.call(this, context));\n      labelTextColors.push(scoped.labelTextColor.call(this, context));\n    });\n    this.labelColors = labelColors;\n    this.labelPointStyles = labelPointStyles;\n    this.labelTextColors = labelTextColors;\n    this.dataPoints = tooltipItems;\n    return tooltipItems;\n  }\n  update(changed, replay) {\n    const options = this.options.setContext(this.getContext());\n    const active = this._active;\n    let properties;\n    let tooltipItems = [];\n    if (!active.length) {\n      if (this.opacity !== 0) {\n        properties = {\n          opacity: 0\n        };\n      }\n    } else {\n      const position = positioners[options.position].call(this, active, this._eventPosition);\n      tooltipItems = this._createItems(options);\n      this.title = this.getTitle(tooltipItems, options);\n      this.beforeBody = this.getBeforeBody(tooltipItems, options);\n      this.body = this.getBody(tooltipItems, options);\n      this.afterBody = this.getAfterBody(tooltipItems, options);\n      this.footer = this.getFooter(tooltipItems, options);\n      const size = this._size = getTooltipSize(this, options);\n      const positionAndSize = Object.assign({}, position, size);\n      const alignment = determineAlignment(this.chart, options, positionAndSize);\n      const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n      this.xAlign = alignment.xAlign;\n      this.yAlign = alignment.yAlign;\n      properties = {\n        opacity: 1,\n        x: backgroundPoint.x,\n        y: backgroundPoint.y,\n        width: size.width,\n        height: size.height,\n        caretX: position.x,\n        caretY: position.y\n      };\n    }\n    this._tooltipItems = tooltipItems;\n    this.$context = undefined;\n    if (properties) {\n      this._resolveAnimations().update(this, properties);\n    }\n    if (changed && options.external) {\n      options.external.call(this, {chart: this.chart, tooltip: this, replay});\n    }\n  }\n  drawCaret(tooltipPoint, ctx, size, options) {\n    const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n    ctx.lineTo(caretPosition.x1, caretPosition.y1);\n    ctx.lineTo(caretPosition.x2, caretPosition.y2);\n    ctx.lineTo(caretPosition.x3, caretPosition.y3);\n  }\n  getCaretPosition(tooltipPoint, size, options) {\n    const {xAlign, yAlign} = this;\n    const {caretSize, cornerRadius} = options;\n    const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n    const {x: ptX, y: ptY} = tooltipPoint;\n    const {width, height} = size;\n    let x1, x2, x3, y1, y2, y3;\n    if (yAlign === 'center') {\n      y2 = ptY + (height / 2);\n      if (xAlign === 'left') {\n        x1 = ptX;\n        x2 = x1 - caretSize;\n        y1 = y2 + caretSize;\n        y3 = y2 - caretSize;\n      } else {\n        x1 = ptX + width;\n        x2 = x1 + caretSize;\n        y1 = y2 - caretSize;\n        y3 = y2 + caretSize;\n      }\n      x3 = x1;\n    } else {\n      if (xAlign === 'left') {\n        x2 = ptX + Math.max(topLeft, bottomLeft) + (caretSize);\n      } else if (xAlign === 'right') {\n        x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n      } else {\n        x2 = this.caretX;\n      }\n      if (yAlign === 'top') {\n        y1 = ptY;\n        y2 = y1 - caretSize;\n        x1 = x2 - caretSize;\n        x3 = x2 + caretSize;\n      } else {\n        y1 = ptY + height;\n        y2 = y1 + caretSize;\n        x1 = x2 + caretSize;\n        x3 = x2 - caretSize;\n      }\n      y3 = y1;\n    }\n    return {x1, x2, x3, y1, y2, y3};\n  }\n  drawTitle(pt, ctx, options) {\n    const title = this.title;\n    const length = title.length;\n    let titleFont, titleSpacing, i;\n    if (length) {\n      const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n      pt.x = getAlignedX(this, options.titleAlign, options);\n      ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n      ctx.textBaseline = 'middle';\n      titleFont = toFont(options.titleFont);\n      titleSpacing = options.titleSpacing;\n      ctx.fillStyle = options.titleColor;\n      ctx.font = titleFont.string;\n      for (i = 0; i < length; ++i) {\n        ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n        pt.y += titleFont.lineHeight + titleSpacing;\n        if (i + 1 === length) {\n          pt.y += options.titleMarginBottom - titleSpacing;\n        }\n      }\n    }\n  }\n  _drawColorBox(ctx, pt, i, rtlHelper, options) {\n    const labelColors = this.labelColors[i];\n    const labelPointStyle = this.labelPointStyles[i];\n    const {boxHeight, boxWidth, boxPadding} = options;\n    const bodyFont = toFont(options.bodyFont);\n    const colorX = getAlignedX(this, 'left', options);\n    const rtlColorX = rtlHelper.x(colorX);\n    const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n    const colorY = pt.y + yOffSet;\n    if (options.usePointStyle) {\n      const drawOptions = {\n        radius: Math.min(boxWidth, boxHeight) / 2,\n        pointStyle: labelPointStyle.pointStyle,\n        rotation: labelPointStyle.rotation,\n        borderWidth: 1\n      };\n      const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n      const centerY = colorY + boxHeight / 2;\n      ctx.strokeStyle = options.multiKeyBackground;\n      ctx.fillStyle = options.multiKeyBackground;\n      drawPoint(ctx, drawOptions, centerX, centerY);\n      ctx.strokeStyle = labelColors.borderColor;\n      ctx.fillStyle = labelColors.backgroundColor;\n      drawPoint(ctx, drawOptions, centerX, centerY);\n    } else {\n      ctx.lineWidth = isObject(labelColors.borderWidth) ? Math.max(...Object.values(labelColors.borderWidth)) : (labelColors.borderWidth || 1);\n      ctx.strokeStyle = labelColors.borderColor;\n      ctx.setLineDash(labelColors.borderDash || []);\n      ctx.lineDashOffset = labelColors.borderDashOffset || 0;\n      const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth - boxPadding);\n      const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - boxPadding - 2);\n      const borderRadius = toTRBLCorners(labelColors.borderRadius);\n      if (Object.values(borderRadius).some(v => v !== 0)) {\n        ctx.beginPath();\n        ctx.fillStyle = options.multiKeyBackground;\n        addRoundedRectPath(ctx, {\n          x: outerX,\n          y: colorY,\n          w: boxWidth,\n          h: boxHeight,\n          radius: borderRadius,\n        });\n        ctx.fill();\n        ctx.stroke();\n        ctx.fillStyle = labelColors.backgroundColor;\n        ctx.beginPath();\n        addRoundedRectPath(ctx, {\n          x: innerX,\n          y: colorY + 1,\n          w: boxWidth - 2,\n          h: boxHeight - 2,\n          radius: borderRadius,\n        });\n        ctx.fill();\n      } else {\n        ctx.fillStyle = options.multiKeyBackground;\n        ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n        ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n        ctx.fillStyle = labelColors.backgroundColor;\n        ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n      }\n    }\n    ctx.fillStyle = this.labelTextColors[i];\n  }\n  drawBody(pt, ctx, options) {\n    const {body} = this;\n    const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n    const bodyFont = toFont(options.bodyFont);\n    let bodyLineHeight = bodyFont.lineHeight;\n    let xLinePadding = 0;\n    const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n    const fillLineOfText = function(line) {\n      ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n      pt.y += bodyLineHeight + bodySpacing;\n    };\n    const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n    let bodyItem, textColor, lines, i, j, ilen, jlen;\n    ctx.textAlign = bodyAlign;\n    ctx.textBaseline = 'middle';\n    ctx.font = bodyFont.string;\n    pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n    ctx.fillStyle = options.bodyColor;\n    each(this.beforeBody, fillLineOfText);\n    xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n      ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n      : 0;\n    for (i = 0, ilen = body.length; i < ilen; ++i) {\n      bodyItem = body[i];\n      textColor = this.labelTextColors[i];\n      ctx.fillStyle = textColor;\n      each(bodyItem.before, fillLineOfText);\n      lines = bodyItem.lines;\n      if (displayColors && lines.length) {\n        this._drawColorBox(ctx, pt, i, rtlHelper, options);\n        bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n      }\n      for (j = 0, jlen = lines.length; j < jlen; ++j) {\n        fillLineOfText(lines[j]);\n        bodyLineHeight = bodyFont.lineHeight;\n      }\n      each(bodyItem.after, fillLineOfText);\n    }\n    xLinePadding = 0;\n    bodyLineHeight = bodyFont.lineHeight;\n    each(this.afterBody, fillLineOfText);\n    pt.y -= bodySpacing;\n  }\n  drawFooter(pt, ctx, options) {\n    const footer = this.footer;\n    const length = footer.length;\n    let footerFont, i;\n    if (length) {\n      const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n      pt.x = getAlignedX(this, options.footerAlign, options);\n      pt.y += options.footerMarginTop;\n      ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n      ctx.textBaseline = 'middle';\n      footerFont = toFont(options.footerFont);\n      ctx.fillStyle = options.footerColor;\n      ctx.font = footerFont.string;\n      for (i = 0; i < length; ++i) {\n        ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n        pt.y += footerFont.lineHeight + options.footerSpacing;\n      }\n    }\n  }\n  drawBackground(pt, ctx, tooltipSize, options) {\n    const {xAlign, yAlign} = this;\n    const {x, y} = pt;\n    const {width, height} = tooltipSize;\n    const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n    ctx.fillStyle = options.backgroundColor;\n    ctx.strokeStyle = options.borderColor;\n    ctx.lineWidth = options.borderWidth;\n    ctx.beginPath();\n    ctx.moveTo(x + topLeft, y);\n    if (yAlign === 'top') {\n      this.drawCaret(pt, ctx, tooltipSize, options);\n    }\n    ctx.lineTo(x + width - topRight, y);\n    ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n    if (yAlign === 'center' && xAlign === 'right') {\n      this.drawCaret(pt, ctx, tooltipSize, options);\n    }\n    ctx.lineTo(x + width, y + height - bottomRight);\n    ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n    if (yAlign === 'bottom') {\n      this.drawCaret(pt, ctx, tooltipSize, options);\n    }\n    ctx.lineTo(x + bottomLeft, y + height);\n    ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n    if (yAlign === 'center' && xAlign === 'left') {\n      this.drawCaret(pt, ctx, tooltipSize, options);\n    }\n    ctx.lineTo(x, y + topLeft);\n    ctx.quadraticCurveTo(x, y, x + topLeft, y);\n    ctx.closePath();\n    ctx.fill();\n    if (options.borderWidth > 0) {\n      ctx.stroke();\n    }\n  }\n  _updateAnimationTarget(options) {\n    const chart = this.chart;\n    const anims = this.$animations;\n    const animX = anims && anims.x;\n    const animY = anims && anims.y;\n    if (animX || animY) {\n      const position = positioners[options.position].call(this, this._active, this._eventPosition);\n      if (!position) {\n        return;\n      }\n      const size = this._size = getTooltipSize(this, options);\n      const positionAndSize = Object.assign({}, position, this._size);\n      const alignment = determineAlignment(chart, options, positionAndSize);\n      const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n      if (animX._to !== point.x || animY._to !== point.y) {\n        this.xAlign = alignment.xAlign;\n        this.yAlign = alignment.yAlign;\n        this.width = size.width;\n        this.height = size.height;\n        this.caretX = position.x;\n        this.caretY = position.y;\n        this._resolveAnimations().update(this, point);\n      }\n    }\n  }\n  _willRender() {\n    return !!this.opacity;\n  }\n  draw(ctx) {\n    const options = this.options.setContext(this.getContext());\n    let opacity = this.opacity;\n    if (!opacity) {\n      return;\n    }\n    this._updateAnimationTarget(options);\n    const tooltipSize = {\n      width: this.width,\n      height: this.height\n    };\n    const pt = {\n      x: this.x,\n      y: this.y\n    };\n    opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n    const padding = toPadding(options.padding);\n    const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n    if (options.enabled && hasTooltipContent) {\n      ctx.save();\n      ctx.globalAlpha = opacity;\n      this.drawBackground(pt, ctx, tooltipSize, options);\n      overrideTextDirection(ctx, options.textDirection);\n      pt.y += padding.top;\n      this.drawTitle(pt, ctx, options);\n      this.drawBody(pt, ctx, options);\n      this.drawFooter(pt, ctx, options);\n      restoreTextDirection(ctx, options.textDirection);\n      ctx.restore();\n    }\n  }\n  getActiveElements() {\n    return this._active || [];\n  }\n  setActiveElements(activeElements, eventPosition) {\n    const lastActive = this._active;\n    const active = activeElements.map(({datasetIndex, index}) => {\n      const meta = this.chart.getDatasetMeta(datasetIndex);\n      if (!meta) {\n        throw new Error('Cannot find a dataset at index ' + datasetIndex);\n      }\n      return {\n        datasetIndex,\n        element: meta.data[index],\n        index,\n      };\n    });\n    const changed = !_elementsEqual(lastActive, active);\n    const positionChanged = this._positionChanged(active, eventPosition);\n    if (changed || positionChanged) {\n      this._active = active;\n      this._eventPosition = eventPosition;\n      this._ignoreReplayEvents = true;\n      this.update(true);\n    }\n  }\n  handleEvent(e, replay, inChartArea = true) {\n    if (replay && this._ignoreReplayEvents) {\n      return false;\n    }\n    this._ignoreReplayEvents = false;\n    const options = this.options;\n    const lastActive = this._active || [];\n    const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n    const positionChanged = this._positionChanged(active, e);\n    const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n    if (changed) {\n      this._active = active;\n      if (options.enabled || options.external) {\n        this._eventPosition = {\n          x: e.x,\n          y: e.y\n        };\n        this.update(true, replay);\n      }\n    }\n    return changed;\n  }\n  _getActiveElements(e, lastActive, replay, inChartArea) {\n    const options = this.options;\n    if (e.type === 'mouseout') {\n      return [];\n    }\n    if (!inChartArea) {\n      return lastActive;\n    }\n    const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n    if (options.reverse) {\n      active.reverse();\n    }\n    return active;\n  }\n  _positionChanged(active, e) {\n    const {caretX, caretY, options} = this;\n    const position = positioners[options.position].call(this, active, e);\n    return position !== false && (caretX !== position.x || caretY !== position.y);\n  }\n}\nTooltip.positioners = positioners;\nvar plugin_tooltip = {\n  id: 'tooltip',\n  _element: Tooltip,\n  positioners,\n  afterInit(chart, _args, options) {\n    if (options) {\n      chart.tooltip = new Tooltip({chart, options});\n    }\n  },\n  beforeUpdate(chart, _args, options) {\n    if (chart.tooltip) {\n      chart.tooltip.initialize(options);\n    }\n  },\n  reset(chart, _args, options) {\n    if (chart.tooltip) {\n      chart.tooltip.initialize(options);\n    }\n  },\n  afterDraw(chart) {\n    const tooltip = chart.tooltip;\n    if (tooltip && tooltip._willRender()) {\n      const args = {\n        tooltip\n      };\n      if (chart.notifyPlugins('beforeTooltipDraw', args) === false) {\n        return;\n      }\n      tooltip.draw(chart.ctx);\n      chart.notifyPlugins('afterTooltipDraw', args);\n    }\n  },\n  afterEvent(chart, args) {\n    if (chart.tooltip) {\n      const useFinalPosition = args.replay;\n      if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n        args.changed = true;\n      }\n    }\n  },\n  defaults: {\n    enabled: true,\n    external: null,\n    position: 'average',\n    backgroundColor: 'rgba(0,0,0,0.8)',\n    titleColor: '#fff',\n    titleFont: {\n      weight: 'bold',\n    },\n    titleSpacing: 2,\n    titleMarginBottom: 6,\n    titleAlign: 'left',\n    bodyColor: '#fff',\n    bodySpacing: 2,\n    bodyFont: {\n    },\n    bodyAlign: 'left',\n    footerColor: '#fff',\n    footerSpacing: 2,\n    footerMarginTop: 6,\n    footerFont: {\n      weight: 'bold',\n    },\n    footerAlign: 'left',\n    padding: 6,\n    caretPadding: 2,\n    caretSize: 5,\n    cornerRadius: 6,\n    boxHeight: (ctx, opts) => opts.bodyFont.size,\n    boxWidth: (ctx, opts) => opts.bodyFont.size,\n    multiKeyBackground: '#fff',\n    displayColors: true,\n    boxPadding: 0,\n    borderColor: 'rgba(0,0,0,0)',\n    borderWidth: 0,\n    animation: {\n      duration: 400,\n      easing: 'easeOutQuart',\n    },\n    animations: {\n      numbers: {\n        type: 'number',\n        properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n      },\n      opacity: {\n        easing: 'linear',\n        duration: 200\n      }\n    },\n    callbacks: {\n      beforeTitle: noop,\n      title(tooltipItems) {\n        if (tooltipItems.length > 0) {\n          const item = tooltipItems[0];\n          const labels = item.chart.data.labels;\n          const labelCount = labels ? labels.length : 0;\n          if (this && this.options && this.options.mode === 'dataset') {\n            return item.dataset.label || '';\n          } else if (item.label) {\n            return item.label;\n          } else if (labelCount > 0 && item.dataIndex < labelCount) {\n            return labels[item.dataIndex];\n          }\n        }\n        return '';\n      },\n      afterTitle: noop,\n      beforeBody: noop,\n      beforeLabel: noop,\n      label(tooltipItem) {\n        if (this && this.options && this.options.mode === 'dataset') {\n          return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n        }\n        let label = tooltipItem.dataset.label || '';\n        if (label) {\n          label += ': ';\n        }\n        const value = tooltipItem.formattedValue;\n        if (!isNullOrUndef(value)) {\n          label += value;\n        }\n        return label;\n      },\n      labelColor(tooltipItem) {\n        const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n        const options = meta.controller.getStyle(tooltipItem.dataIndex);\n        return {\n          borderColor: options.borderColor,\n          backgroundColor: options.backgroundColor,\n          borderWidth: options.borderWidth,\n          borderDash: options.borderDash,\n          borderDashOffset: options.borderDashOffset,\n          borderRadius: 0,\n        };\n      },\n      labelTextColor() {\n        return this.options.bodyColor;\n      },\n      labelPointStyle(tooltipItem) {\n        const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n        const options = meta.controller.getStyle(tooltipItem.dataIndex);\n        return {\n          pointStyle: options.pointStyle,\n          rotation: options.rotation,\n        };\n      },\n      afterLabel: noop,\n      afterBody: noop,\n      beforeFooter: noop,\n      footer: noop,\n      afterFooter: noop\n    }\n  },\n  defaultRoutes: {\n    bodyFont: 'font',\n    footerFont: 'font',\n    titleFont: 'font'\n  },\n  descriptors: {\n    _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n    _indexable: false,\n    callbacks: {\n      _scriptable: false,\n      _indexable: false,\n    },\n    animation: {\n      _fallback: false\n    },\n    animations: {\n      _fallback: 'animation'\n    }\n  },\n  additionalOptionScopes: ['interaction']\n};\n\nvar plugins = /*#__PURE__*/Object.freeze({\n__proto__: null,\nDecimation: plugin_decimation,\nFiller: index,\nLegend: plugin_legend,\nSubTitle: plugin_subtitle,\nTitle: plugin_title,\nTooltip: plugin_tooltip\n});\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n  if (typeof raw === 'string') {\n    index = labels.push(raw) - 1;\n    addedLabels.unshift({index, label: raw});\n  } else if (isNaN(raw)) {\n    index = null;\n  }\n  return index;\n};\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n  const first = labels.indexOf(raw);\n  if (first === -1) {\n    return addIfString(labels, raw, index, addedLabels);\n  }\n  const last = labels.lastIndexOf(raw);\n  return first !== last ? index : first;\n}\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\nclass CategoryScale extends Scale {\n  constructor(cfg) {\n    super(cfg);\n    this._startValue = undefined;\n    this._valueRange = 0;\n    this._addedLabels = [];\n  }\n  init(scaleOptions) {\n    const added = this._addedLabels;\n    if (added.length) {\n      const labels = this.getLabels();\n      for (const {index, label} of added) {\n        if (labels[index] === label) {\n          labels.splice(index, 1);\n        }\n      }\n      this._addedLabels = [];\n    }\n    super.init(scaleOptions);\n  }\n  parse(raw, index) {\n    if (isNullOrUndef(raw)) {\n      return null;\n    }\n    const labels = this.getLabels();\n    index = isFinite(index) && labels[index] === raw ? index\n      : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n    return validIndex(index, labels.length - 1);\n  }\n  determineDataLimits() {\n    const {minDefined, maxDefined} = this.getUserBounds();\n    let {min, max} = this.getMinMax(true);\n    if (this.options.bounds === 'ticks') {\n      if (!minDefined) {\n        min = 0;\n      }\n      if (!maxDefined) {\n        max = this.getLabels().length - 1;\n      }\n    }\n    this.min = min;\n    this.max = max;\n  }\n  buildTicks() {\n    const min = this.min;\n    const max = this.max;\n    const offset = this.options.offset;\n    const ticks = [];\n    let labels = this.getLabels();\n    labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n    this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n    this._startValue = this.min - (offset ? 0.5 : 0);\n    for (let value = min; value <= max; value++) {\n      ticks.push({value});\n    }\n    return ticks;\n  }\n  getLabelForValue(value) {\n    const labels = this.getLabels();\n    if (value >= 0 && value < labels.length) {\n      return labels[value];\n    }\n    return value;\n  }\n  configure() {\n    super.configure();\n    if (!this.isHorizontal()) {\n      this._reversePixels = !this._reversePixels;\n    }\n  }\n  getPixelForValue(value) {\n    if (typeof value !== 'number') {\n      value = this.parse(value);\n    }\n    return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n  }\n  getPixelForTick(index) {\n    const ticks = this.ticks;\n    if (index < 0 || index > ticks.length - 1) {\n      return null;\n    }\n    return this.getPixelForValue(ticks[index].value);\n  }\n  getValueForPixel(pixel) {\n    return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n  }\n  getBasePixel() {\n    return this.bottom;\n  }\n}\nCategoryScale.id = 'category';\nCategoryScale.defaults = {\n  ticks: {\n    callback: CategoryScale.prototype.getLabelForValue\n  }\n};\n\nfunction generateTicks$1(generationOptions, dataRange) {\n  const ticks = [];\n  const MIN_SPACING = 1e-14;\n  const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n  const unit = step || 1;\n  const maxSpaces = maxTicks - 1;\n  const {min: rmin, max: rmax} = dataRange;\n  const minDefined = !isNullOrUndef(min);\n  const maxDefined = !isNullOrUndef(max);\n  const countDefined = !isNullOrUndef(count);\n  const minSpacing = (rmax - rmin) / (maxDigits + 1);\n  let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n  let factor, niceMin, niceMax, numSpaces;\n  if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n    return [{value: rmin}, {value: rmax}];\n  }\n  numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n  if (numSpaces > maxSpaces) {\n    spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n  }\n  if (!isNullOrUndef(precision)) {\n    factor = Math.pow(10, precision);\n    spacing = Math.ceil(spacing * factor) / factor;\n  }\n  if (bounds === 'ticks') {\n    niceMin = Math.floor(rmin / spacing) * spacing;\n    niceMax = Math.ceil(rmax / spacing) * spacing;\n  } else {\n    niceMin = rmin;\n    niceMax = rmax;\n  }\n  if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n    numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n    spacing = (max - min) / numSpaces;\n    niceMin = min;\n    niceMax = max;\n  } else if (countDefined) {\n    niceMin = minDefined ? min : niceMin;\n    niceMax = maxDefined ? max : niceMax;\n    numSpaces = count - 1;\n    spacing = (niceMax - niceMin) / numSpaces;\n  } else {\n    numSpaces = (niceMax - niceMin) / spacing;\n    if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n      numSpaces = Math.round(numSpaces);\n    } else {\n      numSpaces = Math.ceil(numSpaces);\n    }\n  }\n  const decimalPlaces = Math.max(\n    _decimalPlaces(spacing),\n    _decimalPlaces(niceMin)\n  );\n  factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n  niceMin = Math.round(niceMin * factor) / factor;\n  niceMax = Math.round(niceMax * factor) / factor;\n  let j = 0;\n  if (minDefined) {\n    if (includeBounds && niceMin !== min) {\n      ticks.push({value: min});\n      if (niceMin < min) {\n        j++;\n      }\n      if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n        j++;\n      }\n    } else if (niceMin < min) {\n      j++;\n    }\n  }\n  for (; j < numSpaces; ++j) {\n    ticks.push({value: Math.round((niceMin + j * spacing) * factor) / factor});\n  }\n  if (maxDefined && includeBounds && niceMax !== max) {\n    if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n      ticks[ticks.length - 1].value = max;\n    } else {\n      ticks.push({value: max});\n    }\n  } else if (!maxDefined || niceMax === max) {\n    ticks.push({value: niceMax});\n  }\n  return ticks;\n}\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n  const rad = toRadians(minRotation);\n  const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n  const length = 0.75 * minSpacing * ('' + value).length;\n  return Math.min(minSpacing / ratio, length);\n}\nclass LinearScaleBase extends Scale {\n  constructor(cfg) {\n    super(cfg);\n    this.start = undefined;\n    this.end = undefined;\n    this._startValue = undefined;\n    this._endValue = undefined;\n    this._valueRange = 0;\n  }\n  parse(raw, index) {\n    if (isNullOrUndef(raw)) {\n      return null;\n    }\n    if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n      return null;\n    }\n    return +raw;\n  }\n  handleTickRangeOptions() {\n    const {beginAtZero} = this.options;\n    const {minDefined, maxDefined} = this.getUserBounds();\n    let {min, max} = this;\n    const setMin = v => (min = minDefined ? min : v);\n    const setMax = v => (max = maxDefined ? max : v);\n    if (beginAtZero) {\n      const minSign = sign(min);\n      const maxSign = sign(max);\n      if (minSign < 0 && maxSign < 0) {\n        setMax(0);\n      } else if (minSign > 0 && maxSign > 0) {\n        setMin(0);\n      }\n    }\n    if (min === max) {\n      let offset = 1;\n      if (max >= Number.MAX_SAFE_INTEGER || min <= Number.MIN_SAFE_INTEGER) {\n        offset = Math.abs(max * 0.05);\n      }\n      setMax(max + offset);\n      if (!beginAtZero) {\n        setMin(min - offset);\n      }\n    }\n    this.min = min;\n    this.max = max;\n  }\n  getTickLimit() {\n    const tickOpts = this.options.ticks;\n    let {maxTicksLimit, stepSize} = tickOpts;\n    let maxTicks;\n    if (stepSize) {\n      maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n      if (maxTicks > 1000) {\n        console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n        maxTicks = 1000;\n      }\n    } else {\n      maxTicks = this.computeTickLimit();\n      maxTicksLimit = maxTicksLimit || 11;\n    }\n    if (maxTicksLimit) {\n      maxTicks = Math.min(maxTicksLimit, maxTicks);\n    }\n    return maxTicks;\n  }\n  computeTickLimit() {\n    return Number.POSITIVE_INFINITY;\n  }\n  buildTicks() {\n    const opts = this.options;\n    const tickOpts = opts.ticks;\n    let maxTicks = this.getTickLimit();\n    maxTicks = Math.max(2, maxTicks);\n    const numericGeneratorOptions = {\n      maxTicks,\n      bounds: opts.bounds,\n      min: opts.min,\n      max: opts.max,\n      precision: tickOpts.precision,\n      step: tickOpts.stepSize,\n      count: tickOpts.count,\n      maxDigits: this._maxDigits(),\n      horizontal: this.isHorizontal(),\n      minRotation: tickOpts.minRotation || 0,\n      includeBounds: tickOpts.includeBounds !== false\n    };\n    const dataRange = this._range || this;\n    const ticks = generateTicks$1(numericGeneratorOptions, dataRange);\n    if (opts.bounds === 'ticks') {\n      _setMinAndMaxByKey(ticks, this, 'value');\n    }\n    if (opts.reverse) {\n      ticks.reverse();\n      this.start = this.max;\n      this.end = this.min;\n    } else {\n      this.start = this.min;\n      this.end = this.max;\n    }\n    return ticks;\n  }\n  configure() {\n    const ticks = this.ticks;\n    let start = this.min;\n    let end = this.max;\n    super.configure();\n    if (this.options.offset && ticks.length) {\n      const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n      start -= offset;\n      end += offset;\n    }\n    this._startValue = start;\n    this._endValue = end;\n    this._valueRange = end - start;\n  }\n  getLabelForValue(value) {\n    return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n  }\n}\n\nclass LinearScale extends LinearScaleBase {\n  determineDataLimits() {\n    const {min, max} = this.getMinMax(true);\n    this.min = isNumberFinite(min) ? min : 0;\n    this.max = isNumberFinite(max) ? max : 1;\n    this.handleTickRangeOptions();\n  }\n  computeTickLimit() {\n    const horizontal = this.isHorizontal();\n    const length = horizontal ? this.width : this.height;\n    const minRotation = toRadians(this.options.ticks.minRotation);\n    const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n    const tickFont = this._resolveTickFontOptions(0);\n    return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n  }\n  getPixelForValue(value) {\n    return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n  }\n  getValueForPixel(pixel) {\n    return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n  }\n}\nLinearScale.id = 'linear';\nLinearScale.defaults = {\n  ticks: {\n    callback: Ticks.formatters.numeric\n  }\n};\n\nfunction isMajor(tickVal) {\n  const remain = tickVal / (Math.pow(10, Math.floor(log10(tickVal))));\n  return remain === 1;\n}\nfunction generateTicks(generationOptions, dataRange) {\n  const endExp = Math.floor(log10(dataRange.max));\n  const endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n  const ticks = [];\n  let tickVal = finiteOrDefault(generationOptions.min, Math.pow(10, Math.floor(log10(dataRange.min))));\n  let exp = Math.floor(log10(tickVal));\n  let significand = Math.floor(tickVal / Math.pow(10, exp));\n  let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n  do {\n    ticks.push({value: tickVal, major: isMajor(tickVal)});\n    ++significand;\n    if (significand === 10) {\n      significand = 1;\n      ++exp;\n      precision = exp >= 0 ? 1 : precision;\n    }\n    tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision;\n  } while (exp < endExp || (exp === endExp && significand < endSignificand));\n  const lastTick = finiteOrDefault(generationOptions.max, tickVal);\n  ticks.push({value: lastTick, major: isMajor(tickVal)});\n  return ticks;\n}\nclass LogarithmicScale extends Scale {\n  constructor(cfg) {\n    super(cfg);\n    this.start = undefined;\n    this.end = undefined;\n    this._startValue = undefined;\n    this._valueRange = 0;\n  }\n  parse(raw, index) {\n    const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n    if (value === 0) {\n      this._zero = true;\n      return undefined;\n    }\n    return isNumberFinite(value) && value > 0 ? value : null;\n  }\n  determineDataLimits() {\n    const {min, max} = this.getMinMax(true);\n    this.min = isNumberFinite(min) ? Math.max(0, min) : null;\n    this.max = isNumberFinite(max) ? Math.max(0, max) : null;\n    if (this.options.beginAtZero) {\n      this._zero = true;\n    }\n    this.handleTickRangeOptions();\n  }\n  handleTickRangeOptions() {\n    const {minDefined, maxDefined} = this.getUserBounds();\n    let min = this.min;\n    let max = this.max;\n    const setMin = v => (min = minDefined ? min : v);\n    const setMax = v => (max = maxDefined ? max : v);\n    const exp = (v, m) => Math.pow(10, Math.floor(log10(v)) + m);\n    if (min === max) {\n      if (min <= 0) {\n        setMin(1);\n        setMax(10);\n      } else {\n        setMin(exp(min, -1));\n        setMax(exp(max, +1));\n      }\n    }\n    if (min <= 0) {\n      setMin(exp(max, -1));\n    }\n    if (max <= 0) {\n      setMax(exp(min, +1));\n    }\n    if (this._zero && this.min !== this._suggestedMin && min === exp(this.min, 0)) {\n      setMin(exp(min, -1));\n    }\n    this.min = min;\n    this.max = max;\n  }\n  buildTicks() {\n    const opts = this.options;\n    const generationOptions = {\n      min: this._userMin,\n      max: this._userMax\n    };\n    const ticks = generateTicks(generationOptions, this);\n    if (opts.bounds === 'ticks') {\n      _setMinAndMaxByKey(ticks, this, 'value');\n    }\n    if (opts.reverse) {\n      ticks.reverse();\n      this.start = this.max;\n      this.end = this.min;\n    } else {\n      this.start = this.min;\n      this.end = this.max;\n    }\n    return ticks;\n  }\n  getLabelForValue(value) {\n    return value === undefined\n      ? '0'\n      : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n  }\n  configure() {\n    const start = this.min;\n    super.configure();\n    this._startValue = log10(start);\n    this._valueRange = log10(this.max) - log10(start);\n  }\n  getPixelForValue(value) {\n    if (value === undefined || value === 0) {\n      value = this.min;\n    }\n    if (value === null || isNaN(value)) {\n      return NaN;\n    }\n    return this.getPixelForDecimal(value === this.min\n      ? 0\n      : (log10(value) - this._startValue) / this._valueRange);\n  }\n  getValueForPixel(pixel) {\n    const decimal = this.getDecimalForPixel(pixel);\n    return Math.pow(10, this._startValue + decimal * this._valueRange);\n  }\n}\nLogarithmicScale.id = 'logarithmic';\nLogarithmicScale.defaults = {\n  ticks: {\n    callback: Ticks.formatters.logarithmic,\n    major: {\n      enabled: true\n    }\n  }\n};\n\nfunction getTickBackdropHeight(opts) {\n  const tickOpts = opts.ticks;\n  if (tickOpts.display && opts.display) {\n    const padding = toPadding(tickOpts.backdropPadding);\n    return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n  }\n  return 0;\n}\nfunction measureLabelSize(ctx, font, label) {\n  label = isArray(label) ? label : [label];\n  return {\n    w: _longestText(ctx, font.string, label),\n    h: label.length * font.lineHeight\n  };\n}\nfunction determineLimits(angle, pos, size, min, max) {\n  if (angle === min || angle === max) {\n    return {\n      start: pos - (size / 2),\n      end: pos + (size / 2)\n    };\n  } else if (angle < min || angle > max) {\n    return {\n      start: pos - size,\n      end: pos\n    };\n  }\n  return {\n    start: pos,\n    end: pos + size\n  };\n}\nfunction fitWithPointLabels(scale) {\n  const orig = {\n    l: scale.left + scale._padding.left,\n    r: scale.right - scale._padding.right,\n    t: scale.top + scale._padding.top,\n    b: scale.bottom - scale._padding.bottom\n  };\n  const limits = Object.assign({}, orig);\n  const labelSizes = [];\n  const padding = [];\n  const valueCount = scale._pointLabels.length;\n  const pointLabelOpts = scale.options.pointLabels;\n  const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n  for (let i = 0; i < valueCount; i++) {\n    const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n    padding[i] = opts.padding;\n    const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n    const plFont = toFont(opts.font);\n    const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n    labelSizes[i] = textSize;\n    const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n    const angle = Math.round(toDegrees(angleRadians));\n    const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n    const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n    updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n  }\n  scale.setCenterPoint(\n    orig.l - limits.l,\n    limits.r - orig.r,\n    orig.t - limits.t,\n    limits.b - orig.b\n  );\n  scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n  const sin = Math.abs(Math.sin(angle));\n  const cos = Math.abs(Math.cos(angle));\n  let x = 0;\n  let y = 0;\n  if (hLimits.start < orig.l) {\n    x = (orig.l - hLimits.start) / sin;\n    limits.l = Math.min(limits.l, orig.l - x);\n  } else if (hLimits.end > orig.r) {\n    x = (hLimits.end - orig.r) / sin;\n    limits.r = Math.max(limits.r, orig.r + x);\n  }\n  if (vLimits.start < orig.t) {\n    y = (orig.t - vLimits.start) / cos;\n    limits.t = Math.min(limits.t, orig.t - y);\n  } else if (vLimits.end > orig.b) {\n    y = (vLimits.end - orig.b) / cos;\n    limits.b = Math.max(limits.b, orig.b + y);\n  }\n}\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n  const items = [];\n  const valueCount = scale._pointLabels.length;\n  const opts = scale.options;\n  const extra = getTickBackdropHeight(opts) / 2;\n  const outerDistance = scale.drawingArea;\n  const additionalAngle = opts.pointLabels.centerPointLabels ? PI / valueCount : 0;\n  for (let i = 0; i < valueCount; i++) {\n    const pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + padding[i], additionalAngle);\n    const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n    const size = labelSizes[i];\n    const y = yForAngle(pointLabelPosition.y, size.h, angle);\n    const textAlign = getTextAlignForAngle(angle);\n    const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n    items.push({\n      x: pointLabelPosition.x,\n      y,\n      textAlign,\n      left,\n      top: y,\n      right: left + size.w,\n      bottom: y + size.h\n    });\n  }\n  return items;\n}\nfunction getTextAlignForAngle(angle) {\n  if (angle === 0 || angle === 180) {\n    return 'center';\n  } else if (angle < 180) {\n    return 'left';\n  }\n  return 'right';\n}\nfunction leftForTextAlign(x, w, align) {\n  if (align === 'right') {\n    x -= w;\n  } else if (align === 'center') {\n    x -= (w / 2);\n  }\n  return x;\n}\nfunction yForAngle(y, h, angle) {\n  if (angle === 90 || angle === 270) {\n    y -= (h / 2);\n  } else if (angle > 270 || angle < 90) {\n    y -= h;\n  }\n  return y;\n}\nfunction drawPointLabels(scale, labelCount) {\n  const {ctx, options: {pointLabels}} = scale;\n  for (let i = labelCount - 1; i >= 0; i--) {\n    const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n    const plFont = toFont(optsAtIndex.font);\n    const {x, y, textAlign, left, top, right, bottom} = scale._pointLabelItems[i];\n    const {backdropColor} = optsAtIndex;\n    if (!isNullOrUndef(backdropColor)) {\n      const borderRadius = toTRBLCorners(optsAtIndex.borderRadius);\n      const padding = toPadding(optsAtIndex.backdropPadding);\n      ctx.fillStyle = backdropColor;\n      const backdropLeft = left - padding.left;\n      const backdropTop = top - padding.top;\n      const backdropWidth = right - left + padding.width;\n      const backdropHeight = bottom - top + padding.height;\n      if (Object.values(borderRadius).some(v => v !== 0)) {\n        ctx.beginPath();\n        addRoundedRectPath(ctx, {\n          x: backdropLeft,\n          y: backdropTop,\n          w: backdropWidth,\n          h: backdropHeight,\n          radius: borderRadius,\n        });\n        ctx.fill();\n      } else {\n        ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n      }\n    }\n    renderText(\n      ctx,\n      scale._pointLabels[i],\n      x,\n      y + (plFont.lineHeight / 2),\n      plFont,\n      {\n        color: optsAtIndex.color,\n        textAlign: textAlign,\n        textBaseline: 'middle'\n      }\n    );\n  }\n}\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n  const {ctx} = scale;\n  if (circular) {\n    ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n  } else {\n    let pointPosition = scale.getPointPosition(0, radius);\n    ctx.moveTo(pointPosition.x, pointPosition.y);\n    for (let i = 1; i < labelCount; i++) {\n      pointPosition = scale.getPointPosition(i, radius);\n      ctx.lineTo(pointPosition.x, pointPosition.y);\n    }\n  }\n}\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount) {\n  const ctx = scale.ctx;\n  const circular = gridLineOpts.circular;\n  const {color, lineWidth} = gridLineOpts;\n  if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n    return;\n  }\n  ctx.save();\n  ctx.strokeStyle = color;\n  ctx.lineWidth = lineWidth;\n  ctx.setLineDash(gridLineOpts.borderDash);\n  ctx.lineDashOffset = gridLineOpts.borderDashOffset;\n  ctx.beginPath();\n  pathRadiusLine(scale, radius, circular, labelCount);\n  ctx.closePath();\n  ctx.stroke();\n  ctx.restore();\n}\nfunction createPointLabelContext(parent, index, label) {\n  return createContext(parent, {\n    label,\n    index,\n    type: 'pointLabel'\n  });\n}\nclass RadialLinearScale extends LinearScaleBase {\n  constructor(cfg) {\n    super(cfg);\n    this.xCenter = undefined;\n    this.yCenter = undefined;\n    this.drawingArea = undefined;\n    this._pointLabels = [];\n    this._pointLabelItems = [];\n  }\n  setDimensions() {\n    const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n    const w = this.width = this.maxWidth - padding.width;\n    const h = this.height = this.maxHeight - padding.height;\n    this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n    this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n    this.drawingArea = Math.floor(Math.min(w, h) / 2);\n  }\n  determineDataLimits() {\n    const {min, max} = this.getMinMax(false);\n    this.min = isNumberFinite(min) && !isNaN(min) ? min : 0;\n    this.max = isNumberFinite(max) && !isNaN(max) ? max : 0;\n    this.handleTickRangeOptions();\n  }\n  computeTickLimit() {\n    return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n  }\n  generateTickLabels(ticks) {\n    LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n    this._pointLabels = this.getLabels()\n      .map((value, index) => {\n        const label = callback(this.options.pointLabels.callback, [value, index], this);\n        return label || label === 0 ? label : '';\n      })\n      .filter((v, i) => this.chart.getDataVisibility(i));\n  }\n  fit() {\n    const opts = this.options;\n    if (opts.display && opts.pointLabels.display) {\n      fitWithPointLabels(this);\n    } else {\n      this.setCenterPoint(0, 0, 0, 0);\n    }\n  }\n  setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n    this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n    this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n    this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n  }\n  getIndexAngle(index) {\n    const angleMultiplier = TAU / (this._pointLabels.length || 1);\n    const startAngle = this.options.startAngle || 0;\n    return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n  }\n  getDistanceFromCenterForValue(value) {\n    if (isNullOrUndef(value)) {\n      return NaN;\n    }\n    const scalingFactor = this.drawingArea / (this.max - this.min);\n    if (this.options.reverse) {\n      return (this.max - value) * scalingFactor;\n    }\n    return (value - this.min) * scalingFactor;\n  }\n  getValueForDistanceFromCenter(distance) {\n    if (isNullOrUndef(distance)) {\n      return NaN;\n    }\n    const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n    return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n  }\n  getPointLabelContext(index) {\n    const pointLabels = this._pointLabels || [];\n    if (index >= 0 && index < pointLabels.length) {\n      const pointLabel = pointLabels[index];\n      return createPointLabelContext(this.getContext(), index, pointLabel);\n    }\n  }\n  getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n    const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n    return {\n      x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n      y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n      angle\n    };\n  }\n  getPointPositionForValue(index, value) {\n    return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n  }\n  getBasePosition(index) {\n    return this.getPointPositionForValue(index || 0, this.getBaseValue());\n  }\n  getPointLabelPosition(index) {\n    const {left, top, right, bottom} = this._pointLabelItems[index];\n    return {\n      left,\n      top,\n      right,\n      bottom,\n    };\n  }\n  drawBackground() {\n    const {backgroundColor, grid: {circular}} = this.options;\n    if (backgroundColor) {\n      const ctx = this.ctx;\n      ctx.save();\n      ctx.beginPath();\n      pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n      ctx.closePath();\n      ctx.fillStyle = backgroundColor;\n      ctx.fill();\n      ctx.restore();\n    }\n  }\n  drawGrid() {\n    const ctx = this.ctx;\n    const opts = this.options;\n    const {angleLines, grid} = opts;\n    const labelCount = this._pointLabels.length;\n    let i, offset, position;\n    if (opts.pointLabels.display) {\n      drawPointLabels(this, labelCount);\n    }\n    if (grid.display) {\n      this.ticks.forEach((tick, index) => {\n        if (index !== 0) {\n          offset = this.getDistanceFromCenterForValue(tick.value);\n          const optsAtIndex = grid.setContext(this.getContext(index - 1));\n          drawRadiusLine(this, optsAtIndex, offset, labelCount);\n        }\n      });\n    }\n    if (angleLines.display) {\n      ctx.save();\n      for (i = labelCount - 1; i >= 0; i--) {\n        const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n        const {color, lineWidth} = optsAtIndex;\n        if (!lineWidth || !color) {\n          continue;\n        }\n        ctx.lineWidth = lineWidth;\n        ctx.strokeStyle = color;\n        ctx.setLineDash(optsAtIndex.borderDash);\n        ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n        offset = this.getDistanceFromCenterForValue(opts.ticks.reverse ? this.min : this.max);\n        position = this.getPointPosition(i, offset);\n        ctx.beginPath();\n        ctx.moveTo(this.xCenter, this.yCenter);\n        ctx.lineTo(position.x, position.y);\n        ctx.stroke();\n      }\n      ctx.restore();\n    }\n  }\n  drawBorder() {}\n  drawLabels() {\n    const ctx = this.ctx;\n    const opts = this.options;\n    const tickOpts = opts.ticks;\n    if (!tickOpts.display) {\n      return;\n    }\n    const startAngle = this.getIndexAngle(0);\n    let offset, width;\n    ctx.save();\n    ctx.translate(this.xCenter, this.yCenter);\n    ctx.rotate(startAngle);\n    ctx.textAlign = 'center';\n    ctx.textBaseline = 'middle';\n    this.ticks.forEach((tick, index) => {\n      if (index === 0 && !opts.reverse) {\n        return;\n      }\n      const optsAtIndex = tickOpts.setContext(this.getContext(index));\n      const tickFont = toFont(optsAtIndex.font);\n      offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n      if (optsAtIndex.showLabelBackdrop) {\n        ctx.font = tickFont.string;\n        width = ctx.measureText(tick.label).width;\n        ctx.fillStyle = optsAtIndex.backdropColor;\n        const padding = toPadding(optsAtIndex.backdropPadding);\n        ctx.fillRect(\n          -width / 2 - padding.left,\n          -offset - tickFont.size / 2 - padding.top,\n          width + padding.width,\n          tickFont.size + padding.height\n        );\n      }\n      renderText(ctx, tick.label, 0, -offset, tickFont, {\n        color: optsAtIndex.color,\n      });\n    });\n    ctx.restore();\n  }\n  drawTitle() {}\n}\nRadialLinearScale.id = 'radialLinear';\nRadialLinearScale.defaults = {\n  display: true,\n  animate: true,\n  position: 'chartArea',\n  angleLines: {\n    display: true,\n    lineWidth: 1,\n    borderDash: [],\n    borderDashOffset: 0.0\n  },\n  grid: {\n    circular: false\n  },\n  startAngle: 0,\n  ticks: {\n    showLabelBackdrop: true,\n    callback: Ticks.formatters.numeric\n  },\n  pointLabels: {\n    backdropColor: undefined,\n    backdropPadding: 2,\n    display: true,\n    font: {\n      size: 10\n    },\n    callback(label) {\n      return label;\n    },\n    padding: 5,\n    centerPointLabels: false\n  }\n};\nRadialLinearScale.defaultRoutes = {\n  'angleLines.color': 'borderColor',\n  'pointLabels.color': 'color',\n  'ticks.color': 'color'\n};\nRadialLinearScale.descriptors = {\n  angleLines: {\n    _fallback: 'grid'\n  }\n};\n\nconst INTERVALS = {\n  millisecond: {common: true, size: 1, steps: 1000},\n  second: {common: true, size: 1000, steps: 60},\n  minute: {common: true, size: 60000, steps: 60},\n  hour: {common: true, size: 3600000, steps: 24},\n  day: {common: true, size: 86400000, steps: 30},\n  week: {common: false, size: 604800000, steps: 4},\n  month: {common: true, size: 2.628e9, steps: 12},\n  quarter: {common: false, size: 7.884e9, steps: 4},\n  year: {common: true, size: 3.154e10}\n};\nconst UNITS = (Object.keys(INTERVALS));\nfunction sorter(a, b) {\n  return a - b;\n}\nfunction parse(scale, input) {\n  if (isNullOrUndef(input)) {\n    return null;\n  }\n  const adapter = scale._adapter;\n  const {parser, round, isoWeekday} = scale._parseOpts;\n  let value = input;\n  if (typeof parser === 'function') {\n    value = parser(value);\n  }\n  if (!isNumberFinite(value)) {\n    value = typeof parser === 'string'\n      ? adapter.parse(value, parser)\n      : adapter.parse(value);\n  }\n  if (value === null) {\n    return null;\n  }\n  if (round) {\n    value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n      ? adapter.startOf(value, 'isoWeek', isoWeekday)\n      : adapter.startOf(value, round);\n  }\n  return +value;\n}\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n  const ilen = UNITS.length;\n  for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n    const interval = INTERVALS[UNITS[i]];\n    const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n    if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n      return UNITS[i];\n    }\n  }\n  return UNITS[ilen - 1];\n}\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n  for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n    const unit = UNITS[i];\n    if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n      return unit;\n    }\n  }\n  return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\nfunction determineMajorUnit(unit) {\n  for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n    if (INTERVALS[UNITS[i]].common) {\n      return UNITS[i];\n    }\n  }\n}\nfunction addTick(ticks, time, timestamps) {\n  if (!timestamps) {\n    ticks[time] = true;\n  } else if (timestamps.length) {\n    const {lo, hi} = _lookup(timestamps, time);\n    const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n    ticks[timestamp] = true;\n  }\n}\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n  const adapter = scale._adapter;\n  const first = +adapter.startOf(ticks[0].value, majorUnit);\n  const last = ticks[ticks.length - 1].value;\n  let major, index;\n  for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n    index = map[major];\n    if (index >= 0) {\n      ticks[index].major = true;\n    }\n  }\n  return ticks;\n}\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n  const ticks = [];\n  const map = {};\n  const ilen = values.length;\n  let i, value;\n  for (i = 0; i < ilen; ++i) {\n    value = values[i];\n    map[value] = i;\n    ticks.push({\n      value,\n      major: false\n    });\n  }\n  return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\nclass TimeScale extends Scale {\n  constructor(props) {\n    super(props);\n    this._cache = {\n      data: [],\n      labels: [],\n      all: []\n    };\n    this._unit = 'day';\n    this._majorUnit = undefined;\n    this._offsets = {};\n    this._normalized = false;\n    this._parseOpts = undefined;\n  }\n  init(scaleOpts, opts) {\n    const time = scaleOpts.time || (scaleOpts.time = {});\n    const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n    adapter.init(opts);\n    mergeIf(time.displayFormats, adapter.formats());\n    this._parseOpts = {\n      parser: time.parser,\n      round: time.round,\n      isoWeekday: time.isoWeekday\n    };\n    super.init(scaleOpts);\n    this._normalized = opts.normalized;\n  }\n  parse(raw, index) {\n    if (raw === undefined) {\n      return null;\n    }\n    return parse(this, raw);\n  }\n  beforeLayout() {\n    super.beforeLayout();\n    this._cache = {\n      data: [],\n      labels: [],\n      all: []\n    };\n  }\n  determineDataLimits() {\n    const options = this.options;\n    const adapter = this._adapter;\n    const unit = options.time.unit || 'day';\n    let {min, max, minDefined, maxDefined} = this.getUserBounds();\n    function _applyBounds(bounds) {\n      if (!minDefined && !isNaN(bounds.min)) {\n        min = Math.min(min, bounds.min);\n      }\n      if (!maxDefined && !isNaN(bounds.max)) {\n        max = Math.max(max, bounds.max);\n      }\n    }\n    if (!minDefined || !maxDefined) {\n      _applyBounds(this._getLabelBounds());\n      if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n        _applyBounds(this.getMinMax(false));\n      }\n    }\n    min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n    max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n    this.min = Math.min(min, max - 1);\n    this.max = Math.max(min + 1, max);\n  }\n  _getLabelBounds() {\n    const arr = this.getLabelTimestamps();\n    let min = Number.POSITIVE_INFINITY;\n    let max = Number.NEGATIVE_INFINITY;\n    if (arr.length) {\n      min = arr[0];\n      max = arr[arr.length - 1];\n    }\n    return {min, max};\n  }\n  buildTicks() {\n    const options = this.options;\n    const timeOpts = options.time;\n    const tickOpts = options.ticks;\n    const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n    if (options.bounds === 'ticks' && timestamps.length) {\n      this.min = this._userMin || timestamps[0];\n      this.max = this._userMax || timestamps[timestamps.length - 1];\n    }\n    const min = this.min;\n    const max = this.max;\n    const ticks = _filterBetween(timestamps, min, max);\n    this._unit = timeOpts.unit || (tickOpts.autoSkip\n      ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n      : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n    this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n      : determineMajorUnit(this._unit);\n    this.initOffsets(timestamps);\n    if (options.reverse) {\n      ticks.reverse();\n    }\n    return ticksFromTimestamps(this, ticks, this._majorUnit);\n  }\n  afterAutoSkip() {\n    if (this.options.offsetAfterAutoskip) {\n      this.initOffsets(this.ticks.map(tick => +tick.value));\n    }\n  }\n  initOffsets(timestamps) {\n    let start = 0;\n    let end = 0;\n    let first, last;\n    if (this.options.offset && timestamps.length) {\n      first = this.getDecimalForValue(timestamps[0]);\n      if (timestamps.length === 1) {\n        start = 1 - first;\n      } else {\n        start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n      }\n      last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n      if (timestamps.length === 1) {\n        end = last;\n      } else {\n        end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n      }\n    }\n    const limit = timestamps.length < 3 ? 0.5 : 0.25;\n    start = _limitValue(start, 0, limit);\n    end = _limitValue(end, 0, limit);\n    this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n  }\n  _generate() {\n    const adapter = this._adapter;\n    const min = this.min;\n    const max = this.max;\n    const options = this.options;\n    const timeOpts = options.time;\n    const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n    const stepSize = valueOrDefault(timeOpts.stepSize, 1);\n    const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n    const hasWeekday = isNumber(weekday) || weekday === true;\n    const ticks = {};\n    let first = min;\n    let time, count;\n    if (hasWeekday) {\n      first = +adapter.startOf(first, 'isoWeek', weekday);\n    }\n    first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n    if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n      throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n    }\n    const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n    for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n      addTick(ticks, time, timestamps);\n    }\n    if (time === max || options.bounds === 'ticks' || count === 1) {\n      addTick(ticks, time, timestamps);\n    }\n    return Object.keys(ticks).sort((a, b) => a - b).map(x => +x);\n  }\n  getLabelForValue(value) {\n    const adapter = this._adapter;\n    const timeOpts = this.options.time;\n    if (timeOpts.tooltipFormat) {\n      return adapter.format(value, timeOpts.tooltipFormat);\n    }\n    return adapter.format(value, timeOpts.displayFormats.datetime);\n  }\n  _tickFormatFunction(time, index, ticks, format) {\n    const options = this.options;\n    const formats = options.time.displayFormats;\n    const unit = this._unit;\n    const majorUnit = this._majorUnit;\n    const minorFormat = unit && formats[unit];\n    const majorFormat = majorUnit && formats[majorUnit];\n    const tick = ticks[index];\n    const major = majorUnit && majorFormat && tick && tick.major;\n    const label = this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n    const formatter = options.ticks.callback;\n    return formatter ? callback(formatter, [label, index, ticks], this) : label;\n  }\n  generateTickLabels(ticks) {\n    let i, ilen, tick;\n    for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n      tick = ticks[i];\n      tick.label = this._tickFormatFunction(tick.value, i, ticks);\n    }\n  }\n  getDecimalForValue(value) {\n    return value === null ? NaN : (value - this.min) / (this.max - this.min);\n  }\n  getPixelForValue(value) {\n    const offsets = this._offsets;\n    const pos = this.getDecimalForValue(value);\n    return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n  }\n  getValueForPixel(pixel) {\n    const offsets = this._offsets;\n    const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n    return this.min + pos * (this.max - this.min);\n  }\n  _getLabelSize(label) {\n    const ticksOpts = this.options.ticks;\n    const tickLabelWidth = this.ctx.measureText(label).width;\n    const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n    const cosRotation = Math.cos(angle);\n    const sinRotation = Math.sin(angle);\n    const tickFontSize = this._resolveTickFontOptions(0).size;\n    return {\n      w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n      h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n    };\n  }\n  _getLabelCapacity(exampleTime) {\n    const timeOpts = this.options.time;\n    const displayFormats = timeOpts.displayFormats;\n    const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n    const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n    const size = this._getLabelSize(exampleLabel);\n    const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n    return capacity > 0 ? capacity : 1;\n  }\n  getDataTimestamps() {\n    let timestamps = this._cache.data || [];\n    let i, ilen;\n    if (timestamps.length) {\n      return timestamps;\n    }\n    const metas = this.getMatchingVisibleMetas();\n    if (this._normalized && metas.length) {\n      return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n    }\n    for (i = 0, ilen = metas.length; i < ilen; ++i) {\n      timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n    }\n    return (this._cache.data = this.normalize(timestamps));\n  }\n  getLabelTimestamps() {\n    const timestamps = this._cache.labels || [];\n    let i, ilen;\n    if (timestamps.length) {\n      return timestamps;\n    }\n    const labels = this.getLabels();\n    for (i = 0, ilen = labels.length; i < ilen; ++i) {\n      timestamps.push(parse(this, labels[i]));\n    }\n    return (this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps));\n  }\n  normalize(values) {\n    return _arrayUnique(values.sort(sorter));\n  }\n}\nTimeScale.id = 'time';\nTimeScale.defaults = {\n  bounds: 'data',\n  adapters: {},\n  time: {\n    parser: false,\n    unit: false,\n    round: false,\n    isoWeekday: false,\n    minUnit: 'millisecond',\n    displayFormats: {}\n  },\n  ticks: {\n    source: 'auto',\n    major: {\n      enabled: false\n    }\n  }\n};\n\nfunction interpolate(table, val, reverse) {\n  let lo = 0;\n  let hi = table.length - 1;\n  let prevSource, nextSource, prevTarget, nextTarget;\n  if (reverse) {\n    if (val >= table[lo].pos && val <= table[hi].pos) {\n      ({lo, hi} = _lookupByKey(table, 'pos', val));\n    }\n    ({pos: prevSource, time: prevTarget} = table[lo]);\n    ({pos: nextSource, time: nextTarget} = table[hi]);\n  } else {\n    if (val >= table[lo].time && val <= table[hi].time) {\n      ({lo, hi} = _lookupByKey(table, 'time', val));\n    }\n    ({time: prevSource, pos: prevTarget} = table[lo]);\n    ({time: nextSource, pos: nextTarget} = table[hi]);\n  }\n  const span = nextSource - prevSource;\n  return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\nclass TimeSeriesScale extends TimeScale {\n  constructor(props) {\n    super(props);\n    this._table = [];\n    this._minPos = undefined;\n    this._tableRange = undefined;\n  }\n  initOffsets() {\n    const timestamps = this._getTimestampsForTable();\n    const table = this._table = this.buildLookupTable(timestamps);\n    this._minPos = interpolate(table, this.min);\n    this._tableRange = interpolate(table, this.max) - this._minPos;\n    super.initOffsets(timestamps);\n  }\n  buildLookupTable(timestamps) {\n    const {min, max} = this;\n    const items = [];\n    const table = [];\n    let i, ilen, prev, curr, next;\n    for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n      curr = timestamps[i];\n      if (curr >= min && curr <= max) {\n        items.push(curr);\n      }\n    }\n    if (items.length < 2) {\n      return [\n        {time: min, pos: 0},\n        {time: max, pos: 1}\n      ];\n    }\n    for (i = 0, ilen = items.length; i < ilen; ++i) {\n      next = items[i + 1];\n      prev = items[i - 1];\n      curr = items[i];\n      if (Math.round((next + prev) / 2) !== curr) {\n        table.push({time: curr, pos: i / (ilen - 1)});\n      }\n    }\n    return table;\n  }\n  _getTimestampsForTable() {\n    let timestamps = this._cache.all || [];\n    if (timestamps.length) {\n      return timestamps;\n    }\n    const data = this.getDataTimestamps();\n    const label = this.getLabelTimestamps();\n    if (data.length && label.length) {\n      timestamps = this.normalize(data.concat(label));\n    } else {\n      timestamps = data.length ? data : label;\n    }\n    timestamps = this._cache.all = timestamps;\n    return timestamps;\n  }\n  getDecimalForValue(value) {\n    return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n  }\n  getValueForPixel(pixel) {\n    const offsets = this._offsets;\n    const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n    return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n  }\n}\nTimeSeriesScale.id = 'timeseries';\nTimeSeriesScale.defaults = TimeScale.defaults;\n\nvar scales = /*#__PURE__*/Object.freeze({\n__proto__: null,\nCategoryScale: CategoryScale,\nLinearScale: LinearScale,\nLogarithmicScale: LogarithmicScale,\nRadialLinearScale: RadialLinearScale,\nTimeScale: TimeScale,\nTimeSeriesScale: TimeSeriesScale\n});\n\nconst registerables = [\n  controllers,\n  elements,\n  plugins,\n  scales,\n];\n\nexport { Animation, Animations, ArcElement, BarController, BarElement, BasePlatform, BasicPlatform, BubbleController, CategoryScale, Chart, DatasetController, plugin_decimation as Decimation, DomPlatform, DoughnutController, Element, index as Filler, Interaction, plugin_legend as Legend, LineController, LineElement, LinearScale, LogarithmicScale, PieController, PointElement, PolarAreaController, RadarController, RadialLinearScale, Scale, ScatterController, plugin_subtitle as SubTitle, Ticks, TimeScale, TimeSeriesScale, plugin_title as Title, plugin_tooltip as Tooltip, adapters as _adapters, _detectPlatform, animator, controllers, elements, layouts, plugins, registerables, registry, scales };\n","<template>\n    <form class=\"confirm-email-view st-view small\" @submit.prevent=\"submit\">\n        <STNavigationBar>\n            <template #right>\n                <LoadingButton :loading=\"retrying\">\n                    <button class=\"button text\" type=\"button\" @click=\"retry\">\n                        <span class=\"icon retry\" />\n                        <span>Opnieuw</span>\n                    </button>\n                </LoadingButton>\n            </template>\n        </STNavigationBar>\n        <img src=\"@stamhoofd/assets/images/illustrations/email.svg\" class=\"email-illustration\">\n\n        <main class=\"center\">\n            <h1 v-if=\"!login\">\n                Vul de code uit de e-mail in\n            </h1>\n            <h1 v-else>\n                Verifieer jouw e-mailadres\n            </h1>\n\n            <p>Er werd een e-mail verstuurd naar '{{ email }}'. Vul de code uit de e-mail in of klik op de link in de e-mail en wacht enkele seconden. E-mail niet ontvangen? Kijk in jouw spambox!</p>\n\n            <div><CodeInput v-model=\"code\" @complete=\"submit\" /></div>\n\n            <div><STErrorsDefault :error-box=\"errorBox\" /></div>\n        </main>\n\n        <STToolbar>\n            <template #right>\n                <LoadingButton :loading=\"loading\">\n                    <button class=\"button primary full\" type=\"button\">\n                        <span>Doorgaan</span>\n                        <span class=\"icon arrow-right\" />\n                    </button>\n                </LoadingButton>\n            </template>\n        </STToolbar>\n    </form>\n</template>\n\n<script lang=\"ts\">\nimport { NavigationMixin } from \"@simonbackx/vue-app-navigation\";\nimport { Component, Mixins, Prop } from \"@simonbackx/vue-app-navigation/classes\";\nimport { CenteredMessage, Checkbox, CodeInput, EmailInput, ErrorBox, LoadingButton, Spinner, STErrorsDefault, STFloatingFooter, STInputBox, STNavigationBar, STToolbar, Toast } from \"@stamhoofd/components\";\nimport { LoginHelper } from '@stamhoofd/networking';\n\n// The header component detects if the user scrolled past the header position and adds a background gradient in an animation\n@Component({\n    components: {\n        STNavigationBar,\n        STFloatingFooter,\n        STInputBox,\n        LoadingButton,\n        STErrorsDefault,\n        EmailInput,\n        Checkbox,\n        Spinner,\n        STToolbar,\n        CodeInput\n    }\n})\nexport default class ConfirmEmailView extends Mixins(NavigationMixin){\n    errorBox: ErrorBox | null = null\n    loading = false\n    polling = false\n    pollCount = 0\n    code = \"\"\n\n    @Prop({ required: true })\n        token!: string\n\n    @Prop({ required: true })\n        email!: string\n\n    @Prop({ default: false })\n        login!: boolean\n\n    timer: any = null\n\n    startTime = new Date()\n\n    mounted() {\n        // eslint-disable-next-line @typescript-eslint/no-implied-eval\n        this.timer = setTimeout(this.poll.bind(this), 10000)\n    }\n\n    stopPolling() {\n        if (this.timer) {\n            console.log(\"Stopped e-mail polling\")\n            clearTimeout(this.timer)\n            this.timer = null\n        }\n    }\n\n    unmounted() {\n        this.stopPolling()\n    }\n\n    retrying = false\n\n    async retry() {\n        if (this.retrying) {\n            return\n        }\n\n        if (new Date().getTime() - this.startTime.getTime() < 5 * 60 * 1000 && STAMHOOFD.environment !== 'development') {\n            new Toast(\"Je moet minimaal 5 minuten wachten voor je een nieuwe e-mail kan versturen. Kijk jouw inbox goed na!\", \"error red\").show()\n            return\n        }\n        // TODO\n        if (!await CenteredMessage.confirm(\"Wil je een nieuwe bevestigingsmail sturen?\", \"Ja, versturen\", \"Kijk ook zeker in jouw spambox, wacht enkele minuten en kijk opnieuw. Kijk ook na of je geen typefouten hebt gemaakt in jouw e-mailadres (dan maak je best een nieuw account aan).\")) {\n            return\n        }\n\n        this.retrying = true\n\n        try {\n            const stop = await LoginHelper.retryEmail(this.$context, this.token)\n            this.startTime = new Date()\n            if (stop) {\n                this.dismiss({ force: true })\n                return\n            }\n            new Toast(\"Je hebt een nieuwe e-mail ontvangen. Kijk jouw inbox en spambox goed na!\", \"email\").show()\n        } catch (error) {\n            this.errorBox = new ErrorBox(error)\n        }\n        this.retrying = false\n    }\n\n    async poll() {\n        if (this.polling) {\n            return\n        }\n        this.polling = true\n\n        try {\n            const stop = await LoginHelper.pollEmail(this.$context, this.token)\n            if (stop) {\n                this.dismiss({ force: true })\n                return\n            }\n        } catch (e) {\n            console.error(e)\n        }\n        this.pollCount++\n        this.polling = false\n\n        if (this.pollCount > 150) {\n            // Stop after 12 minutes\n            return\n        }\n        // eslint-disable-next-line @typescript-eslint/no-implied-eval\n        this.timer = setTimeout(this.poll.bind(this), Math.max(this.pollCount*1000, 5*1000))\n    }\n\n    async submit() {\n        if (this.loading) {\n            return\n        }\n\n        // Send request\n        this.loading = true\n\n        try {\n            await LoginHelper.verifyEmail(this.$context, this.code, this.token)\n            new Toast(\"Jouw e-mailadres is geverifieerd!\", \"success green\").setHide(3000).show()\n\n            // Yay!\n            // we could be sign in, or couldn't.\n            // if signed in: we'll automitically get deallocated\n            // so always return\n            this.dismiss({ force: true })\n\n        } catch (e) {\n            // Prevent closing now that we showed an error\n            this.stopPolling()\n            this.errorBox = new ErrorBox(e)\n        }\n        this.loading = false\n    }\n\n    async shouldNavigateAway() {\n        return await CenteredMessage.confirm(\"Ben je zeker dat je wilt annuleren?\", \"Sluiten en niet voltooien\")\n    }\n}\n</script>\n\n<style lang=\"scss\">\n    .confirm-email-view {\n        text-align: center;\n\n        .email-illustration {\n            width: 100px;\n            height: 100px;\n            display: block;\n            margin: 0 auto;\n            margin-bottom: 20px;\n        }\n    }\n</style>\n","<template>\n    <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n    <Checkbox v-for=\"policy of requiredPolicies\" :key=\"policy.id\" :model-value=\"isAccepted(policy)\" class=\"long-text\" @update:model-value=\"setAccepted(policy, $event)\">\n        <div v-if=\"policy.richText.html\" class=\"style-wysiwyg\" v-html=\"policy.richText.html\" /><span v-else>{{ policy.name }}</span>\n    </Checkbox>\n    \n    <footer class=\"signup-policies-footer\">\n        <slot />\n    </footer>\n\n    <div v-if=\"policies.filter(p => !p.checkbox).length > 0\" class=\"signup-policy-footer-suffix\">\n        <p v-for=\"policy of policies.filter(p => !p.checkbox)\" :key=\"policy.id\" class=\"style-description-block\">\n            <span v-if=\"policy.richText.html\" class=\"style-wysiwyg gray\" v-html=\"policy.richText.html\" />\n            <span v-else>{{ policy.name }}</span>\n        </p>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { SimpleError } from \"@simonbackx/simple-errors\";\nimport { PlatformPolicy, RichText } from \"@stamhoofd/structures\";\nimport { Formatter } from \"@stamhoofd/utility\";\nimport { computed, ref } from \"vue\";\nimport { ErrorBox } from \"../../errors/ErrorBox\";\nimport { Validator } from \"../../errors/Validator\";\nimport { useErrors } from \"../../errors/useErrors\";\nimport { useValidation } from \"../../errors/useValidation\";\nimport { useOrganization, usePlatform } from \"../../hooks\";\n\nconst props = defineProps<{\n    validator: Validator\n}>()\n\nconst acceptPrivacy = ref(new Set<string>())\nconst organization = useOrganization()\nconst platform = usePlatform()\nconst errors = useErrors()\n\nconst policies = computed(() =>{\n    if (STAMHOOFD.userMode === 'organization') {\n        if (!organization.value) {\n            return []\n        }\n\n        const url = organization.value.meta.privacyPolicyUrl || organization.value.meta.privacyPolicyFile?.getPublicPath() || ''\n\n        return [\n            PlatformPolicy.create({\n                name: \"Privacybeleid\",\n                url,\n                checkbox: true,\n                richText: RichText.create({\n                    html: 'Ik ga akkoord met <a href=\"'+Formatter.escapeHtml(url)+'\" target=\"_blank\">het privacybeleid</a>.'\n                })\n            })\n        ]\n    }\n    return platform.value.config.privacy.policies.filter(p => p.enableAtSignup)\n});\n\nconst requiredPolicies = computed(() => policies.value.filter(p => p.checkbox))\n\nfunction isAccepted(policy: PlatformPolicy) {\n    return acceptPrivacy.value.has(policy.id)\n}\n\nfunction setAccepted(policy: PlatformPolicy, value: boolean) {\n    if (value) {\n        acceptPrivacy.value.add(policy.id)\n    } else {\n        acceptPrivacy.value.delete(policy.id)\n    }\n}\n\nuseValidation(props.validator, () => {\n    for (const policy of requiredPolicies.value) {\n        if (!isAccepted(policy)) {\n            errors.errorBox = new ErrorBox(new SimpleError({\n                code: \"read_privacy\",\n                message: \"Je moet akkoord gaan met de voorwaarden voor je een account kan aanmaken.\"\n            }))\n            return false;\n        }\n    }\n    errors.errorBox = null;\n    return true\n})\n\n</script>\n\n<style lang=\"scss\">\n.signup-policy-footer-suffix {\n    padding-top: 15px;\n}\n\n.signup-policy-footer {\n    padding-top: 15px;\n}\n</style>\n","<template>\n    <LoadingViewTransition>\n        <form v-if=\"!loadingSession\" key=\"form\" class=\"forgot-password-reset-view st-view\" @submit.prevent=\"submit\">\n            <STNavigationBar :title=\"title\" />\n            <main>\n                <h1>{{ title }}</h1>\n\n                <p>{{ description }}</p>\n\n                <STErrorsDefault :error-box=\"errorBox\" />\n\n                <STInputBox v-if=\"!hasAccount\" title=\"Jouw naam\" error-fields=\"firstName,lastName\" :error-box=\"errorBox\">\n                    <div class=\"input-group\">\n                        <div>\n                            <input v-model=\"firstName\" class=\"input\" type=\"text\" placeholder=\"Voornaam\" autocomplete=\"given-name\">\n                        </div>\n                        <div>\n                            <input v-model=\"lastName\" class=\"input\" type=\"text\" placeholder=\"Achternaam\" autocomplete=\"family-name\">\n                        </div>\n                    </div>\n                </STInputBox>\n                <EmailInput v-model=\"email\" title=\"Persoonlijk e-mailadres\" :validator=\"validator\" placeholder=\"Vul jouw e-mailadres hier in\" autocomplete=\"username\" />\n                <div class=\"split-inputs\">\n                    <div>\n                        <STInputBox title=\"Kies een nieuw wachtwoord\">\n                            <input v-model=\"password\" class=\"input\" placeholder=\"Kies een nieuw wachtwoord\" autocomplete=\"new-password\" type=\"password\">\n                        </STInputBox>\n\n                        <STInputBox title=\"Herhaal wachtwoord\">\n                            <input v-model=\"passwordRepeat\" class=\"input\" placeholder=\"Herhaal nieuw wachtwoord\" autocomplete=\"new-password\" type=\"password\">\n                        </STInputBox>\n                    </div>\n                    <div>\n                        <PasswordStrength v-model=\"password\" />\n                    </div>\n                </div>\n\n                <SignupPoliciesBox :validator=\"validator\">\n                    <LoadingButton :loading=\"loading\" class=\"block input-spacing\">\n                        <button id=\"submit\" class=\"button primary\" type=\"submit\">\n                            <span class=\"icon lock\" />\n                            <span>{{ buttonText }}</span>\n                        </button>\n                    </LoadingButton>\n                </SignupPoliciesBox>\n            </main>\n        </form>\n    </LoadingViewTransition>\n</template>\n\n<script lang=\"ts\">\nimport { SimpleError, SimpleErrors } from '@simonbackx/simple-errors';\nimport { ComponentWithProperties, NavigationMixin } from \"@simonbackx/vue-app-navigation\";\nimport { Component, Mixins, Prop } from \"@simonbackx/vue-app-navigation/classes\";\nimport { Checkbox, ConfirmEmailView, EmailInput, ErrorBox, LoadingButton, LoadingViewTransition, PasswordStrength, ReplaceRootEventBus, Spinner, STErrorsDefault, STFloatingFooter, STInputBox, STNavigationBar, Toast, Validator } from \"@stamhoofd/components\";\nimport { LoginHelper, SessionContext, SessionManager } from '@stamhoofd/networking';\nimport { NewUser, Token } from '@stamhoofd/structures';\nimport SignupPoliciesBox from './components/SignupPoliciesBox.vue';\n\n// The header component detects if the user scrolled past the header position and adds a background gradient in an animation\n@Component({\n    components: {\n        STNavigationBar,\n        STFloatingFooter,\n        STInputBox,\n        LoadingButton,\n        STErrorsDefault,\n        EmailInput,\n        Checkbox,\n        Spinner,\n        PasswordStrength,\n        LoadingViewTransition,\n        SignupPoliciesBox\n    }\n})\nexport default class ForgotPasswordResetView extends Mixins(NavigationMixin){\n    loading = false;\n    loadingToken = true;\n    email = \"\"\n    password = \"\"\n    firstName = \"\"\n    lastName = \"\"\n\n    passwordRepeat = \"\"\n\n    errorBox: ErrorBox | null = null\n    validator = new Validator()\n\n    @Prop({ required: true })\n        token!: string\n\n    session: SessionContext | null = null\n\n    acceptPrivacy = false\n    acceptTerms = false\n    acceptDataAgreement = false\n    hasAccount = false;\n\n    get loadingSession() {\n        return !this.session || !this.session.user || this.loadingToken\n    }\n\n    get title() {\n        return this.hasAccount ? 'Wachtwoord opnieuw instellen' : 'Account aanmaken'\n    }\n\n    get description() {\n        return this.hasAccount ? 'Stel een nieuw wachtwoord in voor jouw account.' : 'Kies een wachtwoord voor jouw nieuwe account'\n    }\n\n    get buttonText() {\n        return this.hasAccount ? 'Wachtwoord wijzigen' : 'Account aanmaken'\n    }\n\n    mounted() {\n        this.loadingToken = true\n\n        if (this.token) {\n            const token = this.token\n            \n            this.loadingToken = true;\n\n            this.$context.server.request({\n                method: \"POST\",\n                path: \"/oauth/token\",\n                body: {\n                    // eslint-disable-next-line @typescript-eslint/camelcase\n                    grant_type: \"password_token\",\n                    // eslint-disable-next-line @typescript-eslint/camelcase\n                    token: token\n                },\n                decoder: Token\n            }).then(async (response) => {\n                // Create new session to prevent signing in\n                this.session = new SessionContext(this.$context.organization)\n                // We don't want to save this session or reuse it on the next loads (yet)\n                this.session.disableStorage()\n                await this.session.setToken(response.data)\n                await this.session.updateData(false, false)\n                return this.session\n            })\n                .then((session) => {\n                    this.email = session.user?.email ?? ''\n                    this.firstName = session.user?.firstName ?? ''\n                    this.lastName = session.user?.lastName ?? ''\n                    this.hasAccount = session.user?.hasAccount ?? false\n                    this.loadingToken = false;\n                }).catch(e => {\n                    new Toast(\"Deze link is ongeldig of vervallen. Stuur een nieuwe e-mail om je wachtwoord opnieuw in te stellen.\", \"error red\").show()\n                    this.dismiss({ force: true })\n                })\n        } else {\n            new Toast(\"Deze link is ongeldig\", \"error red\").show()\n            this.dismiss({ force: true })\n        }\n    }\n\n    get hasPermissions() {\n        return this.session && this.session.user && !!this.session.user.permissions\n    }\n\n    async submit() {\n        if (this.loading || this.loadingToken || !this.session) {\n            return\n        }\n\n        if (!this.hasAccount) {\n            try {\n                const errors = new SimpleErrors()\n                if (this.firstName.length < 2) {\n                    errors.addError(new SimpleError({\n                        code: \"invalid_field\",\n                        message: \"Vul jouw voornaam in\",\n                        field: \"firstName\"\n                    }))\n                }\n                if (this.lastName.length < 2) {\n                    errors.addError(new SimpleError({\n                        code: \"invalid_field\",\n                        message: \"Vul jouw achternaam in\",\n                        field: \"lastName\"\n                    }))\n                }\n                errors.throwIfNotEmpty()\n            } catch (e) {\n                this.errorBox = new ErrorBox(e)\n                return\n            } \n        }\n        \n        const valid = await this.validator.validate()\n\n        if (this.password !== this.passwordRepeat) {\n            this.errorBox = new ErrorBox(new SimpleError({\n                code: \"\",\n                message: \"De ingevoerde wachtwoorden komen niet overeen\"\n            }))\n            return;\n        }\n\n        const minChars = 8\n\n        if (this.password.length < minChars) {\n            this.errorBox = new ErrorBox(new SimpleError({\n                code: \"\",\n                message: \"Jouw wachtwoord moet uit minstens \"+minChars+\" karakters bestaan.\"\n            }))\n            return;\n        }\n\n        if (!valid) {\n            this.errorBox = null\n            return;\n        }\n\n        this.loading = true\n        \n        // Request the key constants\n        try {\n            const patch = this.hasAccount ?\n                NewUser.patch({\n                    id: this.session.user!.id,\n                    password: this.password,\n                    email: this.email\n                }) : NewUser.patch({\n                    id: this.session.user!.id,\n                    password: this.password,\n                    email: this.email,\n                    firstName: this.firstName,\n                    lastName: this.lastName\n                })\n\n            // Also change the email if it has been changed\n            const {verificationToken} = await LoginHelper.patchUser(this.session, patch)\n            //await SessionManager.setCurrentSession(this.session)\n            await SessionManager.prepareSessionForUsage(this.session)\n\n            // todo: switch current $context to session\n\n            // If email has been changed or needs verification\n            if (verificationToken) {\n                // Present instead of show, because the confirm is only needed to change the email address\n                this.present(new ComponentWithProperties(ConfirmEmailView, { token: verificationToken, email: this.email }).setDisplayStyle(\"sheet\"))\n            }\n\n            if (this.hasAccount) {\n                const toast = new Toast('Jouw nieuwe wachtwoord is opgeslagen', \"success green\")\n                toast.show()\n            } else {\n                const toast = new Toast('Jouw account is aangemaakt', \"success green\")\n                toast.show()\n            }\n\n            const dashboard = await import('@stamhoofd/dashboard')\n            const root = await dashboard.getScopedAutoRoot(this.session)\n            await ReplaceRootEventBus.sendEvent('replace', root)\n\n            this.dismiss({ force: true })\n            this.loading = false;\n        } catch (e) {\n            this.loading = false;\n            this.errorBox = new ErrorBox(e)\n            return;\n        }\n        \n    }\n}\n</script>\n","<template>\n    <form class=\"st-view forgot-password-view\" @submit.prevent=\"submit\">\n        <STNavigationBar title=\"Wachtwoord vergeten\" />\n        <main class=\"center small\">\n            <h1>Wachtwoord vergeten</h1>\n            <p>Vul jouw e-mailadres in, en we sturen jou een e-mail waarmee je een nieuw wachtwoord kan kiezen.</p>\n            \n            <STErrorsDefault :error-box=\"errorBox\" />\n            <EmailInput v-model=\"email\" title=\"E-mailadres\" placeholder=\"Vul jouw e-mailadres hier in\" autocomplete=\"username\" :validator=\"validator\" class=\"max\" />\n        \n            <LoadingButton :loading=\"loading\" class=\"block\">\n                <button class=\"button primary full\" type=\"submit\">\n                    Opnieuw instellen\n                </button>\n            </LoadingButton>\n        </main>\n    </form>\n</template>\n\n<script lang=\"ts\">\nimport { NavigationMixin } from \"@simonbackx/vue-app-navigation\";\nimport { Component, Mixins, Prop } from \"@simonbackx/vue-app-navigation/classes\";\nimport { BackButton, EmailInput, ErrorBox, LoadingButton, STErrorsDefault, STFloatingFooter, STNavigationBar, Toast, Validator } from \"@stamhoofd/components\";\nimport { ForgotPasswordRequest } from '@stamhoofd/structures';\n\n@Component({\n    components: {\n        STNavigationBar,\n        STFloatingFooter,\n        EmailInput,\n        LoadingButton,\n        STErrorsDefault,\n        BackButton\n    }\n})\nexport default class ForgotPasswordView extends Mixins(NavigationMixin){\n    loading = false\n\n    @Prop({ default: \"\"})\n        initialEmail!: string\n\n    email = this.initialEmail\n    validator = new Validator()\n    errorBox: ErrorBox | null = null\n\n    async submit() {\n        if (this.loading) {\n            return;\n        }\n        this.loading = true;\n        this.errorBox = null;\n\n        if (!(await this.validator.validate())) {\n            this.loading = false;\n            return;\n        }\n\n        try {\n            await this.$context.server.request({\n                method: \"POST\",\n                path: \"/forgot-password\",\n                body: ForgotPasswordRequest.create({ email: this.email }),\n                shouldRetry: false\n            })\n\n            this.dismiss({ force: true })\n            new Toast(\"Je hebt een e-mail ontvangen waarmee je een nieuw wachtwoord kan instellen\", \"success\").show()\n        } catch (e) {\n            this.errorBox = new ErrorBox(e)\n        }\n\n        this.loading = false;\n    }\n}\n</script>\n","<template>\n    <div v-if=\"platform.config.footerText.html\" class=\"legal-footer\">\n        <div>\n            <aside class=\"style-wysiwyg gray subtle-links\" v-html=\"platform.config.footerText.html\" />\n            <div />\n        </div>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { usePlatform } from '../hooks';\nconst platform = usePlatform();\n\n</script>\n","<template>\n    <form class=\"st-view login-view\" data-submit-last-field @submit.prevent=\"submit\">\n        <STNavigationBar :large=\"true\" title=\"Inloggen\" class=\"transparent\" />\n\n        <main class=\"center small flex\">\n            <div class=\"st-view-vertical-center\">\n                <div class=\"container\">\n                    <h1>{{ $t('d54c9b23-2d3c-49cd-b1fc-7e821d36fd41') }}</h1>\n\n                    <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n                    <template v-if=\"passwordConfig\">\n                        <EmailInput id=\"username\" ref=\"emailInput\" v-model=\"email\" :autofocus=\"!initialEmail\" enterkeyhint=\"next\" class=\"max\" name=\"username\" title=\"E-mailadres\" :validator=\"errors.validator\" placeholder=\"Vul jouw e-mailadres hier in\" autocomplete=\"username\" :disabled=\"lock !== null\" />\n                        <p v-if=\"lock\" class=\"style-description-small\">\n                            {{ lock }}\n                        </p>\n\n                        <STInputBox title=\"Wachtwoord\" class=\"max\">\n                            <template #right>\n                                <button class=\"button text\" type=\"button\" tabindex=\"-1\" @click.prevent=\"gotoPasswordForgot\">\n                                    <span>Vergeten</span>\n                                    <span class=\"icon help\" />\n                                </button>\n                            </template>\n                            <input id=\"password\" v-model=\"password\" :autofocus=\"!!initialEmail\" enterkeyhint=\"go\" class=\"input\" name=\"current-password\" placeholder=\"Vul jouw wachtwoord hier in\" autocomplete=\"current-password\" type=\"password\" @input=\"(event) => password = event.target.value\" @change=\"(event) => password = event.target.value\">\n                        </STInputBox>\n                        <VersionFooter v-if=\"showVersionFooter\" />\n                        <div v-else class=\"style-form-buttons \">\n                            <LoadingButton :loading=\"loading\" class=\"block\">\n                                <button id=\"submit\" class=\"button primary full\" type=\"submit\">\n                                    <span class=\"lock icon\" />\n                                    <span>Inloggen</span>\n                                </button>\n                            </LoadingButton>\n\n                            <template v-if=\"googleConfig\">\n                                <button class=\"button secundary full\" type=\"button\" tabindex=\"-1\" @click=\"startSSO(LoginProviderType.Google)\">\n                                    <span class=\"icon\">\n                                        <img src=\"@stamhoofd/assets/images/partners/icons/google.svg\">\n                                    </span>\n                                    <span v-if=\"googleConfig.loginButtonText\">{{ googleConfig.loginButtonText }}</span>\n                                    <span v-else>Inloggen met Google</span>\n                                </button>\n                            </template>\n\n                            <template v-if=\"ssoConfig\">\n                                <button class=\"button secundary full\" type=\"button\" tabindex=\"-1\" @click=\"startSSO(LoginProviderType.SSO)\">\n                                    <span v-if=\"ssoConfig.loginButtonText\">{{ ssoConfig.loginButtonText }}</span>\n                                    <span v-else-if=\"!passwordConfig\">Inloggen</span>\n                                    <span v-else>Inloggen via SSO</span>\n                                </button>\n                            </template>\n                        </div>\n\n                        <hr>\n                        <p class=\"style-description-small\">\n                            Of maak een nieuw account aan als je nog geen account hebt. Gebruik bij voorkeur een e-mailadres waarnaar we je al e-mails sturen.\n                        </p>\n\n                        <button class=\"button text selected\" type=\"button\" tabindex=\"-1\" @click=\"openSignup\">\n                            <span>Account aanmaken</span>\n                            <span class=\"icon arrow-right-small\" />\n                        </button>\n                    </template>\n                    <template v-else>\n                        <p class=\"style-description-block\">\n                            Log in via de knop hieronder.\n                        </p>\n\n                        <div class=\"style-form-buttons\">\n                            <button v-if=\"ssoConfig\" class=\"button primary full\" type=\"button\" tabindex=\"-1\" @click=\"startSSO(LoginProviderType.SSO)\">\n                                <span v-if=\"ssoConfig.loginButtonText\">{{ ssoConfig.loginButtonText }}</span>\n                                <span v-else>Inloggen</span>\n                            </button>\n                            <button v-if=\"googleConfig\" class=\"button secundary full\" type=\"button\" tabindex=\"-1\" @click=\"startSSO(LoginProviderType.Google)\">\n                                <span class=\"icon\">\n                                    <img src=\"@stamhoofd/assets/images/partners/icons/google.svg\">\n                                </span>\n                                <span v-if=\"googleConfig.loginButtonText\">{{ googleConfig.loginButtonText }}</span>\n                                <span v-else>Inloggen met Google</span>\n                            </button>\n                        </div>\n                    </template>\n                </div>\n            </div>\n\n            <PlatformFooter />\n        </main>\n    </form>\n</template>\n\n<script lang=\"ts\" setup>\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { ComponentWithProperties, defineRoutes, onCheckRoutes, UrlHelper, useDismiss, useNavigate, usePresent } from '@simonbackx/vue-app-navigation';\nimport { AppManager, LoginHelper } from '@stamhoofd/networking';\nimport { computed, onMounted, ref } from 'vue';\n\nimport { LoginMethod, LoginProviderType } from '@stamhoofd/structures';\nimport { sleep } from '@stamhoofd/utility';\nimport VersionFooter from '../context/VersionFooter.vue';\nimport { ErrorBox } from '../errors/ErrorBox';\nimport { useErrors } from '../errors/useErrors';\nimport { useContext, useLoginMethod } from '../hooks';\nimport EmailInput from '../inputs/EmailInput.vue';\nimport ConfirmEmailView from './ConfirmEmailView.vue';\nimport ForgotPasswordView from './ForgotPasswordView.vue';\nimport PlatformFooter from './PlatformFooter.vue';\n\nconst props = withDefaults(\n    defineProps<{\n        initialEmail?: string;\n        lock?: string | null;\n    }>(), {\n        initialEmail: '',\n        lock: null,\n    },\n);\n\nenum Routes {\n    ForgotPassword = 'forgotPassword',\n    Signup = 'signup',\n}\n\ndefineRoutes([\n    {\n        name: Routes.ForgotPassword,\n        url: 'wachtwoord-vergeten',\n        component: ForgotPasswordView as any,\n        paramsToProps() {\n            return {\n                initialEmail: email.value,\n            };\n        },\n    },\n    {\n        name: Routes.Signup,\n        url: 'account-aanmaken',\n        component: async () => (await import('./SignupView.vue')).default,\n        paramsToProps() {\n            return {\n                initialEmail: email.value,\n            };\n        },\n    },\n]);\n\nconst errors = useErrors();\nconst $context = useContext();\nconst present = usePresent();\nconst dismiss = useDismiss();\nconst $navigate = useNavigate();\n\nconst loading = ref(false);\nconst email = ref(props.initialEmail);\nconst password = ref('');\nconst animating = ref(true);\nconst emailInput = ref<EmailInput | null>(null);\nconst showVersionFooter = computed(() => {\n    return email.value.toLocaleLowerCase().trim() === 'stamhoofd@dev.dev';\n});\nconst context = useContext();\n\nconst passwordConfig = useLoginMethod(LoginMethod.Password);\nconst ssoConfig = useLoginMethod(LoginMethod.SSO);\nconst googleConfig = useLoginMethod(LoginMethod.Google);\n\nonCheckRoutes(() => {\n    // Try to log in on first load\n    try {\n        if (!ssoConfig.value || passwordConfig.value || googleConfig.value) {\n            return;\n        }\n        if (AppManager.shared.isNative) {\n            return;\n        }\n        const search = UrlHelper.initial.getSearchParams();\n        if (!sessionStorage.getItem('triedLogin') && !search.get('error') && !search.get('oid_rt')) {\n            sessionStorage.setItem('triedLogin', 'true');\n            startSSO(LoginProviderType.SSO, true).catch(console.error);\n        }\n    }\n    catch (e) {\n        console.error(e);\n    }\n});\n\nasync function startSSO(provider: LoginProviderType, automatic = false) {\n    if (loading.value) {\n        return;\n    }\n\n    loading.value = true;\n\n    // This will redirect, so the loading will stay forever\n    await context.value.startSSO({\n        providerType: provider,\n        prompt: automatic ? undefined : 'select_account',\n    });\n\n    sleep(5000).then(() => {\n        // In case the redirect failed for some reason\n        loading.value = false;\n    }).catch(console.error);\n}\n\nasync function submit() {\n    if (loading.value) {\n        return;\n    }\n\n    if (!passwordConfig.value) {\n        if (ssoConfig.value) {\n            await startSSO(LoginProviderType.SSO);\n            return;\n        }\n        if (googleConfig.value) {\n            await startSSO(LoginProviderType.Google);\n            return;\n        }\n        return;\n    }\n\n    const valid = await errors.validator.validate();\n\n    if (!valid) {\n        return;\n    }\n\n    if (email.value.length < 3 || password.value.length < 5) {\n        errors.errorBox = new ErrorBox(\n            new SimpleError({\n                code: 'empty_fields',\n                message: 'Je hebt geen correcte gegevens ingevuld',\n            }),\n        );\n        return;\n    }\n\n    loading.value = true;\n\n    try {\n        const result = await LoginHelper.login($context.value, email.value, password.value);\n\n        if (email.value.toLocaleLowerCase() === 'appreview@stamhoofd.be' && STAMHOOFD.APP_UPDATE_STAGING_SERVER_URL) {\n            // await Storage.keyValue.setItem('next_url_load', '/login/34541097-44dd-4c68-885e-de4f42abae4c')\n            await AppManager.shared.checkUpdates({\n                // Always load the staging build\n                customText: 'Bezig met laden...',\n                visibleDownload: true,\n                installAutomatically: true,\n                force: true,\n                channel: STAMHOOFD.APP_UPDATE_STAGING_SERVER_URL,\n                checkTimeout: 15 * 1000,\n            });\n            // await Storage.keyValue.removeItem('next_url_load')\n        }\n\n        if (result.verificationToken) {\n            await present({\n                components: [\n                    new ComponentWithProperties(ConfirmEmailView, {\n                        login: true,\n                        token: result.verificationToken,\n                        email: email.value,\n                    }),\n                ],\n                modalDisplayStyle: 'sheet',\n            });\n        }\n        else {\n            await dismiss({ force: true });\n        }\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    loading.value = false;\n}\n\nasync function gotoPasswordForgot() {\n    await $navigate(Routes.ForgotPassword);\n}\n\nasync function openSignup() {\n    await $navigate(Routes.Signup);\n}\n\nonMounted(() => {\n    if (props.initialEmail.length === 0) {\n        setTimeout(() => {\n            animating.value = false;\n            // Needed the any here because typescript is getting mad only in production mode\n            if (emailInput.value) {\n                emailInput.value.focus();\n            }\n        }, 300);\n    }\n    else {\n        setTimeout(() => {\n            // Needed the any here because typescript is getting mad only in production mode\n            animating.value = false;\n        }, 300);\n    }\n});\n</script>\n","<template>\n    <div class=\"st-view\">\n        <main class=\"center\">\n            <h1 v-if=\"organization\">Deze pagina is voor beheerders</h1>\n            <h1 v-else>Deze pagina is voor administrators</h1>\n            <p v-if=\"organization\">Oeps, deze website is enkel voor beheerders van {{ organization.name }}. Ga naar het ledenportaal als je je wilt inschrijven als lid.</p> \n            <p v-else>Oeps, deze website is enkel voor administrators. Ga naar het ledenportaal als je je wilt inschrijven als lid.</p>\n        </main>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useOrganization } from '../hooks';\n\nconst organization = useOrganization()\n</script>\n","<template>\n    <div class=\"st-view invalid-page-view\">\n        <main>\n            <h1>\n                Doorverwijzen...\n            </h1>\n\n            <p>Bezig met doorverwijzen</p>\n        </main>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\n\nconst props = defineProps<{\n    location: string;\n}>();\n\nwindow.location.href = props.location;\n</script>\n","import { UIFilterBuilder } from '@stamhoofd/components';\nimport { ObjectWithRecords, OrganizationRecordsConfiguration, PatchAnswers, RecordCategory } from '@stamhoofd/structures';\n\nexport enum RecordEditorType {\n    PlatformMember = 'PlatformMember',\n    Organization = 'Organization',\n    Registration = 'Registration',\n    Webshop = 'Webshop',\n    Document = 'Document',\n    EventNotification = 'EventNotification',\n}\n\nexport class RecordEditorSettings<T extends ObjectWithRecords> {\n    /**\n     * Whether the record questions support sensitive data\n     */\n    dataPermission = false;\n    toggleDefaultEnabled = false;\n\n    exampleValue!: T;\n    filterBuilder!: (categories: RecordCategory[]) => UIFilterBuilder;\n\n    inheritedRecordsConfiguration: OrganizationRecordsConfiguration | null = null;\n    type: RecordEditorType = RecordEditorType.PlatformMember;\n\n    constructor(options: Partial<RecordEditorSettings<T>>) {\n        Object.assign(this, options);\n    }\n}\n","<template>\n    <STListItem v-long-press=\"(e: MouseEvent) => showContextMenu(e)\" :selectable=\"true\" class=\"right-stack\" @click=\"editCategory()\" @contextmenu.prevent=\"showContextMenu\">\n        <template v-if=\"settings.toggleDefaultEnabled\" #left>\n            <Checkbox :model-value=\"category.defaultEnabled\" :disabled=\"true\" />\n        </template>\n\n        <h3 class=\"style-title-list\">\n            {{ category.name || $t('54685a94-1ae2-46f9-aa4b-03f0b3939fd3') }}\n        </h3>\n        <p v-if=\"filterDescription\" class=\"style-description-small\">\n            {{ filterDescription }}\n        </p>\n        <p v-if=\"!category.childCategories.length && !category.records.length\" class=\"style-description-small\">\n            Leeg\n        </p>\n        <p v-else class=\"style-description-small\">\n            <template v-if=\"category.records.length\">\n                {{ category.records.length }} {{ category.records.length === 1 ? \"vraag\" : \"vragen\" }}\n            </template>\n            <template v-if=\"category.childCategories.length && category.records.length\">\n                en\n            </template>\n            <template v-if=\"category.childCategories.length\">\n                {{ category.childCategories.length }} {{ category.childCategories.length === 1 ? \"categorie\" : \"categorieën\" }}\n            </template>\n        </p>\n\n        <template #right>\n            <span v-if=\"category.containsSensitiveData\" v-tooltip=\"'Vereist toestemming gegevensverzameling'\" class=\"icon privacy gray\" />\n\n            <span class=\"button icon drag gray\" @click.stop @contextmenu.stop />\n            <span class=\"icon arrow-right-small gray\" />\n        </template>\n    </STListItem>\n</template>\n\n<script setup lang=\"ts\">\nimport { PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { RecordCategory } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { propertyFilterToString } from '../../filters/UIFilter';\nimport { useEmitPatchArray, usePatchMoveUpDownSingle } from '../../hooks';\nimport { ContextMenu, ContextMenuItem } from '../../overlays/ContextMenu';\nimport { RecordEditorSettings } from '../RecordEditorSettings';\nimport { CenteredMessage } from '../../overlays/CenteredMessage';\n\nconst props = withDefaults(\n    defineProps<{\n        category: RecordCategory;\n        parentCategory?: RecordCategory | null;\n        categories: RecordCategory[];\n        settings: RecordEditorSettings<any>;\n    }>(),\n    {\n        parentCategory: null,\n    },\n);\nconst emit = defineEmits<{\n    'patch:categories': [patch: PatchableArrayAutoEncoder<RecordCategory>];\n    'edit': [category: RecordCategory];\n    'add': [category: RecordCategory | undefined];\n}>();\n\nconst filterDescription = computed(() => props.category.filter ? propertyFilterToString(props.category.filter, filterBuilderForCategory()) : '');\nconst { addArrayPatch } = useEmitPatchArray<typeof props, 'categories', RecordCategory>(props, emit, 'categories' as const);\nconst { up, down } = usePatchMoveUpDownSingle(props.category.id, props.categories, addArrayPatch);\n\nfunction showContextMenu(event: MouseEvent) {\n    const menu = new ContextMenu([\n        [\n            new ContextMenuItem({\n                name: 'Wijzig instellingen',\n                icon: 'settings',\n                action: () => editCategory(),\n            }),\n            new ContextMenuItem({\n                name: 'Categorie dupliceren',\n                icon: 'copy',\n                action: () => addCategory(props.category.duplicate()),\n            }),\n            new ContextMenuItem({\n                name: 'Categorie verwijderen',\n                icon: 'trash',\n                action: () => deleteCategory(),\n            }),\n        ],\n        [\n            new ContextMenuItem({\n                name: 'Verplaats omhoog',\n                icon: 'arrow-up',\n                action: () => {\n                    up();\n                    return true;\n                },\n            }),\n            new ContextMenuItem({\n                name: 'Verplaats omlaag',\n                icon: 'arrow-down',\n                action: () => {\n                    down();\n                    return true;\n                },\n            }),\n        ],\n        [\n            new ContextMenuItem({\n                name: 'Verplaats naar vragenlijst',\n                disabled: props.category.childCategories.length !== 0,\n                childMenu: new ContextMenu([\n                    [\n                        new ContextMenuItem({\n                            name: 'Hoofdvragenlijst',\n                            disabled: true,\n                        }),\n                    ],\n                    [\n                        ...props.categories.map(c => new ContextMenuItem({\n                            name: c.name,\n                            disabled: c.id === props.category.id,\n                            action: async () => {\n                                // Transform into a root category\n                                if (!await CenteredMessage.confirm('Ben je zeker dat je deze vragenlijst wilt verplaatsen?', 'Ja, verplaatsen', 'Deze vragenlijst zal worden verplaatst naar de gekozen vragenlijst (' + c.name + ').')) {\n                                    return;\n                                }\n\n                                const childCategoryPatch = new PatchableArray() as PatchableArrayAutoEncoder<RecordCategory>;\n                                childCategoryPatch.addPut(props.category);\n\n                                const rootPatch = new PatchableArray() as PatchableArrayAutoEncoder<RecordCategory>;\n                                rootPatch.addDelete(props.category.id);\n                                rootPatch.addPatch(RecordCategory.patch({\n                                    id: c.id,\n                                    childCategories: childCategoryPatch,\n                                }));\n\n                                emit('patch:categories', rootPatch);\n                            },\n                        })),\n                    ],\n                ]),\n            }),\n        ],\n    ]);\n    menu.show({ clickEvent: event }).catch(console.error);\n}\n\nasync function deleteCategory() {\n    if (!await CenteredMessage.confirm('Weet je zeker dat je deze vragenlijst wilt verwijderen?', 'Verwijderen', 'Nadat je hebt opgeslagen kan je dit niet meer ongedaan maken')) {\n        return;\n    }\n\n    // Note we create a patch, but don't use it internally because that would throw errors. The view itszelf is not aware of the delete\n    const arr = new PatchableArray() as PatchableArrayAutoEncoder<RecordCategory>;\n    arr.addDelete(props.category.id);\n    emit('patch:categories', arr);\n}\n\nfunction editCategory() {\n    emit('edit', props.category);\n}\n\nasync function addCategory(base?: RecordCategory) {\n    emit('add', base);\n}\n\nfunction filterBuilderForCategory() {\n    const rootIndex = props.categories.findIndex(c => c.id === props.category.id);\n    if (rootIndex === -1) {\n        return props.settings.filterBuilder([]);\n    }\n    const rootCategories = props.categories.slice(0, rootIndex + 1);\n    return props.settings.filterBuilder(rootCategories);\n}\n</script>\n","<template>\n    <div>\n        <STList v-model=\"draggableCategories\" :draggable=\"true\">\n            <template #item=\"{item: category}\">\n                <RecordCategoryRow :category=\"category\" :categories=\"categories\" :selectable=\"true\" :settings=\"settings\" @patch:categories=\"addArrayPatch\" @edit=\"editCategory\" @add=\"addCategory($event)\" />\n            </template>\n        </STList>\n\n        <p>\n            <button class=\"button text\" type=\"button\" @click=\"addCategory()\">\n                <span class=\"icon add\" />\n                <span>Nieuwe vragenlijst</span>\n            </button>\n        </p>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, usePresent } from '@simonbackx/vue-app-navigation';\nimport { RecordCategory } from '@stamhoofd/structures';\nimport { EditRecordCategoryView, RecordEditorSettings } from '..';\nimport { useDraggableArray, useEmitPatchArray } from '../../hooks';\nimport RecordCategoryRow from './RecordCategoryRow.vue';\n\nconst props = withDefaults(\n    defineProps<{\n        categories: RecordCategory[];\n        settings: RecordEditorSettings<any>;\n        allowChildCategories?: boolean;\n    }>(),\n    {\n        allowChildCategories: true,\n    },\n);\nconst emit = defineEmits(['patch:categories']);\nconst present = usePresent();\n\nconst { addArrayPatch } = useEmitPatchArray<typeof props, 'categories', RecordCategory>(props, emit, 'categories');\n\nconst draggableCategories = useDraggableArray(() => props.categories, addArrayPatch);\n\nasync function editCategory(category: RecordCategory) {\n    await present({\n        components: [\n            new ComponentWithProperties(EditRecordCategoryView, {\n                categoryId: category.id,\n                rootCategories: props.categories,\n                settings: props.settings,\n                isNew: false,\n                allowChildCategories: props.allowChildCategories,\n                saveHandler: async (patch: PatchableArrayAutoEncoder<RecordCategory>) => {\n                    addArrayPatch(patch);\n                },\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function addCategory(base?: RecordCategory) {\n    const category = base ?? RecordCategory.create({});\n    const arr = new PatchableArray() as PatchableArrayAutoEncoder<RecordCategory>;\n    arr.addPut(category);\n\n    await present({\n        components: [\n            new ComponentWithProperties(EditRecordCategoryView, {\n                categoryId: category.id,\n                rootCategories: [...props.categories, category],\n                settings: props.settings,\n                isNew: true,\n                allowChildCategories: props.allowChildCategories,\n                saveHandler: async (patch: PatchableArrayAutoEncoder<RecordCategory>) => {\n                    addArrayPatch(arr.patch(patch));\n                },\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n</script>\n","<template>\n    <STList>\n        <STListItem element-name=\"label\" :selectable=\"!dataPermissions.locked.value\">\n            <template #left>\n                <Checkbox v-model=\"dataPermissions.enabled.value\" v-tooltip=\"dataPermissions.locked.value ? 'Verplicht op een hoger niveau' : ''\" :disabled=\"dataPermissions.locked.value\" />\n            </template>\n            <p class=\"style-title-list\">\n                Toestemming gegevensverzameling\n            </p>\n        </STListItem>\n\n        <STListItem element-name=\"label\" :selectable=\"!financialSupport.locked.value\" class=\"right-stack\">\n            <template #left>\n                <Checkbox v-model=\"financialSupport.enabled.value\" v-tooltip=\"dataPermissions.locked.value ? 'Verplicht op een hoger niveau' : ''\" :disabled=\"financialSupport.locked.value\" />\n            </template>\n            <p class=\"style-title-list\">\n                {{ financialSupportSettings.title }}\n                <span v-tooltip=\"'Vereist toestemming voor gegevensverzameling'\" class=\"gray small icon privacy\" />\n            </p>\n        </STListItem>\n\n        <STListItem v-for=\"property of properties\" :key=\"property.value.title\" element-name=\"label\" :selectable=\"!property.value.locked\">\n            <template #left>\n                <Checkbox v-model=\"property.value.enabled\" v-tooltip=\"property.value.locked ? 'Verplicht op een hoger niveau' : ''\" :disabled=\"property.value.locked\" />\n            </template>\n\n            <p v-if=\"property.value.configuration\" class=\"style-title-prefix-list\">\n                {{ propertyFilterToString(property.value.configuration, filterBuilder) }}\n            </p>\n\n            <p class=\"style-title-list\">\n                {{ property.value.title }}\n            </p>\n            <p v-if=\"property.value.description\" class=\"style-description-small\">\n                {{ property.value.description }}\n            </p>\n\n            <p v-if=\"!groupLevel && property.value.configuration && property.value.configuration.isAlwaysEnabledAndRequired && property.value.options?.preventAlways\" class=\"error-box\">\n                {{ property.value.options?.warning ?? 'Dit werd onjuist ingesteld' }}\n            </p>\n\n            <template v-if=\"!property.value.locked && property.value.enabled\" #right>\n                <button class=\"button gray icon settings\" type=\"button\" @click.stop=\"property.value.edit\" />\n            </template>\n        </STListItem>\n\n        <STListItem v-for=\"category of inheritedRecordsConfiguration?.recordCategories ?? []\" :key=\"category.id\" element-name=\"label\" :selectable=\"!getRefForInheritedCategory(category.id).value.locked\" class=\"right-stack\">\n            <template #left>\n                <Checkbox v-model=\"getRefForInheritedCategory(category.id).value.enabled\" v-tooltip=\"getRefForInheritedCategory(category.id).value.locked ? 'Verplicht op een hoger niveau' : ''\" :disabled=\"getRefForInheritedCategory(category.id).value.locked\" />\n            </template>\n\n            <p v-if=\"getRefForInheritedCategory(category.id).value.configuration\" class=\"style-title-prefix-list\">\n                {{ propertyFilterToString(getRefForInheritedCategory(category.id).value.configuration!, filterBuilder) }}\n            </p>\n            <p class=\"style-title-list\">\n                {{ getRefForInheritedCategory(category.id).value.title }}\n                <span v-if=\"getRefForInheritedCategory(category.id).value.requiresDataPermissions\" v-tooltip=\"'Vereist toestemming voor gegevensverzameling'\" class=\"gray icon privacy small\" />\n            </p>\n            <template #right>\n                <button class=\"button gray icon eye\" type=\"button\" @click.stop=\"previewCategory(category)\" />\n                <button v-if=\"!getRefForInheritedCategory(category.id).value.locked && getRefForInheritedCategory(category.id).value.enabled\" class=\"button gray icon settings\" type=\"button\" @click.stop=\"getRefForInheritedCategory(category.id).value.edit\" />\n            </template>\n        </STListItem>\n    </STList>\n</template>\n\n<script setup lang=\"ts\">\nimport { PatchMap } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, usePresent } from '@simonbackx/vue-app-navigation';\nimport { NavigationActions, PropertyFilterView, Toast, memberWithRegistrationsBlobUIFilterBuilders, propertyFilterToString, useEmitPatch, useFinancialSupportSettings, useOrganization } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { BooleanStatus, MemberDetails, MemberPropertyWithFilter, MemberWithRegistrationsBlob, Organization, OrganizationRecordsConfiguration, PatchAnswers, Platform, PlatformFamily, PlatformMember, PropertyFilter, RecordCategory } from '@stamhoofd/structures';\nimport { computed, ref, watchEffect } from 'vue';\nimport FillRecordCategoryView from '../FillRecordCategoryView.vue';\nimport { RecordEditorSettings, RecordEditorType } from '../RecordEditorSettings';\n\nconst props = withDefaults(\n    defineProps<{\n        recordsConfiguration: OrganizationRecordsConfiguration;\n        inheritedRecordsConfiguration?: OrganizationRecordsConfiguration | null;\n        overrideOrganization?: Organization | null;\n        groupLevel?: boolean;\n    }>(),\n    {\n        inheritedRecordsConfiguration: null,\n        overrideOrganization: null,\n        groupLevel: false,\n    },\n);\n\nconst emit = defineEmits(['patch:recordsConfiguration']);\nconst { patched, addPatch } = useEmitPatch<OrganizationRecordsConfiguration>(props, emit, 'recordsConfiguration');\nconst $t = useTranslate();\nconst baseOrg = useOrganization();\nconst organization = computed(() => props.overrideOrganization ?? baseOrg.value);\nconst present = usePresent();\nconst filterBuilder = memberWithRegistrationsBlobUIFilterBuilders[0];\nconst { financialSupportSettings } = useFinancialSupportSettings();\n\nconst family = new PlatformFamily({\n    platform: Platform.shared,\n    contextOrganization: organization.value,\n});\n\nconst settings = new RecordEditorSettings({\n    type: RecordEditorType.PlatformMember,\n    dataPermission: true,\n    toggleDefaultEnabled: !props.inheritedRecordsConfiguration,\n    filterBuilder: (categories: RecordCategory[]) => {\n        return memberWithRegistrationsBlobUIFilterBuilders[0];\n    },\n    exampleValue: new PlatformMember({\n        member: MemberWithRegistrationsBlob.create({\n            details: MemberDetails.create({\n                firstName: 'Voorbeeld',\n                lastName: 'Lid',\n                dataPermissions: BooleanStatus.create({ value: true }),\n                birthDay: new Date('2020-01-01'),\n            }),\n            users: [],\n            registrations: [],\n        }),\n        isNew: true,\n        family,\n    }),\n});\nfamily.members.push(settings.exampleValue);\n\nconst properties = [\n    buildPropertyRefs('gender', 'Gender'),\n    buildPropertyRefs('birthDay', 'Geboortedatum'),\n    buildPropertyRefs('nationalRegisterNumber', 'Rijksregisternummer'),\n    buildPropertyRefs('parents', 'Oudergegevens', {\n        description: 'Naam, adres, e-mailadres en telefoonnummer van één of meerdere (plus)ouders',\n    }),\n    buildPropertyRefs('phone', $t('90d84282-3274-4d85-81cd-b2ae95429c34') + ' (van lid zelf)', {\n        description: 'Het GSM-nummer van de ouders wordt al verzameld via de oudergegevens. Activeer dit enkel voor leden die ook echt een eigen GSM-nummer kunnen hebben, en maak het enkel verplicht als je zeker weet dat iedereen een GSM-nummer heeft.',\n        warning: 'Maak dit niet verplicht voor alle leden, anders moeten minderjarige leden ook verplicht een eigen GSM-nummer invullen, wat ze vaak niet hebben. Denk goed na over wat je instelt.',\n        preventAlways: true,\n    }),\n    buildPropertyRefs('emailAddress', 'E-mailadres (van lid zelf)', {\n        description: 'Het e-mailadres van de ouders wordt al verzameld via de oudergegevens. Activeer dit enkel voor leden die ook echt een eigen e-mailadres kunnen hebben, en maak het enkel verplicht als je zeker weet dat iedereen een e-mailadres heeft.',\n        warning: 'Maak dit niet verplicht voor alle leden, anders moeten erg jonge leden ook verplicht een eigen e-mailadres invullen, wat ze vaak niet hebben. Denk goed na over wat je instelt.',\n        preventAlways: true,\n    }),\n    buildPropertyRefs('address', 'Adres (van lid zelf)', {\n        description: 'Het adres van elke ouder wordt al verzameld via de oudergegevens. We raden af om dit te activeren voor minderjarige leden. Bij ouders kan er namelijk per ouder een apart adres ingesteld worden, wat beter geschikt is. Enkel voor volwassen leden is dit beter aangewezen.',\n        warning: 'We raden heel sterk af om dit in te schakelen voor minderjarige leden. Gebruik een leeftijdsfilter om dit enkel in te schakelen voor volwassen leden.',\n        preventAlways: true,\n    }),\n    buildPropertyRefs('emergencyContacts', 'Extra noodcontactpersonen', {\n        description: 'Naam, relatie en telefoonnummer van één of meerdere noodcontactpersonen (als uitbreiding op ouders, niet de ouders zelf)',\n    }),\n    buildPropertyRefs('uitpasNumber', 'UiTPAS-nummer', {\n        warning: 'Maak dit niet verplicht voor alle leden anders moet iedereen verplicht een UiTPAS-nummer invullen, wat niet iedereen heeft.',\n        preventAlways: true,\n    }),\n];\n\nwatchEffect(() => {\n    // Clear locked properties\n    for (const property of properties) {\n        if (property.value.locked && patched.value[property.value.name]) {\n            addPatch({ [property.value.name]: null });\n        }\n    }\n});\n\nconst dataPermissions = {\n    locked: computed(() => !!props.inheritedRecordsConfiguration?.dataPermission && !patched.value.dataPermission),\n    enabled: computed({\n        get: () => !!props.inheritedRecordsConfiguration?.dataPermission || patched.value.dataPermission,\n        set: (value: boolean) => {\n            addPatch({\n                dataPermission: value,\n            });\n        },\n    }),\n};\n\nconst financialSupport = {\n    locked: computed(() => !!props.inheritedRecordsConfiguration?.financialSupport && !patched.value.financialSupport),\n    enabled: computed({\n        get: () => !!props.inheritedRecordsConfiguration?.financialSupport || patched.value.financialSupport,\n        set: (value: boolean) => {\n            if (value) {\n                if (!dataPermissions.enabled.value) {\n                    Toast.error('De financiële status van een lid is gevoelige informatie en vereist toestemming voor gegevensverzameling').show();\n                    return;\n                }\n                addPatch({\n                    financialSupport: true,\n                });\n            }\n            else {\n                addPatch({\n                    financialSupport: false,\n                });\n            }\n        },\n    }),\n};\n\n// Methods\nfunction buildPropertyRefs(property: MemberPropertyWithFilter, title: string, options?: { warning?: string; description?: string; preventAlways?: boolean }) {\n    const locked = computed(() => !!props.inheritedRecordsConfiguration?.[property] && !patched.value[property]);\n    const enabled = computed({\n        get: () => !!getFilterConfiguration(property),\n        set: (value: boolean) => {\n            if (value) {\n                // Show dialog\n                editPropertyFilterConfiguration(property, title, options).catch(console.error);\n            }\n            else {\n                setEnableProperty(property, value);\n            }\n        },\n    });\n    const configuration = computed(() => getFilterConfiguration(property));\n\n    return ref({\n        name: property,\n        title,\n        description: options?.description,\n        options,\n        enabled,\n        locked,\n        configuration,\n        edit: () => editPropertyFilterConfiguration(property, title, options),\n    });\n}\n\nfunction getFilterConfiguration(property: MemberPropertyWithFilter): PropertyFilter | null {\n    return props.inheritedRecordsConfiguration?.[property] ?? patched.value[property];\n}\n\nfunction setEnableProperty(property: MemberPropertyWithFilter, enable: boolean) {\n    if (props.inheritedRecordsConfiguration?.[property]) {\n        return;\n    }\n    if (enable === !!getFilterConfiguration(property)) {\n        return;\n    }\n    if (enable) {\n        addPatch({\n            [property]: props.recordsConfiguration[property] ?? PropertyFilter.createDefault(),\n        });\n    }\n    else {\n        addPatch({\n            [property]: null,\n        });\n    }\n}\n\nasync function editPropertyFilterConfiguration(property: MemberPropertyWithFilter, title: string, options?: { warning?: string; description?: string }) {\n    await present({\n        components: [\n            new ComponentWithProperties(PropertyFilterView, {\n                configuration: getFilterConfiguration(property) ?? PropertyFilter.createDefault(),\n                title,\n                options,\n                builder: settings.filterBuilder([]),\n                setConfiguration: (configuration: PropertyFilter) => {\n                    addPatch({\n                        [property]: configuration,\n                    });\n                },\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\n// Inherited categories\nconst cachedInheritedCategories = new Map<string, ReturnType<typeof buildRefForInheritedCategory>>();\nfunction getRefForInheritedCategory(categoryId: string) {\n    if (!cachedInheritedCategories.has(categoryId)) {\n        cachedInheritedCategories.set(categoryId, buildRefForInheritedCategory(categoryId));\n    }\n    return cachedInheritedCategories.get(categoryId)!;\n}\n\nfunction buildRefForInheritedCategory(categoryId: string) {\n    const category = computed(() => props.inheritedRecordsConfiguration?.recordCategories?.find(c => c.id === categoryId));\n\n    const requiresDataPermissions = computed(() => !!category.value?.containsSensitiveData);\n\n    const locked = computed(() => !category.value || category.value.defaultEnabled);\n    const enabled = computed({\n        get: () => locked.value || !!patched.value.inheritedRecordCategories.has(categoryId),\n        set: (enable: boolean) => {\n            if (enable === enabled.value) {\n                return;\n            }\n            const patchMap = new PatchMap() as PatchMap<string, PropertyFilter | null>;\n\n            if (enable) {\n                if (requiresDataPermissions.value && !dataPermissions.enabled.value) {\n                    Toast.error('Deze vragenlijst bevat gegevens waar je toestemming voor moet vragen. Schakel de toestemming voor gegevevensverzameling in om deze vragenlijst te activeren.').show();\n                    return;\n                }\n\n                // Set\n                patchMap.set(\n                    categoryId,\n                    // Reuse saved one in case of accidental disable - enable\n                    props.recordsConfiguration.inheritedRecordCategories.get(categoryId) ?? PropertyFilter.createDefault(),\n                );\n            }\n            else {\n                // Remove\n                patchMap.set(categoryId, null);\n            }\n            addPatch({\n                inheritedRecordCategories: patchMap,\n            });\n        },\n    });\n    const configuration = computed(() => enabled.value ? (patched.value.inheritedRecordCategories.get(categoryId) ?? category.value?.filter ?? PropertyFilter.createDefault()) : null);\n\n    return ref({\n        title: category.value?.name ?? 'Naamloos',\n        enabled,\n        locked,\n        configuration,\n        requiresDataPermissions,\n        edit: async () => {\n            await editInheritedFilterConfiguration(categoryId);\n        },\n    });\n}\n\nasync function editInheritedFilterConfiguration(categoryId: string) {\n    const category = props.inheritedRecordsConfiguration?.recordCategories?.find(c => c.id === categoryId);\n    if (!category) {\n        return;\n    }\n\n    await present({\n        components: [\n            new ComponentWithProperties(PropertyFilterView, {\n                configuration: props.recordsConfiguration.inheritedRecordCategories.get(categoryId) ?? PropertyFilter.createDefault(),\n                title: category.name,\n                builder: settings.filterBuilder([]),\n                setConfiguration: (configuration: PropertyFilter) => {\n                    const patchMap = new PatchMap() as PatchMap<string, PropertyFilter | null>;\n                    patchMap.set(\n                        categoryId,\n                        configuration,\n                    );\n\n                    addPatch({\n                        inheritedRecordCategories: patchMap,\n                    });\n                },\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function previewCategory(category: RecordCategory) {\n    await present({\n        components: [\n            new ComponentWithProperties(FillRecordCategoryView, {\n                category: category.patch({\n                    // Disable filter on category level for the preview, since these cannot work\n                    filter: null,\n                    defaultEnabled: true,\n                }),\n                value: settings.exampleValue,\n                forceMarkReviewed: true,\n                saveHandler: async (_patch: PatchAnswers, navigate: NavigationActions) => {\n                    await navigate.pop({ force: true });\n                },\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n</script>\n","<template>\n    <SaveView :loading=\"false\" :title=\"title\" :disabled=\"!hasChanges\" @save=\"save\">\n        <h1>\n            {{ title }}\n        </h1>\n        \n        <STErrorsDefault :error-box=\"errorBox\" />\n\n        <STInputBox title=\"Naam\" error-fields=\"name\" :error-box=\"errorBox\">\n            <input\n                ref=\"firstInput\"\n                v-model=\"name\"\n                class=\"input\"\n                type=\"text\"\n                placeholder=\"Naam van deze keuze\"\n                autocomplete=\"off\"\n            >\n        </STInputBox>\n    \n        <STInputBox title=\"Beschrijving\" error-fields=\"description\" :error-box=\"errorBox\" class=\"max\">\n            <textarea\n                v-model=\"description\"\n                class=\"input\"\n                type=\"text\"\n                placeholder=\"Optioneel\"\n                autocomplete=\"off\"\n            />\n        </STInputBox>\n\n        <hr>\n        <h2>Waarschuwing</h2>\n        <p>Soms wil je dat iets opvalt voor beheerders, dat kan je bereiken met waarschuwingen.</p>\n\n        <STList>\n            <STListItem :selectable=\"true\" element-name=\"label\">\n                <template #left>\n                    <Radio v-model=\"warningInverted\" :value=\"null\" name=\"warningInverted\" />\n                </template>\n                <h3 class=\"style-title-list\">\n                    Geen waarschuwing\n                </h3>\n            </STListItem>\n\n            <STListItem :selectable=\"true\" element-name=\"label\">\n                <template #left>\n                    <Radio v-model=\"warningInverted\" :value=\"false\" name=\"warningInverted\" />\n                </template>\n                <h3 class=\"style-title-list\">\n                    Waarschuwing als aangevinkt\n                </h3>\n            </STListItem>\n\n            <STListItem :selectable=\"true\" element-name=\"label\">\n                <template #left>\n                    <Radio v-model=\"warningInverted\" :value=\"true\" name=\"warningInverted\" />\n                </template>\n                <h3 class=\"style-title-list\">\n                    Waarschuwing als niet aangevinkt\n                </h3>\n            </STListItem>\n        </STList>\n\n        <STInputBox v-if=\"warningText !== null\" title=\"Waarschuwingstekst\" error-fields=\"label\" :error-box=\"errorBox\" class=\"max\">\n            <input\n                v-model=\"warningText\"\n                class=\"input\"\n                type=\"text\"\n                placeholder=\"bv. 'Geen toestemming om foto's te maken'\"\n                autocomplete=\"off\"\n            >\n        </STInputBox>\n\n        <STInputBox v-if=\"warningType\" class=\"max\" title=\"Type\">\n            <STList>\n                <STListItem :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio v-model=\"warningType\" :value=\"RecordWarningType.Info\" name=\"warningType\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        Informatief\n                    </h3>\n                    <p class=\"style-description-small\">\n                        Grijze achtergrond. Voor minder belangrijke zaken\n                    </p>\n                </STListItem>\n\n                <STListItem :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio v-model=\"warningType\" :value=\"RecordWarningType.Warning\" name=\"warningType\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        Waarschuwing\n                    </h3>\n                    <p class=\"style-description-small\">\n                        Gele achtergrond\n                    </p>\n                </STListItem>\n\n                <STListItem :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio v-model=\"warningType\" :value=\"RecordWarningType.Error\" name=\"warningType\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        Foutmelding\n                    </h3>\n                    <p class=\"style-description-small\">\n                        Voor zaken die echt heel belangrijk zijn. Probeer dit weinig te gebruiken, zet niet alles op 'foutmelding', anders valt het niet meer op.\n                    </p>\n                </STListItem>\n            </STList>\n        </STInputBox>\n        <div v-if=\"!isNew\" class=\"container\">\n            <hr>\n            <h2>\n                Optie verwijderen\n            </h2>\n\n            <button class=\"button secundary danger\" type=\"button\" @click=\"deleteMe\">\n                <span class=\"icon trash\" />\n                <span>Verwijderen</span>\n            </button>\n        </div>\n    </SaveView>\n</template>\n\n<script lang=\"ts\">\nimport { AutoEncoderPatchType, PatchableArray, PatchableArrayAutoEncoder, patchContainsChanges } from '@simonbackx/simple-encoding';\nimport { NavigationMixin } from \"@simonbackx/vue-app-navigation\";\nimport { CenteredMessage, ErrorBox, Radio, SaveView, STErrorsDefault, STInputBox, STList, STListItem, Validator } from \"@stamhoofd/components\";\nimport { RecordChoice, RecordSettings, RecordWarning, RecordWarningType, Version } from \"@stamhoofd/structures\";\nimport { Component, Mixins, Prop } from \"@simonbackx/vue-app-navigation/classes\";\n\n@Component({\n    components: {\n        SaveView,\n        STInputBox,\n        STErrorsDefault,\n        STList,\n        STListItem,\n        Radio\n    },\n})\nexport default class EditRecordChoiceView extends Mixins(NavigationMixin) {\n    errorBox: ErrorBox | null = null\n    validator = new Validator()\n\n    @Prop({ required: true })\n    choice!: RecordChoice\n\n    @Prop({ required: false, default: null })\n    parentCategory!: RecordSettings | null\n\n    @Prop({ required: true })\n    isNew!: boolean\n\n    patchChoice: AutoEncoderPatchType<RecordChoice> = RecordChoice.patch({ id: this.choice.id })\n\n    @Prop({ required: true })\n    saveHandler: (patch: PatchableArrayAutoEncoder<RecordChoice>) => void;\n\n    get RecordWarningType() {\n        return RecordWarningType\n    }\n\n    get patchedChoice() {\n        return this.choice.patch(this.patchChoice)\n    }\n\n    get title(): string {\n        if (this.isNew) {\n            return \"Nieuwe optie\"\n        }\n        return \"Optie bewerken\"\n    }\n\n    get name() {\n        return this.patchedChoice.name\n    }\n\n    set name(name: string) {\n        this.patchChoice = this.patchChoice.patch({ name })\n    }\n\n    get description() {\n        return this.patchedChoice.description\n    }\n\n    set description(description: string) {\n        this.patchChoice = this.patchChoice.patch({ description })\n    }\n\n    get warningInverted() {\n        return this.patchedChoice.warning?.inverted ?? null\n    }\n\n    set warningInverted(inverted: boolean | null) {\n        if (inverted === null) {\n            this.patchChoice = this.patchChoice.patch({ \n                warning: null\n            })\n            return\n        }\n        if (this.warningInverted === null) {\n            this.patchChoice = this.patchChoice.patch({ \n                warning: RecordWarning.create({\n                    inverted\n                })\n            })\n        } else {\n            this.patchChoice = this.patchChoice.patch({ \n                warning: RecordWarning.patch({\n                    inverted\n                })\n            })\n        }\n    }\n\n    get warningText() {\n        return this.patchedChoice.warning?.text ?? null\n    }\n\n    set warningText(text: string | null) {\n        if (text === null) {\n            this.patchChoice = this.patchChoice.patch({ \n                warning: null\n            })\n            return\n        }\n        if (this.warningText === null) {\n            this.patchChoice = this.patchChoice.patch({ \n                warning: RecordWarning.create({\n                    text\n                })\n            })\n        } else {\n            this.patchChoice = this.patchChoice.patch({ \n                warning: RecordWarning.patch({\n                    text\n                })\n            })\n        }\n    }\n\n    get warningType() {\n        return this.patchedChoice.warning?.type ?? null\n    }\n\n    set warningType(type: RecordWarningType | null) {\n        if (type === null) {\n            this.patchChoice = this.patchChoice.patch({ \n                warning: null\n            })\n            return\n        }\n        if (this.warningType === null) {\n            this.patchChoice = this.patchChoice.patch({ \n                warning: RecordWarning.create({\n                    type\n                })\n            })\n        } else {\n            this.patchChoice = this.patchChoice.patch({ \n                warning: RecordWarning.patch({\n                    type\n                })\n            })\n        }\n    }\n\n    addPatch(patch: AutoEncoderPatchType<RecordChoice>) {\n        this.patchChoice = this.patchChoice.patch(patch)\n    }\n\n    async save() {\n        const isValid = await this.validator.validate()\n        if (!isValid) {\n            return\n        }\n\n        const arrayPatch: PatchableArrayAutoEncoder<RecordChoice> = new PatchableArray()\n\n        if (this.isNew) {\n            arrayPatch.addPut(this.patchedChoice)\n        } else {\n            arrayPatch.addPatch(this.patchChoice)\n        }\n\n        this.saveHandler(arrayPatch)\n        this.pop({ force: true })\n    }\n\n    async deleteMe() {\n        if (!await CenteredMessage.confirm(\"Ben je zeker dat je deze optie wilt verwijderen?\", \"Verwijderen\")) {\n            return\n        }\n\n        if (this.isNew) {\n            // do nothing\n            this.pop({ force: true })\n            return\n        }\n\n        const arrayPatch: PatchableArrayAutoEncoder<RecordChoice> = new PatchableArray()\n        arrayPatch.addDelete(this.choice.id)\n\n        this.saveHandler(arrayPatch)\n        this.pop({ force: true })\n    }\n\n    cancel() {\n        this.pop()\n    }\n\n    get hasChanges() {\n        return patchContainsChanges(this.patchChoice, this.choice, { version: Version })\n    }\n\n    async shouldNavigateAway() {\n        if (!this.hasChanges) {\n            return true\n        }\n        return await CenteredMessage.confirm(\"Ben je zeker dat je wilt sluiten zonder op te slaan?\", \"Niet opslaan\")\n    }\n\n    \n}\n</script>\n","<template>\n    <div class=\"st-view preview-record-view\">\n        <STNavigationBar title=\"Voorbeeld\" />\n\n        <main>\n            <h1>\n                Voorbeeld bekijken\n            </h1>\n            <p>Hieronder zie je hoe het formulier van de vraag/kenmerk eruit ziet.</p>\n\n            <hr>\n        \n            <RecordAnswerInput :record=\"record\" :answers=\"recordAnswers\" :validator=\"validator\" @patch=\"addPatch\" />\n\n            <div v-if=\"isDevelopment\" class=\"container\">\n                <hr>\n                <p class=\"style-description pre-wrap\" v-text=\"encodedResult\" />\n            </div>\n        </main>\n\n        <STToolbar>\n            <template #right>\n                <button class=\"button secundary\" type=\"button\" @click=\"dismiss\">\n                    Sluiten\n                </button>\n            </template>\n        </STToolbar>\n    </div>\n</template>\n\n<script lang=\"ts\">\nimport { encodeObject } from \"@simonbackx/simple-encoding\";\nimport { NavigationMixin } from \"@simonbackx/vue-app-navigation\";\nimport { Component, Mixins, Prop } from \"@simonbackx/vue-app-navigation/classes\";\nimport { RecordAnswerInput, Spinner, STErrorsDefault, STInputBox, STList, STListItem, STNavigationBar, STToolbar, Validator } from \"@stamhoofd/components\";\nimport { PatchAnswers, RecordAnswer, RecordSettings, Version } from \"@stamhoofd/structures\";\n\n\n@Component({\n    components: {\n        STNavigationBar,\n        STToolbar,\n        STInputBox,\n        STErrorsDefault,\n        Spinner,\n        STList,\n        STListItem,\n        RecordAnswerInput\n    },\n})\nexport default class PreviewRecordView extends Mixins(NavigationMixin) {\n    @Prop({ required: true })\n        record!: RecordSettings\n\n    validator = new Validator()\n\n    recordAnswers: Map<string, RecordAnswer> = new Map()\n\n    get encodedResult() {\n        return encodeObject(this.recordAnswers, { version: Version })\n    }\n\n    get isDevelopment() {\n        return STAMHOOFD.environment === \"development\"\n    }\n\n    addPatch(patch: PatchAnswers) {\n        this.recordAnswers = patch.applyTo(this.recordAnswers)\n    }\n}\n</script>\n","<template>\n    <STListItem v-long-press=\"(e) => showContextMenu(e)\" :selectable=\"true\" class=\"right-stack\" @click=\"editChoice()\" @contextmenu.prevent=\"showContextMenu\">\n        <h3 class=\"style-title-list\">\n            {{ choice.name }}\n        </h3>\n        <p v-if=\"choice.description\" class=\"style-description-small\">\n            {{ choice.description }}\n        </p>\n\n        <template #right>\n            <span class=\"button icon drag gray\" @click.stop @contextmenu.stop />\n            <span class=\"icon arrow-right-small gray\" />\n        </template>\n    </STListItem>\n</template>\n\n<script lang=\"ts\">\nimport { PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, NavigationMixin } from \"@simonbackx/vue-app-navigation\";\nimport { ContextMenu, ContextMenuItem, STListItem } from \"@stamhoofd/components\";\nimport { RecordChoice, RecordSettings } from '@stamhoofd/structures';\nimport { Component, Mixins,Prop } from \"@simonbackx/vue-app-navigation/classes\";\n\nimport EditRecordChoiceView from '../EditRecordChoiceView.vue';\n\n@Component({\n    components: {\n        STListItem\n    },\n})\nexport default class ChoiceRow extends Mixins(NavigationMixin) {\n    @Prop({ required: true })\n    choice: RecordChoice\n\n    @Prop({ required: true })\n    parentRecord: RecordSettings\n\n    get choices(): RecordChoice[] {\n        return this.parentRecord.choices\n    }\n\n    editChoice() {\n        this.present(new ComponentWithProperties(EditRecordChoiceView, {\n            choice: this.choice,\n            parentRecord: this.parentRecord,\n            isNew: false,\n            saveHandler: (patch: PatchableArrayAutoEncoder<RecordChoice>) => {\n                this.addPatch(patch)\n            }\n        }).setDisplayStyle(\"popup\"))\n    }\n\n    addPatch(patch: PatchableArrayAutoEncoder<RecordChoice>) {\n        this.$emit(\"patch\", patch)\n    }\n\n    moveUp() {\n        const index = this.choices.findIndex(c => c.id === this.choice.id)\n        if (index === -1 || index === 0) {\n            return;\n        }\n\n        const moveTo = index - 2\n        const p: PatchableArrayAutoEncoder<RecordChoice> = new PatchableArray()\n        p.addMove(this.choice.id, this.choices[moveTo]?.id ?? null)\n        this.addPatch(p)\n    }\n     \n    moveDown() {\n        const index = this.choices.findIndex(c => c.id === this.choice.id)\n        if (index === -1 || index >= this.choices.length - 1) {\n            return;\n        }\n\n        const moveTo = index + 1\n        const p: PatchableArrayAutoEncoder<RecordChoice> = new PatchableArray()\n        p.addMove(this.choice.id, this.choices[moveTo]?.id ?? null)\n        this.addPatch(p)\n    }\n\n    showContextMenu(event) {\n        const menu = new ContextMenu([\n            [\n                new ContextMenuItem({\n                    name: \"Verplaats omhoog\",\n                    icon: \"arrow-up\",\n                    action: () => {\n                        this.moveUp()\n                        return true;\n                    }\n                }),\n                new ContextMenuItem({\n                    name: \"Verplaats omlaag\",\n                    icon: \"arrow-down\",\n                    action: () => {\n                        this.moveDown()\n                        return true;\n                    }\n                }),\n            ]\n        ])\n        menu.show({ clickEvent: event }).catch(console.error)\n    }\n}\n</script>\n","<template>\n    <SaveView :loading=\"false\" :title=\"title\" :disabled=\"!hasChanges\" @save=\"save\" v-on=\"!isNew ? {delete: deleteMe} : {}\">\n        <h1 class=\"style-navigation-title\">\n            {{ title }}\n        </h1>\n        <p>\n            Lees <a :href=\"$domains.getDocs('vragenlijsten-instellen')\" class=\"inline-link\" target=\"_blank\">hier</a> meer informatie na over hoe je een vraag kan instellen.\n        </p>\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <div class=\"split-inputs\">\n            <div>\n                <STInputBox title=\"Naam (kort)\" error-fields=\"name\" :error-box=\"errors.errorBox\">\n                    <input\n                        ref=\"firstInput\"\n                        v-model=\"name\"\n                        class=\"input\"\n                        type=\"text\"\n                        placeholder=\"bv. Toestemming publicatie foto’s\"\n                        autocomplete=\"off\"\n                        enterkeyhint=\"next\"\n                    >\n                </STInputBox>\n            </div>\n\n            <div>\n                <STInputBox title=\"Type\" error-fields=\"type\" :error-box=\"errors.errorBox\">\n                    <Dropdown v-model=\"type\">\n                        <optgroup v-for=\"group in availableTypes\" :key=\"group.name\" :label=\"group.name\">\n                            <option v-for=\"_type in group.values\" :key=\"_type.value\" :value=\"_type.value\">\n                                {{ _type.name }}\n                            </option>\n                        </optgroup>\n                    </Dropdown>\n                </STInputBox>\n\n                <STInputBox v-if=\"type === RecordType.File\" title=\"Bestandtype\" error-fields=\"fileType\" :error-box=\"errors.errorBox\">\n                    <Dropdown v-model=\"fileType\">\n                        <option v-for=\"item in availableFileTypes\" :key=\"item.value\" :value=\"item.value\">\n                            {{ item.name }}\n                        </option>\n                    </Dropdown>\n                </STInputBox>\n            </div>\n        </div>\n\n        <Checkbox v-model=\"required\">\n            {{ requiredText }}\n        </Checkbox>\n        <Checkbox v-if=\"type === RecordType.Checkbox\" v-model=\"askComments\">\n            Voeg tekstvak toe indien aangevinkt\n        </Checkbox>\n\n        <div v-if=\"type === RecordType.MultipleChoice || type === RecordType.ChooseOne\" class=\"container\">\n            <hr>\n            <h2 class=\"style-with-button with-list\">\n                <div>Keuzeopties</div>\n                <div>\n                    <button class=\"button text\" type=\"button\" @click=\"addChoice\">\n                        <span class=\"icon add\" />\n                        <span>Nieuw</span>\n                    </button>\n                </div>\n            </h2>\n\n            <STList v-if=\"patchedRecord.choices.length > 0\" v-model=\"choices\" :draggable=\"true\">\n                <template #item=\"{item: choice}\">\n                    <RecordChoiceRow :choice=\"choice\" :parent-record=\"patchedRecord\" :selectable=\"true\" @patch=\"addChoicesPatch\" />\n                </template>\n            </STList>\n\n            <p v-else class=\"info-box\">\n                <span>Geen keuzemogelijkheden. Voeg een keuze toe via de <span class=\"icon add middle\" />-knop.</span>\n            </p>\n        </div>\n\n        <hr>\n        <h2 class=\"style-with-button\">\n            <div>Beschrijving</div>\n            <div>\n                <button class=\"button text\" type=\"button\" @click=\"openPreview\">\n                    <span class=\"icon eye\" />\n                    <span>Voorbeeld</span>\n                </button>\n            </div>\n        </h2>\n        <p>Bepaal hoe men deze vraag kan beantwoorden door extra verduidelijking te voorzien.</p>\n\n        <STInputBox :title=\"labelTitle\" error-fields=\"label\" :error-box=\"errors.errorBox\" class=\"max\">\n            <input\n                v-model=\"label\"\n                class=\"input\"\n                type=\"text\"\n                :placeholder=\"name\"\n                autocomplete=\"off\"\n                enterkeyhint=\"next\"\n            >\n        </STInputBox>\n\n        <STInputBox :title=\"descriptionTitle\" error-fields=\"description\" :error-box=\"errors.errorBox\" class=\"max\">\n            <textarea\n                v-model=\"description\"\n                class=\"input\"\n                type=\"text\"\n                placeholder=\"Optioneel\"\n                autocomplete=\"off\"\n            />\n        </STInputBox>\n        <p class=\"style-description-small\">\n            Gebruik deze tekst voor een langere uitleg bij het instellen van dit kenmerk, enkel indien dat echt nodig is.\n        </p>\n\n        <STInputBox v-if=\"shouldAskInputPlaceholder\" title=\"Tekst in leeg tekstvak\" error-fields=\"label\" :error-box=\"errors.errorBox\" class=\"max\">\n            <input\n                v-model=\"inputPlaceholder\"\n                class=\"input\"\n                type=\"text\"\n                placeholder=\"bv. 'Vul hier jouw naam in'\"\n                autocomplete=\"off\"\n            >\n        </STInputBox>\n        <p class=\"style-description-small\">\n            Het is netter als je een tekst in lege tekstvakken instelt. Je kan van deze plaats gebruik maken om een voorbeeld te geven, om het duidelijker te maken (zoals we zelf doen hierboven).\n        </p>\n\n        <STInputBox v-if=\"shouldAskCommentsDescription\" title=\"Tekst onder tekstvak\" error-fields=\"label\" :error-box=\"errors.errorBox\" class=\"max\">\n            <textarea\n                v-model=\"commentsDescription\"\n                class=\"input\"\n                type=\"text\"\n                placeholder=\"Optioneel\"\n                autocomplete=\"off\"\n            />\n        </STInputBox>\n        <p v-if=\"shouldAskCommentsDescription\" class=\"style-description-small\">\n            Laat hier eventueel extra instructies achter onder het tekstveld, als het aankruisvakje is aangevinkt.\n        </p>\n\n        <template v-if=\"showExternalPermissionLevel\">\n            <hr>\n            <h2>Zichtbaarheid voor leden</h2>\n            <p>Beperk de zichtbaarheid van deze vraag voor leden. De toegangsrechten voor beheerders worden hier onafhankelijk van geregeld via de instellingen van functies en beheerdersrollen.</p>\n            <STList>\n                <STListItem :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio v-model=\"externalPermissionLevel\" :value=\"PermissionLevel.None\" name=\"righstForNonAdmins\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        Niet zichtbaar\n                    </h3>\n                </STListItem>\n                <STListItem :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio v-model=\"externalPermissionLevel\" :value=\"PermissionLevel.Read\" name=\"righstForNonAdmins\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        Enkel lezen\n                    </h3>\n                </STListItem>\n                <STListItem :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio v-model=\"externalPermissionLevel\" :value=\"PermissionLevel.Write\" name=\"righstForNonAdmins\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        Bewerken\n                    </h3>\n                </STListItem>\n            </STList>\n        </template>\n\n        <template v-if=\"canAddWarning\">\n            <hr>\n            <h2>Waarschuwing</h2>\n            <p>Soms wil je dat iets opvalt voor beheerders, dat kan je bereiken met waarschuwingen. Die zijn zichtbaar voor beheerders als dit kenmerk een bepaalde waarde heeft.</p>\n\n            <STList>\n                <STListItem :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio v-model=\"warningInverted\" :value=\"null\" name=\"warningInverted\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        Geen waarschuwing\n                    </h3>\n                </STListItem>\n\n                <STListItem :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio v-model=\"warningInverted\" :value=\"false\" name=\"warningInverted\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        {{ warningNonInvertedText }}\n                    </h3>\n                </STListItem>\n\n                <STListItem :selectable=\"true\" element-name=\"label\">\n                    <template #left>\n                        <Radio v-model=\"warningInverted\" :value=\"true\" name=\"warningInverted\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        {{ warningInvertedText }}\n                    </h3>\n                </STListItem>\n            </STList>\n\n            <STInputBox v-if=\"warningText !== null\" title=\"Waarschuwingstekst\" error-fields=\"label\" :error-box=\"errors.errorBox\" class=\"max\">\n                <input\n                    v-model=\"warningText\"\n                    class=\"input\"\n                    type=\"text\"\n                    placeholder=\"bv. 'Geen toestemming om foto's te maken'\"\n                    autocomplete=\"off\"\n                >\n            </STInputBox>\n\n            <STInputBox v-if=\"warningType\" class=\"max\" title=\"Type\">\n                <STList>\n                    <STListItem :selectable=\"true\" element-name=\"label\">\n                        <template #left>\n                            <Radio v-model=\"warningType\" :value=\"RecordWarningType.Info\" name=\"warningType\" />\n                        </template>\n                        <h3 class=\"style-title-list\">\n                            Informatief\n                        </h3>\n                        <p class=\"style-description-small\">\n                            Grijze achtergrond. Voor minder belangrijke zaken\n                        </p>\n                    </STListItem>\n\n                    <STListItem :selectable=\"true\" element-name=\"label\">\n                        <template #left>\n                            <Radio v-model=\"warningType\" :value=\"RecordWarningType.Warning\" name=\"warningType\" />\n                        </template>\n                        <h3 class=\"style-title-list\">\n                            Waarschuwing\n                        </h3>\n                        <p class=\"style-description-small\">\n                            Gele achtergrond\n                        </p>\n                    </STListItem>\n\n                    <STListItem :selectable=\"true\" element-name=\"label\">\n                        <template #left>\n                            <Radio v-model=\"warningType\" :value=\"RecordWarningType.Error\" name=\"warningType\" />\n                        </template>\n                        <h3 class=\"style-title-list\">\n                            Foutmelding\n                        </h3>\n                        <p class=\"style-description-small\">\n                            Voor zaken die echt heel belangrijk zijn. Probeer dit weinig te gebruiken, zet niet alles op 'foutmelding', anders valt het niet meer op.\n                        </p>\n                    </STListItem>\n                </STList>\n            </STInputBox>\n        </template>\n\n        <template v-if=\"settings.dataPermission\">\n            <hr>\n            <h2>Toestemming gegevensverzameling</h2>\n            <p>\n                Verzamel je gevoelige informatie? Dan moet je daar in de meeste gevallen toestemming voor vragen volgens de GDPR-wetgeving. We raden je aan om altijd toestemming te vragen zodra je ook maar een beetje twijfelt. In onze gids geven we enkele voorbeelden, lees die zeker na. <a :href=\"$domains.getDocs('toestemming-gegevens-verzamelen')\" class=\"inline-link\" target=\"_blank\" rel=\"noopener\">\n                    Lees onze gids\n                </a>\n            </p>\n\n            <Checkbox v-model=\"sensitive\">\n                Ik heb toestemming nodig om deze informatie te verzamelen, of de antwoorden zijn (of bevatten mogelijks) gevoelige informatie\n            </Checkbox>\n        </template>\n\n        <div v-if=\"hasFilters\" class=\"container\">\n            <hr>\n            <h2>Slim in- en uitschakelen</h2>\n\n            <PropertyFilterInput v-model=\"filter\" :allow-optional=\"false\" :builder=\"filterBuilder\" />\n        </div>\n    </SaveView>\n</template>\n\n<script lang=\"ts\" setup generic=\"T extends ObjectWithRecords\">\nimport { PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { ComponentWithProperties, usePop, usePresent } from '@simonbackx/vue-app-navigation';\nimport { CenteredMessage, Checkbox, Dropdown, ErrorBox, GroupUIFilterBuilder, PropertyFilterInput, Radio, STErrorsDefault, STInputBox, STList, STListItem, SaveView, useErrors, usePatch } from '@stamhoofd/components';\nimport { FileType, ObjectWithRecords, PermissionLevel, PropertyFilter, RecordCategory, RecordChoice, RecordSettings, RecordType, RecordWarning, RecordWarningType } from '@stamhoofd/structures';\n\nimport { computed } from 'vue';\nimport EditRecordChoiceView from './EditRecordChoiceView.vue';\nimport { RecordEditorSettings, RecordEditorType } from './RecordEditorSettings';\nimport PreviewRecordView from './components/PreviewRecordView.vue';\nimport RecordChoiceRow from './components/RecordChoiceRow.vue';\n\nconst props = withDefaults(defineProps<{\n    record: RecordSettings;\n    category?: RecordCategory | null;\n    isNew: boolean;\n    saveHandler: (patch: PatchableArrayAutoEncoder<RecordSettings>) => void;\n    settings: RecordEditorSettings<T>;\n    rootCategories?: RecordCategory[];\n}>(), {\n    category: null,\n    rootCategories: () => ([]),\n});\n\nconst errors = useErrors();\nconst pop = usePop();\nconst present = usePresent();\nconst editorType = computed(() => props.settings.type);\n\nconst filterBuilder = computed(() => props.settings.filterBuilder(props.rootCategories));\n\nconst hasFilters = computed(() => {\n    return filterBuilder.value instanceof GroupUIFilterBuilder && filterBuilder.value.builders.length > 1;\n});\n\nconst { patch: patchRecord, patched: patchedRecord, addPatch, hasChanges } = usePatch(props.record);\nconst showExternalPermissionLevel = computed(() => editorType.value === RecordEditorType.PlatformMember);\n\nconst availableTypes = [\n    {\n        name: 'Tekst',\n        values: [\n            {\n                value: RecordType.Text,\n                name: 'Tekstveld (één lijn)',\n            },\n            {\n                value: RecordType.Textarea,\n                name: 'Tekstveld (meerdere lijnen)',\n            },\n            {\n                value: RecordType.Address,\n                name: 'Adres',\n            },\n            {\n                value: RecordType.Email,\n                name: 'E-mailadres',\n            },\n            {\n                value: RecordType.Phone,\n                name: 'Telefoonnummer',\n            },\n            {\n                value: RecordType.Date,\n                name: 'Datum',\n            },\n            {\n                value: RecordType.Integer,\n                name: 'Getal',\n            },\n            {\n                value: RecordType.Price,\n                name: 'Prijs',\n            },\n        ],\n    },\n    {\n        name: 'Aankruisen',\n        values: [\n            {\n                value: RecordType.Checkbox,\n                name: 'Aankruisvakje',\n            },\n            {\n                value: RecordType.ChooseOne,\n                name: 'Keuzemenu (kies één)',\n            },\n            {\n                value: RecordType.MultipleChoice,\n                name: 'Keuzemenu (kies meerdere)',\n            },\n        ],\n    },\n    {\n        name: 'Geavanceerd',\n        values: [\n            {\n                value: RecordType.Image,\n                name: 'Afbeelding of foto',\n            },\n            {\n                value: RecordType.File,\n                name: 'Bestand',\n            },\n        ],\n    },\n];\n\nconst availableFileTypes = [\n    {\n        name: 'Alles',\n        value: null,\n    },\n    {\n        name: 'PDF',\n        value: FileType.PDF,\n    },\n    {\n        name: 'Word',\n        value: FileType.Word,\n    },\n    {\n        name: 'Excel',\n        value: FileType.Excel,\n    },\n];\n\nconst canAddWarning = computed(() => {\n    if (editorType.value === RecordEditorType.Organization) {\n        return false;\n    }\n\n    return patchedRecord.value.type === RecordType.Checkbox || patchedRecord.value.type === RecordType.Text || patchedRecord.value.type === RecordType.Textarea;\n});\n\nconst warningNonInvertedText = computed(() => {\n    if (patchedRecord.value.type === RecordType.Checkbox) {\n        return 'Waarschuwing als aangevinkt';\n    }\n    return 'Waarschuwing als ingevuld';\n});\n\nconst warningInvertedText = computed(() => {\n    if (patchedRecord.value.type === RecordType.Checkbox) {\n        return 'Waarschuwing als niet aangevinkt';\n    }\n    return 'Waarschuwing als niet ingevuld';\n});\n\nconst title = computed(() => {\n    if (props.isNew) {\n        return 'Nieuwe vraag';\n    }\n    return 'Vraag bewerken';\n});\n\nconst labelTitle = computed(() => {\n    if (type.value === RecordType.Checkbox) {\n        return 'Tekst naast aankruisvakje';\n    }\n    if (type.value === RecordType.MultipleChoice) {\n        return 'Titel boven keuzemenu';\n    }\n    if (type.value === RecordType.ChooseOne) {\n        return 'Titel boven keuzemenu';\n    }\n    return 'Titel boven tekstvak';\n});\n\nconst descriptionTitle = computed(() => {\n    if (type.value === RecordType.Checkbox) {\n        return 'Beschrijving naast aankruisvakje';\n    }\n    if (type.value === RecordType.MultipleChoice) {\n        return 'Beschrijving onder keuzemenu';\n    }\n    if (type.value === RecordType.ChooseOne) {\n        return 'Beschrijving onder keuzemenu';\n    }\n    return 'Beschrijving onder tekstvak';\n});\n\nconst name = computed({\n    get: () => patchedRecord.value.name,\n    set: (name: string) => {\n        addPatch({ name });\n    },\n});\n\nconst fileType = computed({\n    get: () => patchedRecord.value.fileType ?? null,\n    set: (fileType) => {\n        addPatch({ fileType });\n    },\n});\n\nconst label = computed({\n    get: () => patchedRecord.value.label,\n    set: (label: string) => {\n        addPatch({ label });\n    },\n});\n\nconst required = computed({\n    get: () => patchedRecord.value.required,\n    set: (required: boolean) => {\n        addPatch({ required });\n    },\n});\n\nconst choices = computed({\n    get: () => patchedRecord.value.choices,\n    set: (choices: RecordChoice[]) => {\n        addPatch({ choices: choices as any });\n    },\n});\n\nconst inputPlaceholder = computed({\n    get: () => patchedRecord.value.inputPlaceholder,\n    set: (inputPlaceholder: string) => {\n        addPatch({ inputPlaceholder });\n    },\n});\n\nconst askComments = computed({\n    get: () => patchedRecord.value.askComments,\n    set: (askComments: boolean) => {\n        addPatch({ askComments });\n    },\n});\n\nconst filter = computed({\n    get: () => patchedRecord.value.filter ?? PropertyFilter.createDefault(),\n    set: (filter) => {\n        addPatch({ filter });\n    },\n});\n\nconst shouldAskInput = computed(() => {\n    if (type.value === RecordType.Checkbox) {\n        return askComments.value;\n    }\n    if (type.value === RecordType.MultipleChoice) {\n        return false;\n    }\n    if (type.value === RecordType.ChooseOne) {\n        return false;\n    }\n    return true;\n});\n\nconst shouldAskInputPlaceholder = computed(() => {\n    if (!shouldAskInput.value) {\n        return false;\n    }\n    if (type.value === RecordType.Address) {\n        return false;\n    }\n    return true;\n});\n\nconst shouldAskCommentsDescription = computed(() => {\n    if (type.value === RecordType.Checkbox) {\n        return askComments.value;\n    }\n    return false;\n});\n\nconst requiredText = computed(() => {\n    if (type.value === RecordType.Checkbox) {\n        return 'Verplicht aankruisen';\n    }\n    if (type.value === RecordType.MultipleChoice) {\n        return 'Verplicht om minstens één keuze te selecteren';\n    }\n    if (type.value === RecordType.ChooseOne) {\n        return 'Verplicht om een keuze te selecteren';\n    }\n    return 'Verplicht in te vullen';\n});\n\nconst type = computed({\n    get: () => patchedRecord.value.type,\n    set: (type: RecordType) => {\n        patchRecord.value = patchRecord.value.patch({\n            type,\n            // Set required if not checkbox or multiple choice, and if the type changed\n            required: (type !== RecordType.MultipleChoice && type !== RecordType.Checkbox) && props.record.type !== type\n                ? true\n                : ((type === RecordType.Checkbox || type === RecordType.MultipleChoice) && props.record.type !== type ? false : undefined),\n        });\n\n        if (type === RecordType.MultipleChoice || type === RecordType.ChooseOne) {\n            if (patchedRecord.value.choices.length === 0) {\n                if (props.record.choices.length > 0) {\n                    // Revert to original choices\n                    patchRecord.value = patchRecord.value.patch({ choices: props.record.choices as any });\n                }\n                else {\n                    patchRecord.value = patchRecord.value.patch({\n                        choices: [\n                            RecordChoice.create({ name: 'Keuze 1' }),\n                            RecordChoice.create({ name: 'Keuze 2' }),\n                        ] as any,\n                    });\n                }\n            }\n        }\n        else {\n            // Delete choices\n            patchRecord.value = patchRecord.value.patch({ choices: [] as any });\n        }\n    },\n});\n\nconst description = computed({\n    get: () => patchedRecord.value.description,\n    set: (description: string) => {\n        addPatch({ description });\n    },\n});\n\nconst commentsDescription = computed({\n    get: () => patchedRecord.value.commentsDescription,\n    set: (commentsDescription: string) => {\n        addPatch({ commentsDescription });\n    },\n});\n\nconst externalPermissionLevel = computed({\n    get: () => patchedRecord.value.externalPermissionLevel,\n    set: (externalPermissionLevel: PermissionLevel) => {\n        addPatch({ externalPermissionLevel });\n    },\n});\n\nconst warningInverted = computed({\n    get: () => patchedRecord.value.warning?.inverted ?? null,\n    set: (inverted: boolean | null) => {\n        if (inverted === null) {\n            addPatch({\n                warning: null,\n            });\n            return;\n        }\n        if (warningInverted.value === null) {\n            addPatch({\n                warning: RecordWarning.create({\n                    inverted,\n                }),\n            });\n        }\n        else {\n            addPatch({\n                warning: RecordWarning.patch({\n                    inverted,\n                }),\n            });\n        }\n    },\n});\n\nconst warningText = computed({\n    get: () => patchedRecord.value.warning?.text ?? null,\n    set: (text: string | null) => {\n        if (text === null) {\n            patchRecord.value = patchRecord.value.patch({\n                warning: null,\n            });\n            return;\n        }\n        if (warningText.value === null) {\n            patchRecord.value = patchRecord.value.patch({\n                warning: RecordWarning.create({\n                    text,\n                }),\n            });\n        }\n        else {\n            patchRecord.value = patchRecord.value.patch({\n                warning: RecordWarning.patch({\n                    text,\n                }),\n            });\n        }\n    },\n});\n\nconst warningType = computed({\n    get: () => patchedRecord.value.warning?.type ?? null,\n    set: (type: RecordWarningType | null) => {\n        if (type === null) {\n            patchRecord.value = patchRecord.value.patch({\n                warning: null,\n            });\n            return;\n        }\n        if (warningType.value === null) {\n            patchRecord.value = patchRecord.value.patch({\n                warning: RecordWarning.create({\n                    type,\n                }),\n            });\n        }\n        else {\n            patchRecord.value = patchRecord.value.patch({\n                warning: RecordWarning.patch({\n                    type,\n                }),\n            });\n        }\n    },\n\n});\n\nconst sensitive = computed({\n    get: () => patchedRecord.value.sensitive,\n    set: (sensitive: boolean) => {\n        // Always require encryption for sensitive information\n        addPatch({ sensitive });\n    },\n});\n\nfunction addChoicesPatch(patch: PatchableArrayAutoEncoder<RecordChoice>) {\n    addPatch(RecordSettings.patch({\n        choices: patch,\n    }));\n}\n\nfunction addChoice() {\n    const choice = RecordChoice.create({});\n\n    present(new ComponentWithProperties(EditRecordChoiceView, {\n        choice,\n        isNew: true,\n        parentRecord: patchedRecord.value,\n        saveHandler: (patch: PatchableArrayAutoEncoder<RecordChoice>) => {\n            addChoicesPatch(patch);\n        },\n    }).setDisplayStyle('popup')).catch(console.error);\n}\n\nasync function save() {\n    const isValid = await errors.validator.validate();\n    if (!isValid) {\n        return;\n    }\n\n    if (name.value.length < 2) {\n        errors.errorBox = new ErrorBox(new SimpleError({\n            code: 'invalid_field',\n            message: 'Vul een naam in',\n            field: 'name',\n        }));\n        return;\n    }\n\n    if ((type.value === RecordType.ChooseOne || type.value === RecordType.MultipleChoice) && choices.value.length === 0) {\n        errors.errorBox = new ErrorBox(new SimpleError({\n            code: 'invalid_record',\n            message: $t('a3101c16-5dc1-4baf-82fd-9f1f900281d0'),\n        }));\n        return;\n    }\n\n    const arrayPatch: PatchableArrayAutoEncoder<RecordSettings> = new PatchableArray();\n\n    if (props.isNew) {\n        arrayPatch.addPut(patchedRecord.value);\n    }\n    else {\n        arrayPatch.addPatch(patchRecord.value);\n    }\n\n    props.saveHandler(arrayPatch);\n    pop({ force: true })?.catch(console.error);\n}\n\nasync function deleteMe() {\n    if (!await CenteredMessage.confirm('Ben je zeker dat je dit kenmerk wilt verwijderen?', 'Verwijderen', 'Alle hieraan verbonden informatie gaat dan ook mogelijks verloren.')) {\n        return;\n    }\n\n    if (props.isNew) {\n        // do nothing\n        pop({ force: true })?.catch(console.error);\n        return;\n    }\n\n    const arrayPatch: PatchableArrayAutoEncoder<RecordSettings> = new PatchableArray();\n    arrayPatch.addDelete(props.record.id);\n\n    props.saveHandler(arrayPatch);\n    pop({ force: true })?.catch(console.error);\n}\n\nconst shouldNavigateAway = async () => {\n    if (!hasChanges.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm('Ben je zeker dat je wilt sluiten zonder op te slaan?', 'Niet opslaan');\n};\n\nfunction openPreview() {\n    present(new ComponentWithProperties(PreviewRecordView, {\n        record: patchedRecord,\n    }).setDisplayStyle('popup')).catch(console.error);\n}\n\ndefineExpose({\n    shouldNavigateAway,\n});\n</script>\n","export default \"data:image/svg+xml,%3csvg%20width='50'%20height='50'%20viewBox='0%200%2050%2050'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20x='4.5'%20y='16.5'%20width='41'%20height='18'%20rx='2.5'%20stroke='%23DCDCDC'%20stroke-width='3'/%3e%3crect%20x='9'%20y='22'%20width='17.5'%20height='7'%20rx='3'%20fill='%23DCDCDC'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='50'%20height='50'%20viewBox='0%200%2050%2050'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20x='4.5'%20y='9.5'%20width='41'%20height='31'%20rx='2.5'%20stroke='%23DCDCDC'%20stroke-width='3'/%3e%3crect%20x='9'%20y='15'%20width='17.5'%20height='7'%20rx='3'%20fill='%23DCDCDC'/%3e%3c/svg%3e\"","export default import.meta.ROLLUP_FILE_URL_DnCn9LEN;","export default import.meta.ROLLUP_FILE_URL_Cw0bpfQD;","export default import.meta.ROLLUP_FILE_URL_D1NhRhLW;","export default \"data:image/svg+xml,%3csvg%20width='50'%20height='50'%20viewBox='0%200%2050%2050'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20x='4.5'%20y='9.5'%20width='41'%20height='31'%20rx='2.5'%20stroke='%23DCDCDC'%20stroke-width='3'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M15.9858%2019.4104C16.3157%2019.3203%2016.6833%2019.402%2016.9465%2019.6574C19.9356%2022.5587%2023.0596%2024.6432%2024.573%2025.5814C24.8375%2025.7454%2025.1625%2025.7454%2025.427%2025.5814C26.9404%2024.6432%2030.0644%2022.5587%2033.0535%2019.6574C33.3167%2019.402%2033.6843%2019.3203%2034.0142%2019.4104C33.593%2018.5087%2032.7055%2017.8788%2031.6587%2017.7987C29.8422%2017.6598%2027.2613%2017.5%2025%2017.5C22.7387%2017.5%2020.1578%2017.6598%2018.3413%2017.7987C17.2945%2017.8788%2016.407%2018.5087%2015.9858%2019.4104ZM34.3379%2021.1976C32.5042%2022.964%2030.6351%2024.432%2029.0912%2025.5365L33.6459%2029.3905C34.0675%2029.7472%2034.1201%2030.3782%2033.7634%2030.7998C33.4066%2031.2214%2032.7757%2031.274%2032.3541%2030.9173L27.3798%2026.7083C27.0408%2026.9301%2026.7385%2027.1215%2026.4808%2027.2812C25.5708%2027.8454%2024.4292%2027.8454%2023.5192%2027.2812C23.2615%2027.1215%2022.9592%2026.9301%2022.6202%2026.7083L17.6459%2030.9173C17.2243%2031.274%2016.5934%2031.2214%2016.2366%2030.7998C15.8799%2030.3782%2015.9325%2029.7472%2016.3541%2029.3905L20.9088%2025.5365C19.3649%2024.432%2017.4958%2022.964%2015.6621%2021.1976C15.5724%2022.3365%2015.5%2023.6682%2015.5%2025C15.5%2026.7112%2015.6195%2028.4224%2015.7417%2029.7245C15.8681%2031.0715%2016.9309%2032.1132%2018.2793%2032.2227C19.9229%2032.3561%2022.3175%2032.5%2025%2032.5C27.6825%2032.5%2030.0771%2032.3561%2031.7207%2032.2227C33.0691%2032.1132%2034.1319%2031.0715%2034.2583%2029.7245C34.3805%2028.4224%2034.5%2026.7112%2034.5%2025C34.5%2023.6682%2034.4276%2022.3365%2034.3379%2021.1976Z'%20fill='%23DCDCDC'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='50'%20height='50'%20viewBox='0%200%2050%2050'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20x='4.5'%20y='9.5'%20width='41'%20height='31'%20rx='2.5'%20stroke='%23DCDCDC'%20stroke-width='3'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M25%2034C26%2034%2032%2027.866%2032%2023C32%2019.134%2028.866%2016%2025%2016C21.134%2016%2018%2019.134%2018%2023C18%2027.866%2024%2034%2025%2034ZM25%2025C26.1046%2025%2027%2024.1046%2027%2023C27%2021.8954%2026.1046%2021%2025%2021C23.8954%2021%2023%2021.8954%2023%2023C23%2024.1046%2023.8954%2025%2025%2025Z'%20fill='%23DCDCDC'/%3e%3c/svg%3e\"","export default import.meta.ROLLUP_FILE_URL_Cij9sszs;","<template>\n    <STListItem v-long-press=\"(e) => showContextMenu(e)\" :selectable=\"true\" class=\"right-stack left-center\" @click=\"editRecord()\" @contextmenu.prevent=\"showContextMenu\">\n        <template #left>\n            <img v-if=\"record.type === 'Text'\" src=\"@stamhoofd/assets/images/illustrations/text-input.svg\" class=\"style-illustration-img\">\n            <img v-else-if=\"record.type === 'Textarea'\" src=\"@stamhoofd/assets/images/illustrations/textarea.svg\" class=\"style-illustration-img\">\n            <img v-else-if=\"record.type === 'Checkbox'\" src=\"@stamhoofd/assets/images/illustrations/checkbox.svg\" class=\"style-illustration-img\">\n            <img v-else-if=\"record.type === 'ChooseOne'\" src=\"@stamhoofd/assets/images/illustrations/radio-input.svg\" class=\"style-illustration-img\">\n            <img v-else-if=\"record.type === 'MultipleChoice'\" src=\"@stamhoofd/assets/images/illustrations/multiple-choice-input.svg\" class=\"style-illustration-img\">\n            <img v-else-if=\"record.type === 'Email'\" src=\"@stamhoofd/assets/images/illustrations/email-input.svg\" class=\"style-illustration-img\">\n            <img v-else-if=\"record.type === 'Address'\" src=\"@stamhoofd/assets/images/illustrations/address-input.svg\" class=\"style-illustration-img\">\n            <img v-else-if=\"record.type === 'Date'\" src=\"@stamhoofd/assets/images/illustrations/date-input.svg\" class=\"style-illustration-img\">\n            <img v-else src=\"@stamhoofd/assets/images/illustrations/text-input.svg\" class=\"style-illustration-img\">\n        </template>\n\n        <h3 class=\"style-title-list\">\n            {{ record.name }}\n        </h3>\n        <p v-if=\"description && description !== record.name\" class=\"style-description\">\n            {{ description }}\n        </p>\n\n        <p v-if=\"record.filter && !record.filter.isAlwaysEnabledAndRequired\" class=\"style-description-small\">\n            <span>{{ propertyFilterToString(record.filter, filterBuilder) }}</span>\n        </p>\n\n        <template #right>\n            <span class=\"button icon drag gray\" @click.stop @contextmenu.stop />\n            <span class=\"icon arrow-right-small gray\" />\n        </template>\n    </STListItem>\n</template>\n\n<script setup lang=\"ts\">\nimport { AutoEncoderPatchType, PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { RecordCategory, RecordSettings, RecordType } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport { usePatchMoveUpDownSingle } from '../../hooks';\nimport { ContextMenu, ContextMenuItem } from '../../overlays/ContextMenu';\nimport { RecordEditorSettings } from '../RecordEditorSettings';\nimport { propertyFilterToString } from '../../filters/UIFilter';\n\nconst props = withDefaults(\n    defineProps<{\n        record: RecordSettings;\n        category: RecordCategory;\n        parentCategory?: RecordCategory | null;\n        rootCategories: RecordCategory[];\n        settings: RecordEditorSettings<any>;\n    }>(),\n    {\n        parentCategory: null,\n    },\n);\n\nconst emit = defineEmits<{\n    // Patch patches the root categories (allows full control in case of moving records around categories)\n    patch: [patch: PatchableArrayAutoEncoder<RecordCategory>];\n    edit: [edit: RecordSettings];\n}>();\nconst { up, down } = usePatchMoveUpDownSingle(props.record.id, props.category.records, addPatch);\nconst filterBuilder = computed(() => props.settings.filterBuilder(props.rootCategories));\n\nconst description = computed(() => {\n    if (props.record.type === RecordType.Checkbox) {\n        if (props.record.askComments) {\n            return 'Aankruisvakje met tekstvak indien aangevinkt';\n        }\n        if (props.record.required) {\n            return 'Verplicht aankruisvakje';\n        }\n        return 'Aankruisvakje';\n    }\n    if (props.record.type === RecordType.ChooseOne) {\n        if (!props.record.required) {\n            return 'Kies optioneel één uit ' + props.record.choices.length + ' opties';\n        }\n        return 'Kies één uit ' + props.record.choices.length + ' opties';\n    }\n    if (props.record.type === RecordType.MultipleChoice) {\n        if (props.record.required) {\n            return 'Kies minstens één uit ' + props.record.choices.length + ' opties';\n        }\n        return 'Kies optioneel meerdere keuzes uit ' + props.record.choices.length + ' opties';\n    }\n    if (props.record.type === RecordType.Email) {\n        if (!props.record.required) {\n            return 'Optioneel e-mailadres';\n        }\n        return 'E-mailadres';\n    }\n    if (props.record.type === RecordType.Address) {\n        if (!props.record.required) {\n            return 'Optioneel adres';\n        }\n        return 'Adres';\n    }\n    if (props.record.type === RecordType.Phone) {\n        if (!props.record.required) {\n            return 'Optioneel telefoonnummer';\n        }\n        return 'Telefoonnummer';\n    }\n    if (props.record.type === RecordType.Date) {\n        if (!props.record.required) {\n            return 'Optionele datum';\n        }\n        return 'Datum';\n    }\n\n    if (props.record.type === RecordType.Textarea) {\n        if (!props.record.required) {\n            return 'Optioneel (groot) tekstveld';\n        }\n        return 'Groot tekstveld';\n    }\n\n    if (props.record.type === RecordType.Integer) {\n        if (!props.record.required) {\n            return 'Optioneel getal';\n        }\n        return 'Getal';\n    }\n\n    if (props.record.type === RecordType.Price) {\n        if (!props.record.required) {\n            return 'Optionele prijs';\n        }\n        return 'Prijs';\n    }\n\n    if (props.record.type === RecordType.Image) {\n        if (!props.record.required) {\n            return 'Optionele afbeelding';\n        }\n        return 'Afbeelding';\n    }\n\n    if (props.record.type === RecordType.File) {\n        if (!props.record.required) {\n            return 'Optioneel bestand';\n        }\n        return 'Bestand';\n    }\n\n    if (!props.record.required) {\n        return 'Optioneel tekstveld';\n    }\n    return 'Tekstveld';\n});\n\nfunction editRecord() {\n    emit('edit', props.record);\n}\n\n// Patch a root category\nfunction addRootPatch(patch: AutoEncoderPatchType<RecordCategory>) {\n    const array: PatchableArrayAutoEncoder<RecordCategory> = new PatchableArray();\n    array.addPatch(patch);\n    emit('patch', array);\n}\n\n// Sends patch meant the root categories\nfunction addPatch(patch: PatchableArrayAutoEncoder<RecordSettings>) {\n    // Is category a root category or not?\n    const rootCategory = props.rootCategories.find(c => c.id === props.category.id);\n    if (rootCategory) {\n        const categoryPatch = RecordCategory.patch({\n            id: rootCategory.id,\n            records: patch,\n        });\n        addRootPatch(categoryPatch);\n    }\n    else {\n        // Find the root category that contains this category\n        const rootCategory = props.rootCategories.find(c => c.childCategories.find(r => r.id === props.category.id));\n        if (rootCategory) {\n            const childCategoryPatch = RecordCategory.patch({\n                id: props.category.id,\n                records: patch,\n            });\n\n            const arr: PatchableArrayAutoEncoder<RecordCategory> = new PatchableArray();\n            arr.addPatch(childCategoryPatch);\n\n            const categoryPatch = RecordCategory.patch({\n                id: rootCategory.id,\n                childCategories: arr,\n            });\n            addRootPatch(categoryPatch);\n        }\n        else {\n            console.warn('Could not find root category to patch for this record');\n        }\n    }\n}\n\nfunction moveTo(category: RecordCategory) {\n    const me = props.record;\n\n    // Delete record from current category\n    const deleteArray: PatchableArrayAutoEncoder<RecordSettings> = new PatchableArray();\n    deleteArray.addDelete(me.id);\n    addPatch(deleteArray);\n\n    // Add it to the right category\n    const putArray: PatchableArrayAutoEncoder<RecordSettings> = new PatchableArray();\n    putArray.addPut(me);\n\n    const rootCategory = props.rootCategories.find(r => r.id === category.id);\n    if (rootCategory) {\n        const categoryPatch = RecordCategory.patch({\n            id: rootCategory.id,\n            records: putArray,\n        });\n        addRootPatch(categoryPatch);\n        return;\n    }\n\n    const parentRootCategory = props.rootCategories.find(r => !!r.childCategories.find(rr => rr.id === category.id));\n    if (!parentRootCategory) {\n        console.error('Invalid move');\n        return;\n    }\n\n    const childCategoryPatch: PatchableArrayAutoEncoder<RecordCategory> = new PatchableArray();\n    childCategoryPatch.addPatch(RecordCategory.patch({\n        id: category.id,\n        records: putArray,\n    }));\n\n    const categoryPatch = RecordCategory.patch({\n        id: parentRootCategory.id,\n        childCategories: childCategoryPatch,\n    });\n    addRootPatch(categoryPatch);\n}\n\nfunction showContextMenu(event: MouseEvent) {\n    const menu = new ContextMenu([\n        [\n            new ContextMenuItem({\n                name: 'Verplaats omhoog',\n                icon: 'arrow-up',\n                action: () => {\n                    up();\n                    return true;\n                },\n            }),\n            new ContextMenuItem({\n                name: 'Verplaats omlaag',\n                icon: 'arrow-down',\n                action: () => {\n                    down();\n                    return true;\n                },\n            }),\n            new ContextMenuItem({\n                name: 'Verplaats naar',\n                childMenu: new ContextMenu([\n                    props.rootCategories.map((category) => {\n                        return new ContextMenuItem({\n                            name: category.name,\n                            action: () => {\n                                moveTo(category);\n                            },\n                            childMenu: category.childCategories.length > 0\n                                ? new ContextMenu([\n                                    [\n                                        new ContextMenuItem({\n                                            name: 'Algemene vraag',\n                                            action: () => {\n                                                moveTo(category);\n                                            },\n                                        }),\n                                    ],\n                                    category.childCategories.map((childCategory) => {\n                                        return new ContextMenuItem({\n                                            name: childCategory.name,\n                                            action: () => {\n                                                moveTo(childCategory);\n                                            },\n                                        });\n                                    }),\n                                ])\n                                : undefined,\n                        });\n                    }),\n                ]),\n            }),\n        ],\n    ]);\n    menu.show({ clickEvent: event }).catch(console.error);\n}\n\n</script>\n","<template>\n    <SaveView :loading=\"saving\" :title=\"title\" :disabled=\"!hasChanges && !isNew\" :deleting=\"deleting\" @save=\"save\" v-on=\"!isNew ? {delete: deleteMe} : {}\">\n        <h1 class=\"style-navigation-title\">\n            {{ title }}\n        </h1>\n\n        <p v-if=\"allowChildCategories && type === RecordEditorType.PlatformMember\" class=\"style-description\">\n            Een vragenlijst bevat één of meerdere persoonsgegevens, eventueel opgedeeld in categorieën. Lees <a :href=\"$domains.getDocs('vragenlijsten-instellen')\" class=\"inline-link\" target=\"_blank\">hier</a> meer informatie na over hoe je een vragenlijst kan instellen.\n        </p>\n        <p v-else class=\"style-description\">\n            Lees <a :href=\"$domains.getDocs('vragenlijsten-instellen')\" class=\"inline-link\" target=\"_blank\">hier</a> meer informatie na over hoe je een vragenlijst kan instellen.\n        </p>\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <div class=\"split-inputs\">\n            <STInputBox title=\"Titel\" error-fields=\"name\" :error-box=\"errors.errorBox\">\n                <input\n                    ref=\"firstInput\"\n                    v-model=\"name\"\n                    class=\"input\"\n                    type=\"text\"\n                    placeholder=\"Titel\"\n                    autocomplete=\"off\"\n                    enterkeyhint=\"next\"\n                >\n            </STInputBox>\n        </div>\n\n        <STInputBox title=\"Beschrijving\" error-fields=\"description\" :error-box=\"errors.errorBox\" class=\"max\">\n            <textarea\n                v-model=\"description\"\n                class=\"input\"\n                type=\"text\"\n                placeholder=\"Optioneel\"\n                autocomplete=\"off\"\n            />\n        </STInputBox>\n\n        <STList v-if=\"(settings.toggleDefaultEnabled && allowChildCategories) || !patchedCategory.defaultEnabled\">\n            <STListItem :selectable=\"true\" element-name=\"label\">\n                <template #left>\n                    <Checkbox v-model=\"defaultEnabled\" />\n                </template>\n\n                <h3 v-if=\"app === 'admin'\" class=\"style-title-list\">\n                    Verplicht ingeschakeld voor alle leden ingeschreven bij minstens één standaard-leeftijdsgroep\n                </h3>\n                <h3 v-else class=\"style-title-list\">\n                    Verplicht ingeschakeld voor alle leden (behalve wachtlijsten en activiteiten)\n                </h3>\n\n                <p class=\"style-description-small\">\n                    Schakel je dit uit, dan staat deze vragenlijst standaard uit maar kan deze op lagere niveau's worden ingeschakeld. Zo behoud je maximale flexibiliteit.\n                </p>\n            </STListItem>\n        </STList>\n\n        <hr>\n\n        <p v-if=\"records.length === 0 && categories.length === 0\" class=\"info-box\">\n            Deze vragenlijst is leeg en zal nog niet getoond worden.\n        </p>\n\n        <STList :model-value=\"getDraggableRecords(patchedCategory).computed.value\" :draggable=\"true\" @update:model-value=\"newValue => getDraggableRecords(patchedCategory).computed.value = newValue!\">\n            <template #item=\"{item: record}\">\n                <RecordRow :record=\"record\" :category=\"patchedCategory\" :root-categories=\"patchedRootCategories\" :selectable=\"true\" :settings=\"settings\" @patch=\"addRootCategoriesPatch\" @edit=\"editRecord($event)\" />\n            </template>\n        </STList>\n\n        <p class=\"style-button-bar\">\n            <button class=\"button text\" type=\"button\" @click=\"addRecord()\">\n                <span class=\"icon add\" />\n                <span v-if=\"categories.length === 0\">Vraag</span>\n                <span v-else>Algemene vraag</span>\n            </button>\n\n            <button v-if=\"allowChildCategories\" class=\"button text\" type=\"button\" @click=\"addCategory()\">\n                <span class=\"icon add\" />\n                <span>Categorie</span>\n            </button>\n        </p>\n\n        <div v-for=\"c in categories\" :key=\"c.id\" class=\"container\">\n            <hr>\n            <h2 class=\"style-with-button with-list\">\n                <div>\n                    {{ c.name }}\n                </div>\n                <div>\n                    <button class=\"icon add button gray\" type=\"button\" @click=\"addRecord(c)\" />\n                    <button class=\"icon more button gray\" type=\"button\" @click=\"showCategoryMenu($event, c)\" />\n                </div>\n            </h2>\n            <p v-if=\"c.filter\" class=\"info-box selectable with-icon\" @click=\"editCategory(c)\">\n                {{ propertyFilterToString(c.filter, filterBuilder) }}\n                <button type=\"button\" class=\"button icon edit\" />\n            </p>\n\n            <p v-if=\"c.records.length === 0\" class=\"info-box\">\n                Deze categorie bevat nog geen vragen.\n            </p>\n\n            <p v-if=\"c.description\" class=\"style-description-block style-em pre-wrap\" v-text=\"c.description\" />\n\n            <STList :model-value=\"getDraggableRecords(c).computed.value\" :draggable=\"true\" @update:model-value=\"newValue => getDraggableRecords(c).computed.value = newValue!\">\n                <template #item=\"{item: record}\">\n                    <RecordRow :record=\"record\" :category=\"c\" :root-categories=\"patchedRootCategories\" :settings=\"settings\" :selectable=\"true\" @patch=\"addRootCategoriesPatch\" @edit=\"editRecord($event, c)\" />\n                </template>\n            </STList>\n        </div>\n\n        <div v-if=\"defaultEnabled && (hasFilters || (allowChildCategories && patchedCategory.getAllRecords().length > 1))\" class=\"container\">\n            <hr>\n            <h2>Slim in- en uitschakelen</h2>\n            <p v-if=\"!hasFilters\">\n                Je kan kiezen wanneer deze stap overgeslagen kan worden.\n            </p>\n            <p v-else-if=\"allowChildCategories && patchedCategory.getAllRecords().length > 1\">\n                Je kan kiezen wanneer deze vragen van toepassing zijn, en of deze stap overgeslagen kan worden.\n            </p>\n            <p v-else>\n                Je kan kiezen wanneer deze vragen van toepassing zijn.\n            </p>\n\n            <PropertyFilterInput v-model=\"filter\" :allow-optional=\"allowChildCategories && patchedCategory.getAllRecords().length > 1\" :builder=\"filterBuilder\" />\n        </div>\n\n        <template #toolbar>\n            <button v-tooltip=\"$t('ee2852cb-6458-4127-8ad0-3281cc286884')\" class=\"button icon eye\" type=\"button\" @click=\"showExample\" />\n        </template>\n    </SaveView>\n</template>\n\n<script setup lang=\"ts\">\nimport { AutoEncoderPatchType, PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, usePop, usePresent } from '@simonbackx/vue-app-navigation';\nimport { ObjectWithRecords, PatchAnswers, PropertyFilter, RecordCategory, RecordSettings } from '@stamhoofd/structures';\nimport { Ref, computed, getCurrentInstance, reactive, ref } from 'vue';\nimport { useAppContext } from '../context/appContext';\nimport { ErrorBox } from '../errors/ErrorBox';\nimport { useErrors } from '../errors/useErrors';\nimport { GroupUIFilterBuilder } from '../filters';\nimport PropertyFilterInput from '../filters/PropertyFilterInput.vue';\nimport { propertyFilterToString } from '../filters/UIFilter';\nimport { useDraggableArray, usePatchArray, usePatchMoveUpDown } from '../hooks';\nimport { CenteredMessage } from '../overlays/CenteredMessage';\nimport { ContextMenu, ContextMenuItem } from '../overlays/ContextMenu';\nimport { Toast } from '../overlays/Toast';\nimport { NavigationActions } from '../types/NavigationActions';\nimport EditRecordView from './EditRecordView.vue';\nimport FillRecordCategoryView from './FillRecordCategoryView.vue';\nimport { RecordEditorSettings, RecordEditorType } from './RecordEditorSettings';\nimport RecordRow from './components/RecordRow.vue';\n\n// Define\nconst props = defineProps<{\n    categoryId: string;\n    rootCategories: RecordCategory[];\n    saveHandler: (category: PatchableArrayAutoEncoder<RecordCategory>) => void;\n    settings: RecordEditorSettings<ObjectWithRecords>;\n    isNew: boolean;\n    allowChildCategories: boolean;\n}>();\n\n// Hooks\nconst errors = useErrors();\nconst { patched: patchedRootCategories, hasChanges, patch, addPatch: addRootPatch, addArrayPatch: addRootCategoriesPatch } = usePatchArray(props.rootCategories);\nconst pop = usePop();\nconst present = usePresent();\n\n// Data\nconst saving = ref(false);\nconst deleting = ref(false);\nconst filterBuilder = computed(() => props.settings.filterBuilder(props.rootCategories));\nconst app = useAppContext();\nconst type = props.settings.type;\n\n// Computed\nconst patchedCategory = computed(() => {\n    const rootCategory = patchedRootCategories.value.find(c => c.id === props.categoryId);\n    if (rootCategory) {\n        return rootCategory;\n    }\n    for (const r of patchedRootCategories.value) {\n        for (const child of r.childCategories) {\n            if (child.id === props.categoryId) {\n                return child;\n            }\n        }\n    }\n    throw new Error('CategoryId not found via rootCategories: ' + props.categoryId);\n});\n\nconst hasFilters = computed(() => {\n    return filterBuilder.value instanceof GroupUIFilterBuilder && filterBuilder.value.builders.length > 1;\n});\n\nconst title = computed(() => props.isNew ? 'Nieuwe vragenlijst' : patchedCategory.value.name);\nconst records = computed(() => patchedCategory.value.records);\nconst categories = computed(() => patchedCategory.value.childCategories);\n\nconst moveRecordCategories = usePatchMoveUpDown(categories, (categoriesPatch) => {\n    addPatch(\n        RecordCategory.patch({\n            id: patchedCategory.value.id,\n            childCategories: categoriesPatch,\n        }),\n    );\n});\n\nconst name = computed({\n    get: () => patchedCategory.value.name,\n    set: (v: string) => {\n        addPatch(\n            RecordCategory.patch({\n                id: patchedCategory.value.id,\n                name: v,\n            }),\n        );\n    },\n});\nconst description = computed({\n    get: () => patchedCategory.value.description,\n    set: (v: string) => {\n        addPatch(\n            RecordCategory.patch({\n                id: patchedCategory.value.id,\n                description: v,\n            }),\n        );\n    },\n});\nconst defaultEnabled = computed({\n    get: () => patchedCategory.value.defaultEnabled,\n    set: (v: boolean) => {\n        if (v && patchedCategory.value.containsSensitiveData && !props.settings.inheritedRecordsConfiguration?.dataPermission) {\n            Toast.error('Deze vragenlijst bevat gegevens waar je toestemming voor moet vragen. Schakel de toestemming voor gegevevensverzameling in om deze vragenlijst te activeren.').show();\n            return;\n        }\n\n        addPatch(\n            RecordCategory.patch({\n                id: patchedCategory.value.id,\n                defaultEnabled: v,\n                filter: !defaultEnabled.value ? null : undefined,\n            }),\n        );\n    },\n});\nconst filter = computed({\n    get: () => patchedCategory.value.filter ?? PropertyFilter.createDefault(),\n    set: (v: PropertyFilter) => {\n        addPatch(\n            RecordCategory.patch({\n                id: patchedCategory.value.id,\n                filter: v,\n            }),\n        );\n    },\n});\n\n// Mapped getters\nconst cachedComputers = new Map<string, Ref<any>>();\nfunction getDraggableRecords(category: RecordCategory): { computed: Ref<RecordSettings[]> } {\n    if (cachedComputers.has(category.id)) {\n        return {\n            computed: cachedComputers.get(category.id) as Ref<RecordSettings[]>,\n        };\n    }\n\n    const c = useDraggableArray(\n        () => {\n            // Need a getter here because category is not a ref\n            if (patchedCategory.value.id === category.id) {\n                return patchedCategory.value.records;\n            }\n            return patchedCategory.value.childCategories.find(cc => cc.id === category.id)!.records;\n        },\n        (recordsPatch) => {\n            // --\n            if (category.id === props.categoryId) {\n                addPatch(\n                    RecordCategory.patch({\n                        id: category.id,\n                        records: recordsPatch,\n                    }),\n                );\n                return;\n            }\n\n            const p = RecordCategory.patch({\n                id: category.id,\n                records: recordsPatch,\n            });\n\n            const arr: PatchableArrayAutoEncoder<RecordCategory> = new PatchableArray();\n            arr.addPatch(p);\n\n            addPatch(\n                RecordCategory.patch({\n                    id: props.categoryId,\n                    childCategories: arr,\n                }),\n            );\n        },\n    );\n    cachedComputers.set(category.id, c);\n    return { computed: c };\n}\n\n// Methods\nfunction getPatchParentCategories(patch: PatchableArrayAutoEncoder<RecordCategory>, categoryId = props.categoryId): PatchableArrayAutoEncoder<RecordCategory> {\n    // Is it a root category?\n    if (props.rootCategories.find(r => r.id === categoryId)) {\n        return patch;\n    }\n\n    const parentRootCategory = props.rootCategories.find(r => !!r.childCategories.find(c => c.id === categoryId));\n    if (parentRootCategory) {\n        const rootPatch = new PatchableArray() as PatchableArrayAutoEncoder<RecordCategory>;\n        rootPatch.addPatch(RecordCategory.patch({\n            id: parentRootCategory.id,\n            childCategories: patch,\n        }));\n        return rootPatch;\n    }\n    else {\n        console.error('Could not patch inside EditRecordCategoryView: could not find parent category', patch);\n    }\n    return new PatchableArray();\n}\n\n// Methods\nfunction addPatch(patch: AutoEncoderPatchType<RecordCategory>) {\n    // Is it a root category?\n    if (props.rootCategories.find(r => r.id === patch.id)) {\n        return addRootPatch(patch);\n    }\n\n    const parentRootCategory = props.rootCategories.find(r => !!r.childCategories.find(c => c.id === patch.id));\n    if (parentRootCategory) {\n        const arr = new PatchableArray() as PatchableArrayAutoEncoder<RecordCategory>;\n        arr.addPatch(patch);\n        addRootPatch(RecordCategory.patch({\n            id: parentRootCategory.id,\n            childCategories: arr,\n        }));\n    }\n    else {\n        console.error('Could not patch inside EditRecordCategoryView: could not find parent category', patch);\n    }\n}\n\nasync function save() {\n    if (saving.value) {\n        return;\n    }\n    saving.value = true;\n    try {\n        props.saveHandler(patch.value);\n        await pop({ force: true });\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    saving.value = false;\n}\n\nasync function addRecord(parent: RecordCategory = patchedCategory.value) {\n    const record = RecordSettings.create({});\n\n    await present({\n        components: [\n            new ComponentWithProperties(EditRecordView, {\n                record,\n                isNew: true,\n                parentCategory: parent,\n                settings: props.settings,\n                rootCategories: patchedRootCategories.value,\n                saveHandler: (patch: PatchableArrayAutoEncoder<RecordSettings>) => {\n                    addPatch(\n                        RecordCategory.patch({\n                            id: parent.id,\n                            records: patch,\n                        }),\n                    );\n                },\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function editRecord(record: RecordSettings, parent: RecordCategory = patchedCategory.value) {\n    await present({\n        components: [\n            new ComponentWithProperties(EditRecordView, {\n                record,\n                isNew: false,\n                parentCategory: parent,\n                settings: props.settings,\n                rootCategories: patchedRootCategories.value,\n                saveHandler: (patch: PatchableArrayAutoEncoder<RecordSettings>) => {\n                    addPatch(\n                        RecordCategory.patch({\n                            id: parent.id,\n                            records: patch,\n                        }),\n                    );\n                },\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nconst Self = getCurrentInstance()!.type!;\n\nasync function addCategory(base?: RecordCategory) {\n    const category = base ?? RecordCategory.create({});\n\n    const childCategoryPatch = new PatchableArray() as PatchableArrayAutoEncoder<RecordCategory>;\n    childCategoryPatch.addPut(category);\n\n    const temporaryRootPatch = new PatchableArray() as PatchableArrayAutoEncoder<RecordCategory>;\n    temporaryRootPatch.addPatch(RecordCategory.patch({\n        id: props.categoryId,\n        childCategories: childCategoryPatch,\n    }));\n\n    await present({\n        components: [\n            new ComponentWithProperties(Self, {\n                categoryId: category.id,\n                isNew: true,\n                rootCategories: temporaryRootPatch.applyTo(patchedRootCategories.value),\n                settings: props.settings,\n                allowChildCategories: false,\n                saveHandler: (patch: PatchableArrayAutoEncoder<RecordCategory>) => {\n                    addRootCategoriesPatch(temporaryRootPatch.patch(patch));\n                },\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function showCategoryMenu(event: MouseEvent, category: RecordCategory) {\n    const menu = new ContextMenu([\n        [\n            new ContextMenuItem({\n                name: 'Wijzig instellingen',\n                icon: 'settings',\n                action: () => editCategory(category),\n            }),\n            new ContextMenuItem({\n                name: 'Categorie dupliceren',\n                icon: 'copy',\n                action: () => addCategory(category.duplicate()),\n            }),\n        ], [\n            new ContextMenuItem({\n                name: 'Verplaats naar boven',\n                icon: 'arrow-up',\n                disabled: !moveRecordCategories.canMoveUp(category.id),\n                action: () => {\n                    moveRecordCategories.up(category.id);\n                },\n            }),\n            new ContextMenuItem({\n                name: 'Verplaats naar beneden',\n                icon: 'arrow-down',\n                disabled: !moveRecordCategories.canMoveDown(category.id),\n                action: () => {\n                    moveRecordCategories.down(category.id);\n                },\n            }),\n        ],\n        [\n\n        ],\n        [\n            new ContextMenuItem({\n                name: 'Verplaats naar vragenlijst',\n                childMenu: new ContextMenu([\n                    [\n                        new ContextMenuItem({\n                            name: 'Hoofdvragenlijst',\n                            action: async () => {\n                                // Transform into a root category\n                                if (!await CenteredMessage.confirm('Ben je zeker dat je dit wilt verplaatsen?', 'Ja, verplaatsen', 'Deze subcategorie zal worden omgezet in een vragenlijst als je de huidige vragenlijst opslaat.')) {\n                                    return;\n                                }\n\n                                // Move\n                                const childCategoryPatch = new PatchableArray() as PatchableArrayAutoEncoder<RecordCategory>;\n                                childCategoryPatch.addDelete(category.id);\n\n                                const rootPatch = new PatchableArray() as PatchableArrayAutoEncoder<RecordCategory>;\n                                rootPatch.addPatch(RecordCategory.patch({\n                                    id: props.categoryId,\n                                    childCategories: childCategoryPatch,\n                                }));\n\n                                rootPatch.addPut(category);\n\n                                addRootCategoriesPatch(rootPatch);\n                            },\n                        }),\n                    ],\n                    [\n                        ...patchedRootCategories.value.map(c => new ContextMenuItem({\n                            name: c.name,\n                            disabled: c.id === props.categoryId,\n                            action: async () => {\n                                // Transform into a root category\n                                if (!await CenteredMessage.confirm('Ben je zeker dat je dit wilt verplaatsen?', 'Ja, verplaatsen', 'Deze subcategorie zal worden verplaatst naar deze vragenlijst als je de huidige vragenlijst opslaat.')) {\n                                    return;\n                                }\n\n                                const childCategoryPatch = new PatchableArray() as PatchableArrayAutoEncoder<RecordCategory>;\n                                childCategoryPatch.addDelete(category.id);\n\n                                const childCategoryPatch2 = new PatchableArray() as PatchableArrayAutoEncoder<RecordCategory>;\n                                childCategoryPatch2.addPut(category);\n\n                                const rootPatch = new PatchableArray() as PatchableArrayAutoEncoder<RecordCategory>;\n                                rootPatch.addPatch(RecordCategory.patch({\n                                    id: props.categoryId,\n                                    childCategories: childCategoryPatch,\n                                }));\n\n                                rootPatch.addPatch(RecordCategory.patch({\n                                    id: c.id,\n                                    childCategories: childCategoryPatch2,\n                                }));\n\n                                addRootCategoriesPatch(rootPatch);\n                            },\n                        })),\n                    ],\n                ]),\n            }),\n        ],\n    ]);\n\n    await menu.show({ button: event.target as HTMLElement });\n}\n\nasync function editCategory(category: RecordCategory) {\n    await present({\n        components: [\n            new ComponentWithProperties(Self, {\n                categoryId: category.id,\n                isNew: false,\n                rootCategories: patchedRootCategories.value,\n                settings: props.settings,\n                allowChildCategories: false,\n                saveHandler: (patch: PatchableArrayAutoEncoder<RecordCategory>) => {\n                    addRootCategoriesPatch(patch);\n                },\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function deleteMe() {\n    if (deleting.value) {\n        return;\n    }\n\n    if (!await CenteredMessage.confirm('Weet je zeker dat je deze vragenlijst wilt verwijderen?', 'Verwijderen')) {\n        return;\n    }\n    // Note we create a patch, but don't use it internally because that would throw errors. The view itszelf is not aware of the delete\n    const arr = new PatchableArray() as PatchableArrayAutoEncoder<RecordCategory>;\n    arr.addDelete(props.categoryId);\n    const patch = getPatchParentCategories(arr, props.categoryId);\n\n    deleting.value = true;\n    try {\n        props.saveHandler(patch);\n        await pop({ force: true });\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    deleting.value = false;\n}\n\nasync function showExample() {\n    const reactiveValue = reactive(props.settings.exampleValue);\n    await present({\n        components: [\n            new ComponentWithProperties(FillRecordCategoryView, {\n                category: patchedCategory.value.patch({\n                    // Disable filter on category level for the preview, since these cannot work\n                    filter: null,\n                    defaultEnabled: true\n                }),\n                value: reactiveValue,\n                saveText: 'Opslaan',\n                saveHandler: async (_patch: PatchAnswers, navigationActions: NavigationActions) => {\n                    await navigationActions.pop({ force: true });\n                },\n                forceMarkReviewed: true,\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nconst shouldNavigateAway = async () => {\n    if (!hasChanges.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm('Ben je zeker dat je wilt sluiten zonder op te slaan?', 'Niet opslaan');\n};\n\ndefineExpose({\n    shouldNavigateAway,\n});\n</script>\n","import { ArrayDecoder, Decoder, ObjectData, VersionBox, VersionBoxDecoder } from '@simonbackx/simple-encoding'\nimport { Checkout, DiscountCode, Version } from '@stamhoofd/structures'\n\nimport { Toast } from '@stamhoofd/components'\nimport { WebshopManager } from './WebshopManager'\n\n/**\n * Convenient access to the organization of the current session\n */\nexport class CheckoutManager {\n    private _checkout: Checkout | null = null\n\n    $webshopManager: WebshopManager\n\n    constructor($webshopManager: WebshopManager) {\n        this.$webshopManager = $webshopManager\n    }\n\n    saveCart() {\n        this.saveCheckout()\n    }\n\n    get checkout() {\n        if (!this._checkout) {\n            this._checkout = this.loadCheckout()\n        }\n        return this._checkout\n    }\n\n    get cart() {\n        return this.checkout.cart\n    }\n\n    async validateCodes() {\n        if (this.checkout.discountCodes.length === 0) {\n            return\n        }\n        try {\n            // Validate code\n            const response = await this.$webshopManager.server.request({\n                method: \"POST\",\n                path: \"/webshop/\"+this.$webshopManager.webshop.id + '/discount-codes',\n                body: this.checkout.discountCodes.map(c => c.code),\n                decoder: new ArrayDecoder(DiscountCode as Decoder<DiscountCode>)\n            })\n\n            this.checkout.discountCodes = response.data;\n            this.checkout.update(this.$webshopManager.webshop)\n            this.saveCheckout()\n\n        } catch (e) {\n            // ignore\n        }\n    }\n\n    async applyCode(code: string) {\n        const toast = new Toast('Kortingscode toepassen', 'spinner').setHide(null).show();\n\n        try {\n            // Validate code\n            const response = await this.$webshopManager.server.request({\n                method: \"POST\",\n                path: \"/webshop/\"+this.$webshopManager.webshop.id + '/discount-codes',\n                body: [...this.checkout.discountCodes.map(c => c.code), code],\n                decoder: new ArrayDecoder(DiscountCode as Decoder<DiscountCode>)\n            })\n\n            this.checkout.discountCodes = response.data;\n            this.checkout.update(this.$webshopManager.webshop)\n            this.saveCheckout()\n\n            if (this.checkout.discountCodes.find(c => c.code === code)) {\n                new Toast('Kortingscode toegepast', 'success primary').setHide(10 * 1000).show();\n                return true;\n            } else {\n                new Toast('Ongeldige kortingscode '+code, 'red error').setHide(10 * 1000).show();\n                return false;\n            }\n            \n        } finally {\n            toast.hide();\n        }\n    }\n\n    removeCode(discountCode: DiscountCode) {\n        this.checkout.discountCodes = this.checkout.discountCodes.filter(c => c.id !== discountCode.id)\n        this.checkout.update(this.$webshopManager.webshop)\n        this.saveCheckout()\n    }\n\n    loadCheckout() {\n        try {\n            const json = localStorage.getItem(this.$webshopManager.webshop.id+\"-checkout\")\n            if (json) {\n                const obj = JSON.parse(json)\n                const versionBox = new VersionBoxDecoder(Checkout as Decoder<Checkout>).decode(new ObjectData(obj, { version: Version }))\n                return versionBox.data\n            }\n        } catch (e) {\n            console.error(\"Failed to load cart\")\n            console.error(e)\n        }\n        return new Checkout()\n    }\n\n    saveCheckout() {\n        try {\n            this.checkout.update(this.$webshopManager.webshop)\n            const data = new VersionBox(this.checkout).encode({ version: Version })\n            const json = JSON.stringify(data)\n            localStorage.setItem(this.$webshopManager.webshop.id+\"-checkout\", json)\n        } catch (e) {\n            console.error(\"Failed to save cart\")\n            console.error(e)\n        }\n    }\n\n    clear() {\n        this.cart.clear()\n        this.checkout.discountCodes = [];\n        this.saveCheckout()\n    }\n}\n","import { Decoder } from '@simonbackx/simple-encoding';\nimport { ColorHelper } from '@stamhoofd/components';\nimport { NetworkManager, SessionContext } from '@stamhoofd/networking';\nimport { DarkMode, Platform, Webshop } from '@stamhoofd/structures';\n\n/**\n * Convenient access to the organization of the current session\n */\nexport class WebshopManager {\n    webshop!: Webshop;\n    $context: SessionContext;\n    platform: Platform;\n\n    get organization() {\n        return this.$context.organization!;\n    }\n\n    constructor($context: SessionContext, platform: Platform, webshop: Webshop) {\n        this.webshop = webshop;\n        this.$context = $context;\n        this.platform = platform;\n\n        // Set color\n        if (this.webshop.meta.color) {\n            ColorHelper.setColor(this.webshop.meta.color);\n        }\n        else if (this.$context.organization?.meta.color) {\n            ColorHelper.setColor(this.$context.organization?.meta.color);\n        }\n        else {\n            if (this.platform.config.color) {\n                ColorHelper.setColor(this.platform.config.color);\n            }\n        }\n        ColorHelper.setDarkMode(this.webshop.meta.darkMode ?? DarkMode.Off);\n\n        this.setFavicon();\n    }\n\n    /**\n     * Doing authenticated requests\n     */\n    get optionalAuthenticatedServer() {\n        return this.$context.optionalAuthenticatedServer;\n    }\n\n    /**\n     * Doing authenticated requests\n     */\n    get server() {\n        const server = NetworkManager.server;\n        server.host = 'https://' + this.organization.id + '.' + STAMHOOFD.domains.api;\n        return server;\n    }\n\n    get unscopedServer() {\n        return NetworkManager.server;\n    }\n\n    async reload() {\n        const response = await this.server.request({\n            method: 'GET',\n            path: '/webshop/' + this.webshop.id,\n            decoder: Webshop as Decoder<Webshop>,\n        });\n        this.webshop = response.data;\n    }\n\n    setFavicon() {\n        if (!this.webshop.meta.squareLogo) {\n            return;\n        }\n\n        const linkElement = document.querySelector(\"link[rel='icon']\") as HTMLLinkElement;\n        if (linkElement) {\n            return;\n        }\n\n        const href = this.webshop.meta.squareLogo?.getPathForSize(256, 256);\n        const link = document.createElement('link');\n        link.rel = 'icon';\n        link.type = href.endsWith('.svg') ? 'image/svg+xml' : (href.endsWith('.png') ? 'image/png' : 'image/jpeg');\n        link.href = href;\n\n        document.head.appendChild(link);\n    }\n}\n","export const WhatsNewCount = 50;\n","import { ComponentWithProperties, NavigationController, onCheckRoutes, UrlHelper, useModalStackComponent } from '@simonbackx/vue-app-navigation';\nimport { CenteredMessage, ForgotPasswordResetView, GlobalEventBus, NavigationActions, PaymentPendingView, RegistrationSuccessView, useContext } from '@stamhoofd/components';\nimport { PaymentGeneral, PaymentStatus } from '@stamhoofd/structures';\n\nlet didCheckGlobalRoutes = false;\nexport function useGlobalRoutes() {\n    const modalStackComponent = useModalStackComponent();\n    const context = useContext();\n\n    const present = (component: ComponentWithProperties) => {\n        const currentPath = UrlHelper.shared.getPath({ removeLocale: true });\n        modalStackComponent.value.present({\n            adjustHistory: true,\n            animated: false,\n            force: true,\n            components: [\n                new ComponentWithProperties(NavigationController, {\n                    root: component,\n                }, {\n                    provide: {\n                        reactive_navigation_url: currentPath,\n                    },\n                }),\n            ],\n            modalDisplayStyle: 'popup',\n        });\n    };\n\n    onCheckRoutes(async () => {\n        if (didCheckGlobalRoutes) {\n            // When switching root components, the routes are rechecked, so we need to prevent rechecks on these routes\n            return;\n        }\n        didCheckGlobalRoutes = true;\n        const currentPath = UrlHelper.shared.getPath({ removeLocale: true });\n        const parts = UrlHelper.shared.getParts();\n        const queryString = UrlHelper.shared.getSearchParams();\n        console.log('Checking global routes', parts, queryString, currentPath);\n\n        if (queryString.get('paymentId')) {\n            const paymentId = queryString.get('paymentId');\n            const cancel = queryString.get('cancel') === 'true';\n\n            if (paymentId) {\n                present(new ComponentWithProperties(PaymentPendingView, {\n                    server: context.value.optionalAuthenticatedServer,\n                    paymentId,\n                    cancel,\n                    errorHandler: async function (navigationActions: NavigationActions, error: unknown) {\n                        await navigationActions.dismiss({ force: true });\n                        CenteredMessage.fromError(error).addCloseButton().show();\n                    },\n                    finishedHandler: async function (navigationActions: NavigationActions, payment: PaymentGeneral | null) {\n                        GlobalEventBus.sendEvent('paymentPatch', payment).catch(console.error);\n\n                        if (payment && payment.status === PaymentStatus.Succeeded) {\n                            // TODO: fetch appropriate data for this payment!\n\n                            if (payment.memberNames.length) {\n                                await navigationActions.show({\n                                    components: [\n                                        new ComponentWithProperties(RegistrationSuccessView, {\n                                            registrations: [], // todo: fetch registrations\n                                            payment,\n                                        }),\n                                    ],\n                                    replace: 100, // autocorrects to all\n                                    force: true,\n                                });\n                            }\n                            else {\n                                await navigationActions.dismiss({ force: true });\n                                new CenteredMessage('Betaling voltooid', 'De betaling werd voltooid.').addCloseButton().show();\n                            }\n                        }\n                        else {\n                            await navigationActions.dismiss({ force: true });\n                            new CenteredMessage('Betaling mislukt', 'De betaling werd niet voltooid of de bank heeft de betaling geweigerd. Probeer het opnieuw.').addCloseButton().show();\n                        }\n                    },\n                }));\n            }\n        }\n\n        if (parts.length > 0 && parts[0] == 'reset-password') {\n            // Clear initial url before pushing to history, because else, when closing the popup, we'll get the original url...\n\n            const token = queryString.get('token');\n            const organizationId = parts[1] ? parts[1] : null;\n\n            if ((organizationId && context.value.organization?.id == organizationId)) {\n                console.log('Ignored reset password route because organization is not the same');\n                return;\n            }\n\n            present(new ComponentWithProperties(ForgotPasswordResetView, { token }));\n        }\n    });\n}\n","<template>\n    <LoadingViewTransition>\n        <div v-if=\"!loadingDefault\">\n            <STGradientBackground v-if=\"!platform.config.horizontalLogo\" />\n\n            <div class=\"st-view\">\n                <STNavigationBar :large=\"!isNative\" class=\"transparent\" title=\"Beheer jouw groep\" />\n\n                <main class=\"flex center small organization-selection-view\">\n                    <h1>\n                        {{ $t('24a048f6-3c97-4c80-87b7-eccc244b5d12') }}\n                    </h1>\n\n                    <p class=\"style-description-block style-description-large\">\n                        {{ $t('b4307772-62dd-48a4-bae3-9d46df314727') }}\n                    </p>\n\n                    <form class=\"input-icon-container icon search gray\" @submit.prevent>\n                        <input ref=\"input\" v-model=\"query\" autofocus class=\"input\" :placeholder=\"$t('89b3f7fe-d2b2-4194-a971-886b0665a0df')\" name=\"search\" inputmode=\"search\" type=\"search\" enterkeyhint=\"search\" autocorrect=\"off\" autocomplete=\"off\" :spellcheck=\"false\" autocapitalize=\"off\" @keydown.down.prevent=\"focusResult(0)\">\n                    </form>\n\n                    <div v-if=\"showVersionFooter\" class=\"version-box\">\n                        <VersionFooter />\n                    </div>\n\n                    <Spinner v-else-if=\"loadingResults\" class=\"gray center\" />\n                    <template v-else>\n                        <button v-for=\"(option, index) in visibleOptions\" ref=\"resultElements\" :key=\"option.id\" type=\"button\" class=\"search-result\" @keydown.down.prevent=\"focusResult(index + 1)\" @keydown.up.prevent=\"focusResult(index - 1)\" @click=\"selectOption(option)\">\n                            <ContextLogo :organization=\"option.organization\" :app=\"option.app\" />\n                            <div>\n                                <h1>{{ getAppTitle(option.app, option.organization) }}</h1>\n\n                                <p v-if=\"getAppDescription(option.app, option.organization)\" class=\"style-description\">\n                                    {{ getAppDescription(option.app, option.organization) }}\n                                </p>\n                                <p v-if=\"option.userDescription\" class=\"style-description-small style-em\">\n                                    Ingelogd als {{ option.userDescription }}\n                                </p>\n\n                                <span v-if=\"option.userDescription\" class=\"icon gray sync floating\" />\n                                <span v-if=\"!isPlatform && option.context.canGetCompleted()\" class=\"icon success primary floating\" />\n                                <span v-if=\"isPlatform && option.context.hasPermissions() && option.app === 'auto'\" class=\"icon privacy gray floating\" />\n                            </div>\n                        </button>\n                    </template>\n\n                    <p v-if=\"!loadingResults && visibleOptions.length === 0 && query\" class=\"info-box\">\n                        Geen verenigingen gevonden. Probeer te zoeken op postcode of naam. Is jouw vereniging nog niet aangesloten? Maak dan eerst een vereniging aan.\n                    </p>\n\n                    <footer v-if=\"!isPlatform\">\n                        <a v-if=\"!isNative\" href=\"/aansluiten\" class=\"button text full selected\" @click.prevent=\"$navigate('join')\">\n                            <span class=\"icon add\" />\n                            <span>Mijn vereniging aansluiten</span>\n                        </a>\n\n                        <button class=\"button text full\" type=\"button\" @click=\"help\">\n                            <span class=\"icon help\" />\n                            <span>Mijn vereniging staat er niet tussen</span>\n                        </button>\n                    </footer>\n\n                    <PlatformFooter />\n                </main>\n            </div>\n        </div>\n    </LoadingViewTransition>\n</template>\n\n<script setup lang=\"ts\">\nimport { ArrayDecoder, Decoder } from '@simonbackx/simple-encoding';\nimport { Request } from '@simonbackx/simple-networking';\nimport { defineRoutes, useNavigate } from '@simonbackx/vue-app-navigation';\nimport { ContextLogo, LoadingViewTransition, Option, PlatformFooter, Spinner, STGradientBackground, Toast, useAppData, useContextOptions, usePlatform, VersionFooter } from '@stamhoofd/components';\nimport { AppManager, NetworkManager, useRequestOwner } from '@stamhoofd/networking';\nimport { Organization } from '@stamhoofd/structures';\nimport { throttle } from '@stamhoofd/utility';\nimport { computed, getCurrentInstance, onMounted, reactive, Ref, ref, shallowRef, watch } from 'vue';\n\nconst isNative = ref(AppManager.shared.isNative);\nconst loadingDefault = ref(true);\nconst loadingResults = ref(false);\nconst query = ref('');\nconst defaultOptions: Ref<Option[]> = shallowRef([]);\nconst results: Ref<Option[]> = shallowRef([]);\nconst owner = useRequestOwner();\nconst input = ref<HTMLInputElement | null>(null);\nconst resultElements = reactive<HTMLElement[]>([]);\nconst visibleOptions = computed(() => query.value.length === 0 ? defaultOptions.value : results.value);\nconst isPlatform = STAMHOOFD.userMode === 'platform';\nconst instance = getCurrentInstance();\nconst platform = usePlatform();\nconst { getAppTitle, getAppDescription } = useAppData();\n\nonMounted(() => {\n    console.info('Mounted OrganizationSelectionView', instance);\n});\n\nconst { getDefaultOptions, selectOption, getOptionForOrganization } = useContextOptions();\n\ngetDefaultOptions().then((opts) => {\n    defaultOptions.value = opts;\n    loadingDefault.value = false;\n}).catch(console.error);\n\nlet lastQuery = '';\nlet counter = 0;\n\nconst help = () => {\n    // todo\n};\n\nconst showVersionFooter = computed(() => {\n    return query.value.toLocaleLowerCase().trim() === 'stamhoofd dev';\n});\n\nconst focusResult = (index: number) => {\n    if (index === -1) {\n        if (input.value) {\n            input.value.focus();\n        }\n        return;\n    }\n    if (resultElements) {\n        if (resultElements[index]) {\n            resultElements[index].focus();\n        }\n    }\n};\n\nconst setResults = async (cachedCount: number, organizations: Organization[]) => {\n    if (cachedCount !== counter) {\n        // A new request have started already\n        // (race condition if this was scheduled)\n        return;\n    }\n\n    if (organizations.length === 0) {\n        results.value = [];\n        return;\n    }\n\n    // Start loading the options\n    const options = await Promise.all(organizations.map(async (organization) => {\n        const option = await getOptionForOrganization(organization) as Option;\n        return option;\n    }));\n\n    if (cachedCount !== counter) {\n        // A new request have started already\n        return;\n    }\n\n    results.value = options;\n};\n\nconst updateResults = async () => {\n    const q = query.value;\n    const cachedCount = counter;\n\n    if (q.length === 0) {\n        await setResults(cachedCount, []);\n        loadingResults.value = false;\n        return;\n    }\n    loadingResults.value = true;\n\n    try {\n        const response = await NetworkManager.server.request({\n            method: 'GET',\n            path: '/organizations/search',\n            query: { query: q },\n            decoder: new ArrayDecoder(Organization as Decoder<Organization>),\n            owner,\n        });\n\n        if (cachedCount !== counter) {\n            // A new request have started already\n            return;\n        }\n        await setResults(cachedCount, response.data);\n    }\n    catch (e) {\n        if (cachedCount !== counter) {\n            // A new request have started already\n            return;\n        }\n        if (!Request.isAbortError(e)) {\n            console.error(e);\n            Toast.fromError(e).show();\n        }\n        await setResults(cachedCount, []);\n    }\n\n    if (cachedCount !== counter) {\n        // A new request have started already\n        return;\n    }\n    loadingResults.value = false;\n};\n\nconst throttleUpdateResults = throttle(updateResults, 500);\n\nconst startUpdateResults = async () => {\n    const value = query.value;\n    if (value === lastQuery) {\n        return;\n    }\n    lastQuery = value;\n    loadingResults.value = true;\n    counter += 1;\n\n    Request.cancelAll(owner);\n\n    if (value.length === 0) {\n        await setResults(counter, []);\n        loadingResults.value = false;\n        return;\n    }\n    throttleUpdateResults();\n};\n\nwatch(query, startUpdateResults);\n\ndefineRoutes([\n    {\n        url: 'aansluiten',\n        name: 'join',\n        component: async () => (await import('../signup/SignupGeneralView.vue')).default as any,\n        paramsToProps(_, query) {\n            const code = query?.get('code');\n            const organization = query?.get('org');\n\n            if (code && organization) {\n                return {\n                    initialRegisterCode: {\n                        code,\n                        organization,\n                    },\n                    visitViaUrl: true,\n                };\n            }\n\n            return {\n                initialRegisterCode: null,\n                visitViaUrl: !!query,\n            };\n        },\n        present: 'popup',\n    },\n]);\n\nconst $navigate = useNavigate();\n\n</script>\n\n<style lang=\"scss\">\n@use \"@stamhoofd/scss/base/variables.scss\" as *;\n@use \"@stamhoofd/scss/base/text-styles.scss\" as *;\n\n.organization-selection-view {\n     > h1 {\n        @media (min-height: 800px) {\n            padding-top: 40px;\n        }\n\n        &.native {\n            padding-top: 0;\n        }\n     }\n\n    .version-box {\n        padding: 15px 0;\n    }\n\n    input.search {\n        max-width: none;\n    }\n\n    > .spinner-container {\n        padding: 10px 0;\n    }\n\n    > footer {\n        padding-top: 15px;\n    }\n\n    form {\n        margin-bottom: 10px;\n    }\n\n    > .search-result {\n        @extend .style-input-shadow;\n        background: $color-background;\n        border: $border-width solid $color-border;\n        padding: 15px 15px;\n        padding-right: 0px;\n        border-radius: $border-radius;\n        margin: 5px 0;\n        transition: transform 0.2s, border-color 0.2s, background-color 0.2s;\n        cursor: pointer;\n        touch-action: manipulation;\n        user-select: none;\n        display: block;\n        width: 100%;\n        text-align: left;\n        position: relative;\n        display: flex;\n        flex-basis: row;\n        align-items: center;\n        --block-width: 40px;\n\n        > figure {\n            flex-shrink: 0;\n            padding-right: 15px;\n        }\n\n        > div {\n            flex-grow: 1;\n            position: relative;\n            padding-right: 40px;\n\n            > h1 {\n                @extend .style-title-list;\n            }\n\n            > .floating {\n                position: absolute;\n                right: 15px;\n                top: 50%;\n                transform: translate(0, -50%);\n                transition: color 0.2s;\n            }\n\n            > p {\n                @extend .style-description-small;\n            }\n        }\n\n        @media (hover: hover) {\n            &:hover {\n                border-color: $color-primary-gray-light;\n                background-color: $color-primary-background;\n\n                > .icon.floating {\n                    color: $color-primary;\n                }\n            }\n        }\n\n        &:focus {\n            // Create a hight contrast selection state, by adding multiple box shadows, to create a white border\n            border-color: $color-primary;\n\n            > .icon.floating {\n                color: $color-primary;\n            }\n        }\n\n        &:active {\n            transform: scale(0.95, 0.95);\n            border-color: $color-primary;\n\n            > .icon.floating {\n                color: $color-primary;\n            }\n        }\n    }\n}\n</style>\n","import { Decoder } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, ModalStackComponent, NavigationController, PushOptions, setTitleSuffix, SplitViewController } from '@simonbackx/vue-app-navigation';\nimport { AccountSwitcher, AppType, AsyncComponent, AuditLogsView, AuthenticatedView, ContextNavigationBar, ContextProvider, CoverImageContainer, CustomHooksContainer, LoginView, ManageEventsView, manualFeatureFlag, NoPermissionsView, OrganizationLogo, OrganizationSwitcher, PromiseView, ReplaceRootEventBus, TabBarController, TabBarItem, TabBarItemGroup } from '@stamhoofd/components';\nimport { I18nController, LocalizedDomains } from '@stamhoofd/frontend-i18n';\nimport { MemberManager, NetworkManager, OrganizationManager, PlatformManager, SessionContext, SessionManager, UrlHelper } from '@stamhoofd/networking';\nimport { AccessRight, Country, Organization, PermissionLevel, Webshop } from '@stamhoofd/structures';\nimport { computed, markRaw, reactive, ref } from 'vue';\n\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { CheckoutManager } from '../../webshop/src/classes/CheckoutManager';\nimport { WebshopManager } from '../../webshop/src/classes/WebshopManager';\nimport { WhatsNewCount } from './classes/WhatsNewCount';\nimport { useGlobalRoutes } from './useGlobalRoutes';\nimport OrganizationSelectionView from './views/login/OrganizationSelectionView.vue';\nimport RedirectView from '@stamhoofd/components/src/auth/RedirectView.vue';\n\nexport function wrapWithModalStack(component: ComponentWithProperties, initialPresents?: PushOptions[]) {\n    return new ComponentWithProperties(ModalStackComponent, { root: component, initialPresents });\n}\n\nexport async function wrapContext(context: SessionContext, app: AppType | 'auto', component: ComponentWithProperties, options?: { ownDomain?: boolean; initialPresents?: PushOptions[]; webshop?: Webshop }) {\n    const platformManager = await PlatformManager.createFromCache(context, app, true);\n    const $memberManager = new MemberManager(context, platformManager.$platform);\n    await I18nController.loadDefault(context, Country.Belgium, 'nl', context?.organization?.address?.country);\n\n    if (app === 'webshop' && !options?.webshop) {\n        throw new Error('Webshop is required for webshop app');\n    }\n\n    const $webshopManager = options?.webshop ? reactive(new WebshopManager(context, platformManager.$platform, options.webshop) as any) as WebshopManager : null;\n    const $checkoutManager = $webshopManager ? reactive(new CheckoutManager($webshopManager)) : null;\n\n    return new ComponentWithProperties(ContextProvider, {\n        context: markRaw({\n            $context: context,\n            $platformManager: platformManager,\n            $memberManager,\n            $organizationManager: new OrganizationManager(context),\n            $webshopManager,\n            $checkoutManager,\n            reactive_components: {\n                'tabbar-left': options?.ownDomain && context.organization\n                    ? new ComponentWithProperties(OrganizationLogo, {\n                        organization: context.organization,\n                    })\n                    : new ComponentWithProperties(OrganizationSwitcher, {}),\n                'tabbar-right': new ComponentWithProperties(AccountSwitcher, {}),\n                'tabbar-replacement': new ComponentWithProperties(ContextNavigationBar, {}),\n            },\n            stamhoofd_app: app,\n        }),\n        root: wrapWithModalStack(new ComponentWithProperties(CustomHooksContainer, {\n            root: component,\n            hooks: () => {\n                useGlobalRoutes();\n            },\n        }), options?.initialPresents),\n    });\n}\n\nexport async function loadSessionFromUrl() {\n    const parts = UrlHelper.shared.getParts();\n    const ignoreUris = ['login', 'aansluiten', 'start', 'activiteiten', 'mandje', 'leden'];\n\n    let session: SessionContext | null = null;\n\n    console.log('load session', parts);\n\n    if (parts[1] && !ignoreUris.includes(parts[1])) {\n        const uri = parts[1];\n\n        // Load organization\n        // todo: use cache\n        try {\n            const response = await NetworkManager.server.request({\n                method: 'GET',\n                path: '/organization-from-uri',\n                query: {\n                    uri,\n                },\n                decoder: Organization as Decoder<Organization>,\n            });\n            const organization = response.data;\n\n            session = new SessionContext(organization);\n            await session.loadFromStorage();\n            await session.checkSSO();\n            await SessionManager.prepareSessionForUsage(session, false);\n        }\n        catch (e) {\n            console.error('Failed to load organization from uri', uri);\n            session = null;\n        }\n    }\n\n    if (!session) {\n        session = await SessionManager.getLastGlobalSession();\n        await session.checkSSO();\n    }\n\n    return session;\n}\n\nexport function getLoginRoot() {\n    if (STAMHOOFD.REDIRECT_LOGIN_DOMAIN && UrlHelper.initial.getSearchParams().get('skipRedirect') !== 'true') {\n        const urlCopy = new URL(UrlHelper.initial.url);\n        urlCopy.hostname = STAMHOOFD.REDIRECT_LOGIN_DOMAIN;\n\n        return new ComponentWithProperties(RedirectView, {\n            location: urlCopy.href,\n        });\n    }\n\n    return new ComponentWithProperties(CoverImageContainer, {\n        root: new ComponentWithProperties(NavigationController, {\n            root: new ComponentWithProperties(LoginView, {\n                initialEmail: UrlHelper.shared.getSearchParams().get('email') ?? '',\n            }),\n        }),\n    });\n}\n\nexport function getNonAutoLoginRoot(reactiveSession: SessionContext, options: { initialPresents?: PushOptions[] } = {}) {\n    // In platform mode, we always redirect to the 'auto' login view, so that we redirect the user to the appropriate environment after signin in\n    if (STAMHOOFD.userMode === 'platform') {\n        return new ComponentWithProperties(PromiseView, {\n            promise: async () => {\n                // Replace itself again after a successful login\n                const root = await getScopedAutoRoot(reactiveSession, options);\n                await ReplaceRootEventBus.sendEvent('replace', root);\n                return new ComponentWithProperties({}, {});\n            },\n        });\n    }\n\n    return getLoginRoot();\n}\n\nexport async function getOrganizationSelectionRoot(session: SessionContext) {\n    const reactiveSession = session;\n    await session.loadFromStorage();\n    await SessionManager.prepareSessionForUsage(session, false);\n\n    let baseRoot = new ComponentWithProperties(CoverImageContainer, {\n        root: new ComponentWithProperties(NavigationController, {\n            root: new ComponentWithProperties(OrganizationSelectionView, {}),\n        }),\n    });\n\n    if (STAMHOOFD.userMode === 'platform') {\n        // In platform mode, we need authentication\n        baseRoot = new ComponentWithProperties(AuthenticatedView, {\n            root: wrapWithModalStack(baseRoot),\n            loginRoot: wrapWithModalStack(getLoginRoot()),\n        });\n    }\n\n    return await wrapContext(reactiveSession, 'auto', baseRoot);\n}\n\nexport function getNoPermissionsView() {\n    return wrapWithModalStack(new ComponentWithProperties(TabBarController, {\n        tabs: [\n            new TabBarItem({\n                icon: 'key',\n                name: 'Geen toegang',\n                component: new ComponentWithProperties(NavigationController, {\n                    root: new ComponentWithProperties(NoPermissionsView, {}),\n                }),\n            }),\n        ],\n    }));\n}\n\nexport async function getScopedDashboardRootFromUrl() {\n    // UrlHelper.fixedPrefix = \"beheerders\";\n    const session = await loadSessionFromUrl();\n\n    if (!session.organization) {\n        return getOrganizationSelectionRoot(session);\n    }\n\n    return await getScopedDashboardRoot(session);\n}\n\nexport async function getScopedAutoRootFromUrl() {\n    const session = await loadSessionFromUrl();\n    await SessionManager.prepareSessionForUsage(session, false);\n\n    return await getScopedAutoRoot(session);\n}\n\nexport async function getScopedAutoRoot(session: SessionContext, options: { initialPresents?: PushOptions[] } = {}) {\n    if (!session.user) {\n        // We can't really determine the automatic root view because we are not signed in\n        // So return the login view, that will call getScopedAutoRoot again after login\n        const reactiveSession = session;\n\n        return await wrapContext(reactiveSession, 'auto',\n            new ComponentWithProperties(AuthenticatedView, {\n                root: new ComponentWithProperties(PromiseView, {\n                    promise: async () => {\n                        if (reactiveSession.user) {\n                            // Replace itself again after a successful login\n                            const root = await getScopedAutoRoot(reactiveSession, options);\n                            await ReplaceRootEventBus.sendEvent('replace', root);\n                        }\n                        else {\n                            throw new SimpleError({\n                                code: 'infinite_redirect',\n                                message: 'Er ging iets mis: te veel doorverwijzingen.',\n                            });\n                        }\n                        return new ComponentWithProperties({}, {});\n                    },\n                }),\n                loginRoot: wrapWithModalStack(getLoginRoot()),\n            }),\n        );\n    }\n\n    // Make sure users without permissions always go to the member portal automatically\n    if (((!session.organization && !session.auth.userPermissions) || (session.organization && !session.auth.permissions)) && (STAMHOOFD.userMode === 'platform' || (session.organization && session.organization.meta.packages.useMembers))) {\n        const registration = await import('@stamhoofd/registration');\n        return await registration.getRootView(session);\n    }\n\n    if (session.organization) {\n        return await getScopedDashboardRoot(session, options);\n    }\n\n    // Users with permissions should always have the option to choose the member portal or the dashboard\n    return getOrganizationSelectionRoot(session);\n}\n\nexport async function getScopedDashboardRoot(reactiveSession: SessionContext, options: { initialPresents?: PushOptions[] } = {}) {\n    // When switching between organizations, we allso need to load the right locale, which can happen async normally\n    const startView = new ComponentWithProperties(NavigationController, {\n        root: AsyncComponent(() => import(/* webpackChunkName: \"StartView\", webpackPrefetch: true */ './views/start/StartView.vue'), {}),\n    });\n\n    setTitleSuffix(reactiveSession.organization?.name ?? '');\n\n    const startTab = new TabBarItem({\n        icon: 'home',\n        name: 'Start',\n        component: startView,\n    });\n\n    const membersTab = new TabBarItem({\n        icon: 'group',\n        name: 'Leden',\n        component: new ComponentWithProperties(SplitViewController, {\n            root: AsyncComponent(() => import('./views/members/MembersMenu.vue'), {}),\n        }),\n    });\n\n    const calendarTab = new TabBarItem({\n        icon: 'calendar',\n        name: 'Activiteiten',\n        component: new ComponentWithProperties(NavigationController, {\n            root: new ComponentWithProperties(ManageEventsView, {}),\n        }),\n    });\n\n    const webshopsTab = new TabBarItem({\n        icon: 'basket',\n        name: 'Verkoop',\n        component: new ComponentWithProperties(SplitViewController, {\n            root: AsyncComponent(() => import('./views/webshops/WebshopsMenu.vue'), {}),\n        }),\n    });\n\n    const whatsNewBadge = ref('');\n\n    const loadWhatsNew = () => {\n        const currentCount = localStorage.getItem('what-is-new');\n        if (currentCount) {\n            const c = parseInt(currentCount);\n            if (!isNaN(c) && WhatsNewCount - c > 0) {\n                whatsNewBadge.value = (WhatsNewCount - c).toString();\n            }\n        }\n        else {\n            localStorage.setItem('what-is-new', (WhatsNewCount as any).toString());\n        }\n    };\n    loadWhatsNew();\n\n    const settingsTab = new TabBarItem({\n        icon: 'settings',\n        name: 'Instellingen',\n        component: new ComponentWithProperties(SplitViewController, {\n            root: AsyncComponent(() => import('./views/dashboard/settings/SettingsView.vue'), {}),\n        }),\n    });\n\n    const financesTab = new TabBarItem({\n        icon: 'calculator',\n        name: 'Boekhouding',\n        component: new ComponentWithProperties(SplitViewController, {\n            root: AsyncComponent(() => import('./views/dashboard/settings/FinancesView.vue'), {}),\n        }),\n    });\n\n    const documentsTab = new TabBarItem({\n        icon: 'file-filled',\n        name: 'Documenten',\n        component: new ComponentWithProperties(SplitViewController, {\n            root: AsyncComponent(() => import('./views/dashboard/documents/DocumentTemplatesView.vue'), {}),\n        }),\n    });\n\n    const auditLogsTab = new TabBarItem({\n        icon: 'history',\n        name: 'Logboek',\n        component: new ComponentWithProperties(SplitViewController, {\n            root: new ComponentWithProperties(AuditLogsView, {}),\n        }),\n    });\n\n    const sharedMoreItems: TabBarItem[] = [];\n\n    if (STAMHOOFD.CHANGELOG_URL) {\n        sharedMoreItems.push(\n            new TabBarItem({\n                icon: 'gift',\n                name: 'Wat is er nieuw?',\n                badge: whatsNewBadge,\n                action: async function () {\n                    window.open(STAMHOOFD.CHANGELOG_URL![STAMHOOFD.fixedCountry ?? reactiveSession.organization?.address?.country ?? ''] ?? STAMHOOFD.CHANGELOG_URL![''], '_blank');\n                    whatsNewBadge.value = '';\n                    localStorage.setItem('what-is-new', WhatsNewCount.toString());\n                },\n            }),\n        );\n    }\n\n    if (STAMHOOFD.domains.documentation) {\n        sharedMoreItems.push(\n            new TabBarItem({\n                icon: 'book',\n                name: 'Documentatie',\n                action: async function () {\n                    window.open('https://' + LocalizedDomains.documentation, '_blank');\n                },\n            }),\n        );\n    }\n\n    if (STAMHOOFD.NOLT_URL) {\n        sharedMoreItems.push(\n            new TabBarItem({\n                icon: 'feedback',\n                name: 'Feedback',\n                action: async function () {\n                    const NoltHelper = (await import('./classes/NoltHelper'));\n                    await NoltHelper.openNolt(reactiveSession, false);\n                },\n            }),\n        );\n    }\n\n    // todo: accept terms view\n    // if (this.fullAccess && !this.$organization.meta.didAcceptLatestTerms) {\n    //     // Show new terms view if needed\n    //     LoadComponent(() => import(/* webpackChunkName: \"AcceptTermsView\" */ \"./AcceptTermsView.vue\"), {}, { instant: true }).then((component) => {\n    //         this.present(component.setDisplayStyle(\"popup\").setAnimated(false))\n    //     }).catch(console.error)\n    // }\n\n    return wrapContext(reactiveSession, 'dashboard',\n        new ComponentWithProperties(AuthenticatedView, {\n            root: wrapWithModalStack(\n                new ComponentWithProperties(TabBarController, {\n                    tabs: computed(() => {\n                        const organization = reactiveSession.organization;\n\n                        const tabs: (TabBarItem | TabBarItemGroup)[] = [\n                            startTab,\n                        ];\n\n                        if (organization?.meta.packages.useMembers) {\n                            tabs.push(membersTab);\n                        }\n\n                        tabs.push(calendarTab);\n\n                        if (organization?.meta.packages.useWebshops) {\n                            if (reactiveSession.auth.hasAccessRight(AccessRight.OrganizationCreateWebshops) || !!organization.webshops.find(w => reactiveSession.auth.canAccessWebshop(w, PermissionLevel.Read))) {\n                                tabs.push(webshopsTab);\n                            }\n                        }\n\n                        const moreTab = new TabBarItemGroup({\n                            icon: 'category',\n                            name: 'Meer',\n                            items: [\n                                ...sharedMoreItems, // need to create a new array, don't pass directly!\n                            ],\n                        });\n\n                        if (reactiveSession.auth.hasFullAccess()) {\n                            if (manualFeatureFlag('audit-logs', reactiveSession)) {\n                                moreTab.items.unshift(auditLogsTab);\n                            }\n                            moreTab.items.unshift(documentsTab);\n                            moreTab.items.unshift(financesTab);\n                            moreTab.items.unshift(settingsTab);\n                        }\n                        else if (reactiveSession.auth.hasAccessRight(AccessRight.OrganizationManagePayments)) {\n                            moreTab.items.unshift(financesTab);\n                        }\n\n                        if (moreTab.items.length > 0) {\n                            tabs.push(moreTab);\n                        }\n\n                        return tabs;\n                    }),\n                }),\n            ),\n            loginRoot: wrapWithModalStack(getNonAutoLoginRoot(reactiveSession, options)),\n            noPermissionsRoot: getNoPermissionsView(),\n        }),\n        options,\n    );\n}\n","export default import.meta.ROLLUP_FILE_URL_B5xPCdjR;","export default import.meta.ROLLUP_FILE_URL_BYbRHy2h;","export default import.meta.ROLLUP_FILE_URL_Zwq40AJm;","<template>\n    <LoadingViewTransition :error-box=\"loadingOrganizationErrorBox\">\n        <div v-if=\"!loadingOrganization\" class=\"st-view charge-memberships-view\">\n            <STNavigationBar title=\"Aansluitingen aanrekenen\" />\n\n            <main class=\"center\">\n                <h1>\n                    {{ $t('fb8c1c30-2108-4a1b-a412-0381263e860e') }}\n                </h1>\n\n                <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n                <p v-if=\"summary && summary.running\" class=\"info-box icon clock\">\n                    Er is momenteel een aanrekening bezig. Wacht tot deze is afgelopen.\n                </p>\n                <template v-else>\n                    <template v-if=\"membershipOrganization\">\n                        <hr>\n                        <h2>Boekhouding {{ membershipOrganization.name }}</h2>\n\n                        <STList class=\"illustration-list\">\n                            <STListItem :selectable=\"true\" class=\"left-center\" element-name=\"a\" :href=\"'/beheerders/' + membershipOrganization.uri + '/boekhouding/exporteren'\">\n                                <template #left>\n                                    <img src=\"@stamhoofd/assets/images/illustrations/calculator.svg\">\n                                </template>\n                                <h2 class=\"style-title-list\">\n                                    {{ $t('77e1bb0a-166c-4d37-9dd6-c5ad10a9d91b') }}\n                                </h2>\n                                <p class=\"style-description\">\n                                    {{ $t(\"64633f7b-2d6e-4ad2-abb1-e9dd77d9a81f\") }}\n                                </p>\n                                <template #right>\n                                    <span class=\"icon external gray\" />\n                                </template>\n                            </STListItem>\n\n                            <STListItem :selectable=\"true\" class=\"left-center\" element-name=\"a\" :href=\"'/beheerders/' + membershipOrganization.uri + '/boekhouding/overschrijvingen'\">\n                                <template #left>\n                                    <img src=\"@stamhoofd/assets/images/illustrations/check-transfer.svg\">\n                                </template>\n                                <h2 class=\"style-title-list\">\n                                    {{ $t('35f1db1d-e8bd-4a0c-8141-97b8c716ec17') }}\n                                </h2>\n                                <p class=\"style-description\">\n                                    {{ $t('143d3f17-d547-47ff-9b83-f8587bcbc16c') }}\n                                </p>\n                                <template #right>\n                                    <span class=\"icon external gray\" />\n                                </template>\n                            </STListItem>\n\n                            <STListItem :selectable=\"true\" class=\"left-center\" element-name=\"a\" :href=\"'/beheerders/' + membershipOrganization.uri + '/boekhouding/betalingen'\">\n                                <template #left>\n                                    <img src=\"@stamhoofd/assets/images/illustrations/creditcards.svg\">\n                                </template>\n                                <h2 class=\"style-title-list\">\n                                    {{ $t('9ac518c6-00fc-47c1-bd01-2f1f6fa17613') }}\n                                </h2>\n                                <p class=\"style-description\">\n                                    {{ $t('67433a1e-efe1-48a1-9b4c-84dea499c5b9') }}\n                                </p>\n                                <template #right>\n                                    <span class=\"icon external gray\" />\n                                </template>\n                            </STListItem>\n\n                            <STListItem :selectable=\"true\" class=\"left-center\" element-name=\"a\" :href=\"'/beheerders/' + membershipOrganization.uri + '/boekhouding/openstaande-bedragen'\">\n                                <template #left>\n                                    <img src=\"@stamhoofd/assets/images/illustrations/outstanding-amount.svg\">\n                                </template>\n                                <h2 class=\"style-title-list\">\n                                    {{ $t('231f28d7-292a-43bc-877b-751012b6ae48') }}\n                                </h2>\n                                <p class=\"style-description\">\n                                    {{ $t('f1248bd5-36f4-40fd-9467-08bda59127d6', {name: membershipOrganization!.name}) }}\n                                </p>\n                                <template #right>\n                                    <span class=\"icon external gray\" />\n                                </template>\n                            </STListItem>\n                        </STList>\n                    </template>\n                    <hr>\n                    <h2>\n                        Aansluitingen aanrekenen\n                    </h2>\n                    <p>\n                        {{ $t(\"4a2a630f-3396-404f-9316-d660df9935a9\") }}\n                    </p>\n\n                    <div class=\"style-stats-grid\">\n                        <STInputBox title=\"Nieuwe aansluitingen\">\n                            <p class=\"style-price-big\">\n                                <span v-if=\"!summary\" class=\"style-placeholder-skeleton\" />\n                                <span v-else>\n                                    {{ formatInteger(summary.memberships) }}\n                                </span>\n                            </p>\n                        </STInputBox>\n\n                        <STInputBox title=\"Unieke leden\">\n                            <p class=\"style-price-big\">\n                                <span v-if=\"!summary\" class=\"style-placeholder-skeleton\" />\n                                <span v-else>\n                                    {{ formatInteger(summary.members) }}\n                                </span>\n                            </p>\n                        </STInputBox>\n\n                        <STInputBox title=\"Totaal bedrag\">\n                            <p class=\"style-price-big\">\n                                <span v-if=\"!summary\" class=\"style-placeholder-skeleton\" />\n                                <span v-else>\n                                    {{ formatPrice(summary.price) }}\n                                </span>\n                            </p>\n                        </STInputBox>\n\n                        <STInputBox title=\"Unieke groepen\">\n                            <p class=\"style-price-big\">\n                                <span v-if=\"!summary\" class=\"style-placeholder-skeleton\" />\n                                <span v-else>\n                                    {{ formatInteger(summary.organizations) }}\n                                </span>\n                            </p>\n                        </STInputBox>\n                    </div>\n\n                    <p class=\"style-button-bar\">\n                        <LoadingButton :loading=\"charging\">\n                            <button class=\"button primary\" type=\"button\" @click=\"charge\">\n                                {{ $t('fb8224d8-e010-4632-9d50-91cb42a35215') }}\n                            </button>\n                        </LoadingButton>\n                    </p>\n                    <p class=\"style-description-small\">\n                        {{ $t('ffd221f8-0f55-4b66-99f4-d43916f55f90') }}\n                    </p>\n\n                    <hr>\n                    <h2>\n                        {{ $t('5e9e86f7-81f6-4ffe-9cda-95982de2b4cb') }}\n                    </h2>\n                    <p>\n                        {{ $t('f1931dcf-219f-4ca2-935b-d5a6747ddbdb') }}\n                    </p>\n\n                    <p v-if=\"membershipOrganization\" class=\"info-box\">\n                        {{ $t('550e876b-f397-44a5-9e0a-fb5ce6df3a40') }}\n                    </p>\n\n                    <STList v-if=\"membershipOrganization\">\n                        <STListItem :selectable=\"true\" @click=\"chooseMembershipOrganization\">\n                            <template #left>\n                                <OrganizationAvatar :organization=\"membershipOrganization\" />\n                            </template>\n\n                            <h3 class=\"style-title-list\">\n                                {{ membershipOrganization.name }}\n                            </h3>\n\n                            <template #right>\n                                <span class=\"button text\">\n                                    {{ $t('6c9746ca-285b-444a-89d3-4052897e2dc2') }}\n                                    <span class=\"icon arrow-right-small\" />\n                                </span>\n                            </template>\n                        </STListItem>\n                    </STList>\n                    <p v-else class=\"warning-box with-button selectable\" @click=\"chooseMembershipOrganization\">\n                        {{ $t('f4c0da5a-03a8-4be2-9ae1-ea049b5b46af') }}\n\n                        <button class=\"button text\" type=\"button\">\n                            {{ $t('1310f065-caf5-41e6-a3b8-cf9b39336483') }}\n                        </button>\n                    </p>\n\n                    <p v-if=\"hasChanges\" class=\"style-button-bar\">\n                        <LoadingButton :loading=\"saving\">\n                            <button class=\"button primary\" type=\"button\" @click=\"save\">\n                                {{ $t('5d9d5777-5ecb-4223-8dc2-973ee3fee4bb') }}\n                            </button>\n                        </LoadingButton>\n                    </p>\n\n                    <div v-if=\"summary && summary?.trials.members > 0\" class=\"container\">\n                        <hr>\n                        <h2>{{ $t('cc3d3da6-27ce-4f32-a696-4e08d649a7bc') }}</h2>\n\n                        <div class=\"style-stats-grid\">\n                            <STInputBox :title=\"$t('faa31f24-a42f-454b-9ceb-417c46dcee0d')\">\n                                <p class=\"style-price-big\">\n                                    <span v-if=\"!summary\" class=\"style-placeholder-skeleton\" />\n                                    <span v-else>\n                                        {{ formatInteger(summary.trials.memberships) }}\n                                    </span>\n                                </p>\n                            </STInputBox>\n\n                            <STInputBox :title=\"$t('8e0924af-042c-42ab-85e1-dda0a2106b98')\">\n                                <p class=\"style-price-big\">\n                                    <span v-if=\"!summary\" class=\"style-placeholder-skeleton\" />\n                                    <span v-else>\n                                        {{ formatInteger(summary.trials.members) }}\n                                    </span>\n                                </p>\n                            </STInputBox>\n\n                            <STInputBox :title=\"$t('e886fb7a-9312-4e74-b426-5acb694fe009')\">\n                                <p class=\"style-price-big\">\n                                    <span v-if=\"!summary\" class=\"style-placeholder-skeleton\" />\n                                    <span v-else>\n                                        {{ formatPrice(summary.trials.price) }}\n                                    </span>\n                                </p>\n                            </STInputBox>\n\n                            <STInputBox :title=\"$t('b789017f-58d2-438b-b73a-2a4d075e3c5b')\">\n                                <p class=\"style-price-big\">\n                                    <span v-if=\"!summary\" class=\"style-placeholder-skeleton\" />\n                                    <span v-else>\n                                        {{ formatInteger(summary.trials.organizations) }}\n                                    </span>\n                                </p>\n                            </STInputBox>\n                        </div>\n                    </div>\n\n                    <div v-for=\"type of platform.config.membershipTypes\" :key=\"type.id\" class=\"container\">\n                        <hr>\n                        <h2>{{ $t('ed995f5d-eeff-44ad-ac35-f518b2892524') }} \"{{ type.name }}\"</h2>\n\n                        <div class=\"style-stats-grid\">\n                            <STInputBox :title=\"$t('faa31f24-a42f-454b-9ceb-417c46dcee0d')\">\n                                <p class=\"style-price-big\">\n                                    <span v-if=\"!summary\" class=\"style-placeholder-skeleton\" />\n                                    <span v-else>\n                                        {{ formatInteger(getSummaryForType(type).memberships) }}\n                                    </span>\n                                </p>\n                            </STInputBox>\n\n                            <STInputBox :title=\"$t('8e0924af-042c-42ab-85e1-dda0a2106b98')\">\n                                <p class=\"style-price-big\">\n                                    <span v-if=\"!summary\" class=\"style-placeholder-skeleton\" />\n                                    <span v-else>\n                                        {{ formatInteger(getSummaryForType(type).members) }}\n                                    </span>\n                                </p>\n                            </STInputBox>\n\n                            <STInputBox :title=\"$t('e886fb7a-9312-4e74-b426-5acb694fe009')\">\n                                <p class=\"style-price-big\">\n                                    <span v-if=\"!summary\" class=\"style-placeholder-skeleton\" />\n                                    <span v-else>\n                                        {{ formatPrice(getSummaryForType(type).price) }}\n                                    </span>\n                                </p>\n                            </STInputBox>\n\n                            <STInputBox :title=\"$t('b789017f-58d2-438b-b73a-2a4d075e3c5b')\">\n                                <p class=\"style-price-big\">\n                                    <span v-if=\"!summary\" class=\"style-placeholder-skeleton\" />\n                                    <span v-else>\n                                        {{ formatInteger(getSummaryForType(type).organizations) }}\n                                    </span>\n                                </p>\n                            </STInputBox>\n                        </div>\n                    </div>\n                </template>\n            </main>\n        </div>\n    </LoadingViewTransition>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Decoder } from '@simonbackx/simple-encoding';\nimport { CenteredMessage, ErrorBox, LoadingViewTransition, OrganizationAvatar, Toast, useContext, useErrors, useExternalOrganization, useInterval, usePatch, usePlatform } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { usePlatformManager, useRequestOwner } from '@stamhoofd/networking';\nimport { ChargeMembershipsSummary, ChargeMembershipsTypeSummary, PlatformMembershipType } from '@stamhoofd/structures';\nimport { computed, onActivated, Ref, ref } from 'vue';\n\nconst errors = useErrors();\nconst summary = ref(null) as Ref<null | ChargeMembershipsSummary>;\nconst context = useContext();\nconst owner = useRequestOwner();\nconst platform = usePlatform();\nconst { patch, patched, addPatch, hasChanges, reset } = usePatch(platform);\nconst platformManager = usePlatformManager();\nconst saving = ref(false);\nconst charging = ref(false);\nlet loading = false;\nconst $t = useTranslate();\n\nconst { externalOrganization: membershipOrganization, choose: $chooseMembershipOrganization, loading: loadingOrganization, errorBox: loadingOrganizationErrorBox } = useExternalOrganization(\n    computed({\n        get: () => patched.value.membershipOrganizationId,\n        set: membershipOrganizationId => addPatch({\n            membershipOrganizationId,\n        }),\n    }),\n);\n\nuseInterval(reload, 10 * 1000);\n\nonActivated(() => {\n    reload().catch(console.error);\n});\n\nconst chooseMembershipOrganization = () => {\n    return $chooseMembershipOrganization($t('78f9f25f-e02d-4310-af9e-87b075aa1232'));\n};\n\nasync function save() {\n    if (saving.value) {\n        return;\n    }\n    saving.value = true;\n    try {\n        await platformManager.value.patch(patch.value, false);\n        reset();\n        Toast.success($t('85dd1619-e565-4bd7-b711-58e864d423c7')).show();\n    }\n    catch (e) {\n        Toast.fromError(e).show();\n    }\n    saving.value = false;\n}\n\nasync function reload() {\n    if (loading) {\n        return;\n    }\n\n    try {\n        loading = true;\n        const response = await context.value.authenticatedServer.request({\n            method: 'GET',\n            path: '/admin/charge-memberships/summary',\n            decoder: ChargeMembershipsSummary as Decoder<ChargeMembershipsSummary>,\n            owner,\n            shouldRetry: true,\n        });\n        summary.value = response.data;\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    loading = false;\n}\n\nasync function charge() {\n    if (charging.value) {\n        return;\n    }\n    if (!await CenteredMessage.confirm($t('17cffcca-0926-49ae-98a1-123e3459cd20'), $t('03d73550-8d06-475c-815b-f893ae033b03'))) {\n        return;\n    }\n\n    charging.value = true;\n    try {\n        await context.value.authenticatedServer.request({\n            method: 'POST',\n            path: '/admin/charge-memberships',\n            owner,\n        });\n        Toast.success($t('14f323d7-aec9-42c7-9cb0-3c2769770f02')).show();\n        await reload();\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    charging.value = false;\n}\n\nfunction getSummaryForType(type: PlatformMembershipType): ChargeMembershipsTypeSummary {\n    if (!summary.value) {\n        return ChargeMembershipsTypeSummary.create({});\n    }\n    return summary.value.membershipsPerType.get(type.id) ?? ChargeMembershipsTypeSummary.create({});\n}\n\n</script>\n\n<style lang=\"scss\">\n.charge-memberships-view {\n    .style-stats-grid {\n        padding: 15px 0;\n    }\n\n    .style-button-bar {\n        padding-top: 15px;\n        padding-bottom: 5px;\n    }\n}\n</style>\n","import { reactive } from 'vue';\nimport { Storage } from '@stamhoofd/networking';\n\nexport function useCollapsed(globalIdentifier: string) {\n    const collapsedSections = reactive(new Set<string>());\n\n    const load = async () => {\n        try {\n            const value = await Storage.keyValue.getItem('collapsed-' + globalIdentifier);\n            if (value) {\n                const values = JSON.parse(value);\n                for (const value of values) {\n                    collapsedSections.add(value);\n                }\n            }\n        }\n        catch (e) {\n            console.error(e);\n        }\n    };\n\n    const save = async () => {\n        try {\n            const values = [...collapsedSections.values()];\n            await Storage.keyValue.setItem('collapsed-' + globalIdentifier, JSON.stringify(values));\n        }\n        catch (e) {\n            console.error(e);\n        }\n    };\n\n    load().catch(console.error);\n\n    return {\n        toggle(id: string) {\n            if (collapsedSections.has(id)) {\n                collapsedSections.delete(id);\n                save().catch(console.error);\n            }\n            else {\n                collapsedSections.add(id);\n                save().catch(console.error);\n            }\n        },\n        isCollapsed(id: string) {\n            return collapsedSections.has(id);\n        },\n    };\n}\n","<template>\n    <div>\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n        <PrefixInput v-model=\"uri\" placeholder=\"Vul een URI in\" :prefix=\"prefix\" @blur=\"onBlur\" />\n        <template v-if=\"errors.errorBox === null && (checkingAvailability || (isAvailable !== null)) \">\n            <p v-if=\"checkingAvailability\" class=\"loading-box\">\n                <Spinner />\n                Nakijken of deze nog beschikbaar is...\n            </p>\n\n            <p v-else-if=\"uri.length === 0\" class=\"error-box\">\n                Dit mag niet leeg zijn\n            </p>\n\n            <p v-else-if=\"!isAvailable\" class=\"error-box\">\n                Deze URI is al in gebruik. Kies een andere.\n            </p>\n\n            <p v-else class=\"success-box\">\n                Deze URI is nog beschikbaar!\n            </p>\n        </template>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { isSimpleError, isSimpleErrors } from '@simonbackx/simple-errors';\nimport { Request } from '@simonbackx/simple-networking';\nimport { ErrorBox, PrefixInput, Spinner, Validator, useErrors, useValidation } from '@stamhoofd/components';\nimport { NetworkManager, useRequestOwner } from '@stamhoofd/networking';\nimport { Formatter, throttle } from '@stamhoofd/utility';\nimport { ref, watch } from 'vue';\n\nconst uri = defineModel({ required: true, type: String });\nconst props = withDefaults(\n    defineProps<{\n        validator: Validator;\n        allowValue: string;\n    }>(),\n    {},\n);\n\nconst prefix = STAMHOOFD.domains.dashboard + '/';\nconst checkingAvailability = ref(false);\nconst isAvailable = ref<boolean | null>(null);\nconst lastCheckedUri = ref<string | null>(null);\nconst owner = useRequestOwner();\nlet checkCount = 0;\nconst errors = useErrors({ validator: props.validator });\n\nuseValidation(props.validator, async () => {\n    if (uri.value.length === 0) {\n        return false;\n    }\n\n    if (isAvailable.value === false) {\n        return false;\n    }\n\n    const available = await checkAvailable();\n\n    if (!available) {\n        return false;\n    }\n\n    return true;\n});\nconst doThrottledCheck = throttle(checkAvailable, 1000);\n\nwatch(uri, () => {\n    if (uri.value === props.allowValue && props.allowValue) {\n        checkCount += 1;\n        Request.cancelAll(owner);\n        isAvailable.value = true;\n        lastCheckedUri.value = uri.value;\n        checkingAvailability.value = false;\n        return true;\n    }\n\n    if (uri.value.length === 0) {\n        checkCount += 1;\n        Request.cancelAll(owner);\n        isAvailable.value = null;\n        checkingAvailability.value = false;\n        return false;\n    }\n\n    if (isAvailable.value !== null && lastCheckedUri.value === Formatter.slug(uri.value)) {\n        checkCount += 1;\n        Request.cancelAll(owner);\n        checkingAvailability.value = false;\n        return isAvailable.value;\n    }\n\n    checkingAvailability.value = true;\n    doThrottledCheck();\n});\n\nasync function onBlur() {\n    uri.value = Formatter.slug(uri.value);\n    await checkAvailable();\n}\n\nasync function checkAvailable(): Promise<boolean> {\n    checkCount += 1;\n    Request.cancelAll(owner);\n\n    if (uri.value === props.allowValue && props.allowValue) {\n        isAvailable.value = true;\n        lastCheckedUri.value = uri.value;\n        checkingAvailability.value = false;\n        return true;\n    }\n\n    if (uri.value.length === 0) {\n        isAvailable.value = null;\n        checkingAvailability.value = false;\n        return false;\n    }\n\n    if (isAvailable.value !== null && lastCheckedUri.value === Formatter.slug(uri.value)) {\n        checkingAvailability.value = false;\n        return isAvailable.value ?? false;\n    }\n\n    return await doCheckAvailable();\n}\n\nasync function doCheckAvailable() {\n    if (lastCheckedUri.value === Formatter.slug(uri.value)) {\n        checkingAvailability.value = false;\n        return isAvailable.value ?? false;\n    }\n\n    const initialCheckCount = checkCount;\n\n    // fetch\n    try {\n        checkingAvailability.value = true;\n        await NetworkManager.server.request({\n            method: 'GET',\n            path: '/organization-from-uri',\n            query: {\n                uri: Formatter.slug(uri.value),\n            },\n            shouldRetry: true,\n            owner,\n        });\n    }\n    catch (e) {\n        if (initialCheckCount !== checkCount) {\n            return false;\n        }\n        checkingAvailability.value = false;\n\n        if (isSimpleError(e) || isSimpleErrors(e)) {\n            if (e.hasCode('unknown_organization')) {\n                isAvailable.value = true;\n                lastCheckedUri.value = Formatter.slug(uri.value);\n                return true;\n            }\n        }\n\n        errors.errorBox = new ErrorBox(e);\n        return false;\n    }\n\n    if (initialCheckCount !== checkCount) {\n        return false;\n    }\n    checkingAvailability.value = false;\n    isAvailable.value = false;\n    lastCheckedUri.value = Formatter.slug(uri.value);\n    return false;\n}\n\n</script>\n","<template>\n    <STListItem :selectable=\"true\" element-name=\"label\">\n        <template #left>\n            <Checkbox v-model=\"enabled\" :disabled=\"lockValue !== null\" />\n        </template>\n\n        <h2 class=\"style-title-list\">\n            {{ tag.name }}\n        </h2>\n    </STListItem>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useEmitPatch } from '@stamhoofd/components';\nimport { Organization, OrganizationMetaData, OrganizationTag } from '@stamhoofd/structures';\nimport { computed } from 'vue';\n\nconst props = withDefaults(defineProps<{\n    tag: OrganizationTag;\n    organization: Organization;\n    lockValue?: boolean | null;\n}>(), {\n    lockValue: null,\n});\nconst emit = defineEmits(['patch:organization']);\n\nconst { patched, addPatch } = useEmitPatch<Organization>(props, emit, 'organization');\n\nconst enabled = computed({\n    get: () => props.lockValue !== null ? props.lockValue : patched.value.meta.tags.includes(props.tag.id),\n    set: (value: boolean) => {\n        if (value === patched.value.meta.tags.includes(props.tag.id)) {\n            return;\n        }\n\n        const removed = patched.value.meta.tags.filter(id => id !== props.tag.id);\n        if (value) {\n            removed.push(props.tag.id);\n        }\n\n        addPatch({\n            meta: OrganizationMetaData.patch({\n                tags: removed as any,\n            }),\n        });\n    },\n});\n\n</script>\n","<template>\n    <SaveView :title=\"title\" :loading=\"saving\" :disabled=\"!hasChanges\" @save=\"save\">\n        <h1 class=\"style-navigation-title\">\n            {{ title }}\n        </h1>\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <div class=\"split-inputs\">\n            <div>\n                <STInputBox :title=\"$t('6793e0dc-66f0-4a70-b8ac-fb41e2063871')\" error-fields=\"name\" :error-box=\"errors.errorBox\">\n                    <input\n                        id=\"organization-name\"\n                        ref=\"firstInput\"\n                        v-model=\"name\"\n                        class=\"input\"\n                        type=\"text\"\n                        :placeholder=\"$t('bc8578de-ee3c-4aac-bd19-3fd4040168a4')\"\n                        autocomplete=\"organization\"\n                    >\n                </STInputBox>\n\n                <AddressInput v-model=\"address\" :title=\"$t('74303d1c-2700-4340-816e-03cb9c3fb188')\" :validator=\"errors.validator\" />\n            </div>\n\n            <div>\n                <UrlInput v-model=\"website\" :title=\"$t('0e17f20e-e0a6-4fa0-8ec4-378e4325bea5')\" :placeholder=\"$t('5d75775a-a4b5-426a-aea9-b1e75ee5f055')\" :validator=\"errors.validator\" :required=\"false\" />\n\n                <p class=\"style-description-small\">\n                    {{ $t('5f0e24bb-10db-428b-a480-6f73d959cafa') }}\n                </p>\n            </div>\n        </div>\n\n        <STInputBox :title=\"$t('2cc5355d-3c19-4a6e-a2c7-1d93e423a8d2')\" error-fields=\"name\" :error-box=\"errors.errorBox\">\n            <OrganizationUriInput\n                v-model=\"uri\"\n                :validator=\"errors.validator\"\n                :allow-value=\"props.organization.uri\"\n            />\n        </STInputBox>\n        <p class=\"style-description-small\">\n            {{ $t('81c91169-db1e-4819-8716-5382ffbaa43b') }}\n        </p>\n\n        <div v-for=\"category of recordCategories\" :key=\"category.id\" class=\"container\">\n            <hr>\n            <FillRecordCategoryBox :category=\"category\" :value=\"patched\" :validator=\"errors.validator\" :level=\"2\" :all-optional=\"true\" :force-mark-reviewed=\"false\" @patch=\"patchAnswers\" />\n        </div>\n\n        <hr>\n        <h2>{{ $t('0be39baa-0b8e-47a5-bd53-0feeb14a0f93') }}</h2>\n        <STList>\n            <SelectOrganizationTagRow v-for=\"tag in rootTags\" :key=\"tag.id\" :organization=\"patched\" :tag=\"tag\" @patch:organization=\"addPatch\" />\n        </STList>\n\n        <div v-for=\"tag in allTagsWithChildren\" :key=\"tag.id\" class=\"container\">\n            <JumpToContainer :visible=\"isSelected(tag)\">\n                <hr>\n                <h2>{{ $t('0be39baa-0b8e-47a5-bd53-0feeb14a0f93') }} → {{ tag.name }}</h2>\n                <STList>\n                    <SelectOrganizationTagRow v-for=\"childTag in tagIdsToTags(tag.childTags)\" :key=\"childTag.id\" :organization=\"patched\" :tag=\"childTag\" @patch:organization=\"addPatch\" />\n                </STList>\n            </JumpToContainer>\n        </div>\n\n        <template v-if=\"auth.hasFullPlatformAccess()\">\n            <hr>\n            <h2>{{ $t('97475ade-4e97-4989-b2f4-fecd534db3c4') }}</h2>\n\n            <STList>\n                <CheckboxListItem v-model=\"active\" :label=\"$t('97475ade-4e97-4989-b2f4-fecd534db3c4')\" description=\"Leden kunnen geen inactieve groepen vinden of erbij inloggen.\" />\n            </STList>\n        </template>\n    </SaveView>\n</template>\n\n<script lang=\"ts\" setup>\nimport { AutoEncoderPatchType } from '@simonbackx/simple-encoding';\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { usePop } from '@simonbackx/vue-app-navigation';\nimport { AddressInput, CenteredMessage, CheckboxListItem, ErrorBox, FillRecordCategoryBox, JumpToContainer, UrlInput, useAuth, useErrors, usePatch, usePlatform } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { usePlatformManager } from '@stamhoofd/networking';\nimport { Organization, OrganizationMetaData, OrganizationPrivateMetaData, OrganizationTag, PatchAnswers, TagHelper } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed, ref, watch } from 'vue';\nimport OrganizationUriInput from './components/OrganizationUriInput.vue';\nimport SelectOrganizationTagRow from './tags/components/SelectOrganizationTagRow.vue';\n\nconst platform = usePlatform();\nconst errors = useErrors();\nconst pop = usePop();\nconst auth = useAuth();\n\nconst props = defineProps<{\n    organization: Organization;\n    isNew: boolean;\n    saveHandler: (patch: AutoEncoderPatchType<Organization>) => Promise<void>;\n}>();\n\nconst { patched, hasChanges, addPatch, patch } = usePatch(props.organization);\nconst $t = useTranslate();\nconst platformManager = usePlatformManager();\n\nconst saving = ref(false);\n\nconst title = computed(() => props.isNew ? $t('7066aee7-9e51-4767-b288-460646ceca50') : $t('e276e384-22f1-4894-93ae-8874329c6767'));\n\nconst name = computed({\n    get: () => patched.value.name,\n    set: (value) => {\n        addPatch({ name: value });\n\n        if (props.isNew && !props.organization.uri) {\n            addPatch({ uri: Formatter.slug(value) });\n        }\n    },\n});\n\nconst uri = computed({\n    get: () => patched.value.uri,\n    set: value => addPatch({ uri: value }),\n});\n\nconst address = computed({\n    get: () => patched.value.address,\n    set: value => addPatch({ address: value }),\n});\n\nconst website = computed({\n    get: () => patched.value.website,\n    set: value => addPatch({ website: value }),\n});\n\nconst active = computed({\n    get: () => patched.value.active,\n    set: value => addPatch({ active: value }),\n});\n\nfunction patchAnswers(patch: PatchAnswers) {\n    addPatch({\n        privateMeta: OrganizationPrivateMetaData.patch({ recordAnswers: patch }),\n    });\n}\n\nconst recordCategories = computed(() =>\n    platform.value.config.organizationLevelRecordsConfiguration.getEnabledCategories(patched.value),\n);\n\nconst platformTags = computed(() => platform.value.config.tags);\nconst rootTags = computed(() => TagHelper.getRootTags(platformTags.value));\nconst selectedTagIds = computed(() => patched.value.meta.tags);\nconst selectedTags = computed(() => tagIdsToTags(selectedTagIds.value));\nconst allTagsWithChildren = computed(() => platformTags.value.filter(tag => tag.childTags.length > 0));\nconst selectedTagsWithChildren = computed(() => selectedTags.value.filter(tag => tag.childTags.length > 0));\n\nwatch(() => selectedTagsWithChildren.value, (selectedTagsWithChildren) => {\n    const tagIds = selectedTagIds.value;\n\n    // delete tags that are subtags of tags that are not selected\n    const tagsToDelete = tagIds.filter(tagId =>\n        !(rootTags.value.some(rootTag => rootTag.id === tagId)\n            || selectedTagsWithChildren.some(tagWithChildren => tagWithChildren.childTags.includes(tagId))\n        ));\n\n    if (tagsToDelete.length > 0) {\n        setTagIds(tagIds.filter(id => !tagsToDelete.includes(id)));\n    }\n}, { immediate: true });\n\nfunction isSelected(tag: OrganizationTag): boolean {\n    return selectedTagIds.value.includes(tag.id);\n}\n\nasync function save() {\n    if (saving.value) {\n        return;\n    }\n\n    saving.value = true;\n\n    if (!await errors.validator.validate()) {\n        saving.value = false;\n        return;\n    }\n\n    try {\n        if (name.value.length === 0) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                field: 'name',\n                message: $t('11b55f40-f3d4-4ce7-9831-57d188367b9f'),\n            });\n        }\n        await props.saveHandler(patch.value);\n\n        // Reload platform in the background\n        await platformManager.value.forceUpdate();\n\n        await pop({ force: true });\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n\n    saving.value = false;\n}\n\nconst shouldNavigateAway = async () => {\n    if (!hasChanges.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm($t('996a4109-5524-4679-8d17-6968282a2a75'), $t('106b3169-6336-48b8-8544-4512d42c4fd6'));\n};\n\nfunction tagIdsToTags(ids: string[]) {\n    return ids.map(id => platformTags.value.find(pt => pt.id === id)).filter(x => x !== undefined);\n}\n\nfunction setTagIds(tagIds: string[]) {\n    addPatch({\n        meta: OrganizationMetaData.patch({\n            tags: tagIds as any,\n        }),\n    });\n}\n\ndefineExpose({\n    shouldNavigateAway,\n});\n</script>\n","export default import.meta.ROLLUP_FILE_URL_BeNgojOl;","export default import.meta.ROLLUP_FILE_URL_1XgU9to4;","<template>\n    <div>\n        <ViewOrganizationRecordCategoryBox v-for=\"category of recordCategories\" :key=\"category.id\" :organization=\"organization\" :category=\"category\" />\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { usePlatform } from '@stamhoofd/components';\nimport { Organization } from '@stamhoofd/structures';\nimport { computed } from 'vue';\nimport ViewOrganizationRecordCategoryBox from './ViewOrganizationRecordCategoryBox.vue';\n\ndefineOptions({\n    inheritAttrs: false,\n});\n\nconst props = defineProps<{\n    organization: Organization;\n}>();\n\nconst platform = usePlatform();\n\nconst recordCategories = computed(() => {\n    return platform.value.config.organizationLevelRecordsConfiguration.getEnabledCategories(props.organization);\n});\n\n</script>\n","<template>\n    <div class=\"st-view\">\n        <STNavigationBar :title=\"title\">\n            <template #right>\n                <button v-if=\"hasWrite\" v-tooltip=\"'Bewerken'\" class=\"button icon navigation edit\" type=\"button\" @click=\"editOrganization\" />\n                <button v-if=\"hasPrevious || hasNext\" v-tooltip=\"'Ga naar vorige groep'\" type=\"button\" class=\"button navigation icon arrow-up\" :disabled=\"!hasPrevious\" @click=\"goBack\" />\n                <button v-if=\"hasNext || hasPrevious\" v-tooltip=\"'Ga naar volgende groep'\" type=\"button\" class=\"button navigation icon arrow-down\" :disabled=\"!hasNext\" @click=\"goForward\" />\n            </template>\n        </STNavigationBar>\n\n        <main>\n            <aside v-copyable class=\"style-title-prefix style-copyable\">\n                {{ organization.uri }}\n            </aside>\n            <h1 v-copyable class=\"style-navigation-title style-copyable\">\n                {{ title }}\n            </h1>\n\n            <p v-if=\"!organization.active\" class=\"error-box\">\n                Deze groep is inactief. Deze kan niet meer gebruikt worden en bestaat enkel nog voor archiveringsdoeleinden.\n            </p>\n\n            <STList class=\"info\">\n                <STListItem>\n                    <h3 class=\"style-definition-label\">\n                        {{ $t('622c0dd7-cddd-4417-9bfd-5f6aca2480f5') }}\n                    </h3>\n                    <p v-copyable class=\"style-definition-text style-copyable\">\n                        {{ organization.address }}\n                    </p>\n                </STListItem>\n\n                <STListItem v-for=\"company of organization.meta.companies\" :key=\"company.id\">\n                    <h3 class=\"style-definition-label\">\n                        {{ $t('3dae9ed2-c904-448a-834e-c60bfaed88d1') }}\n                    </h3>\n                    <p v-copyable class=\"style-definition-text style-copyable\">\n                        {{ company.name }}\n                    </p>\n                    <p v-if=\"company.VATNumber\" v-copyable class=\"style-description-small style-copyable\">\n                        {{ company.VATNumber }} (BTW-plichtig)\n                    </p>\n                    <p v-else-if=\"company.companyNumber\" v-copyable class=\"style-description-small style-copyable\">\n                        {{ company.companyNumber }}\n                    </p>\n                    <p v-else class=\"style-description-small\">\n                        Feitelijke vereniging\n                    </p>\n\n                    <p v-if=\"company.address\" v-copyable class=\"style-description-small style-copyable\">\n                        {{ company.address }}\n                    </p>\n                </STListItem>\n\n                <STListItem v-if=\"organization.website\" element-name=\"a\" :href=\"organization.website\" :selectable=\"true\" target=\"_blank\">\n                    <h3 class=\"style-definition-label\">\n                        {{ $t('00c90aa3-2d42-45bc-a3e7-56565b7a4e0e') }}\n                    </h3>\n                    <p class=\"style-definition-text\">\n                        {{ organization.website }}\n                    </p>\n\n                    <template #right>\n                        <button class=\"button icon external\" type=\"button\" />\n                    </template>\n                </STListItem>\n\n                <STListItem v-if=\"!isPlatform\">\n                    <h3 class=\"style-definition-label\">\n                        {{ $t('8565df22-3559-44b1-be1f-de9d1c3a7837') }}\n                    </h3>\n                    <p class=\"style-definition-text\">\n                        {{ formatDate(organization.createdAt) }}\n                    </p>\n                </STListItem>\n\n                <STListItem v-if=\"!isPlatform && organization.privateMeta\">\n                    <h3 class=\"style-definition-label\">\n                        {{ $t('bf20a769-772d-46b2-9b48-2ea29c96f113') }}\n                    </h3>\n                    <p class=\"style-definition-text\">\n                        {{ organization.privateMeta?.acquisitionTypes.join(', ') }}\n                    </p>\n                </STListItem>\n\n                <STListItem :selectable=\"hasWrite\" @click=\"hasWrite ? editOrganization() : undefined\">\n                    <h3 class=\"style-definition-label\">\n                        {{ $t('0be39baa-0b8e-47a5-bd53-0feeb14a0f93') }}\n                    </h3>\n                    <p class=\"style-definition-text\" :class=\"{placeholder: tagStringList.length === 0}\">\n                        {{ tagStringList || 'Geen' }}\n                    </p>\n\n                    <template #right>\n                        <span v-if=\"hasWrite\" class=\"icon edit gray\" />\n                    </template>\n                </STListItem>\n\n                <STListItem>\n                    <h3 class=\"style-definition-label\">\n                        {{ $t('Aantal leden' ) }}\n                    </h3>\n                    <p v-copyable class=\"style-definition-text\">\n                        <MemberCountSpan\n                            :filter=\"{\n                                registrations: {\n                                    $elemMatch: {\n                                        organizationId: organization.id,\n                                        periodId: platform.period.id\n                                    }\n                                }\n                            }\"\n                        />\n                    </p>\n                </STListItem>\n            </STList>\n\n            <hr>\n\n            <h2>{{ $t('f18beb62-a9e8-4881-865c-28ad534b6f24') }}</h2>\n\n            <p>{{ $t('Deze functies verhuizen in de toekomst grotendeels naar het administratieportaal zelf. Voorlopig zijn de acties bereikbaar via het beheerdersportaal.' ) }}</p>\n\n            <STList class=\"illustration-list\">\n                <STListItem :selectable=\"true\" class=\"left-center right-stack\" element-name=\"a\" :href=\"'/beheerders/' + organization.uri + '/instellingen'\" :target=\"$isMobile ? undefined : '_blank'\">\n                    <template #left>\n                        <img src=\"~@stamhoofd/assets/images/illustrations/edit-data.svg\">\n                    </template>\n                    <h2 class=\"style-title-list\">\n                        {{ $t('9a6474d8-0bb5-4760-8dca-e85ba79035ce') }}\n                    </h2>\n                    <p class=\"style-description\">\n                        {{ $t('a5b61d4d-207f-485c-8748-cbb04fcb2d23') }}\n                    </p>\n                    <template #right>\n                        <span class=\"icon external gray\" />\n                    </template>\n                </STListItem>\n\n                <STListItem :selectable=\"true\" class=\"left-center right-stack\" element-name=\"a\" :href=\"'/beheerders/' + organization.uri + '/leden'\" :target=\"$isMobile ? undefined : '_blank'\">\n                    <template #left>\n                        <img src=\"~@stamhoofd/assets/images/illustrations/group.svg\">\n                    </template>\n                    <h2 class=\"style-title-list\">\n                        {{ $t('c3158561-e0dc-4dd5-8581-d2d861238946') }}\n                    </h2>\n                    <p class=\"style-description\">\n                        {{ $t('eb91fb5c-72fc-44d4-9b84-4c9f7791e27a') }}\n                    </p>\n                    <template #right>\n                        <span class=\"icon external gray\" />\n                    </template>\n                </STListItem>\n\n                <STListItem :selectable=\"true\" class=\"left-center right-stack\" element-name=\"a\" :href=\"'/beheerders/' + organization.uri\" :target=\"$isMobile ? undefined : '_blank'\">\n                    <template #left>\n                        <img src=\"~@stamhoofd/assets/images/illustrations/laptop-key.svg\">\n                    </template>\n                    <h2 class=\"style-title-list\">\n                        {{ $t('bda3721a-3b39-4409-9407-e0b3abde0009') }}\n                    </h2>\n                    <p class=\"style-description\">\n                        {{ $t('2300284a-a015-4c97-8ad1-6c9f2bbde174') }}\n                    </p>\n                    <template #right>\n                        <span class=\"icon external gray\" />\n                    </template>\n                </STListItem>\n            </STList>\n\n            <ViewOrganizationRecordCategoriesBox :organization=\"organization\" />\n\n            <div v-if=\"setupSteps.steps.size\" class=\"container\">\n                <hr>\n                <h2>{{ $t('6355a1b9-7b98-48c4-9aca-91df9a22d66e') }}</h2>\n                <SetupStepRows :steps=\"setupSteps\" list-type=\"review\" />\n            </div>\n\n            <hr>\n            <h2>\n                {{ $t('f477755c-2d6e-473c-b9b9-2ebe0af173f3') }}\n            </h2>\n\n            <LoadingButton :loading=\"deleting\">\n                <button class=\"button secundary danger\" type=\"button\" @click=\"deleteMe\">\n                    <span class=\"icon trash\" />\n                    <span>{{ $t('838cae8b-92a5-43d2-82ba-01b8e830054b') }}</span>\n                </button>\n            </LoadingButton>\n        </main>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { AutoEncoderPatchType, Decoder, PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, usePop, usePresent } from '@simonbackx/vue-app-navigation';\nimport { CenteredMessage, GlobalEventBus, MemberCountSpan, SetupStepRows, Toast, useAuth, useBackForward, useContext, usePlatform } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { useRequestOwner } from '@stamhoofd/networking';\nimport { Organization } from '@stamhoofd/structures';\nimport { computed, ref } from 'vue';\nimport EditOrganizationView from './EditOrganizationView.vue';\nimport ViewOrganizationRecordCategoriesBox from './components/ViewOrganizationRecordCategoriesBox.vue';\n\nconst props = defineProps<{\n    organization: Organization;\n    getNext: (current: Organization) => Organization | null;\n    getPrevious: (current: Organization) => Organization | null;\n}>();\n\nconst isPlatform = STAMHOOFD.userMode === 'platform';\nconst $t = useTranslate();\nconst context = useContext();\nconst owner = useRequestOwner();\nconst pop = usePop();\nconst platform = usePlatform();\nconst present = usePresent();\nconst { goBack, goForward, hasNext, hasPrevious } = useBackForward('organization', props);\n\nconst title = computed(() => {\n    return props.organization.name;\n});\n\nconst tagStringList = computed(() => {\n    return props.organization.meta.tags.map(id => platform.value.config.tags.find(t => t.id === id)?.name ?? 'onbekend').join(', ');\n});\n\nconst setupSteps = computed(() => props.organization.period.setupSteps);\nconst auth = useAuth();\n\nconst deleting = ref(false);\nconst hasWrite = computed(() => auth.getPermissionsForOrganization(props.organization)?.hasFullAccess() ?? false);\n\nasync function editOrganization() {\n    await present({\n        modalDisplayStyle: 'popup',\n        components: [\n            new ComponentWithProperties(EditOrganizationView, {\n                organization: props.organization,\n                isNew: false,\n                saveHandler: async (patch: AutoEncoderPatchType<Organization>) => {\n                    const response = await context.value.getAuthenticatedServerForOrganization(props.organization.id).request({\n                        method: 'PATCH',\n                        path: '/organization',\n                        body: patch,\n                        shouldRetry: false,\n                        owner,\n                        decoder: Organization as Decoder<Organization>,\n                    });\n\n                    props.organization.deepSet(response.data);\n                },\n            }),\n        ],\n    });\n}\n\nasync function deleteMe() {\n    if (deleting.value) {\n        return;\n    }\n    deleting.value = true;\n\n    if (!await CenteredMessage.confirm($t('92c19888-7ac0-46b5-b691-05b29e52e110'), $t('201437e3-f779-47b6-b4de-a0fa00f3863e'), $t('9a528611-db36-4bb0-9de4-29b653ea6165'))) {\n        deleting.value = false;\n        return;\n    }\n\n    // Wait 3 seconds\n    await new Promise(resolve => setTimeout(resolve, 3000));\n\n    // Second confirmation window\n\n    if (!await CenteredMessage.confirm($t('2be85b13-52d6-4322-adcc-b491b5749422'), $t('201437e3-f779-47b6-b4de-a0fa00f3863e'), $t('9a528611-db36-4bb0-9de4-29b653ea6165'))) {\n        deleting.value = false;\n        return;\n    }\n\n    // Wait 3 seconds\n    await new Promise(resolve => setTimeout(resolve, 3000));\n\n    if (!await CenteredMessage.confirm($t('6435b870-2298-49bb-bd28-904e864178d3'), $t('201437e3-f779-47b6-b4de-a0fa00f3863e'), $t('9a528611-db36-4bb0-9de4-29b653ea6165'))) {\n        deleting.value = false;\n        return;\n    }\n\n    // Verwijderen\n\n    const patch: PatchableArrayAutoEncoder<Organization> = new PatchableArray();\n    patch.addDelete(props.organization.id);\n\n    try {\n        await context.value.authenticatedServer.request({\n            method: 'PATCH',\n            path: '/admin/organizations',\n            body: patch,\n            shouldRetry: false,\n            owner,\n        });\n\n        GlobalEventBus.sendEvent('organizations-deleted', [props.organization]).catch(console.error);\n        await pop({ force: true });\n    }\n    catch (e) {\n        Toast.fromError(e).show();\n    }\n\n    deleting.value = false;\n}\n\n</script>\n","<template>\n    <ChargeView :filter=\"filter\" count-endpoint-path=\"/admin/organizations/count\" charge-endpoint-path=\"/admin/charge-organizations\" :get-description=\"getDescription\" :get-confirmation-text=\"getConfirmationText\" :create-body=\"createBody\" :show-created-at=\"true\" :show-due-at=\"true\" modal-display-style=\"popup\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport ChargeView from '@stamhoofd/components/src/views/ChargeView.vue';\nimport { ChargeOrganizationsRequest, StamhoofdFilter } from '@stamhoofd/structures';\n\ndefineProps<{ filter: StamhoofdFilter }>();\n\nfunction createBody(args: { organizationId: string;\n    price: number;\n    description: string;\n    amount: number | null;\n    dueAt: Date | null;\n    createdAt: Date | null; }): ChargeOrganizationsRequest {\n    return ChargeOrganizationsRequest.create(args);\n}\n\nfunction getDescription({ count }: { count: number }) {\n    if (count === 1) {\n        return $t('51c27c5e-c2be-441b-a571-7bf573ee6848');\n    }\n\n    return $t('88119ffc-b692-4222-8217-75a9fa64f675', { count: count.toString() });\n}\n\nfunction getConfirmationText({ total, count }: { total: string; count: number | null }) {\n    return $t('9305016a-babf-4606-af6c-e8ef9f2ba91e', { total, count: count === null ? '?' : count.toString() });\n}\n</script>\n","import { ComponentWithProperties, usePresent } from '@simonbackx/vue-app-navigation';\nimport { StamhoofdFilter } from '@stamhoofd/structures';\nimport ChargeOrganizationsView from '../ChargeOrganizationsView.vue';\n\nexport function useChargeOrganizationsPopup() {\n    const present = usePresent();\n\n    return {\n        present: async (filter: StamhoofdFilter) => {\n            await present({\n                modalDisplayStyle: 'popup',\n                components: [\n                    new ComponentWithProperties(ChargeOrganizationsView, {\n                        filter,\n                    }),\n                ],\n            });\n        },\n    };\n}\n","import { SelectableColumn, SelectableSheet, SelectableWorkbook } from '@stamhoofd/frontend-excel-export';\nimport { Platform } from '@stamhoofd/structures';\n\nexport function getSelectableWorkbook(_platform: Platform) {\n    return new SelectableWorkbook({\n        sheets: [\n            new SelectableSheet({\n                id: 'organizations',\n                name: 'Groepen',\n                columns: [\n                    new SelectableColumn({\n                        id: 'id',\n                        name: 'ID',\n                        description: 'Unieke identificatie van de groep',\n                        enabled: false,\n                    }),\n\n                    // todo: only if platform?\n                    new SelectableColumn({\n                        id: 'uri',\n                        name: 'Groepsnummer',\n                        description: 'Nummer van de groep',\n                    }),\n\n                    new SelectableColumn({\n                        id: 'name',\n                        name: 'Naam',\n                    }),\n\n                    new SelectableColumn({\n                        id: 'tags',\n                        name: 'Hiërarchie',\n                    }),\n\n                    new SelectableColumn({\n                        id: 'address',\n                        name: 'Adres',\n                    }),\n                ],\n            }),\n\n            new SelectableSheet({\n                id: 'responsibilities',\n                name: 'Functies',\n                columns: [\n                    new SelectableColumn({\n                        id: 'organization.id',\n                        name: 'ID',\n                        description: 'Unieke identificatie van de groep',\n                        enabled: false,\n                    }),\n\n                    new SelectableColumn({\n                        id: 'organization.uri',\n                        name: 'Groepsnummer',\n                        description: 'Nummer van de groep',\n                    }),\n\n                    new SelectableColumn({\n                        id: 'organization.name',\n                        name: 'Groepsnaam',\n                    }),\n\n                    new SelectableColumn({\n                        id: 'responsibility.name',\n                        name: 'Functie',\n                    }),\n\n                    new SelectableColumn({\n                        id: 'responsibility.member.firstName',\n                        name: 'Voornaam',\n                    }),\n\n                    new SelectableColumn({\n                        id: 'responsibility.member.lastName',\n                        name: 'Achternaam',\n                    }),\n\n                    new SelectableColumn({\n                        id: 'responsibility.member.email',\n                        name: 'E-mail',\n                    }),\n\n                    new SelectableColumn({\n                        id: 'responsibility.member.address',\n                        name: 'Adres',\n                    }),\n                ],\n            }),\n            new SelectableSheet({\n                id: 'premises',\n                name: 'Lokalen',\n                columns: [\n                    new SelectableColumn({\n                        id: 'organization.id',\n                        name: 'ID',\n                        description: 'Unieke identificatie van de groep',\n                        enabled: false,\n                    }),\n\n                    new SelectableColumn({\n                        id: 'organization.uri',\n                        name: 'Groepsnummer',\n                        description: 'Nummer van de groep',\n                    }),\n\n                    new SelectableColumn({\n                        id: 'organization.name',\n                        name: 'Groepsnaam',\n                    }),\n\n                    new SelectableColumn({\n                        id: 'premise.name',\n                        name: 'Naam gebouw',\n                    }),\n\n                    new SelectableColumn({\n                        id: 'premise.type',\n                        name: 'Types',\n                    }),\n\n                    new SelectableColumn({\n                        id: 'premise.address',\n                        name: 'Adres',\n                    }),\n                ],\n            }),\n        ],\n    });\n}\n","<template>\n    <ModernTableView\n        ref=\"modernTableView\"\n        :table-object-fetcher=\"tableObjectFetcher\"\n        :filter-builders=\"filterBuilders\"\n        :title=\"title\"\n        :column-configuration-id=\"configurationId\"\n        :actions=\"actions\"\n        :all-columns=\"allColumns\"\n        :prefix-column=\"allColumns[0]\"\n        :estimated-rows=\"estimatedRows\"\n        :Route=\"Route\"\n    >\n        <template #empty>\n            {{ $t('4fa242b7-c05d-44d4-ada5-fb60e91af818') }}\n        </template>\n    </ModernTableView>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ArrayDecoder, AutoEncoderPatchType, Decoder, PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, NavigationController, usePresent } from '@simonbackx/vue-app-navigation';\nimport { AsyncTableAction, Column, ComponentExposed, EmailView, InMemoryTableAction, ModernTableView, RecipientMultipleChoiceOption, TableAction, TableActionSelection, Toast, useAuth, useContext, useGetOrganizationUIFilterBuilders, useGlobalEventListener, useOrganizationsObjectFetcher, usePlatform, useTableObjectFetcher } from '@stamhoofd/components';\nimport { ExcelExportView } from '@stamhoofd/frontend-excel-export';\nimport { I18nController, useTranslate } from '@stamhoofd/frontend-i18n';\nimport { useRequestOwner } from '@stamhoofd/networking';\nimport { Address, EmailRecipientFilterType, EmailRecipientSubfilter, ExcelExportType, isEmptyFilter, Organization, OrganizationPrivateMetaData, OrganizationTag, StamhoofdFilter } from '@stamhoofd/structures';\nimport { computed, Ref, ref } from 'vue';\nimport EditOrganizationView from './EditOrganizationView.vue';\nimport OrganizationView from './OrganizationView.vue';\nimport { useChargeOrganizationsPopup } from './composables/useChargeOrganizationsPopup';\nimport { getSelectableWorkbook } from './getSelectableWorkbook';\n\ntype ObjectType = Organization;\nconst $t = useTranslate();\nconst owner = useRequestOwner();\n\nconst props = withDefaults(\n    defineProps<{\n        tag?: OrganizationTag | null;\n    }>(),\n    {\n        tag: null,\n    },\n);\n\nconst title = computed(() => {\n    if (props.tag) {\n        if (props.tag.id !== '') {\n            return props.tag.name;\n        }\n    }\n    return $t('d4a9ca3f-72c9-4418-90fa-5d648b23ee7e');\n});\n\nconst estimatedRows = computed(() => {\n    if (props.tag) {\n        return props.tag.organizationCount;\n    }\n    return 30;\n});\n\nconst context = useContext();\nconst present = usePresent();\nconst platform = usePlatform();\nconst auth = useAuth();\nconst { getOrganizationUIFilterBuilders } = useGetOrganizationUIFilterBuilders();\nconst chargeOrganizationsSheet = useChargeOrganizationsPopup();\n\nconst modernTableView = ref(null) as Ref<null | ComponentExposed<typeof ModernTableView>>;\nconst configurationId = computed(() => {\n    return 'organizations';\n});\nconst filterBuilders = computed(() => getOrganizationUIFilterBuilders(auth.user));\n\nfunction getRequiredFilter(): StamhoofdFilter | null {\n    if (props.tag) {\n        if (props.tag.id === '') {\n            return null;\n        }\n\n        if (props.tag.childTags.length > 0) {\n            return {\n                tags: {\n                    $in: [...props.tag.childTags, props.tag.id],\n                },\n            };\n        }\n\n        return {\n            tags: {\n                $eq: props.tag.id,\n            },\n        };\n    }\n\n    return null;\n}\n\nuseGlobalEventListener('organizations-deleted', async () => {\n    tableObjectFetcher.reset(true, true);\n});\n\nconst objectFetcher = useOrganizationsObjectFetcher({\n    requiredFilter: getRequiredFilter(),\n});\n\nconst tableObjectFetcher = useTableObjectFetcher<Organization>(objectFetcher);\n\nconst allColumns: Column<ObjectType, any>[] = [\n    new Column<ObjectType, Organization>({\n        id: 'uriPadded',\n        name: '#',\n        getValue: organization => organization,\n        format: organization => organization.uri,\n        getStyle: organization => organization.active ? 'info' : 'error',\n        minimumWidth: 60,\n        recommendedWidth: 100,\n        index: 0,\n    }),\n\n    new Column<ObjectType, string>({\n        id: 'name',\n        name: 'Naam',\n        getValue: organization => organization.name,\n        minimumWidth: 100,\n        recommendedWidth: 200,\n        grow: true,\n    }),\n\n    new Column<ObjectType, boolean>({\n        id: 'status',\n        name: 'Status',\n        getValue: organization => organization.active,\n        format: active => active ? 'Actief' : 'Inactief',\n        getStyle: active => active ? 'success' : 'error',\n        minimumWidth: 100,\n        recommendedWidth: 200,\n        grow: true,\n        allowSorting: false,\n        enabled: false,\n    }),\n\n    new Column<ObjectType, string>({\n        id: 'city',\n        name: 'Gemeente',\n        getValue: organization => organization.address.city,\n        minimumWidth: 100,\n        recommendedWidth: 200,\n    }),\n    new Column<ObjectType, string[]>({\n        id: 'tags',\n        name: 'Tags',\n        allowSorting: false,\n        getValue: organization => organization.meta.tags.map(t => platform.value.config.tags.find(tt => tt.id === t)?.name ?? 'Onbekend'),\n        format: tags => tags.length === 0 ? 'Geen' : tags.join(', '),\n        getStyle: tags => tags.length === 0 ? 'gray' : '',\n        minimumWidth: 100,\n        recommendedWidth: 300,\n    }),\n    new Column<ObjectType, { completed: number; total: number }>({\n        id: 'setupSteps',\n        name: 'Vlagmoment',\n        allowSorting: false,\n        getValue: organization => organization.period.setupSteps.getProgress(),\n        format: (progress) => {\n            const { completed, total } = progress;\n            if (total === 0) {\n                return 'Geen';\n            }\n            if (completed >= total) {\n                return 'Voltooid';\n            }\n            return `${progress.completed}/${progress.total}`;\n        },\n        getStyle: (progress) => {\n            const { completed, total } = progress;\n            if (total === 0) {\n                return 'gray';\n            }\n            if (completed >= total) {\n                return 'success';\n            }\n            return 'gray';\n        },\n        minimumWidth: 50,\n        recommendedWidth: 100,\n\n    }),\n];\n\nconst Route = {\n    Component: OrganizationView,\n    objectKey: 'organization',\n};\n\nconst actions: TableAction<Organization>[] = [];\n\nasync function openMail(selection: TableActionSelection<Organization>) {\n    const filter = selection.filter.filter;\n    const search = selection.filter.search;\n\n    const option: RecipientMultipleChoiceOption = {\n        type: 'MultipleChoice',\n        options: [],\n        build: (selectedIds: string[]) => {\n            const q = EmailRecipientSubfilter.create({\n                type: EmailRecipientFilterType.Members,\n                filter: {\n                    responsibilities: {\n                        $elemMatch: {\n                            responsibilityId: {\n                                $in: selectedIds,\n                            },\n                            endDate: null,\n                            ...(isEmptyFilter(filter) ? {} : { organization: filter }),\n                        },\n                    },\n                },\n                search,\n            });\n\n            return [\n                q,\n            ];\n        },\n    };\n\n    for (const responsibility of platform.value.config.responsibilities) {\n        if (!responsibility.organizationBased) {\n            continue;\n        }\n        option.options.push(\n            {\n                id: responsibility.id,\n                name: responsibility.name,\n            },\n        );\n    }\n\n    const displayedComponent = new ComponentWithProperties(NavigationController, {\n        root: new ComponentWithProperties(EmailView, {\n            recipientFilterOptions: [option],\n        }),\n    });\n    await present({\n        components: [\n            displayedComponent,\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function exportToExcel(selection: TableActionSelection<ObjectType>) {\n    await present({\n        components: [\n            new ComponentWithProperties(NavigationController, {\n                root: new ComponentWithProperties(ExcelExportView, {\n                    type: ExcelExportType.Organizations,\n                    filter: selection.filter,\n                    workbook: getSelectableWorkbook(platform.value),\n                    configurationId: configurationId.value,\n                }),\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nif (auth.hasPlatformFullAccess()) {\n    actions.push(\n        new InMemoryTableAction({\n            name: $t('7066aee7-9e51-4767-b288-460646ceca50'),\n            icon: 'add',\n            priority: 0,\n            groupIndex: 1,\n            needsSelection: false,\n            enabled: true,\n            handler: async () => {\n                const organization = Organization.create({\n                    address: Address.createDefault(I18nController.shared.countryCode),\n                    privateMeta: OrganizationPrivateMetaData.create({}),\n                });\n\n                const component = new ComponentWithProperties(EditOrganizationView, {\n                    isNew: true,\n                    organization,\n                    saveHandler: async (patch: AutoEncoderPatchType<Organization>) => {\n                        const put = organization.patch(patch);\n\n                        const arr: PatchableArrayAutoEncoder<Organization> = new PatchableArray();\n                        arr.addPut(put);\n\n                        await context.value.authenticatedServer.request({\n                            method: 'PATCH',\n                            path: '/admin/organizations',\n                            body: arr,\n                            shouldRetry: false,\n                            owner,\n                            decoder: new ArrayDecoder(Organization as Decoder<Organization>),\n                        });\n                        new Toast($t('8459189d-6f9a-4541-9fb7-7618061f1969'), 'success green').show();\n\n                        // Reload table\n                        tableObjectFetcher.reset(true, true);\n                    },\n                });\n\n                await present({\n                    modalDisplayStyle: 'popup',\n                    components: [component],\n                });\n            },\n        }),\n    );\n\n    actions.push(new AsyncTableAction({\n        name: 'E-mailen',\n        icon: 'email',\n        priority: 12,\n        groupIndex: 3,\n        handler: async (selection: TableActionSelection<Organization>) => {\n            await openMail(selection);\n        },\n    }));\n\n    actions.push(new AsyncTableAction({\n        name: 'Bedrag aanrekenen',\n        icon: 'calculator',\n        priority: 13,\n        groupIndex: 4,\n        handler: async (selection: TableActionSelection<Organization>) => {\n            await chargeOrganizationsSheet.present(selection.filter.filter);\n        },\n    }));\n\n    actions.push(\n        new AsyncTableAction({\n            name: 'Exporteren naar Excel',\n            icon: 'download',\n            priority: 11,\n            groupIndex: 3,\n            handler: async (selection) => {\n                await exportToExcel(selection);\n            },\n        }),\n    );\n}\n</script>\n","<template>\n    <OrganizationsTableView v-if=\"isShowTable\" :tag=\"tag\" />\n    <div v-else class=\"st-view background category-view\">\n        <STNavigationBar :title=\"title\" />\n        <main>\n            <h1 class=\"style-navigation-title\">\n                {{ title }}\n            </h1>\n            <STList>\n                <STListItem :selectable=\"true\" @click=\"openThisTag\">\n                    <template #left>\n                        <span class=\"icon group\" />\n                    </template>\n                    <h2 class=\"style-title-list bolder\">\n                        {{ $t('919139ab-1103-4e1b-aaf7-94cfec03a9e3', { name: title }) }}\n                    </h2>\n                    <template #right>\n                        <span class=\"style-description-small\">{{ tag.organizationCount }}</span>\n                        <span class=\"icon arrow-right-small gray\" />\n                    </template>\n                </STListItem>\n                <STListItem v-for=\"childTag of childTags\" :key=\"childTag.id\" :selectable=\"true\" @click=\"openChildTag(childTag)\">\n                    <template #left>\n                        <span v-if=\"childTag.type === OrganizationTagType.Tag\" class=\"icon label\" />\n                        <span v-else class=\"icon location\" />\n                    </template>\n                    <h3 class=\"style-title-list\">\n                        {{ childTag.name }}\n                    </h3>\n                    <p v-if=\"childTag.description\" class=\"style-description-small pre-wrap style-limit-lines\" v-text=\"childTag.description\" />\n\n                    <template #right>\n                        <span v-if=\"childTag.childTags.length > 0\" class=\"style-description-small\">{{ childTag.childTags.length }}</span>\n                        <span v-else class=\"style-description-small\">{{ childTag.organizationCount }}</span>\n                        <span class=\"icon arrow-right-small gray\" />\n                    </template>\n                </STListItem>\n            </STList>\n        </main>\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { defineRoutes, useNavigate } from '@simonbackx/vue-app-navigation';\nimport { STList, STListItem, STNavigationBar, usePlatform } from '@stamhoofd/components';\nimport { OrganizationTag, OrganizationTagType } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { ComponentOptions, computed } from 'vue';\nimport OrganizationsTableView from './OrganizationsTableView.vue';\nimport OrganizationTagView from './OrganizationTagView.vue';\n\nconst props = defineProps<{\n    tag: OrganizationTag;\n}>();\n\nconst navigate = useNavigate();\nconst platform = usePlatform();\n\nenum Routes {\n    All = 'all',\n    Tag = 'tag',\n    Organizations = 'organizations',\n}\n\ndefineRoutes([\n    {\n        url: 'groepen',\n        name: Routes.All,\n        component: OrganizationsTableView as unknown as ComponentOptions,\n        params: {\n            slug: String,\n        },\n        paramsToProps() {\n            return {\n                tag: props.tag,\n            };\n        },\n    },\n    {\n        url: 'tag/@slug/groepen',\n        name: Routes.Organizations,\n        component: OrganizationsTableView as unknown as ComponentOptions,\n        params: {\n            slug: String,\n        },\n        paramsToProps(params: { slug: string }) {\n            const tag = platform.value.config.tags.find(t => Formatter.slug(t.name) === params.slug);\n            if (!tag) {\n                throw new Error('Tag not found');\n            }\n\n            return {\n                tag,\n            };\n        },\n        propsToParams(props) {\n            if (!('tag' in props) || !(props.tag instanceof OrganizationTag)) {\n                throw new Error('Missing tag');\n            }\n\n            return {\n                params: {\n                    slug: Formatter.slug(props.tag.name),\n                },\n            };\n        },\n    },\n    {\n        url: 'tag/@slug',\n        name: Routes.Tag,\n        component: OrganizationTagView as unknown as ComponentOptions,\n        params: {\n            slug: String,\n        },\n        paramsToProps(params: { slug: string }) {\n            const tag = platform.value.config.tags.find(t => Formatter.slug(t.name) === params.slug);\n            if (!tag) {\n                throw new Error('Tag not found');\n            }\n\n            return {\n                tag,\n            };\n        },\n        propsToParams(props) {\n            if (!('tag' in props) || !(props.tag instanceof OrganizationTag)) {\n                throw new Error('Missing tag');\n            }\n\n            return {\n                params: {\n                    slug: Formatter.slug(props.tag.name),\n                },\n            };\n        },\n    },\n\n]);\n\nconst title = computed(() => props.tag.name);\n\nconst childTags = computed(() => {\n    const allTags = platform.value.config.tags;\n    return props.tag.childTags.map(id => allTags.find(tag => tag.id === id)).filter(x => x !== undefined);\n});\n\nconst isShowTable = computed(() => childTags.value.length === 0);\n\nasync function openChildTag(tag: OrganizationTag) {\n    if (tag.childTags.length > 0) {\n        await navigate(Routes.Tag, { properties: { tag } });\n        return;\n    }\n    await navigate(Routes.Organizations, { properties: { tag } });\n}\n\nasync function openThisTag() {\n    await navigate(Routes.All);\n}\n</script>\n\n<style lang=\"scss\">\n    .category-view {\n        --block-width: 24px;\n    }\n</style>\n","<template>\n    <STListItem v-long-press=\"(e) => showContextMenu(e)\" :selectable=\"true\" class=\"right-stack\" @contextmenu.prevent=\"showContextMenu\">\n        <h2 class=\"style-title-list\">\n            {{ tag.name }}\n        </h2>\n        <p v-if=\"childTagCount > 0\" class=\"style-description-small\">\n            {{ capitalizeFirstLetter(pluralText(childTagCount, getOrganizationTagTypeName(childType), getOrganizationTagTypePluralName(childType))) }}\n        </p>\n        <p v-if=\"tag.description\" class=\"style-description-small pre-wrap style-limit-lines\" v-text=\"tag.description\" />\n\n        <template #right>\n            <span class=\"button icon drag gray\" @click.stop @contextmenu.stop />\n            <span class=\"icon arrow-right-small gray\" />\n        </template>\n    </STListItem>\n</template>\n\n<script lang=\"ts\" setup>\nimport { PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { ContextMenu, ContextMenuItem, useEmitPatchArray } from '@stamhoofd/components';\nimport { getOrganizationTagTypeName, getOrganizationTagTypePluralName, OrganizationTag, TagHelper } from '@stamhoofd/structures';\nimport { computed } from 'vue';\n\nconst props = defineProps<{\n    tag: OrganizationTag;\n    allTags: OrganizationTag[];\n}>();\nconst emit = defineEmits(['patch:allTags']);\n\nconst childTagCount = computed(() => props.tag.childTags.length);\nconst childType = computed(() => props.tag.getChildType(props.allTags));\nconst filteredTags = computed(() => props.allTags.filter(t => t.id !== props.tag.id && !TagHelper.containsDeep(props.tag.id, t.id, { allTags: props.allTags })));\nconst { addArrayPatch } = useEmitPatchArray<typeof props, 'allTags', OrganizationTag>(props, emit, 'allTags');\n\nfunction contextMenuForTag(t: OrganizationTag, action: (tag: OrganizationTag) => void): ContextMenuItem {\n    const children = t.childTags.map(tt => filteredTags.value.find(ft => ft.id === tt)).filter(tt => !!tt);\n    return new ContextMenuItem({\n        name: t.name,\n        childMenu: children.length\n            ? new ContextMenu([\n                [\n                    new ContextMenuItem({\n                        name: t.name,\n                        action: () => {\n                            action(t);\n                        },\n                    }),\n                ],\n                children.map(ttt => contextMenuForTag(ttt, action)),\n            ])\n            : undefined,\n        action: () => {\n            action(t);\n        },\n    });\n}\n\nfunction showContextMenu(event: MouseEvent) {\n    const parentTags = props.allTags.filter(t => t.childTags.includes(props.tag.id));\n\n    const menu = new ContextMenu([\n        [\n            new ContextMenuItem({\n                name: 'Verplaatsen naar',\n                childMenu: new ContextMenu([\n                    ...(\n                        parentTags.length > 0\n                            ? [\n                                    [\n                                        new ContextMenuItem({\n                                            name: 'Hoofdtags',\n                                            action: () => {\n                                                // Remove self from all these parent tags\n                                                const patch: PatchableArrayAutoEncoder<OrganizationTag> = new PatchableArray();\n                                                for (const parentTag of parentTags) {\n                                                    const p = OrganizationTag.patch({\n                                                        id: parentTag.id,\n                                                    });\n                                                    p.childTags.addDelete(props.tag.id);\n                                                    patch.addPatch(p);\n                                                }\n\n                                                addArrayPatch(patch);\n                                            },\n                                        }),\n                                    ],\n                                ]\n                            : []\n                    ),\n                    TagHelper.getRootTags(filteredTags.value).map(t => contextMenuForTag(t, (moveToTag) => {\n                        // Remove self from all these parent tags\n                        const patch: PatchableArrayAutoEncoder<OrganizationTag> = new PatchableArray();\n                        for (const parentTag of parentTags) {\n                            const p = OrganizationTag.patch({\n                                id: parentTag.id,\n                            });\n                            p.childTags.addDelete(props.tag.id);\n                            patch.addPatch(p);\n                        }\n\n                        const p = OrganizationTag.patch({\n                            id: moveToTag.id,\n                        });\n                        p.childTags.addPut(props.tag.id);\n                        patch.addPatch(p);\n\n                        addArrayPatch(patch);\n                    })),\n                ]),\n            }),\n        ],\n    ]);\n    menu.show({ clickEvent: event }).catch(console.error);\n}\n\n</script>\n","<template>\n    <SaveView :title=\"title\" :loading=\"saving\" :disabled=\"!hasChanges\" @save=\"save\">\n        <h1>\n            {{ title }}\n        </h1>\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <STInputBox title=\"Titel\" error-fields=\"name\" :error-box=\"errors.errorBox\">\n            <input\n                v-model=\"name\"\n                class=\"input\"\n                type=\"text\"\n                placeholder=\"Naam van deze tag\"\n                autocomplete=\"off\"\n            >\n        </STInputBox>\n\n        <STInputBox title=\"Beschrijving\" error-fields=\"description\" :error-box=\"errors.errorBox\" class=\"max\">\n            <textarea\n                v-model=\"description\"\n                class=\"input\"\n                type=\"text\"\n                placeholder=\"Optioneel. Korte beschrijving van het doel van deze tag.\"\n                autocomplete=\"off\"\n                enterkeyhint=\"next\"\n            />\n        </STInputBox>\n        <div class=\"container\">\n            <hr>\n            <h2>{{ $t('b381ed6f-c509-418d-9668-7c161a0fa652') }}</h2>\n            <p class=\"style-description\">\n                {{ $t('4139ef30-55c8-4775-b97a-69b3a8b7d112') }}\n            </p>\n            <STList v-model=\"draggableChildTags\" :draggable=\"true\">\n                <template #item=\"{item}\">\n                    <TagRow :all-tags=\"allPatchedTags\" :tag=\"item\" @click=\"editTag(item)\" @patch:all-tags=\"addArrayPatch\" />\n                </template>\n            </STList>\n            <p>\n                <button class=\"button text\" type=\"button\" @click=\"addTag\">\n                    <span class=\"icon add\" />\n                    <span>{{ $t('20699886-7112-43f5-b38c-f5b686c37257') }}</span>\n                </button>\n            </p>\n        </div>\n\n        <div v-if=\"!isNew\" class=\"container\">\n            <hr>\n            <h2>\n                {{ $t('e5c15476-6092-45c9-ac55-541f45720c71') }}\n            </h2>\n            <p v-if=\"!isEmpty\" class=\"style-description\">\n                {{ $t('ceaaf7f7-900e-497e-91f5-16c3a173b7bf') }}\n            </p>\n\n            <button class=\"button secundary danger\" type=\"button\" @click=\"doDelete\">\n                <span class=\"icon trash\" />\n                <span>{{ $t('5bb7b4d5-def0-431d-ba3c-e34ffc7ee777') }}</span>\n            </button>\n        </div>\n    </SaveView>\n</template>\n\n<script setup lang=\"ts\">\nimport { AutoEncoderPatchType, PartialWithoutMethods, PatchableArray, PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { SimpleError } from '@simonbackx/simple-errors';\nimport { ComponentWithProperties, usePop, usePresent } from '@simonbackx/vue-app-navigation';\nimport { CenteredMessage, ErrorBox, SaveView, useDraggableArrayIds, useErrors } from '@stamhoofd/components';\nimport { getOrganizationTagTypeName, OrganizationTag } from '@stamhoofd/structures';\nimport { computed, ref, Ref } from 'vue';\nimport TagRow from './components/TagRow.vue';\nimport EditOrganizationTagView from './EditOrganizationTagView.vue';\nimport { Formatter } from '@stamhoofd/utility';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\n\nconst errors = useErrors();\nconst present = usePresent();\nconst saving = ref(false);\nconst deleting = ref(false);\n\nconst props = defineProps<{\n    tag: OrganizationTag;\n    allTags: OrganizationTag[];\n    isNew: boolean;\n    saveHandler: (patch: PatchableArrayAutoEncoder<OrganizationTag>) => Promise<void>;\n}>();\n\nconst $t = useTranslate();\nconst title = computed(() => props.isNew ? 'Nieuwe tag' : Formatter.capitalizeFirstLetter($t('cd52133a-d8bf-4dde-a924-962f3f0e3fe9', { tagType: getOrganizationTagTypeName(props.tag.type) })));\nconst pop = usePop();\n\nconst patch = ref(new PatchableArray()) as Ref<PatchableArrayAutoEncoder<OrganizationTag>>;\nif (props.isNew) {\n    patch.value.addPut(props.tag);\n}\n\nconst allPatchedTags = computed(() => patch.value.applyTo(props.allTags) as OrganizationTag[]);\nconst patched = computed(() => getPatchedTag(props.tag.id) ?? OrganizationTag.create({ name: 'Onbekende tag' }));\n\nconst hasChanges = computed(() => patch.value.changes.length > 0);\n\nfunction addPatch(newPatch: PartialWithoutMethods<AutoEncoderPatchType<OrganizationTag>>) {\n    patch.value.addPatch((props.tag.static as typeof OrganizationTag).patch({ id: props.tag.id, ...newPatch }));\n}\n\nfunction addArrayPatch(newPatch: PatchableArrayAutoEncoder<OrganizationTag>) {\n    patch.value = patch.value.patch(newPatch);\n}\n\nfunction addDelete(id: string) {\n    patch.value.addDelete(id);\n}\n\nconst isEmpty = computed(() => patched.value.childTags.length === 0);\nconst draggableChildTags = useDraggableArrayIds(\n    () => patched.value.childTags.map(id => allPatchedTags.value.find(patchedTag => patchedTag.id === id)).filter(x => x !== undefined),\n    patch => addPatch({ childTags: patch }),\n);\n\nconst save = async () => {\n    if (saving.value || deleting.value) {\n        return;\n    }\n    saving.value = true;\n    try {\n        if (name.value.length === 0) {\n            throw new SimpleError({\n                code: 'invalid_field',\n                message: 'Gelieve een naam in te vullen',\n                field: 'name',\n            });\n        }\n\n        await props.saveHandler(patch.value);\n\n        await pop({ force: true });\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n    saving.value = false;\n};\n\nconst doDelete = async () => {\n    if (saving.value || deleting.value) {\n        return;\n    }\n\n    if (!await CenteredMessage.confirm('Ben je zeker dat je deze tag wilt verwijderen?', 'Verwijderen')) {\n        return;\n    }\n\n    deleting.value = true;\n\n    try {\n        addDeleteRecursive(props.tag.id);\n        await props.saveHandler(patch.value);\n        await pop({ force: true });\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n\n    deleting.value = false;\n};\n\nfunction addDeleteRecursive(tagId: string) {\n    const tag = getPatchedTag(tagId);\n\n    if (tag) {\n        for (const childTagId of tag.childTags) {\n            addDeleteRecursive(childTagId);\n        }\n\n        addDelete(tagId);\n    }\n}\n\nfunction getPatchedTag(tagId: string): OrganizationTag | undefined {\n    return allPatchedTags.value.find(t => t.id === tagId);\n}\n\nconst name = computed({\n    get: () => patched.value.name,\n    set: name => addPatch({ name }),\n});\n\nconst description = computed({\n    get: () => patched.value.description,\n    set: description => addPatch({ description }),\n});\n\nasync function editTag(tag: OrganizationTag) {\n    await present({\n        modalDisplayStyle: 'popup',\n        components: [\n            new ComponentWithProperties(EditOrganizationTagView, {\n                allTags: allPatchedTags.value,\n                tag,\n                isNew: false,\n                saveHandler: (newPatch: PatchableArrayAutoEncoder<OrganizationTag>) => {\n                    patch.value = patch.value.patch(newPatch);\n                },\n            }),\n        ],\n    });\n}\n\nasync function addTag() {\n    const tag = OrganizationTag.create({});\n\n    await present({\n        modalDisplayStyle: 'popup',\n        components: [\n            new ComponentWithProperties(EditOrganizationTagView, {\n                allTags: allPatchedTags.value,\n                tag,\n                isNew: true,\n                saveHandler: (newPatch: PatchableArrayAutoEncoder<OrganizationTag>) => {\n                    patch.value = patch.value.patch(newPatch);\n\n                    const recordsPatch = new PatchableArray<string, string, string>();\n                    recordsPatch.addPut(tag.id);\n\n                    addPatch({ childTags: recordsPatch });\n                },\n            }),\n        ],\n    });\n}\n\nconst shouldNavigateAway = async () => {\n    if (!hasChanges.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm('Ben je zeker dat je wilt sluiten zonder op te slaan?', 'Niet opslaan');\n};\n\ndefineExpose({\n    shouldNavigateAway,\n});\n</script>\n","<template>\n    <SaveView :title=\"title\" :loading=\"saving\" :disabled=\"!hasChanges\" @save=\"save\">\n        <h1 class=\"style-navigation-title\">\n            {{ title }}\n        </h1>\n        <p>Je kan groepen onderverdelen in een hiërachie via tags, verbonden, gewesten en/of gouwen. Elke groep kan meerdere tags krijgen volgens de regels die je instelt bij elke tag.</p>\n\n        <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n        <STList v-model=\"draggableTags\" :draggable=\"true\">\n            <template #item=\"{item: tag}\">\n                <TagRow :tag=\"tag\" :all-tags=\"tags\" @click=\"editTag(tag)\" @patch:all-tags=\"addArrayPatch\" />\n            </template>\n        </STList>\n        <p>\n            <button class=\"button text\" type=\"button\" @click=\"addTag\">\n                <span class=\"icon add\" />\n                <span>{{ $t('f87ed463-4821-4877-96db-03c693f46013') }}</span>\n            </button>\n        </p>\n    </SaveView>\n</template>\n\n<script lang=\"ts\" setup>\nimport { PatchableArrayAutoEncoder } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, usePop, usePresent } from '@simonbackx/vue-app-navigation';\nimport { CenteredMessage, ErrorBox, Toast, useDraggableArray, useErrors, usePatchArray, usePlatform } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { usePlatformManager } from '@stamhoofd/networking';\nimport { OrganizationTag, Platform, PlatformConfig, TagHelper } from '@stamhoofd/structures';\nimport { computed, ref } from 'vue';\nimport TagRow from './components/TagRow.vue';\nimport EditOrganizationTagView from './EditOrganizationTagView.vue';\n\nconst platformManager = usePlatformManager();\nconst platform = usePlatform();\nconst errors = useErrors();\nconst pop = usePop();\nconst present = usePresent();\nconst $t = useTranslate();\n\nconst originalTags = computed(() => platform.value.config.tags);\n\nconst { patched: tags, patch, addArrayPatch, hasChanges } = usePatchArray(originalTags);\nconst saving = ref(false);\n\nconst title = 'Hiërachie';\n\nconst draggableTags = useDraggableArray(() => TagHelper.getRootTags(tags.value), addArrayPatch);\n\nasync function addTag() {\n    const tag = OrganizationTag.create({});\n\n    await present({\n        modalDisplayStyle: 'popup',\n        components: [\n            new ComponentWithProperties(EditOrganizationTagView, {\n                allTags: tags.value,\n                tag,\n                isNew: true,\n                saveHandler: (patch: PatchableArrayAutoEncoder<OrganizationTag>) => {\n                    addArrayPatch(patch);\n                },\n            }),\n        ],\n    });\n}\n\nasync function editTag(tag: OrganizationTag) {\n    await present({\n        modalDisplayStyle: 'popup',\n        components: [\n            new ComponentWithProperties(EditOrganizationTagView, {\n                allTags: tags.value,\n                tag,\n                isNew: false,\n                saveHandler: (newPatch: PatchableArrayAutoEncoder<OrganizationTag>) => {\n                    addArrayPatch(newPatch);\n                },\n            }),\n        ],\n    });\n}\n\nasync function save() {\n    if (saving.value) {\n        return;\n    }\n\n    saving.value = true;\n\n    try {\n        await platformManager.value.patch(Platform.patch({\n            config: PlatformConfig.patch({\n                tags: patch.value,\n            }),\n        }));\n        new Toast('De wijzigingen zijn opgeslagen', 'success green').show();\n        await pop({ force: true });\n    }\n    catch (e) {\n        errors.errorBox = new ErrorBox(e);\n    }\n\n    saving.value = false;\n}\n\nconst shouldNavigateAway = async () => {\n    if (!hasChanges.value) {\n        return true;\n    }\n    return await CenteredMessage.confirm($t('996a4109-5524-4679-8d17-6968282a2a75'), $t('106b3169-6336-48b8-8544-4512d42c4fd6'));\n};\n\ndefineExpose({\n    shouldNavigateAway,\n});\n</script>\n","<template>\n    <div class=\"st-menu st-view\">\n        <STNavigationBar title=\"Groepen\">\n            <template #right>\n                <button v-if=\"hasFullAccess\" class=\"navigation button icon settings\" type=\"button\" @click=\"hasFullAccess && navigate(Routes.Tags)\" />\n            </template>\n        </STNavigationBar>\n\n        <main>\n            <h1>{{ $t(\"6e884f27-427f-4f85-914c-d5c2780253b0\") }}</h1>\n\n            <div class=\"container\">\n                <button type=\"button\" class=\"button menu-button\" :class=\"{ selected: checkRoute(Routes.All) }\" @click=\"navigate(Routes.All)\">\n                    <span class=\"icon group\" />\n                    <span>\n                        {{ $t(\"cd0975fc-75c4-4c1e-b80a-f611f0992caa\") }}\n                    </span>\n                </button>\n            </div>\n\n            <hr>\n\n            <div v-for=\"(tag, index) in rootTags\" :key=\"tag.id\" class=\"container\">\n                <div class=\"grouped\">\n                    <button type=\"button\" class=\"button menu-button\" :class=\"{ selected: checkRoute(Routes.Tag, {properties: {tag}}) }\" @click=\"navigateToTag(tag)\">\n                        <span v-if=\"tag.type === OrganizationTagType.Tag\" class=\"icon label\" />\n                        <span v-else class=\"icon location\" />\n\n                        <span>\n                            {{ tag.name }}\n                        </span>\n                        <span v-if=\"tag.childTags.length\" class=\"button icon arrow-down-small right-icon rot\" :class=\"{rot180: collapsed.isCollapsed(tag.id)}\" @click.stop=\"collapsed.toggle(tag.id)\" />\n                    </button>\n\n                    <div :class=\"{collapsable: true, hide: collapsed.isCollapsed(tag.id)}\">\n                        <button\n                            v-for=\"childTag in tagIdsToTags(tag.childTags)\"\n                            :key=\"childTag.id\"\n                            class=\"menu-button button sub-button\"\n                            :class=\"{ selected: checkRoute(Routes.Tag, {properties: {tag: childTag}}) }\"\n                            type=\"button\"\n                            @click=\"navigateToTag(childTag)\"\n                        >\n                            <span class=\"icon\" />\n                            <span>{{ childTag.name }}</span>\n                            <span class=\"count\">{{ formatInteger(childTag.organizationCount) }}</span>\n                        </button>\n\n                        <hr v-if=\"index < rootTags.length - 1 && tag.childTags.length\">\n                    </div>\n                </div>\n            </div>\n        </main>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { Route, defineRoutes, useCheckRoute, useNavigate } from '@simonbackx/vue-app-navigation';\nimport { useAuth, usePlatform } from '@stamhoofd/components';\nimport { useCollapsed } from '@stamhoofd/dashboard/src/hooks/useCollapsed';\nimport { OrganizationTag, OrganizationTagType, PermissionLevel, TagHelper } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { ComponentOptions, computed } from 'vue';\nimport OrganizationsTableView from './OrganizationsTableView.vue';\nimport OrganizationTagView from './OrganizationTagView.vue';\nimport EditOrganizationTagsView from './tags/EditOrganizationTagsView.vue';\n\nenum Routes {\n    All = 'all',\n    Tag = 'tag',\n    Tags = 'tags',\n    Organizations = 'organizations',\n}\n\nconst auth = useAuth();\nconst hasFullAccess = auth.hasFullPlatformAccess();\n\ndefineRoutes([\n    {\n        url: 'allemaal',\n        name: Routes.All,\n        show: 'detail',\n        component: OrganizationsTableView as unknown as ComponentOptions,\n        isDefault: {\n            properties: {},\n        },\n    },\n    {\n        url: 'tag/@slug/groepen',\n        name: Routes.Organizations,\n        show: 'detail',\n        component: OrganizationsTableView as unknown as ComponentOptions,\n        params: {\n            slug: String,\n        },\n        paramsToProps(params: { slug: string }) {\n            const tag = platform.value.config.tags.find(t => Formatter.slug(t.name) === params.slug);\n            if (!tag) {\n                throw new Error('Tag not found');\n            }\n\n            return {\n                tag,\n            };\n        },\n        propsToParams(props) {\n            if (!('tag' in props) || !(props.tag instanceof OrganizationTag)) {\n                throw new Error('Missing tag');\n            }\n\n            return {\n                params: {\n                    slug: Formatter.slug(props.tag.name),\n                },\n            };\n        },\n    },\n    {\n        url: 'tag/@slug',\n        name: Routes.Tag,\n        show: 'detail',\n        component: OrganizationTagView as unknown as ComponentOptions,\n        params: {\n            slug: String,\n        },\n        paramsToProps(params: { slug: string }) {\n            const tag = platform.value.config.tags.find(t => Formatter.slug(t.name) === params.slug);\n            if (!tag) {\n                throw new Error('Tag not found');\n            }\n\n            return {\n                tag,\n            };\n        },\n        propsToParams(props) {\n            if (!('tag' in props) || !(props.tag instanceof OrganizationTag)) {\n                throw new Error('Missing tag');\n            }\n\n            return {\n                params: {\n                    slug: Formatter.slug(props.tag.name),\n                },\n            };\n        },\n    },\n    ...(hasFullAccess\n        ? [{\n                url: 'tags',\n                name: Routes.Tags,\n                present: 'popup',\n                component: EditOrganizationTagsView as unknown as ComponentOptions,\n            } as Route<any, undefined>]\n        : []),\n]);\n\nconst checkRoute = useCheckRoute();\nconst navigate = useNavigate();\nconst platform = usePlatform();\nconst collapsed = useCollapsed('tags');\n\nconst tags = computed(() => {\n    const t = auth.getPlatformAccessibleOrganizationTags(PermissionLevel.Read);\n    if (t === 'all') {\n        return platform.value.config.tags;\n    }\n    return t;\n});\n\nconst rootTags = computed(() => TagHelper.getRootTags(tags.value));\n\nfunction tagIdsToTags(tagIds: string[]): OrganizationTag[] {\n    return tagIds.map(id => getTagById(id));\n}\n\nfunction getTagById(id: string): OrganizationTag {\n    return tags.value.find(t => t.id === id) ?? OrganizationTag.create({ id, name: 'Onbekende tag' });\n}\n\nasync function navigateToTag(tag: OrganizationTag) {\n    if (tag.childTags.length === 0) {\n        await navigate(Routes.Organizations, { properties: { tag } });\n        return;\n    }\n    await navigate(Routes.Tag, { properties: { tag } });\n}\n</script>\n","<template>\n    <ModernTableView\n        ref=\"modernTableView\"\n        :table-object-fetcher=\"tableObjectFetcher\"\n        :filter-builders=\"filterBuilders\"\n        :title=\"title\"\n        :column-configuration-id=\"configurationId\"\n        :actions=\"actions\"\n        :all-columns=\"allColumns\"\n        :prefix-column=\"allColumns[0]\"\n        :estimated-rows=\"estimatedRows\"\n        :Route=\"Route\"\n        :default-filter=\"defaultFilter\"\n    >\n        <template #empty>\n            {{ $t('4fa242b7-c05d-44d4-ada5-fb60e91af818') }}\n        </template>\n    </ModernTableView>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ComponentWithProperties, NavigationController, usePresent } from '@simonbackx/vue-app-navigation';\nimport { AsyncTableAction, Column, ComponentExposed, EmailView, EventNotificationView, ModernTableView, TableAction, TableActionSelection, useAuth, useEventNotificationsObjectFetcher, useEventNotificationBackendFilterBuilders, usePlatform, useTableObjectFetcher } from '@stamhoofd/components';\nimport { EventNotificationViewModel } from '@stamhoofd/components/src/events/event-notifications/classes/EventNotificationViewModel';\nimport { ExcelExportView } from '@stamhoofd/frontend-excel-export';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { EventNotification, EventNotificationStatus, EventNotificationStatusHelper, EventNotificationType, ExcelExportType, StamhoofdFilter } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed, Ref, ref } from 'vue';\nimport { getSelectableWorkbook } from './getSelectableWorkbook';\nimport { SimpleError } from '@simonbackx/simple-errors';\n\ntype ObjectType = EventNotification;\nconst $t = useTranslate();\n\nconst props = withDefaults(\n    defineProps<{\n        type?: EventNotificationType | null;\n    }>(),\n    {\n        type: null,\n    },\n);\n\nconst title = computed(() => {\n    if (props.type) {\n        return props.type.title;\n    }\n    return $t('f86bcf9f-ffd2-429a-9b04-778e61c8288c');\n});\n\nconst estimatedRows = computed(() => {\n    return 30;\n});\n\nconst present = usePresent();\nconst platform = usePlatform();\nconst getFilterBuilders = useEventNotificationBackendFilterBuilders();\n\nconst modernTableView = ref(null) as Ref<null | ComponentExposed<typeof ModernTableView>>;\nconst configurationId = computed(() => {\n    return 'event-notifications';\n});\nconst filterBuilders = computed(() => getFilterBuilders());\n\nfunction getRequiredFilter(): StamhoofdFilter | null {\n    if (props.type) {\n        return {\n            typeId: props.type.id,\n        };\n    }\n\n    return null;\n}\n\nconst defaultFilter = {\n    $not: {\n        status: {\n            $in: [EventNotificationStatus.Draft, EventNotificationStatus.Accepted],\n        },\n    },\n};\n\nconst objectFetcher = useEventNotificationsObjectFetcher({\n    requiredFilter: getRequiredFilter(),\n});\n\nconst tableObjectFetcher = useTableObjectFetcher<EventNotification>(objectFetcher);\n\nconst allColumns: Column<ObjectType, any>[] = [\n    new Column<ObjectType, Date | null>({\n        id: 'submittedAt',\n        name: $t('16c87ee7-27b1-4b87-93e3-221d35038e6a'),\n        getValue: e => e.submittedAt,\n        format: d => d ? Formatter.date(d, true) : $t('faf32311-9a1c-4659-8156-e1714071ca68'),\n        minimumWidth: 60,\n        recommendedWidth: 100,\n        index: 0,\n    }),\n\n    new Column<ObjectType, Date>({\n        id: 'startDate',\n        name: $t('86983e38-4283-4f0a-bd1d-f48f050d3681'),\n        getValue: e => e.startDate,\n        format: d => Formatter.date(d, true),\n        minimumWidth: 60,\n        recommendedWidth: 100,\n        index: 0,\n    }),\n\n    new Column<ObjectType, Date>({\n        id: 'endDate',\n        name: $t('c15040b1-3202-45a8-8d30-030a4e4c5f9c'),\n        getValue: e => e.endDate,\n        format: d => Formatter.date(d, true),\n        minimumWidth: 60,\n        recommendedWidth: 100,\n        index: 0,\n    }),\n\n    new Column<ObjectType, string>({\n        id: 'event.name',\n        name: $t('8e2f97c0-0687-4b50-91f1-2b0e266de755'),\n        getValue: e => e.events.map(e => e.name).join(', '),\n        minimumWidth: 200,\n        recommendedWidth: 100,\n        index: 0,\n        allowSorting: false,\n        grow: true,\n    }),\n\n    new Column<ObjectType, EventNotificationStatus>({\n        id: 'status',\n        name: $t('fde0cfa6-c279-4eef-ab75-8f62fd4028a8'),\n        getValue: organization => organization.status,\n        format: status => Formatter.capitalizeFirstLetter(EventNotificationStatusHelper.getName(status)),\n        getStyle: (status) => {\n            if (status === EventNotificationStatus.Draft) {\n                return 'gray';\n            }\n            if (status === EventNotificationStatus.Accepted) {\n                return 'success';\n            }\n            if (status === EventNotificationStatus.Rejected) {\n                return 'error';\n            }\n            return '';\n        },\n        minimumWidth: 100,\n        recommendedWidth: 200,\n        allowSorting: true,\n    }),\n\n    new Column<ObjectType, string>({\n        id: 'organization.name',\n        name: $t('87a2582f-6de5-4b59-9395-7c49f8540659'),\n        getValue: notification => notification.organization.name,\n        minimumWidth: 100,\n        recommendedWidth: 200,\n    }),\n\n    new Column<ObjectType, string>({\n        id: 'organization.uriPadded',\n        name: $t('5dd0bc69-83ba-4ee7-99e9-141d0cdf5a84'),\n        getValue: notification => notification.organization.uri,\n        minimumWidth: 100,\n        recommendedWidth: 200,\n    }),\n];\n\nconst Route = {\n    Component: EventNotificationView,\n    objectKey: 'event-notification',\n    getProperties: (object: ObjectType) => {\n        return {\n            viewModel: EventNotificationViewModel.edit({\n                eventNotification: object,\n                platform: platform.value,\n            }),\n        };\n    },\n};\n\nconst actions: TableAction<EventNotification>[] = [];\n\nasync function openMail(selection: TableActionSelection<EventNotification>) {\n    if ((true as any)) {\n        throw new SimpleError({\n            code: 'not_implemented',\n            message: 'Not implemented',\n            human: 'Deze functie is nog niet beschikbaar',\n        });\n    }\n\n    const displayedComponent = new ComponentWithProperties(NavigationController, {\n        root: new ComponentWithProperties(EmailView, {\n            recipientFilterOptions: [],\n        }),\n    });\n    await present({\n        components: [\n            displayedComponent,\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nasync function exportToExcel(selection: TableActionSelection<ObjectType>) {\n    if ((true as any)) {\n        throw new SimpleError({\n            code: 'not_implemented',\n            message: 'Not implemented',\n            human: 'Deze functie is nog niet beschikbaar',\n        });\n    }\n\n    await present({\n        components: [\n            new ComponentWithProperties(NavigationController, {\n                root: new ComponentWithProperties(ExcelExportView, {\n                    type: ExcelExportType.Organizations, // todo\n                    filter: selection.filter,\n                    workbook: getSelectableWorkbook(platform.value),\n                    configurationId: configurationId.value,\n                }),\n            }),\n        ],\n        modalDisplayStyle: 'popup',\n    });\n}\n\nactions.push(new AsyncTableAction({\n    name: 'E-mailen',\n    icon: 'email',\n    priority: 12,\n    groupIndex: 3,\n    handler: async (selection: TableActionSelection<EventNotification>) => {\n        await openMail(selection);\n    },\n}));\n\nactions.push(\n    new AsyncTableAction({\n        name: 'Exporteren naar Excel',\n        icon: 'download',\n        priority: 11,\n        groupIndex: 3,\n        handler: async (selection) => {\n            await exportToExcel(selection);\n        },\n    }),\n);\n</script>\n","import { ComponentWithProperties, ModalStackComponent, NavigationController, PushOptions, setTitleSuffix, SplitViewController } from '@simonbackx/vue-app-navigation';\nimport { AsyncComponent, AuditLogsView, AuthenticatedView, ManageEventsView, manualFeatureFlag, MembersTableView, NoPermissionsView, TabBarController, TabBarItem, TabBarItemGroup } from '@stamhoofd/components';\nimport { getNonAutoLoginRoot, wrapContext } from '@stamhoofd/dashboard';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { SessionContext, SessionManager } from '@stamhoofd/networking';\nimport { computed } from 'vue';\nimport ChargeMembershipsView from './views/finances/ChargeMembershipsView.vue';\nimport OrganizationsMenu from './views/organizations/OrganizationsMenu.vue';\nimport EventNotificationsTableView from './views/event-notifications/EventNotificationsTableView.vue';\nimport { AccessRight, PermissionsResourceType } from '@stamhoofd/structures';\n\nexport function wrapWithModalStack(component: ComponentWithProperties, initialPresents?: PushOptions[]) {\n    return new ComponentWithProperties(ModalStackComponent, { root: component, initialPresents });\n}\n\nexport async function getScopedAdminRootFromUrl({ $t }: { $t: ReturnType<typeof useTranslate> }) {\n    const session = new SessionContext(null);\n    await session.loadFromStorage();\n    await session.checkSSO();\n    await SessionManager.prepareSessionForUsage(session, false);\n\n    return await getScopedAdminRoot(session, $t);\n}\n\nexport function getNoPermissionsView() {\n    return wrapWithModalStack(new ComponentWithProperties(TabBarController, {\n        tabs: [\n            new TabBarItem({\n                icon: 'key',\n                name: 'Geen toegang',\n                component: new ComponentWithProperties(NavigationController, {\n                    root: new ComponentWithProperties(NoPermissionsView, {}),\n                }),\n            }),\n        ],\n    }));\n}\n\nexport async function getScopedAdminRoot(reactiveSession: SessionContext, $t: ReturnType<typeof useTranslate>, options: { initialPresents?: PushOptions[] } = {}) {\n    // When switching between organizations, we allso need to load the right locale, which can happen async normally\n    const startView = new ComponentWithProperties(NavigationController, {\n        root: AsyncComponent(() => import('./views/start/StartView.vue'), {}),\n    });\n\n    const settingsView = new ComponentWithProperties(NavigationController, {\n        root: AsyncComponent(() => import('./views/settings/SettingsView.vue'), {}),\n    });\n\n    const membersTableView = new ComponentWithProperties(NavigationController, {\n        root: new ComponentWithProperties(MembersTableView, {}),\n    });\n\n    const organizationsTableView = new ComponentWithProperties(SplitViewController, {\n        root: new ComponentWithProperties(OrganizationsMenu, {}),\n    });\n\n    setTitleSuffix('Administratie');\n\n    const startTab = new TabBarItem({\n        icon: 'home',\n        name: 'Start',\n        component: startView,\n    });\n\n    const membersTab = new TabBarItem({\n        icon: 'group',\n        name: 'Leden',\n        component: membersTableView,\n    });\n\n    const groupsTab = new TabBarItem({\n        icon: 'location',\n        name: computed(() => $t('6e884f27-427f-4f85-914c-d5c2780253b0')),\n        component: organizationsTableView,\n    });\n\n    const calendarTab = new TabBarItem({\n        icon: 'calendar',\n        name: 'Activiteiten',\n        component: new ComponentWithProperties(NavigationController, {\n            root: new ComponentWithProperties(ManageEventsView, {}),\n        }),\n    });\n\n    const financesTab = new TabBarItem({\n        icon: 'calculator',\n        name: 'Boekhouding en aansluitingen',\n        component: new ComponentWithProperties(NavigationController, {\n            root: new ComponentWithProperties(ChargeMembershipsView, {}),\n        }),\n    });\n\n    const eventNotificationsTab = new TabBarItem({\n        icon: 'notification',\n        name: 'Kampmeldingen',\n        component: new ComponentWithProperties(NavigationController, {\n            root: new ComponentWithProperties(EventNotificationsTableView, {}),\n        }),\n    });\n\n    const auditLogsTab = new TabBarItem({\n        icon: 'history',\n        name: 'Logboek',\n        component: new ComponentWithProperties(SplitViewController, {\n            root: new ComponentWithProperties(AuditLogsView, {}),\n        }),\n    });\n\n    const settingsTab = new TabBarItem({\n        icon: 'settings',\n        name: 'Instellingen',\n        component: settingsView,\n    });\n\n    return wrapContext(reactiveSession, 'admin', wrapWithModalStack(\n        new ComponentWithProperties(AuthenticatedView, {\n            root: wrapWithModalStack(\n                new ComponentWithProperties(TabBarController, {\n                    tabs: computed(() => {\n                        const tabs: (TabBarItem | TabBarItemGroup)[] = [\n                            startTab,\n                            membersTab,\n                            groupsTab,\n                            calendarTab,\n                        ];\n\n                        const moreTab = new TabBarItemGroup({\n                            icon: 'category',\n                            name: 'Meer',\n                            items: [],\n                        });\n\n                        if (reactiveSession.auth.hasFullAccess()) {\n                            moreTab.items.push(settingsTab);\n                            moreTab.items.push(financesTab);\n\n                            if (manualFeatureFlag('audit-logs', reactiveSession)) {\n                                // Feature is still in development so not visible for everyone\n                                moreTab.items.push(auditLogsTab);\n                            }\n                        }\n\n                        if (manualFeatureFlag('event-notifications', reactiveSession) && reactiveSession.auth.hasAccessRightForSomeResourceOfType(PermissionsResourceType.OrganizationTags, AccessRight.OrganizationEventNotificationReviewer)) {\n                            // Feature is still in development so not visible for everyone\n                            moreTab.items.push(eventNotificationsTab);\n                        }\n\n                        if (moreTab.items.length > 0) {\n                            tabs.push(moreTab);\n                        }\n\n                        return tabs;\n                    }),\n                }),\n            ),\n            loginRoot: wrapWithModalStack(\n                getNonAutoLoginRoot(reactiveSession, options),\n            ),\n            noPermissionsRoot: getNoPermissionsView(),\n        }),\n        options.initialPresents,\n    ));\n}\n","<template>\n    <section class=\"st-view\">\n        <STNavigationBar title=\"Winkelmandje\" />\n        <main class=\"center\">\n            <h1>\n                Winkelmandje\n            </h1>\n\n            <p v-if=\"cart.price\">\n                Voeg alle inschrijvingen toe aan het mandje en reken in één keer af.\n            </p>\n            <p v-else>\n                Voeg alle inschrijvingen toe aan het mandje en bevestig ze.\n            </p>\n            \n            <STErrorsDefault :error-box=\"errors.errorBox\" />\n\n            <p v-if=\"cart.isEmpty\" class=\"info-box\">\n                Jouw mandje is leeg. Schrijf een lid in via het tabblad 'Start'.\n            </p>\n\n            <template v-else>\n                <STList>\n                    <RegisterItemRow v-for=\"item in cart.items\" :key=\"item.id\" class=\"right-stack\" :item=\"item\" />\n                    <BalanceItemCartItemRow v-for=\"item in cart.balanceItems\" :key=\"item.id\" class=\"right-stack\" :item=\"item\" :checkout=\"checkout\" />\n                </STList>\n                <PriceBreakdownBox :price-breakdown=\"checkout.priceBreakown\" />\n\n                <p class=\"style-button-bar right-align\">\n                    <LoadingButton :loading=\"loading\">\n                        <button class=\"button primary\" type=\"button\" @click=\"goToCheckout\">\n                            <span v-if=\"checkout.totalPrice\">Afrekenen</span>\n                            <span v-else>Bevestigen</span>\n\n                            <span class=\"icon arrow-right\" />\n                        </button>\n                    </LoadingButton>\n                </p>\n            </template>\n        </main>\n    </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { BalanceItemCartItemRow, ErrorBox, PriceBreakdownBox, RegisterItemRow, startCheckout, useContext, useErrors, useNavigationActions } from '@stamhoofd/components';\nimport { useMemberManager } from '@stamhoofd/networking';\nimport { computed, onActivated, onMounted, ref } from 'vue';\n\nconst memberManager = useMemberManager();\nconst checkout = computed(() => memberManager.family.checkout)\nconst cart = computed(() => checkout.value.cart)\nconst errors = useErrors()\nconst context = useContext()\nconst navigate = useNavigationActions();\n\nconst loading = ref(false)\n\nonMounted(() => {\n    checkout.value.updatePrices()\n\n    try {\n        errors.errorBox = null\n        checkout.value.validate({})\n    } catch (e) {\n        errors.errorBox = new ErrorBox(e)\n    }\n})\nonActivated(() => {\n    checkout.value.updatePrices()\n})\n\nasync function goToCheckout() {\n    if (loading.value) {\n        return\n    }\n\n    loading.value = true\n    errors.errorBox = null\n\n    try {\n        await startCheckout({\n            admin: false,\n            checkout: checkout.value,\n            context: context.value,\n            displayOptions: {action: 'present', modalDisplayStyle: 'popup'}\n        }, navigate)\n    } catch (e) {\n        errors.errorBox = new ErrorBox(e)\n    } finally {\n        loading.value = false\n    }\n}\n\n</script>\n","<template>\n    <ExternalOrganizationContainer v-slot=\"{externalOrganization: groupOrganization}\" :organization-id=\"event.organizationId\" @update=\"setOrganization\">\n        <div class=\"st-view event-view\">\n            <STNavigationBar :title=\"title\" />\n\n            <main class=\"center\">\n                <ImageComponent v-if=\"event.meta.coverPhoto\" :image=\"event.meta.coverPhoto\" :auto-height=\"true\" class=\"style-cover-photo\" />\n\n                <p class=\"style-title-prefix\">\n                    {{ levelPrefix }}\n                </p>\n                <h1 class=\"style-navigation-title\">\n                    {{ title }}\n                </h1>\n\n                <div v-if=\"event.meta.description.html\" class=\"description style-wysiwyg gray large\" v-html=\"event.meta.description.html\" />\n\n                <p v-if=\"differentOrganization\" class=\"info-box icon basket\">\n                    Reken eerst jouw huidige winkelmandje af. Je kan de huidige inhoud van jouw winkelmandje niet samen afrekenen met de inschrijving voor deze activiteit.\n                </p>\n\n                <EventInfoTable :event=\"event\" :family=\"memberManager.family\" />\n\n                <template v-if=\"!$isMobile && event.group\">\n                    <hr>\n\n                    <p class=\"style-button-bar right-align\">\n                        <button class=\"button primary\" type=\"button\" :disabled=\"!!differentOrganization\" @click=\"openGroup\">\n                            <span>Inschrijven</span>\n                            <span class=\"icon arrow-right\" />\n                        </button>\n                    </p>\n                </template>\n            </main>\n\n            <STToolbar v-if=\"$isMobile && event.group\">\n                <template #right>\n                    <button class=\"button primary\" type=\"button\" :disabled=\"!!differentOrganization\" @click=\"openGroup\">\n                        <span>Inschrijven</span>\n                        <span class=\"icon arrow-right\" />\n                    </button>\n                </template>\n            </STToolbar>\n        </div>\n    </ExternalOrganizationContainer>\n</template>\n\n<script setup lang=\"ts\">\nimport { EventInfoTable, ExternalOrganizationContainer, ImageComponent, useChooseFamilyMembersForGroup, usePlatform } from '@stamhoofd/components';\nimport { Event, Organization } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed, ref } from 'vue';\nimport { useMemberManager } from '@stamhoofd/networking';\n\nconst props = defineProps<{\n    event: Event;\n}>();\n\nconst platform = usePlatform();\nconst title = computed(() => props.event.name);\nconst memberManager = useMemberManager()\nconst groupOrganization = ref<Organization | null>(null);\nconst differentOrganization = computed(() => props.event.group && !memberManager.family.checkout.cart.isEmpty && memberManager.family.checkout.singleOrganization?.id !== props.event.group.organizationId)\n\nfunction setOrganization(o: Organization) {\n    groupOrganization.value = o as any;\n}\n\nconst levelPrefix = computed(() => {\n    const prefixes: string[] = []\n\n    if (props.event.organizationId === null) {\n        if (props.event.meta.organizationTagIds !== null) {\n            const tagNames = platform.value?.config.tags.filter(t => props.event.meta.organizationTagIds?.includes(t.id)).map(t => t.name)\n            prefixes.push(...tagNames)\n        } else {\n            prefixes.push('Nationaal')\n        }\n    } else {\n        // Name of the organization\n        prefixes.push(groupOrganization.value?.name ?? props.event.organizationId)\n    }\n\n    return Formatter.joinLast(prefixes, ', ', ' en ')\n});\n\n\nconst chooseFamilyMembersForGroup = useChooseFamilyMembersForGroup()\n\nasync function openGroup() {\n    if (!props.event.group) {\n        return;\n    }\n\n    await chooseFamilyMembersForGroup({\n        group: props.event.group,\n        family: memberManager.family,\n        displayOptions: {\n            action: 'present',\n            modalDisplayStyle: 'popup'\n        }\n    })\n}\n\n</script>\n\n<style lang=\"scss\">\n.event-view {\n    .description {\n        margin-bottom: 20px;\n    }\n}\n</style>\n","<template>\n    <div class=\"st-view\">\n        <STNavigationBar title=\"Activiteiten\" />\n\n        <main class=\"center\">\n            <h1>\n                Activiteiten\n            </h1>\n\n            <div class=\"input-with-buttons\">\n                <div>\n                    <form class=\"input-icon-container icon search gray\" @submit.prevent=\"blurFocus\">\n                        <input v-model=\"searchQuery\" class=\"input\" name=\"search\" placeholder=\"Zoeken\" type=\"search\" inputmode=\"search\" enterkeyhint=\"search\" autocorrect=\"off\" autocomplete=\"off\" :spellcheck=\"false\" autocapitalize=\"off\">\n                    </form>\n                </div>\n                <div>\n                    <button type=\"button\" class=\"button text\" @click=\"editFilter\">\n                        <span class=\"icon filter\" />\n                        <span class=\"hide-small\">Filter</span>\n                        <span v-if=\"!isEmptyFilter(fetcher.baseFilter)\" class=\"icon dot primary\" />\n                    </button>\n                </div>\n            </div>\n\n            <div v-for=\"group of groupedEvents\" :key=\"group.title\" class=\"container\">\n                <hr>\n                <h2>{{ Formatter.capitalizeFirstLetter(group.title) }}</h2>\n\n                <STList>\n                    <EventRow v-for=\"event of group.events\" :key=\"event.id\" :event=\"event\" @click=\"$navigate(Routes.Event, {properties: {event}})\" />\n                </STList>\n            </div>\n\n            <InfiniteObjectFetcherEnd empty-message=\"Geen activiteiten gevonden\" :fetcher=\"fetcher\" />\n        </main>\n    </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ComponentWithProperties, defineRoutes, NavigationController, useNavigate } from '@simonbackx/vue-app-navigation';\nimport { EventRow, InfiniteObjectFetcherEnd, Toast, UIFilter, UIFilterEditor, useAppContext, useEventsObjectFetcher, useEventUIFilterBuilders, useInfiniteObjectFetcher, useOrganization, usePlatform, usePositionableSheet, useVisibilityChange } from '@stamhoofd/components';\nimport { useMemberManager } from '@stamhoofd/networking';\nimport { Event, isEmptyFilter, isEqualFilter, LimitedFilteredRequest, StamhoofdFilter } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\nimport { computed, onActivated, ref, Ref, watchEffect } from 'vue';\nimport EventView from './EventView.vue';\n\ntype ObjectType = Event;\n\nconst searchQuery = ref('');\nconst organization = useOrganization();\nconst platform = usePlatform();\nconst $navigate = useNavigate();\nconst { presentPositionableSheet } = usePositionableSheet();\nconst memberManager = useMemberManager();\n\nconst filterBuilders = useEventUIFilterBuilders({ platform: platform.value, organizations: organization.value ? [organization.value] : (memberManager.family.organizations ?? []), app: useAppContext() });\n\nlet recommendedFilter = filterBuilders.value[0].fromFilter(memberManager.family.getRecommendedEventsFilter());\nconst selectedUIFilter = ref(recommendedFilter) as Ref<null | UIFilter>;\n\nfunction updateRecommendedFilter() {\n    const oldRecommendedFilter = recommendedFilter?.build() ?? null;\n\n    recommendedFilter = filterBuilders.value[0].fromFilter(memberManager.family.getRecommendedEventsFilter());\n\n    const currentFilter = selectedUIFilter.value?.build() ?? null;\n\n    if (isEqualFilter(currentFilter, oldRecommendedFilter)) {\n        selectedUIFilter.value = recommendedFilter;\n    }\n}\n\nonActivated(() => {\n    updateRecommendedFilter();\n});\n\nuseVisibilityChange(() => {\n    updateRecommendedFilter();\n});\n\nenum Routes {\n    Event = 'activiteit',\n}\n\ndefineRoutes([\n    {\n        name: Routes.Event,\n        url: '@year/@slug/@id',\n        component: EventView as ComponentOptions,\n        params: {\n            year: Number,\n            slug: String,\n            id: String,\n        },\n        paramsToProps: async (params: { year: number; slug: string; id: string }) => {\n            // Fetch event\n            const events = await fetcher.objectFetcher.fetch(\n                new LimitedFilteredRequest({\n                    filter: {\n                        id: params.id,\n                    },\n                    limit: 1,\n                    sort: [],\n                }),\n            );\n\n            if (events.results.length === 1) {\n                return {\n                    event: events.results[0],\n                };\n            }\n            Toast.error('Activiteit niet gevonden').show();\n            throw new Error('Event not found');\n        },\n\n        propsToParams(props) {\n            if (!('event' in props) || typeof props.event !== 'object' || props.event === null || !(props.event instanceof Event)) {\n                throw new Error('Missing event');\n            }\n            const event = props.event;\n\n            return {\n                params: {\n                    year: event.startDate.getFullYear(),\n                    slug: Formatter.slug(event.name),\n                    id: event.id,\n                },\n            };\n        },\n    },\n]);\n\nconst objectFetcher = useEventsObjectFetcher({\n    get requiredFilter() {\n        return getRequiredFilter();\n    },\n});\n\nconst fetcher = useInfiniteObjectFetcher<ObjectType>(objectFetcher);\n\nconst groupedEvents = computed(() => {\n    return Event.group(fetcher.objects);\n});\n\nwatchEffect(() => {\n    fetcher.setSearchQuery(searchQuery.value);\n    const filter = selectedUIFilter.value ? selectedUIFilter.value.build() : null;\n    fetcher.setFilter(filter);\n});\n\nfunction blurFocus() {\n    (document.activeElement as HTMLElement)?.blur();\n}\n\nasync function editFilter(event: MouseEvent) {\n    if (!filterBuilders) {\n        return;\n    }\n    const filter = selectedUIFilter.value ?? filterBuilders.value[0].create();\n    if (!selectedUIFilter.value) {\n        selectedUIFilter.value = filter;\n    }\n\n    await presentPositionableSheet(event, {\n        components: [\n            new ComponentWithProperties(NavigationController, {\n                root: new ComponentWithProperties(UIFilterEditor, {\n                    filter,\n                }),\n            }),\n        ],\n    });\n}\n\nfunction getRequiredFilter(): StamhoofdFilter | null {\n    return {\n        'startDate': {\n            $gt: new Date(),\n        },\n        'meta.visible': true,\n    };\n}\n\n</script>\n","export default import.meta.ROLLUP_FILE_URL_C2m_nZ$t;","import { isSimpleError, isSimpleErrors } from '@simonbackx/simple-errors';\nimport { Request } from '@simonbackx/simple-networking';\nimport { Toast } from '@stamhoofd/components';\nimport { AppManager, NetworkManager, SessionContext } from '@stamhoofd/networking';\nimport { Document } from '@stamhoofd/structures';\nimport { Formatter } from '@stamhoofd/utility';\n\nexport async function getDocumentPdfBlob($context: SessionContext, document: Document, owner?: any): Promise<Blob> {\n    const cacheId = 'document-' + document.id;\n    const timestamp = document.updatedAt.getTime();\n\n    // Check if we have a cached version available\n    try {\n        const cachedResponse = await NetworkManager.rendererServer.request({\n            method: 'GET',\n            path: '/pdf-cache',\n            query: {\n                cacheId,\n                timestamp,\n            },\n            shouldRetry: true,\n            timeout: 60 * 1000,\n            owner,\n            responseType: 'blob',\n        });\n        return cachedResponse.data as Blob;\n    }\n    catch (e) {\n        if (Request.isAbortError(e)) {\n            throw e;\n        }\n        let ignore = false;\n        if (isSimpleError(e) || isSimpleErrors(e)) {\n            if (e.hasCode('cache_not_found')) {\n                ignore = true;\n            }\n        }\n        if (!ignore) {\n            console.error(e);\n        }\n    }\n\n    const response = await $context.authenticatedServer.request({\n        method: 'GET',\n        path: '/documents/' + encodeURIComponent(document.id) + '/html',\n        shouldRetry: true,\n        timeout: 60 * 1000,\n        owner,\n        responseType: 'blob',\n    });\n\n    if (!response.headers['x-cache-id'] || !response.headers['x-cache-timestamp'] || !response.headers['x-cache-signature']) {\n        throw new Error('Missing cache headers');\n    }\n\n    /* if (STAMHOOFD.environment === 'development') {\n        // Return html\n        return response.data as Buffer;\n    } */\n\n    const form = new FormData();\n    // We need to send the html as a Blob, because FormData otherwise breaks the html signature by changing LF to CRLF\n    form.append('html', response.data as Blob);\n    form.append('cacheId', response.headers['x-cache-id'] as string);\n    form.append('timestamp', response.headers['x-cache-timestamp'] as string);\n    form.append('signature', response.headers['x-cache-signature'] as string);\n\n    // Convert to PDF\n    const pdfResponse = await NetworkManager.rendererServer.request({\n        method: 'POST',\n        path: '/html-to-pdf',\n        body: form as FormData,\n        shouldRetry: true,\n        timeout: 60 * 1000,\n        owner,\n        responseType: 'blob',\n    });\n\n    return pdfResponse.data as Blob;\n}\n\nexport async function downloadDocument($context: SessionContext, document: Document, owner?: any) {\n    try {\n        const blob = await getDocumentPdfBlob($context, document, owner);\n        const filename = Formatter.fileSlug(document.data.name + ' - ' + document.data.description) + '.pdf';\n        await AppManager.shared.downloadFile(blob, filename);\n    }\n    catch (e) {\n        if (!Request.isAbortError(e)) {\n            Toast.fromError(e).show();\n        }\n        else {\n            new Toast('Downloaden geannuleerd', 'info').show();\n        }\n    }\n}\n\nexport async function downloadDocuments($context: SessionContext, documents: Document[], owner?: any) {\n    if (documents.length === 1) {\n        await downloadDocument($context, documents[0], owner);\n        return;\n    }\n\n    let pendingToast: Toast | null = null;\n    try {\n        pendingToast = new Toast('Documenten downloaden...', 'spinner').setProgress(0).setHide(null).show();\n        const JSZip = (await import(/* webpackChunkName: \"jszip\" */ 'jszip')).default;\n        const zip = new JSZip();\n\n        const entries = documents.entries();\n        const maxConcurrency = 4;\n\n        const promises = new Array(maxConcurrency).fill(0).map(async () => {\n            for (const [index, document] of entries) {\n                const buffer = await getDocumentPdfBlob($context, document, owner);\n                zip.file(Formatter.fileSlug(document.id + ' - ' + document.data.name + ' - ' + document.data.description) + '.pdf', buffer);\n                pendingToast?.setProgress((index + 1) / documents.length);\n            }\n        });\n\n        await Promise.all(promises);\n\n        pendingToast?.hide();\n        pendingToast = new Toast('Documenten bundelen in een .zip...', 'spinner').setHide(null).show();\n        const blob = await zip.generateAsync({ type: 'blob', compression: 'DEFLATE', compressionOptions: { level: 6 } });\n        await AppManager.shared.downloadFile(blob, 'documenten.zip');\n        pendingToast?.hide();\n    }\n    catch (e) {\n        pendingToast?.hide();\n        if (!Request.isAbortError(e)) {\n            Toast.fromError(e).show();\n        }\n        else {\n            new Toast('Downloaden geannuleerd', 'info').show();\n        }\n    }\n}\n","<template>\n    <section class=\"st-view\">\n        <STNavigationBar :title=\"$t('c4cc8f8b-d490-4182-ba92-7fce435945e7')\" />\n        <main class=\"center\">\n            <h1>\n                {{ $t('c4cc8f8b-d490-4182-ba92-7fce435945e7') }}\n            </h1>\n\n            <p>{{ $t('369440db-a9e0-4530-a06b-3ea05cc6a2b0') }}</p>\n\n            <p v-if=\"members.length === 0\" class=\"style-button-bar\">\n                <button v-if=\"isAcceptingNewMembers\" class=\"button primary\" type=\"button\" @click=\"registerMembers\">\n                    <span class=\"icon edit\" />\n                    <span>Schrijf een lid in</span>\n                </button>\n\n                <a :href=\"$domains.getDocs('mijn-account')\" target=\"_blank\" class=\"button text selected\">\n                    <span class=\"icon book\" />\n                    <span>Hulp nodig?</span>\n                </a>\n            </p>\n            <p v-else class=\"style-button-bar\">\n                <a :href=\"$domains.getDocs('mijn-account')\" target=\"_blank\" class=\"button text selected\">\n                    <span class=\"icon book\" />\n                    <span>Hulp nodig?</span>\n                </a>\n            </p>\n\n            <QuickActionsBox :quick-actions=\"quickActions\" />\n\n            <div v-if=\"members.length > 0\" class=\"container\">\n                <hr>\n                <h2>\n                    Leden\n                </h2>\n\n                <STList class=\"illustration-list\">\n                    <STListItem v-for=\"member of members\" :key=\"member.id\" class=\"right-stack\" :selectable=\"true\" @click=\"$navigate(Routes.ViewMember, {properties: {member}})\">\n                        <template #left>\n                            <MemberIcon :member=\"member\" :icon=\"getRegistrationsForMember(member).length === 0 ? 'canceled' : ''\" />\n                        </template>\n\n                        <h3 class=\"style-title-list\">\n                            {{ member.patchedMember.name }}\n                        </h3>\n                        <p v-if=\"member.patchedMember.details.birthDayFormatted\" class=\"style-description-small\">\n                            {{ member.patchedMember.details.birthDayFormatted }}\n                        </p>\n\n                        <p v-if=\"getRegistrationsForMember(member).length\" class=\"style-description-small\">\n                            Ingeschreven voor {{ Formatter.joinLast(getRegistrationsForMember(member).map(r => r.group.settings.name), ', ', ' en ') }}.\n                        </p>\n                        <p v-else class=\"style-description-small\">\n                            {{ member.patchedMember.firstName }} is momenteel niet ingeschreven.\n                        </p>\n\n                        <template #right>\n                            <span v-if=\"user && member.id === user.memberId\" v-color=\"member\" class=\"style-tag\">Dit ben jij</span>\n                            <span class=\"icon gray arrow-right-small\" />\n                        </template>\n                    </STListItem>\n                </STList>\n\n                <footer class=\"style-button-bar\">\n                    <button class=\"button text\" type=\"button\" @click=\"addNewMember\">\n                        <span class=\"icon add\" />\n                        <span>Nieuw gezinslid</span>\n                    </button>\n                </footer>\n            </div>\n\n            <div v-if=\"members.length > 0\" class=\"container\">\n                <hr>\n                <h2>\n                    Acties\n                </h2>\n\n                <STList class=\"illustration-list\">\n                    <STListItem class=\"left-center\" :selectable=\"true\" @click=\"registerMembers\">\n                        <template #left>\n                            <img src=\"@stamhoofd/assets/images/illustrations/edit-data.svg\" class=\"style-illustration-img\">\n                        </template>\n\n                        <h3 class=\"style-title-list\">\n                            Lid inschrijven\n                        </h3>\n                        <p class=\"style-description-small\">\n                            Schrijf iemand in.\n                        </p>\n\n                        <template #right>\n                            <span class=\"icon gray arrow-right-small\" />\n                        </template>\n                    </STListItem>\n\n                    <STListItem class=\"left-center\" :selectable=\"true\" @click=\"checkData\">\n                        <template #left>\n                            <img src=\"@stamhoofd/assets/images/illustrations/magnifier.svg\" class=\"style-illustration-img\">\n                        </template>\n\n                        <h3 class=\"style-title-list\">\n                            Gegevens nakijken\n                        </h3>\n                        <p class=\"style-description-small\">\n                            Pas gegevens aan en bekijk al jouw inschrijvingen.\n                        </p>\n\n                        <template #right>\n                            <span class=\"icon gray arrow-right-small\" />\n                        </template>\n                    </STListItem>\n\n                    <STListItem class=\"left-center\" :selectable=\"true\" @click=\"$navigate(Routes.Payments)\">\n                        <template #left>\n                            <img src=\"@stamhoofd/assets/images/illustrations/creditcards.svg\" class=\"style-illustration-img\">\n                        </template>\n\n                        <h3 class=\"style-title-list\">\n                            Betalingen en openstaande rekening\n                        </h3>\n                        <p class=\"style-description-small\">\n                            Bekijk een overzicht van jouw recente betalingen en jouw openstaand bedrag.\n                        </p>\n\n                        <template #right>\n                            <span class=\"icon gray arrow-right-small\" />\n                        </template>\n                    </STListItem>\n                </STList>\n            </div>\n\n            <div v-if=\"documents.length > 0\" class=\"container\">\n                <hr>\n                <h2>\n                    Documenten\n                </h2>\n                <STList>\n                    <STListItem v-for=\"document of documents\" :key=\"document.id\" class=\"left-center hover-box member-registration-block\" :selectable=\"true\" @click=\"onDownloadDocument(document)\">\n                        <template #left>\n                            <span class=\"icon file-pdf red\" />\n                        </template>\n                        <h3 class=\"style-title-list\">\n                            {{ document.data.name }}\n                        </h3>\n                        <p class=\"style-description-small\">\n                            {{ document.data.description }}\n                        </p>\n                        <span v-if=\"document.status === 'MissingData'\" class=\"style-tag error\">Onvolledig</span>\n\n                        <template #right>\n                            <LoadingButton :loading=\"isDocumentDownloading(document)\">\n                                <span class=\"icon download gray\" />\n                            </LoadingButton>\n                        </template>\n                    </STListItem>\n                </STList>\n            </div>\n        </main>\n    </section>\n</template>\n\n<script setup lang=\"ts\">\nimport { defineRoutes, useNavigate } from '@simonbackx/vue-app-navigation';\nimport { MemberIcon, QuickActionsBox, Toast, useAddMember, useChooseGroupForMember, useContext, useRegistrationQuickActions, useUser } from '@stamhoofd/components';\nimport { downloadDocument } from '@stamhoofd/document-helper';\nimport { useMemberManager, useRequestOwner } from '@stamhoofd/networking';\nimport { Document, DocumentStatus, GroupType, PlatformMember } from '@stamhoofd/structures';\nimport { Formatter, Sorter } from '@stamhoofd/utility';\nimport { computed, ref } from 'vue';\n\nenum Routes {\n    RegisterMembers = 'registerMembers',\n    CheckData = 'checkData',\n    ViewMember = 'viewMember',\n    Payments = 'payments',\n}\ndefineRoutes([\n    {\n        name: Routes.RegisterMembers,\n        url: 'registreren',\n        component: async () => (await import('../members/RegisterMembersView.vue')).default as any,\n        present: 'popup',\n    },\n    {\n        name: Routes.CheckData,\n        url: 'gegevens',\n        component: async () => (await import('../members/CheckDataView.vue')).default as any,\n        present: 'popup',\n    },\n    {\n        name: Routes.Payments,\n        url: 'betalingen',\n        component: async () => (await import('./payments/MemberPayableBalanceView.vue')).default as any,\n        present: 'popup',\n    },\n    {\n        name: Routes.ViewMember,\n        url: 'leden/@id',\n        component: async () => (await import('../members/MemberView.vue')).default as any,\n        present: 'popup',\n        params: {\n            id: String,\n        },\n        paramsToProps: async (params: { id: string }) => {\n            const member = members.value.find(m => m.id === params.id);\n            if (member) {\n                return {\n                    member,\n                };\n            }\n            Toast.error('Lid niet gevonden').show();\n            throw new Error('member not found');\n        },\n\n        propsToParams(props) {\n            if (!('member' in props) || typeof props.member !== 'object' || props.member === null || !('id' in props.member)) {\n                throw new Error('Missing member');\n            }\n            return {\n                params: {\n                    id: props.member.id,\n                },\n            };\n        },\n    },\n]);\nconst $navigate = useNavigate();\nconst memberManager = useMemberManager();\nconst user = useUser();\nconst quickActions = useRegistrationQuickActions();\nconst context = useContext();\nconst requestOwner = useRequestOwner();\n\nconst documents = computed(() => memberManager.family.documents);\nconst members = computed(() => memberManager.family.members);\nconst isAcceptingNewMembers = computed(() => memberManager.isAcceptingNewMembers);\nconst chooseGroupForMember = useChooseGroupForMember();\nconst addMember = useAddMember();\n\nasync function registerMembers() {\n    await $navigate(Routes.RegisterMembers);\n}\n\nasync function checkData() {\n    await $navigate(Routes.CheckData);\n}\n\nfunction getRegistrationsForMember(member: PlatformMember) {\n    return member.filterRegistrations({ currentPeriod: true, types: [GroupType.Membership, GroupType.WaitingList] }).sort((a, b) =>\n        Sorter.stack(\n            Sorter.byDateValue(b.registeredAt ?? b.createdAt, a.registeredAt ?? a.createdAt),\n        ),\n    );\n}\n\nasync function addNewMember() {\n    await addMember(memberManager.family, {\n        displayOptions: { action: 'present', modalDisplayStyle: 'popup' },\n        async finishHandler(member, navigate) {\n            await chooseGroupForMember({\n                member,\n                displayOptions: { action: 'show', replace: 100, force: true },\n                customNavigate: navigate,\n            });\n        },\n    });\n}\n\nconst downloadingDocuments = ref([] as Document[]);\n\nasync function onDownloadDocument(document: Document) {\n    if (isDocumentDownloading(document)) {\n        return;\n    }\n    if (document.status === DocumentStatus.MissingData) {\n        const member = members.value.find(m => m.id === document.memberId);\n        new Toast('Dit document kan niet gedownload worden omdat er nog gegevens ontbreken of ongeldig zijn. Kijk alle gegevens van ' + (member?.member.firstName ?? 'dit lid') + ' na en contacteer ons indien het probleem nog niet is verholpen.', 'error red').setHide(20000).show();\n        return;\n    }\n    downloadingDocuments.value.push(document);\n    try {\n        await downloadDocument(context.value, document, requestOwner);\n    }\n    catch (e) {\n        console.error(e);\n    }\n    downloadingDocuments.value = downloadingDocuments.value.filter(d => d.id !== document.id);\n}\n\nfunction isDocumentDownloading(document: Document) {\n    return !!downloadingDocuments.value.find(d => d.id === document.id);\n}\n</script>\n","import { Decoder } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, ModalStackComponent, NavigationController, UrlHelper } from '@simonbackx/vue-app-navigation';\nimport { AuthenticatedView, ColorHelper, PromiseView, TabBarController, TabBarItem } from '@stamhoofd/components';\nimport { getNonAutoLoginRoot, wrapContext } from '@stamhoofd/dashboard';\nimport { I18nController } from '@stamhoofd/frontend-i18n';\nimport { NetworkManager, SessionContext, SessionManager } from '@stamhoofd/networking';\nimport { Country, Organization } from '@stamhoofd/structures';\nimport { computed } from 'vue';\n\nimport CartView from './views/cart/CartView.vue';\nimport EventsOverview from './views/events/EventsOverview.vue';\nimport StartView from './views/start/StartView.vue';\n\nexport function wrapWithModalStack(...components: ComponentWithProperties[]) {\n    return new ComponentWithProperties(ModalStackComponent, { initialComponents: components });\n}\n\nexport async function getScopedRegistrationRootFromUrl() {\n    const parts = UrlHelper.shared.getParts();\n    const ignoreUris = ['login', 'start'];\n\n    let session: SessionContext | null = null;\n\n    if (parts[0] === 'leden' && parts[1] && !ignoreUris.includes(parts[1])) {\n        const uri = parts[1];\n\n        // Load organization\n        // todo: use cache\n        try {\n            const response = await NetworkManager.server.request({\n                method: 'GET',\n                path: '/organization-from-uri',\n                query: {\n                    uri,\n                },\n                decoder: Organization as Decoder<Organization>,\n            });\n            const organization = response.data;\n\n            session = new SessionContext(organization);\n            await session.loadFromStorage();\n            await session.checkSSO();\n            await SessionManager.prepareSessionForUsage(session, false);\n        }\n        catch (e) {\n            console.error('Failed to load organization from uri', uri);\n        }\n    }\n\n    if (!session || !session.organization) {\n        if (STAMHOOFD.userMode === 'platform' && parts[0] === 'leden') {\n            session = new SessionContext(null);\n            await session.loadFromStorage();\n            await session.checkSSO();\n            await SessionManager.prepareSessionForUsage(session, true);\n            return await getRootView(session);\n        }\n        const dashboard = await import('@stamhoofd/dashboard');\n        return dashboard.getOrganizationSelectionRoot();\n    }\n\n    return await getRootView(session);\n}\n\nexport async function getRootView(session: SessionContext, ownDomain = false) {\n    await I18nController.loadDefault(session, Country.Belgium, 'nl', session?.organization?.address?.country);\n\n    // Set color\n    if (session.organization?.meta.color && ownDomain) {\n        ColorHelper.setColor(session.organization?.meta.color);\n    }\n\n    const startView = new ComponentWithProperties(NavigationController, {\n        root: new ComponentWithProperties(StartView, {}),\n    });\n\n    const cartRoot = new ComponentWithProperties(NavigationController, {\n        root: new ComponentWithProperties(CartView, {}),\n    });\n\n    const calendarTab = new TabBarItem({\n        icon: 'calendar',\n        name: 'Activiteiten',\n        component: new ComponentWithProperties(NavigationController, {\n            root: new ComponentWithProperties(EventsOverview, {}),\n        }),\n    });\n\n    return wrapContext(session, 'registration', new ComponentWithProperties(AuthenticatedView, {\n        root: wrapWithModalStack(\n            new ComponentWithProperties(PromiseView, {\n                promise: async function (this: PromiseView) {\n                    const $memberManager = this.$memberManager;\n                    await $memberManager.loadMembers();\n                    await $memberManager.loadCheckout();\n                    await $memberManager.loadDocuments();\n\n                    return new ComponentWithProperties(TabBarController, {\n                        tabs: [\n                            new TabBarItem({\n                                icon: 'home',\n                                name: 'Start',\n                                component: startView,\n                            }),\n                            calendarTab,\n                            new TabBarItem({\n                                icon: 'basket',\n                                name: 'Mandje',\n                                component: cartRoot,\n                                badge: computed(() => $memberManager.family.checkout.cart.count == 0 ? '' : $memberManager.family.checkout.cart.count.toFixed(0)),\n                            }),\n                        ],\n                    });\n                },\n            }),\n        ),\n        loginRoot: wrapWithModalStack(\n            getNonAutoLoginRoot(session),\n        ),\n    }), { ownDomain });\n}\n","<template>\n    <div id=\"app\">\n        <ModalStackComponent ref=\"modalStack\" :root=\"root\" />\n        <ToastBox />\n    </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Decoder } from '@simonbackx/simple-encoding';\nimport { ComponentWithProperties, HistoryManager, ModalStackComponent, PushOptions, useManualPresent } from '@simonbackx/vue-app-navigation';\nimport { getScopedAdminRootFromUrl } from '@stamhoofd/admin-frontend';\nimport { CenteredMessage, CenteredMessageView, ModalStackEventBus, PromiseView, ReplaceRootEventBus, Toast, ToastBox, uriToApp } from '@stamhoofd/components';\nimport { useTranslate } from '@stamhoofd/frontend-i18n';\nimport { AppManager, LoginHelper, NetworkManager, SessionContext, UrlHelper } from '@stamhoofd/networking';\nimport { getScopedRegistrationRootFromUrl } from '@stamhoofd/registration';\nimport { EmailAddressSettings, Platform } from '@stamhoofd/structures';\nimport { nextTick, onMounted, reactive, Ref, ref } from 'vue';\nimport { getScopedAutoRoot, getScopedAutoRootFromUrl, getScopedDashboardRootFromUrl } from './getRootViews';\n\nconst modalStack = ref(null) as Ref<InstanceType<typeof ModalStackComponent> | null>;\nHistoryManager.activate();\nconst $t = useTranslate();\n\nconst root = new ComponentWithProperties(PromiseView, {\n    promise: async () => {\n        try {\n            if (navigator.platform.indexOf('Win32') != -1 || navigator.platform.indexOf('Win64') != -1) {\n                // Load Windows stylesheet\n                try {\n                    await import('@stamhoofd/scss/layout/windows-scrollbars.scss');\n                }\n                catch (e) {\n                    console.error('Failed to load Windows scrollbars');\n                    console.error(e);\n                }\n            }\n\n            let app: 'dashboard' | 'admin' | 'registration' | 'auto' = 'auto';\n\n            const parts = UrlHelper.shared.getParts();\n            if (parts.length >= 1) {\n                app = uriToApp(parts[0]);\n            }\n            else {\n                app = 'auto';\n            }\n\n            let component: ComponentWithProperties;\n            if (app === 'auto') {\n                component = (await getScopedAutoRootFromUrl());\n            }\n            else if (app === 'dashboard') {\n                component = (await getScopedDashboardRootFromUrl());\n            }\n            else if (app === 'admin') {\n                component = (await getScopedAdminRootFromUrl({ $t }));\n            }\n            else {\n                component = (await getScopedRegistrationRootFromUrl());\n            }\n\n            console.log('Resolved root component');\n            return component;\n        }\n        catch (e) {\n            console.error('Error in dashboard.App promise', e);\n            Toast.fromError(e).setHide(null).show();\n            throw e;\n        }\n    },\n}).setCheckRoutes();\n\nasync function checkGlobalRoutes() {\n    if (!modalStack.value) {\n        await nextTick();\n        return await checkGlobalRoutes();\n    }\n\n    const currentPath = UrlHelper.initial.getPath({ removeLocale: true });\n    const parts = UrlHelper.initial.getParts();\n    const queryString = UrlHelper.initial.getSearchParams();\n    console.log('check global routes', parts, queryString, currentPath);\n\n    if (parts.length === 1 && parts[0] === 'unsubscribe') {\n        const id = queryString.get('id');\n        const token = queryString.get('token');\n        const type = queryString.get('type') ?? 'all';\n\n        if (id && token && ['all', 'marketing'].includes(type)) {\n            await unsubscribe(id, token, type as 'all' | 'marketing');\n        }\n    }\n\n    if (parts.length >= 1 && parts[0] === 'verify-email') {\n        const token = queryString.get('token');\n        const code = queryString.get('code');\n\n        if (token && code) {\n            const toast = new Toast('E-mailadres valideren...', 'spinner').setHide(null).show();\n\n            try {\n                const session = reactive(parts[1] ? await SessionContext.createFrom({ organizationId: parts[1] }) : new SessionContext(null)) as SessionContext;\n                await session.loadFromStorage();\n                await LoginHelper.verifyEmail(session, code, token);\n                toast.hide();\n                new Toast('E-mailadres is gevalideerd', 'success green').show();\n\n                const dashboardContext = await getScopedAutoRoot(session);\n                await ReplaceRootEventBus.sendEvent('replace', dashboardContext);\n            }\n            catch (e) {\n                toast.hide();\n                CenteredMessage.fromError(e).addCloseButton().show();\n            }\n        }\n    }\n}\nconst manualPresent = useManualPresent();\n\nonMounted(async () => {\n    if (!modalStack.value) {\n        throw new Error('Modal stack not loaded');\n    }\n\n    const stack = modalStack.value;\n\n    ModalStackEventBus.addListener(this, 'present', async (options: PushOptions | ComponentWithProperties) => {\n        if (!(options as any).components) {\n            await manualPresent(stack.present, { components: [options] });\n        }\n        else {\n            await manualPresent(stack.present, options);\n        }\n    });\n\n    ReplaceRootEventBus.addListener(this, 'replace', async (component: ComponentWithProperties) => {\n        component.setCheckRoutes();\n        stack.replace(component, false);\n    });\n\n    CenteredMessage.addListener(this, async (centeredMessage) => {\n        await manualPresent(stack.present, {\n            components: [\n                new ComponentWithProperties(CenteredMessageView, {\n                    centeredMessage,\n                }, {\n                    forceCanHaveFocus: true,\n                }),\n            ],\n            modalDisplayStyle: 'overlay',\n        });\n    });\n\n    // First check updates, and only after that, check for global routes\n    // reason: otherwise the checkUpdates will dismiss the modal stack, and that can hide the reset password view instead of the update view\n    try {\n        await AppManager.shared.checkUpdates({\n            visibleCheck: 'spinner',\n            visibleDownload: true,\n            installAutomatically: true,\n        });\n    }\n    catch (e) {\n        console.error(e);\n    }\n\n    // Check routes\n    checkGlobalRoutes().catch(console.error);\n});\n\nasync function unsubscribe(id: string, token: string, type: 'all' | 'marketing') {\n    const toast = new Toast('Bezig met uitschrijven...', 'spinner').setHide(null).show();\n\n    try {\n        const response = await NetworkManager.server.request({\n            method: 'GET',\n            path: '/email/manage',\n            query: {\n                id,\n                token,\n            },\n            decoder: EmailAddressSettings as Decoder<EmailAddressSettings>,\n        });\n\n        const details = response.data;\n        toast.hide();\n\n        let unsubscribe = true;\n        const fieldName = type === 'all' ? 'unsubscribedAll' : 'unsubscribedMarketing';\n\n        if (details[fieldName]) {\n            if (!await CenteredMessage.confirm('Je bent al uitgeschreven', 'Terug inschrijven op e-mails', 'Je ontvangt momenteel geen e-mails van ' + (details.organization?.name ?? Platform.shared.config.name) + ' op ' + details.email + '. Toch een e-mail ontvangen? Stuur hem door naar ' + $t('edac937d-5eda-445e-8bba-2c2b353d3f27'))) {\n                return;\n            }\n\n            unsubscribe = false;\n        }\n        else {\n            if (!await CenteredMessage.confirm('Wil je dat we jou geen e-mails meer sturen?', 'Ja, uitschrijven', 'Hierna ontvang je geen e-mails van ' + (details.organization?.name ?? Platform.shared.config.name) + ' op ' + details.email)) {\n                return;\n            }\n            toast.show();\n        }\n\n        await NetworkManager.server.request({\n            method: 'POST',\n            path: '/email/manage',\n            body: {\n                id,\n                token,\n                [fieldName]: unsubscribe,\n            },\n        });\n        toast.hide();\n\n        if (unsubscribe) {\n            new Toast('Top! Je ontvangt geen e-mails meer.', 'success').setHide(15 * 1000).show();\n        }\n        else {\n            new Toast('Je ontvangt vanaf nu terug e-mails.', 'success').setHide(15 * 1000).show();\n        }\n    }\n    catch (e) {\n        console.error(e);\n        toast.hide();\n        Toast.fromError(e).show();\n    }\n}\n\n</script>\n\n<style lang=\"scss\">\n// We need to include the component styling of vue-app-navigation first\n@use \"@stamhoofd/scss/main\";\n@import \"@stamhoofd/scss/base/dark-modus\";\n@import \"@simonbackx/vue-app-navigation/dist/main.css\";\n\nhtml {\n    -webkit-touch-callout:none;\n    //user-select: none;\n    -webkit-tap-highlight-color: rgba(0,0,0,0);\n    -webkit-tap-highlight-color: transparent;\n}\n</style>\n","// import 'core-js/stable'; // only needed for entry or 'false' useBuiltIns\n// import 'regenerator-runtime/runtime'; // only needed for entry or 'false' useBuiltIns\n\n// Load icon font\nimport 'virtual:vite-svg-2-webfont.css';\n\n// Continue\nimport { ViewportHelper, VueGlobalHelper } from '@stamhoofd/components';\nimport { I18nController } from '@stamhoofd/frontend-i18n';\nimport { AppManager } from '@stamhoofd/networking';\nimport { createApp } from 'vue';\n\nimport App from './src/App.vue';\n\nconst isPrerender = navigator.userAgent.toLowerCase().indexOf('prerender') !== -1;\n\ndocument.body.classList.add((AppManager.shared.isNative ? 'native-' : 'web-') + AppManager.shared.getOS());\n\nconst app = createApp(App);\nVueGlobalHelper.setup(app);\n\nconst i18n = I18nController.getI18n();\napp.use(i18n);\n\nif (!isPrerender) {\n    ViewportHelper.setup(true);\n}\n\nif (!isPrerender && STAMHOOFD.PLAUSIBLE_DOMAIN && STAMHOOFD.environment === 'production') {\n    const script = document.createElement('script');\n    script.onload = function () {\n        // do stuff with the script\n        console.log('Plausible loaded');\n    };\n    script.setAttribute('data-domain', STAMHOOFD.PLAUSIBLE_DOMAIN);\n    script.src = 'https://plausible.io/js/plausible.js';\n    document.head.appendChild(script); // or something of the likes\n    const w = window as any;\n    w.plausible = w.plausible || function () { (w.plausible.q = w.plausible.q || []).push(arguments); };\n}\nelse {\n    (window as any).plausible = function () {\n        console.log('Debug plausible with args ', arguments);\n    };\n}\n\napp.mount('#app');\n"],"file":"assets/index-D_mgiJku.js"}